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
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:
@@ -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']
|
||||
+8
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
+20
@@ -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
|
||||
}
|
||||
}
|
||||
+23
@@ -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}}
|
||||
+63
@@ -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)
|
||||
+237
@@ -0,0 +1,237 @@
|
||||
[2Ksparkyfitness-db | The files belonging to this database system will be owned by user "postgres".
|
||||
[2Ksparkyfitness-db | This user must also own the server process.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8".
|
||||
[2Ksparkyfitness-db | The default database encoding has accordingly been set to "UTF8".
|
||||
[2Ksparkyfitness-db | The default text search configuration will be set to "english".
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | Data page checksums are enabled.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok
|
||||
[2Ksparkyfitness-db | creating subdirectories ... ok
|
||||
[2Ksparkyfitness-db | selecting dynamic shared memory implementation ... posix
|
||||
[2Ksparkyfitness-db | selecting default "max_connections" ... 100
|
||||
[2Ksparkyfitness-db | selecting default "shared_buffers" ... 128MB
|
||||
[2Ksparkyfitness-db | selecting default time zone ... Europe/Budapest
|
||||
[2Ksparkyfitness-db | creating configuration files ... ok
|
||||
[2Ksparkyfitness-db | running bootstrap script ... ok
|
||||
[2Ksparkyfitness-db | sh: locale: not found
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:26.926 CEST [36] WARNING: no usable system locales were found
|
||||
[2Ksparkyfitness-db | performing post-bootstrap initialization ... ok
|
||||
[2Ksparkyfitness-db | syncing data to disk ... ok
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | Success. You can now start the database server using:
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start
|
||||
[2Ksparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections
|
||||
[2Ksparkyfitness-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.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.848 CEST [42] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.861 CEST [48] LOG: database system was shut down at 2026-10-01 21:40:27 CEST
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.870 CEST [42] LOG: database system is ready to accept connections
|
||||
[2Ksparkyfitness-db | done
|
||||
[2Ksparkyfitness-db | server started
|
||||
[2Ksparkyfitness-db | CREATE DATABASE
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | waiting for server to shut down....2026-10-01 21:40:28.062 CEST [42] LOG: received fast shutdown request
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.074 CEST [42] LOG: aborting any active transactions
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.077 CEST [42] LOG: background worker "logical replication launcher" (PID 51) exited with exit code 1
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.078 CEST [46] LOG: shutting down
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.081 CEST [46] LOG: checkpoint starting: shutdown immediate
|
||||
[2Ksparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: ⚡️ secrets for agents: https://dotenvx.com/as2
|
||||
[2Ksparkyfitness-server | [Secrets] Checking for secret files to load...
|
||||
[2Ksparkyfitness-server | [Secrets] No secrets loaded from files.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:52:55.763Z] [INFO] Environment variable pre-flight checks passed successfully.
|
||||
[2Ksparkyfitness-server | Starting server...
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.129Z] [INFO] [withingsService] Withings data source configured to: withings
|
||||
[2K[2Ksparkyfitness-server | [2026-10-01T19:53:06.130Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.131Z] [INFO] [googleHealthService] Google Health data source: googlehealth
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.132Z] [INFO] [polarService] Polar data source configured to: polar
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.133Z] [INFO] [stravaService] Strava data source configured to: strava
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.133Z] [INFO] [hevyService] Hevy data source configured to: hevy
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:06.971Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars
|
||||
[2Ksparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid
|
||||
sparkyfitness | Starting SparkyFitness Frontend as root with environment variables:
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010
|
||||
[2Ksparkyfitness | NGINX_RATE_LIMIT=5r/s
|
||||
[2Ksparkyfitness | NGINX_LISTEN_PORT=80
|
||||
[2Ksparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log
|
||||
[2Ksparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log
|
||||
[2Ksparkyfitness | NGINX_DUMP_CONFIG=false
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid
|
||||
[2Ksparkyfitness | Generating nginx configuration from template...
|
||||
[2Ksparkyfitness | Testing nginx configuration substitution...
|
||||
[2Ksparkyfitness | Validating nginx configuration syntax...
|
||||
[2Ksparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
|
||||
[2Ksparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful
|
||||
[2Ksparkyfitness | Configuration validated successfully. Starting nginx...
|
||||
[2Ksparkyfitness | Backend will be proxied to: sparkyfitness-server:3010
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: using the "epoll" event method
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: nginx/1.29.3
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0)
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: OS: Linux 7.0.2-6-pve
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker processes
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 11
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 12
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 13
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 14
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 15
|
||||
[2K[2Ksparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks.
|
||||
[2Ksparkyfitness | 2026/10/01 21:53:25 [notice] 1#1: start worker process 16
|
||||
[2K[2Ksparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.152Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.182Z] [INFO] Role "sparkyapp" already exists.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.184Z] [INFO] Ensured schema_migrations table exists.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.191Z] [INFO] Applied migrations: [
|
||||
[2Ksparkyfitness-server | '20250703170640_InitialDB.sql',
|
||||
[2Ksparkyfitness-server | '20250710062500_create_goal_presets_table.sql',
|
||||
[2Ksparkyfitness-server | '20250711173824_meal_features.sql',
|
||||
[2Ksparkyfitness-server | '20250712163617_refactor_data_providers_and_add_exercise_source_id.sql',
|
||||
[2Ksparkyfitness-server | '20250713125323_create_oidc_settings_and_update_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20250713135900_add_role_to_users_table.sql',
|
||||
[2Ksparkyfitness-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"
|
||||
[2Ksparkyfitness | 172.18.0.1 - - [01/Oct/2026:21:53:56 +0200] "GET / HTTP/1.1" 200 2666 "-" "curl/8.14.1"
|
||||
[2Ksparkyfitness | 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"
|
||||
[2Ksparkyfitness | 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"
|
||||
[2Ksparkyfitness | 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"
|
||||
[2Ksparkyfitness | 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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.224 CEST [42] LOG: database system is shut down
|
||||
[2Ksparkyfitness-db | done
|
||||
[2Ksparkyfitness-db | server stopped
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | PostgreSQL init process complete; ready for start up.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv6 address "::", port 5432
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.311 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.325 CEST [64] LOG: database system was shut down at 2026-10-01 21:40:28 CEST
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.332 CEST [1] LOG: database system is ready to accept connections
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:45:28.380 CEST [62] LOG: checkpoint starting: time
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:50:28.783 CEST [62] LOG: checkpoint starting: time
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-server | '20250714000000_create_session_table.sql',
|
||||
[2Ksparkyfitness-server | '20250714175824_add_api_key_tag_to_ai_service_settings.sql',
|
||||
[2Ksparkyfitness-server | '20250717190700_add_cascading_deletes.sql',
|
||||
[2Ksparkyfitness-server | '20250717233929_add_is_quick_food_to_foods.sql',
|
||||
[2Ksparkyfitness-server | '20250718190226_add_food_display_limit_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20250719131500_add_meal_percentages.sql',
|
||||
[2Ksparkyfitness-server | '20250719215400_add_login_management_to_oidc_settings.sql',
|
||||
[2Ksparkyfitness-server | '20250720010000_create_user_nutrient_display_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20250720201800_rename_food_display_limit_to_item_display_limit.sql',
|
||||
[2Ksparkyfitness-server | '20250720220000_add_water_tracking_features.sql',
|
||||
[2Ksparkyfitness-server | '20250720233836_alter_water_goal_ml_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250721000000_add_servings_per_container_to_water_containers.sql',
|
||||
[2Ksparkyfitness-server | '20250721000000_alter_water_container_volume_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250721014900_alter_water_ml_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250819062400_add_mealie_provider_type.sql',
|
||||
[2Ksparkyfitness-server | '20250819083500_add_base_url_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
|
||||
[2Ksparkyfitness-server | '20250821090000_update_external_data_providers_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20250821091500_add_garth_token_dump_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20250821102000_remove_redundant_token_fields_from_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20250831063900_create_mood_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20250927180257_alter_exercises_table.sql',
|
||||
[2Ksparkyfitness-server | '20250927212000_add_free_exercise_db_to_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20250930002100_add_sets_reps_weight_to_exercise_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251001232600_add_gender_to_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20251002182306_create_backup_settings_table.sql',
|
||||
[2Ksparkyfitness-server | '20251002224500_add_password_reset_to_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20251006021609_add_glycemic_index_to_foods_and_food_variants.sql',
|
||||
[2Ksparkyfitness-server | '20251006220500_create_admin_activity_logs_table.sql',
|
||||
[2Ksparkyfitness-server | '20251008224256_add_workout_features.sql',
|
||||
[2Ksparkyfitness-server | '20251012225400_add_primary_keys_to_workout_tables.sql',
|
||||
[2Ksparkyfitness-server | '20251012225500_add_multiple_sets_to_presets.sql',
|
||||
[2Ksparkyfitness-server | '20251012225900_add_multiple_sets_to_plans.sql',
|
||||
[2Ksparkyfitness-server | '20251012230000_add_multiple_sets_to_exercise_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251015223200_convert_weights_to_kg_and_set_default.sql',
|
||||
[2Ksparkyfitness-server | '202510170132_add_text_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251017200900_add_multiple_oidc_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251017204200_create_global_settings.sql',
|
||||
[2Ksparkyfitness-server | '20251018001151_add_bmr_and_bodyfat_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251018223700_add_signing_alg_to_oidc_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
|
||||
[2Ksparkyfitness-server | '20251019013300_merged_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251019154515_update_rls_policies_for_shared_items.sql',
|
||||
[2Ksparkyfitness-server | '20251019203500_fix_rls_permissions_for_public_foods.sql',
|
||||
[2Ksparkyfitness-server | '20251019204000_correct_variant_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251019212500_update_measurement_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251019222100_add_audit_columns_to_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251020001000_fix_family_access_insert_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020022000_set_default_shared_with_public.sql',
|
||||
[2Ksparkyfitness-server | '20251020022200_update_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251020022500_fix_food_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020030000_simplify_food_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020031000_update_food_select_policy_with_sharing.sql',
|
||||
[2Ksparkyfitness-server | '20251020032200_add_all_owner_centric_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251020033400_add_food_variants_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020033700_fix_food_variants_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020230839_fix_family_access_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251021025423_restrict_family_access_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251021034700_add_public_sharing_to_external_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251022201000_fix_exercise_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251022203000_snapshot_exercise_details_in_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251023120500_update_external_providers_select_policy_for_public.sql',
|
||||
[2Ksparkyfitness-server | '20251023221000_update_meals_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251023221500_update_meal_plan_template_assignments_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251023221501_add_meal_id_to_food_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251024230330_add_withings_fields_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251025210900_add_source_to_custom_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '202510310132_add_language_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251101151100_create_sleep_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
|
||||
[2Ksparkyfitness-server | '20251112000000_add_display_name_to_custom_categories.sql',
|
||||
[2Ksparkyfitness-server | '20251114205134_create_exercise_preset_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20251115003147_add_source_to_exercise_preset_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251115003301_add_exercise_preset_entry_id_to_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '20251120011100_add_mfa_magic_link_columns.sql',
|
||||
[2Ksparkyfitness-server | '20251121011500_add_email_mfa_columns_to_users.sql',
|
||||
[2Ksparkyfitness-server | '202511220110_add_default_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '202511232110_delete_raw_stress_data_categories.sql',
|
||||
[2Ksparkyfitness-server | '202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251127194107_create_food_entry_meals_and_link_food_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
|
||||
[2Ksparkyfitness-server | '20251128030115_add_tandoor_provider_type.sql',
|
||||
[2Ksparkyfitness-server | '20251205000000_add_energy_unit_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251206000000_add_nutrient_calculation_algorithms.sql',
|
||||
[2Ksparkyfitness-server | '20251206000001_add_serving_size_to_meals.sql',
|
||||
[2Ksparkyfitness-server | '20251207000001_add_default_meal_quantity.sql',
|
||||
[2Ksparkyfitness-server | '20251215005329_add_usda_to_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20251221000000_create_fasting_logs.sql',
|
||||
[2Ksparkyfitness-server | '20251221010000_drop_mood_weight_from_fasting_logs.sql',
|
||||
[2Ksparkyfitness-server | '20251226150700_add_mobile_health_data_features.sql',
|
||||
[2Ksparkyfitness-server | '20251228000000_add_custom_nutrients_tables.sql',
|
||||
[2Ksparkyfitness-server | ... 84 more items
|
||||
[2Ksparkyfitness-server | ]
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.208Z] [INFO] Ensuring permissions for role: "sparkyapp"
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.260Z] [INFO] Successfully ensured permissions for role: "sparkyapp"
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.261Z] [INFO] Permissions granted to application user.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.261Z] [INFO] Applying all RLS policies from rls_policies.sql...
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.410Z] [INFO] Successfully applied all RLS policies.
|
||||
[2Ksparkyfitness-server | [AUTH] Starting Better Auth mounting phase...
|
||||
[2Ksparkyfitness-server | [AUTH] Better Auth handler successfully mounted.
|
||||
[2Ksparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: []
|
||||
[2Ksparkyfitness-server | DEBUG: Server started and listening on port 3010
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.482Z] [INFO] SparkyFitnessServer listening on port 3010
|
||||
[2Ksparkyfitness-server | View API documentation at: /api/api-docs/swagger
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:07.485Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:24.905Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:53:55.035Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
|
||||
[2Ksparkyfitness-server | [AUTH HANDLER] Intercepted request: POST /api/auth/sign-in/email
|
||||
[2Ksparkyfitness-server | 2026-10-01T19:53:57.085Z ERROR [Better Auth]: Invalid password
|
||||
[2Ksparkyfitness-server | [AUTH HANDLER] Intercepted request: POST /api/auth/sign-in/email
|
||||
[2Ksparkyfitness-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.
|
||||
[2Ksparkyfitness-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)
|
||||
[2Ksparkyfitness-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)
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"sparkyfitness-db": {
|
||||
"image": "postgres:18-alpine",
|
||||
"probe": "datadir major version",
|
||||
"answer": "18",
|
||||
"probe_rc": 0
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
+1562
File diff suppressed because it is too large
Load Diff
+6
@@ -0,0 +1,6 @@
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.649Z] [INFO] Applied migrations: [
|
||||
[2Ksparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
|
||||
[2Ksparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
|
||||
[2Ksparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
|
||||
[2Ksparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
|
||||
+61
@@ -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
|
||||
+12
@@ -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
|
||||
+242
@@ -0,0 +1,242 @@
|
||||
[2Ksparkyfitness-db | The files belonging to this database system will be owned by user "postgres".
|
||||
[2Ksparkyfitness-db | This user must also own the server process.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | The database cluster will be initialized with locale "en_US.utf8".
|
||||
[2Ksparkyfitness-db | The default database encoding has accordingly been set to "UTF8".
|
||||
[2Ksparkyfitness-db | The default text search configuration will be set to "english".
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | Data page checksums are enabled.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok
|
||||
[2Ksparkyfitness-db | creating subdirectories ... ok
|
||||
[2Ksparkyfitness-db | selecting dynamic shared memory implementation ... posix
|
||||
[2Ksparkyfitness-db | selecting default "max_connections" ... 100
|
||||
[2Ksparkyfitness-db | selecting default "shared_buffers" ... 128MB
|
||||
[2Ksparkyfitness-db | selecting default time zone ... Europe/Budapest
|
||||
[2Ksparkyfitness-db | creating configuration files ... ok
|
||||
[2Ksparkyfitness-db | running bootstrap script ... ok
|
||||
[2Ksparkyfitness-db | sh: locale: not found
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:26.926 CEST [36] WARNING: no usable system locales were found
|
||||
[2Ksparkyfitness-db | performing post-bootstrap initialization ... ok
|
||||
[2Ksparkyfitness-db | syncing data to disk ... ok
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | Success. You can now start the database server using:
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start
|
||||
[2Ksparkyfitness-db | initdb: warning: enabling "trust" authentication for local connections
|
||||
[2Ksparkyfitness-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.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.848 CEST [42] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.861 CEST [48] LOG: database system was shut down at 2026-10-01 21:40:27 CEST
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:27.870 CEST [42] LOG: database system is ready to accept connections
|
||||
[2Ksparkyfitness-db | done
|
||||
[2Ksparkyfitness-db | server started
|
||||
[2Ksparkyfitness-db | CREATE DATABASE
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
|
||||
[2Ksparkyfitness-server | [dotenv@17.3.1] injecting env (0) from ../.env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommit
|
||||
[2Ksparkyfitness-server | [Secrets] Checking for secret files to load...
|
||||
[2Ksparkyfitness-server | [Secrets] No secrets loaded from files.
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | waiting for server to shut down....2026-10-01 21:40:28.062 CEST [42] LOG: received fast shutdown request
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.074 CEST [42] LOG: aborting any active transactions
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.077 CEST [42] LOG: background worker "logical replication launcher" (PID 51) exited with exit code 1
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.078 CEST [46] LOG: shutting down
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.081 CEST [46] LOG: checkpoint starting: shutdown immediate
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.224 CEST [42] LOG: database system is shut down
|
||||
[2Ksparkyfitness-db | done
|
||||
[2Ksparkyfitness-db | server stopped
|
||||
[2Ksparkyfitness-db |
|
||||
[2Ksparkyfitness-db | PostgreSQL init process complete; ready for start up.
|
||||
[2K[2Ksparkyfitness-db |
|
||||
sparkyfitness-server | [2026-10-01T19:41:42.803Z] [INFO] Environment variable pre-flight checks passed successfully.
|
||||
[2Ksparkyfitness-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
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.305 CEST [1] LOG: listening on IPv6 address "::", port 5432
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.311 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.325 CEST [64] LOG: database system was shut down at 2026-10-01 21:40:28 CEST
|
||||
[2Ksparkyfitness-db | 2026-10-01 21:40:28.332 CEST [1] LOG: database system is ready to accept connections
|
||||
[2Ksparkyfitness-server | Starting server...
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.834Z] [INFO] [withingsService] Withings data source configured to: withings
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.836Z] [INFO] [fitbitService] Fitbit data source configured to: fitbit
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.837Z] [INFO] [googleHealthService] Google Health data source: googlehealth
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.838Z] [INFO] [polarService] Polar data source configured to: polar
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.838Z] [INFO] [stravaService] Strava data source configured to: strava
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:50.839Z] [INFO] [hevyService] Hevy data source configured to: hevy
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.483Z] [INFO] UserProfileRoutes UPLOADS_DIR: /app/SparkyFitnessServer/uploads/avatars
|
||||
[2Ksparkyfitness-server | DEBUG: SPARKY_FITNESS_FRONTEND_URL is: https://sparky.gate.invalid
|
||||
[2Ksparkyfitness | Starting SparkyFitness Frontend as root with environment variables:
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_SERVER_HOST=sparkyfitness-server
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_SERVER_PORT=3010
|
||||
[2Ksparkyfitness | NGINX_RATE_LIMIT=5r/s
|
||||
[2Ksparkyfitness | NGINX_LISTEN_PORT=80
|
||||
[2Ksparkyfitness | NGINX_ACCESS_LOG=/var/log/nginx/access.log
|
||||
[2Ksparkyfitness | NGINX_ERROR_LOG=/var/log/nginx/error.log
|
||||
[2Ksparkyfitness | NGINX_DUMP_CONFIG=false
|
||||
[2Ksparkyfitness | SPARKY_FITNESS_FRONTEND_URL=https://sparky.gate.invalid
|
||||
[2Ksparkyfitness | Generating nginx configuration from template...
|
||||
[2Ksparkyfitness | Testing nginx configuration substitution...
|
||||
[2Ksparkyfitness | Validating nginx configuration syntax...
|
||||
[2Ksparkyfitness | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
|
||||
[2Ksparkyfitness | nginx: configuration file /etc/nginx/nginx.conf test is successful
|
||||
[2Ksparkyfitness | Configuration validated successfully. Starting nginx...
|
||||
[2Ksparkyfitness | Backend will be proxied to: sparkyfitness-server:3010
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: using the "epoll" event method
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: nginx/1.29.3
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: built by gcc 14.2.0 (Alpine 14.2.0)
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: OS: Linux 7.0.2-6-pve
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker processes
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 12
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 13
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 14
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 15
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 16
|
||||
[2Ksparkyfitness | 2026/10/01 21:42:12 [notice] 1#1: start worker process 17
|
||||
[2Ksparkyfitness | 127.0.0.1 - - [01/Oct/2026:21:42:42 +0200] "GET / HTTP/1.1" 200 2666 "-" "Wget"
|
||||
[2Ksparkyfitness-server | [SECURITY] Private network CORS is ENABLED. Ensure this is only on self-hosted/private networks.
|
||||
[2Ksparkyfitness-server | SparkyFitnessServer UPLOADS_BASE_DIR: /app/SparkyFitnessServer/uploads
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.617Z] [INFO] Ensured temporary upload directory exists: /app/SparkyFitnessServer/temp_uploads/
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.643Z] [INFO] Role "sparkyapp" already exists.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.644Z] [INFO] Ensured schema_migrations table exists.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.649Z] [INFO] Applied migrations: [
|
||||
[2Ksparkyfitness-server | '20250703170640_InitialDB.sql',
|
||||
[2Ksparkyfitness-server | '20250710062500_create_goal_presets_table.sql',
|
||||
[2Ksparkyfitness-server | '20250711173824_meal_features.sql',
|
||||
[2Ksparkyfitness-server | '20250712163617_refactor_data_providers_and_add_exercise_source_id.sql',
|
||||
[2Ksparkyfitness-server | '20250713125323_create_oidc_settings_and_update_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20250713135900_add_role_to_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20250713142300_add_oidc_config_fields.sql',
|
||||
[2Ksparkyfitness-server | '20250714000000_create_session_table.sql',
|
||||
[2Ksparkyfitness-server | '20250714175824_add_api_key_tag_to_ai_service_settings.sql',
|
||||
[2Ksparkyfitness-server | '20250717190700_add_cascading_deletes.sql',
|
||||
[2Ksparkyfitness-server | '20250717233929_add_is_quick_food_to_foods.sql',
|
||||
[2Ksparkyfitness-server | '20250718190226_add_food_display_limit_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20250719131500_add_meal_percentages.sql',
|
||||
[2Ksparkyfitness-server | '20250719215400_add_login_management_to_oidc_settings.sql',
|
||||
[2Ksparkyfitness-server | '20250720010000_create_user_nutrient_display_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20250720201800_rename_food_display_limit_to_item_display_limit.sql',
|
||||
[2Ksparkyfitness-server | '20250720220000_add_water_tracking_features.sql',
|
||||
[2Ksparkyfitness-server | '20250720233836_alter_water_goal_ml_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250721000000_add_servings_per_container_to_water_containers.sql',
|
||||
[2Ksparkyfitness-server | '20250721000000_alter_water_container_volume_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250721014900_alter_water_ml_to_numeric.sql',
|
||||
[2Ksparkyfitness-server | '20250819062400_add_mealie_provider_type.sql',
|
||||
[2Ksparkyfitness-server | '20250819083500_add_base_url_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '202508201215_add_garmin_integration_schema.sql',
|
||||
[2Ksparkyfitness-server | '20250821090000_update_external_data_providers_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20250821091500_add_garth_token_dump_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20250821102000_remove_redundant_token_fields_from_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20250831063900_create_mood_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20250927180257_alter_exercises_table.sql',
|
||||
[2Ksparkyfitness-server | '20250927212000_add_free_exercise_db_to_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20250930002100_add_sets_reps_weight_to_exercise_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251001232600_add_gender_to_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20251002182306_create_backup_settings_table.sql',
|
||||
[2Ksparkyfitness-server | '20251002224500_add_password_reset_to_users_table.sql',
|
||||
[2Ksparkyfitness-server | '20251006021609_add_glycemic_index_to_foods_and_food_variants.sql',
|
||||
[2Ksparkyfitness-server | '20251006220500_create_admin_activity_logs_table.sql',
|
||||
[2Ksparkyfitness-server | '20251008224256_add_workout_features.sql',
|
||||
[2Ksparkyfitness-server | '20251012225400_add_primary_keys_to_workout_tables.sql',
|
||||
[2Ksparkyfitness-server | '20251012225500_add_multiple_sets_to_presets.sql',
|
||||
[2Ksparkyfitness-server | '20251012225900_add_multiple_sets_to_plans.sql',
|
||||
[2Ksparkyfitness-server | '20251012230000_add_multiple_sets_to_exercise_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251015223200_convert_weights_to_kg_and_set_default.sql',
|
||||
[2Ksparkyfitness-server | '202510170132_add_text_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251017200900_add_multiple_oidc_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251017204200_create_global_settings.sql',
|
||||
[2Ksparkyfitness-server | '20251018001151_add_bmr_and_bodyfat_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251018223700_add_signing_alg_to_oidc_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251019013200_merged_schema_and_data.sql',
|
||||
[2Ksparkyfitness-server | '20251019013300_merged_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251019154515_update_rls_policies_for_shared_items.sql',
|
||||
[2Ksparkyfitness-server | '20251019203500_fix_rls_permissions_for_public_foods.sql',
|
||||
[2Ksparkyfitness-server | '20251019204000_correct_variant_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251019212500_update_measurement_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251019222100_add_audit_columns_to_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251020001000_fix_family_access_insert_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020022000_set_default_shared_with_public.sql',
|
||||
[2Ksparkyfitness-server | '20251020022200_update_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251020022500_fix_food_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020030000_simplify_food_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020031000_update_food_select_policy_with_sharing.sql',
|
||||
[2Ksparkyfitness-server | '20251020032200_add_all_owner_centric_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251020033400_add_food_variants_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020033700_fix_food_variants_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251020230839_fix_family_access_rls_policies.sql',
|
||||
[2Ksparkyfitness-server | '20251021025423_restrict_family_access_select_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251021034700_add_public_sharing_to_external_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251022201000_fix_exercise_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251022203000_snapshot_exercise_details_in_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251023120500_update_external_providers_select_policy_for_public.sql',
|
||||
[2Ksparkyfitness-server | '20251023221000_update_meals_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251023221500_update_meal_plan_template_assignments_rls_policy.sql',
|
||||
[2Ksparkyfitness-server | '20251023221501_add_meal_id_to_food_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251024230330_add_withings_fields_to_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '20251025210900_add_source_to_custom_measurements.sql',
|
||||
[2Ksparkyfitness-server | '20251026125900_add_distance_and_hr_to_exercise_entries_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '202510310132_add_language_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251101151100_create_sleep_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20251103000000_add_onboarding_schema.sql',
|
||||
[2Ksparkyfitness-server | '20251112000000_add_display_name_to_custom_categories.sql',
|
||||
[2Ksparkyfitness-server | '20251114205134_create_exercise_preset_entries_table.sql',
|
||||
[2Ksparkyfitness-server | '20251115003147_add_source_to_exercise_preset_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251115003301_add_exercise_preset_entry_id_to_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '20251115004027_alter_exercise_entry_id_nullable_in_activity_details.sql',
|
||||
[2Ksparkyfitness-server | '20251120011100_add_mfa_magic_link_columns.sql',
|
||||
[2Ksparkyfitness-server | '20251121011500_add_email_mfa_columns_to_users.sql',
|
||||
[2Ksparkyfitness-server | '202511220110_add_default_external_data_providers.sql',
|
||||
[2Ksparkyfitness-server | '202511232110_delete_raw_stress_data_categories.sql',
|
||||
[2Ksparkyfitness-server | '202511270109_add_calorie_goal_adjustment_mode_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251127194107_create_food_entry_meals_and_link_food_entries.sql',
|
||||
[2Ksparkyfitness-server | '20251127194108_migrate_aggregated_food_entries_to_food_entry_meals.sql',
|
||||
[2Ksparkyfitness-server | '20251128030115_add_tandoor_provider_type.sql',
|
||||
[2Ksparkyfitness-server | '20251205000000_add_energy_unit_to_user_preferences.sql',
|
||||
[2Ksparkyfitness-server | '20251206000000_add_nutrient_calculation_algorithms.sql',
|
||||
[2Ksparkyfitness-server | '20251206000001_add_serving_size_to_meals.sql',
|
||||
[2Ksparkyfitness-server | '20251207000001_add_default_meal_quantity.sql',
|
||||
[2Ksparkyfitness-server | '20251215005329_add_usda_to_provider_type_check.sql',
|
||||
[2Ksparkyfitness-server | '20251221000000_create_fasting_logs.sql',
|
||||
[2Ksparkyfitness-server | '20251221010000_drop_mood_weight_from_fasting_logs.sql',
|
||||
[2Ksparkyfitness-server | '20251226150700_add_mobile_health_data_features.sql',
|
||||
[2Ksparkyfitness-server | '20251228000000_add_custom_nutrients_tables.sql',
|
||||
[2Ksparkyfitness-server | ... 74 more items
|
||||
[2Ksparkyfitness-server | ]
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.653Z] [INFO] Applying migration: 20260623000000_add_measurement_decimal_places.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.663Z] [INFO] Successfully applied migration: 20260623000000_add_measurement_decimal_places.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.663Z] [INFO] Applying migration: 20260624000000_add_medication_glp1_schema.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.790Z] [INFO] Successfully applied migration: 20260624000000_add_medication_glp1_schema.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.790Z] [INFO] Applying migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.800Z] [INFO] Successfully applied migration: 20260625000000_add_chat_tool_profile_to_ai_service_settings.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.800Z] [INFO] Applying migration: 20260628000000_convert_exercise_durations_to_numeric.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.829Z] [INFO] Successfully applied migration: 20260628000000_convert_exercise_durations_to_numeric.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.829Z] [INFO] Applying migration: 20260628120000_add_vision_ai_service_pointers.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.838Z] [INFO] Successfully applied migration: 20260628120000_add_vision_ai_service_pointers.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.838Z] [INFO] Applying migration: 20260630000000_add_custom_nutrient_aliases.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.843Z] [INFO] Successfully applied migration: 20260630000000_add_custom_nutrient_aliases.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.844Z] [INFO] Applying migration: 20260630000000_add_onboarding_skipped.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.849Z] [INFO] Successfully applied migration: 20260630000000_add_onboarding_skipped.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.849Z] [INFO] Applying migration: 20260701000000_add_child_meal_to_meal_foods.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.867Z] [INFO] Successfully applied migration: 20260701000000_add_child_meal_to_meal_foods.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.867Z] [INFO] Applying migration: 20260702180000_add_cycle_tracking_schema.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.989Z] [INFO] Successfully applied migration: 20260702180000_add_cycle_tracking_schema.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.989Z] [INFO] Applying migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:51.995Z] [INFO] Successfully applied migration: 20260705000000_fix_googlehealth_sleep_date_anchor.sql
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.006Z] [INFO] Ensuring permissions for role: "sparkyapp"
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.042Z] [INFO] Successfully ensured permissions for role: "sparkyapp"
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.042Z] [INFO] Permissions granted to application user.
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.043Z] [INFO] Applying all RLS policies from rls_policies.sql...
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.184Z] [INFO] Successfully applied all RLS policies.
|
||||
[2Ksparkyfitness-server | [AUTH] Starting Better Auth mounting phase...
|
||||
[2Ksparkyfitness-server | [AUTH] Better Auth handler successfully mounted.
|
||||
[2Ksparkyfitness-server | [AUTH] Synced trusted SSO providers for auto-linking: []
|
||||
[2Ksparkyfitness-server | DEBUG: Server started and listening on port 3010
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.250Z] [INFO] SparkyFitnessServer listening on port 3010
|
||||
[2Ksparkyfitness-server | View API documentation at: /api/api-docs/swagger
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:41:52.258Z] [INFO] [CRON] Scheduled backups disabled — skipping schedule
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:42:12.021Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
|
||||
[2Ksparkyfitness-server | [2026-10-01T19:42:42.150Z] [INFO] Incoming request: GET /api/health (Path: /api/health)
|
||||
+20
@@ -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
|
||||
}
|
||||
}
|
||||
+86
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user