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

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:
2026-09-25 02:32:17 +02:00
parent f14a6085e4
commit b996218976
4 changed files with 179 additions and 2 deletions
+2 -1
View File
@@ -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}
+1 -1
View File
@@ -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