diff --git a/templates/mealie/.felhom.yml b/templates/mealie/.felhom.yml index 3b82ef3..e7ee33c 100644 --- a/templates/mealie/.felhom.yml +++ b/templates/mealie/.felhom.yml @@ -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} diff --git a/templates/mealie/docker-compose.yml b/templates/mealie/docker-compose.yml index db6ed0e..27169fa 100644 --- a/templates/mealie/docker-compose.yml +++ b/templates/mealie/docker-compose.yml @@ -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: diff --git a/templates/mealie/steps/99137801e0a32d5c.felhom.yml b/templates/mealie/steps/99137801e0a32d5c.felhom.yml new file mode 100644 index 0000000..1b9df7c --- /dev/null +++ b/templates/mealie/steps/99137801e0a32d5c.felhom.yml @@ -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' diff --git a/templates/mealie/steps/99137801e0a32d5c.yml b/templates/mealie/steps/99137801e0a32d5c.yml new file mode 100644 index 0000000..db6ed0e --- /dev/null +++ b/templates/mealie/steps/99137801e0a32d5c.yml @@ -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