mealie v3.27.0 -> v3.28.0: proven on the bench (10-min memory watch, peak 23.1 %) and on 9202 through the guarded Update (night 2026-09-25 Part E)
gates / gates (push) Successful in 1s
gates / gates (push) Successful in 1s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -15,7 +15,7 @@ subdomain: "recipes"
|
||||
slug: "mealie"
|
||||
# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
|
||||
# changes an image: line must set this to the same day (see CLAUDE.md).
|
||||
catalog_since: "2026-09-22"
|
||||
catalog_since: "2026-09-25"
|
||||
|
||||
# --- Resource hints (displayed on deploy screen) ---
|
||||
resources:
|
||||
@@ -115,3 +115,4 @@ i18n:
|
||||
# gated by scripts/check-test-record.py. An image: move without a proven entry here is refused.
|
||||
update_ladder:
|
||||
- {"from": {"mealie": "ghcr.io/mealie-recipes/mealie:v3.20.1"}, "to": {"mealie": "ghcr.io/mealie-recipes/mealie:v3.27.0"}, "digest": {"mealie": "sha256:ba24b88462380fb59a6c7d04c6d9e607e0b6b04e31306592181186bcdab1952b"}, "verdict": "proven", "tested_at": "2026-09-21T20:20:09.681676+00:00", "harness_version": 1, "evidence": "felhom.eu/documentation/audits/update-night-2026-09-21/apps/mealie/verdict.json", "memory_peak_pct": null, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "backfilled": "2026-09-23", "note": "backfilled from catalog commit 008348b; box walk only (harness v1, no memory watch); digest = what the registry served on 2026-09-23, not a measurement of the tested image"}
|
||||
- {"from": {"mealie": "ghcr.io/mealie-recipes/mealie:v3.27.0"}, "to": {"mealie": "ghcr.io/mealie-recipes/mealie:v3.28.0"}, "digest": {"mealie": "sha256:8b02290f4d1806f02acac6f25f6d48a3c965612fda1f8e914d5af533276f8688"}, "verdict": "proven", "tested_at": "2026-09-24T21:16:19Z", "harness_version": 3, "evidence": "felhom.eu/documentation/audits/night-2026-09-25/E/apps/mealie/bench", "box_evidence": "felhom.eu/documentation/audits/night-2026-09-25/E/apps/mealie/box", "memory_peak_pct": 23.1, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "memory_basis": "anon", "memory_cgroup_peak_pct": 24.8}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.27.0
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.28.0
|
||||
container_name: mealie
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
# =============================================================================
|
||||
# .felhom.yml — App metadata for felhom-controller
|
||||
# =============================================================================
|
||||
# Place alongside docker-compose.yml in each stack directory:
|
||||
# /opt/docker/stacks/mealie/.felhom.yml
|
||||
# =============================================================================
|
||||
|
||||
# --- Display info (shown on dashboard) ---
|
||||
display_name: "Mealie"
|
||||
description: "Receptkezelő és étkezéstervező"
|
||||
category: "productivity"
|
||||
subdomain: "recipes"
|
||||
|
||||
# --- Asset slug ---
|
||||
slug: "mealie"
|
||||
# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
|
||||
# changes an image: line must set this to the same day (see CLAUDE.md).
|
||||
catalog_since: "2026-09-22"
|
||||
|
||||
# --- Resource hints (displayed on deploy screen) ---
|
||||
resources:
|
||||
mem_request: "200M"
|
||||
mem_limit: "1000M"
|
||||
pi_compatible: true
|
||||
needs_hdd: false
|
||||
|
||||
# --- Deploy fields ---
|
||||
deploy_fields:
|
||||
- env_var: DOMAIN
|
||||
label: "Domain"
|
||||
type: domain
|
||||
description: "A szerver domain neve"
|
||||
locked_after_deploy: true
|
||||
|
||||
- env_var: SUBDOMAIN
|
||||
label: "Aldomain"
|
||||
type: subdomain
|
||||
default: "recipes"
|
||||
required: true
|
||||
locked_after_deploy: true
|
||||
description: "Az alkalmazás aldomainje"
|
||||
|
||||
# --- App info (info page content) ---
|
||||
app_info:
|
||||
tagline: 'Receptkezelő és étkezés tervező a családnak'
|
||||
default_creds: 'changeme@example.com / MyPassword'
|
||||
docs_url: 'https://docs.mealie.io/'
|
||||
|
||||
use_cases:
|
||||
- 'Receptek gyűjtése és rendszerezése kategóriák és címkék szerint'
|
||||
- 'Receptek importálása weboldalakról automatikusan'
|
||||
- 'Heti étkezés tervezés és bevásárlólista generálás'
|
||||
- 'Receptek megosztása családtagokkal és barátokkal'
|
||||
- 'Többnyelvű felület - magyar is elérhető'
|
||||
|
||||
first_steps:
|
||||
- 'Nyisd meg a mealie.DOMAIN címet a böngészőben'
|
||||
- 'Jelentkezz be: changeme@example.com / MyPassword'
|
||||
- 'Változtasd meg azonnal az email címet és jelszót'
|
||||
- 'Importáld az első receptet egy weboldal URL beillesztésével'
|
||||
- 'Próbáld ki az étkezés tervezőt'
|
||||
|
||||
# --- Controller-side health probe ---
|
||||
healthcheck:
|
||||
checks:
|
||||
- type: tcp
|
||||
port: 9000
|
||||
|
||||
# --- App-email mapping (apps → in-controller shim → hub → Resend) ---
|
||||
# When app-email is on (global toggle + this app's per-app toggle), the controller injects
|
||||
# host = the on-box shim, port = 2525, From = mealie@felhom.eu. Mealie has NO accept-invalid-
|
||||
# cert option, so it talks PLAINTEXT (SMTP_AUTH_STRATEGY=NONE) to the shim on 2525 — the
|
||||
# spike-validated mode (SPIKE-smtp-app-relay-2026-06-28 §7). SMTP_USER/SMTP_PASSWORD stay
|
||||
# unset (no auth needed; the shim holds no Resend key).
|
||||
smtp_mapping:
|
||||
host_var: SMTP_HOST
|
||||
port_var: SMTP_PORT
|
||||
security_var: SMTP_AUTH_STRATEGY
|
||||
security_value: "NONE"
|
||||
from_var: SMTP_FROM_EMAIL
|
||||
from_name_var: SMTP_FROM_NAME
|
||||
from_local: mealie
|
||||
|
||||
# --- English copy (localisation slice 5, R-560) --------------------------------------------
|
||||
# The Hungarian above is UNCHANGED. A box on English reads this block field by field; a missing
|
||||
# field shows the Hungarian one; a controller older than 0.257.0 ignores the block entirely.
|
||||
i18n:
|
||||
en:
|
||||
description: 'A recipe manager and meal planner'
|
||||
app_info:
|
||||
tagline: 'A recipe manager and meal planner for the household'
|
||||
default_creds: 'changeme@example.com / MyPassword'
|
||||
use_cases:
|
||||
- 'Collect recipes and sort them by category and tag'
|
||||
- 'Import a recipe from a web page on its own'
|
||||
- 'Plan the week''s meals and get a shopping list out of it'
|
||||
- 'Share recipes with family and friends'
|
||||
- 'A multilingual interface - English and Hungarian among them'
|
||||
first_steps:
|
||||
- 'Open mealie.DOMAIN in your browser'
|
||||
- 'Sign in: changeme@example.com / MyPassword'
|
||||
- 'Change the e-mail address and password straight away'
|
||||
- 'Import your first recipe by pasting a web page address'
|
||||
- 'Try the meal planner'
|
||||
deploy_fields:
|
||||
- env_var: DOMAIN
|
||||
label: 'Domain'
|
||||
description: 'The server domain name'
|
||||
- env_var: SUBDOMAIN
|
||||
label: 'Subdomain'
|
||||
description: 'The subdomain this app answers on'
|
||||
@@ -0,0 +1,65 @@
|
||||
# Mealie - Recipe Manager & Meal Planner
|
||||
# Domain: ${SUBDOMAIN}.${DOMAIN}
|
||||
# Database: None (SQLite, built-in)
|
||||
# RAM: ~200MB (mem_limit: 1000M) | Pi-compatible: Yes (arm64 only)
|
||||
#
|
||||
# Environment variables:
|
||||
# DOMAIN - Your domain (e.g., demo-felhom.eu)
|
||||
#
|
||||
# Storage layout:
|
||||
# Recipe data/images → mealie_data (named volume, NVMe — moderate size)
|
||||
#
|
||||
# First-time setup:
|
||||
# Default login: changeme@example.com / MyPassword
|
||||
# Change immediately after first login!
|
||||
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.27.0
|
||||
container_name: mealie
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- ALLOW_SIGNUP=false
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=Europe/Budapest
|
||||
- MAX_WORKERS=1
|
||||
- WEB_CONCURRENCY=1
|
||||
- BASE_URL=https://${SUBDOMAIN}.${DOMAIN}
|
||||
# App-email (managed relay). Injected by the controller only when app-email is on
|
||||
# (global + per-app); empty SMTP_HOST = Mealie mail stays disabled. Mealie has no
|
||||
# accept-invalid-cert option, so the relay uses plaintext (NONE) to the on-box shim —
|
||||
# the spike-validated mode. See .felhom.yml smtp_mapping.
|
||||
- SMTP_HOST=${SMTP_HOST:-}
|
||||
- SMTP_PORT=${SMTP_PORT:-25}
|
||||
- SMTP_AUTH_STRATEGY=${SMTP_AUTH_STRATEGY:-NONE}
|
||||
- SMTP_FROM_NAME=${SMTP_FROM_NAME:-}
|
||||
- SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL:-}
|
||||
volumes:
|
||||
- mealie_data:/app/data/
|
||||
networks:
|
||||
- traefik-public
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1000M
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "python3 -c \"import socket; s=socket.create_connection(('127.0.0.1',9000),2); s.close()\""]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.mealie.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
|
||||
- "traefik.http.routers.mealie.entrypoints=websecure"
|
||||
- "traefik.http.routers.mealie.tls=true"
|
||||
- "traefik.http.routers.mealie.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.mealie.loadbalancer.server.port=9000"
|
||||
|
||||
volumes:
|
||||
mealie_data:
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
Reference in New Issue
Block a user