Files
app-catalog-felhom.eu/templates/wger/.felhom.yml
T
admin 4ad32aa768
gates / gates (push) Successful in 2s
wger: 2.6 -> 2.7, its first ladder step, both venues proven (R-462, R-738)
A new front-door fixture: the web login, then a weight entry through the app's own API, read back
with a no-session and a never-entered-weight control. Both venues ran on the R-738 template (7a4ff48,
migrations at start): bench 9401 proven, its migrations ran, 10-min watch 0 kills (anon peak 49.8 %);
box 9202 done in 46.2 s, the migrations ran, the entry read back. The first box walk WITHOUT the fix
failed (login 500, 12 migrations unapplied) and wrote nothing. Putting 2.6 back after the migration
loses the entries (recorded, as always; the box's undo restores the pre-update copy instead).
Written by upgrade-test.py --write-ladder.

Evidence: felhom.eu/documentation/audits/more-night-apps-2026-09-30/

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-09-30 18:25:51 +02:00

132 lines
6.0 KiB
YAML

# =============================================================================
# .felhom.yml - App metadata for felhom-controller
# =============================================================================
# --- Display info (shown on dashboard) ---
display_name: "wger"
description: "Edzésnapló és fitnesz tervező"
category: "home"
subdomain: "fitness"
slug: "wger"
# 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-30"
# --- Resource hints (displayed on deploy screen) ---
resources:
mem_request: "100M"
mem_limit: "384M"
pi_compatible: true
needs_hdd: false
# --- Deploy fields (first deployment only) ---
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: "fitness"
required: true
locked_after_deploy: true
description: "Az alkalmazás aldomainje"
- env_var: SECRET_KEY
label: "Titkosítási kulcs"
type: secret
generate: "hex:32"
locked_after_deploy: true
# `09` §3 decision 45: wger starts with admin / adminadmin. The box replaces that password with this generated
# one right after the install (after_install below); the app page shows it as the first password.
- env_var: ADMIN_PASSWORD
label: "Admin jelszó (admin)"
type: password
generate: "password:24"
description: "Az első bejelentkezéshez: admin és ez a jelszó. Utána a beállításokban módosítható."
locked_after_deploy: true
# --- App info (info page content) ---
app_info:
tagline: "Edzésnapló - edzéstervek, haladás követés és testsúly napló"
default_creds: "admin / adminadmin"
docs_url: "https://wger.readthedocs.io/"
use_cases:
- 'Edzéstervek létrehozása és követése'
- 'Testsúly és testméretek nyilvántartása grafikonokkal'
- 'Gyakorlatok adatbázisa képekkel és leírásokkal'
- 'Kalória és tápanyag követés'
- 'API támogatás fitnesz alkalmazás integrációkhoz'
first_steps:
- 'Nyisd meg a fitness.DOMAIN címet a böngészőben'
- 'Jelentkezz be: admin és a Beállítások oldalon látható első jelszó'
- 'Add meg az email címedet a beállításokban'
- 'Hozd létre az edzéstervedet'
- 'Kezdd el naplózni az edzéseidet'
# --- After a fresh install (controller >= 0.279.0, decision 45) ---
# Django's own set_password on the seeded admin. Measured on 9202 2026-09-29: afterwards adminadmin no longer signs in
# at /en/user/login, the new one does.
after_install:
service: wger
env: [ADMIN_PASSWORD]
# The password is the LAST ARGUMENT (sys.argv[1]), never pasted into the code: a quote in it cannot break or change
# the program (security review 2026-09-29). Django is set up the way manage.py does it (settings.main).
command: ["python3", "-c", "import os, sys; sys.path.insert(0, '/home/wger/src'); os.chdir('/home/wger/src'); os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.main'); import django; django.setup(); from django.contrib.auth.models import User; u = User.objects.get(username='admin'); u.set_password(sys.argv[1]); u.save(); print('FELHOM_AFTER_INSTALL_OK')", "${ADMIN_PASSWORD}"]
success: "FELHOM_AFTER_INSTALL_OK"
# --- Controller-side health probe ---
healthcheck:
checks:
- type: http
# 8000, not 80: gunicorn listens on 8000 inside the container; 80 is only
# what traefik publishes. wger's own compose healthcheck dials 127.0.0.1:8000 (R-618).
port: 8000
# --- 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 workout log and fitness planner'
app_info:
tagline: 'A workout log - training plans, progress and a weight diary'
default_creds: 'admin / adminadmin'
use_cases:
- 'Build training plans and follow them'
- 'Track your weight and measurements on a graph'
- 'An exercise database with pictures and descriptions'
- 'Track calories and nutrition'
- 'An API, for fitness app integrations'
first_steps:
- 'Open fitness.DOMAIN in your browser'
- 'Sign in: admin and the first password shown on the settings page'
- 'Add your e-mail address in the settings'
- 'Build your training plan'
- 'Start logging your workouts'
deploy_fields:
- env_var: DOMAIN
label: 'Domain'
description: 'The server domain name'
- env_var: SUBDOMAIN
label: 'Subdomain'
description: 'The subdomain this app answers on'
- env_var: SECRET_KEY
label: 'Encryption key'
- env_var: ADMIN_PASSWORD
label: 'Admin password (admin)'
description: 'For the first sign-in: admin and this password. Change it in the settings afterwards.'
# update_ladder — the test record: one tested step per line, oldest first (JSON flow mappings,
# `09-update-architecture.md` §6.4 part 4). WRITTEN BY scripts/upgrade-test.py, never by hand;
# gated by scripts/check-test-record.py. An image: move without a proven entry here is refused.
update_ladder:
- {"from": {"wger": "wger/server:2.6"}, "to": {"wger": "wger/server:2.7"}, "digest": {"wger": "sha256:1c5789b93bfe5eed0b7287255782d9177027b255de2b22b59f511a693a48db04"}, "verdict": "proven", "tested_at": "2026-09-30T16:25:03Z", "harness_version": 4, "evidence": "felhom.eu/documentation/audits/more-night-apps-2026-09-30/bench/apps/wger/bench/evidence/MV-wger/verdict.json", "box_evidence": "felhom.eu/documentation/audits/more-night-apps-2026-09-30/box/wger/step.txt", "memory_peak_pct": 49.8, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "memory_basis": "anon", "memory_cgroup_peak_pct": 78.6}