4ad32aa768
gates / gates (push) Successful in 2s
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
132 lines
6.0 KiB
YAML
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}
|