Golden 0.286.1 baked + vouched (record); 01 §5 visitor addresses + §7 cloudflared in the guest (R-754); register: R-753/754/772/773 closed, R-775 narrowed, R-776..R-782 opened (410 → 417); live evidence (demo-hp real tunnel, 9202)
gates / gates (push) Successful in 31s

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-10-01 22:05:24 +02:00
parent b50289074d
commit 09ae93db05
54 changed files with 5577 additions and 9 deletions
@@ -124,6 +124,21 @@ a trust boundary too: a default password, or a "first visitor creates the admin"
household acts. Rule and per-app status: `09` §3 decision 45 and `app-catalog-felhom.eu/FIRST-ADMIN.md` (the audit
of all 53 apps, 2026-09-28).
**Who is the visitor — the address (recorded 2026-10-01, R-753, `09` §3 decision 63, controller ≥ 0.286.0).** Rule:
*never believe an address a client can write.* Through the tunnel every visitor used to reach traefik as cloudflared's
one docker-assigned address, so every per-address guard (the dashboard's login counter, an app's lock) was an
"everyone" guard a stranger could aim at the household. Now cloudflared has a fixed address and traefik trusts forwarded
headers from that one address only: an app receives `X-Forwarded-For: <client-written…>, <real visitor>, 172.16.253.2`
(Cloudflare APPENDS to a client's own chain — measured), a LAN visitor arrives as itself, and every other peer's chain is
dropped. traefik's entrypoint middleware `felhom-forwarded` removes every header a client could write a host, a path or
an address into (`X-Forwarded-Host`, `Forwarded`, `True-Client-Ip`, …) and fixes `X-Forwarded-Port: 443`. **Readers take
the visitor from the RIGHT.** The controller (`clientaddr.go`) believes the chain only from traefik, takes the hop
traefik saw, and for the tunnel's hop reads `CF-Connecting-IP` (the edge refuses a client-sent one). Catalog apps that
read the LEFTMOST entry have the chain removed on their router. Design and measurements:
`audits/visitors-2026-10-01/A/DESIGN.md`. A permanent household gate with family accounts in front of an app (Grimmory,
MeTube) was SPIKED on this base and passed (`audits/permanent-gate-2026-10-01/VERDICT.md`); it is not built — the
operator decides.
**Who may reach an app, and through what (recorded 2026-09-29 — no document said it before; spike finding F1).**
Every app is reached only through the box's traefik (no catalog app publishes a host port except crafty-controller's
game ports; none uses host networking — read from the catalog 2026-09-29). traefik routes by host name: the tunnel's
@@ -182,10 +197,15 @@ the same way.
on Cloudflare) is register row R-494, P3, not blocking. Measured reason this was ruled now: the
2026-09-14 first-hour drill used a `*.felhom.eu` customer domain with no tunnel, and the dashboard link
in the setup-code mail did not resolve.
- **Tunnel placement: host** (resolved, Part 3 §3/§5). `cloudflared` runs on the Proxmox host
as its own **agent-managed systemd service** — not inside the guest — so the data path
survives control-plane death by construction. Geo-restriction WAF is **hub-enforced** (the
hub holds the CF API token; the controller only reports geo desired-state).
- **Tunnel placement: INSIDE the guest** (corrected 2026-10-01, R-754 — the operator's brief of that evening: the build is
right, correct the document). `cloudflared` is a container the CONTROLLER renders and keeps up (`internal/infra`,
`EnsureBaseStack`, a protected stack), with the tunnel token from `controller.yaml`. *This page used to say it ran on
the Proxmox host as an agent-managed systemd service; no box has ever been built that way* (read: the controller's
template; seen running in demo-hp's guest 9201 and in R-505's VM 331). Consequence, stated: the data path is NOT
independent of the guest — a dead guest is an unreachable box, and the controller (not the agent) restarts the
tunnel. Since controller v0.286.0 it sits ALONE on the `felhom-tunnel` network at the fixed address `172.16.253.2`
(traefik at `.3`), so traefik can believe forwarded headers from it and from nothing else (§5). Geo-restriction WAF
is **hub-enforced** (the hub holds the CF API token; the controller only reports geo desired-state).
---
@@ -0,0 +1,18 @@
# L2 — demo-hp (controller 0.286.1) through its REAL Cloudflare tunnel, POST /login on felhom.enkisfelhom.hu (the form's endpoint), 2026-10-01T19:51:32Z
stranger = DooPlex's public address 37.191.56.193, 6 wrong passwords, each with a NEW forged X-Forwarded-For:
try 1 -> Hibás jelszó.
try 2 -> Hibás jelszó.
try 3 -> Hibás jelszó.
try 4 -> Hibás jelszó.
try 5 -> Hibás jelszó.
try 6 -> Túl sok hibás próbálkozás erről a címről. Próbáld újra egy perc múlva.
household = ep0 (a second outside address), ONE request, the right password from stdin (never on ep0's disk or command line), with a forged X-Forwarded-For 6.6.6.6:
HTTP/2 403
controller log (demo-hp 9201):
2026/10/01 19:51:22 auth.go:222: [INFO] [web] Login from 37.191.56.193
2026/10/01 19:51:32 auth.go:184: [WARN] [web] Failed login from 37.191.56.193
2026/10/01 19:51:32 auth.go:184: [WARN] [web] Failed login from 37.191.56.193
2026/10/01 19:51:32 auth.go:184: [WARN] [web] Failed login from 37.191.56.193
2026/10/01 19:51:33 auth.go:184: [WARN] [web] Failed login from 37.191.56.193
2026/10/01 19:51:33 auth.go:184: [WARN] [web] Failed login from 37.191.56.193
2026/10/01 19:51:33 auth.go:176: [WARN] [web] Login rate limited for 37.191.56.193 (5 attempts)
@@ -0,0 +1,17 @@
## M5 AFTER the release (0.286.1 on demo-hp: traefik trusts 172.16.253.2 only), from DooPlex public 37.191.56.193 — plain, 2026-10-01T19:50:56Z
RemoteAddr: 172.18.0.3:59296
Cf-Connecting-Ip: 37.191.56.193
X-Forwarded-For: 37.191.56.193, 172.16.253.2
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: ca3fb49f8b7d
X-Real-Ip: 172.16.253.2
## M5 AFTER the release (0.286.1 on demo-hp: traefik trusts 172.16.253.2 only), from DooPlex public 37.191.56.193 — forged: XFF 6.6.6.6, X-Real-IP 8.8.4.4, True-Client-IP 9.9.9.9, X-Forwarded-Host evil.example, X-Forwarded-Port 8443, X-Forwarded-Proto http, Forwarded for=5.5.5.5
RemoteAddr: 172.18.0.3:59296
Cf-Connecting-Ip: 37.191.56.193
X-Forwarded-For: 6.6.6.6,37.191.56.193, 172.16.253.2
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: ca3fb49f8b7d
X-Real-Ip: 172.16.253.2
## M5 AFTER the release (0.286.1 on demo-hp: traefik trusts 172.16.253.2 only), from DooPlex public 37.191.56.193 — forged CF-Connecting-IP 7.7.7.7 alone: HTTP 403 (Cloudflare's edge answers; the request never reaches the box)
@@ -0,0 +1,12 @@
##### BookStack 3.6 on 9202 — controller gitea.dooplex.hu/admin/felhom-controller:0.286.1
deploy -> True
## phase 1 — the live template (no APP_PROXIES): control — 2026-10-01T19:57:01Z
stranger 198.51.100.66, 6 wrong for admin@admin.com (a new forged leftmost each): ['wrong', 'wrong', 'wrong', 'wrong', 'wrong', 'THROTTLED']
household 203.0.113.10, the right password, at once: ['THROTTLED']
waiting 75 s for BookStack's 60-second throttle to pass
restart through the product -> 200
the running container's env: 172.16.0.0/12
## phase 2 — APP_PROXIES=172.16.0.0/12 — 2026-10-01T19:59:09Z
stranger 198.51.100.66, 6 wrong for admin@admin.com (a new forged leftmost each): ['wrong', 'wrong', 'wrong', 'wrong', 'wrong', 'THROTTLED']
household 203.0.113.10, the right password, at once: ['ok']
LAN household (192.168.0.180), right password, while the stranger is throttled:
@@ -0,0 +1,60 @@
+ date -u
Thu Oct 1 19:28:33 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ free -g
+ head -2
total used free shared buff/cache available
Mem: 29 5 5 0 18 23
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 24681632 13684628 61.01%
local-lvm lvmthin active 56487936 34813514 21674421 61.63%
nvme-scratch dir active 983379700 77325832 856027256 7.86%
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ ls /var/lib/vz/template/cache/
debian-13-standard_13.6-1_amd64.tar.zst
+ pveam list local
+ grep debian-13
local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst 123.93MB
+ pct create 9401 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname upgrade-harness --cores 6 --memory 10240 --swap 0 --rootfs nvme-scratch:60 --net0 name=eth0,bridge=vmbr0,ip=dhcp --unprivileged 1 --features nesting=1,keyctl=1 --onboot 0
+ tail -1
done: SHA256:zhshT1KXLEd4DFcu6x7t1YnHzoIKQHGEPk7qwkEXNXI root@upgrade-harness
+ pct config 9401
arch: amd64
cores: 6
features: nesting=1,keyctl=1
hostname: upgrade-harness
memory: 10240
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:3E:71:6B,ip=dhcp,type=veth
onboot: 0
ostype: debian
rootfs: nvme-scratch:9401/vm-9401-disk-0.raw,size=60G
swap: 0
unprivileged: 1
+ pct start 9401
+ sleep 15
+ pct exec 9401 -- bash -c 'dpkg --print-architecture; hostname; ip -4 -o addr show eth0 | awk "{print \$4}"; apt-get update -qq >/dev/null 2>&1; DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose python3 python3-yaml curl postgresql-client sqlite3 >/dev/null 2>&1; docker --version; docker compose version; python3 --version; docker network create traefik-public >/dev/null && echo traefik-public-net; swapon --show; free -m | head -3; df -h /'
amd64
upgrade-harness
192.168.0.135/24
Docker version 26.1.5+dfsg1, build a72d7cd
Docker Compose version 2.26.1-4
Python 3.13.5
traefik-public-net
total used free shared buff/cache available
Mem: 10240 58 8488 0 1692 10181
Swap: 0 0 0
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 59G 1.3G 55G 3% /
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 24681740 13684520 61.01%
local-lvm lvmthin active 56487936 34813514 21674421 61.63%
nvme-scratch dir active 983379700 78964756 854388332 8.03%
@@ -0,0 +1,30 @@
Thu Oct 1 19:27:26 UTC 2026
== docker manifest inspect codewithcj/sparkyfitness_server:v0.17.2
amd64 sha256:5e6b51eb0f8df7b19b17f2687d4afa91581f82f29d364d80cf2d4622bf8f5d95
arm64 sha256:eea9d5213f26bd0c94771a4e399108ab169974517d6296a741ef409747f0d506
rc=0
== docker manifest inspect codewithcj/sparkyfitness:v0.17.2
amd64 sha256:82fa5fb00d1d5c6379307ad61955a2af7648de6603d2537162e12c83c33ad73f
arm64 sha256:28019e831dbaffdd1689e3c87a1be013f15a755b7f3eb70eec9b22d63200dec3
rc=0
== docker manifest inspect codewithcj/sparkyfitness_server:v0.17.3
amd64 sha256:d16c593650c975b9c6c044363fd7bfe95b6cee311fb8af2bc49079a42072e333
arm64 sha256:f985d2bb85ee788b1f84d55cca2901e0addb5c49a2e55324a7942385ed7fbc18
rc=0
== docker manifest inspect codewithcj/sparkyfitness:v0.17.3
amd64 sha256:93e2efccb4d0111c045d9f46c27343df0114faa050e210d2f95b50671eb98529
arm64 sha256:0508c10f2d348c2b69c089131641bf2b443acf9d102dc84f683a41cdc45c24d1
rc=0
== docker manifest inspect postgres:18-alpine
amd64 sha256:d8703cd7fba306b9fec9268ecedfa8a966846c053036a60e3635791957eb2f66
arm v6 sha256:548908d20dac4a46d489f436b744901a64c48b93999223dbd804d59bc62bec74
arm v7 sha256:4b876a8e668b72c43573a999eee6a06cde0042dcea0b378caaa71bd999f40a8e
arm64 v8 sha256:89f747171c4b0af0eacf5984550060be79786dbe286eb60cfa691d79d1e8b23f
386 sha256:1d22739c0a64fae400b80b9b7bc66c793915541c6a65977bbe9b8c88d22b3569
ppc64le sha256:7193bcd502992934d36436b3bee8019760af1cd81fcda938e2586e264dac5d5e
riscv64 sha256:c403bc6b4326fdb6771784116e08bd234d8a7918e753ba4268e1e8b66687dfb9
s390x sha256:b82b13bd4cb10ae4c9a55c8ac6304248d8b82a629b598c934c05ebf4f49d522d
rc=0
== Docker Hub tag order (last_updated) around the pin:
codewithcj/sparkyfitness_server ['dev', 'latest', 'v1.7.3', 'v1.7.2', 'v1.7.1', 'v1.7.0', 'v1.6.5', 'v1.6.4', 'v1.6.3', 'v1.6.2', 'v1.6.1', 'v1.6.0', 'v0.17.3', 'v0.17.2', 'v0.17.1', 'v0.17.0', 'v0.16.9']
codewithcj/sparkyfitness ['latest', 'v1.7.3', 'v1.7.2', 'dev', 'v1.7.1', 'v1.7.0', 'v1.6.5', 'v1.6.4', 'v1.6.3', 'v1.6.2', 'v1.6.1', 'v1.6.0', 'v0.17.3', 'v0.17.2', 'v0.17.1', 'v0.17.0', 'v0.16.9']
@@ -0,0 +1,8 @@
# check-volume-persistence.py sparkyfitness — bench 9401 (demo-hp, swap 0), catalog 9b3b859, 2026-10-01T19:55:42Z
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
sparkyfitness CLEAN sparkyfitness-server: this container's mounts are all empty while it created entries in ['/app/SparkyFitnessServer'] — benign when a sibling container
1 clean · 0 broken · 0 undetermined (of 1 in scope)
volume-persistence gate OK
gate exit code = 0
@@ -0,0 +1,100 @@
# catalog_gates.py sparkyfitness — full clone (not shallow) on bench 9401 (demo-hp, swap 0), catalog 9b3b859, 2026-10-01T19:58:42Z
catalog_gates — apps: sparkyfitness
==============================================================================
== gate: image-pins (check-image-pins.py)
==============================================================================
image-pin gate OK — 56 templates, 0 unpinned images
==============================================================================
== gate: image-resolvable (check-image-resolvable.py sparkyfitness)
==============================================================================
resolving 3 unique image pin(s)…
image-resolvability gate OK — 3 unique pins, all resolve
==============================================================================
== gate: volume-persistence (check-volume-persistence.py sparkyfitness)
==============================================================================
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
sparkyfitness CLEAN sparkyfitness-server: this container's mounts are all empty while it created entries in ['/app/SparkyFitnessServer'] — benign when a sibling container
1 clean · 0 broken · 0 undetermined (of 1 in scope)
volume-persistence gate OK
==============================================================================
== gate: engine-major (check-engine-major.py)
==============================================================================
engine-major gate — range origin/main..HEAD: 0 compose file(s) changed, 0 engine pin(s) compared
engine-major gate OK — no forbidden engine major, and no engine major bundled with another image move (rule: CLAUDE.md, amended by R-469 2026-09-21)
==============================================================================
== gate: catalog-since (check-catalog-since.py)
==============================================================================
catalog-since gate — range origin/main..HEAD: 0 compose file(s) changed, 0 image move(s) dated
catalog-since gate OK — every image move in the range carries a catalog_since on or after its commit day
==============================================================================
== gate: copy-i18n (check-copy-i18n.py sparkyfitness)
==============================================================================
copy-i18n: matcher controls OK (positive „Jelentkezz be…" convicts, negative „Encrypted notes…" does not)
copy-i18n: 56 apps · 1112 Hungarian copy strings frozen · 1111 with English
copy-i18n: translated so far — actualbudget 15/15, adventurelog 18/18, audiobookshelf 21/21, bentopdf 14/14, bookstack 21/21, calcom 22/22, calibre-web 27/27, claper 20/20, code-server 20/20, crafty-controller 24/24, dawarich 21/21, docmost 19/19, emby 22/22, ghost 16/16, gitea 17/17, glance 15/15, gokapi 19/19, grafana 19/19, gramps-web 17/17, home-assistant 18/18, homebox 17/17, homepage 15/15, immich 24/24, jellyfin 22/22, karakeep 19/19, kimai 20/20, komga 21/21, mealie 19/19, n8n 17/17, navidrome 21/21, nextcloud 28/28, onlyoffice 24/24, opengist 16/16, outline 21/21, paperless-ngx 33/33, papra 14/15, plant-it 16/16, plex 25/25, privatebin 14/14, radarr 22/22, radicale 19/19, rallly 17/17, recipe-importer 19/19, romm 41/41, seerr 18/18, sonarr 22/22, sparkyfitness 21/21, tandoor 18/18, termix 12/12, uptime-kuma 16/16, vaultwarden 23/23, vikunja 18/18, wanderer 20/20, wger 20/20, wishlist 16/16, zipline 18/18
copy-i18n: OK
==============================================================================
== gate: probe-matches-compose (check-probe-matches-compose.py sparkyfitness)
==============================================================================
probe-matches-compose: 1 app(s), mode: full
probe-matches-compose: OK — every probe dials the port (and, where it can fail, the path) that the app's own compose healthcheck dials
==============================================================================
== gate: probe-measured (check-probe-measured.py sparkyfitness)
==============================================================================
probe-measured: OK — 0 probes, each with a measured before/after
==============================================================================
== gate: test-record (check-test-record.py sparkyfitness)
==============================================================================
test-record gate — 1 template(s) read, 1 carry a ladder, 0 convicted
==============================================================================
== gate: test-record-move (check-test-record-move.py)
==============================================================================
test-record-move gate — range origin/main..HEAD: 0 compose file(s) changed
==============================================================================
== gate: onboarding (check-onboarding.py)
==============================================================================
onboarding gate — 61 checklist ids; 56 template dirs: 53 exempt (published before 2026-10-01), 3 new; 1 exempt app(s) with a record (shape-checked): wger
NOT CHECKED here (sibling repository absent — the pre-push hook on DooPlex checks them): 181 path(s)
felhom.eu/documentation/audits/new-apps-2026-10-01/A/A1-github-facts.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/A/A1-github-facts.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/FIT.md
felhom.eu/documentation/audits/new-apps-2026-10-01/box/dawarich/checks.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/shots/dawarich/1.png
felhom.eu/documentation/audits/new-apps-2026-10-01/box/dawarich/install.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/box/dawarich/install.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/bench/dawarich/evidence/MV-dawarich/verdict.json
felhom.eu/documentation/audits/new-apps-2026-10-01/G/gates-dawarich.txt
felhom.eu/documentation/audits/new-apps-2026-10-01/A/compose/dawarich.yml
onboarding gate OK
==============================================================================
== summary
==============================================================================
image-pins OK (exit 0)
image-resolvable OK (exit 0)
volume-persistence OK (exit 0)
engine-major OK (exit 0)
catalog-since OK (exit 0)
copy-i18n OK (exit 0)
probe-matches-compose OK (exit 0)
probe-measured OK (exit 0)
test-record OK (exit 0)
test-record-move OK (exit 0)
onboarding OK (exit 0)
all catalog gates OK
runner exit code = 0
@@ -0,0 +1,38 @@
+ date -u
Thu Oct 1 20:02:04 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
9401 running upgrade-harness
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 24690388 13675872 61.03%
local-lvm lvmthin active 56487936 34819163 21668772 61.64%
nvme-scratch dir active 983379700 80790424 852562664 8.22%
+ pct exec 9401 -- bash -c 'docker ps -a --format {{.Names}} | wc -l; docker volume ls -q | wc -l'
0
0
+ pct stop 9401
+ pct destroy 9401 --purge
purging CT 9401 from related configurations..
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ ls /mnt/hdd_1/images/
9202
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 24690316 13675944 61.03%
local-lvm lvmthin active 56487936 34819163 21668772 61.64%
nvme-scratch dir active 983379700 77326100 856026988 7.86%
+ ls /tmp
+ grep -E 'b9401|upg-sync|catclone|burst|birth|sampler'
tmp-leftovers=1
+ echo tmp-leftovers=1
@@ -0,0 +1,12 @@
[19:31:57] images: {"sparkyfitness-db": "postgres:18-alpine", "sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3", "sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3"}
[19:31:57] swap on the bench: none
[19:32:40] up -d rc=0 in 42.3s
[19:33:11] settled=True in 73.4s after up -d (settle loop 31.1s) :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[19:33:11] sparkyfitness-db: 2026-10-01T19:31:59.146819574Z healthy rc=0 mem=536870912
[19:33:11] sparkyfitness-server: 2026-10-01T19:32:09.915521757Z healthy rc=0 mem=1073741824
[19:33:11] sparkyfitness: 2026-10-01T19:32:40.767837794Z healthy rc=0 mem=268435456
[19:33:11] holding 300s idle for the from-birth sampler
[19:38:11] end sparkyfitness-db: running healthy rc=0 OOMKilled(not-used)=false
[19:38:12] end sparkyfitness-server: running healthy rc=0 OOMKilled(not-used)=false
[19:38:12] end sparkyfitness: running healthy rc=0 OOMKilled(not-used)=false
[19:38:12] server start lines saved (migrat|error|listening|started), 40 lines
@@ -0,0 +1,38 @@
"""birth.py — checklist 5.1 / 4.3 (bench half) for sparkyfitness at the PIN, from birth, swap 0.
Renders the catalog template exactly as upgrade-test.py does (its own render/build_env/settle), starts the
from-birth sampler BEFORE `up -d`, times up -d -> every container healthy, then keeps sampling idle for HOLD s.
Images are pre-pulled, so the time is start time, not download time. Prints no secret."""
import importlib.util, json, os, subprocess, sys, time
sys.path.insert(0, "/opt/upg"); os.chdir("/opt/upg")
spec = importlib.util.spec_from_file_location("ut", "/opt/upg/upgrade-test.py"); ut = importlib.util.module_from_spec(spec)
sys.argv = ["upgrade-test.py"]; spec.loader.exec_module(ut)
from pathlib import Path
HOLD = int(os.environ.get("HOLD", "300"))
app, project = "sparkyfitness", "birth"
wd = Path("/opt/upg/work/BIRTH"); ev = Path("/opt/upg/evidence/BIRTH"); ev.mkdir(parents=True, exist_ok=True)
tdir = ut.TEMPLATES / app
env = ut.cvp.build_env(app, (tdir / ".felhom.yml").read_text(), (tdir / "docker-compose.yml").read_text())
ut.render(app, {}, wd, env)
log = open(ev / "birth.log", "w", buffering=1)
def say(m):
l = time.strftime("[%H:%M:%S] ", time.gmtime()) + m; print(l, flush=True); log.write(l + "\n")
say("images: " + json.dumps(ut.template_images(app, ut.TEMPLATES)))
say("swap on the bench: " + (subprocess.run(["swapon", "--show"], capture_output=True, text=True).stdout.strip() or "none"))
subprocess.run("rm -f /root/mem-birth.csv.stop; (NAMES='sparkyfitness-db sparkyfitness-server sparkyfitness' OUT=/root/mem-birth.csv DUR=1200 nohup bash /opt/upg/sampler.sh >/dev/null 2>&1 &)", shell=True)
time.sleep(1)
t0 = time.time()
up = ut.compose(wd, project, "up", "-d")
say(f"up -d rc={up.returncode} in {time.time()-t0:.1f}s")
ok, secs, states = ut.settle(project, wd, wait=600)
say(f"settled={ok} in {time.time()-t0:.1f}s after up -d (settle loop {secs}s) :: {json.dumps(states)}")
for c in ("sparkyfitness-db", "sparkyfitness-server", "sparkyfitness"):
r = subprocess.run(["docker", "inspect", "-f", "{{.State.StartedAt}} {{.State.Health.Status}} rc={{.RestartCount}} mem={{.HostConfig.Memory}}", c], capture_output=True, text=True)
say(f" {c}: {r.stdout.strip()}")
say(f"holding {HOLD}s idle for the from-birth sampler")
time.sleep(HOLD)
for c in ("sparkyfitness-db", "sparkyfitness-server", "sparkyfitness"):
r = subprocess.run(["docker", "inspect", "-f", "{{.State.Status}} {{.State.Health.Status}} rc={{.RestartCount}} OOMKilled(not-used)={{.State.OOMKilled}}", c], capture_output=True, text=True)
say(f" end {c}: {r.stdout.strip()}")
r = subprocess.run(f"docker logs sparkyfitness-server 2>&1 | grep -i -E 'migrat|error|listening|started' | head -40", shell=True, capture_output=True, text=True)
(ev / "server-startlines.txt").write_text(r.stdout)
say("server start lines saved (migrat|error|listening|started), %d lines" % len(r.stdout.splitlines()))
@@ -0,0 +1,12 @@
# sampler.sh (run INSIDE the bench or the box): sample the cgroup of each named container from its birth, every 2 s.
# usage: NAMES="a b c" OUT=/root/mem.csv DUR=900 bash sampler.sh & — stops at DUR or when $OUT.stop exists
: > $OUT; t0=$(date +%s)
while [ $(( $(date +%s) - t0 )) -lt ${DUR:-900} ] && [ ! -f $OUT.stop ]; do
for n in $NAMES; do
id=$(docker ps -q --no-trunc --filter name=^$n$ | head -1); [ -z "$id" ] && continue
cg=$(ls -d /sys/fs/cgroup/system.slice/docker-$id.scope 2>/dev/null || find /sys/fs/cgroup -maxdepth 4 -type d -name "*$id*" 2>/dev/null | head -1)
[ -f "$cg/memory.stat" ] || continue
echo "$(date +%s),$n,${id:0:12},$(awk '$1=="anon"{print $2}' $cg/memory.stat),$(cat $cg/memory.current),$(cat $cg/memory.swap.current 2>/dev/null || echo NA),$(awk '$1=="oom_kill"{print $2}' $cg/memory.events),$(cat $cg/memory.max),$(docker inspect -f '{{.RestartCount}}' $id)" >> $OUT
done
sleep 2
done
@@ -0,0 +1,413 @@
[dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚙️ enable debug logging with { debug: true }
[Secrets] Checking for secret files to load...
[Secrets] No secrets loaded from files.
[2026-10-01T19:32:10.816Z] [INFO] Environment variable pre-flight checks passed successfully.
Starting server...
[2026-10-01T19:32:19.367Z] [INFO] [withingsService] Withings data source configured to: withings
[2026-10-01T19:32:19.369Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit
[2026-10-01T19:32:19.369Z] [INFO] [googleHealthService] Google Health data source: googlehealth
[2026-10-01T19:32:19.370Z] [INFO] [polarService] Polar data source configured to: polar
[2026-10-01T19:32:19.371Z] [INFO] [stravaService] Strava data source configured to: strava
[2026-10-01T19:32:19.371Z] [INFO] [hevyService] Hevy data source configured to: hevy
[2026-10-01T19:32:20.011Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars
DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid
[SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks.
SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads
[2026-10-01T19:32:20.138Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/
[2026-10-01T19:32:20.162Z] [INFO] Creating role: "sparkyapp"
[2026-10-01T19:32:20.173Z] [INFO] Successfully created role: "sparkyapp"
[2026-10-01T19:32:20.185Z] [INFO] Ensured schema_migrations table exists.
[2026-10-01T19:32:20.187Z] [INFO] Applied migrations: []
[2026-10-01T19:32:20.189Z] [INFO] Applying migration: 20250703170640_InitialDB.sql
[2026-10-01T19:32:20.283Z] [INFO] Successfully applied migration: 20250703170640_InitialDB.sql
[2026-10-01T19:32:20.283Z] [INFO] Applying migration: 20250710062500_create_goal_presets_table.sql
[2026-10-01T19:32:20.306Z] [INFO] Successfully applied migration: 20250710062500_create_goal_presets_table.sql
[2026-10-01T19:32:20.306Z] [INFO] Applying migration: 20250711173824_meal_features.sql
[2026-10-01T19:32:20.359Z] [INFO] Successfully applied migration: 20250711173824_meal_features.sql
[2026-10-01T19:32:20.359Z] [INFO] Applying migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql
[2026-10-01T19:32:20.368Z] [INFO] Successfully applied migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql
[2026-10-01T19:32:20.368Z] [INFO] Applying migration: 20250713125323_create_oidc_settings_and_update_users_table.sql
[2026-10-01T19:32:20.381Z] [INFO] Successfully applied migration: 20250713125323_create_oidc_settings_and_update_users_table.sql
[2026-10-01T19:32:20.381Z] [INFO] Applying migration: 20250713135900_add_role_to_users_table.sql
[2026-10-01T19:32:20.387Z] [INFO] Successfully applied migration: 20250713135900_add_role_to_users_table.sql
[2026-10-01T19:32:20.387Z] [INFO] Applying migration: 20250713142300_add_oidc_config_fields.sql
[2026-10-01T19:32:20.395Z] [INFO] Successfully applied migration: 20250713142300_add_oidc_config_fields.sql
[2026-10-01T19:32:20.395Z] [INFO] Applying migration: 20250714000000_create_session_table.sql
[2026-10-01T19:32:20.409Z] [INFO] Successfully applied migration: 20250714000000_create_session_table.sql
[2026-10-01T19:32:20.409Z] [INFO] Applying migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql
[2026-10-01T19:32:20.414Z] [INFO] Successfully applied migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql
[2026-10-01T19:32:20.414Z] [INFO] Applying migration: 20250717190700_add_cascading_deletes.sql
[2026-10-01T19:32:20.444Z] [INFO] Successfully applied migration: 20250717190700_add_cascading_deletes.sql
[2026-10-01T19:32:20.444Z] [INFO] Applying migration: 20250717233929_add_is_quick_food_to_foods.sql
[2026-10-01T19:32:20.450Z] [INFO] Successfully applied migration: 20250717233929_add_is_quick_food_to_foods.sql
[2026-10-01T19:32:20.450Z] [INFO] Applying migration: 20250718190226_add_food_display_limit_to_user_preferences.sql
[2026-10-01T19:32:20.456Z] [INFO] Successfully applied migration: 20250718190226_add_food_display_limit_to_user_preferences.sql
[2026-10-01T19:32:20.456Z] [INFO] Applying migration: 20250719131500_add_meal_percentages.sql
[2026-10-01T19:32:20.466Z] [INFO] Successfully applied migration: 20250719131500_add_meal_percentages.sql
[2026-10-01T19:32:20.466Z] [INFO] Applying migration: 20250719215400_add_login_management_to_oidc_settings.sql
[2026-10-01T19:32:20.472Z] [INFO] Successfully applied migration: 20250719215400_add_login_management_to_oidc_settings.sql
[2026-10-01T19:32:20.472Z] [INFO] Applying migration: 20250720010000_create_user_nutrient_display_preferences.sql
[2026-10-01T19:32:20.485Z] [INFO] Successfully applied migration: 20250720010000_create_user_nutrient_display_preferences.sql
[2026-10-01T19:32:20.485Z] [INFO] Applying migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql
[2026-10-01T19:32:20.490Z] [INFO] Successfully applied migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql
[2026-10-01T19:32:20.490Z] [INFO] Applying migration: 20250720220000_add_water_tracking_features.sql
[2026-10-01T19:32:20.504Z] [INFO] Successfully applied migration: 20250720220000_add_water_tracking_features.sql
[2026-10-01T19:32:20.504Z] [INFO] Applying migration: 20250720233836_alter_water_goal_ml_to_numeric.sql
[2026-10-01T19:32:20.516Z] [INFO] Successfully applied migration: 20250720233836_alter_water_goal_ml_to_numeric.sql
[2026-10-01T19:32:20.516Z] [INFO] Applying migration: 20250721000000_add_servings_per_container_to_water_containers.sql
[2026-10-01T19:32:20.521Z] [INFO] Successfully applied migration: 20250721000000_add_servings_per_container_to_water_containers.sql
[2026-10-01T19:32:20.522Z] [INFO] Applying migration: 20250721000000_alter_water_container_volume_to_numeric.sql
[2026-10-01T19:32:20.530Z] [INFO] Successfully applied migration: 20250721000000_alter_water_container_volume_to_numeric.sql
[2026-10-01T19:32:20.530Z] [INFO] Applying migration: 20250721014900_alter_water_ml_to_numeric.sql
[2026-10-01T19:32:20.540Z] [INFO] Successfully applied migration: 20250721014900_alter_water_ml_to_numeric.sql
[2026-10-01T19:32:20.540Z] [INFO] Applying migration: 20250819062400_add_mealie_provider_type.sql
[2026-10-01T19:32:20.546Z] [INFO] Successfully applied migration: 20250819062400_add_mealie_provider_type.sql
[2026-10-01T19:32:20.546Z] [INFO] Applying migration: 20250819083500_add_base_url_to_external_data_providers.sql
[2026-10-01T19:32:20.550Z] [INFO] Successfully applied migration: 20250819083500_add_base_url_to_external_data_providers.sql
[2026-10-01T19:32:20.550Z] [INFO] Applying migration: 202508201215_add_garmin_integration_schema.sql
[2026-10-01T19:32:20.557Z] [INFO] Successfully applied migration: 202508201215_add_garmin_integration_schema.sql
[2026-10-01T19:32:20.557Z] [INFO] Applying migration: 20250821090000_update_external_data_providers_provider_type_check.sql
[2026-10-01T19:32:20.563Z] [INFO] Successfully applied migration: 20250821090000_update_external_data_providers_provider_type_check.sql
[2026-10-01T19:32:20.563Z] [INFO] Applying migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql
[2026-10-01T19:32:20.568Z] [INFO] Successfully applied migration: 20250821091500_add_garth_token_dump_to_external_data_providers.sql
[2026-10-01T19:32:20.568Z] [INFO] Applying migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql
[2026-10-01T19:32:20.575Z] [INFO] Successfully applied migration: 20250821102000_remove_redundant_token_fields_from_external_data_providers.sql
[2026-10-01T19:32:20.575Z] [INFO] Applying migration: 20250831063900_create_mood_entries_table.sql
[2026-10-01T19:32:20.587Z] [INFO] Successfully applied migration: 20250831063900_create_mood_entries_table.sql
[2026-10-01T19:32:20.587Z] [INFO] Applying migration: 20250927180257_alter_exercises_table.sql
[2026-10-01T19:32:20.597Z] [INFO] Successfully applied migration: 20250927180257_alter_exercises_table.sql
[2026-10-01T19:32:20.598Z] [INFO] Applying migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql
[2026-10-01T19:32:20.603Z] [INFO] Successfully applied migration: 20250927212000_add_free_exercise_db_to_provider_type_check.sql
[2026-10-01T19:32:20.603Z] [INFO] Applying migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql
[2026-10-01T19:32:20.608Z] [INFO] Successfully applied migration: 20250930002100_add_sets_reps_weight_to_exercise_entries.sql
[2026-10-01T19:32:20.608Z] [INFO] Applying migration: 20251001232600_add_gender_to_users_table.sql
[2026-10-01T19:32:20.612Z] [INFO] Successfully applied migration: 20251001232600_add_gender_to_users_table.sql
[2026-10-01T19:32:20.612Z] [INFO] Applying migration: 20251002182306_create_backup_settings_table.sql
[2026-10-01T19:32:20.623Z] [INFO] Successfully applied migration: 20251002182306_create_backup_settings_table.sql
[2026-10-01T19:32:20.623Z] [INFO] Applying migration: 20251002224500_add_password_reset_to_users_table.sql
[2026-10-01T19:32:20.630Z] [INFO] Successfully applied migration: 20251002224500_add_password_reset_to_users_table.sql
[2026-10-01T19:32:20.631Z] [INFO] Applying migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql
[2026-10-01T19:32:20.636Z] [INFO] Successfully applied migration: 20251006021609_add_glycemic_index_to_foods_and_food_variants.sql
[2026-10-01T19:32:20.636Z] [INFO] Applying migration: 20251006220500_create_admin_activity_logs_table.sql
[2026-10-01T19:32:20.649Z] [INFO] Successfully applied migration: 20251006220500_create_admin_activity_logs_table.sql
[2026-10-01T19:32:20.649Z] [INFO] Applying migration: 20251008224256_add_workout_features.sql
[2026-10-01T19:32:20.693Z] [INFO] Successfully applied migration: 20251008224256_add_workout_features.sql
[2026-10-01T19:32:20.693Z] [INFO] Applying migration: 20251012225400_add_primary_keys_to_workout_tables.sql
[2026-10-01T19:32:20.700Z] [INFO] Successfully applied migration: 20251012225400_add_primary_keys_to_workout_tables.sql
[2026-10-01T19:32:20.700Z] [INFO] Applying migration: 20251012225500_add_multiple_sets_to_presets.sql
[2026-10-01T19:32:20.717Z] [INFO] Successfully applied migration: 20251012225500_add_multiple_sets_to_presets.sql
[2026-10-01T19:32:20.717Z] [INFO] Applying migration: 20251012225900_add_multiple_sets_to_plans.sql
[2026-10-01T19:32:20.735Z] [INFO] Successfully applied migration: 20251012225900_add_multiple_sets_to_plans.sql
[2026-10-01T19:32:20.735Z] [INFO] Applying migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql
[2026-10-01T19:32:20.749Z] [INFO] Successfully applied migration: 20251012230000_add_multiple_sets_to_exercise_entries.sql
[2026-10-01T19:32:20.749Z] [INFO] Applying migration: 20251015223200_convert_weights_to_kg_and_set_default.sql
[2026-10-01T19:32:20.756Z] [INFO] Successfully applied migration: 20251015223200_convert_weights_to_kg_and_set_default.sql
[2026-10-01T19:32:20.756Z] [INFO] Applying migration: 202510170132_add_text_measurements.sql
[2026-10-01T19:32:20.772Z] [INFO] Successfully applied migration: 202510170132_add_text_measurements.sql
[2026-10-01T19:32:20.772Z] [INFO] Applying migration: 20251017200900_add_multiple_oidc_providers.sql
[2026-10-01T19:32:20.811Z] [INFO] Successfully applied migration: 20251017200900_add_multiple_oidc_providers.sql
[2026-10-01T19:32:20.811Z] [INFO] Applying migration: 20251017204200_create_global_settings.sql
[2026-10-01T19:32:20.819Z] [INFO] Successfully applied migration: 20251017204200_create_global_settings.sql
[2026-10-01T19:32:20.819Z] [INFO] Applying migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql
[2026-10-01T19:32:20.827Z] [INFO] Successfully applied migration: 20251018001151_add_bmr_and_bodyfat_preferences.sql
[2026-10-01T19:32:20.827Z] [INFO] Applying migration: 20251018223700_add_signing_alg_to_oidc_providers.sql
[2026-10-01T19:32:20.833Z] [INFO] Successfully applied migration: 20251018223700_add_signing_alg_to_oidc_providers.sql
[2026-10-01T19:32:20.833Z] [INFO] Applying migration: 20251019013200_merged_schema_and_data.sql
[2026-10-01T19:32:20.871Z] [INFO] Successfully applied migration: 20251019013200_merged_schema_and_data.sql
[2026-10-01T19:32:20.871Z] [INFO] Applying migration: 20251019013300_merged_rls_policies.sql
[2026-10-01T19:32:20.909Z] [INFO] Successfully applied migration: 20251019013300_merged_rls_policies.sql
[2026-10-01T19:32:20.909Z] [INFO] Applying migration: 20251019154515_update_rls_policies_for_shared_items.sql
[2026-10-01T19:32:20.918Z] [INFO] Successfully applied migration: 20251019154515_update_rls_policies_for_shared_items.sql
[2026-10-01T19:32:20.918Z] [INFO] Applying migration: 20251019203500_fix_rls_permissions_for_public_foods.sql
[2026-10-01T19:32:20.924Z] [INFO] Successfully applied migration: 20251019203500_fix_rls_permissions_for_public_foods.sql
[2026-10-01T19:32:20.924Z] [INFO] Applying migration: 20251019204000_correct_variant_rls_policy.sql
[2026-10-01T19:32:20.930Z] [INFO] Successfully applied migration: 20251019204000_correct_variant_rls_policy.sql
[2026-10-01T19:32:20.930Z] [INFO] Applying migration: 20251019212500_update_measurement_rls_policies.sql
[2026-10-01T19:32:20.943Z] [INFO] Successfully applied migration: 20251019212500_update_measurement_rls_policies.sql
[2026-10-01T19:32:20.943Z] [INFO] Applying migration: 20251019222100_add_audit_columns_to_measurements.sql
[2026-10-01T19:32:20.977Z] [INFO] Successfully applied migration: 20251019222100_add_audit_columns_to_measurements.sql
[2026-10-01T19:32:20.977Z] [INFO] Applying migration: 20251020001000_fix_family_access_insert_policy.sql
[2026-10-01T19:32:20.982Z] [INFO] Successfully applied migration: 20251020001000_fix_family_access_insert_policy.sql
[2026-10-01T19:32:20.982Z] [INFO] Applying migration: 20251020022000_set_default_shared_with_public.sql
[2026-10-01T19:32:20.987Z] [INFO] Successfully applied migration: 20251020022000_set_default_shared_with_public.sql
[2026-10-01T19:32:20.987Z] [INFO] Applying migration: 20251020022200_update_rls_policies.sql
[2026-10-01T19:32:20.992Z] [INFO] Successfully applied migration: 20251020022200_update_rls_policies.sql
[2026-10-01T19:32:20.992Z] [INFO] Applying migration: 20251020022500_fix_food_select_policy.sql
[2026-10-01T19:32:20.997Z] [INFO] Successfully applied migration: 20251020022500_fix_food_select_policy.sql
[2026-10-01T19:32:20.997Z] [INFO] Applying migration: 20251020030000_simplify_food_select_policy.sql
[2026-10-01T19:32:21.002Z] [INFO] Successfully applied migration: 20251020030000_simplify_food_select_policy.sql
[2026-10-01T19:32:21.003Z] [INFO] Applying migration: 20251020031000_update_food_select_policy_with_sharing.sql
[2026-10-01T19:32:21.007Z] [INFO] Successfully applied migration: 20251020031000_update_food_select_policy_with_sharing.sql
[2026-10-01T19:32:21.007Z] [INFO] Applying migration: 20251020032200_add_all_owner_centric_policies.sql
[2026-10-01T19:32:21.030Z] [INFO] Successfully applied migration: 20251020032200_add_all_owner_centric_policies.sql
[2026-10-01T19:32:21.030Z] [INFO] Applying migration: 20251020033400_add_food_variants_rls_policy.sql
[2026-10-01T19:32:21.038Z] [INFO] Successfully applied migration: 20251020033400_add_food_variants_rls_policy.sql
[2026-10-01T19:32:21.038Z] [INFO] Applying migration: 20251020033700_fix_food_variants_rls_policy.sql
[2026-10-01T19:32:21.046Z] [INFO] Successfully applied migration: 20251020033700_fix_food_variants_rls_policy.sql
[2026-10-01T19:32:21.046Z] [INFO] Applying migration: 20251020230839_fix_family_access_rls_policies.sql
[2026-10-01T19:32:21.055Z] [INFO] Successfully applied migration: 20251020230839_fix_family_access_rls_policies.sql
[2026-10-01T19:32:21.055Z] [INFO] Applying migration: 20251021025423_restrict_family_access_select_policy.sql
[2026-10-01T19:32:21.062Z] [INFO] Successfully applied migration: 20251021025423_restrict_family_access_select_policy.sql
[2026-10-01T19:32:21.062Z] [INFO] Applying migration: 20251021034700_add_public_sharing_to_external_providers.sql
[2026-10-01T19:32:21.073Z] [INFO] Successfully applied migration: 20251021034700_add_public_sharing_to_external_providers.sql
[2026-10-01T19:32:21.073Z] [INFO] Applying migration: 20251022201000_fix_exercise_rls_policy.sql
[2026-10-01T19:32:21.079Z] [INFO] Successfully applied migration: 20251022201000_fix_exercise_rls_policy.sql
[2026-10-01T19:32:21.079Z] [INFO] Applying migration: 20251022203000_snapshot_exercise_details_in_entries.sql
[2026-10-01T19:32:21.091Z] [INFO] Successfully applied migration: 20251022203000_snapshot_exercise_details_in_entries.sql
[2026-10-01T19:32:21.091Z] [INFO] Applying migration: 20251023120500_update_external_providers_select_policy_for_public.sql
[2026-10-01T19:32:21.098Z] [INFO] Successfully applied migration: 20251023120500_update_external_providers_select_policy_for_public.sql
[2026-10-01T19:32:21.098Z] [INFO] Applying migration: 20251023221000_update_meals_rls_policy.sql
[2026-10-01T19:32:21.105Z] [INFO] Successfully applied migration: 20251023221000_update_meals_rls_policy.sql
[2026-10-01T19:32:21.105Z] [INFO] Applying migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql
[2026-10-01T19:32:21.115Z] [INFO] Successfully applied migration: 20251023221500_update_meal_plan_template_assignments_rls_policy.sql
[2026-10-01T19:32:21.115Z] [INFO] Applying migration: 20251023221501_add_meal_id_to_food_entries.sql
[2026-10-01T19:32:21.133Z] [INFO] Successfully applied migration: 20251023221501_add_meal_id_to_food_entries.sql
[2026-10-01T19:32:21.133Z] [INFO] Applying migration: 20251024230330_add_withings_fields_to_external_data_providers.sql
[2026-10-01T19:32:21.143Z] [INFO] Successfully applied migration: 20251024230330_add_withings_fields_to_external_data_providers.sql
[2026-10-01T19:32:21.143Z] [INFO] Applying migration: 20251025210900_add_source_to_custom_measurements.sql
[2026-10-01T19:32:21.159Z] [INFO] Successfully applied migration: 20251025210900_add_source_to_custom_measurements.sql
[2026-10-01T19:32:21.159Z] [INFO] Applying migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql
[2026-10-01T19:32:21.177Z] [INFO] Successfully applied migration: 20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql
[2026-10-01T19:32:21.177Z] [INFO] Applying migration: 202510310132_add_language_to_user_preferences.sql
[2026-10-01T19:32:21.182Z] [INFO] Successfully applied migration: 202510310132_add_language_to_user_preferences.sql
[2026-10-01T19:32:21.182Z] [INFO] Applying migration: 20251101151100_create_sleep_entries_table.sql
[2026-10-01T19:32:21.202Z] [INFO] Successfully applied migration: 20251101151100_create_sleep_entries_table.sql
[2026-10-01T19:32:21.202Z] [INFO] Applying migration: 20251103000000_add_onboarding_schema.sql
[2026-10-01T19:32:21.217Z] [INFO] Successfully applied migration: 20251103000000_add_onboarding_schema.sql
[2026-10-01T19:32:21.217Z] [INFO] Applying migration: 20251112000000_add_display_name_to_custom_categories.sql
[2026-10-01T19:32:21.222Z] [INFO] Successfully applied migration: 20251112000000_add_display_name_to_custom_categories.sql
[2026-10-01T19:32:21.222Z] [INFO] Applying migration: 20251114205134_create_exercise_preset_entries_table.sql
[2026-10-01T19:32:21.239Z] [INFO] Successfully applied migration: 20251114205134_create_exercise_preset_entries_table.sql
[2026-10-01T19:32:21.239Z] [INFO] Applying migration: 20251115003147_add_source_to_exercise_preset_entries.sql
[2026-10-01T19:32:21.244Z] [INFO] Successfully applied migration: 20251115003147_add_source_to_exercise_preset_entries.sql
[2026-10-01T19:32:21.245Z] [INFO] Applying migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql
[2026-10-01T19:32:21.251Z] [INFO] Successfully applied migration: 20251115003301_add_exercise_preset_entry_id_to_activity_details.sql
[2026-10-01T19:32:21.251Z] [INFO] Applying migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql
[2026-10-01T19:32:21.256Z] [INFO] Successfully applied migration: 20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql
[2026-10-01T19:32:21.256Z] [INFO] Applying migration: 20251120011100_add_mfa_magic_link_columns.sql
[2026-10-01T19:32:21.269Z] [INFO] Successfully applied migration: 20251120011100_add_mfa_magic_link_columns.sql
[2026-10-01T19:32:21.269Z] [INFO] Applying migration: 20251121011500_add_email_mfa_columns_to_users.sql
[2026-10-01T19:32:21.273Z] [INFO] Successfully applied migration: 20251121011500_add_email_mfa_columns_to_users.sql
[2026-10-01T19:32:21.273Z] [INFO] Applying migration: 202511220110_add_default_external_data_providers.sql
[2026-10-01T19:32:21.281Z] [INFO] Successfully applied migration: 202511220110_add_default_external_data_providers.sql
[2026-10-01T19:32:21.281Z] [INFO] Applying migration: 202511232110_delete_raw_stress_data_categories.sql
[2026-10-01T19:32:21.285Z] [INFO] Successfully applied migration: 202511232110_delete_raw_stress_data_categories.sql
[2026-10-01T19:32:21.285Z] [INFO] Applying migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql
[2026-10-01T19:32:21.290Z] [INFO] Successfully applied migration: 202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql
[2026-10-01T19:32:21.290Z] [INFO] Applying migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql
[2026-10-01T19:32:21.310Z] [INFO] Successfully applied migration: 20251127194107_create_food_entry_meals_and_link_food_entries.sql
[2026-10-01T19:32:21.310Z] [INFO] Applying migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql
[2026-10-01T19:32:21.319Z] [INFO] Successfully applied migration: 20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql
[2026-10-01T19:32:21.319Z] [INFO] Applying migration: 20251128030115_add_tandoor_provider_type.sql
[2026-10-01T19:32:21.324Z] [INFO] Successfully applied migration: 20251128030115_add_tandoor_provider_type.sql
[2026-10-01T19:32:21.324Z] [INFO] Applying migration: 20251205000000_add_energy_unit_to_user_preferences.sql
[2026-10-01T19:32:21.330Z] [INFO] Successfully applied migration: 20251205000000_add_energy_unit_to_user_preferences.sql
[2026-10-01T19:32:21.330Z] [INFO] Applying migration: 20251206000000_add_nutrient_calculation_algorithms.sql
[2026-10-01T19:32:21.338Z] [INFO] Successfully applied migration: 20251206000000_add_nutrient_calculation_algorithms.sql
[2026-10-01T19:32:21.338Z] [INFO] Applying migration: 20251206000001_add_serving_size_to_meals.sql
[2026-10-01T19:32:21.346Z] [INFO] Successfully applied migration: 20251206000001_add_serving_size_to_meals.sql
[2026-10-01T19:32:21.347Z] [INFO] Applying migration: 20251207000001_add_default_meal_quantity.sql
[2026-10-01T19:32:21.350Z] [INFO] Successfully applied migration: 20251207000001_add_default_meal_quantity.sql
[2026-10-01T19:32:21.350Z] [INFO] Applying migration: 20251215005329_add_usda_to_provider_type_check.sql
[2026-10-01T19:32:21.356Z] [INFO] Successfully applied migration: 20251215005329_add_usda_to_provider_type_check.sql
[2026-10-01T19:32:21.356Z] [INFO] Applying migration: 20251221000000_create_fasting_logs.sql
[2026-10-01T19:32:21.367Z] [INFO] Successfully applied migration: 20251221000000_create_fasting_logs.sql
[2026-10-01T19:32:21.367Z] [INFO] Applying migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql
[2026-10-01T19:32:21.373Z] [INFO] Successfully applied migration: 20251221010000_drop_mood_weight_from_fasting_logs.sql
[2026-10-01T19:32:21.373Z] [INFO] Applying migration: 20251226150700_add_mobile_health_data_features.sql
[2026-10-01T19:32:21.385Z] [INFO] Successfully applied migration: 20251226150700_add_mobile_health_data_features.sql
[2026-10-01T19:32:21.385Z] [INFO] Applying migration: 20251228000000_add_custom_nutrients_tables.sql
[2026-10-01T19:32:21.398Z] [INFO] Successfully applied migration: 20251228000000_add_custom_nutrients_tables.sql
[2026-10-01T19:32:21.398Z] [INFO] Applying migration: 20252317234000_add_is_quick_exercise_to_exercises.sql
[2026-10-01T19:32:21.404Z] [INFO] Successfully applied migration: 20252317234000_add_is_quick_exercise_to_exercises.sql
[2026-10-01T19:32:21.404Z] [INFO] Applying migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql
[2026-10-01T19:32:21.409Z] [INFO] Successfully applied migration: 20260105000000_add_auto_scale_open_food_facts_imports.sql
[2026-10-01T19:32:21.409Z] [INFO] Applying migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql
[2026-10-01T19:32:21.418Z] [INFO] Successfully applied migration: 20260108010449_add_cascading_delete_to_check_in_measurements.sql
[2026-10-01T19:32:21.418Z] [INFO] Applying migration: 20260108011953_add_cascading_delete_to_food_entries.sql
[2026-10-01T19:32:21.428Z] [INFO] Successfully applied migration: 20260108011953_add_cascading_delete_to_food_entries.sql
[2026-10-01T19:32:21.428Z] [INFO] Applying migration: 20260108012051_add_comprehensive_cascading_deletes.sql
[2026-10-01T19:32:21.476Z] [INFO] Successfully applied migration: 20260108012051_add_comprehensive_cascading_deletes.sql
[2026-10-01T19:32:21.476Z] [INFO] Applying migration: 20260108223108_alter_water_goal_to_numeric.sql
[2026-10-01T19:32:21.489Z] [INFO] Successfully applied migration: 20260108223108_alter_water_goal_to_numeric.sql
[2026-10-01T19:32:21.489Z] [INFO] Applying migration: 20260111180656_custom_meal_feature.sql
[2026-10-01T19:32:21.547Z] [INFO] Successfully applied migration: 20260111180656_custom_meal_feature.sql
[2026-10-01T19:32:21.547Z] [INFO] Applying migration: 20260122201500_refactor_provider_type_to_lookup_table.sql
[2026-10-01T19:32:21.563Z] [INFO] Successfully applied migration: 20260122201500_refactor_provider_type_to_lookup_table.sql
[2026-10-01T19:32:21.563Z] [INFO] Applying migration: 20260123115500_add_privacy_flag_to_provider_types.sql
[2026-10-01T19:32:21.569Z] [INFO] Successfully applied migration: 20260123115500_add_privacy_flag_to_provider_types.sql
[2026-10-01T19:32:21.569Z] [INFO] Applying migration: 20260125000000_better_auth_migration.sql
[2026-10-01T19:32:21.805Z] [INFO] Successfully applied migration: 20260125000000_better_auth_migration.sql
[2026-10-01T19:32:21.805Z] [INFO] Applying migration: 20260127040000_family_access_audit_fix.sql
[2026-10-01T19:32:21.842Z] [INFO] Successfully applied migration: 20260127040000_family_access_audit_fix.sql
[2026-10-01T19:32:21.842Z] [INFO] Applying migration: 202601280001_add_show_hide_to_meals.sql
[2026-10-01T19:32:21.856Z] [INFO] Successfully applied migration: 202601280001_add_show_hide_to_meals.sql
[2026-10-01T19:32:21.856Z] [INFO] Applying migration: 20260201121400_add_api_key_table.sql
[2026-10-01T19:32:21.874Z] [INFO] Successfully applied migration: 20260201121400_add_api_key_table.sql
[2026-10-01T19:32:21.874Z] [INFO] Applying migration: 20260201184000_add_missing_api_key_columns.sql
[2026-10-01T19:32:21.882Z] [INFO] Successfully applied migration: 20260201184000_add_missing_api_key_columns.sql
[2026-10-01T19:32:21.882Z] [INFO] Applying migration: 20260202023713_add_oidc_config_to_sso_provider.sql
[2026-10-01T19:32:21.889Z] [INFO] Successfully applied migration: 20260202023713_add_oidc_config_to_sso_provider.sql
[2026-10-01T19:32:21.889Z] [INFO] Applying migration: 20260205200200_add_exercise_sorting.sql
[2026-10-01T19:32:21.908Z] [INFO] Successfully applied migration: 20260205200200_add_exercise_sorting.sql
[2026-10-01T19:32:21.908Z] [INFO] Applying migration: 20260206132000_ensure_first_user_is_admin.sql
[2026-10-01T19:32:21.912Z] [INFO] Successfully applied migration: 20260206132000_ensure_first_user_is_admin.sql
[2026-10-01T19:32:21.913Z] [INFO] Applying migration: 20260206215500_add_mfa_totp_enabled_column.sql
[2026-10-01T19:32:21.921Z] [INFO] Successfully applied migration: 20260206215500_add_mfa_totp_enabled_column.sql
[2026-10-01T19:32:21.921Z] [INFO] Applying migration: 20260207110000_mfa_triggers.sql
[2026-10-01T19:32:21.928Z] [INFO] Successfully applied migration: 20260207110000_mfa_triggers.sql
[2026-10-01T19:32:21.928Z] [INFO] Applying migration: 20260208120000_fix_api_key_rate_limit_defaults.sql
[2026-10-01T19:32:21.933Z] [INFO] Successfully applied migration: 20260208120000_fix_api_key_rate_limit_defaults.sql
[2026-10-01T19:32:21.933Z] [INFO] Applying migration: 20260208194543_fix_user_meal_visibilities_fkey.sql
[2026-10-01T19:32:21.940Z] [INFO] Successfully applied migration: 20260208194543_fix_user_meal_visibilities_fkey.sql
[2026-10-01T19:32:21.940Z] [INFO] Applying migration: 20260208_fix_user_creation_trigger.sql
[2026-10-01T19:32:21.946Z] [INFO] Successfully applied migration: 20260208_fix_user_creation_trigger.sql
[2026-10-01T19:32:21.946Z] [INFO] Applying migration: 20260214223000_add_polar_provider_type.sql
[2026-10-01T19:32:21.951Z] [INFO] Successfully applied migration: 20260214223000_add_polar_provider_type.sql
[2026-10-01T19:32:21.951Z] [INFO] Applying migration: 20260215144500_add_hevy_provider_type.sql
[2026-10-01T19:32:21.956Z] [INFO] Successfully applied migration: 20260215144500_add_hevy_provider_type.sql
[2026-10-01T19:32:21.956Z] [INFO] Applying migration: 20260216012235_add_global_ai_settings.sql
[2026-10-01T19:32:21.965Z] [INFO] Successfully applied migration: 20260216012235_add_global_ai_settings.sql
[2026-10-01T19:32:21.965Z] [INFO] Applying migration: 20260216020134_add_allow_user_ai_config.sql
[2026-10-01T19:32:21.970Z] [INFO] Successfully applied migration: 20260216020134_add_allow_user_ai_config.sql
[2026-10-01T19:32:21.970Z] [INFO] Applying migration: 20260216030000_rename_is_global_to_is_public.sql
[2026-10-01T19:32:21.978Z] [INFO] Successfully applied migration: 20260216030000_rename_is_global_to_is_public.sql
[2026-10-01T19:32:21.978Z] [INFO] Applying migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql
[2026-10-01T19:32:21.984Z] [INFO] Successfully applied migration: 20260216140000_add_custom_nutrients_to_goals_and_presets.sql
[2026-10-01T19:32:21.984Z] [INFO] Applying migration: 20260216195500_prune_empty_custom_nutrients.sql
[2026-10-01T19:32:21.989Z] [INFO] Successfully applied migration: 20260216195500_prune_empty_custom_nutrients.sql
[2026-10-01T19:32:21.989Z] [INFO] Applying migration: 20260221210000_oidc_config_jsonb.sql
[2026-10-01T19:32:22.003Z] [INFO] Successfully applied migration: 20260221210000_oidc_config_jsonb.sql
[2026-10-01T19:32:22.003Z] [INFO] Applying migration: 20260222100000_add_strava_provider_type.sql
[2026-10-01T19:32:22.010Z] [INFO] Successfully applied migration: 20260222100000_add_strava_provider_type.sql
[2026-10-01T19:32:22.010Z] [INFO] Applying migration: 20260224000000_add_sleep_science.sql
[2026-10-01T19:32:22.042Z] [INFO] Successfully applied migration: 20260224000000_add_sleep_science.sql
[2026-10-01T19:32:22.042Z] [INFO] Applying migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql
[2026-10-01T19:32:22.048Z] [INFO] Successfully applied migration: 20260224120000_add_show_in_quick_log_to_meal_visibilities.sql
[2026-10-01T19:32:22.048Z] [INFO] Applying migration: 20260226000000_add_exercise_calorie_preferences.sql
[2026-10-01T19:32:22.055Z] [INFO] Successfully applied migration: 20260226000000_add_exercise_calorie_preferences.sql
[2026-10-01T19:32:22.055Z] [INFO] Applying migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql
[2026-10-01T19:32:22.058Z] [INFO] Successfully applied migration: 20260228120000_fix_sleep_entry_date_to_wake_up_date.sql
[2026-10-01T19:32:22.058Z] [INFO] Applying migration: 20260302000000_add_default_barcode_provider_id.sql
[2026-10-01T19:32:22.067Z] [INFO] Successfully applied migration: 20260302000000_add_default_barcode_provider_id.sql
[2026-10-01T19:32:22.068Z] [INFO] Applying migration: 20260302120000_normalize_barcodes.sql
[2026-10-01T19:32:22.071Z] [INFO] Successfully applied migration: 20260302120000_normalize_barcodes.sql
[2026-10-01T19:32:22.071Z] [INFO] Applying migration: 20260313100000_add_source_to_water_intake.sql
[2026-10-01T19:32:22.088Z] [INFO] Successfully applied migration: 20260313100000_add_source_to_water_intake.sql
[2026-10-01T19:32:22.088Z] [INFO] Applying migration: 20260314175000_add_image_to_user_table.sql
[2026-10-01T19:32:22.092Z] [INFO] Successfully applied migration: 20260314175000_add_image_to_user_table.sql
[2026-10-01T19:32:22.092Z] [INFO] Applying migration: 20260315192200_fix_oidc_config_keys.sql
[2026-10-01T19:32:22.095Z] [INFO] Successfully applied migration: 20260315192200_fix_oidc_config_keys.sql
[2026-10-01T19:32:22.096Z] [INFO] Applying migration: 20260315200000_better_auth_1_5_upgrade.sql
[2026-10-01T19:32:22.100Z] [INFO] Successfully applied migration: 20260315200000_better_auth_1_5_upgrade.sql
[2026-10-01T19:32:22.100Z] [INFO] Applying migration: 20260321000000_add_auto_scale_online_imports.sql
[2026-10-01T19:32:22.105Z] [INFO] Successfully applied migration: 20260321000000_add_auto_scale_online_imports.sql
[2026-10-01T19:32:22.105Z] [INFO] Applying migration: 20260322130000_mfa_better_auth_optimization.sql
[2026-10-01T19:32:22.112Z] [INFO] Successfully applied migration: 20260322130000_mfa_better_auth_optimization.sql
[2026-10-01T19:32:22.112Z] [INFO] Applying migration: 20260322141500_mfa_triggers_sync_fix.sql
[2026-10-01T19:32:22.118Z] [INFO] Successfully applied migration: 20260322141500_mfa_triggers_sync_fix.sql
[2026-10-01T19:32:22.118Z] [INFO] Applying migration: 20260322154230_add_first_day_of_week_to_preferences.sql
[2026-10-01T19:32:22.127Z] [INFO] Successfully applied migration: 20260322154230_add_first_day_of_week_to_preferences.sql
[2026-10-01T19:32:22.127Z] [INFO] Applying migration: 20260323122741_add_steps_column.sql
[2026-10-01T19:32:22.131Z] [INFO] Successfully applied migration: 20260323122741_add_steps_column.sql
[2026-10-01T19:32:22.131Z] [INFO] Applying migration: 20260328120000_add_timezone_check_constraint.sql
[2026-10-01T19:32:22.137Z] [INFO] Successfully applied migration: 20260328120000_add_timezone_check_constraint.sql
[2026-10-01T19:32:22.137Z] [INFO] Applying migration: 20260406120000_add_barcode_fallback_open_food_facts.sql
[2026-10-01T19:32:22.142Z] [INFO] Successfully applied migration: 20260406120000_add_barcode_fallback_open_food_facts.sql
[2026-10-01T19:32:22.142Z] [INFO] Applying migration: 20260420230132_scope_exercises_source_unique_to_user.sql
[2026-10-01T19:32:22.149Z] [INFO] Successfully applied migration: 20260420230132_scope_exercises_source_unique_to_user.sql
[2026-10-01T19:32:22.149Z] [INFO] Applying migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql
[2026-10-01T19:32:22.154Z] [INFO] Successfully applied migration: 20260423120000_sleep_entry_stages_unique_natural_key.sql
[2026-10-01T19:32:22.155Z] [INFO] Applying migration: 20260426120000_provider_sort_order.sql
[2026-10-01T19:32:22.160Z] [INFO] Successfully applied migration: 20260426120000_provider_sort_order.sql
[2026-10-01T19:32:22.160Z] [INFO] Applying migration: 20260426120001_custom_meal_percentages.sql
[2026-10-01T19:32:22.166Z] [INFO] Successfully applied migration: 20260426120001_custom_meal_percentages.sql
[2026-10-01T19:32:22.166Z] [INFO] Applying migration: 20260509120000_add_water_intake_entries.sql
[2026-10-01T19:32:22.330Z] [INFO] Successfully applied migration: 20260509120000_add_water_intake_entries.sql
[2026-10-01T19:32:22.330Z] [INFO] Applying migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql
[2026-10-01T19:32:22.335Z] [INFO] Successfully applied migration: 20260515120000_add_show_net_carbs_to_user_preferences.sql
[2026-10-01T19:32:22.335Z] [INFO] Applying migration: 20260515174155_serving_size_model.sql
[2026-10-01T19:32:22.344Z] [INFO] Successfully applied migration: 20260515174155_serving_size_model.sql
[2026-10-01T19:32:22.344Z] [INFO] Applying migration: 20260523120000_ai_assisted_conversions.sql
[2026-10-01T19:32:22.354Z] [INFO] Successfully applied migration: 20260523120000_ai_assisted_conversions.sql
[2026-10-01T19:32:22.354Z] [INFO] Applying migration: 20260527120000_add_allergen_tracking.sql
[2026-10-01T19:32:22.369Z] [INFO] Successfully applied migration: 20260527120000_add_allergen_tracking.sql
[2026-10-01T19:32:22.369Z] [INFO] Applying migration: 20260529140000_add_multimodal_support_to_chat_history.sql
[2026-10-01T19:32:22.374Z] [INFO] Successfully applied migration: 20260529140000_add_multimodal_support_to_chat_history.sql
[2026-10-01T19:32:22.374Z] [INFO] Applying migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql
[2026-10-01T19:32:22.387Z] [INFO] Successfully applied migration: 20260531120000_add_nutrition_snapshot_to_meal_foods.sql
[2026-10-01T19:32:22.387Z] [INFO] Applying migration: 20260531120000_add_source_to_food_entries.sql
[2026-10-01T19:32:22.395Z] [INFO] Successfully applied migration: 20260531120000_add_source_to_food_entries.sql
[2026-10-01T19:32:22.395Z] [INFO] Applying migration: 20260604120000_add_checkin_mood_unique_indexes.sql
[2026-10-01T19:32:22.403Z] [INFO] Successfully applied migration: 20260604120000_add_checkin_mood_unique_indexes.sql
[2026-10-01T19:32:22.403Z] [INFO] Applying migration: 20260604120600_add_user_last_login_at.sql
[2026-10-01T19:32:22.409Z] [INFO] Successfully applied migration: 20260604120600_add_user_last_login_at.sql
[2026-10-01T19:32:22.409Z] [INFO] Applying migration: 20260606132000_add_yazio_provider_type.sql
[2026-10-01T19:32:22.417Z] [INFO] Successfully applied migration: 20260606132000_add_yazio_provider_type.sql
[2026-10-01T19:32:22.417Z] [INFO] Applying migration: 20260606164200_add_norish_provider_type.sql
[2026-10-01T19:32:22.421Z] [INFO] Successfully applied migration: 20260606164200_add_norish_provider_type.sql
[2026-10-01T19:32:22.421Z] [INFO] Applying migration: 20260607000000_add_googlehealth_provider_type.sql
[2026-10-01T19:32:22.425Z] [INFO] Successfully applied migration: 20260607000000_add_googlehealth_provider_type.sql
[2026-10-01T19:32:22.425Z] [INFO] Applying migration: 20260607114000_add_swissfood_provider_type.sql
[2026-10-01T19:32:22.431Z] [INFO] Successfully applied migration: 20260607114000_add_swissfood_provider_type.sql
[2026-10-01T19:32:22.431Z] [INFO] Applying migration: 20260610120000_add_garmin_nutrition_index.sql
[2026-10-01T19:32:22.437Z] [INFO] Successfully applied migration: 20260610120000_add_garmin_nutrition_index.sql
[2026-10-01T19:32:22.437Z] [INFO] Applying migration: 20260612120000_add_use_external_bmr_preference.sql
[2026-10-01T19:32:22.443Z] [INFO] Successfully applied migration: 20260612120000_add_use_external_bmr_preference.sql
[2026-10-01T19:32:22.443Z] [INFO] Applying migration: 20260612153000_add_goal_mode_to_user_preferences.sql
[2026-10-01T19:32:22.453Z] [INFO] Successfully applied migration: 20260612153000_add_goal_mode_to_user_preferences.sql
[2026-10-01T19:32:22.453Z] [INFO] Applying migration: 20260614000000_add_checkin_photos.sql
[2026-10-01T19:32:22.472Z] [INFO] Successfully applied migration: 20260614000000_add_checkin_photos.sql
[2026-10-01T19:32:22.473Z] [INFO] Applying migration: 20260618000000_remove_superuser_extensions.sql
[2026-10-01T19:32:22.489Z] [INFO] Successfully applied migration: 20260618000000_remove_superuser_extensions.sql
[2026-10-01T19:32:22.489Z] [INFO] Applying migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql
[2026-10-01T19:32:22.511Z] [INFO] Successfully applied migration: 20260620143300_public_sharing_and_dynamic_provider_types.sql
[2026-10-01T19:32:22.511Z] [INFO] Applying migration: 20260621000000_create_user_dashboard_layouts.sql
[2026-10-01T19:32:22.522Z] [INFO] Successfully applied migration: 20260621000000_create_user_dashboard_layouts.sql
[2026-10-01T19:32:22.522Z] [INFO] Applying migration: 20260622120000_add_water_estimated_to_exercise_entries.sql
[2026-10-01T19:32:22.530Z] [INFO] Successfully applied migration: 20260622120000_add_water_estimated_to_exercise_entries.sql
[2026-10-01T19:32:22.530Z] [INFO] Applying migration: 20260623000000_add_measurement_decimal_places.sql
[2026-10-01T19:32:22.536Z] [INFO] Successfully applied migration: 20260623000000_add_measurement_decimal_places.sql
[2026-10-01T19:32:22.536Z] [INFO] Applying migration: 20260624000000_add_medication_glp1_schema.sql
[2026-10-01T19:32:22.642Z] [INFO] Successfully applied migration: 20260624000000_add_medication_glp1_schema.sql
[2026-10-01T19:32:22.642Z] [INFO] Applying migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
[2026-10-01T19:32:22.647Z] [INFO] Successfully applied migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
[2026-10-01T19:32:22.648Z] [INFO] Applying migration: 20260628000000_convert_exercise_durations_to_numeric.sql
[2026-10-01T19:32:22.674Z] [INFO] Successfully applied migration: 20260628000000_convert_exercise_durations_to_numeric.sql
[2026-10-01T19:32:22.674Z] [INFO] Applying migration: 20260628120000_add_vision_ai_service_pointers.sql
[2026-10-01T19:32:22.682Z] [INFO] Successfully applied migration: 20260628120000_add_vision_ai_service_pointers.sql
[2026-10-01T19:32:22.682Z] [INFO] Applying migration: 20260630000000_add_custom_nutrient_aliases.sql
[2026-10-01T19:32:22.687Z] [INFO] Successfully applied migration: 20260630000000_add_custom_nutrient_aliases.sql
[2026-10-01T19:32:22.687Z] [INFO] Applying migration: 20260630000000_add_onboarding_skipped.sql
[2026-10-01T19:32:22.692Z] [INFO] Successfully applied migration: 20260630000000_add_onboarding_skipped.sql
[2026-10-01T19:32:22.692Z] [INFO] Applying migration: 20260701000000_add_child_meal_to_meal_foods.sql
[2026-10-01T19:32:22.703Z] [INFO] Successfully applied migration: 20260701000000_add_child_meal_to_meal_foods.sql
[2026-10-01T19:32:22.703Z] [INFO] Applying migration: 20260702180000_add_cycle_tracking_schema.sql
[2026-10-01T19:32:22.821Z] [INFO] Successfully applied migration: 20260702180000_add_cycle_tracking_schema.sql
[2026-10-01T19:32:22.821Z] [INFO] Applying migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
[2026-10-01T19:32:22.826Z] [INFO] Successfully applied migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
[2026-10-01T19:32:22.840Z] [INFO] Ensuring permissions for role: "sparkyapp"
[2026-10-01T19:32:22.893Z] [INFO] Successfully ensured permissions for role: "sparkyapp"
[2026-10-01T19:32:22.895Z] [INFO] Permissions granted to application user.
[2026-10-01T19:32:22.896Z] [INFO] Applying all RLS policies from rls_policies.sql...
[2026-10-01T19:32:23.081Z] [INFO] Successfully applied all RLS policies.
[AUTH] Starting Better Auth mounting phase...
[AUTH] Better Auth handler successfully mounted.
[AUTH] Synced trusted SSO providers for auto-linking: []
DEBUG: Server started and listening on port 3010
[2026-10-01T19:32:23.166Z] [INFO] SparkyFitnessServer listening on port 3010
View API documentation at: /api/api-docs/swagger
[2026-10-01T19:32:23.167Z] [INFO] No backup settings found, creating default entry.
[2026-10-01T19:32:23.171Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule
[2026-10-01T19:32:40.046Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:33:10.179Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:33:40.305Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:34:10.437Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:34:40.556Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:35:10.679Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:35:40.791Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:36:10.922Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:36:41.051Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:37:11.184Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:37:41.343Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
[2026-10-01T19:38:11.466Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
@@ -0,0 +1,40 @@
[2026-10-01T19:32:20.185Z] [INFO] Ensured schema_migrations table exists.
[2026-10-01T19:32:20.187Z] [INFO] Applied migrations: []
[2026-10-01T19:32:20.189Z] [INFO] Applying migration: 20250703170640_InitialDB.sql
[2026-10-01T19:32:20.283Z] [INFO] Successfully applied migration: 20250703170640_InitialDB.sql
[2026-10-01T19:32:20.283Z] [INFO] Applying migration: 20250710062500_create_goal_presets_table.sql
[2026-10-01T19:32:20.306Z] [INFO] Successfully applied migration: 20250710062500_create_goal_presets_table.sql
[2026-10-01T19:32:20.306Z] [INFO] Applying migration: 20250711173824_meal_features.sql
[2026-10-01T19:32:20.359Z] [INFO] Successfully applied migration: 20250711173824_meal_features.sql
[2026-10-01T19:32:20.359Z] [INFO] Applying migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql
[2026-10-01T19:32:20.368Z] [INFO] Successfully applied migration: 20250712163617_refactor_data_providers_and_add_exercise_source_id.sql
[2026-10-01T19:32:20.368Z] [INFO] Applying migration: 20250713125323_create_oidc_settings_and_update_users_table.sql
[2026-10-01T19:32:20.381Z] [INFO] Successfully applied migration: 20250713125323_create_oidc_settings_and_update_users_table.sql
[2026-10-01T19:32:20.381Z] [INFO] Applying migration: 20250713135900_add_role_to_users_table.sql
[2026-10-01T19:32:20.387Z] [INFO] Successfully applied migration: 20250713135900_add_role_to_users_table.sql
[2026-10-01T19:32:20.387Z] [INFO] Applying migration: 20250713142300_add_oidc_config_fields.sql
[2026-10-01T19:32:20.395Z] [INFO] Successfully applied migration: 20250713142300_add_oidc_config_fields.sql
[2026-10-01T19:32:20.395Z] [INFO] Applying migration: 20250714000000_create_session_table.sql
[2026-10-01T19:32:20.409Z] [INFO] Successfully applied migration: 20250714000000_create_session_table.sql
[2026-10-01T19:32:20.409Z] [INFO] Applying migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql
[2026-10-01T19:32:20.414Z] [INFO] Successfully applied migration: 20250714175824_add_api_key_tag_to_ai_service_settings.sql
[2026-10-01T19:32:20.414Z] [INFO] Applying migration: 20250717190700_add_cascading_deletes.sql
[2026-10-01T19:32:20.444Z] [INFO] Successfully applied migration: 20250717190700_add_cascading_deletes.sql
[2026-10-01T19:32:20.444Z] [INFO] Applying migration: 20250717233929_add_is_quick_food_to_foods.sql
[2026-10-01T19:32:20.450Z] [INFO] Successfully applied migration: 20250717233929_add_is_quick_food_to_foods.sql
[2026-10-01T19:32:20.450Z] [INFO] Applying migration: 20250718190226_add_food_display_limit_to_user_preferences.sql
[2026-10-01T19:32:20.456Z] [INFO] Successfully applied migration: 20250718190226_add_food_display_limit_to_user_preferences.sql
[2026-10-01T19:32:20.456Z] [INFO] Applying migration: 20250719131500_add_meal_percentages.sql
[2026-10-01T19:32:20.466Z] [INFO] Successfully applied migration: 20250719131500_add_meal_percentages.sql
[2026-10-01T19:32:20.466Z] [INFO] Applying migration: 20250719215400_add_login_management_to_oidc_settings.sql
[2026-10-01T19:32:20.472Z] [INFO] Successfully applied migration: 20250719215400_add_login_management_to_oidc_settings.sql
[2026-10-01T19:32:20.472Z] [INFO] Applying migration: 20250720010000_create_user_nutrient_display_preferences.sql
[2026-10-01T19:32:20.485Z] [INFO] Successfully applied migration: 20250720010000_create_user_nutrient_display_preferences.sql
[2026-10-01T19:32:20.485Z] [INFO] Applying migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql
[2026-10-01T19:32:20.490Z] [INFO] Successfully applied migration: 20250720201800_rename_food_display_limit_to_item_display_limit.sql
[2026-10-01T19:32:20.490Z] [INFO] Applying migration: 20250720220000_add_water_tracking_features.sql
[2026-10-01T19:32:20.504Z] [INFO] Successfully applied migration: 20250720220000_add_water_tracking_features.sql
[2026-10-01T19:32:20.504Z] [INFO] Applying migration: 20250720233836_alter_water_goal_ml_to_numeric.sql
[2026-10-01T19:32:20.516Z] [INFO] Successfully applied migration: 20250720233836_alter_water_goal_ml_to_numeric.sql
[2026-10-01T19:32:20.516Z] [INFO] Applying migration: 20250721000000_add_servings_per_container_to_water_containers.sql
[2026-10-01T19:32:20.521Z] [INFO] Successfully applied migration: 20250721000000_add_servings_per_container_to_water_containers.sql
@@ -0,0 +1,507 @@
epoch,name,id,anon,current,swap,oom_kill,limit,restarts
1790883119,sparkyfitness-db,a02c25033ce3,6344704,49041408,0,0,536870912,0
1790883121,sparkyfitness-db,a02c25033ce3,5169152,119238656,0,0,536870912,0
1790883123,sparkyfitness-db,a02c25033ce3,5169152,118706176,0,0,536870912,0
1790883125,sparkyfitness-db,a02c25033ce3,5169152,118710272,0,0,536870912,0
1790883127,sparkyfitness-db,a02c25033ce3,5169152,118710272,0,0,536870912,0
1790883130,sparkyfitness-db,a02c25033ce3,5218304,119824384,0,0,536870912,0
1790883130,sparkyfitness-server,d242936eb3a7,31965184,36077568,0,0,1073741824,0
1790883132,sparkyfitness-db,a02c25033ce3,5218304,119824384,0,0,536870912,0
1790883132,sparkyfitness-server,d242936eb3a7,124657664,133730304,0,0,1073741824,0
1790883134,sparkyfitness-db,a02c25033ce3,5218304,119824384,0,0,536870912,0
1790883134,sparkyfitness-server,d242936eb3a7,168407040,182247424,0,0,1073741824,0
1790883136,sparkyfitness-db,a02c25033ce3,5230592,119836672,0,0,536870912,0
1790883136,sparkyfitness-server,d242936eb3a7,167100416,182276096,0,0,1073741824,0
1790883138,sparkyfitness-db,a02c25033ce3,5230592,119836672,0,0,536870912,0
1790883138,sparkyfitness-server,d242936eb3a7,248242176,270376960,0,0,1073741824,0
1790883140,sparkyfitness-db,a02c25033ce3,8830976,129462272,0,0,536870912,0
1790883140,sparkyfitness-server,d242936eb3a7,343142400,370241536,0,0,1073741824,0
1790883142,sparkyfitness-db,a02c25033ce3,14315520,182599680,0,0,536870912,0
1790883142,sparkyfitness-server,d242936eb3a7,342450176,375562240,0,0,1073741824,0
1790883145,sparkyfitness-db,a02c25033ce3,14589952,183816192,0,0,536870912,0
1790883145,sparkyfitness-server,d242936eb3a7,350523392,381837312,0,0,1073741824,0
1790883147,sparkyfitness-db,a02c25033ce3,14589952,183558144,0,0,536870912,0
1790883147,sparkyfitness-server,d242936eb3a7,350523392,381771776,0,0,1073741824,0
1790883149,sparkyfitness-db,a02c25033ce3,14589952,183558144,0,0,536870912,0
1790883149,sparkyfitness-server,d242936eb3a7,350531584,381775872,0,0,1073741824,0
1790883151,sparkyfitness-db,a02c25033ce3,14598144,184635392,0,0,536870912,0
1790883151,sparkyfitness-server,d242936eb3a7,350531584,381779968,0,0,1073741824,0
1790883153,sparkyfitness-db,a02c25033ce3,14598144,184053760,0,0,536870912,0
1790883153,sparkyfitness-server,d242936eb3a7,350531584,381521920,0,0,1073741824,0
1790883155,sparkyfitness-db,a02c25033ce3,14598144,184053760,0,0,536870912,0
1790883155,sparkyfitness-server,d242936eb3a7,350593024,381526016,0,0,1073741824,0
1790883157,sparkyfitness-db,a02c25033ce3,14598144,184053760,0,0,536870912,0
1790883157,sparkyfitness-server,d242936eb3a7,350539776,382050304,0,0,1073741824,0
1790883159,sparkyfitness-db,a02c25033ce3,14598144,184254464,0,0,536870912,0
1790883160,sparkyfitness-server,d242936eb3a7,355352576,387665920,0,0,1073741824,0
1790883162,sparkyfitness-db,a02c25033ce3,14598144,184254464,0,0,536870912,0
1790883162,sparkyfitness-server,d242936eb3a7,350773248,381771776,0,0,1073741824,0
1790883162,sparkyfitness,fa7ab69c7918,5115904,6574080,0,0,268435456,0
1790883164,sparkyfitness-db,a02c25033ce3,14598144,184254464,0,0,536870912,0
1790883164,sparkyfitness-server,d242936eb3a7,350777344,381775872,0,0,1073741824,0
1790883164,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883166,sparkyfitness-db,a02c25033ce3,14598144,184516608,0,0,536870912,0
1790883166,sparkyfitness-server,d242936eb3a7,350785536,382038016,0,0,1073741824,0
1790883166,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883168,sparkyfitness-db,a02c25033ce3,14598144,184254464,0,0,536870912,0
1790883168,sparkyfitness-server,d242936eb3a7,350785536,382042112,0,0,1073741824,0
1790883168,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883170,sparkyfitness-db,a02c25033ce3,14598144,184254464,0,0,536870912,0
1790883170,sparkyfitness-server,d242936eb3a7,350789632,381779968,0,0,1073741824,0
1790883170,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883172,sparkyfitness-db,a02c25033ce3,14606336,187039744,0,0,536870912,0
1790883172,sparkyfitness-server,d242936eb3a7,350810112,382291968,0,0,1073741824,0
1790883172,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883175,sparkyfitness-db,a02c25033ce3,5283840,179376128,0,0,536870912,0
1790883175,sparkyfitness-server,d242936eb3a7,350892032,382394368,0,0,1073741824,0
1790883175,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883177,sparkyfitness-db,a02c25033ce3,5283840,179376128,0,0,536870912,0
1790883177,sparkyfitness-server,d242936eb3a7,350892032,381878272,0,0,1073741824,0
1790883177,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883179,sparkyfitness-db,a02c25033ce3,5283840,179372032,0,0,536870912,0
1790883179,sparkyfitness-server,d242936eb3a7,350900224,382140416,0,0,1073741824,0
1790883179,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883181,sparkyfitness-db,a02c25033ce3,5283840,179580928,0,0,536870912,0
1790883181,sparkyfitness-server,d242936eb3a7,350908416,382660608,0,0,1073741824,0
1790883181,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883183,sparkyfitness-db,a02c25033ce3,5283840,179834880,0,0,536870912,0
1790883183,sparkyfitness-server,d242936eb3a7,350908416,382148608,0,0,1073741824,0
1790883183,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883185,sparkyfitness-db,a02c25033ce3,5283840,179691520,0,0,536870912,0
1790883185,sparkyfitness-server,d242936eb3a7,350912512,382148608,0,0,1073741824,0
1790883185,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883188,sparkyfitness-db,a02c25033ce3,5283840,179691520,0,0,536870912,0
1790883188,sparkyfitness-server,d242936eb3a7,350916608,381894656,0,0,1073741824,0
1790883188,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883190,sparkyfitness-db,a02c25033ce3,5287936,179703808,0,0,536870912,0
1790883190,sparkyfitness-server,d242936eb3a7,351002624,382926848,0,0,1073741824,0
1790883190,sparkyfitness,fa7ab69c7918,5115904,6569984,0,0,268435456,0
1790883192,sparkyfitness-db,a02c25033ce3,5308416,180719616,0,0,536870912,0
1790883192,sparkyfitness-server,d242936eb3a7,351092736,382595072,0,0,1073741824,0
1790883192,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883194,sparkyfitness-db,a02c25033ce3,5308416,180719616,0,0,536870912,0
1790883194,sparkyfitness-server,d242936eb3a7,351092736,382074880,0,0,1073741824,0
1790883194,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883196,sparkyfitness-db,a02c25033ce3,5308416,180719616,0,0,536870912,0
1790883196,sparkyfitness-server,d242936eb3a7,351096832,382599168,0,0,1073741824,0
1790883196,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883198,sparkyfitness-db,a02c25033ce3,5308416,180719616,0,0,536870912,0
1790883198,sparkyfitness-server,d242936eb3a7,351096832,382341120,0,0,1073741824,0
1790883198,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883200,sparkyfitness-db,a02c25033ce3,5308416,180723712,0,0,536870912,0
1790883201,sparkyfitness-server,d242936eb3a7,351100928,382341120,0,0,1073741824,0
1790883201,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883203,sparkyfitness-db,a02c25033ce3,5308416,180723712,0,0,536870912,0
1790883203,sparkyfitness-server,d242936eb3a7,351105024,382537728,0,0,1073741824,0
1790883203,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883205,sparkyfitness-db,a02c25033ce3,5308416,180781056,0,0,536870912,0
1790883205,sparkyfitness-server,d242936eb3a7,351039488,382279680,0,0,1073741824,0
1790883205,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883207,sparkyfitness-db,a02c25033ce3,5308416,180781056,0,0,536870912,0
1790883207,sparkyfitness-server,d242936eb3a7,351039488,382287872,0,0,1073741824,0
1790883207,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883209,sparkyfitness-db,a02c25033ce3,5308416,180781056,0,0,536870912,0
1790883209,sparkyfitness-server,d242936eb3a7,351047680,382287872,0,0,1073741824,0
1790883209,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883211,sparkyfitness-db,a02c25033ce3,5308416,180633600,0,0,536870912,0
1790883211,sparkyfitness-server,d242936eb3a7,351051776,382283776,0,0,1073741824,0
1790883211,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883213,sparkyfitness-db,a02c25033ce3,5308416,180633600,0,0,536870912,0
1790883214,sparkyfitness-server,d242936eb3a7,351051776,382029824,0,0,1073741824,0
1790883214,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883216,sparkyfitness-db,a02c25033ce3,5308416,180629504,0,0,536870912,0
1790883216,sparkyfitness-server,d242936eb3a7,351055872,382033920,0,0,1073741824,0
1790883216,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883218,sparkyfitness-db,a02c25033ce3,5308416,180629504,0,0,536870912,0
1790883218,sparkyfitness-server,d242936eb3a7,351059968,382365696,0,0,1073741824,0
1790883218,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883220,sparkyfitness-db,a02c25033ce3,5308416,180842496,0,0,536870912,0
1790883220,sparkyfitness-server,d242936eb3a7,350973952,382717952,0,0,1073741824,0
1790883220,sparkyfitness,fa7ab69c7918,5160960,6631424,0,0,268435456,0
1790883222,sparkyfitness-db,a02c25033ce3,5308416,180830208,0,0,536870912,0
1790883222,sparkyfitness-server,d242936eb3a7,350973952,381972480,0,0,1073741824,0
1790883222,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883224,sparkyfitness-db,a02c25033ce3,5308416,181092352,0,0,536870912,0
1790883224,sparkyfitness-server,d242936eb3a7,350973952,382238720,0,0,1073741824,0
1790883224,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883226,sparkyfitness-db,a02c25033ce3,5308416,180830208,0,0,536870912,0
1790883227,sparkyfitness-server,d242936eb3a7,350973952,382230528,0,0,1073741824,0
1790883227,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883229,sparkyfitness-db,a02c25033ce3,5308416,180830208,0,0,536870912,0
1790883229,sparkyfitness-server,d242936eb3a7,350973952,382234624,0,0,1073741824,0
1790883229,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883231,sparkyfitness-db,a02c25033ce3,5308416,181604352,0,0,536870912,0
1790883231,sparkyfitness-server,d242936eb3a7,350973952,381972480,0,0,1073741824,0
1790883231,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883233,sparkyfitness-db,a02c25033ce3,5308416,180883456,0,0,536870912,0
1790883233,sparkyfitness-server,d242936eb3a7,350973952,382754816,0,0,1073741824,0
1790883233,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883235,sparkyfitness-db,a02c25033ce3,5308416,180879360,0,0,536870912,0
1790883235,sparkyfitness-server,d242936eb3a7,350973952,382234624,0,0,1073741824,0
1790883235,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883237,sparkyfitness-db,a02c25033ce3,5308416,180879360,0,0,536870912,0
1790883237,sparkyfitness-server,d242936eb3a7,350973952,381972480,0,0,1073741824,0
1790883237,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883239,sparkyfitness-db,a02c25033ce3,5308416,180879360,0,0,536870912,0
1790883239,sparkyfitness-server,d242936eb3a7,350973952,382230528,0,0,1073741824,0
1790883240,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883242,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883242,sparkyfitness-server,d242936eb3a7,350978048,381972480,0,0,1073741824,0
1790883242,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883244,sparkyfitness-db,a02c25033ce3,5308416,181080064,0,0,536870912,0
1790883244,sparkyfitness-server,d242936eb3a7,315281408,345255936,0,0,1073741824,0
1790883244,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883246,sparkyfitness-db,a02c25033ce3,5308416,181080064,0,0,536870912,0
1790883246,sparkyfitness-server,d242936eb3a7,265515008,294002688,0,0,1073741824,0
1790883246,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883248,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883248,sparkyfitness-server,d242936eb3a7,265621504,294326272,0,0,1073741824,0
1790883248,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883250,sparkyfitness-db,a02c25033ce3,5308416,181002240,0,0,536870912,0
1790883250,sparkyfitness-server,d242936eb3a7,265822208,294289408,0,0,1073741824,0
1790883250,sparkyfitness,fa7ab69c7918,5206016,6676480,0,0,268435456,0
1790883252,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883252,sparkyfitness-server,d242936eb3a7,266002432,293814272,0,0,1073741824,0
1790883253,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883255,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883255,sparkyfitness-server,d242936eb3a7,265592832,294862848,0,0,1073741824,0
1790883255,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883257,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883257,sparkyfitness-server,d242936eb3a7,265592832,294014976,0,0,1073741824,0
1790883257,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883259,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883259,sparkyfitness-server,d242936eb3a7,264359936,292581376,0,0,1073741824,0
1790883259,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883261,sparkyfitness-db,a02c25033ce3,5308416,181112832,0,0,536870912,0
1790883261,sparkyfitness-server,d242936eb3a7,264359936,292581376,0,0,1073741824,0
1790883261,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883263,sparkyfitness-db,a02c25033ce3,5308416,180985856,0,0,536870912,0
1790883263,sparkyfitness-server,d242936eb3a7,264359936,292843520,0,0,1073741824,0
1790883263,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883265,sparkyfitness-db,a02c25033ce3,5308416,180985856,0,0,536870912,0
1790883265,sparkyfitness-server,d242936eb3a7,264359936,292585472,0,0,1073741824,0
1790883266,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883268,sparkyfitness-db,a02c25033ce3,5308416,180977664,0,0,536870912,0
1790883268,sparkyfitness-server,d242936eb3a7,264359936,292839424,0,0,1073741824,0
1790883268,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883270,sparkyfitness-db,a02c25033ce3,5308416,181399552,0,0,536870912,0
1790883270,sparkyfitness-server,d242936eb3a7,264359936,292585472,0,0,1073741824,0
1790883270,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883272,sparkyfitness-db,a02c25033ce3,5308416,181010432,0,0,536870912,0
1790883272,sparkyfitness-server,d242936eb3a7,264364032,293105664,0,0,1073741824,0
1790883272,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883274,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883274,sparkyfitness-server,d242936eb3a7,264364032,293109760,0,0,1073741824,0
1790883274,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883276,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883276,sparkyfitness-server,d242936eb3a7,264368128,292589568,0,0,1073741824,0
1790883276,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883278,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883279,sparkyfitness-server,d242936eb3a7,264368128,292597760,0,0,1073741824,0
1790883279,sparkyfitness,fa7ab69c7918,5251072,6725632,0,0,268435456,0
1790883281,sparkyfitness-db,a02c25033ce3,5308416,181112832,0,0,536870912,0
1790883281,sparkyfitness-server,d242936eb3a7,264384512,292827136,0,0,1073741824,0
1790883281,sparkyfitness,fa7ab69c7918,5296128,7405568,0,0,268435456,0
1790883283,sparkyfitness-db,a02c25033ce3,5308416,181010432,0,0,536870912,0
1790883283,sparkyfitness-server,d242936eb3a7,264388608,292614144,0,0,1073741824,0
1790883283,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883285,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883285,sparkyfitness-server,d242936eb3a7,264388608,293134336,0,0,1073741824,0
1790883285,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883287,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883287,sparkyfitness-server,d242936eb3a7,264392704,292880384,0,0,1073741824,0
1790883287,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883289,sparkyfitness-db,a02c25033ce3,5308416,181006336,0,0,536870912,0
1790883289,sparkyfitness-server,d242936eb3a7,264396800,292880384,0,0,1073741824,0
1790883289,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883291,sparkyfitness-db,a02c25033ce3,5308416,181215232,0,0,536870912,0
1790883291,sparkyfitness-server,d242936eb3a7,264396800,292618240,0,0,1073741824,0
1790883292,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883294,sparkyfitness-db,a02c25033ce3,5308416,181215232,0,0,536870912,0
1790883294,sparkyfitness-server,d242936eb3a7,264400896,292626432,0,0,1073741824,0
1790883294,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883296,sparkyfitness-db,a02c25033ce3,5308416,181215232,0,0,536870912,0
1790883296,sparkyfitness-server,d242936eb3a7,264400896,292630528,0,0,1073741824,0
1790883296,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883298,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883298,sparkyfitness-server,d242936eb3a7,264404992,292888576,0,0,1073741824,0
1790883298,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883300,sparkyfitness-db,a02c25033ce3,5308416,181391360,0,0,536870912,0
1790883300,sparkyfitness-server,d242936eb3a7,264404992,292630528,0,0,1073741824,0
1790883300,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883302,sparkyfitness-db,a02c25033ce3,5308416,181211136,0,0,536870912,0
1790883302,sparkyfitness-server,d242936eb3a7,264409088,292634624,0,0,1073741824,0
1790883302,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883304,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883304,sparkyfitness-server,d242936eb3a7,264413184,292896768,0,0,1073741824,0
1790883305,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883307,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883307,sparkyfitness-server,d242936eb3a7,264413184,292896768,0,0,1073741824,0
1790883307,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883309,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883309,sparkyfitness-server,d242936eb3a7,264417280,293163008,0,0,1073741824,0
1790883309,sparkyfitness,fa7ab69c7918,5296128,6770688,0,0,268435456,0
1790883311,sparkyfitness-db,a02c25033ce3,5308416,181211136,0,0,536870912,0
1790883311,sparkyfitness-server,d242936eb3a7,264425472,292921344,0,0,1073741824,0
1790883311,sparkyfitness,fa7ab69c7918,5341184,7438336,0,0,268435456,0
1790883313,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883313,sparkyfitness-server,d242936eb3a7,264429568,293433344,0,0,1073741824,0
1790883313,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883315,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883315,sparkyfitness-server,d242936eb3a7,264429568,292921344,0,0,1073741824,0
1790883315,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883317,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883317,sparkyfitness-server,d242936eb3a7,264433664,292917248,0,0,1073741824,0
1790883318,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883320,sparkyfitness-db,a02c25033ce3,5308416,181207040,0,0,536870912,0
1790883320,sparkyfitness-server,d242936eb3a7,264433664,292655104,0,0,1073741824,0
1790883320,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883322,sparkyfitness-db,a02c25033ce3,5308416,181473280,0,0,536870912,0
1790883322,sparkyfitness-server,d242936eb3a7,264437760,292921344,0,0,1073741824,0
1790883322,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883324,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883324,sparkyfitness-server,d242936eb3a7,264441856,293179392,0,0,1073741824,0
1790883324,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883326,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883326,sparkyfitness-server,d242936eb3a7,264441856,293187584,0,0,1073741824,0
1790883326,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883328,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883328,sparkyfitness-server,d242936eb3a7,264445952,292929536,0,0,1073741824,0
1790883328,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883330,sparkyfitness-db,a02c25033ce3,5308416,181510144,0,0,536870912,0
1790883330,sparkyfitness-server,d242936eb3a7,264445952,292929536,0,0,1073741824,0
1790883330,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883333,sparkyfitness-db,a02c25033ce3,5308416,181379072,0,0,536870912,0
1790883333,sparkyfitness-server,d242936eb3a7,264450048,292675584,0,0,1073741824,0
1790883333,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883335,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883335,sparkyfitness-server,d242936eb3a7,264450048,292679680,0,0,1073741824,0
1790883335,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883337,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883337,sparkyfitness-server,d242936eb3a7,264454144,292675584,0,0,1073741824,0
1790883337,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883339,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883339,sparkyfitness-server,d242936eb3a7,264458240,292941824,0,0,1073741824,0
1790883339,sparkyfitness,fa7ab69c7918,5341184,6815744,0,0,268435456,0
1790883341,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883341,sparkyfitness-server,d242936eb3a7,264499200,292986880,0,0,1073741824,0
1790883341,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883343,sparkyfitness-db,a02c25033ce3,5308416,181374976,0,0,536870912,0
1790883343,sparkyfitness-server,d242936eb3a7,264499200,292982784,0,0,1073741824,0
1790883343,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883346,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883346,sparkyfitness-server,d242936eb3a7,264503296,292728832,0,0,1073741824,0
1790883346,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883348,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883348,sparkyfitness-server,d242936eb3a7,264503296,292720640,0,0,1073741824,0
1790883348,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883350,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883350,sparkyfitness-server,d242936eb3a7,262643712,290828288,0,0,1073741824,0
1790883350,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883352,sparkyfitness-db,a02c25033ce3,5308416,181551104,0,0,536870912,0
1790883352,sparkyfitness-server,d242936eb3a7,255213568,283484160,0,0,1073741824,0
1790883352,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883354,sparkyfitness-db,a02c25033ce3,5308416,181358592,0,0,536870912,0
1790883354,sparkyfitness-server,d242936eb3a7,255225856,283435008,0,0,1073741824,0
1790883354,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883356,sparkyfitness-db,a02c25033ce3,5308416,181358592,0,0,536870912,0
1790883356,sparkyfitness-server,d242936eb3a7,255234048,283443200,0,0,1073741824,0
1790883356,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883358,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883359,sparkyfitness-server,d242936eb3a7,255483904,283947008,0,0,1073741824,0
1790883359,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883361,sparkyfitness-db,a02c25033ce3,5308416,181903360,0,0,536870912,0
1790883361,sparkyfitness-server,d242936eb3a7,255225856,283176960,0,0,1073741824,0
1790883361,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883363,sparkyfitness-db,a02c25033ce3,5308416,181452800,0,0,536870912,0
1790883363,sparkyfitness-server,d242936eb3a7,255234048,283185152,0,0,1073741824,0
1790883363,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883365,sparkyfitness-db,a02c25033ce3,5308416,181358592,0,0,536870912,0
1790883365,sparkyfitness-server,d242936eb3a7,255242240,283459584,0,0,1073741824,0
1790883365,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883367,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883367,sparkyfitness-server,d242936eb3a7,255250432,283205632,0,0,1073741824,0
1790883367,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883369,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883369,sparkyfitness-server,d242936eb3a7,255258624,283217920,0,0,1073741824,0
1790883369,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883372,sparkyfitness-db,a02c25033ce3,5308416,181448704,0,0,536870912,0
1790883372,sparkyfitness-server,d242936eb3a7,255393792,283348992,0,0,1073741824,0
1790883372,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883374,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883374,sparkyfitness-server,d242936eb3a7,255397888,283619328,0,0,1073741824,0
1790883374,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883376,sparkyfitness-db,a02c25033ce3,5308416,181354496,0,0,536870912,0
1790883376,sparkyfitness-server,d242936eb3a7,255406080,283369472,0,0,1073741824,0
1790883376,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883378,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883378,sparkyfitness-server,d242936eb3a7,255426560,283639808,0,0,1073741824,0
1790883378,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883380,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883380,sparkyfitness-server,d242936eb3a7,254459904,282673152,0,0,1073741824,0
1790883380,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883382,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883382,sparkyfitness-server,d242936eb3a7,254464000,282685440,0,0,1073741824,0
1790883382,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883385,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883385,sparkyfitness-server,d242936eb3a7,254476288,282693632,0,0,1073741824,0
1790883385,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883387,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883387,sparkyfitness-server,d242936eb3a7,254484480,282701824,0,0,1073741824,0
1790883387,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883389,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883389,sparkyfitness-server,d242936eb3a7,254509056,282460160,0,0,1073741824,0
1790883389,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883391,sparkyfitness-db,a02c25033ce3,5308416,181526528,0,0,536870912,0
1790883391,sparkyfitness-server,d242936eb3a7,254517248,282734592,0,0,1073741824,0
1790883391,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883393,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883393,sparkyfitness-server,d242936eb3a7,254533632,282738688,0,0,1073741824,0
1790883393,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883395,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883395,sparkyfitness-server,d242936eb3a7,254545920,282497024,0,0,1073741824,0
1790883395,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883398,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883398,sparkyfitness-server,d242936eb3a7,254554112,282509312,0,0,1073741824,0
1790883398,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883400,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883400,sparkyfitness-server,d242936eb3a7,254566400,282513408,0,0,1073741824,0
1790883400,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883402,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883402,sparkyfitness-server,d242936eb3a7,254701568,282652672,0,0,1073741824,0
1790883402,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883404,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883404,sparkyfitness-server,d242936eb3a7,254722048,282935296,0,0,1073741824,0
1790883404,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883406,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883406,sparkyfitness-server,d242936eb3a7,254730240,282951680,0,0,1073741824,0
1790883406,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883408,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883408,sparkyfitness-server,d242936eb3a7,254742528,282697728,0,0,1073741824,0
1790883408,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883411,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883411,sparkyfitness-server,d242936eb3a7,254754816,282968064,0,0,1073741824,0
1790883411,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883413,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883413,sparkyfitness-server,d242936eb3a7,254758912,282714112,0,0,1073741824,0
1790883413,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883415,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883415,sparkyfitness-server,d242936eb3a7,254771200,283246592,0,0,1073741824,0
1790883415,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883417,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883417,sparkyfitness-server,d242936eb3a7,254779392,283009024,0,0,1073741824,0
1790883417,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883419,sparkyfitness-db,a02c25033ce3,5308416,181284864,0,0,536870912,0
1790883419,sparkyfitness-server,d242936eb3a7,254791680,283013120,0,0,1073741824,0
1790883419,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883421,sparkyfitness-db,a02c25033ce3,5369856,181366784,0,0,536870912,0
1790883421,sparkyfitness-server,d242936eb3a7,254799872,282763264,0,0,1073741824,0
1790883421,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883423,sparkyfitness-db,a02c25033ce3,5431296,181723136,0,0,536870912,0
1790883424,sparkyfitness-server,d242936eb3a7,254812160,282775552,0,0,1073741824,0
1790883424,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883426,sparkyfitness-db,a02c25033ce3,5431296,181723136,0,0,536870912,0
1790883426,sparkyfitness-server,d242936eb3a7,254824448,283045888,0,0,1073741824,0
1790883426,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883428,sparkyfitness-db,a02c25033ce3,5431296,181727232,0,0,536870912,0
1790883428,sparkyfitness-server,d242936eb3a7,254853120,283066368,0,0,1073741824,0
1790883428,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883430,sparkyfitness-db,a02c25033ce3,5431296,181727232,0,0,536870912,0
1790883430,sparkyfitness-server,d242936eb3a7,254865408,282824704,0,0,1073741824,0
1790883430,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883432,sparkyfitness-db,a02c25033ce3,5431296,181469184,0,0,536870912,0
1790883432,sparkyfitness-server,d242936eb3a7,254918656,283136000,0,0,1073741824,0
1790883432,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883434,sparkyfitness-db,a02c25033ce3,5431296,181997568,0,0,536870912,0
1790883434,sparkyfitness-server,d242936eb3a7,254926848,282894336,0,0,1073741824,0
1790883434,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883436,sparkyfitness-db,a02c25033ce3,5431296,181997568,0,0,536870912,0
1790883437,sparkyfitness-server,d242936eb3a7,254943232,283156480,0,0,1073741824,0
1790883437,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883439,sparkyfitness-db,a02c25033ce3,5431296,181743616,0,0,536870912,0
1790883439,sparkyfitness-server,d242936eb3a7,254955520,282820608,0,0,1073741824,0
1790883439,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883441,sparkyfitness-db,a02c25033ce3,5431296,181485568,0,0,536870912,0
1790883441,sparkyfitness-server,d242936eb3a7,254963712,283078656,0,0,1073741824,0
1790883441,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883443,sparkyfitness-db,a02c25033ce3,5431296,182333440,0,0,536870912,0
1790883443,sparkyfitness-server,d242936eb3a7,254976000,282836992,0,0,1073741824,0
1790883443,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883445,sparkyfitness-db,a02c25033ce3,5431296,182595584,0,0,536870912,0
1790883445,sparkyfitness-server,d242936eb3a7,254988288,283115520,0,0,1073741824,0
1790883445,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883447,sparkyfitness-db,a02c25033ce3,5435392,182599680,0,0,536870912,0
1790883447,sparkyfitness-server,d242936eb3a7,254996480,283123712,0,0,1073741824,0
1790883447,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883449,sparkyfitness-db,a02c25033ce3,5435392,182349824,0,0,536870912,0
1790883450,sparkyfitness-server,d242936eb3a7,255008768,282873856,0,0,1073741824,0
1790883450,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883452,sparkyfitness-db,a02c25033ce3,5435392,182714368,0,0,536870912,0
1790883452,sparkyfitness-server,d242936eb3a7,255016960,282886144,0,0,1073741824,0
1790883452,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883454,sparkyfitness-db,a02c25033ce3,5435392,182628352,0,0,536870912,0
1790883454,sparkyfitness-server,d242936eb3a7,255033344,282902528,0,0,1073741824,0
1790883454,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883456,sparkyfitness-db,a02c25033ce3,5435392,182366208,0,0,536870912,0
1790883456,sparkyfitness-server,d242936eb3a7,255041536,282914816,0,0,1073741824,0
1790883456,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883458,sparkyfitness-db,a02c25033ce3,5435392,182370304,0,0,536870912,0
1790883458,sparkyfitness-server,d242936eb3a7,255057920,283193344,0,0,1073741824,0
1790883458,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883460,sparkyfitness-db,a02c25033ce3,5435392,182632448,0,0,536870912,0
1790883460,sparkyfitness-server,d242936eb3a7,255066112,282939392,0,0,1073741824,0
1790883460,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883462,sparkyfitness-db,a02c25033ce3,5435392,182370304,0,0,536870912,0
1790883463,sparkyfitness-server,d242936eb3a7,255131648,283009024,0,0,1073741824,0
1790883463,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883465,sparkyfitness-db,a02c25033ce3,5435392,182894592,0,0,536870912,0
1790883465,sparkyfitness-server,d242936eb3a7,255143936,283529216,0,0,1073741824,0
1790883465,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883467,sparkyfitness-db,a02c25033ce3,5447680,182386688,0,0,536870912,0
1790883467,sparkyfitness-server,d242936eb3a7,255152128,283029504,0,0,1073741824,0
1790883467,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883469,sparkyfitness-db,a02c25033ce3,5447680,182386688,0,0,536870912,0
1790883469,sparkyfitness-server,d242936eb3a7,255172608,283291648,0,0,1073741824,0
1790883469,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883471,sparkyfitness-db,a02c25033ce3,5451776,182595584,0,0,536870912,0
1790883471,sparkyfitness-server,d242936eb3a7,255188992,283566080,0,0,1073741824,0
1790883471,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883473,sparkyfitness-db,a02c25033ce3,5451776,182755328,0,0,536870912,0
1790883473,sparkyfitness-server,d242936eb3a7,255197184,283578368,0,0,1073741824,0
1790883473,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883475,sparkyfitness-db,a02c25033ce3,5451776,182665216,0,0,536870912,0
1790883475,sparkyfitness-server,d242936eb3a7,255205376,284110848,0,0,1073741824,0
1790883476,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883478,sparkyfitness-db,a02c25033ce3,5451776,182665216,0,0,536870912,0
1790883478,sparkyfitness-server,d242936eb3a7,255221760,283340800,0,0,1073741824,0
1790883478,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883480,sparkyfitness-db,a02c25033ce3,5451776,182407168,0,0,536870912,0
1790883480,sparkyfitness-server,d242936eb3a7,255234048,283099136,0,0,1073741824,0
1790883480,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883482,sparkyfitness-db,a02c25033ce3,5451776,182636544,0,0,536870912,0
1790883482,sparkyfitness-server,d242936eb3a7,255242240,283107328,0,0,1073741824,0
1790883482,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883484,sparkyfitness-db,a02c25033ce3,5451776,182935552,0,0,536870912,0
1790883484,sparkyfitness-server,d242936eb3a7,255254528,283639808,0,0,1073741824,0
1790883484,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883486,sparkyfitness-db,a02c25033ce3,5455872,183197696,0,0,536870912,0
1790883486,sparkyfitness-server,d242936eb3a7,255262720,283906048,0,0,1073741824,0
1790883486,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883488,sparkyfitness-db,a02c25033ce3,5455872,182947840,0,0,536870912,0
1790883488,sparkyfitness-server,d242936eb3a7,255275008,283144192,0,0,1073741824,0
1790883489,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883491,sparkyfitness-db,a02c25033ce3,5455872,182435840,0,0,536870912,0
1790883491,sparkyfitness-server,d242936eb3a7,255283200,283152384,0,0,1073741824,0
1790883491,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883493,sparkyfitness-db,a02c25033ce3,5550080,182427648,0,0,536870912,0
1790883493,sparkyfitness-server,d242936eb3a7,255332352,283197440,0,0,1073741824,0
1790883493,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883495,sparkyfitness-db,a02c25033ce3,5550080,182427648,0,0,536870912,0
1790883495,sparkyfitness-server,d242936eb3a7,255344640,283471872,0,0,1073741824,0
1790883495,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883497,sparkyfitness-db,a02c25033ce3,5550080,182427648,0,0,536870912,0
1790883497,sparkyfitness-server,d242936eb3a7,255352832,283738112,0,0,1073741824,0
1790883497,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1790883499,sparkyfitness-db,a02c25033ce3,5550080,182427648,0,0,536870912,0
1790883499,sparkyfitness-server,d242936eb3a7,255365120,284049408,0,0,1073741824,0
1790883499,sparkyfitness,fa7ab69c7918,5386240,6864896,0,0,268435456,0
1 epoch name id anon current swap oom_kill limit restarts
2 1790883119 sparkyfitness-db a02c25033ce3 6344704 49041408 0 0 536870912 0
3 1790883121 sparkyfitness-db a02c25033ce3 5169152 119238656 0 0 536870912 0
4 1790883123 sparkyfitness-db a02c25033ce3 5169152 118706176 0 0 536870912 0
5 1790883125 sparkyfitness-db a02c25033ce3 5169152 118710272 0 0 536870912 0
6 1790883127 sparkyfitness-db a02c25033ce3 5169152 118710272 0 0 536870912 0
7 1790883130 sparkyfitness-db a02c25033ce3 5218304 119824384 0 0 536870912 0
8 1790883130 sparkyfitness-server d242936eb3a7 31965184 36077568 0 0 1073741824 0
9 1790883132 sparkyfitness-db a02c25033ce3 5218304 119824384 0 0 536870912 0
10 1790883132 sparkyfitness-server d242936eb3a7 124657664 133730304 0 0 1073741824 0
11 1790883134 sparkyfitness-db a02c25033ce3 5218304 119824384 0 0 536870912 0
12 1790883134 sparkyfitness-server d242936eb3a7 168407040 182247424 0 0 1073741824 0
13 1790883136 sparkyfitness-db a02c25033ce3 5230592 119836672 0 0 536870912 0
14 1790883136 sparkyfitness-server d242936eb3a7 167100416 182276096 0 0 1073741824 0
15 1790883138 sparkyfitness-db a02c25033ce3 5230592 119836672 0 0 536870912 0
16 1790883138 sparkyfitness-server d242936eb3a7 248242176 270376960 0 0 1073741824 0
17 1790883140 sparkyfitness-db a02c25033ce3 8830976 129462272 0 0 536870912 0
18 1790883140 sparkyfitness-server d242936eb3a7 343142400 370241536 0 0 1073741824 0
19 1790883142 sparkyfitness-db a02c25033ce3 14315520 182599680 0 0 536870912 0
20 1790883142 sparkyfitness-server d242936eb3a7 342450176 375562240 0 0 1073741824 0
21 1790883145 sparkyfitness-db a02c25033ce3 14589952 183816192 0 0 536870912 0
22 1790883145 sparkyfitness-server d242936eb3a7 350523392 381837312 0 0 1073741824 0
23 1790883147 sparkyfitness-db a02c25033ce3 14589952 183558144 0 0 536870912 0
24 1790883147 sparkyfitness-server d242936eb3a7 350523392 381771776 0 0 1073741824 0
25 1790883149 sparkyfitness-db a02c25033ce3 14589952 183558144 0 0 536870912 0
26 1790883149 sparkyfitness-server d242936eb3a7 350531584 381775872 0 0 1073741824 0
27 1790883151 sparkyfitness-db a02c25033ce3 14598144 184635392 0 0 536870912 0
28 1790883151 sparkyfitness-server d242936eb3a7 350531584 381779968 0 0 1073741824 0
29 1790883153 sparkyfitness-db a02c25033ce3 14598144 184053760 0 0 536870912 0
30 1790883153 sparkyfitness-server d242936eb3a7 350531584 381521920 0 0 1073741824 0
31 1790883155 sparkyfitness-db a02c25033ce3 14598144 184053760 0 0 536870912 0
32 1790883155 sparkyfitness-server d242936eb3a7 350593024 381526016 0 0 1073741824 0
33 1790883157 sparkyfitness-db a02c25033ce3 14598144 184053760 0 0 536870912 0
34 1790883157 sparkyfitness-server d242936eb3a7 350539776 382050304 0 0 1073741824 0
35 1790883159 sparkyfitness-db a02c25033ce3 14598144 184254464 0 0 536870912 0
36 1790883160 sparkyfitness-server d242936eb3a7 355352576 387665920 0 0 1073741824 0
37 1790883162 sparkyfitness-db a02c25033ce3 14598144 184254464 0 0 536870912 0
38 1790883162 sparkyfitness-server d242936eb3a7 350773248 381771776 0 0 1073741824 0
39 1790883162 sparkyfitness fa7ab69c7918 5115904 6574080 0 0 268435456 0
40 1790883164 sparkyfitness-db a02c25033ce3 14598144 184254464 0 0 536870912 0
41 1790883164 sparkyfitness-server d242936eb3a7 350777344 381775872 0 0 1073741824 0
42 1790883164 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
43 1790883166 sparkyfitness-db a02c25033ce3 14598144 184516608 0 0 536870912 0
44 1790883166 sparkyfitness-server d242936eb3a7 350785536 382038016 0 0 1073741824 0
45 1790883166 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
46 1790883168 sparkyfitness-db a02c25033ce3 14598144 184254464 0 0 536870912 0
47 1790883168 sparkyfitness-server d242936eb3a7 350785536 382042112 0 0 1073741824 0
48 1790883168 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
49 1790883170 sparkyfitness-db a02c25033ce3 14598144 184254464 0 0 536870912 0
50 1790883170 sparkyfitness-server d242936eb3a7 350789632 381779968 0 0 1073741824 0
51 1790883170 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
52 1790883172 sparkyfitness-db a02c25033ce3 14606336 187039744 0 0 536870912 0
53 1790883172 sparkyfitness-server d242936eb3a7 350810112 382291968 0 0 1073741824 0
54 1790883172 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
55 1790883175 sparkyfitness-db a02c25033ce3 5283840 179376128 0 0 536870912 0
56 1790883175 sparkyfitness-server d242936eb3a7 350892032 382394368 0 0 1073741824 0
57 1790883175 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
58 1790883177 sparkyfitness-db a02c25033ce3 5283840 179376128 0 0 536870912 0
59 1790883177 sparkyfitness-server d242936eb3a7 350892032 381878272 0 0 1073741824 0
60 1790883177 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
61 1790883179 sparkyfitness-db a02c25033ce3 5283840 179372032 0 0 536870912 0
62 1790883179 sparkyfitness-server d242936eb3a7 350900224 382140416 0 0 1073741824 0
63 1790883179 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
64 1790883181 sparkyfitness-db a02c25033ce3 5283840 179580928 0 0 536870912 0
65 1790883181 sparkyfitness-server d242936eb3a7 350908416 382660608 0 0 1073741824 0
66 1790883181 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
67 1790883183 sparkyfitness-db a02c25033ce3 5283840 179834880 0 0 536870912 0
68 1790883183 sparkyfitness-server d242936eb3a7 350908416 382148608 0 0 1073741824 0
69 1790883183 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
70 1790883185 sparkyfitness-db a02c25033ce3 5283840 179691520 0 0 536870912 0
71 1790883185 sparkyfitness-server d242936eb3a7 350912512 382148608 0 0 1073741824 0
72 1790883185 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
73 1790883188 sparkyfitness-db a02c25033ce3 5283840 179691520 0 0 536870912 0
74 1790883188 sparkyfitness-server d242936eb3a7 350916608 381894656 0 0 1073741824 0
75 1790883188 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
76 1790883190 sparkyfitness-db a02c25033ce3 5287936 179703808 0 0 536870912 0
77 1790883190 sparkyfitness-server d242936eb3a7 351002624 382926848 0 0 1073741824 0
78 1790883190 sparkyfitness fa7ab69c7918 5115904 6569984 0 0 268435456 0
79 1790883192 sparkyfitness-db a02c25033ce3 5308416 180719616 0 0 536870912 0
80 1790883192 sparkyfitness-server d242936eb3a7 351092736 382595072 0 0 1073741824 0
81 1790883192 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
82 1790883194 sparkyfitness-db a02c25033ce3 5308416 180719616 0 0 536870912 0
83 1790883194 sparkyfitness-server d242936eb3a7 351092736 382074880 0 0 1073741824 0
84 1790883194 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
85 1790883196 sparkyfitness-db a02c25033ce3 5308416 180719616 0 0 536870912 0
86 1790883196 sparkyfitness-server d242936eb3a7 351096832 382599168 0 0 1073741824 0
87 1790883196 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
88 1790883198 sparkyfitness-db a02c25033ce3 5308416 180719616 0 0 536870912 0
89 1790883198 sparkyfitness-server d242936eb3a7 351096832 382341120 0 0 1073741824 0
90 1790883198 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
91 1790883200 sparkyfitness-db a02c25033ce3 5308416 180723712 0 0 536870912 0
92 1790883201 sparkyfitness-server d242936eb3a7 351100928 382341120 0 0 1073741824 0
93 1790883201 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
94 1790883203 sparkyfitness-db a02c25033ce3 5308416 180723712 0 0 536870912 0
95 1790883203 sparkyfitness-server d242936eb3a7 351105024 382537728 0 0 1073741824 0
96 1790883203 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
97 1790883205 sparkyfitness-db a02c25033ce3 5308416 180781056 0 0 536870912 0
98 1790883205 sparkyfitness-server d242936eb3a7 351039488 382279680 0 0 1073741824 0
99 1790883205 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
100 1790883207 sparkyfitness-db a02c25033ce3 5308416 180781056 0 0 536870912 0
101 1790883207 sparkyfitness-server d242936eb3a7 351039488 382287872 0 0 1073741824 0
102 1790883207 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
103 1790883209 sparkyfitness-db a02c25033ce3 5308416 180781056 0 0 536870912 0
104 1790883209 sparkyfitness-server d242936eb3a7 351047680 382287872 0 0 1073741824 0
105 1790883209 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
106 1790883211 sparkyfitness-db a02c25033ce3 5308416 180633600 0 0 536870912 0
107 1790883211 sparkyfitness-server d242936eb3a7 351051776 382283776 0 0 1073741824 0
108 1790883211 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
109 1790883213 sparkyfitness-db a02c25033ce3 5308416 180633600 0 0 536870912 0
110 1790883214 sparkyfitness-server d242936eb3a7 351051776 382029824 0 0 1073741824 0
111 1790883214 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
112 1790883216 sparkyfitness-db a02c25033ce3 5308416 180629504 0 0 536870912 0
113 1790883216 sparkyfitness-server d242936eb3a7 351055872 382033920 0 0 1073741824 0
114 1790883216 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
115 1790883218 sparkyfitness-db a02c25033ce3 5308416 180629504 0 0 536870912 0
116 1790883218 sparkyfitness-server d242936eb3a7 351059968 382365696 0 0 1073741824 0
117 1790883218 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
118 1790883220 sparkyfitness-db a02c25033ce3 5308416 180842496 0 0 536870912 0
119 1790883220 sparkyfitness-server d242936eb3a7 350973952 382717952 0 0 1073741824 0
120 1790883220 sparkyfitness fa7ab69c7918 5160960 6631424 0 0 268435456 0
121 1790883222 sparkyfitness-db a02c25033ce3 5308416 180830208 0 0 536870912 0
122 1790883222 sparkyfitness-server d242936eb3a7 350973952 381972480 0 0 1073741824 0
123 1790883222 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
124 1790883224 sparkyfitness-db a02c25033ce3 5308416 181092352 0 0 536870912 0
125 1790883224 sparkyfitness-server d242936eb3a7 350973952 382238720 0 0 1073741824 0
126 1790883224 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
127 1790883226 sparkyfitness-db a02c25033ce3 5308416 180830208 0 0 536870912 0
128 1790883227 sparkyfitness-server d242936eb3a7 350973952 382230528 0 0 1073741824 0
129 1790883227 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
130 1790883229 sparkyfitness-db a02c25033ce3 5308416 180830208 0 0 536870912 0
131 1790883229 sparkyfitness-server d242936eb3a7 350973952 382234624 0 0 1073741824 0
132 1790883229 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
133 1790883231 sparkyfitness-db a02c25033ce3 5308416 181604352 0 0 536870912 0
134 1790883231 sparkyfitness-server d242936eb3a7 350973952 381972480 0 0 1073741824 0
135 1790883231 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
136 1790883233 sparkyfitness-db a02c25033ce3 5308416 180883456 0 0 536870912 0
137 1790883233 sparkyfitness-server d242936eb3a7 350973952 382754816 0 0 1073741824 0
138 1790883233 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
139 1790883235 sparkyfitness-db a02c25033ce3 5308416 180879360 0 0 536870912 0
140 1790883235 sparkyfitness-server d242936eb3a7 350973952 382234624 0 0 1073741824 0
141 1790883235 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
142 1790883237 sparkyfitness-db a02c25033ce3 5308416 180879360 0 0 536870912 0
143 1790883237 sparkyfitness-server d242936eb3a7 350973952 381972480 0 0 1073741824 0
144 1790883237 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
145 1790883239 sparkyfitness-db a02c25033ce3 5308416 180879360 0 0 536870912 0
146 1790883239 sparkyfitness-server d242936eb3a7 350973952 382230528 0 0 1073741824 0
147 1790883240 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
148 1790883242 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
149 1790883242 sparkyfitness-server d242936eb3a7 350978048 381972480 0 0 1073741824 0
150 1790883242 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
151 1790883244 sparkyfitness-db a02c25033ce3 5308416 181080064 0 0 536870912 0
152 1790883244 sparkyfitness-server d242936eb3a7 315281408 345255936 0 0 1073741824 0
153 1790883244 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
154 1790883246 sparkyfitness-db a02c25033ce3 5308416 181080064 0 0 536870912 0
155 1790883246 sparkyfitness-server d242936eb3a7 265515008 294002688 0 0 1073741824 0
156 1790883246 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
157 1790883248 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
158 1790883248 sparkyfitness-server d242936eb3a7 265621504 294326272 0 0 1073741824 0
159 1790883248 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
160 1790883250 sparkyfitness-db a02c25033ce3 5308416 181002240 0 0 536870912 0
161 1790883250 sparkyfitness-server d242936eb3a7 265822208 294289408 0 0 1073741824 0
162 1790883250 sparkyfitness fa7ab69c7918 5206016 6676480 0 0 268435456 0
163 1790883252 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
164 1790883252 sparkyfitness-server d242936eb3a7 266002432 293814272 0 0 1073741824 0
165 1790883253 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
166 1790883255 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
167 1790883255 sparkyfitness-server d242936eb3a7 265592832 294862848 0 0 1073741824 0
168 1790883255 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
169 1790883257 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
170 1790883257 sparkyfitness-server d242936eb3a7 265592832 294014976 0 0 1073741824 0
171 1790883257 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
172 1790883259 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
173 1790883259 sparkyfitness-server d242936eb3a7 264359936 292581376 0 0 1073741824 0
174 1790883259 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
175 1790883261 sparkyfitness-db a02c25033ce3 5308416 181112832 0 0 536870912 0
176 1790883261 sparkyfitness-server d242936eb3a7 264359936 292581376 0 0 1073741824 0
177 1790883261 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
178 1790883263 sparkyfitness-db a02c25033ce3 5308416 180985856 0 0 536870912 0
179 1790883263 sparkyfitness-server d242936eb3a7 264359936 292843520 0 0 1073741824 0
180 1790883263 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
181 1790883265 sparkyfitness-db a02c25033ce3 5308416 180985856 0 0 536870912 0
182 1790883265 sparkyfitness-server d242936eb3a7 264359936 292585472 0 0 1073741824 0
183 1790883266 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
184 1790883268 sparkyfitness-db a02c25033ce3 5308416 180977664 0 0 536870912 0
185 1790883268 sparkyfitness-server d242936eb3a7 264359936 292839424 0 0 1073741824 0
186 1790883268 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
187 1790883270 sparkyfitness-db a02c25033ce3 5308416 181399552 0 0 536870912 0
188 1790883270 sparkyfitness-server d242936eb3a7 264359936 292585472 0 0 1073741824 0
189 1790883270 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
190 1790883272 sparkyfitness-db a02c25033ce3 5308416 181010432 0 0 536870912 0
191 1790883272 sparkyfitness-server d242936eb3a7 264364032 293105664 0 0 1073741824 0
192 1790883272 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
193 1790883274 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
194 1790883274 sparkyfitness-server d242936eb3a7 264364032 293109760 0 0 1073741824 0
195 1790883274 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
196 1790883276 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
197 1790883276 sparkyfitness-server d242936eb3a7 264368128 292589568 0 0 1073741824 0
198 1790883276 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
199 1790883278 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
200 1790883279 sparkyfitness-server d242936eb3a7 264368128 292597760 0 0 1073741824 0
201 1790883279 sparkyfitness fa7ab69c7918 5251072 6725632 0 0 268435456 0
202 1790883281 sparkyfitness-db a02c25033ce3 5308416 181112832 0 0 536870912 0
203 1790883281 sparkyfitness-server d242936eb3a7 264384512 292827136 0 0 1073741824 0
204 1790883281 sparkyfitness fa7ab69c7918 5296128 7405568 0 0 268435456 0
205 1790883283 sparkyfitness-db a02c25033ce3 5308416 181010432 0 0 536870912 0
206 1790883283 sparkyfitness-server d242936eb3a7 264388608 292614144 0 0 1073741824 0
207 1790883283 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
208 1790883285 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
209 1790883285 sparkyfitness-server d242936eb3a7 264388608 293134336 0 0 1073741824 0
210 1790883285 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
211 1790883287 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
212 1790883287 sparkyfitness-server d242936eb3a7 264392704 292880384 0 0 1073741824 0
213 1790883287 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
214 1790883289 sparkyfitness-db a02c25033ce3 5308416 181006336 0 0 536870912 0
215 1790883289 sparkyfitness-server d242936eb3a7 264396800 292880384 0 0 1073741824 0
216 1790883289 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
217 1790883291 sparkyfitness-db a02c25033ce3 5308416 181215232 0 0 536870912 0
218 1790883291 sparkyfitness-server d242936eb3a7 264396800 292618240 0 0 1073741824 0
219 1790883292 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
220 1790883294 sparkyfitness-db a02c25033ce3 5308416 181215232 0 0 536870912 0
221 1790883294 sparkyfitness-server d242936eb3a7 264400896 292626432 0 0 1073741824 0
222 1790883294 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
223 1790883296 sparkyfitness-db a02c25033ce3 5308416 181215232 0 0 536870912 0
224 1790883296 sparkyfitness-server d242936eb3a7 264400896 292630528 0 0 1073741824 0
225 1790883296 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
226 1790883298 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
227 1790883298 sparkyfitness-server d242936eb3a7 264404992 292888576 0 0 1073741824 0
228 1790883298 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
229 1790883300 sparkyfitness-db a02c25033ce3 5308416 181391360 0 0 536870912 0
230 1790883300 sparkyfitness-server d242936eb3a7 264404992 292630528 0 0 1073741824 0
231 1790883300 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
232 1790883302 sparkyfitness-db a02c25033ce3 5308416 181211136 0 0 536870912 0
233 1790883302 sparkyfitness-server d242936eb3a7 264409088 292634624 0 0 1073741824 0
234 1790883302 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
235 1790883304 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
236 1790883304 sparkyfitness-server d242936eb3a7 264413184 292896768 0 0 1073741824 0
237 1790883305 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
238 1790883307 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
239 1790883307 sparkyfitness-server d242936eb3a7 264413184 292896768 0 0 1073741824 0
240 1790883307 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
241 1790883309 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
242 1790883309 sparkyfitness-server d242936eb3a7 264417280 293163008 0 0 1073741824 0
243 1790883309 sparkyfitness fa7ab69c7918 5296128 6770688 0 0 268435456 0
244 1790883311 sparkyfitness-db a02c25033ce3 5308416 181211136 0 0 536870912 0
245 1790883311 sparkyfitness-server d242936eb3a7 264425472 292921344 0 0 1073741824 0
246 1790883311 sparkyfitness fa7ab69c7918 5341184 7438336 0 0 268435456 0
247 1790883313 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
248 1790883313 sparkyfitness-server d242936eb3a7 264429568 293433344 0 0 1073741824 0
249 1790883313 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
250 1790883315 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
251 1790883315 sparkyfitness-server d242936eb3a7 264429568 292921344 0 0 1073741824 0
252 1790883315 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
253 1790883317 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
254 1790883317 sparkyfitness-server d242936eb3a7 264433664 292917248 0 0 1073741824 0
255 1790883318 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
256 1790883320 sparkyfitness-db a02c25033ce3 5308416 181207040 0 0 536870912 0
257 1790883320 sparkyfitness-server d242936eb3a7 264433664 292655104 0 0 1073741824 0
258 1790883320 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
259 1790883322 sparkyfitness-db a02c25033ce3 5308416 181473280 0 0 536870912 0
260 1790883322 sparkyfitness-server d242936eb3a7 264437760 292921344 0 0 1073741824 0
261 1790883322 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
262 1790883324 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
263 1790883324 sparkyfitness-server d242936eb3a7 264441856 293179392 0 0 1073741824 0
264 1790883324 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
265 1790883326 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
266 1790883326 sparkyfitness-server d242936eb3a7 264441856 293187584 0 0 1073741824 0
267 1790883326 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
268 1790883328 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
269 1790883328 sparkyfitness-server d242936eb3a7 264445952 292929536 0 0 1073741824 0
270 1790883328 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
271 1790883330 sparkyfitness-db a02c25033ce3 5308416 181510144 0 0 536870912 0
272 1790883330 sparkyfitness-server d242936eb3a7 264445952 292929536 0 0 1073741824 0
273 1790883330 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
274 1790883333 sparkyfitness-db a02c25033ce3 5308416 181379072 0 0 536870912 0
275 1790883333 sparkyfitness-server d242936eb3a7 264450048 292675584 0 0 1073741824 0
276 1790883333 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
277 1790883335 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
278 1790883335 sparkyfitness-server d242936eb3a7 264450048 292679680 0 0 1073741824 0
279 1790883335 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
280 1790883337 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
281 1790883337 sparkyfitness-server d242936eb3a7 264454144 292675584 0 0 1073741824 0
282 1790883337 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
283 1790883339 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
284 1790883339 sparkyfitness-server d242936eb3a7 264458240 292941824 0 0 1073741824 0
285 1790883339 sparkyfitness fa7ab69c7918 5341184 6815744 0 0 268435456 0
286 1790883341 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
287 1790883341 sparkyfitness-server d242936eb3a7 264499200 292986880 0 0 1073741824 0
288 1790883341 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
289 1790883343 sparkyfitness-db a02c25033ce3 5308416 181374976 0 0 536870912 0
290 1790883343 sparkyfitness-server d242936eb3a7 264499200 292982784 0 0 1073741824 0
291 1790883343 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
292 1790883346 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
293 1790883346 sparkyfitness-server d242936eb3a7 264503296 292728832 0 0 1073741824 0
294 1790883346 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
295 1790883348 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
296 1790883348 sparkyfitness-server d242936eb3a7 264503296 292720640 0 0 1073741824 0
297 1790883348 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
298 1790883350 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
299 1790883350 sparkyfitness-server d242936eb3a7 262643712 290828288 0 0 1073741824 0
300 1790883350 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
301 1790883352 sparkyfitness-db a02c25033ce3 5308416 181551104 0 0 536870912 0
302 1790883352 sparkyfitness-server d242936eb3a7 255213568 283484160 0 0 1073741824 0
303 1790883352 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
304 1790883354 sparkyfitness-db a02c25033ce3 5308416 181358592 0 0 536870912 0
305 1790883354 sparkyfitness-server d242936eb3a7 255225856 283435008 0 0 1073741824 0
306 1790883354 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
307 1790883356 sparkyfitness-db a02c25033ce3 5308416 181358592 0 0 536870912 0
308 1790883356 sparkyfitness-server d242936eb3a7 255234048 283443200 0 0 1073741824 0
309 1790883356 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
310 1790883358 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
311 1790883359 sparkyfitness-server d242936eb3a7 255483904 283947008 0 0 1073741824 0
312 1790883359 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
313 1790883361 sparkyfitness-db a02c25033ce3 5308416 181903360 0 0 536870912 0
314 1790883361 sparkyfitness-server d242936eb3a7 255225856 283176960 0 0 1073741824 0
315 1790883361 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
316 1790883363 sparkyfitness-db a02c25033ce3 5308416 181452800 0 0 536870912 0
317 1790883363 sparkyfitness-server d242936eb3a7 255234048 283185152 0 0 1073741824 0
318 1790883363 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
319 1790883365 sparkyfitness-db a02c25033ce3 5308416 181358592 0 0 536870912 0
320 1790883365 sparkyfitness-server d242936eb3a7 255242240 283459584 0 0 1073741824 0
321 1790883365 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
322 1790883367 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
323 1790883367 sparkyfitness-server d242936eb3a7 255250432 283205632 0 0 1073741824 0
324 1790883367 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
325 1790883369 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
326 1790883369 sparkyfitness-server d242936eb3a7 255258624 283217920 0 0 1073741824 0
327 1790883369 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
328 1790883372 sparkyfitness-db a02c25033ce3 5308416 181448704 0 0 536870912 0
329 1790883372 sparkyfitness-server d242936eb3a7 255393792 283348992 0 0 1073741824 0
330 1790883372 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
331 1790883374 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
332 1790883374 sparkyfitness-server d242936eb3a7 255397888 283619328 0 0 1073741824 0
333 1790883374 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
334 1790883376 sparkyfitness-db a02c25033ce3 5308416 181354496 0 0 536870912 0
335 1790883376 sparkyfitness-server d242936eb3a7 255406080 283369472 0 0 1073741824 0
336 1790883376 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
337 1790883378 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
338 1790883378 sparkyfitness-server d242936eb3a7 255426560 283639808 0 0 1073741824 0
339 1790883378 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
340 1790883380 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
341 1790883380 sparkyfitness-server d242936eb3a7 254459904 282673152 0 0 1073741824 0
342 1790883380 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
343 1790883382 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
344 1790883382 sparkyfitness-server d242936eb3a7 254464000 282685440 0 0 1073741824 0
345 1790883382 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
346 1790883385 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
347 1790883385 sparkyfitness-server d242936eb3a7 254476288 282693632 0 0 1073741824 0
348 1790883385 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
349 1790883387 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
350 1790883387 sparkyfitness-server d242936eb3a7 254484480 282701824 0 0 1073741824 0
351 1790883387 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
352 1790883389 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
353 1790883389 sparkyfitness-server d242936eb3a7 254509056 282460160 0 0 1073741824 0
354 1790883389 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
355 1790883391 sparkyfitness-db a02c25033ce3 5308416 181526528 0 0 536870912 0
356 1790883391 sparkyfitness-server d242936eb3a7 254517248 282734592 0 0 1073741824 0
357 1790883391 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
358 1790883393 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
359 1790883393 sparkyfitness-server d242936eb3a7 254533632 282738688 0 0 1073741824 0
360 1790883393 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
361 1790883395 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
362 1790883395 sparkyfitness-server d242936eb3a7 254545920 282497024 0 0 1073741824 0
363 1790883395 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
364 1790883398 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
365 1790883398 sparkyfitness-server d242936eb3a7 254554112 282509312 0 0 1073741824 0
366 1790883398 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
367 1790883400 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
368 1790883400 sparkyfitness-server d242936eb3a7 254566400 282513408 0 0 1073741824 0
369 1790883400 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
370 1790883402 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
371 1790883402 sparkyfitness-server d242936eb3a7 254701568 282652672 0 0 1073741824 0
372 1790883402 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
373 1790883404 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
374 1790883404 sparkyfitness-server d242936eb3a7 254722048 282935296 0 0 1073741824 0
375 1790883404 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
376 1790883406 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
377 1790883406 sparkyfitness-server d242936eb3a7 254730240 282951680 0 0 1073741824 0
378 1790883406 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
379 1790883408 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
380 1790883408 sparkyfitness-server d242936eb3a7 254742528 282697728 0 0 1073741824 0
381 1790883408 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
382 1790883411 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
383 1790883411 sparkyfitness-server d242936eb3a7 254754816 282968064 0 0 1073741824 0
384 1790883411 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
385 1790883413 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
386 1790883413 sparkyfitness-server d242936eb3a7 254758912 282714112 0 0 1073741824 0
387 1790883413 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
388 1790883415 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
389 1790883415 sparkyfitness-server d242936eb3a7 254771200 283246592 0 0 1073741824 0
390 1790883415 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
391 1790883417 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
392 1790883417 sparkyfitness-server d242936eb3a7 254779392 283009024 0 0 1073741824 0
393 1790883417 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
394 1790883419 sparkyfitness-db a02c25033ce3 5308416 181284864 0 0 536870912 0
395 1790883419 sparkyfitness-server d242936eb3a7 254791680 283013120 0 0 1073741824 0
396 1790883419 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
397 1790883421 sparkyfitness-db a02c25033ce3 5369856 181366784 0 0 536870912 0
398 1790883421 sparkyfitness-server d242936eb3a7 254799872 282763264 0 0 1073741824 0
399 1790883421 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
400 1790883423 sparkyfitness-db a02c25033ce3 5431296 181723136 0 0 536870912 0
401 1790883424 sparkyfitness-server d242936eb3a7 254812160 282775552 0 0 1073741824 0
402 1790883424 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
403 1790883426 sparkyfitness-db a02c25033ce3 5431296 181723136 0 0 536870912 0
404 1790883426 sparkyfitness-server d242936eb3a7 254824448 283045888 0 0 1073741824 0
405 1790883426 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
406 1790883428 sparkyfitness-db a02c25033ce3 5431296 181727232 0 0 536870912 0
407 1790883428 sparkyfitness-server d242936eb3a7 254853120 283066368 0 0 1073741824 0
408 1790883428 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
409 1790883430 sparkyfitness-db a02c25033ce3 5431296 181727232 0 0 536870912 0
410 1790883430 sparkyfitness-server d242936eb3a7 254865408 282824704 0 0 1073741824 0
411 1790883430 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
412 1790883432 sparkyfitness-db a02c25033ce3 5431296 181469184 0 0 536870912 0
413 1790883432 sparkyfitness-server d242936eb3a7 254918656 283136000 0 0 1073741824 0
414 1790883432 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
415 1790883434 sparkyfitness-db a02c25033ce3 5431296 181997568 0 0 536870912 0
416 1790883434 sparkyfitness-server d242936eb3a7 254926848 282894336 0 0 1073741824 0
417 1790883434 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
418 1790883436 sparkyfitness-db a02c25033ce3 5431296 181997568 0 0 536870912 0
419 1790883437 sparkyfitness-server d242936eb3a7 254943232 283156480 0 0 1073741824 0
420 1790883437 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
421 1790883439 sparkyfitness-db a02c25033ce3 5431296 181743616 0 0 536870912 0
422 1790883439 sparkyfitness-server d242936eb3a7 254955520 282820608 0 0 1073741824 0
423 1790883439 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
424 1790883441 sparkyfitness-db a02c25033ce3 5431296 181485568 0 0 536870912 0
425 1790883441 sparkyfitness-server d242936eb3a7 254963712 283078656 0 0 1073741824 0
426 1790883441 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
427 1790883443 sparkyfitness-db a02c25033ce3 5431296 182333440 0 0 536870912 0
428 1790883443 sparkyfitness-server d242936eb3a7 254976000 282836992 0 0 1073741824 0
429 1790883443 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
430 1790883445 sparkyfitness-db a02c25033ce3 5431296 182595584 0 0 536870912 0
431 1790883445 sparkyfitness-server d242936eb3a7 254988288 283115520 0 0 1073741824 0
432 1790883445 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
433 1790883447 sparkyfitness-db a02c25033ce3 5435392 182599680 0 0 536870912 0
434 1790883447 sparkyfitness-server d242936eb3a7 254996480 283123712 0 0 1073741824 0
435 1790883447 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
436 1790883449 sparkyfitness-db a02c25033ce3 5435392 182349824 0 0 536870912 0
437 1790883450 sparkyfitness-server d242936eb3a7 255008768 282873856 0 0 1073741824 0
438 1790883450 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
439 1790883452 sparkyfitness-db a02c25033ce3 5435392 182714368 0 0 536870912 0
440 1790883452 sparkyfitness-server d242936eb3a7 255016960 282886144 0 0 1073741824 0
441 1790883452 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
442 1790883454 sparkyfitness-db a02c25033ce3 5435392 182628352 0 0 536870912 0
443 1790883454 sparkyfitness-server d242936eb3a7 255033344 282902528 0 0 1073741824 0
444 1790883454 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
445 1790883456 sparkyfitness-db a02c25033ce3 5435392 182366208 0 0 536870912 0
446 1790883456 sparkyfitness-server d242936eb3a7 255041536 282914816 0 0 1073741824 0
447 1790883456 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
448 1790883458 sparkyfitness-db a02c25033ce3 5435392 182370304 0 0 536870912 0
449 1790883458 sparkyfitness-server d242936eb3a7 255057920 283193344 0 0 1073741824 0
450 1790883458 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
451 1790883460 sparkyfitness-db a02c25033ce3 5435392 182632448 0 0 536870912 0
452 1790883460 sparkyfitness-server d242936eb3a7 255066112 282939392 0 0 1073741824 0
453 1790883460 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
454 1790883462 sparkyfitness-db a02c25033ce3 5435392 182370304 0 0 536870912 0
455 1790883463 sparkyfitness-server d242936eb3a7 255131648 283009024 0 0 1073741824 0
456 1790883463 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
457 1790883465 sparkyfitness-db a02c25033ce3 5435392 182894592 0 0 536870912 0
458 1790883465 sparkyfitness-server d242936eb3a7 255143936 283529216 0 0 1073741824 0
459 1790883465 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
460 1790883467 sparkyfitness-db a02c25033ce3 5447680 182386688 0 0 536870912 0
461 1790883467 sparkyfitness-server d242936eb3a7 255152128 283029504 0 0 1073741824 0
462 1790883467 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
463 1790883469 sparkyfitness-db a02c25033ce3 5447680 182386688 0 0 536870912 0
464 1790883469 sparkyfitness-server d242936eb3a7 255172608 283291648 0 0 1073741824 0
465 1790883469 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
466 1790883471 sparkyfitness-db a02c25033ce3 5451776 182595584 0 0 536870912 0
467 1790883471 sparkyfitness-server d242936eb3a7 255188992 283566080 0 0 1073741824 0
468 1790883471 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
469 1790883473 sparkyfitness-db a02c25033ce3 5451776 182755328 0 0 536870912 0
470 1790883473 sparkyfitness-server d242936eb3a7 255197184 283578368 0 0 1073741824 0
471 1790883473 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
472 1790883475 sparkyfitness-db a02c25033ce3 5451776 182665216 0 0 536870912 0
473 1790883475 sparkyfitness-server d242936eb3a7 255205376 284110848 0 0 1073741824 0
474 1790883476 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
475 1790883478 sparkyfitness-db a02c25033ce3 5451776 182665216 0 0 536870912 0
476 1790883478 sparkyfitness-server d242936eb3a7 255221760 283340800 0 0 1073741824 0
477 1790883478 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
478 1790883480 sparkyfitness-db a02c25033ce3 5451776 182407168 0 0 536870912 0
479 1790883480 sparkyfitness-server d242936eb3a7 255234048 283099136 0 0 1073741824 0
480 1790883480 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
481 1790883482 sparkyfitness-db a02c25033ce3 5451776 182636544 0 0 536870912 0
482 1790883482 sparkyfitness-server d242936eb3a7 255242240 283107328 0 0 1073741824 0
483 1790883482 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
484 1790883484 sparkyfitness-db a02c25033ce3 5451776 182935552 0 0 536870912 0
485 1790883484 sparkyfitness-server d242936eb3a7 255254528 283639808 0 0 1073741824 0
486 1790883484 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
487 1790883486 sparkyfitness-db a02c25033ce3 5455872 183197696 0 0 536870912 0
488 1790883486 sparkyfitness-server d242936eb3a7 255262720 283906048 0 0 1073741824 0
489 1790883486 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
490 1790883488 sparkyfitness-db a02c25033ce3 5455872 182947840 0 0 536870912 0
491 1790883488 sparkyfitness-server d242936eb3a7 255275008 283144192 0 0 1073741824 0
492 1790883489 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
493 1790883491 sparkyfitness-db a02c25033ce3 5455872 182435840 0 0 536870912 0
494 1790883491 sparkyfitness-server d242936eb3a7 255283200 283152384 0 0 1073741824 0
495 1790883491 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
496 1790883493 sparkyfitness-db a02c25033ce3 5550080 182427648 0 0 536870912 0
497 1790883493 sparkyfitness-server d242936eb3a7 255332352 283197440 0 0 1073741824 0
498 1790883493 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
499 1790883495 sparkyfitness-db a02c25033ce3 5550080 182427648 0 0 536870912 0
500 1790883495 sparkyfitness-server d242936eb3a7 255344640 283471872 0 0 1073741824 0
501 1790883495 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
502 1790883497 sparkyfitness-db a02c25033ce3 5550080 182427648 0 0 536870912 0
503 1790883497 sparkyfitness-server d242936eb3a7 255352832 283738112 0 0 1073741824 0
504 1790883497 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
505 1790883499 sparkyfitness-db a02c25033ce3 5550080 182427648 0 0 536870912 0
506 1790883499 sparkyfitness-server d242936eb3a7 255365120 284049408 0 0 1073741824 0
507 1790883499 sparkyfitness fa7ab69c7918 5386240 6864896 0 0 268435456 0
@@ -0,0 +1,4 @@
5.1 from birth at the pin (postgres:18-alpine + v0.17.3 x2), bench 9401 swap 0, 2 s cgroup sampler started before up -d; idle 300 s after healthy
sparkyfitness-db a02c25033ce3 19:31:59-19:38:19 n= 177 peak anon 13.9 MiB = 2.7 % of 512 MiB; peak current 178.4 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness-server d242936eb3a7 19:32:10-19:38:19 n= 172 peak anon 338.9 MiB = 33.1 % of 1024 MiB; peak current 369.7 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness fa7ab69c7918 19:32:42-19:38:19 n= 157 peak anon 5.1 MiB = 2.0 % of 256 MiB; peak current 7.1 MiB; oom_kill 0; restarts 0; swap.current ['0']
@@ -0,0 +1,147 @@
[19:40:25] scratch drive folders cleared before FROM (R-656): none existed
[19:40:25] MV-sparkyfitness: deploying sparkyfitness at FROM {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.2', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.2'}
[19:41:39] FROM settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[19:41:39] fixture: the BOX walk's own (Sparkyfitness), through upgrade_boxport
[19:41:39] sparkyfitness: sign-up http=200
[19:41:39] sparkyfitness: check-in http=200
[19:41:39] sparkyfitness: seeded user drillc52c98 with a weight of 78.96 on 2026-09-01
[19:41:40] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:41:40] C1 (seed reads back BEFORE): True
[19:41:40] MV-sparkyfitness: swapping to TO {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'}
[19:42:12] TO up -d rc=0
[19:42:43] TO settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[19:42:44] engine state sparkyfitness-db: 18
[19:42:44] migration lines observed: 6
[19:42:44] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:42:44] RESULT (seed reads back AFTER): True
[19:42:45] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80
[19:43:00] + 15s sparkyfitness=8M/256M peak=8M kills=0 rs=0 sparkyfitness-db=159M/512M peak=163M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=387M kills=0 rs=0 reqs=304
[19:43:15] + 30s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=160M/512M peak=163M kills=0 rs=0 sparkyfitness-server=415M/1024M peak=426M kills=0 rs=0 reqs=604
[19:43:30] + 46s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=159M/512M peak=163M kills=0 rs=0 sparkyfitness-server=415M/1024M peak=426M kills=0 rs=0 reqs=904
[19:43:45] + 61s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=164M/512M peak=166M kills=0 rs=0 sparkyfitness-server=387M/1024M peak=426M kills=0 rs=0 reqs=1208
[19:44:00] + 76s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=182M/512M peak=185M kills=0 rs=0 sparkyfitness-server=384M/1024M peak=426M kills=0 rs=0 reqs=1508
[19:44:16] + 91s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=206M/512M peak=207M kills=0 rs=0 sparkyfitness-server=388M/1024M peak=426M kills=0 rs=0 reqs=1812
[19:44:31] + 106s sparkyfitness=8M/256M peak=10M kills=0 rs=0 sparkyfitness-db=227M/512M peak=231M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=2112
[19:44:46] + 121s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=232M/512M peak=236M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=2412
[19:45:01] + 136s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=214M/512M peak=236M kills=0 rs=0 sparkyfitness-server=390M/1024M peak=426M kills=0 rs=0 reqs=2716
[19:45:16] + 152s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=216M/512M peak=236M kills=0 rs=0 sparkyfitness-server=391M/1024M peak=426M kills=0 rs=0 reqs=3016
[19:45:31] + 167s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=219M/512M peak=236M kills=0 rs=0 sparkyfitness-server=387M/1024M peak=426M kills=0 rs=0 reqs=3320
[19:45:47] + 182s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=235M/512M peak=238M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=3620
[19:46:02] + 197s sparkyfitness=8M/256M peak=11M kills=0 rs=0 sparkyfitness-db=234M/512M peak=238M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=3920
[19:46:17] + 212s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=220M/512M peak=243M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=4224
[19:46:32] + 227s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=226M/512M peak=243M kills=0 rs=0 sparkyfitness-server=403M/1024M peak=426M kills=0 rs=0 reqs=4524
[19:46:47] + 243s sparkyfitness=8M/256M peak=11M kills=0 rs=0 sparkyfitness-db=240M/512M peak=243M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=4827
[19:47:02] + 258s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=242M/512M peak=246M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=5128
[19:47:18] + 273s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=250M/512M peak=255M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=5429
[19:47:33] + 288s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=249M/512M peak=258M kills=0 rs=0 sparkyfitness-server=393M/1024M peak=426M kills=0 rs=0 reqs=5732
[19:47:48] + 303s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=247M/512M peak=258M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=6036
[19:48:03] + 319s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=241M/512M peak=258M kills=0 rs=0 sparkyfitness-server=400M/1024M peak=426M kills=0 rs=0 reqs=6336
[19:48:18] + 334s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=340M/512M peak=349M kills=0 rs=0 sparkyfitness-server=401M/1024M peak=426M kills=0 rs=0 reqs=6640
[19:48:34] + 349s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=326M/512M peak=349M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=6941
[19:48:49] + 364s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=348M/512M peak=352M kills=0 rs=0 sparkyfitness-server=398M/1024M peak=426M kills=0 rs=0 reqs=7244
[19:49:04] + 380s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=348M/512M peak=354M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=7546
[19:49:19] + 395s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=349M/512M peak=358M kills=0 rs=0 sparkyfitness-server=402M/1024M peak=426M kills=0 rs=0 reqs=7848
[19:49:35] + 410s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=356M/512M peak=359M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=8154
[19:49:50] + 425s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=358M/512M peak=363M kills=0 rs=0 sparkyfitness-server=400M/1024M peak=426M kills=0 rs=0 reqs=8454
[19:50:05] + 440s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=354M/512M peak=363M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=8756
[19:50:20] + 456s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=359M/512M peak=364M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=9058
[19:50:36] + 471s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=385M/512M peak=391M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=9360
[19:50:51] + 486s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=404M/512M peak=412M kills=0 rs=0 sparkyfitness-server=411M/1024M peak=426M kills=0 rs=0 reqs=9660
[19:51:06] + 501s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=351M/512M peak=412M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=9964
[19:51:21] + 516s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=351M/512M peak=412M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=10267
[19:51:36] + 532s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=334M/512M peak=412M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=10568
[19:51:52] + 547s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=344M/512M peak=412M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=10870
[19:52:07] + 562s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=339M/512M peak=412M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=11172
[19:52:22] + 577s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=162M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=11472
[19:52:37] + 592s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=161M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=11774
[19:52:52] + 608s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=133M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=12076
[19:52:53] memory watch: killed=False tight=[] requests=12076 codes={'200': 12076}
[19:52:53] MV-sparkyfitness: ABORT — putting the FROM images back
[19:53:57] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:53:57] ABORT: app came back in 31.3s; data present=True
{
"harness_version": 4,
"edge": "MV-sparkyfitness",
"app": "sparkyfitness",
"note": "night 2026-09-23 within-a-major move: sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3",
"from": {
"sparkyfitness-db": "postgres:18-alpine",
"sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.2",
"sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.2"
},
"to": {
"sparkyfitness-db": "postgres:18-alpine",
"sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3",
"sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ksparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": {
"sparkyfitness-db": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
},
"memory": {
"soak_s": 607.9,
"requested_s": 600,
"requests": 12076,
"codes": {
"200": 12076
},
"first_kill": null,
"containers": {
"sparkyfitness": {
"limit": 268435456,
"peak": 13131776,
"peak_pct": 0.049,
"anon_peak_sampled": 6139904,
"anon_peak_pct": 0.023,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"sparkyfitness-db": {
"limit": 536870912,
"peak": 432951296,
"peak_pct": 0.806,
"anon_peak_sampled": 283111424,
"anon_peak_pct": 0.527,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"sparkyfitness-server": {
"limit": 1073741824,
"peak": 447664128,
"peak_pct": 0.417,
"anon_peak_sampled": 404697088,
"anon_peak_pct": 0.377,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 31.1,
"measured_at": "2026-10-01T19:53:57Z",
"evidence": "evidence/MV-sparkyfitness",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"total_s": 811.7
}
@@ -0,0 +1,20 @@
{
"sparkyfitness": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"sparkyfitness-db": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"sparkyfitness-server": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,23 @@
sign-up 200
sign-in 200 cookie True
+ 30s {"create_food": {"201": 378}, "search": {"200": 376}, "add_entry": {"201": 376}, "read_day": {"200": 376}, "export_csv": {"200": 36}}
+ 60s {"create_food": {"201": 709}, "search": {"200": 709}, "add_entry": {"201": 709}, "read_day": {"200": 709}, "export_csv": {"200": 68}}
+ 90s {"create_food": {"201": 1004}, "search": {"200": 1004}, "add_entry": {"201": 1004}, "read_day": {"200": 1003}, "export_csv": {"200": 99}}
+ 120s {"create_food": {"201": 1264}, "search": {"200": 1264}, "add_entry": {"201": 1264}, "read_day": {"200": 1262}, "export_csv": {"200": 124}}
+ 150s {"create_food": {"201": 1509}, "search": {"200": 1509}, "add_entry": {"201": 1509}, "read_day": {"200": 1508}, "export_csv": {"200": 148}}
+ 180s {"create_food": {"201": 1731}, "search": {"200": 1731}, "add_entry": {"201": 1730}, "read_day": {"200": 1729}, "export_csv": {"200": 172}}
+ 210s {"create_food": {"201": 1938}, "search": {"200": 1937}, "add_entry": {"201": 1937}, "read_day": {"200": 1935}, "export_csv": {"200": 192}}
+ 240s {"create_food": {"201": 2128}, "search": {"200": 2126}, "add_entry": {"201": 2126}, "read_day": {"200": 2125}, "export_csv": {"200": 212}}
+ 270s {"create_food": {"201": 2312}, "search": {"200": 2311}, "add_entry": {"201": 2311}, "read_day": {"200": 2309}, "export_csv": {"200": 228}}
+ 300s {"create_food": {"201": 2482}, "search": {"200": 2481}, "add_entry": {"201": 2481}, "read_day": {"200": 2481}, "export_csv": {"200": 247}}
+ 330s {"create_food": {"201": 2616}, "search": {"200": 2614}, "add_entry": {"201": 2614}, "read_day": {"200": 2614}, "export_csv": {"200": 260}}
+ 360s {"create_food": {"201": 2723}, "search": {"200": 2722}, "add_entry": {"201": 2722}, "read_day": {"200": 2720}, "export_csv": {"200": 270}}
+ 390s {"create_food": {"201": 2825}, "search": {"200": 2823}, "add_entry": {"201": 2823}, "read_day": {"200": 2821}, "export_csv": {"200": 280}}
+ 420s {"create_food": {"201": 2905}, "search": {"200": 2903}, "add_entry": {"201": 2903}, "read_day": {"200": 2902}, "export_csv": {"200": 288}}
+ 450s {"create_food": {"201": 2999}, "search": {"200": 2998}, "add_entry": {"201": 2998}, "read_day": {"200": 2997}, "export_csv": {"200": 296}}
+ 480s {"create_food": {"201": 3088}, "search": {"200": 3086}, "add_entry": {"201": 3086}, "read_day": {"200": 3086}, "export_csv": {"200": 307}}
+ 510s {"create_food": {"201": 3178}, "search": {"200": 3174}, "add_entry": {"201": 3174}, "read_day": {"200": 3174}, "export_csv": {"200": 316}}
+ 540s {"create_food": {"201": 3269}, "search": {"200": 3267}, "add_entry": {"201": 3267}, "read_day": {"200": 3266}, "export_csv": {"200": 325}}
+ 570s {"create_food": {"201": 3269}, "search": {"200": 3269}, "add_entry": {"201": 3269}, "read_day": {"200": 3269}, "export_csv": {"200": 326}}
diary entries for today at the end: 3269 http 200
FINAL {"create_food": {"201": 3269}, "search": {"200": 3269}, "add_entry": {"201": 3269}, "read_day": {"200": 3269}, "export_csv": {"200": 326}}
@@ -0,0 +1,63 @@
"""burst.py — checklist 5.2's "heaviest ordinary act" for SparkyFitness on the bench: a household logging its
food diary at once. One account signed up through the app's own better-auth route (sign-up is open on the bench,
as on a box before the first admin), then WORKERS callers for DUR seconds, each looping: create a custom food
(+ its default variant), search foods by name, add it to today's diary at a meal, read the day's diary back, and
every 10th turn export the whole diary as CSV. Everything goes through the frontend (nginx :80 -> server), the path
traefik uses. Prints counts and status codes only — never the password or the cookie."""
import json, os, random, secrets, subprocess, threading, time, urllib.request, urllib.error, re, http.cookiejar
DUR = int(os.environ.get("DUR", "540")); WORKERS = int(os.environ.get("WORKERS", "4")); PAUSE = float(os.environ.get("PAUSE", "0.2"))
ip = subprocess.run(["docker", "inspect", "-f", "{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}", "sparkyfitness"],
capture_output=True, text=True).stdout.split()[0]
HOST = "sparky.gate.invalid"; BASE = f"http://{ip}:80"
def req(method, path, body=None, cookie=None, raw=False):
h = {"Host": HOST, "Origin": f"https://{HOST}", "X-Forwarded-Proto": "https", "Content-Type": "application/json"}
if cookie: h["Cookie"] = cookie
r = urllib.request.Request(BASE + path, data=json.dumps(body).encode() if body is not None else None, headers=h, method=method)
try:
with urllib.request.urlopen(r, timeout=60) as resp:
data = resp.read(); return resp.status, data if raw else (json.loads(data) if data[:1] in (b"{", b"[") else data), resp.headers
except urllib.error.HTTPError as e:
return e.code, e.read()[:300], e.headers
except Exception as e:
return "err", str(e)[:200], {}
email = "burst" + secrets.token_hex(3) + "@gate.invalid"; pw = "Burst-" + secrets.token_hex(10)
c, b, _ = req("POST", "/api/auth/sign-up/email", {"email": email, "password": pw, "name": "Burst"})
print("sign-up", c, flush=True)
c, b, hd = req("POST", "/api/auth/sign-in/email", {"email": email, "password": pw})
ck = "; ".join(x.split(";")[0] for x in (hd.get_all("Set-Cookie") or [])) if hd else ""
print("sign-in", c, "cookie", bool(ck), flush=True)
if c != 200 or not ck: raise SystemExit(2)
stats = {}; lock = threading.Lock(); stop = time.time() + DUR; today = time.strftime("%Y-%m-%d")
def count(k, code):
with lock: stats.setdefault(k, {}); stats[k][str(code)] = stats[k].get(str(code), 0) + 1
WORDS = ["alma", "korte", "kenyer", "tejfol", "csirke", "rizs", "paprika", "turo", "zab", "bab", "lencse", "sajt"]
def worker(i):
n = 0
while time.time() < stop:
n += 1; w = random.choice(WORDS)
c, food, _ = req("POST", "/api/foods", {"name": f"{w} {i}-{n}", "brand": "bench", "is_custom": True, "serving_size": 100,
"serving_unit": "g", "calories": random.randint(20, 600), "protein": 5, "carbs": 20, "fat": 3}, ck)
count("create_food", c)
c, res, _ = req("GET", f"/api/foods/search?name={w}&broadMatch=true&checkCustom=true", None, ck); count("search", c)
fid = food.get("id") if isinstance(food, dict) else None
vid = (food.get("default_variant") or {}).get("id") if isinstance(food, dict) else None
if fid and not vid:
c2, vs, _ = req("GET", f"/api/foods/food-variants?food_id={fid}", None, ck)
if isinstance(vs, list) and vs: vid = vs[0].get("id")
if fid:
c, e, _ = req("POST", "/api/food-entries", {"food_id": fid, "variant_id": vid, "meal_type": random.choice(["breakfast", "lunch", "dinner", "snacks"]),
"quantity": random.randint(50, 300), "unit": "g", "entry_date": today}, ck)
count("add_entry", c)
if c not in (200, 201) and stats["add_entry"].get(str(c), 0) <= 2: print("add_entry", c, e if isinstance(e, bytes) else "", flush=True)
c, d, _ = req("GET", f"/api/food-entries/by-date/{today}", None, ck); count("read_day", c)
if n % 10 == 0:
c, d, _ = req("GET", "/api/food-entries/export/csv", None, ck, raw=True); count("export_csv", c)
time.sleep(PAUSE)
threads = [threading.Thread(target=worker, args=(i,), daemon=True) for i in range(WORKERS)]
t0 = time.time(); [t.start() for t in threads]
while any(t.is_alive() for t in threads):
time.sleep(30)
with lock: print(f"+{time.time()-t0:4.0f}s", json.dumps(stats), flush=True)
c, d, _ = req("GET", f"/api/food-entries/by-date/{today}", None, ck)
print("diary entries for today at the end:", len(d) if isinstance(d, list) else d, "http", c, flush=True)
print("FINAL", json.dumps(stats), flush=True)
@@ -0,0 +1,237 @@
sparkyfitness-db | The files belonging to this database system will be owned by user "postgres".
sparkyfitness-db | This user must also own the server process.
sparkyfitness-db |
sparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8".
sparkyfitness-db | The default database encoding has accordingly been set to "UTF8".
sparkyfitness-db | The default text search configuration will be set to "english".
sparkyfitness-db |
sparkyfitness-db | Data page checksums are enabled.
sparkyfitness-db |
sparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok
sparkyfitness-db | creating subdirectories ... ok
sparkyfitness-db | selecting dynamic shared memory implementation ... posix
sparkyfitness-db | selecting default "max_connections" ... 100
sparkyfitness-db | selecting default "shared_buffers" ... 128MB
sparkyfitness-db | selecting default time zone ... Europe/Budapest
sparkyfitness-db | creating configuration files ... ok
sparkyfitness-db | running bootstrap script ... ok
sparkyfitness-db | sh: locale: not found
sparkyfitness-db | 2026-10-01 21:40:26.926 CEST [36] WARNING: no usable system locales were found
sparkyfitness-db | performing post-bootstrap initialization ... ok
sparkyfitness-db | syncing data to disk ... ok
sparkyfitness-db |
sparkyfitness-db |
sparkyfitness-db | Success. You can now start the database server using:
sparkyfitness-db |
sparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start
sparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections
sparkyfitness-db | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
sparkyfitness-db |
sparkyfitness-db | waiting for server to start....2026-10-01 21:40:27.841 CEST [42] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
sparkyfitness-db | 2026-10-01 21:40:27.848 CEST [42] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
sparkyfitness-db | 2026-10-01 21:40:27.861 CEST [48] LOG: database system was shut down at 2026-10-01 21:40:27 CEST
sparkyfitness-db | 2026-10-01 21:40:27.870 CEST [42] LOG: database system is ready to accept connections
sparkyfitness-db | done
sparkyfitness-db | server started
sparkyfitness-db | CREATE DATABASE
sparkyfitness-db |
sparkyfitness-db |
sparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
sparkyfitness-db |
sparkyfitness-db | waiting for server to shut down....2026-10-01 21:40:28.062 CEST [42] LOG: received fast shutdown request
sparkyfitness-db | 2026-10-01 21:40:28.074 CEST [42] LOG: aborting any active transactions
sparkyfitness-db | 2026-10-01 21:40:28.077 CEST [42] LOG: background worker "logical replication launcher" (PID 51) exited with exit code 1
sparkyfitness-db | 2026-10-01 21:40:28.078 CEST [46] LOG: shutting down
sparkyfitness-db | 2026-10-01 21:40:28.081 CEST [46] LOG: checkpoint starting: shutdown immediate
sparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚡️ secrets for agents: https://dotenvx.com/as2
sparkyfitness-server | [Secrets] Checking for secret files to load...
sparkyfitness-server | [Secrets] No secrets loaded from files.
sparkyfitness-server | [2026-10-01T19:52:55.763Z] [INFO] Environment variable pre-flight checks passed successfully.
sparkyfitness-server | Starting server...
sparkyfitness-server | [2026-10-01T19:53:06.129Z] [INFO] [withingsService] Withings data source configured to: withings
sparkyfitness-server | [2026-10-01T19:53:06.130Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit
sparkyfitness-server | [2026-10-01T19:53:06.131Z] [INFO] [googleHealthService] Google Health data source: googlehealth
sparkyfitness-server | [2026-10-01T19:53:06.132Z] [INFO] [polarService] Polar data source configured to: polar
sparkyfitness-server | [2026-10-01T19:53:06.133Z] [INFO] [stravaService] Strava data source configured to: strava
sparkyfitness-server | [2026-10-01T19:53:06.133Z] [INFO] [hevyService] Hevy data source configured to: hevy
sparkyfitness-server | [2026-10-01T19:53:06.971Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars
sparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid
sparkyfitness | Starting SparkyFitness Frontend as root with environment variables:
sparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server
sparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010
sparkyfitness | NGINX_RATE_LIMIT=5r/s
sparkyfitness | NGINX_LISTEN_PORT=80
sparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log
sparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log
sparkyfitness | NGINX_DUMP_CONFIG=false
sparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid
sparkyfitness | Generating nginx configuration from template...
sparkyfitness | Testing nginx configuration substitution...
sparkyfitness | Validating nginx configuration syntax...
sparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
sparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful
sparkyfitness | Configuration validated successfully. Starting nginx...
sparkyfitness | Backend will be proxied to: sparkyfitness-server:3010
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: using the "epoll" event method
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: nginx/1.29.3
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0)
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: OS: Linux 7.0.2-6-pve
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker processes
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 11
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 12
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 13
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 14
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 15
sparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks.
sparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 16
sparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads
sparkyfitness-server | [2026-10-01T19:53:07.152Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/
sparkyfitness-server | [2026-10-01T19:53:07.182Z] [INFO] Role "sparkyapp" already exists.
sparkyfitness-server | [2026-10-01T19:53:07.184Z] [INFO] Ensured schema_migrations table exists.
sparkyfitness-server | [2026-10-01T19:53:07.191Z] [INFO] Applied migrations: [
sparkyfitness-server | '20250703170640_InitialDB.sql',
sparkyfitness-server | '20250710062500_create_goal_presets_table.sql',
sparkyfitness-server | '20250711173824_meal_features.sql',
sparkyfitness-server | '20250712163617_refactor_data_providers_and_add_exercise_source_id.sql',
sparkyfitness-server | '20250713125323_create_oidc_settings_and_update_users_table.sql',
sparkyfitness-server | '20250713135900_add_role_to_users_table.sql',
sparkyfitness-server | '20250713142300_add_oidc_config_fields.sql',
sparkyfitness | 127.0.0.1 - - [01/Oct/2026:21:53:55 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget"
sparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:56 +0200] "GET / HTTP/1.1" 200 2666 "-" "curl/8.14.1"
sparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:57 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 401 85 "-" "curl/8.14.1"
sparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:57 +0200] "POST /api/auth/sign-in/email HTTP/1.1" 200 432 "-" "curl/8.14.1"
sparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:57 +0200] "GET /api/measurements/check-in/1999-01-01 HTTP/1.1" 200 2 "-" "curl/8.14.1"
sparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:57 +0200] "GET /api/measurements/check-in/2026-09-01 HTTP/1.1" 200 426 "-" "curl/8.14.1"
sparkyfitness-db | 2026-10-01 21:40:28.197 CEST [46] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.031 s, sync=0.072 s, total=0.119 s; sync files=303, longest=0.038 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8868, redo lsn=0/1BA8868
sparkyfitness-db | 2026-10-01 21:40:28.224 CEST [42] LOG: database system is shut down
sparkyfitness-db | done
sparkyfitness-db | server stopped
sparkyfitness-db |
sparkyfitness-db | PostgreSQL init process complete; ready for start up.
sparkyfitness-db |
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv6 address "::", port 5432
sparkyfitness-db | 2026-10-01 21:40:28.311 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
sparkyfitness-db | 2026-10-01 21:40:28.325 CEST [64] LOG: database system was shut down at 2026-10-01 21:40:28 CEST
sparkyfitness-db | 2026-10-01 21:40:28.332 CEST [1] LOG: database system is ready to accept connections
sparkyfitness-db | 2026-10-01 21:45:28.380 CEST [62] LOG: checkpoint starting: time
sparkyfitness-db | 2026-10-01 21:47:00.684 CEST [62] LOG: checkpoint complete: wrote 921 buffers (5.6%), wrote 6 SLRU buffers; 0 WAL file(s) added, 0 removed, 1 recycled; write=92.206 s, sync=0.073 s, total=92.305 s; sync files=654, longest=0.004 s, average=0.001 s; distance=9984 kB, estimate=9984 kB; lsn=0/26A9C28, redo lsn=0/2568AD0
sparkyfitness-db | 2026-10-01 21:50:28.783 CEST [62] LOG: checkpoint starting: time
sparkyfitness-db | 2026-10-01 21:50:53.006 CEST [62] LOG: checkpoint complete: wrote 241 buffers (1.5%), wrote 4 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=24.188 s, sync=0.016 s, total=24.223 s; sync files=23, longest=0.006 s, average=0.001 s; distance=2573 kB, estimate=9243 kB; lsn=0/285DD38, redo lsn=0/27EC1E0
sparkyfitness-server | '20250714000000_create_session_table.sql',
sparkyfitness-server | '20250714175824_add_api_key_tag_to_ai_service_settings.sql',
sparkyfitness-server | '20250717190700_add_cascading_deletes.sql',
sparkyfitness-server | '20250717233929_add_is_quick_food_to_foods.sql',
sparkyfitness-server | '20250718190226_add_food_display_limit_to_user_preferences.sql',
sparkyfitness-server | '20250719131500_add_meal_percentages.sql',
sparkyfitness-server | '20250719215400_add_login_management_to_oidc_settings.sql',
sparkyfitness-server | '20250720010000_create_user_nutrient_display_preferences.sql',
sparkyfitness-server | '20250720201800_rename_food_display_limit_to_item_display_limit.sql',
sparkyfitness-server | '20250720220000_add_water_tracking_features.sql',
sparkyfitness-server | '20250720233836_alter_water_goal_ml_to_numeric.sql',
sparkyfitness-server | '20250721000000_add_servings_per_container_to_water_containers.sql',
sparkyfitness-server | '20250721000000_alter_water_container_volume_to_numeric.sql',
sparkyfitness-server | '20250721014900_alter_water_ml_to_numeric.sql',
sparkyfitness-server | '20250819062400_add_mealie_provider_type.sql',
sparkyfitness-server | '20250819083500_add_base_url_to_external_data_providers.sql',
sparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
sparkyfitness-server | '20250821090000_update_external_data_providers_provider_type_check.sql',
sparkyfitness-server | '20250821091500_add_garth_token_dump_to_external_data_providers.sql',
sparkyfitness-server | '20250821102000_remove_redundant_token_fields_from_external_data_providers.sql',
sparkyfitness-server | '20250831063900_create_mood_entries_table.sql',
sparkyfitness-server | '20250927180257_alter_exercises_table.sql',
sparkyfitness-server | '20250927212000_add_free_exercise_db_to_provider_type_check.sql',
sparkyfitness-server | '20250930002100_add_sets_reps_weight_to_exercise_entries.sql',
sparkyfitness-server | '20251001232600_add_gender_to_users_table.sql',
sparkyfitness-server | '20251002182306_create_backup_settings_table.sql',
sparkyfitness-server | '20251002224500_add_password_reset_to_users_table.sql',
sparkyfitness-server | '20251006021609_add_glycemic_index_to_foods_and_food_variants.sql',
sparkyfitness-server | '20251006220500_create_admin_activity_logs_table.sql',
sparkyfitness-server | '20251008224256_add_workout_features.sql',
sparkyfitness-server | '20251012225400_add_primary_keys_to_workout_tables.sql',
sparkyfitness-server | '20251012225500_add_multiple_sets_to_presets.sql',
sparkyfitness-server | '20251012225900_add_multiple_sets_to_plans.sql',
sparkyfitness-server | '20251012230000_add_multiple_sets_to_exercise_entries.sql',
sparkyfitness-server | '20251015223200_convert_weights_to_kg_and_set_default.sql',
sparkyfitness-server | '202510170132_add_text_measurements.sql',
sparkyfitness-server | '20251017200900_add_multiple_oidc_providers.sql',
sparkyfitness-server | '20251017204200_create_global_settings.sql',
sparkyfitness-server | '20251018001151_add_bmr_and_bodyfat_preferences.sql',
sparkyfitness-server | '20251018223700_add_signing_alg_to_oidc_providers.sql',
sparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
sparkyfitness-server | '20251019013300_merged_rls_policies.sql',
sparkyfitness-server | '20251019154515_update_rls_policies_for_shared_items.sql',
sparkyfitness-server | '20251019203500_fix_rls_permissions_for_public_foods.sql',
sparkyfitness-server | '20251019204000_correct_variant_rls_policy.sql',
sparkyfitness-server | '20251019212500_update_measurement_rls_policies.sql',
sparkyfitness-server | '20251019222100_add_audit_columns_to_measurements.sql',
sparkyfitness-server | '20251020001000_fix_family_access_insert_policy.sql',
sparkyfitness-server | '20251020022000_set_default_shared_with_public.sql',
sparkyfitness-server | '20251020022200_update_rls_policies.sql',
sparkyfitness-server | '20251020022500_fix_food_select_policy.sql',
sparkyfitness-server | '20251020030000_simplify_food_select_policy.sql',
sparkyfitness-server | '20251020031000_update_food_select_policy_with_sharing.sql',
sparkyfitness-server | '20251020032200_add_all_owner_centric_policies.sql',
sparkyfitness-server | '20251020033400_add_food_variants_rls_policy.sql',
sparkyfitness-server | '20251020033700_fix_food_variants_rls_policy.sql',
sparkyfitness-server | '20251020230839_fix_family_access_rls_policies.sql',
sparkyfitness-server | '20251021025423_restrict_family_access_select_policy.sql',
sparkyfitness-server | '20251021034700_add_public_sharing_to_external_providers.sql',
sparkyfitness-server | '20251022201000_fix_exercise_rls_policy.sql',
sparkyfitness-server | '20251022203000_snapshot_exercise_details_in_entries.sql',
sparkyfitness-server | '20251023120500_update_external_providers_select_policy_for_public.sql',
sparkyfitness-server | '20251023221000_update_meals_rls_policy.sql',
sparkyfitness-server | '20251023221500_update_meal_plan_template_assignments_rls_policy.sql',
sparkyfitness-server | '20251023221501_add_meal_id_to_food_entries.sql',
sparkyfitness-server | '20251024230330_add_withings_fields_to_external_data_providers.sql',
sparkyfitness-server | '20251025210900_add_source_to_custom_measurements.sql',
sparkyfitness-server | '20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql',
sparkyfitness-server | '202510310132_add_language_to_user_preferences.sql',
sparkyfitness-server | '20251101151100_create_sleep_entries_table.sql',
sparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
sparkyfitness-server | '20251112000000_add_display_name_to_custom_categories.sql',
sparkyfitness-server | '20251114205134_create_exercise_preset_entries_table.sql',
sparkyfitness-server | '20251115003147_add_source_to_exercise_preset_entries.sql',
sparkyfitness-server | '20251115003301_add_exercise_preset_entry_id_to_activity_details.sql',
sparkyfitness-server | '20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql',
sparkyfitness-server | '20251120011100_add_mfa_magic_link_columns.sql',
sparkyfitness-server | '20251121011500_add_email_mfa_columns_to_users.sql',
sparkyfitness-server | '202511220110_add_default_external_data_providers.sql',
sparkyfitness-server | '202511232110_delete_raw_stress_data_categories.sql',
sparkyfitness-server | '202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql',
sparkyfitness-server | '20251127194107_create_food_entry_meals_and_link_food_entries.sql',
sparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
sparkyfitness-server | '20251128030115_add_tandoor_provider_type.sql',
sparkyfitness-server | '20251205000000_add_energy_unit_to_user_preferences.sql',
sparkyfitness-server | '20251206000000_add_nutrient_calculation_algorithms.sql',
sparkyfitness-server | '20251206000001_add_serving_size_to_meals.sql',
sparkyfitness-server | '20251207000001_add_default_meal_quantity.sql',
sparkyfitness-server | '20251215005329_add_usda_to_provider_type_check.sql',
sparkyfitness-server | '20251221000000_create_fasting_logs.sql',
sparkyfitness-server | '20251221010000_drop_mood_weight_from_fasting_logs.sql',
sparkyfitness-server | '20251226150700_add_mobile_health_data_features.sql',
sparkyfitness-server | '20251228000000_add_custom_nutrients_tables.sql',
sparkyfitness-server | ... 84 more items
sparkyfitness-server | ]
sparkyfitness-server | [2026-10-01T19:53:07.208Z] [INFO] Ensuring permissions for role: "sparkyapp"
sparkyfitness-server | [2026-10-01T19:53:07.260Z] [INFO] Successfully ensured permissions for role: "sparkyapp"
sparkyfitness-server | [2026-10-01T19:53:07.261Z] [INFO] Permissions granted to application user.
sparkyfitness-server | [2026-10-01T19:53:07.261Z] [INFO] Applying all RLS policies from rls_policies.sql...
sparkyfitness-server | [2026-10-01T19:53:07.410Z] [INFO] Successfully applied all RLS policies.
sparkyfitness-server | [AUTH] Starting Better Auth mounting phase...
sparkyfitness-server | [AUTH] Better Auth handler successfully mounted.
sparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: []
sparkyfitness-server | DEBUG: Server started and listening on port 3010
sparkyfitness-server | [2026-10-01T19:53:07.482Z] [INFO] SparkyFitnessServer listening on port 3010
sparkyfitness-server | View API documentation at: /api/api-docs/swagger
sparkyfitness-server | [2026-10-01T19:53:07.485Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule
sparkyfitness-server | [2026-10-01T19:53:24.905Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
sparkyfitness-server | [2026-10-01T19:53:55.035Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
sparkyfitness-server | [AUTH HANDLER] Intercepted request: POST /api/auth/sign-in/email
sparkyfitness-server | 2026-10-01T19:53:57.085Z ERROR [Better Auth]: Invalid password
sparkyfitness-server | [AUTH HANDLER] Intercepted request: POST /api/auth/sign-in/email
sparkyfitness-server | [2026-10-01T19:53:57.241Z] [INFO] [AUTH] Hook: Session created for user 55263b9a-8a7a-4759-b884-6183f5d58a02. Updating last login and checking group sync.
sparkyfitness-server | [2026-10-01T19:53:57.296Z] [INFO] Incoming request: GET /api/measurements/check-in/1999-01-01 (Path: /api/measurements/check-in/1999-01-01)
sparkyfitness-server | [2026-10-01T19:53:57.400Z] [INFO] Incoming request: GET /api/measurements/check-in/2026-09-01 (Path: /api/measurements/check-in/2026-09-01)
@@ -0,0 +1,8 @@
{
"sparkyfitness-db": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
}
@@ -0,0 +1,6 @@
sparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.
sparkyfitness-server | [2026-10-01T19:41:51.649Z] [INFO] Applied migrations: [
sparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
sparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
sparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
sparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
@@ -0,0 +1,61 @@
[19:40:25] scratch drive folders cleared before FROM (R-656): none existed
[19:40:25] MV-sparkyfitness: deploying sparkyfitness at FROM {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.2', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.2'}
[19:41:39] FROM settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[19:41:39] fixture: the BOX walk's own (Sparkyfitness), through upgrade_boxport
[19:41:39] sparkyfitness: sign-up http=200
[19:41:39] sparkyfitness: check-in http=200
[19:41:39] sparkyfitness: seeded user drillc52c98 with a weight of 78.96 on 2026-09-01
[19:41:40] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:41:40] C1 (seed reads back BEFORE): True
[19:41:40] MV-sparkyfitness: swapping to TO {'sparkyfitness-db': 'postgres:18-alpine', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3'}
[19:42:12] TO up -d rc=0
[19:42:43] TO settled=True in 31.1s :: {"sparkyfitness": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-db": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}, "sparkyfitness-server": {"status": "running", "health": "healthy", "restarts": 0, "exit": 0}}
[19:42:44] engine state sparkyfitness-db: 18
[19:42:44] migration lines observed: 6
[19:42:44] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:42:44] RESULT (seed reads back AFTER): True
[19:42:45] memory watch: 600s, 4 callers on 1 path(s) at 172.18.0.2:80
[19:43:00] + 15s sparkyfitness=8M/256M peak=8M kills=0 rs=0 sparkyfitness-db=159M/512M peak=163M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=387M kills=0 rs=0 reqs=304
[19:43:15] + 30s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=160M/512M peak=163M kills=0 rs=0 sparkyfitness-server=415M/1024M peak=426M kills=0 rs=0 reqs=604
[19:43:30] + 46s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=159M/512M peak=163M kills=0 rs=0 sparkyfitness-server=415M/1024M peak=426M kills=0 rs=0 reqs=904
[19:43:45] + 61s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=164M/512M peak=166M kills=0 rs=0 sparkyfitness-server=387M/1024M peak=426M kills=0 rs=0 reqs=1208
[19:44:00] + 76s sparkyfitness=8M/256M peak=9M kills=0 rs=0 sparkyfitness-db=182M/512M peak=185M kills=0 rs=0 sparkyfitness-server=384M/1024M peak=426M kills=0 rs=0 reqs=1508
[19:44:16] + 91s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=206M/512M peak=207M kills=0 rs=0 sparkyfitness-server=388M/1024M peak=426M kills=0 rs=0 reqs=1812
[19:44:31] + 106s sparkyfitness=8M/256M peak=10M kills=0 rs=0 sparkyfitness-db=227M/512M peak=231M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=2112
[19:44:46] + 121s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=232M/512M peak=236M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=2412
[19:45:01] + 136s sparkyfitness=7M/256M peak=10M kills=0 rs=0 sparkyfitness-db=214M/512M peak=236M kills=0 rs=0 sparkyfitness-server=390M/1024M peak=426M kills=0 rs=0 reqs=2716
[19:45:16] + 152s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=216M/512M peak=236M kills=0 rs=0 sparkyfitness-server=391M/1024M peak=426M kills=0 rs=0 reqs=3016
[19:45:31] + 167s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=219M/512M peak=236M kills=0 rs=0 sparkyfitness-server=387M/1024M peak=426M kills=0 rs=0 reqs=3320
[19:45:47] + 182s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=235M/512M peak=238M kills=0 rs=0 sparkyfitness-server=386M/1024M peak=426M kills=0 rs=0 reqs=3620
[19:46:02] + 197s sparkyfitness=8M/256M peak=11M kills=0 rs=0 sparkyfitness-db=234M/512M peak=238M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=3920
[19:46:17] + 212s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=220M/512M peak=243M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=4224
[19:46:32] + 227s sparkyfitness=7M/256M peak=11M kills=0 rs=0 sparkyfitness-db=226M/512M peak=243M kills=0 rs=0 sparkyfitness-server=403M/1024M peak=426M kills=0 rs=0 reqs=4524
[19:46:47] + 243s sparkyfitness=8M/256M peak=11M kills=0 rs=0 sparkyfitness-db=240M/512M peak=243M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=4827
[19:47:02] + 258s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=242M/512M peak=246M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=5128
[19:47:18] + 273s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=250M/512M peak=255M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=5429
[19:47:33] + 288s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=249M/512M peak=258M kills=0 rs=0 sparkyfitness-server=393M/1024M peak=426M kills=0 rs=0 reqs=5732
[19:47:48] + 303s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=247M/512M peak=258M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=6036
[19:48:03] + 319s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=241M/512M peak=258M kills=0 rs=0 sparkyfitness-server=400M/1024M peak=426M kills=0 rs=0 reqs=6336
[19:48:18] + 334s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=340M/512M peak=349M kills=0 rs=0 sparkyfitness-server=401M/1024M peak=426M kills=0 rs=0 reqs=6640
[19:48:34] + 349s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=326M/512M peak=349M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=6941
[19:48:49] + 364s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=348M/512M peak=352M kills=0 rs=0 sparkyfitness-server=398M/1024M peak=426M kills=0 rs=0 reqs=7244
[19:49:04] + 380s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=348M/512M peak=354M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=7546
[19:49:19] + 395s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=349M/512M peak=358M kills=0 rs=0 sparkyfitness-server=402M/1024M peak=426M kills=0 rs=0 reqs=7848
[19:49:35] + 410s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=356M/512M peak=359M kills=0 rs=0 sparkyfitness-server=396M/1024M peak=426M kills=0 rs=0 reqs=8154
[19:49:50] + 425s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=358M/512M peak=363M kills=0 rs=0 sparkyfitness-server=400M/1024M peak=426M kills=0 rs=0 reqs=8454
[19:50:05] + 440s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=354M/512M peak=363M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=8756
[19:50:20] + 456s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=359M/512M peak=364M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=9058
[19:50:36] + 471s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=385M/512M peak=391M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=9360
[19:50:51] + 486s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=404M/512M peak=412M kills=0 rs=0 sparkyfitness-server=411M/1024M peak=426M kills=0 rs=0 reqs=9660
[19:51:06] + 501s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=351M/512M peak=412M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=9964
[19:51:21] + 516s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=351M/512M peak=412M kills=0 rs=0 sparkyfitness-server=397M/1024M peak=426M kills=0 rs=0 reqs=10267
[19:51:36] + 532s sparkyfitness=8M/256M peak=12M kills=0 rs=0 sparkyfitness-db=334M/512M peak=412M kills=0 rs=0 sparkyfitness-server=394M/1024M peak=426M kills=0 rs=0 reqs=10568
[19:51:52] + 547s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=344M/512M peak=412M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=10870
[19:52:07] + 562s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=339M/512M peak=412M kills=0 rs=0 sparkyfitness-server=399M/1024M peak=426M kills=0 rs=0 reqs=11172
[19:52:22] + 577s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=162M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=11472
[19:52:37] + 592s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=161M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=11774
[19:52:52] + 608s sparkyfitness=7M/256M peak=12M kills=0 rs=0 sparkyfitness-db=133M/512M peak=412M kills=0 rs=0 sparkyfitness-server=395M/1024M peak=426M kills=0 rs=0 reqs=12076
[19:52:53] memory watch: killed=False tight=[] requests=12076 codes={'200': 12076}
[19:52:53] MV-sparkyfitness: ABORT — putting the FROM images back
[19:53:57] sparkyfitness: readback of the seeded weight http=200 equal=True
[19:53:57] ABORT: app came back in 31.3s; data present=True
@@ -0,0 +1,12 @@
# sampler.sh (run INSIDE the bench or the box): sample the cgroup of each named container from its birth, every 2 s.
# usage: NAMES="a b c" OUT=/root/mem.csv DUR=900 bash sampler.sh & — stops at DUR or when $OUT.stop exists
: > $OUT; t0=$(date +%s)
while [ $(( $(date +%s) - t0 )) -lt ${DUR:-900} ] && [ ! -f $OUT.stop ]; do
for n in $NAMES; do
id=$(docker ps -q --no-trunc --filter name=^$n$ | head -1); [ -z "$id" ] && continue
cg=$(ls -d /sys/fs/cgroup/system.slice/docker-$id.scope 2>/dev/null || find /sys/fs/cgroup -maxdepth 4 -type d -name "*$id*" 2>/dev/null | head -1)
[ -f "$cg/memory.stat" ] || continue
echo "$(date +%s),$n,${id:0:12},$(awk '$1=="anon"{print $2}' $cg/memory.stat),$(cat $cg/memory.current),$(cat $cg/memory.swap.current 2>/dev/null || echo NA),$(awk '$1=="oom_kill"{print $2}' $cg/memory.events),$(cat $cg/memory.max),$(docker inspect -f '{{.RestartCount}}' $id)" >> $OUT
done
sleep 2
done
@@ -0,0 +1,242 @@
sparkyfitness-db | The files belonging to this database system will be owned by user "postgres".
sparkyfitness-db | This user must also own the server process.
sparkyfitness-db |
sparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8".
sparkyfitness-db | The default database encoding has accordingly been set to "UTF8".
sparkyfitness-db | The default text search configuration will be set to "english".
sparkyfitness-db |
sparkyfitness-db | Data page checksums are enabled.
sparkyfitness-db |
sparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok
sparkyfitness-db | creating subdirectories ... ok
sparkyfitness-db | selecting dynamic shared memory implementation ... posix
sparkyfitness-db | selecting default "max_connections" ... 100
sparkyfitness-db | selecting default "shared_buffers" ... 128MB
sparkyfitness-db | selecting default time zone ... Europe/Budapest
sparkyfitness-db | creating configuration files ... ok
sparkyfitness-db | running bootstrap script ... ok
sparkyfitness-db | sh: locale: not found
sparkyfitness-db | 2026-10-01 21:40:26.926 CEST [36] WARNING: no usable system locales were found
sparkyfitness-db | performing post-bootstrap initialization ... ok
sparkyfitness-db | syncing data to disk ... ok
sparkyfitness-db |
sparkyfitness-db |
sparkyfitness-db | Success. You can now start the database server using:
sparkyfitness-db |
sparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start
sparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections
sparkyfitness-db | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
sparkyfitness-db |
sparkyfitness-db | waiting for server to start....2026-10-01 21:40:27.841 CEST [42] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
sparkyfitness-db | 2026-10-01 21:40:27.848 CEST [42] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
sparkyfitness-db | 2026-10-01 21:40:27.861 CEST [48] LOG: database system was shut down at 2026-10-01 21:40:27 CEST
sparkyfitness-db | 2026-10-01 21:40:27.870 CEST [42] LOG: database system is ready to accept connections
sparkyfitness-db | done
sparkyfitness-db | server started
sparkyfitness-db | CREATE DATABASE
sparkyfitness-db |
sparkyfitness-db |
sparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
sparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommit
sparkyfitness-server | [Secrets] Checking for secret files to load...
sparkyfitness-server | [Secrets] No secrets loaded from files.
sparkyfitness-db |
sparkyfitness-db | waiting for server to shut down....2026-10-01 21:40:28.062 CEST [42] LOG: received fast shutdown request
sparkyfitness-db | 2026-10-01 21:40:28.074 CEST [42] LOG: aborting any active transactions
sparkyfitness-db | 2026-10-01 21:40:28.077 CEST [42] LOG: background worker "logical replication launcher" (PID 51) exited with exit code 1
sparkyfitness-db | 2026-10-01 21:40:28.078 CEST [46] LOG: shutting down
sparkyfitness-db | 2026-10-01 21:40:28.081 CEST [46] LOG: checkpoint starting: shutdown immediate
sparkyfitness-db | 2026-10-01 21:40:28.197 CEST [46] LOG: checkpoint complete: wrote 943 buffers (5.8%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.031 s, sync=0.072 s, total=0.119 s; sync files=303, longest=0.038 s, average=0.001 s; distance=4362 kB, estimate=4362 kB; lsn=0/1BA8868, redo lsn=0/1BA8868
sparkyfitness-db | 2026-10-01 21:40:28.224 CEST [42] LOG: database system is shut down
sparkyfitness-db | done
sparkyfitness-db | server stopped
sparkyfitness-db |
sparkyfitness-db | PostgreSQL init process complete; ready for start up.
sparkyfitness-db |
sparkyfitness-server | [2026-10-01T19:41:42.803Z] [INFO] Environment variable pre-flight checks passed successfully.
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: starting PostgreSQL 18.6 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
sparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv6 address "::", port 5432
sparkyfitness-db | 2026-10-01 21:40:28.311 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
sparkyfitness-db | 2026-10-01 21:40:28.325 CEST [64] LOG: database system was shut down at 2026-10-01 21:40:28 CEST
sparkyfitness-db | 2026-10-01 21:40:28.332 CEST [1] LOG: database system is ready to accept connections
sparkyfitness-server | Starting server...
sparkyfitness-server | [2026-10-01T19:41:50.834Z] [INFO] [withingsService] Withings data source configured to: withings
sparkyfitness-server | [2026-10-01T19:41:50.836Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit
sparkyfitness-server | [2026-10-01T19:41:50.837Z] [INFO] [googleHealthService] Google Health data source: googlehealth
sparkyfitness-server | [2026-10-01T19:41:50.838Z] [INFO] [polarService] Polar data source configured to: polar
sparkyfitness-server | [2026-10-01T19:41:50.838Z] [INFO] [stravaService] Strava data source configured to: strava
sparkyfitness-server | [2026-10-01T19:41:50.839Z] [INFO] [hevyService] Hevy data source configured to: hevy
sparkyfitness-server | [2026-10-01T19:41:51.483Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars
sparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid
sparkyfitness | Starting SparkyFitness Frontend as root with environment variables:
sparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server
sparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010
sparkyfitness | NGINX_RATE_LIMIT=5r/s
sparkyfitness | NGINX_LISTEN_PORT=80
sparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log
sparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log
sparkyfitness | NGINX_DUMP_CONFIG=false
sparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid
sparkyfitness | Generating nginx configuration from template...
sparkyfitness | Testing nginx configuration substitution...
sparkyfitness | Validating nginx configuration syntax...
sparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
sparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful
sparkyfitness | Configuration validated successfully. Starting nginx...
sparkyfitness | Backend will be proxied to: sparkyfitness-server:3010
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: using the "epoll" event method
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: nginx/1.29.3
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0)
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: OS: Linux 7.0.2-6-pve
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker processes
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 12
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 13
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 14
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 15
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 16
sparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 17
sparkyfitness | 127.0.0.1 - - [01/Oct/2026:21:42:42 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget"
sparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks.
sparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads
sparkyfitness-server | [2026-10-01T19:41:51.617Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/
sparkyfitness-server | [2026-10-01T19:41:51.643Z] [INFO] Role "sparkyapp" already exists.
sparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.
sparkyfitness-server | [2026-10-01T19:41:51.649Z] [INFO] Applied migrations: [
sparkyfitness-server | '20250703170640_InitialDB.sql',
sparkyfitness-server | '20250710062500_create_goal_presets_table.sql',
sparkyfitness-server | '20250711173824_meal_features.sql',
sparkyfitness-server | '20250712163617_refactor_data_providers_and_add_exercise_source_id.sql',
sparkyfitness-server | '20250713125323_create_oidc_settings_and_update_users_table.sql',
sparkyfitness-server | '20250713135900_add_role_to_users_table.sql',
sparkyfitness-server | '20250713142300_add_oidc_config_fields.sql',
sparkyfitness-server | '20250714000000_create_session_table.sql',
sparkyfitness-server | '20250714175824_add_api_key_tag_to_ai_service_settings.sql',
sparkyfitness-server | '20250717190700_add_cascading_deletes.sql',
sparkyfitness-server | '20250717233929_add_is_quick_food_to_foods.sql',
sparkyfitness-server | '20250718190226_add_food_display_limit_to_user_preferences.sql',
sparkyfitness-server | '20250719131500_add_meal_percentages.sql',
sparkyfitness-server | '20250719215400_add_login_management_to_oidc_settings.sql',
sparkyfitness-server | '20250720010000_create_user_nutrient_display_preferences.sql',
sparkyfitness-server | '20250720201800_rename_food_display_limit_to_item_display_limit.sql',
sparkyfitness-server | '20250720220000_add_water_tracking_features.sql',
sparkyfitness-server | '20250720233836_alter_water_goal_ml_to_numeric.sql',
sparkyfitness-server | '20250721000000_add_servings_per_container_to_water_containers.sql',
sparkyfitness-server | '20250721000000_alter_water_container_volume_to_numeric.sql',
sparkyfitness-server | '20250721014900_alter_water_ml_to_numeric.sql',
sparkyfitness-server | '20250819062400_add_mealie_provider_type.sql',
sparkyfitness-server | '20250819083500_add_base_url_to_external_data_providers.sql',
sparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
sparkyfitness-server | '20250821090000_update_external_data_providers_provider_type_check.sql',
sparkyfitness-server | '20250821091500_add_garth_token_dump_to_external_data_providers.sql',
sparkyfitness-server | '20250821102000_remove_redundant_token_fields_from_external_data_providers.sql',
sparkyfitness-server | '20250831063900_create_mood_entries_table.sql',
sparkyfitness-server | '20250927180257_alter_exercises_table.sql',
sparkyfitness-server | '20250927212000_add_free_exercise_db_to_provider_type_check.sql',
sparkyfitness-server | '20250930002100_add_sets_reps_weight_to_exercise_entries.sql',
sparkyfitness-server | '20251001232600_add_gender_to_users_table.sql',
sparkyfitness-server | '20251002182306_create_backup_settings_table.sql',
sparkyfitness-server | '20251002224500_add_password_reset_to_users_table.sql',
sparkyfitness-server | '20251006021609_add_glycemic_index_to_foods_and_food_variants.sql',
sparkyfitness-server | '20251006220500_create_admin_activity_logs_table.sql',
sparkyfitness-server | '20251008224256_add_workout_features.sql',
sparkyfitness-server | '20251012225400_add_primary_keys_to_workout_tables.sql',
sparkyfitness-server | '20251012225500_add_multiple_sets_to_presets.sql',
sparkyfitness-server | '20251012225900_add_multiple_sets_to_plans.sql',
sparkyfitness-server | '20251012230000_add_multiple_sets_to_exercise_entries.sql',
sparkyfitness-server | '20251015223200_convert_weights_to_kg_and_set_default.sql',
sparkyfitness-server | '202510170132_add_text_measurements.sql',
sparkyfitness-server | '20251017200900_add_multiple_oidc_providers.sql',
sparkyfitness-server | '20251017204200_create_global_settings.sql',
sparkyfitness-server | '20251018001151_add_bmr_and_bodyfat_preferences.sql',
sparkyfitness-server | '20251018223700_add_signing_alg_to_oidc_providers.sql',
sparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
sparkyfitness-server | '20251019013300_merged_rls_policies.sql',
sparkyfitness-server | '20251019154515_update_rls_policies_for_shared_items.sql',
sparkyfitness-server | '20251019203500_fix_rls_permissions_for_public_foods.sql',
sparkyfitness-server | '20251019204000_correct_variant_rls_policy.sql',
sparkyfitness-server | '20251019212500_update_measurement_rls_policies.sql',
sparkyfitness-server | '20251019222100_add_audit_columns_to_measurements.sql',
sparkyfitness-server | '20251020001000_fix_family_access_insert_policy.sql',
sparkyfitness-server | '20251020022000_set_default_shared_with_public.sql',
sparkyfitness-server | '20251020022200_update_rls_policies.sql',
sparkyfitness-server | '20251020022500_fix_food_select_policy.sql',
sparkyfitness-server | '20251020030000_simplify_food_select_policy.sql',
sparkyfitness-server | '20251020031000_update_food_select_policy_with_sharing.sql',
sparkyfitness-server | '20251020032200_add_all_owner_centric_policies.sql',
sparkyfitness-server | '20251020033400_add_food_variants_rls_policy.sql',
sparkyfitness-server | '20251020033700_fix_food_variants_rls_policy.sql',
sparkyfitness-server | '20251020230839_fix_family_access_rls_policies.sql',
sparkyfitness-server | '20251021025423_restrict_family_access_select_policy.sql',
sparkyfitness-server | '20251021034700_add_public_sharing_to_external_providers.sql',
sparkyfitness-server | '20251022201000_fix_exercise_rls_policy.sql',
sparkyfitness-server | '20251022203000_snapshot_exercise_details_in_entries.sql',
sparkyfitness-server | '20251023120500_update_external_providers_select_policy_for_public.sql',
sparkyfitness-server | '20251023221000_update_meals_rls_policy.sql',
sparkyfitness-server | '20251023221500_update_meal_plan_template_assignments_rls_policy.sql',
sparkyfitness-server | '20251023221501_add_meal_id_to_food_entries.sql',
sparkyfitness-server | '20251024230330_add_withings_fields_to_external_data_providers.sql',
sparkyfitness-server | '20251025210900_add_source_to_custom_measurements.sql',
sparkyfitness-server | '20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql',
sparkyfitness-server | '202510310132_add_language_to_user_preferences.sql',
sparkyfitness-server | '20251101151100_create_sleep_entries_table.sql',
sparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
sparkyfitness-server | '20251112000000_add_display_name_to_custom_categories.sql',
sparkyfitness-server | '20251114205134_create_exercise_preset_entries_table.sql',
sparkyfitness-server | '20251115003147_add_source_to_exercise_preset_entries.sql',
sparkyfitness-server | '20251115003301_add_exercise_preset_entry_id_to_activity_details.sql',
sparkyfitness-server | '20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql',
sparkyfitness-server | '20251120011100_add_mfa_magic_link_columns.sql',
sparkyfitness-server | '20251121011500_add_email_mfa_columns_to_users.sql',
sparkyfitness-server | '202511220110_add_default_external_data_providers.sql',
sparkyfitness-server | '202511232110_delete_raw_stress_data_categories.sql',
sparkyfitness-server | '202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql',
sparkyfitness-server | '20251127194107_create_food_entry_meals_and_link_food_entries.sql',
sparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
sparkyfitness-server | '20251128030115_add_tandoor_provider_type.sql',
sparkyfitness-server | '20251205000000_add_energy_unit_to_user_preferences.sql',
sparkyfitness-server | '20251206000000_add_nutrient_calculation_algorithms.sql',
sparkyfitness-server | '20251206000001_add_serving_size_to_meals.sql',
sparkyfitness-server | '20251207000001_add_default_meal_quantity.sql',
sparkyfitness-server | '20251215005329_add_usda_to_provider_type_check.sql',
sparkyfitness-server | '20251221000000_create_fasting_logs.sql',
sparkyfitness-server | '20251221010000_drop_mood_weight_from_fasting_logs.sql',
sparkyfitness-server | '20251226150700_add_mobile_health_data_features.sql',
sparkyfitness-server | '20251228000000_add_custom_nutrients_tables.sql',
sparkyfitness-server | ... 74 more items
sparkyfitness-server | ]
sparkyfitness-server | [2026-10-01T19:41:51.653Z] [INFO] Applying migration: 20260623000000_add_measurement_decimal_places.sql
sparkyfitness-server | [2026-10-01T19:41:51.663Z] [INFO] Successfully applied migration: 20260623000000_add_measurement_decimal_places.sql
sparkyfitness-server | [2026-10-01T19:41:51.663Z] [INFO] Applying migration: 20260624000000_add_medication_glp1_schema.sql
sparkyfitness-server | [2026-10-01T19:41:51.790Z] [INFO] Successfully applied migration: 20260624000000_add_medication_glp1_schema.sql
sparkyfitness-server | [2026-10-01T19:41:51.790Z] [INFO] Applying migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
sparkyfitness-server | [2026-10-01T19:41:51.800Z] [INFO] Successfully applied migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
sparkyfitness-server | [2026-10-01T19:41:51.800Z] [INFO] Applying migration: 20260628000000_convert_exercise_durations_to_numeric.sql
sparkyfitness-server | [2026-10-01T19:41:51.829Z] [INFO] Successfully applied migration: 20260628000000_convert_exercise_durations_to_numeric.sql
sparkyfitness-server | [2026-10-01T19:41:51.829Z] [INFO] Applying migration: 20260628120000_add_vision_ai_service_pointers.sql
sparkyfitness-server | [2026-10-01T19:41:51.838Z] [INFO] Successfully applied migration: 20260628120000_add_vision_ai_service_pointers.sql
sparkyfitness-server | [2026-10-01T19:41:51.838Z] [INFO] Applying migration: 20260630000000_add_custom_nutrient_aliases.sql
sparkyfitness-server | [2026-10-01T19:41:51.843Z] [INFO] Successfully applied migration: 20260630000000_add_custom_nutrient_aliases.sql
sparkyfitness-server | [2026-10-01T19:41:51.844Z] [INFO] Applying migration: 20260630000000_add_onboarding_skipped.sql
sparkyfitness-server | [2026-10-01T19:41:51.849Z] [INFO] Successfully applied migration: 20260630000000_add_onboarding_skipped.sql
sparkyfitness-server | [2026-10-01T19:41:51.849Z] [INFO] Applying migration: 20260701000000_add_child_meal_to_meal_foods.sql
sparkyfitness-server | [2026-10-01T19:41:51.867Z] [INFO] Successfully applied migration: 20260701000000_add_child_meal_to_meal_foods.sql
sparkyfitness-server | [2026-10-01T19:41:51.867Z] [INFO] Applying migration: 20260702180000_add_cycle_tracking_schema.sql
sparkyfitness-server | [2026-10-01T19:41:51.989Z] [INFO] Successfully applied migration: 20260702180000_add_cycle_tracking_schema.sql
sparkyfitness-server | [2026-10-01T19:41:51.989Z] [INFO] Applying migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
sparkyfitness-server | [2026-10-01T19:41:51.995Z] [INFO] Successfully applied migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
sparkyfitness-server | [2026-10-01T19:41:52.006Z] [INFO] Ensuring permissions for role: "sparkyapp"
sparkyfitness-server | [2026-10-01T19:41:52.042Z] [INFO] Successfully ensured permissions for role: "sparkyapp"
sparkyfitness-server | [2026-10-01T19:41:52.042Z] [INFO] Permissions granted to application user.
sparkyfitness-server | [2026-10-01T19:41:52.043Z] [INFO] Applying all RLS policies from rls_policies.sql...
sparkyfitness-server | [2026-10-01T19:41:52.184Z] [INFO] Successfully applied all RLS policies.
sparkyfitness-server | [AUTH] Starting Better Auth mounting phase...
sparkyfitness-server | [AUTH] Better Auth handler successfully mounted.
sparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: []
sparkyfitness-server | DEBUG: Server started and listening on port 3010
sparkyfitness-server | [2026-10-01T19:41:52.250Z] [INFO] SparkyFitnessServer listening on port 3010
sparkyfitness-server | View API documentation at: /api/api-docs/swagger
sparkyfitness-server | [2026-10-01T19:41:52.258Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule
sparkyfitness-server | [2026-10-01T19:42:12.021Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
sparkyfitness-server | [2026-10-01T19:42:42.150Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
@@ -0,0 +1,20 @@
{
"sparkyfitness": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"sparkyfitness-db": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
},
"sparkyfitness-server": {
"status": "running",
"health": "healthy",
"restarts": 0,
"exit": 0
}
}
@@ -0,0 +1,86 @@
{
"harness_version": 4,
"edge": "MV-sparkyfitness",
"app": "sparkyfitness",
"note": "night 2026-09-23 within-a-major move: sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3",
"from": {
"sparkyfitness-db": "postgres:18-alpine",
"sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.2",
"sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.2"
},
"to": {
"sparkyfitness-db": "postgres:18-alpine",
"sparkyfitness-server": "codewithcj/sparkyfitness_server:v0.17.3",
"sparkyfitness-frontend": "codewithcj/sparkyfitness:v0.17.3"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": "\u001b[2Ksparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.",
"abort": "starts-and-serves",
"abort_detail": null,
"engine_state_after": {
"sparkyfitness-db": {
"image": "postgres:18-alpine",
"probe": "datadir major version",
"answer": "18",
"probe_rc": 0
}
},
"memory": {
"soak_s": 607.9,
"requested_s": 600,
"requests": 12076,
"codes": {
"200": 12076
},
"first_kill": null,
"containers": {
"sparkyfitness": {
"limit": 268435456,
"peak": 13131776,
"peak_pct": 0.049,
"anon_peak_sampled": 6139904,
"anon_peak_pct": 0.023,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"sparkyfitness-db": {
"limit": 536870912,
"peak": 432951296,
"peak_pct": 0.806,
"anon_peak_sampled": 283111424,
"anon_peak_pct": 0.527,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
},
"sparkyfitness-server": {
"limit": 1073741824,
"peak": 447664128,
"peak_pct": 0.417,
"anon_peak_sampled": 404697088,
"anon_peak_pct": 0.377,
"oom_kills": 0,
"restarts": 0,
"oomkilled_flag": false,
"measured": true
}
},
"unmeasured": [],
"load": "reached"
},
"marks": [],
"bench_overrides": null,
"duration_s": 31.1,
"measured_at": "2026-10-01T19:53:57Z",
"evidence": "evidence/MV-sparkyfitness",
"scratch_cleared": [],
"files_changed": [],
"files_changed_detail": [],
"total_s": 811.7
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,8 @@
from-birth 2 s sampler, MV-sparkyfitness (one row per container INSTANCE: FROM v0.17.2, TO v0.17.3, ABORT v0.17.2); swap 0 bench
sparkyfitness-db 7150f7f09c31 19:40:26-19:53:56 n= 373 peak anon 272.9 MiB = 53.3 % of 512 MiB; peak current 408.1 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness-server fc73a15b1520 19:40:37-19:41:39 n= 30 peak anon 328.7 MiB = 32.1 % of 1024 MiB; peak current 354.4 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness 66426a76164e 19:41:09-19:41:39 n= 15 peak anon 5.0 MiB = 1.9 % of 256 MiB; peak current 6.5 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness-server 92ea34048581 19:41:43-19:52:51 n= 307 peak anon 391.5 MiB = 38.2 % of 1024 MiB; peak current 421.3 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness 44fb9597d34d 19:42:13-19:52:51 n= 293 peak anon 6.8 MiB = 2.6 % of 256 MiB; peak current 9.5 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness-server 8b8eba39eb95 19:52:56-19:53:56 n= 29 peak anon 319.8 MiB = 31.2 % of 1024 MiB; peak current 345.4 MiB; oom_kill 0; restarts 0; swap.current ['0']
sparkyfitness bf56c1b7bcfc 19:53:26-19:53:56 n= 15 peak anon 4.9 MiB = 1.9 % of 256 MiB; peak current 6.9 MiB; oom_kill 0; restarts 0; swap.current ['0']
@@ -0,0 +1 @@
##### SparkyFitness on 9202 — controller gitea.dooplex.hu/admin/felhom-controller:0.286.1 | catalog ca144ea b | 2026-10-01T20:05:23Z
@@ -0,0 +1,20 @@
# R-772 live on 9202, controller 0.286.1: stop paperless-webserver (the probe's container), poll GET /api/stacks/paperless-ngx every 5 s
before: running healthy= True not_checked= None last_check= 2026-10-01T19:47:47.114216049Z
stopped at 19:48:33
19:48:38 degraded healthy= True not_checked= None last_check= 2026-10-01T19:47:47.114216049Z
19:48:43 degraded healthy= True not_checked= None last_check= 2026-10-01T19:47:47.114216049Z
19:48:48 degraded healthy= False not_checked= True last_check= 2026-10-01T19:48:47.114422945Z
19:48:53 degraded healthy= False not_checked= True last_check= 2026-10-01T19:48:47.114422945Z
19:48:58 degraded healthy= False not_checked= True last_check= 2026-10-01T19:48:57.14391394Z
19:49:03 degraded healthy= False not_checked= True last_check= 2026-10-01T19:48:57.14391394Z
started at 19:49:05
19:49:10 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:15 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:20 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:25 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:30 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:35 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:41 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:46 starting healthy= False not_checked= True last_check= 2026-10-01T19:49:07.183669754Z
19:49:51 running healthy= True not_checked= None last_check= 2026-10-01T19:49:47.157383205Z
the app page line (ASCII fragment 'egeszsegellenorzes' is accented; checked by data attribute):
@@ -7,3 +7,14 @@ BEFORE remove — lock record + files: setup_gate: | state: open | since: "2026-
BEFORE remove — a stranger: {'GET /signup': '403', 'POST users.create': '403'}
night chain (debug action) -> 202 {'data': {'legs': ['db-dump', 'tier2', 'update-leg']}, 'message': 'started', 'ok': True}
restore points offered: [(None, '2026-10-01T19:15:29Z')]
remove KEEPING backups -> 200 {'ok': True, 'data': {'removed': 'karakeep', 'volumes_removed': ['karakeep_karakeep_data', 'karakeep_karakeep_meili'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'verified': True}, 'message':
AFTER remove — lock record + files: --- | no block/gate file
restore: {'ok': True, 'snapshot_id': 'helyi', 'http': 'HTTP/2 302', 'seconds': 79.0, 'state_after': 'running', 'hold_after': None, 'why': None}
AFTER remove + restore — lock record + files: setup_gate: | state: open | since: "2026-10-01T19:36:20Z" | hosts: | - bookmarks.enkisfelhom.hu | opened_at: "2026-10-01T19:36:20Z" | opened_by: restore | native_lock: applied | after_setup: | --- | signup-block-karakeep.yml
AFTER remove + restore — a stranger: {'GET /signup': '403', 'POST users.create': '403'}
karakeep: readback http=200 found=True (controls: no key 401, wrong 401, absent 404)
the household's data back: True
controller log: 2026/10/01 19:12:39 setup_gate.go:232: [INFO] [web] setup gate karakeep: the household passed (a dashboard session vouched for this browser) — visitor 192.168.0.180
2026/10/01 19:36:17 signup_block.go:175: [INFO] [stacks] karakeep: sign-up block removed (window open, app removed, or no block wanted)
2026/10/01 19:36:20 after_setup.go:253: [INFO] [stacks] karakeep: restored after a removal — sign-up closed again as after its setup (hosts [bookmarks.enkisfelhom.hu])
@@ -0,0 +1 @@
# demo-felhom (N100): its one installed reset app restarted, 2026-10-01T19:53:48Z: opengist -> 200
@@ -0,0 +1,6 @@
# demo-hp: the 5 installed apps with the router reset restarted through the product (POST /api/stacks/<app>/restart), 2026-10-01T19:52:45Z
adventurelog restart -> 200
docmost restart -> 200
opengist restart -> 200
paperless-ngx restart -> 200
romm restart -> 200
@@ -0,0 +1,2 @@
# docmost (router reset) through the REAL tunnel, 12 wrong logins, each with a NEW forged X-Forwarded-For — the limit must still bite (not dodgeable), 2026-10-01T19:53:22Z
401 401 401 401 401 401 401 401 401 401 429 429
@@ -0,0 +1,8 @@
/traefik running started=2026-10-01T19:50:19.666854369Z felhom-tunnel=172.16.253.3 traefik-public=172.18.0.4
/cloudflared running started=2026-10-01T19:50:20.305417716Z felhom-tunnel=172.16.253.2
[{"Subnet":"172.16.253.0/29","IPRange":"172.16.253.4/30","Gateway":"172.16.253.1"}]
2026/10/01 19:50:15 [INFO] [infra] creating docker network felhom-tunnel (172.16.253.0/29)
2026/10/01 19:50:15 [INFO] [infra] wrote the forwarded-header clean-up → /opt/docker/stacks/traefik/dynamic/forwarded.yml (felhom-forwarded)
2026/10/01 19:50:15 [INFO] [infra] traefik config changed (docker-compose.yml, traefik.yml, tunnel trust true) — rewriting and recreating traefik (routing pauses a few seconds)
2026/10/01 19:50:19 [INFO] [infra] connected felhom-controller to traefik-public
2026/10/01 19:50:19 [INFO] [infra] cloudflared compose changed (tunnel network true) — recreating cloudflared (the tunnel reconnects in seconds)
@@ -0,0 +1,8 @@
/traefik running started=2026-10-01T19:50:22.93261322Z felhom-tunnel=172.16.253.3 traefik-public=172.18.0.3
/cloudflared running started=2026-10-01T19:50:24.171175191Z felhom-tunnel=172.16.253.2
[{"Subnet":"172.16.253.0/29","IPRange":"172.16.253.4/30","Gateway":"172.16.253.1"}]
2026/10/01 19:50:18 infra.go:207: [INFO] [infra] creating docker network felhom-tunnel (172.16.253.0/29)
2026/10/01 19:50:18 infra.go:233: [INFO] [infra] wrote the forwarded-header clean-up → /opt/docker/stacks/traefik/dynamic/forwarded.yml (felhom-forwarded)
2026/10/01 19:50:18 infra.go:141: [INFO] [infra] traefik config changed (docker-compose.yml, traefik.yml, tunnel trust true) — rewriting and recreating traefik (routing pauses a few seconds)
2026/10/01 19:50:23 infra.go:338: [INFO] [infra] connected felhom-controller to traefik-public
2026/10/01 19:50:23 infra.go:182: [INFO] [infra] cloudflared compose changed (tunnel network true) — recreating cloudflared (the tunnel reconnects in seconds)
@@ -0,0 +1,13 @@
# smoke after 0.286.1 on demo-hp: every routed host, GET / through the REAL tunnel from DooPlex, 2026-10-01T19:51:07Z
a1-echo.enkisfelhom.hu 200
books.enkisfelhom.hu 302
docs.enkisfelhom.hu 200
files.enkisfelhom.hu 200
gist.enkisfelhom.hu 302
jatek.enkisfelhom.hu 200
papir.enkisfelhom.hu 302
paste.enkisfelhom.hu 200
pdf.enkisfelhom.hu 200
time.enkisfelhom.hu 302
travel.enkisfelhom.hu 200
wiki.enkisfelhom.hu 302
@@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""bookstack_36.py — checklist 3.6 for BookStack with and without APP_PROXIES=172.16.0.0/12, on 9202 through the SIMULATED
tunnel (bslogin.sh in a curl container at 172.16.253.2). Phase 1 = the live template (control); phase 2 = the same box
with APP_PROXIES added by hand to the stack's compose and the app restarted through the product. Env: SC, EV."""
import os, subprocess, sys, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
APP, SUB, EMAIL = "bookstack", "wiki", "admin@admin.com"
log = open(f"{w.EV}/bookstack-3.6.txt", "a", buffering=1)
def say(*a):
w.say(*a); log.write(" ".join(map(str, a)) + "\n")
def login(visitor, forged, pw):
return w.guest(f"docker run --rm --network felhom-tunnel --ip 172.16.253.2 -v /root/bslogin.sh:/s.sh:ro -v /root/.bspw:/pw:ro "
f"curlimages/curl:8.11.1 sh /s.sh {visitor} {forged} {EMAIL} {pw}").strip().splitlines()[-1:]
def round_(label):
say(f"## {label} — {time.strftime('%FT%TZ', time.gmtime())}")
r = [login("198.51.100.66", f"10.5.0.{i}", "-wrong")[0] for i in range(1, 7)]
say(f" stranger 198.51.100.66, 6 wrong for {EMAIL} (a new forged leftmost each): {r}")
say(f" household 203.0.113.10, the right password, at once: {login('203.0.113.10', '203.0.113.10', '/pw')}")
w.login()
say(f"##### BookStack 3.6 on 9202 — controller {w.guest('docker inspect felhom-controller --format {{.Config.Image}}').strip()}")
say("deploy ->", w.deploy(APP, SUB))
pw = (w.GENERATED.get(APP) or {}).get("ADMIN_PASSWORD")
if not pw: sys.exit("no generated ADMIN_PASSWORD")
w.guest(f"umask 077; cat > /root/.bspw <<'PEOF'\n{pw}\nPEOF\ntruncate -s -1 /root/.bspw; chmod 644 /root/.bspw")
for _ in range(60): # after_install replaces the login, then the hold opens
if "install_hold" not in w.guest("grep -A2 '^install_hold:' /opt/docker/stacks/bookstack/app.yaml | grep -c 'state: open' | sed 's/^1$/open/;s/^0$/install_hold/'"): break
time.sleep(5)
w.wait_app(SUB, "/login", tries=40)
round_("phase 1 — the live template (no APP_PROXIES): control")
say(" waiting 75 s for BookStack's 60-second throttle to pass"); time.sleep(75)
w.guest("cd /opt/docker/stacks/bookstack && grep -q APP_PROXIES docker-compose.yml || sed -i 's#^\\(\\s*\\)- APP_URL=#\\1- APP_PROXIES=172.16.0.0/12\\n\\1- APP_URL=#' docker-compose.yml; grep -n APP_PROXIES docker-compose.yml")
code, d = w.ctl("POST", f"/api/stacks/{APP}/restart"); say("restart through the product ->", code)
w.wait_app(SUB, "/login", tries=40)
say(" the running container's env:", w.guest("docker exec bookstack printenv APP_PROXIES").strip())
round_("phase 2 — APP_PROXIES=172.16.0.0/12")
say(" LAN household (192.168.0.180), right password, while the stranger is throttled:")
w.guest("true")
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
# bslogin.sh <visitor> <forged-left> <email> <pwfile|-wrong> — ONE BookStack form login through the SIMULATED tunnel
# (run in a curl container at 172.16.253.2). Prints: ok | wrong | THROTTLED | ?
V=$1; F=$2; E=$3; P=$4; H=wiki.enkisfelhom.hu; J=/tmp/jar.$$
x="X-Forwarded-For: $F, $V"; c="CF-Connecting-IP: $V"
curl -sk -c $J -b $J "https://traefik/login" -H "Host: $H" -H "$x" -H "$c" -o /tmp/p.$$
T=$(grep -o 'name="_token" value="[^"]*"' /tmp/p.$$ | head -1 | sed 's/.*value="//;s/"$//')
if [ "$P" = "-wrong" ]; then PW="wrong-$$"; else PW=$(cat "$P"); fi
L=$(curl -sk -c $J -b $J -o /dev/null -w '%{redirect_url}' "https://traefik/login" -H "Host: $H" -H "$x" -H "$c" \
--data-urlencode "_token=$T" --data-urlencode "email=$E" --data-urlencode "password=$PW")
case "$L" in */login) curl -sk -c $J -b $J "https://traefik/login" -H "Host: $H" -H "$x" -H "$c" -o /tmp/q.$$
if grep -qiE 'too many|sok .*k.s.rlet|throttle' /tmp/q.$$; then echo THROTTLED; else echo wrong; fi;;
*) echo "ok"; esac
rm -f $J /tmp/p.$$ /tmp/q.$$
@@ -0,0 +1,121 @@
#!/usr/bin/env python3
"""sparky_box.py — SparkyFitness's checklist rows on scratch 9202 (live catalog, controller 0.286.1), through the product's
own endpoints. Strangers through traefik with no session and no gate cookie; the tunnel SIMULATED by a curl container at
172.16.253.2 (Part A's method). Secrets never printed. Env: SC, EV."""
import json, os, re, subprocess, sys, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w
import upgrade_fixtures_box as fixtures
APP, SUB = "sparkyfitness", "sparky"
HOST = f"{SUB}.{w.DOMAIN}"; FX = fixtures.FIXTURES[APP]
log = open(f"{w.EV}/sparky-box.txt", "a", buffering=1)
def say(*a):
w.say(*a); log.write(" ".join(map(str, a)) + "\n")
def lan(path, *a):
r = subprocess.run(["curl", "-sk", "--max-time", "10", "-o", "/dev/null", "-w", "%{http_code}", "-H", f"Host: {HOST}"] + list(a) + [f"{w.BASE}{path}"],
capture_output=True, text=True)
return r.stdout.strip()
def tun(visitor, forged, path, data):
cmd = (f"docker run --rm --network felhom-tunnel --ip 172.16.253.2 curlimages/curl:8.11.1 -sk -o /dev/null -w '%{{http_code}}' "
f"'https://traefik{path}' -H 'Host: {HOST}' -H 'X-Forwarded-For: {forged}, {visitor}' -H 'CF-Connecting-IP: {visitor}' "
f"-H 'Origin: https://{HOST}' -H 'Content-Type: application/json' --data '{data}'")
return w.guest(cmd).strip()[-3:]
def state(): return w.stack(APP).get("state")
w.login()
say(f"##### SparkyFitness on 9202 — controller {w.guest('docker inspect felhom-controller --format {{.Config.Image}}').strip()} | catalog "
+ w.guest("cd /var/lib/docker/volumes/felhom-controller-data/_data/data/catalog-cache && git log --oneline -1").strip()[:9]
+ f" | {time.strftime('%FT%TZ', time.gmtime())}")
# 3.5 / 4.3 — a stranger polls from the press; the install timed
w.guest(f"""cat > /root/sp-poll.sh <<'PEOF'
out=/root/sp-poll.txt; : > $out; t0=$(date +%s)
while [ $(( $(date +%s) - t0 )) -lt 240 ]; do
r=$(curl -sk --max-time 4 -o /root/sp-poll.body -w '%{{http_code}}' -H 'Host: {HOST}' -H 'Content-Type: application/json' -X POST --data '{{"email":"s@x.hu","password":"Stranger-1234","name":"s"}}' https://127.0.0.1/api/auth/sign-up/email)
echo "$(date +%H:%M:%S) $r $(head -c 60 /root/sp-poll.body | tr '\\n' ' ')" >> $out; sleep 1
done
PEOF
(nohup sh /root/sp-poll.sh >/dev/null 2>&1 &)""")
t0 = time.time(); ok = w.deploy(APP, SUB); say(f"deploy -> {ok} ({round(time.time()-t0)} s to `deployed`)")
healthy = None
for _ in range(150):
hs = w.guest("for c in sparkyfitness sparkyfitness-server sparkyfitness-db; do docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}nohc{{end}}' $c; done").split()
if hs and all(h in ("healthy", "nohc") for h in hs): healthy = time.time() - t0; break
time.sleep(2)
say(f"4.3 every container healthy {round(healthy) if healthy else 'NEVER'} s after the press; restarts:",
w.guest("for c in sparkyfitness sparkyfitness-server sparkyfitness-db; do echo -n \"$c=$(docker inspect -f '{{.RestartCount}}' $c) \"; done").strip(),
"| state:", state())
say("3.3 before the setup, a stranger (LAN) on / , /api/auth/sign-up/email:", lan("/", "-H", "Accept: text/html"), lan("/api/auth/sign-up/email", "-X", "POST", "-H", "Content-Type: application/json", "--data", "{}"))
tok = FX.seed(w, SUB, say) # 3.1: the household through the gate, the first account
say("3.1 the household's first account through the gate ->", "ok" if tok else "FAILED " + str(getattr(FX, "tried", "")))
time.sleep(3); w.guest("pkill -f sp-poll.sh || true")
poll = w.guest("cat /root/sp-poll.txt").strip().splitlines(); codes = {}
for l in poll: codes[l.split(" ")[1]] = codes.get(l.split(" ")[1], 0) + 1
say(f"3.5 a stranger's {len(poll)} sign-up tries (1/s) from the press until the household's account: codes {codes}; any 200: {any(' 200 ' in l for l in poll)}")
# the household's 'Done, I set it up' (no probe in the template)
csrf = open(f"{w.SC}/csrf{os.getpid()}.txt").read().strip(); sess = open(f"{w.SC}/sess{os.getpid()}.txt").read().strip()
r = subprocess.run(["curl", "-sk", "-o", "/dev/null", "-w", "%{http_code}", "-H", w.HOSTHDR, "-H", f"Cookie: {sess}", "-H", f"X-CSRF-Token: {csrf}",
"-X", "POST", f"{w.BASE}/apps/{APP}/setup-gate/open"], capture_output=True, text=True)
say("the household presses 'Done, I set it up' ->", r.stdout)
for _ in range(40):
if "native_lock: applied" in w.guest(f"grep -A8 '^setup_gate:' /opt/docker/stacks/{APP}/app.yaml"): break
time.sleep(5)
say("3.4 lock record:", " | ".join(x.strip() for x in w.guest(f"grep -A8 '^setup_gate:' /opt/docker/stacks/{APP}/app.yaml").splitlines()),
"| app env SPARKY_FITNESS_DISABLE_SIGNUP =", w.guest("docker exec sparkyfitness-server printenv SPARKY_FITNESS_DISABLE_SIGNUP").strip())
w.wait_app(SUB, "/", want=("200",), tries=40)
body = json.dumps({"email": "stranger@example.com", "password": "Stranger-pass-1234", "name": "S"})
for p in ("/api/auth/sign-up/email", "/API/Auth/Sign-Up/email", "//api//auth/sign-up/email"):
say(f"3.4 a stranger signs up at {p} (LAN) ->", lan(p, "-X", "POST", "-H", "Content-Type: application/json", "-H", f"Origin: https://{HOST}", "--data", body))
say("3.4 the same straight at the server (behind the block — the app's own switch):",
w.guest("docker run --rm --network traefik-public curlimages/curl:8.11.1 -s -o /dev/null -w '%{http_code}' http://sparkyfitness-server:3010/api/auth/sign-up/email "
f"-H 'Content-Type: application/json' -H 'Origin: https://{HOST}' --data '{body}' || true").strip()[-3:])
say("3.9 browser-shaped sign-in (Origin, JSON) right / wrong:", FX._signin(w, SUB, tok["email"], tok["pw"])[0], FX._signin(w, SUB, tok["email"], "wrong-x")[0])
# 3.6 — lock-out through the simulated tunnel
say("3.6 waiting 20 s (better-auth's own window)"); time.sleep(20)
seq = []
for i in range(1, 9):
seq.append(tun("198.51.100.66", f"10.6.0.{i}", "/api/auth/sign-in/email", json.dumps({"email": tok["email"], "password": f"wrong-{i}"})))
say(f"3.6 stranger 198.51.100.66, 8 wrong sign-ins for the household's e-mail, a new forged leftmost each: {seq}")
t1 = time.time(); hh = []
for _ in range(20):
c = tun("203.0.113.10", "203.0.113.10", "/api/auth/sign-in/email", json.dumps({"email": tok["email"], "password": tok["pw"]}))
hh.append((round(time.time() - t1), c))
if c == "200": break
time.sleep(3)
say(f"3.6 the household from 203.0.113.10, right password, from the stranger's last try on (s, code): {hh}")
# 1.5 / 1.8 / 0.4
say("1.5 processes:", w.guest("for c in sparkyfitness-server sparkyfitness; do echo -n \"$c: \"; docker exec $c sh -c 'cat /proc/1/cmdline | tr \"\\000\" \" \"'; echo; done").strip())
say("1.8 an unknown page ->", lan("/felhom-no-such-page-xyz/", "-H", "Accept: text/html"), "| an unknown API ->", lan("/api/felhom-no-such"))
say("0.4 outbound hosts named in the server's first-start log:", sorted(set(re.findall(r"https?://([a-z0-9.-]+\.[a-z]{2,})", w.guest("docker logs sparkyfitness-server 2>&1 | head -400"))))[:12])
# 4.4 — negative control
w.guest("docker stop sparkyfitness-server >/dev/null"); seen = []
for i in range(9):
time.sleep(5); s = state()
if not seen or seen[-1][1] != s: seen.append((5 * (i + 1), s))
say(f"4.4 sparkyfitness-server STOPPED — states (s, state): {seen}; the front door / -> {lan('/')} ; /api/health -> {lan('/api/health')}")
w.guest("docker start sparkyfitness-server >/dev/null")
for i in range(40):
time.sleep(5)
if state() == "running": say(f" running again {5*(i+1)} s after docker start"); break
# 2.7 size
say("2.7 volumes after the seed:", w.guest("for v in $(docker volume ls -q | grep sparkyfitness); do echo -n \"$v=$(du -sh /var/lib/docker/volumes/$v/_data | cut -f1) \"; done").strip())
# 2.5 backup → remove keeping backups → restore → read back
code, d = w.ctl("POST", "/api/debug/backup/night-chain"); say("2.5 the night chain (debug action) ->", code)
for _ in range(60):
if "finished in" in w.guest("docker logs --since 3m felhom-controller 2>&1 | grep 'night-chain\\] finished' | tail -1"): break
time.sleep(5)
say(" restore points:", [(s.get("id") or s.get("snapshot_id"), s.get("time") or s.get("created")) for s in w.snapshots(APP)][:2])
w.ctl("POST", f"/api/stacks/{APP}/stop"); time.sleep(10)
code, d = w.ctl("POST", f"/api/stacks/{APP}/remove", {"remove_hdd_data": False, "remove_backups": False})
say(f"2.6 remove KEEPING backups -> {code} {str(d)[:220]}")
time.sleep(6); say(" left after:", w.guest(f"docker ps -a --format '{{{{.Names}}}}' | grep -E '^{APP}'; docker volume ls -q | grep -i {APP}").strip() or "nothing")
r = w.restore(APP); say("2.5 restore:", {k: r.get(k) for k in ("ok", "snapshot_id", "seconds", "state_after", "hold_after")})
w.wait_app(SUB, "/", want=("200",), tries=60)
say("2.5 the seed reads back after remove + restore:", FX.verify(w, SUB, tok, say))
say(" R-773 on a restored sparkyfitness: record", " | ".join(x.strip() for x in w.guest(f"grep -A8 '^setup_gate:' /opt/docker/stacks/{APP}/app.yaml").splitlines()[:7]),
"| a stranger signs up ->", lan("/api/auth/sign-up/email", "-X", "POST", "-H", "Content-Type: application/json", "-H", f"Origin: https://{HOST}", "--data", body))
# 2.6 remove with data
w.ctl("POST", f"/api/stacks/{APP}/stop"); time.sleep(10)
code, d = w.ctl("POST", f"/api/stacks/{APP}/remove", {"remove_hdd_data": True, "remove_backups": True})
say(f"2.6 remove WITH data and backups -> {code} {str(d)[:220]}")
time.sleep(6); say(" left after:", w.guest(f"ls -d /opt/docker/stacks/{APP} 2>/dev/null; docker ps -a --format '{{{{.Names}}}}' | grep -E '^{APP}'; docker volume ls -q | grep -i {APP}").strip() or "nothing")
w.guest("rm -f /root/sp-poll.sh /root/sp-poll.txt /root/sp-poll.body")
+12 -5
View File
@@ -864,8 +864,8 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-750** | **[P3-LOW] The registry no longer holds controller releases older than 0.213.0 (2026-08-12) — something removed them, and nothing records what.** MEASURED 2026-10-01 (anonymous registry API, `audits/rulings-2026-10-01/B/`): `felhom-controller` has 91 tags, the oldest release 0.213.0; `0.201.0` answers 404; Gitea's package list starts 2026-08-12. No runbook, row or memory names a clean-up. Today nothing needs those versions: a box runs a newer one, a whole-guest restore brings the guest's own Docker store back (mp0 `backup=1`), and decision 56 deletes only on the box. **But** a box or a backup that names a removed version cannot pull it again (R-698's shape, for the controller). **Needs:** find what removed them (a Gitea clean-up rule?), and record the rule — or say it was a one-time act. Read-only on DooPlex. **-- 2026-10-01 (afternoon):** **Answered (read only, `audits/lockouts-2026-10-01/C/C1-registry-read.txt`).** Not a Gitea rule: `package_cleanup_rule` is EMPTY (READ ONLY query on the shared CNPG); `[cron.cleanup_packages]` only runs rules and Gitea's own expired-data clean-up. The cause is a MANUAL run of DooPlex's `~/git/misc-scripts/gitea-image-prune.sh --all --keep 7 --apply --reclaim` on the night of 2026-08-22/23, recorded in homelab-manifests HM-024 (the Gitea volume was full: `felhom-golden` 22 → 3 versions, /data 14.8 → 4.4 G); `--keep 7` per container package explains controller 0.213.0 (2026-08-12) as the oldest left. Nothing schedules it (crontabs, timers, cluster CronJobs read). If run again as its usage text says, it keeps 7 controller releases (about a day) and `--type generic --keep 3` would cut the agent to 3; it protects no vouched version. **Needs:** the operator's word on a written rule (STATUS). **-- 2026-10-01 (late afternoon):** The rule built (`09` §3 decision 62, operator): `admin/misc-scripts` `c9d5ed5` — `gitea-image-prune.sh` keeps the newest 20 + every version in use (floor, vouched golden, vouched agent, `min_agent`, the golden's baked images, the running hub), refuses (exit 3) when that list is unreadable; `tests/test-prune-plan.sh` red-proofed. Live dry-run: protected controller 0.285.0, golden 0.285.0, agent 0.138.0 + 0.131.0, hub 0.126.0, felhom-samba 1.1.0; would delete 70 controller and 8 hub tags — nothing deleted (no `--apply`). `audits/calibre-name-and-prune-2026-10-01/B/` | **CLOSED 2026-10-01 — decision 62, misc-scripts c9d5ed5** |
| **R-751** | **[P2] The image clean-up after an app update could crash the whole controller: it re-read the app after a rescan and dereferenced a nil stack when the app was gone.** FOUND 2026-10-01 by the full test suite (controller v0.284.2): `RetainImagesAfterUpdate` runs in a goroutine; `TestR705_TheManualLegRunsByDay` removed its temp dir under it → `panic: invalid memory address` at `image_retention.go:291`. In a box the same happens when an app is removed (or its compose vanishes) between an update's end and the clean-up — a panic in a goroutine ends the process (the agent's supervisor restarts it). Fixed in v0.285.0 the same session: it returns when the app is gone; `TestRetainImagesAfterUpdate_AppGoneDoesNotPanic` seen panicking on the old code; both retention seams are no-ops in the stacks tests (`TestMain`), so no test leaves the goroutine running. `audits/rulings-2026-10-01/B/B1-red-proofs.txt` **-- 2026-10-01:** Delivered: floor 0.285.0 reached both demo boxes in ~6 s (hub `managed floor SERVED … from declared`). | **CLOSED 2026-10-01 — controller v0.285.0, floor 0.285.0** |
| **R-752** | **[P3-LOW] Four more catalog apps let a stranger lock the household out with wrong passwords for a known login name — like mealie (R-747).** READ 2026-10-01 in each app's source at its pinned tag (not measured live): **calibre-web-automated v4.0.8** — Flask-Limiter on the login keyed on the lowercased USERNAME, 3/minute and 40/day, checked before the password; the default login is `admin` → up to a day; no env switch (a database setting). **wger 2.7** — django-axes keyed on IP, 10 failures, 30 min, each failure restarts it; behind traefik every client has traefik's IP → everyone is locked out (`AXES_*` env vars exist; `AXES_IPWARE_PROXY_COUNT` 0). **Grafana 13.2.3** — per-account, 5 failures in a sliding 5 minutes; a slow trickle keeps it closed (`GF_SECURITY_*`). **BookStack 26.09.1** — key `email|ip`, 5 tries, 60 s, hard-coded; `APP_PROXIES` empty, so the key is the e-mail alone. gokapi (3 s delay, no lock) and claper (per-IP 10/min, no account lock) cannot. **Needs:** per app, the smallest fix that keeps a guessing guard (calibre-web-automated and wger first — longest and broadest), each proven on 9202 as R-747's was. **-- 2026-10-01 (afternoon):** **Measured on 9202, each through traefik as a stranger with the public name** (`audits/lockouts-2026-10-01/B/`): **wger** — control: 10 wrong on `admin` locked the second member too; FIXED (decision 58, catalog `82fff32`): username, 5 min, database handler — the second member unaffected, admin in again at 7.5 min (each try during a lock restarts it — measured: 8-minute retries kept a 15-minute lock closed 40+ min). **BookStack** — 1.0 min, kept (decision 59). **Grafana** — 5.0 min, kept (decision 60); a trickle did not hold the household out once the burst aged. **calibre-web-automated** — the form locks 3/min (1.2 min measured) and **40/day per name: after 40 wrong tries in 14 min the right password was refused 2 min later still; only an app restart cleared it** (in-memory store); OPDS has its own 3/min per name (`cps/main.py:75`), no daily limit. No knob for the daily length; both fixes have a household cost — operator decision in STATUS. Installed apps: a settings-only change reaches the stack file at the next sync (images equal, ≤15 min) and the running app at the next `compose up -d` — Restart/Start (measured: the env changed only at Restart), an Update, or a backup's restart (`backup.go:972`, read). **-- 2026-10-01 (late afternoon):** calibre-web done by operator ruling `09` §3 decision 61 (catalog `e9f50b5`): a generated `ADMIN_USER` (`secret`, `hex:5`); `after_install` renames `admin` to it and proves it. 9202: 40 wrong tries on `admin`, the household in at once with its own name (form and OPDS). demo-hp renamed by hand; its name is in the operator's credentials file. All four apps answered (wger 58, BookStack 59, Grafana 60, calibre-web 61). An installed calibre-web is given a made-up name by the box — R-757. | **CLOSED 2026-10-01 — decisions 58–61** |
| **R-753** | **[P3-LOW] Behind the tunnel every visitor reaches an app with the SAME address — the tunnel container's — so every per-address guard is an "everyone" guard and every app's log is blind.** MEASURED 2026-10-01 (`audits/lockouts-2026-10-01/A/A1-client-address.txt`): on demo-hp through its real tunnel, a request from DooPlex's public address reached traefik as `172.18.0.5` (cloudflared, in the guest on `traefik-public`) and BookStack as `172.18.0.3` (traefik); on 9202 an echo container showed `X-Forwarded-For`/`X-Real-Ip` = the sending container for the tunnel's hop (traefik DROPS the incoming chain — good: a client cannot forge it) and the real address from the LAN; `CF-Connecting-IP` passes untouched and is FORGEABLE from the LAN. **No box-wide fix taken:** trusting cloudflared in traefik passes Cloudflare's appended chain, whose LEFTMOST entry the client writes — every app reading the leftmost address would believe it; cloudflared's address is docker-assigned; a single-address rewrite needs a traefik plugin (a new dependency). Per-app fixes trust no header (R-752). **Needs (operator):** whether to build a safe version (cloudflared on a fixed-address network + traefik trusting only it + per-app proxy counts), or keep "one address" and fix per app. Only ONE outside address was available (DooPlex has no IPv6); a second was not measured. | **OPEN — rank P3-LOW; owner: operator (direction), CC measures** |
| **R-754** | **[P3-LOW] `01-topology-and-trust.md` §7 says cloudflared runs on the Proxmox HOST as an agent-managed service; on every box it runs INSIDE the guest as a container the controller renders.** READ 2026-10-01: `felhom-controller` `internal/infra/templates/cloudflared-compose.yml.tmpl` (`container_name: cloudflared`, network `traefik-public`); demo-hp's guest 9201 runs `cloudflared` (ingress `*.enkisfelhom.hu -> https://traefik`); R-505 saw the same in VM 331. A design decision that the build does not follow — the document or the build is wrong, and only the operator decides which (R-370: a design decision is not a defect). | **OPEN — rank P3-LOW; owner: operator (which is right)** |
| **R-753** | **[P3-LOW] Behind the tunnel every visitor reaches an app with the SAME address — the tunnel container's — so every per-address guard is an "everyone" guard and every app's log is blind.** MEASURED 2026-10-01 (`audits/lockouts-2026-10-01/A/A1-client-address.txt`): on demo-hp through its real tunnel, a request from DooPlex's public address reached traefik as `172.18.0.5` (cloudflared, in the guest on `traefik-public`) and BookStack as `172.18.0.3` (traefik); on 9202 an echo container showed `X-Forwarded-For`/`X-Real-Ip` = the sending container for the tunnel's hop (traefik DROPS the incoming chain — good: a client cannot forge it) and the real address from the LAN; `CF-Connecting-IP` passes untouched and is FORGEABLE from the LAN. **No box-wide fix taken:** trusting cloudflared in traefik passes Cloudflare's appended chain, whose LEFTMOST entry the client writes — every app reading the leftmost address would believe it; cloudflared's address is docker-assigned; a single-address rewrite needs a traefik plugin (a new dependency). Per-app fixes trust no header (R-752). **Needs (operator):** whether to build a safe version (cloudflared on a fixed-address network + traefik trusting only it + per-app proxy counts), or keep "one address" and fix per app. Only ONE outside address was available (DooPlex has no IPv6); a second was not measured. **-- 2026-10-01 (evening): operator ruling `09` §3 decision 63 (extend the box's own gate; first the box tells visitors apart). BUILT, controller v0.286.1 (v0.286.0 never floored):** cloudflared alone on `felhom-tunnel` at the fixed `172.16.253.2`, traefik trusts forwarded headers from it only, an entrypoint middleware removes client-writable host/path/address headers (measured: Cloudflare passes a client's `X-Forwarded-Host`/`-Port` and APPENDS to its `X-Forwarded-For`); the controller reads the hop traefik saw (`clientaddr.go`). 19 catalog apps that read the LEFTMOST entry have the chain removed on their router (catalog `04e9516`..`50e4fb4`). **Live:** demo-hp's REAL tunnel — the app sees `6.6.6.6,37.191.56.193, 172.16.253.2`; the stranger's 5 wrong dashboard logins (rotating forged XFF) locked only `37.191.56.193`; docmost (reset) still throttles a rotating forger at try 11; every demo-hp app answers through the tunnel; 9202 simulated tunnel: the household from another address in at once, LAN/impostor forgeries counted as themselves. Both demo boxes reconciled traefik + cloudflared by themselves. Design + sweep of all 56: `audits/visitors-2026-10-01/A/`. Left: settings for right-walking apps (R-776), Emby/Jellyfin LAN rights (R-777), the roll-back window (R-778), a second outside address on the real tunnel (R-779). | **CLOSED 2026-10-01 — controller v0.286.1 (rows R-776..R-779 carry what is left)** |
| **R-754** | **[P3-LOW] `01-topology-and-trust.md` §7 says cloudflared runs on the Proxmox HOST as an agent-managed service; on every box it runs INSIDE the guest as a container the controller renders.** READ 2026-10-01: `felhom-controller` `internal/infra/templates/cloudflared-compose.yml.tmpl` (`container_name: cloudflared`, network `traefik-public`); demo-hp's guest 9201 runs `cloudflared` (ingress `*.enkisfelhom.hu -> https://traefik`); R-505 saw the same in VM 331. A design decision that the build does not follow — the document or the build is wrong, and only the operator decides which (R-370: a design decision is not a defect). **-- 2026-10-01 (evening):** the operator's brief: the build is right, correct the document. `01-topology-and-trust.md` §7 now says cloudflared runs INSIDE the guest as a controller-rendered container (and, since v0.286.0, at a fixed address on `felhom-tunnel`), and states the consequence: the data path is not independent of the guest. | **CLOSED 2026-10-01 — document corrected** |
| **R-755** | **[P3-LOW] wger runs Django's DEVELOPMENT server in production: `manage.py runserver`, because the template does not set `WGER_USE_GUNICORN=True`.** MEASURED 2026-10-01 on 9202 (`ps` in the wger container: `python3 manage.py runserver 0.0.0.0:8000`); wger 2.7's `extras/docker/production/entrypoint.sh:81-87` runs gunicorn only with that switch. Django's own documentation says runserver is not for production (one process, not hardened). Not changed this session (a different change from R-752's; needs its own bench + box proof, memory watch included). **-- 2026-10-01 (checklist pilot):** re-measured on 9202 at the live template: still `manage.py runserver` (`audits/new-app-checklist-2026-10-01/C/C2-static-reads.txt`). The same server question now carries R-762 — runserver with DEBUG off serves no `/static` and no `/media`, so the fix for both is one decision (upstream's nginx front, or gunicorn + a static server). | **OPEN — rank P3-LOW; owner: CC (catalog)** |
| **R-756** | **[P3-LOW] On 9202, "remove with drive data" refuses calibre-web with 409 „…/scratch_hdd/userdata/calibre-web tárhely jelenleg nem elérhető", while the controller container lists that folder.** MEASURED twice on 2026-10-01 (`audits/lockouts-2026-10-01/B/B1…`, `audits/calibre-name-and-prune-2026-10-01/A/A1…`): `POST /api/stacks/calibre-web/remove` with `remove_hdd_data` → 409; `docker exec felhom-controller ls -ld /mnt/felhom-drives/scratch_hdd/userdata/calibre-web` → the directory (dated 2026-09-22). The walk then removed the app keeping the data (R-442's fail-closed answer). Either the drive is not a registered drive on this scratch box (a test-venue artefact) or the resolver reads another path than the one it names. Not measured which. **-- 2026-10-01 (night, new apps):** the same 409 for Grimmory (`remove_hdd_data`), and a drive app's per-app backup is NOT offered for restore after a remove — the controller logged `drive … not mounted — skipping ensure (held by drive gate)`; the unit lives on that drive. So on 9202 checklist row 2.5 cannot be shown for any drive app until its scratch drive is a registered drive (`audits/new-apps-2026-10-01/box/grimmory/restore-why.txt`). | **OPEN — rank P3-LOW; owner: CC** |
| **R-757** | **[P3-LOW] A template that gains a generated `secret` field makes the box INVENT that value for apps already installed — for calibre-web a login name the app never got.** MEASURED 2026-10-01 on demo-hp: 9 minutes after catalog `e9f50b5` (decision 61) synced, the controller logged `InjectMissingFields … injected missing fields: ADMIN_USER` (deploy.go:1337) and the app page's reveal returned a 10-character name that was NOT calibre-web's login (the app had kept its own name; `after_install` runs only after a fresh install). The page did not list the field, but the reveal answers it, and the password field's text now says "the user name above". demo-hp was fixed by renaming the app's user to the box's recorded name (credentials file updated). Any other installed calibre-web gets the same made-up name at its next sync while its login stays `admin` (no other box has one today: N100 none, Tester-2 not registered). **Needs:** InjectMissingFields must not invent a value an app has to have been GIVEN (a field consumed only by `after_install`), or such a field needs an "installed apps: ask" path. `audits/calibre-name-and-prune-2026-10-01/A/A2…, A3…` | **OPEN — rank P3-LOW; owner: CC (controller)** |
@@ -883,10 +883,17 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-769** | **[P3-LOW] Pinchflat is not built: upstream is paused (no release in 2026, last push 2025-12-16) and its last release has no image tag.** READ 2026-10-01: ghcr's newest version tag `v2025.6.6`, `latest` amd64 only; runs as root by default; an unanswered 30 GB yt-dlp memory report (#866); third parties call it unmaintained (community-scripts #15968). Forks with images exist (Pinchflat-NGX, MorganKryze). **Needs:** the operator's word on a fork (a new upstream), after the YouTube sentence (R-767). `audits/new-apps-2026-10-01/FIT.md` | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-770** | **[P3-LOW] Invidious — fit check only; the recommendation is not to build it.** READ 2026-10-01: playback needs `invidious-companion` (rolling `latest`, no version tags); PostgreSQL 14 (EOL 2026-11); `registration_enabled: true` by default; upstream: a bot check means „your IP is blocked from YouTube”, a 429 can last 24 h, triggered by „someone on your network” — on our boxes that IP is the household's. One bad period in 2026 (March, ~2 weeks). No report found of a family's other devices being bot-checked (inference). **Needs:** the operator's go / no-go. `audits/new-apps-2026-10-01/FIT.md` | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-771** | **[P3-LOW] moonlight-web — fit check only; not buildable through an HTTP-only tunnel at usable latency.** READ 2026-10-01: two unrelated projects (MrCreativ3001/moonlight-web-stream, the original; linckosz/moonlight-web); both need Sunshine/Apollo/Wolf on a gaming PC on the LAN and WebRTC over UDP (40000-40100/udp; linckosz recommends host networking and sends telemetry by default); both have a WebSocket fallback (high latency, all video through the tunnel); a logged-in user controls the PC's desktop. **Needs:** the operator's go / no-go (LAN-only use would need a different publishing model). `audits/new-apps-2026-10-01/FIT.md` | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-772** | **[P3-LOW] A health probe that finds NO container to probe records `healthy: true` — and the next check is 5 minutes away.** MEASURED 2026-10-01 on 9202 (controller 0.285.0, Karakeep): with the app container stopped, the probe's record read `{type: none, target: karakeep, healthy: true, message_key: health.no_probe_container}` and stayed so 4+ minutes (`RunHealthProbes: skipping karakeep — last check …, effective interval 5m0s, healthy=true`). The app's STATE did read `degraded` within 10 s, so the household saw it; the probe record alone says healthy about a check that did not run (the presence-is-not-success shape). Not checked: which readers use `health_probe.healthy` (the guarded Update's `verifying`? the hub report?). **Needs:** a not-run probe recorded as not-healthy (or `unknown`), with a test that pins it. `audits/new-apps-2026-10-01/box/karakeep-768M/neg-and-crawl.txt` | **READY — rank P3-LOW; owner: CC (controller)** |
| **R-773** | **[P3-LOW] After a remove + restore, an app's sign-up route block (decision 47) is gone; only the app's own switch still refuses.** MEASURED 2026-10-01 on 9202 (Karakeep): before — `/signup` 403 and tRPC `users.create` 403; after the household removed the app (keeping backups) and pressed restore — `/signup` answers 200, `users.create` still 403 (the restored env keeps `DISABLE_SIGNUPS=true`). For an app with NO own switch (opengist, wishlist: block only) a remove + restore would reopen sign-up entirely — not measured. **Needs:** the restore re-applies the lock record's block (or the gate) for an app whose template has `signup_block`, with a test; then measured on a block-only app. `audits/new-apps-2026-10-01/box/karakeep/restore.txt` | **READY — rank P3-LOW; owner: CC (controller)** |
| **R-772** | **[P3-LOW] A health probe that finds NO container to probe records `healthy: true` — and the next check is 5 minutes away.** MEASURED 2026-10-01 on 9202 (controller 0.285.0, Karakeep): with the app container stopped, the probe's record read `{type: none, target: karakeep, healthy: true, message_key: health.no_probe_container}` and stayed so 4+ minutes (`RunHealthProbes: skipping karakeep — last check …, effective interval 5m0s, healthy=true`). The app's STATE did read `degraded` within 10 s, so the household saw it; the probe record alone says healthy about a check that did not run (the presence-is-not-success shape). Not checked: which readers use `health_probe.healthy` (the guarded Update's `verifying`? the hub report?). **Needs:** a not-run probe recorded as not-healthy (or `unknown`), with a test that pins it. `audits/new-apps-2026-10-01/box/karakeep-768M/neg-and-crawl.txt` **-- FIXED controller v0.286.1:** a not-run probe records `healthy: false, not_checked: true`, is looked at on the next tick (0.286.0 still waited out the last healthy record's 5-minute interval — found live, fixed in .1), the state stays the containers' (R-630 holds), the app page says so. Readers checked: `health_probe` feeds only the state override and the API/page; the hub gets container states, never the probe record. **Live on 9202 (0.286.1):** paperless-webserver stopped 19:48:33 → `healthy false, not_checked true` at 19:48:47; started 19:49:05 → healthy at 19:49:47. Red-proofs RP-D1, RP-D1b. `audits/visitors-2026-10-01/D/`. | **CLOSED 2026-10-01 — controller v0.286.1** |
| **R-773** | **[P3-LOW] After a remove + restore, an app's sign-up route block (decision 47) is gone; only the app's own switch still refuses.** MEASURED 2026-10-01 on 9202 (Karakeep): before — `/signup` 403 and tRPC `users.create` 403; after the household removed the app (keeping backups) and pressed restore — `/signup` answers 200, `users.create` still 403 (the restored env keeps `DISABLE_SIGNUPS=true`). For an app with NO own switch (opengist, wishlist: block only) a remove + restore would reopen sign-up entirely — not measured. **Needs:** the restore re-applies the lock record's block (or the gate) for an app whose template has `signup_block`, with a test; then measured on a block-only app. `audits/new-apps-2026-10-01/box/karakeep/restore.txt` **-- FIXED controller v0.286.0:** a REMOVED app restored from its backup gets the lock record (`opened_by: restore`) and the block written before anything starts; the loop sets the app's own switch; an installed app the household never closed keeps what it had (decision 49). **Live on 9202:** Karakeep — before: `/signup` 403, `users.create` 403; removed keeping backups; restored → record `opened_by: restore`, `native_lock: applied`, block file present, a stranger's `/signup` 403 and `users.create` 403, the bookmark read back. Red-proof RP-D2. Block-only apps (opengist, wishlist) share the code path, not measured. `audits/visitors-2026-10-01/D/r773-live.txt`. | **CLOSED 2026-10-01 — controller v0.286.0** |
| **R-774** | **[P3-LOW] Two things the new apps' pages do not show yet: Karakeep's mail-ON path is unproven, and its official phone app reports crashes to its makers.** READ/MEASURED 2026-10-01: Karakeep's `smtp_mapping` (plaintext :2526, as Cal.com) was proven only with mail OFF (a fresh install boots) — 9202 has no hub, so the relay cannot be exercised there; the official mobile app ships Sentry crash reporting with a hard-coded DSN (`apps/mobile/app/_layout.tsx`, FIT.md). **Needs:** one password-reset mail from Karakeep on a hub-enabled box (demo-hp 9201, a throwaway install); and a sentence on the page about the phone app (copy, freeze). `audits/new-apps-2026-10-01/bench/karakeep-mail-off-boot.txt` | **READY — rank P3-LOW; owner: CC (catalog)** |
| **R-775** | **[P2-MEDIUM] Grimmory: a stranger's 5 wrong sign-ins lock EVERY visitor out of the web login for 15 minutes — so Grimmory was not published.** MEASURED 2026-10-01 on 9202 (drill catalog, v3.4.1, through traefik): after 5 wrong tries for `admin` every further sign-in answered 429 — the household's right password AND a different name — and stayed 429 for 10+ minutes of retries. Read in the jar: `AuthRateLimitService` — Caffeine `expireAfterWrite(ofMinutes(15))`, `MAX_ATTEMPTS 5`, keys `login:ip:` and `login:user:`; Spring `forward-headers-strategy: native` takes the address from X-Forwarded-For, and behind the tunnel every visitor is the tunnel container's address (R-753) — the wger shape (R-752), with no setting to change it. Everything else in the checklist passed (bench + box step v3.4.1 → v3.5.0, gate by its own probe, OPDS through traefik); two smaller findings for the publishing session: on a reinstall over the first install's kept books, a new upload was saved to the drive but not added to the library (`box/grimmory/reinstall-c1.txt`, not investigated); and the remove + restore round trip (2.5) cannot be shown on 9202 for a drive app — its backup lives on the scratch drive, which is not a registered drive (R-756). The template waits in `audits/new-apps-2026-10-01/wip/grimmory/`. **Needs (operator):** (A) publish with a sentence on the page that wrong guesses by others can lock the login for 15 minutes (MEASURED: during the lock an e-reader's OPDS feed still answered 200 with its own login, wrong 401 — `box/grimmory/opds-under-lock.txt`), or (B) wait until the box passes each visitor's real address (R-753). `audits/new-apps-2026-10-01/box/grimmory/throttle.txt` | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (A/B), CC publishes** |
| **R-775** | **[P2-MEDIUM] Grimmory: a stranger's 5 wrong sign-ins lock EVERY visitor out of the web login for 15 minutes — so Grimmory was not published.** MEASURED 2026-10-01 on 9202 (drill catalog, v3.4.1, through traefik): after 5 wrong tries for `admin` every further sign-in answered 429 — the household's right password AND a different name — and stayed 429 for 10+ minutes of retries. Read in the jar: `AuthRateLimitService` — Caffeine `expireAfterWrite(ofMinutes(15))`, `MAX_ATTEMPTS 5`, keys `login:ip:` and `login:user:`; Spring `forward-headers-strategy: native` takes the address from X-Forwarded-For, and behind the tunnel every visitor is the tunnel container's address (R-753) — the wger shape (R-752), with no setting to change it. Everything else in the checklist passed (bench + box step v3.4.1 → v3.5.0, gate by its own probe, OPDS through traefik); two smaller findings for the publishing session: on a reinstall over the first install's kept books, a new upload was saved to the drive but not added to the library (`box/grimmory/reinstall-c1.txt`, not investigated); and the remove + restore round trip (2.5) cannot be shown on 9202 for a drive app — its backup lives on the scratch drive, which is not a registered drive (R-756). The template waits in `audits/new-apps-2026-10-01/wip/grimmory/`. **Needs (operator):** (A) publish with a sentence on the page that wrong guesses by others can lock the login for 15 minutes (MEASURED: during the lock an e-reader's OPDS feed still answered 200 with its own login, wrong 401 — `box/grimmory/opds-under-lock.txt`), or (B) wait until the box passes each visitor's real address (R-753). `audits/new-apps-2026-10-01/box/grimmory/throttle.txt` **-- 2026-10-01 (evening):** option B's precondition SHIPPED (controller v0.286.1, R-753): Grimmory's Tomcat RemoteIpValve walks from the right and counts `172.16.0.0/12` as a proxy (READ in source, Spring Boot 4.1.1 — not yet measured with Grimmory's own lock), so `login:ip:` becomes per visitor; `login:user:` still lets a stranger lock the public name `admin` 15 min. A third route was spiked and passed: Grimmory behind the permanent family gate with its e-reader paths excepted (R-780). Recommendation: publish behind the family gate if R-780 is built; otherwise B with a measured 3.6. | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (A / B / behind R-780), CC publishes** |
| **R-776** | **[P3-LOW] Right-walking catalog apps need ONE setting to see each visitor since v0.286 (R-753); without it they keep the tunnel's one address (a stranger can still trip their per-address limits for everyone).** READ in source (`audits/visitors-2026-10-01/A/sweep/`): kimai `TRUSTED_PROXIES=127.0.0.1,172.16.0.0/12`; zipline `CORE_TRUST_PROXY=true` + `CORE_TRUSTED_PROXIES=172.16.0.0/12`; vikunja `VIKUNJA_SERVICE_IPEXTRACTIONMETHOD=xff`; nextcloud `TRUSTED_PROXIES=172.16.0.0/12`; n8n `N8N_PROXY_HOPS=2` (optional). BookStack `APP_PROXIES` measured this session (see its catalog commit). **Needs:** per app, the setting + checklist 3.6 re-measured on 9202 through the simulated tunnel (the BookStack shape, `audits/visitors-2026-10-01/tools/bookstack_36.py`). Count readers (calibre-web, tandoor, wger) stay as they are — a fixed count is wrong for one of the two paths. | **READY — rank P3-LOW; owner: CC (catalog)** |
| **R-777** | **[P2-MEDIUM] Emby and Jellyfin treat every internet visitor as being on the LAN — users with "remote access" off can sign in from the internet, IP filters and remote limits are skipped.** READ in source (`audits/visitors-2026-10-01/A/sweep/sweep-1.md`, `sweep-2.md`), not measured live: Jellyfin with `KnownProxies` empty uses the TCP peer (traefik, private) → "LAN"; Emby reads the leftmost XFF (its chain is now removed by the R-753 reset, so it sees cloudflared's private address → "LAN", as before). True before R-753 too; R-753 neither caused nor fixed it. **Needs:** measure on 9202 (a user with remote access off, through the simulated tunnel); Jellyfin: `KnownProxies` `172.16.0.0/12` in `network.xml` (no env — an `after_install` or a seed file); Emby: no setting fixes it (its `LocalNetworkSubnets` still counts private ranges) — a page sentence or a decision. | **READY — rank P2-MEDIUM; owner: CC (measure), operator (Emby route)** |
| **R-778** | **[P3-LOW] A box that rolls back to a controller ≤ 0.285 after v0.286 keeps the new traefik (an old controller never rewrites a running traefik) — and the old `clientIP` believes the LEFTMOST X-Forwarded-For, which a stranger then writes: the dashboard's login counter becomes dodgeable until the box moves forward again.** Reasoned from the code (old `claim.go` clientIP + v0.286 traefik trust), not measured. The floor never moves back; the window is the self-update's crash roll-back. **Needs:** decide whether that window matters (it closes at the next floor); if it does, a 0.285.x patch that reads the rightmost hop, or the self-update refusing to roll back across v0.286. | **OPEN — rank P3-LOW; owner: CC** |
| **R-779** | **[P3-LOW] Part A's "two outside addresses seen as two" is proven through the simulated tunnel only; on the REAL tunnel the second outside address (ep0, one request allowed) was refused by Cloudflare's edge with 403 and never reached the box.** Measured 2026-10-01 19:51 UTC (`audits/visitors-2026-10-01/A/L2-demo-hp-real-tunnel.txt`): no log line on demo-hp; demo-hp's box has no geo restriction in its settings, so a Cloudflare ZONE rule (country or bot, not read) refused a German datacenter address. DooPlex's own address on the real tunnel was seen as itself. **Needs:** one sign-in from a second Hungarian address (the operator's phone off wifi) while DooPlex is locked out — 2 minutes; and say which Cloudflare rule refused ep0. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator (a phone), CC reads the logs** |
| **R-780** | **[P2-MEDIUM] A permanent household gate with family accounts — the spike PASSED; the build waits for the operator's go (`09` §3 decision 63).** Measured on 9202 2026-10-01 (`audits/permanent-gate-2026-10-01/VERDICT.md`, exit test committed before): a stranger reached nothing of Grimmory or MeTube (36 requests incl. websockets); family members with their own logins got in for 30 days, logout worked; a stranger's guesses locked only the stranger; Grimmory's OPDS/Kobo/KOReader worked through anchored path exceptions with the app's own login; the family login never opened the dashboard; +0.4 ms per request; the gate down → apps refuse (500). **Build requirement F1:** exceptions must be anchored (`PathPrefix(/api/v1/opds)` also matched `/api/v1/opdsx`). **Cost:** 2 sessions (controller release; catalog — Grimmory and MeTube published behind it). If nothing is decided: Grimmory stays held (R-775) and MeTube unpublished (R-767). | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (go/no-go), CC builds** |
| **R-781** | **[P3-LOW] The catalog's `scripts/test_gate_decoys.py` fails 4 of its own "genuine" onboarding cases — on the untouched tree.** Measured 2026-10-01 (same 4 FAIL lines before and after this session's checklist edit): the harness copies the catalog into a temp tree with a fake sibling `felhom.eu`, and the REAL published records (radicale, karakeep, dawarich) name evidence that the fake sibling lacks, so a complete record reads incomplete. The gate itself (`onboarding`) is green on the real tree. **Needs:** the genuine cases build their own records, or the fake sibling mirrors the cited evidence. | **READY — rank P3-LOW; owner: CC (catalog)** |
| **R-782** | **[P3-LOW] Two side observations of the R-753 sweep, inferred, not measured:** glance's seeded `glance.yml` has no `auth:` block (the dashboard is public to anyone with the address), and homepage's `/api/*` refuses a Host not in `HOMEPAGE_ALLOWED_HOSTS`, which the template does not set (widgets may 400). **Needs:** measure both on 9202; glance: decide whether a public link dashboard is intended (the setup gate does not cover it after setup). | **READY — rank P3-LOW; owner: CC (catalog)** |
<!-- DUE-CHECKS-BEGIN — machine-readable. Parsed by scripts/due_checks_gate.py.
One row per dated check. The R-number must have a row above. Dates are UTC.
@@ -0,0 +1,27 @@
## 2026-10-01T19:54:56Z golden 0.286.1 — bake in the drill VM (RUNBOOK-manual-build §4.0/§4.1)
reverted to virgin (this also proves no qemu holds the qcow2)
cold boot started
ssh up: pve-manager/9.2.2/b9984c6d90a4bd80 (running kernel: 7.0.2-6-pve)
system debian-13-standard_13.6-1_amd64.tar.zst
template (current point release, listed not assumed): debian-13-standard_13.6-1_amd64.tar.zst
template downloaded
script (v3.0.0) + token landed, non-empty, executable
bake launched 2026-10-01T19:55:45Z
token leak check on the unit (needle non-empty): 0
unit state: inactive at 2026-10-01T20:01:50Z
log copied off the machine FIRST: 323 lines
markers: overlay2=1 mountpoints=2 upload=1 FATAL=0 excluding=0
docker OK (overlay2; data-root /var/lib/docker)
INFO: including mount point rootfs ('/') in backup
INFO: including mount point mp0 ('/var/lib/felhom') in backup
[golden] upload OK (HTTP 201)
GOLDEN_VERSION=0.286.1
GOLDEN_SHA256=1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89
token-leak grep on the saved log: 0
positive control (token appended to a throwaway copy): 1
REGISTRY CHECK (the outcome, not the attempt): golden 0.286.1 -> http=206
secrets shredded (3 expected absent): 3
pct list lines after destroy: 0
qemu processes: 0
disk reverted to virgin
## bake finished 2026-10-01T20:02:18Z
@@ -0,0 +1,3 @@
## 2026-10-01T20:02:27Z anonymous full download (no auth header)
http=200 bytes=652070141
1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89 golden.tar.zst
@@ -0,0 +1,17 @@
## BEFORE: agent 0.138.0 (55916026…), golden 0.285.0 (df5ec1f2…), min_agent 0.131.0
## 2026-10-01T20:03:00Z the vouch: golden 0.286.1 + agent 0.138.0 + min_agent 0.131.0 (MinAgent from the controller CHANGELOG v0.286.1 header); golden sha == the round trip
HTTP/1.1 303 See Other
Location: /configuration?flash=artifacts_set
2026/10/01 22:03:24 [INFO] Artifact manifest set: agent=0.138.0 golden=0.286.1 min_agent="0.131.0" wrapper_sha=false
## AFTER:
name="min_agent" value="0.131.0"
<option value="0.138.0" data-sha="55916026001790a79ebf97d32c032610cfde8e09d02979b9b9d8c2cbc5d88195" selected
<option value="0.286.1" data-sha="1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89" selected
name="min_agent" value="0.131.0"
## 2026-10-01T20:03:25Z R-120 negative control: try golden 0.285.0 now
HTTP/1.1 303 See Other
Location: /configuration?flash=golden_behind_fleet
manifest after the refusal (must still be 0.286.1 / 0.138.0):
name="min_agent" value="0.131.0"
<option value="0.286.1" data-sha="1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89" selected
name="min_agent" value="0.131.0"
@@ -0,0 +1,9 @@
# golden 0.286.1 — 2026-10-01 (controller v0.286.1: the box tells visitors apart, R-753; R-772; R-773)
Baked in the drill VM on DooPlex per `RUNBOOK-manual-build.md` §4.0/§4.1 by `bake-driver.sh` (this folder; the token goes
file → file and is read inside the VM). Markers: overlay2 1, mount points rootfs + mp0, upload OK (HTTP 201), FATAL 0,
excluding 0. `GOLDEN_SHA256=1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89`.
Token leak: 0 in the unit, 0 in the saved logs, positive control 1. Registry range-GET 206; an anonymous full download
(652 070 141 bytes) hashes to the same sha (`02-round-trip.txt`). Vouched — three fields: golden 0.286.1, agent 0.138.0,
min_agent 0.131.0 (the v0.286.1 CHANGELOG header); the R-120 gate then refused golden 0.285.0 (`05-vouch.txt`).
Teardown: CT 9100 destroyed, secrets shredded (3/3), qemu exited, the disk reverted to `virgin`.
@@ -0,0 +1,48 @@
#!/bin/bash
# bake.sh <VER> — golden bake per RUNBOOK-manual-build §4.0/§4.1 (shape of evidence-golden-0283). Secrets: the Gitea token
# goes file -> file and is read INSIDE the VM; never on a command line here.
set -u
VER=$1; D=/mnt/5_hdd/felhom.eu/drill; Q=$D/drill.qcow2; K=$D/id_drill
EVG=/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/evidence-golden-0286-2026-10-01
S="ssh -i $K -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=5 root@localhost"
say(){ echo "$*"; }
say "## $(date -u +%FT%TZ) golden $VER — bake in the drill VM (RUNBOOK-manual-build §4.0/§4.1)"
n=$(ps -eo comm | grep -c '^qemu-system-x86'); [ "$n" = 0 ] || { say "FATAL qemu already running ($n)"; exit 1; }
qemu-img snapshot -a virgin $Q && say " reverted to virgin (this also proves no qemu holds the qcow2)" || { say FATAL revert; exit 1; }
qemu-system-x86_64 -enable-kvm -cpu host -smp 4 -m 8192 \
-drive file=$Q,format=qcow2,if=virtio,cache=writeback \
-netdev user,id=n0,dhcpstart=10.0.2.30,hostfwd=tcp::2222-10.0.2.15:22 \
-device virtio-net-pci,netdev=n0 -display none -daemonize -pidfile $D/qemu.pid && say " cold boot started"
for i in $(seq 1 60); do $S true 2>/dev/null && break; sleep 5; done
say " ssh up: $($S pveversion 2>/dev/null)"
$S 'pveam update >/dev/null 2>&1; pveam available --section system | grep "debian-13-standard_.*_amd64"'
T=$($S 'pveam available --section system | grep -o "debian-13-standard_[^ ]*_amd64.tar.zst" | sort -V | tail -1')
say " template (current point release, listed not assumed): $T"
$S "pveam download local $T >/dev/null 2>&1 && echo ' template downloaded'"
scp -q -i $K -P 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /mnt/5_hdd/felhom.eu/git/felhom-agent/configs/build-golden.sh root@localhost:/root/build-golden.sh
scp -q -i $K -P 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ~/.gitea-token root@localhost:/root/.gitea-token
$S "chmod 0700 /root/build-golden.sh; chmod 0600 /root/.gitea-token; cat > /root/bake-run.sh <<EOS
#!/bin/bash
GT=\\\$(cat /root/.gitea-token)
export GITEA_USER=admin GITEA_TOKEN=\"\\\$GT\" REGISTRY_USER=admin REGISTRY_TOKEN=\"\\\$GT\"
exec /root/build-golden.sh 9100 local:vztmpl/$T local-lvm local vmbr0 gitea.dooplex.hu/admin/felhom-controller:$VER
EOS
chmod 0700 /root/bake-run.sh; [ -s /root/.gitea-token ] && [ -x /root/build-golden.sh ] && echo ' script ('\$(grep -o 'v[0-9]\\.[0-9]\\.[0-9]' /root/build-golden.sh | head -1)') + token landed, non-empty, executable'"
$S 'systemd-run --unit=golden-bake --collect bash -c "/root/bake-run.sh > /root/bake.log 2>&1" >/dev/null 2>&1' && say " bake launched $(date -u +%FT%TZ)"
say " token leak check on the unit (needle non-empty): $($S '[ -s /root/.gitea-token ] && systemctl show golden-bake -p Environment -p ExecStart | grep -c -F "$(cat /root/.gitea-token)"')"
for i in $(seq 1 180); do st=$($S 'systemctl is-active golden-bake' 2>/dev/null); [ "$st" = active ] || [ "$st" = activating ] || break; sleep 10; done
say " unit state: ${st:-gone} at $(date -u +%FT%TZ)"
$S 'cat /root/bake.log' > $EVG/bake-full.log; say " log copied off the machine FIRST: $(wc -l < $EVG/bake-full.log) lines"
L=$EVG/bake-full.log
say " markers: overlay2=$(grep -c 'docker OK (overlay2' $L) mountpoints=$(grep -c 'including mount point' $L) upload=$(grep -c 'upload OK (HTTP 201)' $L) FATAL=$(grep -c FATAL $L) excluding=$(grep -c excluding $L)"
grep -E 'docker OK \(overlay2|including mount point|upload OK|^GOLDEN_' $L | sed 's/^/ /'
say " token-leak grep on the saved log: $(grep -c -F "$(cat ~/.gitea-token)" $L)"
cp $L /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log; cat ~/.gitea-token >> /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log
say " positive control (token appended to a throwaway copy): $(grep -c -F "$(cat ~/.gitea-token)" /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log)"; shred -u /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/05c3d295-b388-481a-8c36-44a2a80b7d7d/scratchpad/pc.log
say " REGISTRY CHECK (the outcome, not the attempt): golden $VER -> http=$(curl -s -o /dev/null -w '%{http_code}' -r 0-0 https://gitea.dooplex.hu/api/packages/admin/generic/felhom-golden/$VER/golden.tar.zst)"
say " secrets shredded (3 expected absent): $($S 'shred -u /root/.gitea-token /root/bake-run.sh /root/bake.log; n=0; for f in /root/.gitea-token /root/bake-run.sh /root/bake.log; do [ -e $f ] || n=$((n+1)); done; echo $n')"
$S 'pct destroy 9100 --purge >/dev/null 2>&1; true'; say " pct list lines after destroy: $($S 'pct list | tail -n +2 | wc -l')"
$S 'poweroff' 2>/dev/null; for i in $(seq 1 60); do [ "$(ps -eo comm | grep -c '^qemu-system-x86')" = 0 ] && break; sleep 3; done
say " qemu processes: $(ps -eo comm | grep -c '^qemu-system-x86')"
qemu-img snapshot -a virgin $Q && say " disk reverted to virgin"
say "## bake finished $(date -u +%FT%TZ)"
@@ -0,0 +1,323 @@
[golden] build-golden.sh v3.0.0 — baking controller gitea.dooplex.hu/admin/felhom-controller:0.286.1
[golden] creating build LXC 9100 (nesting=1,keyctl=1, unprivileged; rootfs 32G + ONE data volume 24G @ /var/lib/felhom, backup=1) …
Logical volume "vm-9100-disk-0" created.
Logical volume pve/vm-9100-disk-0 changed.
Creating filesystem with 8388608 4k blocks and 2097152 inodes
Filesystem UUID: 9a94e4a2-9351-4468-a265-83ba1da76008
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Logical volume "vm-9100-disk-1" created.
Logical volume pve/vm-9100-disk-1 changed.
Creating filesystem with 6291456 4k blocks and 1572864 inodes
Filesystem UUID: 2ccf7dae-18c6-4008-925c-95e3c6644fa5
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
extracting archive '/var/lib/vz/template/cache/debian-13-standard_13.6-1_amd64.tar.zst'
Total bytes read: 553512960 (528MiB, 82MiB/s)
Detected container architecture: amd64
Creating SSH host key 'ssh_host_rsa_key' - this may take some time ...
done: SHA256:qGnAhy9fmbagcwP47HOob/pQVHft2qFpK+PS6Hv14ow root@felhom-golden
Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...
done: SHA256:bto+LlaK1Wx12SpJW4KPrbdDA0kGTx8fOdY8wiKPAL4 root@felhom-golden
Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...
done: SHA256:Q1JzgMRFrdZlCYLxAk1VeJlkj5wAhG+BPFAD2jjCOL4 root@felhom-golden
[golden] starting + installing Docker (official repo, trixie channel) …
apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct!
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = (unset),
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct!
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = (unset),
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
[golden] baking daemon.json: classic overlay2 driver (containerd-snapshotter OFF) + log rotation …
[golden] wiring the single data volume (R-165 variant V-c): /var/lib/felhom/{docker,sys_drive} -> binds …
[golden] verifying Docker works in the build guest (storage driver should be overlay2 on the ext4 data volume) …
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pulling fs layer
4f55086f7dd0: Verifying Checksum
4f55086f7dd0: Download complete
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
docker OK (overlay2; data-root /var/lib/docker)
/var/lib/docker is a real mount: /dev/mapper/pve-vm--9100--disk--1[/docker] ext4
/mnt/sys_drive is a real mount: /dev/mapper/pve-vm--9100--disk--1[/sys_drive] ext4
both paths are ONE filesystem: /dev/mapper/pve-vm--9100--disk--1 23317576
[golden] baking the in-guest controller image gitea.dooplex.hu/admin/felhom-controller:0.286.1 (no registry cred at deploy) …
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
0.286.1: Pulling from admin/felhom-controller
774043ccc8cc: Pulling fs layer
ab6b448d4be9: Pulling fs layer
23a5bfa58353: Pulling fs layer
862a57157567: Pulling fs layer
c6cc80087442: Pulling fs layer
a8dbfea3500a: Pulling fs layer
862a57157567: Waiting
c6cc80087442: Waiting
a8dbfea3500a: Waiting
23a5bfa58353: Verifying Checksum
23a5bfa58353: Download complete
774043ccc8cc: Verifying Checksum
774043ccc8cc: Download complete
862a57157567: Verifying Checksum
862a57157567: Download complete
c6cc80087442: Verifying Checksum
c6cc80087442: Download complete
a8dbfea3500a: Verifying Checksum
a8dbfea3500a: Download complete
ab6b448d4be9: Download complete
774043ccc8cc: Pull complete
ab6b448d4be9: Pull complete
23a5bfa58353: Pull complete
862a57157567: Pull complete
c6cc80087442: Pull complete
a8dbfea3500a: Pull complete
Digest: sha256:0898f98b327e5f84983e94edc2ed25e68fc03707d3144f113af49fb7f5bb65eb
Status: Downloaded newer image for gitea.dooplex.hu/admin/felhom-controller:0.286.1
gitea.dooplex.hu/admin/felhom-controller:0.286.1
[golden] asking the controller which infra images it manages …
[golden] baking infra images (4): traefik:v3.6.7 cloudflare/cloudflared:2026.6.0 gtstef/filebrowser:1.3.3-stable gitea.dooplex.hu/admin/felhom-samba:1.1.0 …
v3.6.7: Pulling from library/traefik
589002ba0eae: Pulling fs layer
ef63511ea6cc: Pulling fs layer
0738e5cb835e: Pulling fs layer
3e6813f70c64: Pulling fs layer
3e6813f70c64: Waiting
589002ba0eae: Verifying Checksum
589002ba0eae: Download complete
ef63511ea6cc: Verifying Checksum
ef63511ea6cc: Download complete
3e6813f70c64: Verifying Checksum
3e6813f70c64: Download complete
0738e5cb835e: Verifying Checksum
0738e5cb835e: Download complete
589002ba0eae: Pull complete
ef63511ea6cc: Pull complete
0738e5cb835e: Pull complete
3e6813f70c64: Pull complete
Digest: sha256:a9890c898f379c1905ee5b28342f6b408dc863f08db2dab20e46c267d1ff463a
Status: Downloaded newer image for traefik:v3.6.7
docker.io/library/traefik:v3.6.7
2026.6.0: Pulling from cloudflare/cloudflared
47de5dd0b812: Pulling fs layer
c172f21841df: Pulling fs layer
99515e7b4d35: Pulling fs layer
99ba982a9142: Pulling fs layer
d6b1b89eccac: Pulling fs layer
2780920e5dbf: Pulling fs layer
7c12895b777b: Pulling fs layer
3214acf345c0: Pulling fs layer
52630fc75a18: Pulling fs layer
dd64bf2dd177: Pulling fs layer
b839dfae01f6: Pulling fs layer
ebddc55facdc: Pulling fs layer
bdfd7f7e5bf6: Pulling fs layer
2d4d7adf6272: Pulling fs layer
40008157d8d2: Pulling fs layer
bd8962e29291: Pulling fs layer
cac2ae0193cb: Pulling fs layer
74d1dac84ecc: Pulling fs layer
b839dfae01f6: Waiting
ebddc55facdc: Waiting
bdfd7f7e5bf6: Waiting
2d4d7adf6272: Waiting
40008157d8d2: Waiting
bd8962e29291: Waiting
cac2ae0193cb: Waiting
99ba982a9142: Waiting
d6b1b89eccac: Waiting
2780920e5dbf: Waiting
74d1dac84ecc: Waiting
7c12895b777b: Waiting
dd64bf2dd177: Waiting
3214acf345c0: Waiting
52630fc75a18: Waiting
99515e7b4d35: Verifying Checksum
99515e7b4d35: Download complete
c172f21841df: Download complete
47de5dd0b812: Download complete
99ba982a9142: Verifying Checksum
99ba982a9142: Download complete
d6b1b89eccac: Download complete
2780920e5dbf: Verifying Checksum
2780920e5dbf: Download complete
7c12895b777b: Download complete
3214acf345c0: Verifying Checksum
3214acf345c0: Download complete
52630fc75a18: Verifying Checksum
52630fc75a18: Download complete
dd64bf2dd177: Download complete
47de5dd0b812: Pull complete
b839dfae01f6: Verifying Checksum
b839dfae01f6: Download complete
ebddc55facdc: Verifying Checksum
ebddc55facdc: Download complete
bdfd7f7e5bf6: Verifying Checksum
bdfd7f7e5bf6: Download complete
2d4d7adf6272: Verifying Checksum
2d4d7adf6272: Download complete
40008157d8d2: Verifying Checksum
40008157d8d2: Download complete
bd8962e29291: Verifying Checksum
bd8962e29291: Download complete
cac2ae0193cb: Verifying Checksum
cac2ae0193cb: Download complete
c172f21841df: Pull complete
74d1dac84ecc: Verifying Checksum
74d1dac84ecc: Download complete
99515e7b4d35: Pull complete
99ba982a9142: Pull complete
d6b1b89eccac: Pull complete
2780920e5dbf: Pull complete
7c12895b777b: Pull complete
3214acf345c0: Pull complete
52630fc75a18: Pull complete
dd64bf2dd177: Pull complete
b839dfae01f6: Pull complete
ebddc55facdc: Pull complete
bdfd7f7e5bf6: Pull complete
2d4d7adf6272: Pull complete
40008157d8d2: Pull complete
bd8962e29291: Pull complete
cac2ae0193cb: Pull complete
74d1dac84ecc: Pull complete
Digest: sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f
Status: Downloaded newer image for cloudflare/cloudflared:2026.6.0
docker.io/cloudflare/cloudflared:2026.6.0
1.3.3-stable: Pulling from gtstef/filebrowser
6a0ac1617861: Pulling fs layer
ef8806083e82: Pulling fs layer
b74107c861c7: Pulling fs layer
adc935def003: Pulling fs layer
4f4fb700ef54: Pulling fs layer
18695ccc900a: Pulling fs layer
45d119d5c397: Pulling fs layer
dac52db4fc51: Pulling fs layer
6d598f86b2f2: Pulling fs layer
8aa349c8396c: Pulling fs layer
dac52db4fc51: Waiting
6d598f86b2f2: Waiting
8aa349c8396c: Waiting
adc935def003: Waiting
4f4fb700ef54: Waiting
18695ccc900a: Waiting
45d119d5c397: Waiting
6a0ac1617861: Verifying Checksum
6a0ac1617861: Download complete
adc935def003: Verifying Checksum
adc935def003: Download complete
b74107c861c7: Verifying Checksum
b74107c861c7: Download complete
4f4fb700ef54: Verifying Checksum
4f4fb700ef54: Download complete
45d119d5c397: Verifying Checksum
45d119d5c397: Download complete
ef8806083e82: Verifying Checksum
ef8806083e82: Download complete
dac52db4fc51: Verifying Checksum
dac52db4fc51: Download complete
6d598f86b2f2: Verifying Checksum
6d598f86b2f2: Download complete
6a0ac1617861: Pull complete
18695ccc900a: Verifying Checksum
18695ccc900a: Download complete
8aa349c8396c: Verifying Checksum
8aa349c8396c: Download complete
ef8806083e82: Pull complete
b74107c861c7: Pull complete
adc935def003: Pull complete
4f4fb700ef54: Pull complete
18695ccc900a: Pull complete
45d119d5c397: Pull complete
dac52db4fc51: Pull complete
6d598f86b2f2: Pull complete
8aa349c8396c: Pull complete
Digest: sha256:eb3733681db8757412632c61a99ad656f0d94ed6781bb2ea114b4d70babab78c
Status: Downloaded newer image for gtstef/filebrowser:1.3.3-stable
docker.io/gtstef/filebrowser:1.3.3-stable
1.1.0: Pulling from admin/felhom-samba
897d797d2723: Pulling fs layer
3051591aa250: Pulling fs layer
ce57a3f93416: Pulling fs layer
fb94eeec2fe1: Pulling fs layer
fb94eeec2fe1: Waiting
ce57a3f93416: Verifying Checksum
ce57a3f93416: Download complete
897d797d2723: Verifying Checksum
897d797d2723: Download complete
fb94eeec2fe1: Verifying Checksum
fb94eeec2fe1: Download complete
3051591aa250: Verifying Checksum
3051591aa250: Download complete
897d797d2723: Pull complete
3051591aa250: Pull complete
ce57a3f93416: Pull complete
fb94eeec2fe1: Pull complete
Digest: sha256:1c17c09422bec0366d7cf0e0fcfc1486ba6c90334a0a5d5c851073a9342f8f10
Status: Downloaded newer image for gitea.dooplex.hu/admin/felhom-samba:1.1.0
gitea.dooplex.hu/admin/felhom-samba:1.1.0
[golden] baking the controller-bootstrap unit (deploys the BAKED controller from the config mount) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-controller-bootstrap.service' → '/etc/systemd/system/felhom-controller-bootstrap.service'.
[golden] baking the controller-bootstrap PATH unit (starts the service on bootstrap-mount hot-plug — B1) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-controller-bootstrap.path' → '/etc/systemd/system/felhom-controller-bootstrap.path'.
[golden] baking the first-boot SSH host-key regeneration unit (F3) …
Created symlink '/etc/systemd/system/multi-user.target.wants/felhom-regen-hostkeys.service' → '/etc/systemd/system/felhom-regen-hostkeys.service'.
[golden] identity-clean + minimize …
[golden] stop + archive …
INFO: including mount point rootfs ('/') in backup
INFO: including mount point mp0 ('/var/lib/felhom') in backup
INFO: archive file size: 621MB
INFO: Finished Backup of VM 9100 (00:00:41)
[golden] DONE. golden archive volid: local:backup/vzdump-lxc-9100-2026_10_01-22_00_32.tar.zst (rootfs 32G + ONE data volume 24G @ /var/lib/felhom, all in the archive)
[golden] publishing golden (652070141 bytes, sha256 1dec051d6b896e98…) → https://gitea.dooplex.hu/api/packages/admin/generic/felhom-golden/0.286.1/golden.tar.zst
[golden] pre-delete existing: HTTP 404 (404/204 expected)
[golden] upload OK (HTTP 201)
GOLDEN_VERSION=0.286.1
GOLDEN_SHA256=1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89
[golden] Record in the hub operator UI (Configs → Day-0 artifacts): golden 0.286.1 / 1dec051d6b896e987ede1bc99f6ba45d7a292538c74d3cd8ccb844641a666a89
[golden] (the build guest 9100 is stopped; destroy it with: pct destroy 9100 --purge)