25 Commits

Author SHA1 Message Date
admin 53d962d95b Volunteer guide (HU+EN): the console's „linked" text replaces the stale „known bug: the code stays on screen" note; „Mentés most" takes ~2 min with eight apps (measured in the 2026-10-20 rehearsal)
gates / gates (push) Waiting to run
2026-10-20 20:12:20 +02:00
admin 836b47f1ec Rehearsal: B6 #16 English pass, #9 two-at-once (as expected), #13 second drive (not offered as backup target), #4 drive pulled (handled well; last uploads 0 bytes → R-1196 P3); B9 W24-W29
gates / gates (push) Has started running
2026-10-20 20:07:30 +02:00
admin bb187f3503 Rehearsal: B8 all seven restore paths pass (NFC/NFD: both names return); B6 #2 power cut mid-restore → R-1195 (P2, proven live: the app runs on the backup's data, the page says only interrupted); B6 #5 slow line; register 173 -> 174
gates / gates (push) Successful in 13m31s
2026-10-20 19:43:31 +02:00
admin 9db8aacdad Rehearsal: R-1193 corrected and narrowed to P3 (the operator mailbox shows host_stale at 13:33 and app_oom; the household was told nothing); R-1192 second freeze + the app_oom hint; R-1194 (P3 VERIFY) fresh box's felhom-sshd config invalid; B6 #5 slow-line result
gates / gates (push) Successful in 13m17s
2026-10-20 19:10:42 +02:00
admin 78278502ac Rehearsal 2026-10-20: second freeze and plug pull, memory watch, Mentés most, B6 #5 started; B9 words W7-W23; tools
gates / gates (push) Successful in 13m11s
2026-10-20 18:32:20 +02:00
admin 2228b9f6b4 Rehearsal: R-1192 (P1) the 8 GB minimum box froze ~1 h on the family's first afternoon, plug pulled to recover; R-1193 (P2) the hub showed it OK throughout; register 170 -> 172; STATUS P1 line and a note on D5
gates / gates (push) Successful in 13m16s
2026-10-20 16:38:27 +02:00
admin ee743477b4 Rehearsal 2026-10-20 B2-B4: bound (operator passphrase), claimed, recovery code, family (accented names refused), second disk initialised, 8 of 9 apps (Jellyfin refused on memory), first uploads froze the box ~1 h (hub said OK); screenshots gallery
gates / gates (push) Successful in 13m8s
2026-10-20 16:34:30 +02:00
admin ad6397308c Rehearsal 2026-10-20: guide §3 quotes the console the box really shows; bind-page screenshots (codes never shown); app upload and gallery tools; R-1189 (d) (e) confirmed in code
gates / gates (push) Successful in 13m17s
2026-10-20 13:17:29 +02:00
admin d750a90d0e Data-loss hunt: R-1188 (c) proven — a leftover .felhom-restoring blocks every retry of the second drive's whole restore
gates / gates (push) Successful in 13m33s
2026-10-20 13:11:32 +02:00
admin a942ae90d6 Data-loss hunt: R-1185 proven (an invalid dump replaces the good one, no error); R-1182 confirmed in code; DST replay of the controller scheduler (once each on 25 Oct; spring 02:30 dump collides with the 03:30 copy)
gates / gates (push) Successful in 13m44s
2026-10-20 13:07:39 +02:00
admin 20a77d367b Data-loss hunt: R-1180 proven against production code (the nightly rsync --delete mirror runs while a restore holds the backup flag and deletes the files being restored)
gates / gates (push) Successful in 13m20s
2026-10-20 13:02:50 +02:00
admin a57a8363df Data-loss hunt: R-1191 (P1, proven live on 9202) — a .fab import makes a family-only app public (stranger 401 -> 200); R-1187 narrowed; register 169 -> 170; STATUS P1 line
gates / gates (push) Successful in 12m52s
2026-10-20 12:58:30 +02:00
admin bffe2d9dea Data-loss hunt 2026-10-20 C4: register 153 -> 169 (opened R-1175..R-1190: two P1 — shares second copy pruned by another drive's group, box rebuilt after the host delete cannot reach its off-site history; R-1177 proven LIVE on 9202 — a failed local restore destroys live data with no copy); STATUS: the P1 line and decisions D22, D23
gates / gates (push) Successful in 13m20s
2026-10-20 12:31:34 +02:00
admin 242584af4e Status view report: CI jobs 2131-2133 green, by head_sha
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 12:28:00 +02:00
admin 43e5a5496d Data-loss hunt 2026-10-20: four reviewers' candidates, C2 verdicts, proofs (D1 shares second copy pruned, K1 escrow unreachable after host delete, R5 whole restore leaves app stopped while saying untouched, T9 hub jobs run twice on 25 Oct); rehearsal A5 manifest, B1 notes, B9 words, tools
gates / gates (push) Successful in 12m41s
2026-10-20 12:13:19 +02:00
admin c701b2530b Status view: session report (REPORT-status-view-2026-10-20.md); STATUS points to the rehearsal's screenshot folder
gates / gates (push) Successful in 12m53s
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 12:06:50 +02:00
admin 54d1ee8210 Status view, part 4 (the instruction): CLAUDE.md end-of-session checklist — how to update STATUS.md in five lines (replace the Updated paragraph, never prepend; a dated morning list in do; remove what you finished; the decide-row rule; the gate checks it, R-1174). A format rule under PROMPT-TEMPLATE §9 rule 9 (decision 150); no safety rule loosened
gates / gates (push) Successful in 12m43s
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 11:59:54 +02:00
admin 1d7071e8fd Status view, part 3 (the gate): scripts/status_view_gate.py in repo_gates.py (fast: pre-push + CI) — size outside decide, one Updated paragraph, English outside quotes, cited rows open, no decided row in decide, the P1 and every operator-owned row on the page; WARN-FIRST until 2026-10-27, then it refuses; 39 decoy cases (red-proved per check and on both sides of the date); filed R-1174 (P4, Process & tooling) + its due check 2026-10-27; R-919 owner cell -> operator (the upload and the look); register 152 -> 153
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 11:59:48 +02:00
admin 9ec5f76a88 Status view, part 2 (the page): STATUS.md rebuilt from the register — 107 lines / 31,695 bytes -> one screen (50 lines, about 5,400 characters outside the decide table); decide table: 8 open decisions (13 decided rows out, rulings checked in CLOSED-ITEMS); do list checked against the hub and DooPlex (7 done items out, 7 'still needed? yes/no'); old page byte for byte in STATUS-HISTORY.md
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 11:59:41 +02:00
admin f84f94d987 Rehearsal 2026-10-20 (Tester4) + data-loss hunt: baselines, B1 install evidence, A6 drawn order, tools, first two reviewers' candidates
No release, deploy or publish. Off-site is OFF for Tester4 and the owner passphrase is needed from the operator (bind blocked after 2 of 5 tries).
2026-10-20 11:57:55 +02:00
admin 2954b0be3a Status view, part 1 (register pass): register 156 -> 152 (closed R-1121 file gone, R-1118 retirement done, R-231 in git + green run; R-993 merged into R-991); R-132 narrowed (rotation done, hash field left), R-1049 -> WATCHING (fix live since hub 0.151.0); hub + local read evidence
gates / gates (push) Successful in 12m40s
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-20 11:43:58 +02:00
admin 5c487313fa Night brief part 2 (run by day 2026-10-20): register 160 -> 156 (closed R-1001, R-1011, R-1167, R-1070, R-1010, R-893, R-1169; opened R-1171..R-1173; R-1019/R-462 narrowed, R-49 READY -> D21, R-1083 re-stated); 07 §6.3 option A as the design; STATUS morning list; report part 2; P4 Immich plan, P7 release evidence
gates / gates (push) Successful in 12m57s
2026-10-20 11:06:00 +02:00
admin bcaa9576b2 Night 2 evidence: P2 R-893 option A live proof on 9202 (forced failure put back exactly; normal restore OK; teardown); P5 R-462 coverage and currency list
gates / gates (push) Successful in 12m48s
2026-10-20 10:47:37 +02:00
admin 301f4e9e92 Night 2 (2026-10-20) evidence: P1 hub 0.162.0 deploy, installer 1.35.0 publish, agent 0.161.0 release+delivery+host_busy live; P2 R-893 red-proofs; P3 R-1019 classifier before/after
gates / gates (push) Successful in 13m14s
2026-10-20 09:32:53 +02:00
admin b0ae2c574a installer 1.35.0 published (operator yes, 2026-10-20): both webpage git-sync pins -> installer-v1.35.0 (R-1167)
gates / gates (push) Successful in 13m6s
2026-10-20 08:13:57 +02:00
295 changed files with 10784 additions and 124 deletions
+8 -1
View File
@@ -138,7 +138,14 @@ something, not only sessions that touch `documentation/` — which is why it is
and the eleven names head `OPEN-ITEMS.md`, and `register_shape_gate.py` refuses anything else.
- **Root `STATUS.md`** — at the end of every session in which something shipped, broke or was
decided. It is a **view** of `OPEN-ITEMS.md`; nothing may exist only there. One screen, written for
the operator in plain language, and deliberately **not** `CONTEXT.md`.
the operator in plain language (STE English), and deliberately **not** `CONTEXT.md`. How to update it:
1. **Replace** the „Updated" paragraph (at most 3 sentences, the newest change only) — never prepend; the old one
moves to `documentation/backlog/STATUS-HISTORY.md` under a dated heading.
2. A morning list goes under a dated sub-heading in „Waiting on you — do".
3. Remove what you finished: a done „do" item, a fixed „broken" line, a decided row (its ruling is in its row first).
4. A decide row: the question in one answerable sentence, at most 2 options, CC's pick first with the reason, the
other option's cost, what happens if the operator does nothing, and who is blocked.
5. `scripts/status_view_gate.py` checks it on every push (warn-first until 2026-10-27, then it refuses; R-1174).
- **The golden, weekly** (operator ruling 2026-10-15 11:26, `09` §3 decision 250; decision 7 stands): **a controller
release needs no golden** — the floor carries it, MinAgent declared, after the three test boxes (`09` §3 decision 250
item 2). The golden is baked **every Sunday night** when the floor is above it (`runbooks/nightly-rotation.md`) and
+126 -1
View File
@@ -1,4 +1,129 @@
# REPORT — evening/night brief 2026-10-19 (one stop less per night, no false tunnel error, R-893 measured, hub and agent fixes ready, a scanner on every push, ep0's first weekly clean-up)
# REPORT — the night briefs of 2026-10-19 and 2026-10-20 (part 2 run by day): one stop less per night, the safe undo for a failed off-site restore, hub 0.162.0 / agent 0.161.0 / installer 1.35.0 delivered, downloads out of the backups, a scanner on every push
# PART 2 — the night brief part 2 (run by day, 2026-10-20): your four answers, the safe undo, downloads out of the backups, Immich, the update test
**Safest readings taken alone (written first, as the brief asks):**
1. **R-1083 is not in agent 0.161.0.** An agent key would make 9202's controller book the agent's whole-guest backups,
one of which writes to ep0 — a change on ep0 the brief forbids; 9202 is also outside the `felhom` pool.
2. **All five downloaders' folders are `excluded`, not only the two named** (qBittorrent, Transmission; also NZBGet,
SABnzbd, MeTube): the brief's gate rule — a download folder is never optional or mandatory — covers all five.
3. **No update-test edge was run:** the bench (guest 9401) and the drill catalog are outside the brief's machines and
repos. The list done and the list left are written; the ask is on the morning list.
4. The brief was written for a night run and ran by day; its „stop by 05:00" was read as a time box, not a clock.
## Part 2 — in plain words
- **Morning list:** vouch agent 0.161.0 · decide D21 (Immich) · MeTube's videos out of the second-drive copy — keep? ·
the bench and the drill catalog for the update test — yes?
- **Hub 0.162.0 is live.** Its own deploy was the real restart test: Tester-2 (down since 4 October) got no repeat mail
— read in the hub and, separately, in your mailbox.
- **Agent 0.161.0 runs on demo-hp, Tester 1 and demo-felhom.** On demo-hp the agent said „busy" during a backup and
„free" before and after. **Not vouched — that is yours.**
- **Installer 1.35.0 is published.** The served file equals the tag's file.
- **A failed off-site restore now puts the app back exactly as it was** (your D20 = A, controller 0.336.0, the floor).
Proven on the scratch box: after a forced failure the database matched its fingerprints from before, the app ran,
nothing was held; a normal restore then worked.
- **Downloads are out of the backups** (torrent, usenet, MeTube): the controller's own check copies 0 of them now.
- **Immich's off-site copy:** 1.33 GB, of which 102 MB must survive. Two options; pick B (leave out the AI model files).
- **ep0's first weekly clean-up:** done this morning (Part 10 of part 1 below).
## Part 2 — each part
| Part | Done? | Why / how |
|---|---|---|
| 1a hub deploy | **done** | `manifests/hub.yaml` → 0.162.0 (`e1d349f1`), only Deployment/hub synced (the only OutOfSync); image `sha256:69285e64…` = the build; Synced/Healthy; reports from all three boxes; floor read 0.335.0; Day-0 agent list has no `-step1`. R-1001 + R-1011 closed. |
| 1b agent release | **done** | R-1083 left out (above). `release-agent.sh 0.161.0` from a clean clone; signed `agent_update` per box: demo-hp 06:38, Tester 1 06:54, demo-felhom 06:55 UTC, each COMPLETED, 76/76, committed. `host_busy` live; tunnel `absent` = the fixture row (9202's real Docker 29 answer); R-1010 by its tests. R-1070 + R-1010 closed. |
| 1b R-921 live | **not done** | The no-stop case happens only on the night schedule (a press backs up the local tier only). Row R-1173 with a dated check after demo-hp's next off-site night. |
| 1c installer | **done** | tag `installer-v1.35.0`, both webpage pins (`b0ae2c57`), webpage Deployment synced alone; served sha256 `f7a196fd…` = tag. R-1167 closed. |
| 2 safe undo | **done** | below. R-893 + R-1169 closed. |
| 3 downloads | **done, one read left** | catalog `c50adfc`, gate `download-binds`; classifier proof. demo-felhom (qBittorrent) runs its next second-drive copy 2026-10-21 03:30 — dated check on R-1019 (NARROWED). |
| 4 Immich | **done (plan only)** | below. R-49 → READY, D21. |
| 5 update test | **not done** | fixture side complete for every installed app; the edges need the bench / drill catalog (above). R-462 NARROWED. |
| 6 ep0 clean-up | **done** | part 1, Part 10. |
| 7 controller release | **done** | 0.336.0 below. |
## Part 2 — the safe undo, the 9202 proof (`07` §6.3; `audits/night2-2026-10-20/P2/`)
- Code `93fb251`: the fit check before the stop, the copy right after it (`backups/restore-undo/<app>/`), the put-back on
every failure branch, the hold only when the put-back fails, the copy removed on success. 11 tests; nine mutations red.
- **9202, rc.1** (a helper with the fences in full; Rallly + postgres 18; the same forced failure as on 19 October):
| | Live before | After the forced failure |
|---|---|---|
| public tables | 36 | 36 |
| markers | A, B, C, D | A, B, C, D |
| `r893_only_old` (backup only) | absent | **absent** (on 19 October: present) |
| schema / data / row-count md5 | `05828c77` / `e5c1a72f` / `d8bcbc4b` | **equal** |
| app | running | **running**, no hold |
| the copy | — | 69 MB in 0.9 s, removed after |
The sentence: „…visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai visszakerültek a visszaállítás
előtti állapotba, és az alkalmazás újra fut". Then a normal restore of the same snapshot: the snapshot's content
(A–C, the backup-only table present), the app running, the copy removed. 9202 back on 0.331.0 as found.
- Not measured live (each pinned by a red-proved test): the version-change branch, the `_files` sentence, the refusals
before the stop, a failing put-back, the operator event (9202 has no hub).
## Part 2 — download binds (`15` §7; `audits/night2-2026-10-20/P3/`)
| App | Bind (userdata) | Class now | Copied by a tier |
|---|---|---|---|
| qBittorrent | media/torrents | excluded (was optional) | none (was the second drive) |
| Transmission | media/transmission, media/transmission/watch | excluded, excluded | none |
| NZBGet | media/nzbget | excluded (was optional) | none |
| SABnzbd | media/usenet | excluded (was optional) | none |
| MeTube | media/metube | excluded (was optional) | none |
| Sonarr, Radarr | media (rw) | excluded | none |
| Jellyfin, Plex, Emby | media (:ro) | excluded | none |
| Prowlarr | no userdata bind | — | — |
## Part 2 — Immich (`audits/night2-2026-10-20/P4/immich-offsite-plan.md`)
Model cache 824 MB (62 %) · raw database folder 283 MB (21 %) · Immich's own backups 115 MB (9 %) · logical dump 54 MB
· originals 49 MB · thumbnails 2 MB. **A** (leave out all three re-fetchable parts, −92 %) needs a never-run restore
from the dump alone on the vectorchord image; **B** (only the model cache, −62 %) needs one restore with an empty cache.
**Pick B now**, A's other parts after their proof.
## Part 2 — update-test edges
None run (above). Installed apps: 16; with a fixture: 15; without: bentopdf (keeps no data). Upstream within a major,
waiting for a tested step: PrivateBin 2.0.6→2.1.0, Home Assistant 2026.9.4→2026.10.2, RomM 5.3.1→5.4.0, Plex
1.41.4→1.43.4, Kimai 2.67.0→2.70.0 (`audits/night2-2026-10-20/P5/r462-list.txt`).
## Part 2 — versions, commits, rows
- Hub 0.162.0 deployed (`e1d349f1`). Agent 0.161.0 released (`5152123`, tag `v0.161.0`; notes `4e1621c`). Installer
1.35.0 published (`b0ae2c57`). Controller 0.336.0 the floor (`93fb251`; notes `aa9e09e`, `7ca59e2`), image
`sha256:93cd67d8…8d73`. Catalog `c50adfc`. Evidence `301f4e9e`, `bcaa9576`.
- i18n: no page template changed; seven Go-side keys (HU + EN), one rewritten (R-1169); no fixture changed.
- **System poster:** no listed fact changed — none of the three.
- **Register 160 before, 156 after. Closed 7:** R-1001, R-1011, R-1167, R-1070, R-1010, R-893, R-1169. **Opened 3:**
R-1171 (demo-hp's local copy never restore-tested), R-1172 (the put-back logs at ERROR; an empty folder stays),
R-1173 (R-921's no-stop not yet seen live). Re-stated: R-1019 (NARROWED, dated 2026-10-21), R-1083, R-462 (NARROWED),
R-49 (READY, D21). **Both briefs together: 161 before, 156 after; closed 11, opened 6.**
## Observations — part 2
1. demo-hp's local whole-guest copy is never restore-tested: one copy kept, a 24 h settle, replaced at 24 h. FILED: R-1171
2. A successful put-back is logged at ERROR, and an empty `backups/restore-undo/` folder stays after a restore. FILED: R-1172
3. R-921's no-stop branch has no live observation yet (it needs a night schedule). FILED: R-1173
4. R-462's „only three apps are tested" was out of date: 58 apps have fixtures on both venues. NOT-A-FINDING: the row is re-stated with today's list.
5. The hub deploy at 06:03 UTC removed the old pod's log, which held the 07:10 Budapest off-site audit lines of today (R-895). NOT-A-FINDING: R-895's dated check is 2026-10-21; that run happens in the new pod.
6. In step 4 of the 9202 drill the data-only md5 differed from a read taken before snapshot 2, while the schema and every row count were equal. NOT-A-FINDING: the two reads were at different moments (the read, then the snapshot's own dump); the claim under test — before and after the forced failure — matched on all three fingerprints.
7. The helper's brief expected 37 tables after the normal restore; snapshot 2 has 36. NOT-A-FINDING: last night's 37 was the mixed state, not the snapshot (my arithmetic, corrected).
8. The first background wait loop for demo-hp's agent update printed a time and stopped before the box had updated. NOT-A-FINDING: the version was read directly and a foreground loop used instead.
9. A Python edit of the controller CHANGELOG failed on a quote character, and the commit carried only REPORT.md. NOT-A-FINDING: fixed by the next commit (`7ca59e2`).
## Part 2 — teardown
- Machine: 9202 back on 0.331.0 as found (Rallly removed through the product, the SFTP target, images and files removed
by name, settings and the off-box folder put back); demo-hp 9201's probe script removed.
- Host: demo-hp `/tmp` copies removed; nothing on `pve/data`; no whole-guest backup of 9202.
- Hub: per-box floors set and cleared; the global floor raised; nothing else.
- ep0: read only.
---
# PART 1 — the evening/night brief of 2026-10-19
## In plain words
+120
View File
@@ -0,0 +1,120 @@
# REPORT — the status page back to one screen, and a gate that keeps it there (2026-10-20, day)
## In plain words
The status page was 107 lines and 31,695 bytes; now it is 50 lines and about 5,500 characters outside the decide table,
which holds the 8 decisions that are still open. The „do" list went from about 25 items to 7 „still needed? (yes/no)"
questions, 2 morning-list items and 5 other lines (plus one „Later" line of row ids); CC checked the rest in the hub
and on DooPlex, and 7 were already done. **You answer:** the „Still needed? (yes/no)" list below, one word per line.
## Still needed? (yes/no) — copied from STATUS.md
1. Look at `roms/roms/` on the N100's drive in the file manager (R-1099). Since 2026-10-16.
2. The N100 sheet, about 30 minutes: Plex, the admins in Prowlarr, Sonarr and Radarr, your download sources
(`documentation/audits/n100-lived-in-2026-10-15/SHEET.md`). Since 2026-10-15.
3. Look at these pages on demo-hp when you have time: Calibre-Web („Adatok és mentés"), the file manager, AdventureLog,
Plex, the app page, the Plex and Sonarr guides („Útmutató"). Since 2026-10-16.
4. Remove the test server „plex-k6" from your Plex account (plex.tv → Settings → Authorized Devices). Since 2026-10-15.
5. Ask Google to index `https://felhom.eu/sajat-felho-tarhely` in Search Console (R-1035). Since 2026-10-14.
6. BIOS: on the N100, read „After Power Loss"; on the HP, set „Bypass F1 Prompt on Configuration Changes" to Enable.
Since 2026-10-14.
7. Pin the first Facebook post (R-917), and look at the new cover in the Facebook phone app (R-919). Since 2026-10-12.
## What CC checked, and how (method: the hub's GET pages with CC's scoped token, from the running pod; read-only local checks on DooPlex)
| „Do" item | Verdict | Evidence |
|---|---|---|
| Vouch agent 0.161.0 | **done** — the Day-0 manifest names 0.161.0 with the asked sha256 | `documentation/audits/status-view-2026-10-20/hub-reads.txt` |
| Delete the test customer Tester3 | **done** — not in the customer overview | same |
| Discard registrations 40 and 41 | **done** — the Hosts page has no „Unclaimed appliances" section (only `registered`/`bound` rows render) | same |
| Delete Tester4's old host `Tester4-31fa0e` | **done** — not on the Hosts page | same |
| Say „tear it down" for Tester 1's media tests | **done** — R-1022 closed 2026-10-17 | `CLOSED-ITEMS.md` |
| Hub master key into the password manager, then shred the file | **done** — `new.key` is gone; its folder is there (control) | `…/local-checks.txt` |
| Hub 0.153.0 „no token can …" | not a task — a statement; moved to history | — |
| Pull the failed disk Z6A07P2G | **not done** — still in DooPlex (lsblk; its twin is the control) | `…/local-checks.txt` |
| The Facebook `first-post/` leftovers | **not done** — 15 files still there | same |
| The `deny`-list edit in homelab-manifests | **not done** — still uncommitted | same |
| Old „broken" line: a Longhorn volume at 91 % | **gone** — Alertmanager lists only the two R-934 disk alarms | same |
| Old „broken" line: CI jobs get lost (R-887) | **gone** — R-887 closed 2026-10-19 (381 jobs, 0 lost) | `CLOSED-ITEMS.md` |
Every decided row (D1, D2, D10–D20) left the decide table only after its ruling was found in its closed row in
`CLOSED-ITEMS.md`. The whole old page is in `STATUS-HISTORY.md` under „Moved from STATUS on 2026-10-20" (headings
moved down two levels, otherwise unchanged).
## Register
- **Four numbers:** rows before **156**, after **153**, opened **1** (R-1174), closed **4**.
- **Closed:** R-1121 (the rotation file is gone; control `~/.bashrc`), R-1118 (its last part, R-1134, closed
2026-10-17; `sec doctor` all OK), R-231 (scripts in git and installed from it, the first run green; its same-disk
facts live on in R-232) — evidence in `CLOSED-ITEMS.md`, `audits/status-view-2026-10-20/local-checks.txt`,
`audits/answers-2026-10-12/s20-backup-scripts.txt`.
- **Merged:** R-993 into R-991 (one decision, D5; the proposal and the „no host floor at install" fact copied into R-991).
- **Narrowed:** R-132 (the hub password was rotated 2026-10-15; left: the break-glass hash field in the public repo);
R-1049 → WATCHING (the fix is live since hub 0.151.0; it no longer waits on the operator).
- **Owner cell fixed:** R-919 `CC` → `operator (upload + the look), then CC (close)` — its next action is the operator's.
- **Operator-owned rows (43), still waiting on the operator?** yes for all, except: R-933 — **CC first** (the size
measurement), then the operator's go; R-388 — **partly** (slice 1 is built; the scope decision is open);
R-920 — parked by the operator's own choice (c). On the page: decide D3–D9, D21; do (still needed, the rest);
the „Later" line for the remaining 23.
- **Rows over 4.5 KB (not rewritten, §N.7):** R-336 7.6 KB, R-516 7.0, R-462 6.8, R-433 6.7, R-264 5.8, R-919 5.0,
R-440 4.6, R-925 9.0.
## The gate — `scripts/status_view_gate.py` (R-1174)
- **Checks:** size outside the decide table (≤ 50 lines, ≤ 6,000 characters); one „Updated" paragraph (≤ 3 sentences,
no „Earlier" chain); no Hungarian letter outside a quote; every cited R-n open; no decided/closed/done row in the
decide table; the P1 row under „What is broken" or „decide"; every open row whose Owner names the operator under
„decide" or „do". Exit 0 clean, 1 convicted, 2 inconclusive (no sections, missing section, no or empty register).
- **Switch:** warn-first until **2026-10-27** (`SWITCH_DATE`), then a refusal; the date is also a due check for
R-1174, so the next push on or after that date names it.
- **Tests** (`scripts/test_status_view_gate.py`, 39 cases, all PASS): the genuine fixture before and after the switch;
the clean run's „what it looked at" line; per check, decoys that warn before and refuse from the switch — size (50
more lines; few lines and too many characters), updated (a prepended paragraph, an Earlier chain, four sentences, no
paragraph), english (a Hungarian do-line), open-ids (a closed row cited), decide (a DECIDED row; a „done" pick), p1
(the P1 line deleted; moved to What works), operator (the Later line deleted; a row only in „broken"); genuine
controls that must pass (a long decide table, version numbers in a sentence, Hungarian inside a quote); four
inconclusive cases; and the real `STATUS.md` against the real register.
- **Red-proof:** each check removed in turn → exactly its own decoys FAIL (size 4, updated 8, english 2, open-ids 2,
decide 4, p1 4, operator 4), then put back → 39/39. The switch moved to 2099 → the 14 „refuses" cases FAIL; moved
one day earlier → the 14 „warns on 10-26" cases FAIL. Put back → 39/39.
- **Run against the old page** (as it was at `2954b0be`): 75 convictions across all seven checks (81 lines, 25,472
characters outside decide; 13 decided rows; 24 operator rows missing; the P1 only in „do").
- Wired: `repo_gates.py` (fast set, docstring entry 19), `test_gate_decoys.py` (COVERS + runs the suite), found by
`script_tests_gate.py`; `decoy_coverage_gate.py` reports it COVERED.
## The CLAUDE.md edit (repo `felhom.eu/CLAUDE.md`, end-of-session checklist, line 139–141)
- **Before:** „… One screen, written for the operator in plain language, and deliberately **not** `CONTEXT.md`."
- **After:** the same, plus „(STE English) … How to update it:" and five numbered lines — replace the „Updated"
paragraph (never prepend; the old one to `STATUS-HISTORY.md`); a morning list under a dated sub-heading in „do";
remove what you finished; the decide-row rule; the gate checks it (R-1174).
- **Why allowed:** a format rule, not a loosened safety rule (`PROMPT-TEMPLATE.md` §9 rule 9, decision 150).
## Commits and the running session
`2954b0be` register pass · `9ec5f76a` the page · `1d7071e8` the gate · `54d1ee82` the instruction · this report.
**The rehearsal session shares this clone.** Its commit `f84f94d9` (audit evidence only) landed between my parts 1
and 2; it touched neither `STATUS.md` nor the register, so there was nothing to merge. **Its `git push` carried my
parts 2–4 to `origin` with its own** (the shared branch); its hook ran with `--scope=docs`. My own `--fast` run of the
same content was green (rc 0), and `scripts/push_scope.py` classifies the full range correctly as CODE. Its decoy
suite briefly planted changes in `website/gyik.html` and `scripts/felhom-host-install.sh` while I worked (R-928's
shape); I staged only my own paths, and both files were clean again afterwards. `unproven.py --summary`: unchanged
(NOT WALKED 35 of 55).
**Gate runs.** Every push: `repo_gates.py --fast`, rc 0 (the last one on the final tree, this report included). **Not
followed: „the full run before the last push".** The full run adds exactly one gate, `iso-bootstrap`, which starts a
container from an ISO image; on DooPlex that is a Docker run on production (workspace rule, and a standing feedback
memory), and it checks only `scripts/iso/`, which this session did not touch.
## Observations
- „My commits were pushed by the other session's push, under a docs-scope hook" — **NOT-A-FINDING:** CI re-runs the
whole fast set on every push whatever the hook's scope, and CI was green for every push of this session (by `head_sha` on the `jobs` endpoint, attempt 1 each): `2954b0be` job 2131, `54d1ee82` job 2132 (it carried parts 2–4), `c701b253` job 2133 — all `success`; the
shared-clone behaviour is already recorded (R-928, the shared-worktree rule).
- Tester4 shows DOWN with no host on the hub — **NOT-A-FINDING:** the rehearsal session reinstalls Tester4 today.
- „A Longhorn volume at 91 %" had no row — **NOT-A-FINDING:** the alarm is no longer active (Alertmanager, with the two
R-934 alarms as the control).
## Teardown
Provisioned nothing: no machine, no host, no hub write (GET only, CC's scoped token).
+52 -84
View File
File diff suppressed because one or more lines are too long
@@ -736,6 +736,19 @@ stayed (37 tables, the live app had 36); the definition did not move (same versi
answered 409. The restore page's „the database is back as it was" is false for it. Design note with the two options and
the pick (A: a copy of the app's live volumes, put back on failure — one copy's disk for the restore's length, a fit
check before the stop): `audits/night-2026-10-19/P3/design-R-893.md`; the decision is on `STATUS.md`.
**`[DESIGN]` 2026-10-20 — „put back exactly as it was" (R-893 option A, operator decision D20 = A, `09` §3 decision 192
second half; controller 0.336.0 is the floor).** Before the stop, every named volume the snapshot will replace is measured
and its copy is added to the restore's own free-space need (R-357's exact rule); too little room or an unmeasurable volume
refuses with nothing stopped. Right after the stop the volumes are tarred into `<namespace>/backups/restore-undo/<app>/`
(outside every capture set). On ANY failure after a volume or the definition moved, the copies are poured back, a volume
the snapshot added is removed, the live definition is written back and the app is STARTED; the household reads that the
restore failed and nothing changed (with placed files: its database and volumes are back, the copied files stay); the
operator gets `backup_run_failures` leg `restore-put-back`. The hold (`restore_mixed`) remains only for a put-back that
fails — then the copy is kept for support — and the double failure (replay AND rollback) holds as before. On success the
copy is removed. **`[FACT]` 2026-10-20 (9202, controller 0.336.0-rc.1, `audits/night2-2026-10-20/P2/live/`):** the same
forced failure as on 2026-10-19 → 36 tables, the backup-only table absent, schema/data/row-count md5 equal to before,
the app running, no hold, the copy (69 MB, 0.9 s) gone; a normal restore of the same snapshot then worked. The R-893
known limit above is closed for named volumes; placed FILES are still not taken back (the plain-files mix, as ruled).
**[DESIGN] 2026-08-22 — the failure ladder of a database restore: replay → rollback → hold.**
Recorded here rather than only in a closed register row, because a decision that survives only inside
@@ -0,0 +1,14 @@
# C1 reviewer 2 — delete and retention (fresh, read-only; clones at controller 7ca59e2)
| # | Sev guess | harm | mechanism |
|---|---|---|---|
| D1 | P1 (mech high, reach medium) | Shares second-drive copy: one drive group's reconcile deletes ANOTHER drive's share mirrors (on the night a drive is decommissioned/away; or every night when two groups target one drive, then a full re-copy) | `internal/backup/tier2_shares.go:135` groups by source; `:201-202` own destBase/legRels; `:230` `tier2ReconcileRoots(destBase, sharesTier2DestRoots(destBase), legRels)`; `:266-267` ReadDir lists every drive key on disk; `tier2.go:299-329` removes any child not in this group's legs; `shares_payload.go:233-251` away/decommissioned drives drop out |
| D2 | P1 optional legs / P2 mandatory; design question with a defect corner | A missing or emptied app folder on the drive deletes its second-drive copy within one night; optional legs (audiobooks, comics, ROMs, Immich external library) are in no other tier | `tier2_capture.go:55-61` missing leg skipped (optional silently) → `tier2.go:455` reconcile deletes its mirror; run recorded success `:465`; emptied → `rsync -a --delete` `tier2.go:751` via `:443`; catalog optional legs `audiobookshelf/.felhom.yml:24-26`, komga, romm, immich `:32-34`; 07 §8.2 „data legs are NOT guarded" covers a leg leaving the class set, not a declared-but-missing leg |
| D3 | P2 high (mech) | A host clock ahead during one whole-guest backup silences that tier until real time passes it; the hub reads the same clock and says OK | agent `internal/localapi/server.go:1178-1190` negative age never due; `internal/backup/runner.go:607-629` newest ctime unbounded; hub `monitor/deadline_tiers.go:155`, `deadline.go:243`; R-973 cap counts future entries `backup_cap.go:61`; restic: `offbox_window.go:133-136` pinned guard refuses every window → quota fills; NAS tier no guard `:209-216`; `offbox_abandon.go:248,287` set-aside rm on box clock |
| D4 | P2 | A failed LOCAL unit restore leaves the app running on mixed data, no undo copy (same as R1 of reviewer 1 — independent agreement) | `restore_unit.go:430-489`; `writeSafetyDump` only in `offbox_reconstitute.go`; 07 §6.3 ladder not scoped to off-site |
| D5 | P2 order defect / depth design | A dump that fails its own content check has ALREADY replaced last night's good dump; Tier-2 mirrors it an hour later | `appbackup/dbdump.go:388-397` size-only check, `:399` rename, `:419` `ValidateDump` after; `backup.go:688-690`; volume tars promoted with no content check `backup.go:902` |
| D6 | P3 med | „Megőrzött adatok" can list a RUNNING app's live folder as deletable leftover if its app.yaml is unreadable | `stacks/manager.go:672`; `kept.go:220-235` skips `!Deployed || AppConfig==nil`; `ListKept :330-358`; `DeleteKept :385-402` RemoveAll; `deploy.go:1180-1190` write+rename without fsync |
| D7 | P3 low-med | A unit restore can point the app back at an OLD drive; F5 then deletes the current drive's unit | `restore_unit.go:90-111, 507`; `cmd/controller/main.go:3252`; `deploy.go:820`; `backup.go:1517-1574` `pruneStalePrimaryDirs` even when this run's capture failed (`:726-733`) |
| D8 | P3/P4 design | local whole-guest keep=1 prunes the only good archive before the new one is proven | agent `runner.go:229`, `:139-161`, restore-test settle 24 h `:462` |
**Checked SAFE (reviewer):** hub off-site deletions by exact identity (`offsitekeys.go:366-515`); pinned off-site retention guard refuses future/too-new snapshots and big plans (`offbox_window.go:132-161`); dump and tar writes crash-safe (tmp+fsync+rename); R-403 hollow-unit guard; drive migration deletes source only after verify (`stacks/migrate.go:614-667`); app removal refusals and protected folders (`delete.go:136-153, 241-301, 839-846`); mirror/undo clean-ups allow-listed/prefix-guarded; agent prune never on PBS unless opted in; restore-test skips unsettled/future/foreign-key archives; `ForgetRetiredDrives` mount units only; SMB share removal deletes no folder. Not reviewed: agent `vzpartial` janitor, tenantsync/ep0 prune config, hub RESET beyond `PurgeRepos`.
@@ -0,0 +1,14 @@
# C1 reviewer 3 — keys that gate recovery (fresh, read-only; controller 7ca59e2, hub 5c48731, agent 4e1621c)
| # | Sev guess | harm | mechanism |
|---|---|---|---|
| K1 | P2 (P1 with K2 / a RESET) high | **A reinstall through „delete the old host first" (D19/R-1154) cuts the new box off from the household's escrow: the recovery code is never asked, a NEW key is minted, and the old off-site history is set aside by itself on night one; typing the old code answers „wrong code"** | hub `api/passphrase_scope.go:58` 409 forces the delete; `store.go:3204-3210` delete demotes escrow under the OLD host_id; `handler.go:1261` new host_id; `GetEscrowStatusForCustomer` `store.go:3500-3527` joins on `hosts` → nil (superseded join on deleted host also gone) → `identity_blob_present`/`superseded_present` false; controller `offbox.go:542-555` mints new pw, `:1788` no recovery offer, `:905-906` firstNight → `resetOrphanedRepo`; `handleHostEscrowRetainedGet` 404 for a deleted host (`handler.go:1691`); contrast purge `store.go:4185-4190` DOES include `host_deletions` |
| K2 | P2 high | Abandoning ONE set-aside copy deletes EVERY retained recovery package of the customer — other set-aside copies become ciphertext nobody can open | hub `handler.go:626-627` → `PurgeSupersededEscrowForCustomer` `store.go:4185-4190` deletes all rows for the customer (incl. deleted hosts); the comment at `:4176-4179` states the invariant it breaks |
| K3 | P3 med-high | A ceremony while off-site is not configured seals a package with NO repo password and supersedes the one that had it | controller `escrow_handlers.go:217` re-stage only when configured; agent `main.go:2975-2981`; hub `store.go:3392`; `escrow_confirm.go:222-258` stale card local only |
| K4 | P3 med | The global „create your recovery code" bar links to the ceremony the backups page hides while a recovery offer is outstanding | `backups_remote.html:144-160` vs `escrow_banner.go:23-33` + hu.json:1682; no `recoveryOffer()` refusal in the wizard/start handlers; settle gate `main.go:876`, `offsiteapply.go:84` |
| K5 | P3 med-high | After a reinstall recovered on the reuse path, the NEW PBS key K is never escrowed and nothing compares fingerprints | `felhom-pbs-apply:99` autogen; `escrow_confirm.go:182-205` auto-confirm on hash; no compare of `host_escrow.key_fingerprint` vs live key (agent `internal/backup/runner.go:407-429` only) |
| K6 | P3/P4 design | Whole-guest off-site (PBS) copies run before any escrow exists; host lost before the ceremony → unreadable archives | controller gates Tier 3 (`offbox.go:781`); agent `internal/backup`, `internal/pbsdr` have no escrow gate |
| K7 | P4 low | escrow PUT split in two statements; a failure leaves a row whose hash claims a key its blob lacks | hub `handler.go:1388, 1412-1420`; `store.go:3402-3408` |
| K8 | P4 | operator off-site re-issue resets the provider password before saving it | hub `offsite.go:217-245` |
**Checked SAFE (reviewer):** mint guard while the hub holds a package (`offbox.go:542-555, 659-720`); orphaned repo moved aside, never re-inited/deleted (`offbox.go:886-943, 332-397`); supersession retains both blobs (`store.go:3343-3416`); host delete demotes not destroys (`store.go:3164-3229`); ceremony two-word confirm; `escrow.Create` self-verifies; recovery refuses to replace a different local key; `ClearOffboxTarget`; PBS wrapper has no delete verb; hub abandon delete limited to one path after a delay (`offsitekeys/service.go:464-496`).
@@ -0,0 +1,24 @@
# C1 reviewer 1 — restore and rollback (fresh, read-only; clones at controller 7ca59e2 / v0.336.0)
Raw candidates as returned by the reviewer, condensed; each is UNVERIFIED until C2 marks it. File:line are in the controller unless named.
| # | Sev guess | harm | mechanism |
|---|---|---|---|
| R1 | P2 high | A local / second-drive unit restore that fails halfway restarts the app on half-replaced data, no undo copy; the next night's capture then overwrites the only restore point with the broken state | `internal/backup/restore_unit.go:429-431` failed stop only warns; `restore.go:217-218` `docker volume rm -f` error ignored before untar (10-min limit `:237-241`); `restore_unit.go:466-486` DB replay failure → app started anyway; one restore point per app, promoted in place (`atomicPromoteTar`) |
| R2 | P2 high | A power cut / controller restart during a restore starts the app on a mixed state; the undo copy is never used at boot | `offbox_reconstitute.go:942` marker → `appstop_marker.go:307` StartStack with no restore check; `offbox_restore_undo.go:137` undo dir only dropped, never read at start; unit restore and .fab import set no marker → `bootrecon/bootrecon.go:210-213,269` starts the app; updates have a journal (`stacks/update.go:1420-1489`), restores do not |
| R3 | P2 high | A cut-off shared-folder restore can be „placed" and reported as restored while files are missing; scratch deleted | `shares_restore.go:138` readiness = `rErr == nil && len(entries) > 0` (R-358 class, not fixed for shares); 30-min ctx `web/offbox_handlers.go:716`; place reports N files and deletes scratch `:301`; free-space gate fails open and fixed 2 GiB `:107` |
| R4 | P2 high | A `.fab` export silently drops a whole drive folder that contains a symlink; import never sets owners | `appexport/fabplan.go:292` `tar.FileInfoHeader(info,"")` then `os.Open`+`io.Copy` on a symlink; `export.go:714` warn-and-continue; `assertBundleDataComplete` refuses only when no data at all; `restore.go:1157-1176` extracts only dirs/regular files, no chown |
| R5 | P2 med-high | Second-drive whole restore swaps files, then refuses the DB half, leaves the app STOPPED and says „the app is untouched" | `tier2_whole.go` stops + merges first, then `RestoreFromRecoveryUnitAtWith` whose refusals (`restore_unit.go:366-371, 386-389, 413-416, 420-423`) assume nothing happened; en.json:2667 „the restore did not start. The app is untouched" |
| R6 | P2 med | `.fab` import into a STOPPED app merges into existing volumes; the default export (stop box ticked) has no SQL dump | `appexport/restore.go:361-374` volumes removed only if running; `docker cp` merge `:721`; `templates/app_data.html:221` stop default; `export.go:262` stop before `dumpDatabase` `:366`; `appbackup/dbdump.go:142` discovers only running containers |
| R7 | P2/P3 high | `.fab` import has no concurrency guard, no undo, no record | `restore.go:181-186`; `web/handler_export.go:312-353` no `restoreOpBlocked()`; `RemoveStackVolumes` before anything else, no copy |
| R8 | P2 med | `.fab` import drops the family gate, sign-up lock and version pin → a family-only app opens to anyone | `cmd/controller/main.go:3517-3530` bare `AppConfig`; `stacks/family_gate.go:173-190` removes the gate file when `FamilyGate == nil`; R-773 fix only on the unit path (`stacks/deploy.go:840-870`) |
| R9 | P3 med | `.fab` import trusts the bundle's HDD_PATH; empty → relative path; older userdata overwrites newer | `restore.go:589-631` |
| R10 | P3 high | `.fab` DB import: plain psql without ON_ERROR_STOP; postgis not classified | `restore.go:1052-1053`, `:928-937` |
| R11 | P3 med | volume replace never checks the old volume is gone | `restore.go:218` |
| R12 | P3 high | interrupted second-drive whole restore leaves `<dst>.felhom-restoring` (O_EXCL) → every retry fails „file exists" | `tier2_whole.go:86` |
| R13 | P3 design | full off-site download capped at 30 min per press; household not told to retry | `web/offbox_handlers.go:455` |
| R14 | P4 med | place/full restore re-read the LATEST snapshot instead of the downloaded one | `offbox_restore.go:675-679`, `offbox_reconstitute.go:657-661` |
**Inventory drift (July → now):** three more customer restore entries exist: the Tier-2 unit restore (R-102), the Tier-2 whole restore (decision 26, `tier2_whole.go`), the kept-data Load (`kept_load.go`).
**Checked SAFE (reviewer):** `.fab` path confinement (`appexport/restore.go:1104-1107,1152-1155`; `validate.go:28-66`; `web/handler_export.go:385-394`); off-site placement map refuses `..`/outside/`backups/` (`offbox_restore.go:603-640`); R-358 marker after restic success; full off-site restore fit/safety-dump/undo checks before stop, fail closed (`offbox_reconstitute.go:719-818, 909-927`); Tier-1 refusals before change; main loader `ON_ERROR_STOP=1 --single-transaction` (`appbackup/dbdump.go:775-784`); Tier-2 file restore `rsync --ignore-existing`, never `--delete`; whole restore newer-wins + Lchown; **NFC/NFD: no normalisation anywhere — every lane compares bytes, so the missing-only compare sees TWO names (consistent on one filesystem)**; agent RestoreLXC force only when asked. Not reviewed: `kept_load.go`, hub operator restore paths.
@@ -0,0 +1,40 @@
# C1 reviewer 4 — time and concurrency (fresh, read-only; controller 7ca59e2, agent 4e1621c, felhom.eu 5c48731)
## (A) Schedulers and what each does on Sunday 2026-10-25 (03:00 CEST → 02:00 CET; 02:00–02:59 happens twice)
| owner | job | schedule | zone | file:line | 2026-10-25 | after 3 days off |
|---|---|---|---|---|---|---|
| controller | db-dump | daily W (default 02:30) | Budapest (`time.Date`, day+1) | main.go:1262, scheduler.go:499-518 | once, at the SECOND 02:30 (CET = 01:30Z) — Go normalises the ambiguous time to the later offset | not replayed by the scheduler; the catch-up runs it once 15 min after start (nightchain.go:277-345) |
| controller | tier2-backup | W+60m | Budapest | main.go:1352 | once, 03:30 CET | once, by the catch-up |
| controller | offbox-backup + app-update leg | W+105m | Budapest | main.go:1519 | once, 04:15 CET | catch-up runs the off-site leg only |
| controller | offsite-abandon-sweep 05:10, offsite-proof 05:30, offsite-integrity 06:00 | fixed | Budapest | main.go:1561, 1613, 1591 | once | **no catch-up** (finding T6) |
| controller | metrics-prune 04:00, fill-watch 03:30, asset-sync 05:00, selfupdate-auto 04:30 (off by default) | fixed | Budapest | main.go:1621,1671,1768,1741 | once | floor update runs on any hub reply |
| controller | whole-guest quiesce loop | poll 5 min; gate [W+2h, W+6h) by wall minute; valve when age > cadence+24h | Budapest wall | quiesce.go:150, 191-205, 790-818 | gate 04:30–08:30 CET (4 h real) | valve fires ~5 min after start, any time of day |
| controller | ~20 `Every` tickers | monotonic | n/a | main.go:898-2146 | unaffected | restart at boot |
| agent | whole-guest due | age ≥ cadence | UTC | localapi/server.go:1182-1192 | unaffected | due at once |
| agent | restore-test | 30 min after start, then 6 h | UTC | backup/schedule.go:148-177 | unaffected | after 30 min |
| agent | OS leg (+ kernel reboot if hub „Tonight") | after any non-manual primary backup +90 s, 20 h min gap | no wall clock | server.go:982-986, main.go:1272-1280, leg.go:655-664, kernel.go:101-114 | follows the backup | follows the valve backup = daytime (T8) |
| agent | fstrim | hourly; due Wed 10:00, only 10:00–20:59 | host local | fstrim/fstrim.go:39-50,110 | n/a | next eligible hour |
| hub | scheduleDaily: db-snapshot 02:00 (keep 2), prune 04:30, deadline-check 05:00, offsite-key-audit 07:10 | `next.Add(24*time.Hour)` | Budapest | hub cmd/hub/main.go:1049-1072 | **every job runs TWICE** (T9) | n/a |
| host timers | mgmt-watchdog, crash-guard-check | monotonic | n/a | felhom-agent/configs/*.timer | unaffected | after boot |
| DooPlex timers | hub-db-backup 02:30; dooplex-offsite 00:20; hub-db-restore-test Sun 04:30; offsite-restore-test Sun 05:30; ep0-copy-gc 08:00 | OnCalendar local | DooPlex | felhom.eu/scripts/*/*.timer | Oct 25 is a Sunday: both weekly restore tests run on the DST day; 02:30 is in the repeated hour (systemd behaviour not verified) | Persistent=true |
## (B) Candidates
| # | Sev guess | harm | mechanism |
|---|---|---|---|
| T1 | P2 med-high | The nightly second-drive mirror (`rsync --delete`) can run DURING a restore from that same mirror and delete the files not yet copied back | `tier2.go:479-520` RunAllTier2 checks held/version/disconnected only; `:443` mirror, `:744-751` `--delete`; restore `tier2_whole.go:301` takes only `acquireRunning`; Tier-2 leg takes only `LegLock` (main.go:1348-1352); `update_guard.go:595-601` isHeld ignores restores |
| T2 | P2 if true; low-med | The Debian 13 controller image may lack tzdata → every schedule on UTC silently | `Dockerfile:77-100` debian:13.7-slim, no tzdata, no `time/tzdata` import; fallbacks scheduler.go:19-23 (logs), quiesce.go:749-751 (silent), funcmap.go:62-66 |
| T3 | P3 med | Whole-guest start creeps ~5 min/night until a night is skipped silently | agent `server.go:1184` `age >= Cadence` no slack; age from archive start; controller poll 5 min `quiesce.go:150`; gate refusal `:807-818` |
| T4 | P3 med-high | The whole-guest quiesce stops apps in the middle of a restore or an update | `quiesce.go:213-275` no `IsRunning()`/restore check; `RunningAppStacks` (stacks/manager.go:620-636); `TriggerNow` (:419-445) same; `DumpAppVolumesSafe` (backup.go:1001-1045) can restart an app quiesce stopped |
| T5 | P3 high | The nightly off-site copy is skipped SILENTLY when anything else holds the backup flag, and the catch-up never retries | `offbox.go:981-996` INFO „skipped — another backup is running" return nil; `withLeg` MarkEnded unconditionally (main.go:1246); proof 05:30 / integrity 06:00 take the same flag |
| T6 | P3 high | Off-site check and proof never run on a box off at 05:30–06:00; the code comment says the opposite | main.go:1575-1577 comment vs 1591-1619; `catchUpLegs` nightchain.go:17-18; no hub alarm on integrity/proof age |
| T7 | P3 high | Hub raises a false „no DB dump" error every morning for W after ~04:45 or evening W | hub `monitor/deadline.go:416-419` midnight Budapest; `:556-565` → `expected_dbdump_missed`; hub has no idea of W |
| T8 | P3 design | The OS leg and kernel reboot follow ANY scheduled backup, including the daytime valve after power-on | agent server.go:982-986; main.go:1279 labels „night"; kernel.go:101-114; hub osupdates/kernel.go:46-48,181-185 |
| T9 | P4 high | Hub daily jobs run TWICE on 25 October (db-snapshot keep-2 prunes a day early; duplicate deadline alarms); once an hour late in spring | hub cmd/hub/main.go:1058-1062 `next.Add(24*time.Hour)`; the controller fixed this (scheduler.go:511-516) |
| T10 | P4 high | Spring forward 2027-03-28: db-dump and tier2 fire at the same instant; tier2 may mirror yesterday's unit | scheduler normalisation; `LegLock` main.go:1237 plain mutex |
| T11 | P4 design | A clock ahead stops whole-guest backups silently (same as D3) | server.go:1182-1192; quiesce.go:816-817; deadline.go:244; backup_cap.go:61 |
| T12 | P4 high | self-update busy check before the image pull, swap after it with no re-check | updater.go:532-545, :764 |
| T13 | P4 med | double-clicking a restore shows it as failed while it runs | handlers.go:1853, :1874 `BeginRestoreOp` after the check; second POST's `EndRestoreOp(false)` |
**Checked SAFE (reviewer):** controller DST day+1 arithmetic and late-fire skip (scheduler.go:342-348, 511-516); night ledger persisted, seeded, one catch-up for many nights; quiesce marker persisted and recovered; in-memory backup flag (no stale lock); flock-based OS-leg locks; restic stale locks self-heal; two restores blocked by `m.running`; Remove refused during restore/quiesce; catch-up and whole-guest wait for each other; agent due/cap UTC durations; off-site prune guard refuses future snapshots; host power-off re-checks; no cron/OnCalendar in the installer; hub staleness uses the hub's own receive clock.
@@ -0,0 +1,22 @@
# C2 register search, 2026-10-20T10:11:13Z, OPEN-ITEMS.md + CLOSED-ITEMS.md at c701b253; grep -ciE
1 open / 2 closed : R-893
0 open / 0 closed : tier2_shares|_shares.*tier|shares.*second.drive|Megoszt.*2\. ment
0 open / 2 closed : host_deletions|retained.*delet|deleted host|escrow.*reinstall
2 open / 7 closed : scheduleDaily|DST|daylight|oraallit|time.?zone
1 open / 8 closed : restore-undo|undo copy|safety dump|unit restore.*fail
1 open / 0 closed : ValidateDump|dump.*replac.*valid
0 open / 0 closed : SharesScratchReady|shares.*scratch|shares restore
0 open / 4 closed : tier2_whole|whole restore|Teljes vissza
0 open / 3 closed : optional leg|missing on disk|--delete
0 open / 0 closed : PurgeSuperseded|abandon.*purge
0 open / 1 closed : future.dated|clock ahead|clock.*future|negative age
0 open / 0 closed : another backup is running
1 open / 2 closed : expected_dbdump_missed
2 open / 1 closed : symlink
0 open / 1 closed : family.gate.*fab|fab.*family|\.fab
0 open / 0 closed : felhom-restoring
0 open / 0 closed : quiesce.*restore|restore.*quiesce
1 open / 4 closed : offsite-proof|integrity.*catch|proof.*catch
0 open / 0 closed : double.click|dupla
0 open / 1 closed : disconnected.*target|away.*target
Every non-zero hit was read: none describes the candidate (positive control R-893 found in both).
@@ -0,0 +1,51 @@
# C2 — the main session's verdict on every candidate (2026-10-20)
Method: each candidate's `file:line` read in LIVE source (controller `7ca59e2` = v0.336.0, agent `4e1621c`, felhom.eu
`5c48731`+); then (a) the register searched, open AND closed, with ASCII fragments — positive control `R-893` found in
both; (b) the design test against `07-backup-architecture.md` and `CONTEXT.md`. Verdict words:
- **CONFIRMED** — the mechanism read true in live source AND a proof ran (unit test against production code, or live).
- **CONFIRMED-CODE** — the mechanism read true in live source; no proof ran yet.
- **PLAUSIBLE** — the reviewer's reading, spot-checked only.
- **NOT-A-FINDING** — with the reason.
Register: none of the candidates below is in OPEN-ITEMS or CLOSED-ITEMS (searches in `C2-register-search.txt`).
| id | verdict | design or defect | note |
|---|---|---|---|
| **D1** shares second-drive copy pruned by another drive's group | **CONFIRMED** (unit test, production code, fake mirror seam — `C3-D1-shares-tier2/`) | defect | **Worse than reported:** with shares on two drives that pick the same target, EVERY night the second group's reconcile deletes the first group's copy (`removed stale dest dir hdd_2/b_share`) — one drive's shares never have a second copy while the run says ok. And the night a drive goes away, its copy is deleted (`removed stale dest dir hdd_3/csaladi_fotok`). |
| D1b an AWAY drive is still chosen as the second-drive target | CONFIRMED-CODE (+ the same unit test: `hdd_3/iskola => hdd_1/...` after hdd_1 was marked disconnected) | defect | `tier2.go:151-180` loops `GetSchedulableStoragePaths()` (`settings.go:1593-1603` excludes only Decommissioned); no Disconnected check. On a real box the away drive's empty mount point is on the guest's root disk |
| **K1** reinstall after „delete the old host" loses the route to the old escrow | **CONFIRMED** at the hub store (unit test against production code, `C3-K1-escrow-after-host-delete/`); the controller half (new key minted, history set aside on night one) CONFIRMED-CODE | defect (03 §8a / 07 §7.0 promise the route; D19+R-1154 removed it unrecorded) | hub `store.go:3164-3229` demotes into `host_escrow_superseded` under the OLD host_id and deletes the `hosts` row; `GetEscrowStatusForCustomer` `store.go:3499-3527` joins on `hosts` → nil for the new box; `customer_reset.go:48,155` and `store.go:4189` DO include `host_deletions`. Live proof needs Tester4 off-site ON (B7) |
| K2 abandoning one set-aside copy purges every retained package | CONFIRMED-CODE (`store.go:4185-4190`) → R-1182 | defect (breaks `store.go:4176-4179`'s own invariant) | `store.go:4185-4190` customer-wide delete read true |
| **R1/D4** a failed LOCAL unit restore: no copy of the live state, app started anyway | **CONFIRMED LIVE** on 9202 (`C3-R1-local-restore-9202/`): live row destroyed, DB crash-loops, no undo copy, raw English Docker text to the household | **design question** for the operator: decision 154 (R-638 A) chose „start anyway"; D20 (R-893 A) gave „put back exactly" to the OFF-SITE path only | `restore_unit.go:428-489` |
| R2 a crash mid-restore starts the app on a mixed state; the undo copy is never read at start | PLAUSIBLE | defect | `appstop_marker.go:307`, `offbox_restore_undo.go:137` |
| R3 a cut-off shares restore can be placed and reported restored | CONFIRMED-CODE | defect (R-358 class, fixed for apps, not shares) | `shares_restore.go:131-140` readiness = non-empty dir |
| R4 `.fab` export drops a drive folder holding a symlink | PLAUSIBLE | defect | `appexport/fabplan.go:292`, `export.go:714` |
| R5 second-drive whole restore: files swapped, then the unit half refuses → app left STOPPED, text says „untouched" | **CONFIRMED** (unit test, production code: `C3-R5-whole-restore/` — 1 file restored + 1 replaced, app stopped, no start, message „az alkalmazás és az adatai érintetlenek") | defect | `tier2_whole.go:301-340`: stop + merge, then `RestoreFromRecoveryUnitAtWith` whose early refusals return before its own stop/start; `hu.json` `err.backup.unit_versions_mixed` „Az alkalmazás érintetlen" |
| R6 `.fab` import into a stopped app merges volumes | PLAUSIBLE | defect | `appexport/restore.go:361-374` |
| R7 `.fab` import has no guard / undo / record | PLAUSIBLE | defect | |
| R8 `.fab` import drops the family gate | **CONFIRMED LIVE** on 9202 (`C3-R1187e-fab-family-gate/`: stranger 401 before, 200 after the import) → **R-1191 (P1)** | defect | `cmd/controller/main.go:3517-3530`, `stacks/family_gate.go:173-190` |
| R9–R11, R13, R14 | PLAUSIBLE | defect / design (R13) | low |
| R12 interrupted whole restore leaves `*.felhom-restoring`, every retry fails | **CONFIRMED** (unit test: `C3-R12-leftover-temp/`) → R-1188 (c) | defect | `tier2_whole.go:86-87` O_EXCL; removed only on an in-process error |
| **D2** a missing / emptied app folder deletes its second-drive copy within one night | **CONFIRMED** for a MISSING folder (unit test, production code + real copy seam: `C3-D2-missing-leg/` — mirror of `photos` deleted, run „ok", the warning says only „nem kerültek a másodlagos mentésbe"); the EMPTIED case CONFIRMED-CODE (`rsyncMirror` = `rsync -a --delete`, `tier2.go:744-751`; the test seam does not delete) | defect-shaped corner of a choice: 07 §8.2 „data legs are NOT guarded" is about a leg LEAVING the class set; this is a declared leg that is MISSING, which the code itself logs as a gap (`tier2_capture.go:55-61`) and then reconciles away (`tier2.go:454`) | P1 for optional legs (no other tier holds them) |
| D3 / T11 a host clock ahead silences the whole-guest tier; the hub reads the same clock | PLAUSIBLE (B6 #8 on the rehearsal VM is its live test) | defect | agent `localapi/server.go:1178-1190` |
| D5 a dump that fails its own check has already replaced the good one | **CONFIRMED** (unit test with a docker stub: `C3-D5-dump-replaced/`) → R-1185 | defect for the ORDER | `appbackup/dbdump.go:388-422`: size check, rename (`:399`), then `ValidateDump` |
| D6 kept-data page can list a running app's folder | PLAUSIBLE | defect | needs an unreadable app.yaml |
| D7 unit restore can point the app at an old drive | PLAUSIBLE (low) | defect | |
| D8 local whole-guest keep=1 | design (07 §6.1 R-684 chose it) | design | **NOT-A-FINDING: the operator chose keep=1 for demo-hp; recorded in 07** |
| T1 the nightly mirror (`rsync --delete`) can run during a restore from that mirror | **CONFIRMED** (unit test, production rsync mirror: `C3-T1-mirror-during-restore/`) → R-1180 | defect | `RunAllTier2` (`tier2.go:479-520`) takes no backup flag; the whole restore holds only `acquireRunning` (`tier2_whole.go:301`) |
| T2 controller image without tzdata → UTC schedules | **NOT-A-FINDING:** measured on 9202 (controller 0.331.0, Debian 13 base): `/usr/share/zoneinfo/Europe/Budapest` present, scheduler logs „scheduled for … CEST" | — | |
| T3 whole-guest start creeps ~5 min/night | PLAUSIBLE | defect | needs the agent journal over weeks |
| T4 whole-guest quiesce stops apps mid-restore | PLAUSIBLE | defect | `quiesce.go:213-275` |
| T5 nightly off-site copy skipped SILENTLY when the flag is held; catch-up never retries | CONFIRMED-CODE → R-1186 | defect (the code chose nil for the nightly path; the catch-up gap is not chosen) | `offbox.go:981-996`, `main.go:1246` |
| T6 proof / integrity never run on a box off at 05:30–06:00 | PLAUSIBLE | defect (comment `main.go:1575-1577` says the opposite) | |
| T7 hub false „no DB dump" for late or evening W | PLAUSIBLE | defect | hub `monitor/deadline.go:416-419, 556-565` |
| T8 the OS leg follows a daytime valve backup | design question | design | 07 §6.1 / 11 §8.1 set no time bound |
| **T9** hub daily jobs run TWICE on 2026-10-25 | **CONFIRMED** (replay of the hub's exact arithmetic, `C3-T9-hub-dst/replay.txt`) | defect | deadline-check fires 04:00 CET AND 05:00 CET; db-snapshot twice (keep-2 → the previous day's copy pruned a day early). **In five days, on the live hub.** |
| T10 spring forward collision | PLAUSIBLE | defect (P4) | |
| T12, T13 | PLAUSIBLE | defect (P4) | |
| K3–K8 | PLAUSIBLE | K6 design | |
**NFC/NFD (the brief's question for A.1.4):** reviewer 1 found no normalisation anywhere — rsync, restic and the Go
merge compare names byte for byte, so the missing-only compare sees **two names** for the NFC/NFD pair. The household
data carries the pair; B8 measures it live.
@@ -0,0 +1,26 @@
# go test at controller main 7ca59e2 (v0.336.0), scratch clone, fake mirror seam (no rsync/docker); 2026-10-20T10:04:31Z
=== RUN TestRehearsalD1_DeadDriveShareCopyIsPruned
zz_rehearsal_d1_test.go:46: drive keys: map[hdd_1:hdd_1 hdd_2:hdd_2 hdd_3:hdd_3]
zz_rehearsal_d1_test.go:47: POSITIVE CONTROL — copies after run 1 (both drives present): [hdd_1: hdd_3/iskola hdd_2: hdd_1/csaladi_fotok]
zz_rehearsal_d1_test.go:48: mirror calls run 1: [hdd_1/csaladi_fotok=>hdd_2/backups/secondary/_shares/hdd_1/csaladi_fotok data/shares-payload=>hdd_2/backups/secondary/_shares/_payload hdd_3/iskola=>hdd_1/backups/secondary/_shares/hdd_3/iskola data/shares-payload=>hdd_1/backups/secondary/_shares/_payload]
zz_rehearsal_d1_test.go:56: FAULT — copies after run 2 (hdd_1 away): [hdd_1: hdd_3/iskola hdd_2: hdd_1/csaladi_fotok]
zz_rehearsal_d1_test.go:57: mirror calls run 2: [hdd_3/iskola=>hdd_1/backups/secondary/_shares/hdd_3/iskola data/shares-payload=>hdd_1/backups/secondary/_shares/_payload]
--- PASS: TestRehearsalD1_DeadDriveShareCopyIsPruned (0.02s)
=== RUN TestRehearsalD1_TwoGroupsOneTarget
zz_rehearsal_d1_test.go:73: copies after two runs: [hdd_1: hdd_3/c_share hdd_2: hdd_1/a_share]
zz_rehearsal_d1_test.go:75: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_1 → hdd_2/backups/secondary/_shares (18 B)
zz_rehearsal_d1_test.go:75: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_3 → hdd_1/backups/secondary/_shares (36 B)
zz_rehearsal_d1_test.go:75: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_1 → hdd_2/backups/secondary/_shares (18 B)
zz_rehearsal_d1_test.go:75: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_3 → hdd_1/backups/secondary/_shares (36 B)
--- PASS: TestRehearsalD1_TwoGroupsOneTarget (0.01s)
=== RUN TestRehearsalD1_SameTargetThenDriveDies
zz_rehearsal_d1_test.go:89: POSITIVE CONTROL run 1: [hdd_1: hdd_3/csaladi_fotok]
zz_rehearsal_d1_test.go:91: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_2 → hdd_1/backups/secondary/_shares (18 B)
zz_rehearsal_d1_test.go:91: LOG [INFO] [backup] Tier 2 reconcile: removed stale dest dir hdd_2/b_share
zz_rehearsal_d1_test.go:91: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_3 → hdd_1/backups/secondary/_shares (42 B)
zz_rehearsal_d1_test.go:100: FAULT run 2 (hdd_3 away): [hdd_1: hdd_2/b_share]
zz_rehearsal_d1_test.go:102: LOG [INFO] [backup] Tier 2 reconcile: removed stale dest dir hdd_3/csaladi_fotok
zz_rehearsal_d1_test.go:102: LOG [INFO] [shares] tier-2 copied 1 share(s) from hdd_2 → hdd_1/backups/secondary/_shares (18 B)
--- PASS: TestRehearsalD1_SameTargetThenDriveDies (0.01s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.049s
@@ -0,0 +1,104 @@
package backup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate D1). Never committed.
import (
"os"
"path/filepath"
"sort"
"testing"
)
func listShareCopies(env *sharesEnv) []string {
var out []string
for name, d := range env.drives {
base := filepath.Join(NamespaceRoot(d, true), "backups", "secondary", SharesPseudoStack)
keys, _ := os.ReadDir(base)
for _, k := range keys {
if !k.IsDir() || k.Name() == filepath.Base(sharesPayloadDestRel) {
continue
}
subs, _ := os.ReadDir(filepath.Join(base, k.Name()))
for _, s := range subs {
out = append(out, name+": "+k.Name()+"/"+s.Name())
}
}
}
sort.Strings(out)
return out
}
func keyOwner(env *sharesEnv) map[string]string {
m := map[string]string{}
for name, d := range env.drives {
m[sharesDriveKey(d)] = name
}
return m
}
// A drive whose shares were mirrored goes away; another share group's run lands on the same target.
func TestRehearsalD1_DeadDriveShareCopyIsPruned(t *testing.T) {
env := newSharesEnv(t, "hdd_1", "hdd_2", "hdd_3")
env.addShare(t, "hdd_1", "csaladi_fotok", true)
env.addShare(t, "hdd_3", "iskola", true)
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
t.Logf("drive keys: %v", keyOwner(env))
t.Logf("POSITIVE CONTROL — copies after run 1 (both drives present): %v", listShareCopies(env))
t.Logf("mirror calls run 1: %v", env.mirrored)
if err := env.sett.SetDisconnected(env.drives["hdd_1"], true, nil); err != nil {
t.Fatal(err)
}
env.mirrored = nil
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
t.Logf("FAULT — copies after run 2 (hdd_1 away): %v", listShareCopies(env))
t.Logf("mirror calls run 2: %v", env.mirrored)
}
// Shares on two drives that both pick the SAME target: does group A's reconcile remove group B's copy?
func TestRehearsalD1_TwoGroupsOneTarget(t *testing.T) {
env := newSharesEnv(t, "hdd_1", "hdd_2", "hdd_3")
env.addShare(t, "hdd_1", "a_share", true)
env.addShare(t, "hdd_3", "c_share", true)
var removed []string
env.m.logger = newCaptureLogger(&removed)
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
t.Logf("copies after two runs: %v", listShareCopies(env))
for _, l := range removed {
t.Logf("LOG %s", l)
}
}
// Shares on hdd_2 and hdd_3 (both pick hdd_1 as target). Then hdd_3 dies.
func TestRehearsalD1_SameTargetThenDriveDies(t *testing.T) {
env := newSharesEnv(t, "hdd_1", "hdd_2", "hdd_3")
env.addShare(t, "hdd_2", "b_share", true)
env.addShare(t, "hdd_3", "csaladi_fotok", true)
var logs []string
env.m.logger = newCaptureLogger(&logs)
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
t.Logf("POSITIVE CONTROL run 1: %v", listShareCopies(env))
for _, l := range logs {
t.Logf(" LOG %s", l)
}
logs = nil
if err := env.sett.SetDisconnected(env.drives["hdd_3"], true, nil); err != nil {
t.Fatal(err)
}
if err := env.m.RunSharesTier2(); err != nil {
t.Fatal(err)
}
t.Logf("FAULT run 2 (hdd_3 away): %v", listShareCopies(env))
for _, l := range logs {
t.Logf(" LOG %s", l)
}
}
@@ -0,0 +1,18 @@
package backup
import (
"log"
"strings"
)
type capW struct{ dst *[]string }
func (c capW) Write(p []byte) (int, error) {
s := string(p)
if strings.Contains(s, "reconcile") || strings.Contains(s, "tier-2 copied") {
*c.dst = append(*c.dst, strings.TrimSpace(s))
}
return len(p), nil
}
func newCaptureLogger(dst *[]string) *log.Logger { return log.New(capW{dst}, "", 0) }
@@ -0,0 +1,8 @@
# go test at controller 7ca59e2 (v0.336.0), scratch clone; the real copyTree mirror seam (rsync --delete stands in by copyTree for the emptied case — see note); 2026-10-20T10:19:17Z
=== RUN TestRehearsalD2_MissingAndEmptiedLegDeleteTheirMirror
zz_rehearsal_d2_test.go:22: POSITIVE CONTROL after run 1: mirror photo=true doc=true
zz_rehearsal_d2_test.go:33: run 2 err=<nil>; status="ok" warning="Figyelmeztetés: a(z) app alkalmazás egyes adatmappái nem kerültek a másodlagos mentésbe: appdata/app/photos."
zz_rehearsal_d2_test.go:34: FAULT after run 2: mirror photo=false doc=true (the second-drive copy is the household's only local copy of these files)
--- PASS: TestRehearsalD2_MissingAndEmptiedLegDeleteTheirMirror (0.02s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.030s
@@ -0,0 +1,35 @@
package backup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate D2). Never committed.
import (
"os"
"path/filepath"
"testing"
)
func TestRehearsalD2_MissingAndEmptiedLegDeleteTheirMirror(t *testing.T) {
m, src, target, prov := newTier2V2(t, "app")
prov.has["app"] = true
prov.binds["app"] = []ClassifiedBind{mHDD("appdata/app/photos"), mHDD("appdata/app/docs")}
mustWrite(t, filepath.Join(src, "appdata", "app", "photos", "family.jpg"), "PHOTO")
mustWrite(t, filepath.Join(src, "appdata", "app", "docs", "contract.pdf"), "PDF")
if err := m.RunTier2("app"); err != nil {
t.Fatal(err)
}
destBase := filepath.Join(target, "backups", "secondary", "app")
photo := filepath.Join(destBase, "hdd", "appdata", "app", "photos", "family.jpg")
doc := filepath.Join(destBase, "hdd", "appdata", "app", "docs", "contract.pdf")
t.Logf("POSITIVE CONTROL after run 1: mirror photo=%v doc=%v", exists(photo), exists(doc))
// The household (or an app bug, or fsck → lost+found) loses the live photos folder; the docs folder is emptied.
if err := os.RemoveAll(filepath.Join(src, "appdata", "app", "photos")); err != nil {
t.Fatal(err)
}
if err := os.Remove(filepath.Join(src, "appdata", "app", "docs", "contract.pdf")); err != nil {
t.Fatal(err)
}
err := m.RunTier2("app")
cd := m.settings.GetCrossDriveConfig("app")
t.Logf("run 2 err=%v; status=%q warning=%q", err, cd.LastStatus, cd.LastWarning)
t.Logf("FAULT after run 2: mirror photo=%v doc=%v (the second-drive copy is the household's only local copy of these files)", exists(photo), exists(doc))
}
@@ -0,0 +1,9 @@
# go test at controller 7ca59e2 (v0.336.0), scratch clone; a docker STUB on PATH (no real docker reached); 2026-10-20T11:07:38Z
=== RUN TestRehearsalD5_InvalidDumpReplacesTheGoodOne
zz_rehearsal_d5_test.go:26: POSITIVE CONTROL: last night's dump, 152 B, ValidateDump={Valid:true TableCount:1 Error: FileSize:152 ModTime:2026-10-20 13:07:39.022566077 +0200 CEST UserTableFound:false UserRows:0 LooksEmpty:false}
2026/10/20 13:07:39 [WARN] [backup] ValidateDump FAIL: /tmp/TestRehearsalD5_InvalidDumpReplacesTheGoodOne2769942191/002/unit/app-postgres.sql — dump file too small (< 100 bytes)
zz_rehearsal_d5_test.go:31: tonight's dump: err=<nil> validation={Valid:false TableCount:0 Error:dump file too small (< 100 bytes) FileSize:99 ModTime:2026-10-20 13:07:39.026566071 +0200 CEST UserTableFound:false UserRows:0 LooksEmpty:false}
zz_rehearsal_d5_test.go:32: FAULT: the file on disk now = 99 B, still holds CREATE TABLE photos: false
--- PASS: TestRehearsalD5_InvalidDumpReplacesTheGoodOne (0.00s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/appbackup 0.008s
@@ -0,0 +1,35 @@
package appbackup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate D5 / R-1185). Never committed. A docker STUB on PATH
// (no real docker is reached) prints a header-only dump, as a database that was re-initialised empty would.
import (
"context"
"io"
"log"
"os"
"path/filepath"
"testing"
)
func TestRehearsalD5_InvalidDumpReplacesTheGoodOne(t *testing.T) {
bin := t.TempDir()
stub := "#!/bin/sh\ncase \"$1\" in\n inspect) echo true ;;\n exec) printf -- '-- PostgreSQL database dump\\nSET statement_timeout = 0;\\n\\n--\\n-- PostgreSQL database dump complete\\n--\\n' ;;\nesac\n"
if err := os.WriteFile(filepath.Join(bin, "docker"), []byte(stub), 0o755); err != nil {
t.Fatal(err)
}
t.Setenv("PATH", bin)
dumpDir := filepath.Join(t.TempDir(), "unit")
final := filepath.Join(dumpDir, "app-postgres.sql")
good := "-- PostgreSQL database dump\nCREATE TABLE public.photos (id int);\nCOPY public.photos (id) FROM stdin;\n1\n2\n\\.\n\n--\n-- PostgreSQL database dump complete\n--\n"
os.MkdirAll(dumpDir, 0o755)
os.WriteFile(final, []byte(good), 0o644)
t.Logf("POSITIVE CONTROL: last night's dump, %d B, ValidateDump=%+v", len(good), ValidateDump(final, DBTypePostgres))
db := DiscoveredDB{ContainerName: "app-db", ContainerID: "0123456789abcdef", DBType: DBTypePostgres, DBUser: "u", DBName: "d", StackName: "app"}
res := DumpOneTo(context.Background(), db, final, log.New(io.Discard, "", 0), false)
b, _ := os.ReadFile(final)
t.Logf("tonight's dump: err=%v validation=%+v", res.Error, res.Validation)
t.Logf("FAULT: the file on disk now = %d B, still holds CREATE TABLE photos: %v", len(b), contains(string(b), "CREATE TABLE public.photos"))
}
func contains(s, sub string) bool { return len(s) >= len(sub) && (func() bool { for i := 0; i+len(sub) <= len(s); i++ { if s[i:i+len(sub)] == sub { return true } }; return false })() }
@@ -0,0 +1,10 @@
# go test, hub store at felhom.eu 5c48731 (scratch clone), in-memory SQLite; 2026-10-20T10:12:12Z
=== RUN TestRehearsalK1_NewBoxAfterHostDeleteSeesNoEscrow
zz_rehearsal_k1_test.go:20: POSITIVE CONTROL (old host live): status=&{IdentityBlobPresent:true ResticPwSHA256:SHA_OLD CreatedAt:2026-10-18T00:00:00Z SupersededPresent:false SupersededAt:} err=<nil>
zz_rehearsal_k1_test.go:27: retained rows under the DELETED host_id: 1 (identity blob present: true)
zz_rehearsal_k1_test.go:34: FAULT (new box, what its ACK carries): status=<nil> err=<nil>
zz_rehearsal_k1_test.go:36: => GetEscrowStatusForCustomer returns nil: identity_blob_present=false AND superseded_present=false for the new box
zz_rehearsal_k1_test.go:39: retained rows reachable under the NEW host_id: 0
--- PASS: TestRehearsalK1_NewBoxAfterHostDeleteSeesNoEscrow (0.04s)
PASS
ok gitea.dooplex.hu/admin/felhom-hub/internal/store 0.048s
@@ -0,0 +1,40 @@
package store
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate K1). Never committed.
import "testing"
func TestRehearsalK1_NewBoxAfterHostDeleteSeesNoEscrow(t *testing.T) {
s := newTestStore(t)
const cust = "Tester4"
// The household's first box, with an escrowed package (K blob + the identity blob that opens the off-site repo).
if err := s.UpsertHost(&Host{HostID: "Tester4-old", CustomerID: cust, APIKey: "k1"}); err != nil {
t.Fatal(err)
}
if _, _, err := s.SaveHostEscrow("Tester4-old", []byte("k-blob"), "fp", "zk", "2026-10-18T00:00:00Z", "SHA_OLD"); err != nil {
t.Fatal(err)
}
if err := s.SaveHostDRBundle("Tester4-old", []byte("identity-opening-the-old-repo")); err != nil {
t.Fatal(err)
}
st, err := s.GetEscrowStatusForCustomer(cust)
t.Logf("POSITIVE CONTROL (old host live): status=%+v err=%v", st, err)
// The operator deletes the old host (the installer's 409 tells them to), escrow acknowledged → demoted.
if err := s.DeleteHost("Tester4-old", true); err != nil {
t.Fatal(err)
}
ret, _ := s.ListSupersededEscrow("Tester4-old")
t.Logf("retained rows under the DELETED host_id: %d (identity blob present: %v)", len(ret), len(ret) == 1 && len(ret[0].IdentityBlob) > 0)
// The reinstalled box enrolls under a NEW host_id for the same customer.
if err := s.UpsertHost(&Host{HostID: "Tester4-new", CustomerID: cust, APIKey: "k2"}); err != nil {
t.Fatal(err)
}
st, err = s.GetEscrowStatusForCustomer(cust)
t.Logf("FAULT (new box, what its ACK carries): status=%+v err=%v", st, err)
if st == nil {
t.Logf("=> GetEscrowStatusForCustomer returns nil: identity_blob_present=false AND superseded_present=false for the new box")
}
ret2, _ := s.ListSupersededEscrow("Tester4-new")
t.Logf("retained rows reachable under the NEW host_id: %d", len(ret2))
}
@@ -0,0 +1,306 @@
Tue Oct 20 10:09:14 UTC 2026
filebrowser Up About an hour (healthy)
felhom-controller Up About an hour (healthy)
paperless-webserver Up 3 hours (healthy)
paperless-postgres Up 3 hours (healthy)
paperless-redis Up 3 hours (healthy)
immich-server Up 3 hours (healthy)
immich-postgres Up 3 hours (healthy)
immich-machine-learning Up 3 hours (healthy)
immich-redis Up 3 hours (healthy)
traefik Up 4 days
0a4fb1a71c72cf704d1afd44e1ab24a8a68e11b8d82ef1dcb71a75d61a9dc1a3
0ce36c2e6db54e085f71a1436c4c89a9807a930c373198f451fa1665f90f0cab
0e2ca5e8738b95134285a666b1a7622bfcabc4728fb9269cc972dfaccbd59d45
0f4002ab75695fb312775a8203cc5213b256f1b01d255210cb5cdd0e50cd9070
1a8fe48409be3defe01713e2f621091630b965e1805cbb5872d1738043efd35c
1afe3420067df65e0d3e53baaec3debc39d2d42d333c7a3c266e4f6ff98e04f7
1b41940af5c4fa82af59320d6c81ba622d97f2e43d8ec51c50dcf65c2fdcb1e8
1f5120663962c7b03539bb993ab736be4800096e3d1f7147eb922d44b308ae6a
01feef94eb7e38a3679921b66cfe206e08adfd9b360ed4a60414cde606de1643
2a71e17dfa1e930ffe0c213cd1615c8d1adcbbf8d61615a38064d331c265c02e
2aaab84bf843817d9e6f32b673277fd1e0c2c8c2d038b8126df44927b1b41006
2ac49fc9cc2839f55c8abae76039950d15a5c301ea5b3918fa3e5d8715a15f42
2bbdb463b29493d60d352bafefccbe57856cf80bd2cc193b61f9bcc1310fb45e
2bc95b104191ffd31bdfdbe1e038d284d0624c04735094494c2c77d957e8e905
2dcb4bd2c3c618d71f582d33d5b1243e6ab075d3b00abc238d4430668a2b6f55
2e4c79db25c47436b44245376b1f6ff1991208ba081fddce1938c3897fc63c07
2ef8994a563ae88024ba29db4e349d26e6e3889e0683d30d1fb258208c9a10b4
2f08e882c5d23373e2df5486dce28d4728330f9f0131a2735ebc938bfb4d7b3a
02f42b55ee403ceef63a472c3624da0b48fab9e6aa6dc0c7800ec68b2f2041ef
3a3d7bc33a1ba21ae4a39c8cb345254cf66cd1dc60afae64e2299513b094b93b
3ac9820f84d0a50f233c63a62ee1b63b92acac026d68c60a8227f370b0be00b6
3d9a93769342e83a3c512d517b99cd64f8e794eb305c009e25c73a6f6627ad29
3d9c1f23abbcef771a4c38a75d75865a12d76a4359fe83c1828652dba3f91710
3f015f020f49d4967d2ac71b94060e6eaec86bc8852cf9a0b5f3dd8133dd528c
3fa030697dbaffb6809991bb69a335dc4e9accfafd4ed5ee953ed676673912e6
4a9ed2aed1fe75a0b02f688e29a20acc2bf7e081ba7518a7d75451be30fdc4e1
4bbaae5ae8cc8cc3330a73bb872b16e1420805197fa9bad903f7db9a1f358041
4c54a4cda3c5280d5b13facf3089f8a0710c4570876aaeb679025aabf92df99f
4e052b4ef5602a68eddcea049bbc4e79b306012cf8b7f0c9cfc3e6c39af64fce
4ea780981a54c3e87aa72eb80436e02f3c6b3aaeab96ecf869602f5f5b0b546e
4f2ebb779645de5cf9d24e93c6fbd9d95d358b390dec94eed6f0223016785e42
4f2266bb0b8a9b902eaa439ae9225963d6fe4359fe30569c2d8afa926b582585
004ae946f5997471f4554ab7158a3b982b72391b59c59be40ea79b501eb1dab9
5b84763ca63a28ae79c1393d700c534e7dd6e610f890f540981e49972e3854e9
5c7dd57f445d87a39eea1e7b299e1a0acbbc946d6bfc92ba165c4af8933b322a
5d47a8950cfd56492e0f8b4ed6bfbf470a2e22811206ac0da0b79e520890b41e
5def44013bf255d4cd97c3829ac7ae895c607333a3ee586a4090bda128d379fd
5ec44fe3223976727132521b3055187e88783716a1f5fd07d1625205acff9888
6a84846fd8e476d206eafb8f5a529ecbdf6b1021daab890429077e32ef4c2b6b
6aef4d0808bef53a15fc6d19614b641a5e36c941f2729572cfef8cfc8e36bbfd
6b5a55f08cc63514e70a93a3eb5d294e9b109e990521bb0ddcea4818a8df1456
6b8acdd640ae067c2ee5235ddea8ad4c0e1eec2aaef1277b426923f56303e07d
6bcaa587af8bf282f83605713213c20275b1c8178c28de97b154af25bb6a674f
6bdf1f89b902e5a7134a87e0269229531ec6c8391256ea1bf466d2d6b66dd8c9
6bf7012e27730a047bff7d69ceadef9c06433783d0b9582faefa9c9d0f966c86
6ce965b12082d21ed8ade00884de6477faea9f97cf7a85e4b5ab3302d3517fce
6ddb2a450b19b940661c677b20936e92e8de54b8bc76f8dbacc56398d7d13a38
6e21c6398b13ebac045a11b136fbb2d289e6abe99401eed9108b5464754a4c87
6e0521e4314af444375b56e348a5e3d34aceb88d2d5e2f48b6986c27250e395e
6f19aa563c4e3e2000ed997157bc7f5bc8a45ee1d77c2cdcd1fd239117a62705
7b5530f7f440ff6477f2ee5885b37ff9cfbf933d7908225998875b233b4d2a2a
7bfe063b0155297f5bca22c7ed02ae7ef9ce1b968670607415f7720e1e8649f0
7ef24d6bf9fb190db2572505b489e45731a326c5c9c4ae6e36ffd7874560bbab
7fc41ddc47424ea11d4940f7062cdae69b92af645e6759f8759f47b689a19cb7
8b44a3824395c930d0db784e5650ba7b58663090c3bd72a44f9dc716008a9642
8bdcbc26d645ae3bc60742debe32650510bcfb7c69ad4416688af5b1815e5645
8c2a7cf3f809218d20576368d4d419a63a07a89c3b12cc389fb2f3424fb45b73
8c4d45c90f336c0ffd5d619765d8d2a45e802d619548f187bb3f2672b3534969
8cae3c834dd9284d1d0069de042c2d50e49a138a78d93a59eb752272e4a5e4f4
8d2ab3e77a72ebd708630e22f2eefc0a66f73cd94ed2abbfc4f666c504a3f172
008dfd2a2e98c6b6673ee471d72b9e150cfe02859eb3a3bbd31a3c582b5a3a46
9a2e6958ba1ea4443ade7619d326c84c50dbc444810b47904ff625969725a091
9a86729a66d00d8be95f93062381b9bd91b16f94b654636681553fec6c7c7985
9abdd18e6a7b07800067237c93d48448d49d9ad2388a91d35653323c2bed4389
9c59fdcefb7ed258e615f8cb688334a69aebdb8e38fd1075a60d6fd98167065a
9c033896f0b00023816a49cea882a342c9b62ca4528640969a0d22c21f507505
9db05859a329f9544f5a48cbd987f02fd00e48f160dcf6ee8331d8accfb423b4
9e9fa98cb2344c5eda9bae7417557f2bc2503de1eed8219fdc2d2d378e1883fe
9e06437718bd8f9a27240eff7b425406aae50f061ea47a6991b9830ee2af9f59
9ee6f261789b97ea0887a6a905bf5bba61a7070cc91ff64cda0091923d9cdf25
09ea67268ce8c0442357ba316f6431cd96143da6bb54008d3c342be8b6ddb169
13b744ec13f00bd3e5e2ecaa37bf5385af38cf0ff94fd05e660cfed3339a0c05
13d76d014354ffb4e5aabfe00eeed5206b98c502dcfd515545fdc7210316bf61
18e51d43a77ac282e108fd8a8e55207282cdabd2219af1e47c2c214117179f51
20ee459190ea3442ab7cf0c288182033fb84b75a15bdfc14540e80ab60dec542
22ab14c474cdb6cf9f873dcb6c8ce85dfc588abb46e2bd0925cdeff384437c46
24a30fa240cec28f9a8b6d02a47ad1fda39674f094ae095b0d6ec3cbf099ed44
24da0da42dc2eb9b6d35dcb7cd513b1e5c7d2ee38b6d59d9a1d51f0d01f6f920
27a56be2953f040882ecd07fd8b91937f8cb17c25d1ceed56656ed2075518f86
31f3b426743b1cff7952948995915586480486ed7fd06eef3379cf54b8fb3d9a
38ba44b0ff38f8df925512a477b8b5b4cba216a8ec0bd51b7463a86a88c42fea
43d6928bc4bb7a1e097122424e35f22393a0ccf2e03863d7dc3cce44163c8ae8
49d0cebfc3199cef395ae27a6ffa479340c1c2f69da9248a777d7bff9b6b9ca9
49dbe15539d7170822958bb0699d140c4d493215236b32679340588710d5452b
054cfa9b87316799ecd24ecfb480a38aa04b5f85a478a3db95c41706e5b63523
57e9dc8d409d939d877a513023c95146400dd10078919ab9402d8144d5f30ca0
62e86d5d6aded4a8ba536696c0df0f0af89f2cd7b4b893a7383e3abc00eeadc5
63ddb5c60e6cf39dea412903cf1d6c0164a1146bcf4ab98ee94c9b1f9e45c6bb
63e2655474549ef03aaf7d9d741502287d2f01170c5ca008d7b09b8e00b1be66
67eff4c5c60d493dc2a9f7841f7f138b610dc389c32793a27a62ddc13d417a1c
68d18a8d3519b6ea6928bbca40f9db7500b700f66e6eab236e7c32a214de2cc7
68f83c9613471fe0e046a1f9252b71e86aa50d36315c675e92dc44a7cdd0267e
71cb6156444948894aec343c9a2c0c7674aca84d292d090c7f786d13146709ed
72ed18f5962e48dd5fb54e7d91d2fd0479017c27b2c60fc58a5d6b6e55242757
74c6b39b7b926dd56db16f175026c2bf9e80a912916f273c122227672f181d03
075b39bc7ae8c56a6d99923e4938ddbbb4174df6f0e653abf9c99b420b401a31
78c01e39d1997eb54344f02f14dc02c7230cfb14ba58abc1a11feab2e9af85be
78e7acb9228c1df4ca4c706d459b97c8e79e8399fe06476ce72bd919a3b2b77f
83a8287d1e8700aa7e207b2c617a68557ce6f83f373f2c3c6d1443ae50032826
83bc388f3ae110e72ba51a8f0b68f7bbdec3685907c1ff08095b63a1759502af
85d6f7309436e59cce9e373b0aa1626fa5e12d8d81163773f5f2c45da9d56543
88c6573974e81f1fff96999bf54b80c66bc6f1e9af6746b3cd6801616198e0fd
92e2e73e3aef6e5330d2ce8aed3c58e7e3632a6f191f2b03c997ccabd245bb65
93c2b9d0a1f54c2e6355d206d93bf2309f81076628aae9d868406c288b0f6bf4
98a80f5f7903ef45f92f74a91f34dc01d527f8a2fe98b4fbe76711f5259416a5
99f7aaac2646c66dd0eeeebc157b8563b56299c27ab4bf64e13920d089ca7156
104e16e4796c52fe212c04b06417161e0bab20fc01632bfcf71421b73b979fbc
122fe66bacc9f04b3f3e4f6d0a3b15abdef8321eed36637a1284e3bd145463b8
158c590779b033e48b5efcf895fd0bad4c6f277303d72b963cd0802ecac1f440
218a186ab13a38d514cf9f523e5798452ae4e5ec76ecf26fe1a46ae22b47a508
283e9d53742a13c471e5f59f53a57c179d461f0017ad5f8db27881cdd994cd04
305b75817cf5c06105b19dc8c56ff0d796dc6e267ae5bcfc6018aa3d12037744
325ec2aa2a6c307bb82d4dcb600fa3ff127aa6d1f35dc683ab61124ef5f0f5b3
338f7535ae9ef91754e76604238ca7652273ffce9e6f0a1300de0b1edb61da77
343d41a3b38b5a7eac10750eb0213b81780edd3075e9a1fdf3a2c479f4d2474c
346eaddf98e91d6d6e7b8c526074c27847e4a18be01b41027bec93abc2b7b2fb
355ba69bab94a95e00e87c6c4808587881b9675699083e087917ec8492bebc65
426ccc08685def1c9025c94d343de0e59713073984634ee226e69634d6a18fb8
552a4b340eb6be03c188cb17628aee0f916b544142465f8e52e7e9d2325206ab
556c805068afd3f6784bda2eb59642d7dc03756580e959e1c75262711a30d4d9
0642eb9eee222e235de9310b9bd86b42493e5f4d71d430619b5832484dd09cd6
645d70ab53013564fd243eae61db209e3793b826a9eeffd77395b18e27458789
670e6447721f667df5222cb06a68c2682eb92803184a44faead8aea0dff44df6
0717b5f7615c345fe47ab8212c06f506e08585551d93c6a8083b56a216adb71b
734e6b63f955d0b508dea39a8637755e75fbb353d54430956a0010f607eb727d
748a1560ef6216c8bf80545dbeadd29f99fd5c984b6f34bb678febf8b369adcc
748cce6aa136bdc0b3111c73a7c9434508200f8c231933b925d42b37b9cca17c
760cd2f9203dc3dc3f933e4a34bbaae857dee0afed66e727846a4c7f750ab5a8
762e15e05b2f84f035a7011e10c64558dc6637c9fdde1846dc77f4056f3962d2
787dc06078f3718da6faaba82269a7d21b213482c9e45025315bdb6cf59010b5
866fc46ac37407bbf74761cecd21fa6322c4e7621f3dfbe963a85671d5753e5c
921d92a1c692ea0fd42cbe500bbdb1f3defcd5fb9b51df216451aa260d95ad45
932bae2149e79ef113eb4929614a895c642960160d5f5cb2f2e9afac7dfa6af2
968a5d7a54fb1d8ef4163f287e128cbd541ab46a2cc54db721dd3eafe1397b65
991a5d344112325fb2c40700cd0ee96a784ce2150cba0a7b0be3ed6eb2411878
2469a8c88a452ed226dd6d1082f0cbfbe3107d76f919b930b6bc7ce3b839ed90
2634a60c3c37d5eba4be4827c08c0e99a951b934604c29d116fcddc27808e480
2788da1d8f917a9d5b8acab2c7fe7336b6a7810f1c7edab63ed327a6022ceddf
3000c7863b2e80a72329ca1fa0dd03d2fd3994a2391e82450a8c92199cbb56b6
3461d48cd9e88caf5363b0e4d96e799f6759ab8b8bc6ba4c148492a1637c01f0
4681b8c67ad20fdd3ad04db895084d37a9296ac76b74ea7bc9465bb3ac93df8f
4690cfe7c61625190732c028ad4b918930a65e295005171d48114aa8f27b567b
5206b60d49110c01e05dc24034e12b767efa739e2ad21c252ab83db47e56d526
5234fcace55ee7e44631499ed1f95fd0289918a84bd9f5cf6d9f761d43c34f17
07402fbe22b572302f3317958f8cc4c6ca30317e0ee5bbbe9ff51c60b3da5a05
7458b4c4b975debbd2bb705e9575d2d1ff5e9308ed9e70c302f5643136cd0cc0
8097f97f4ae00b654b1c0b4408ad585f5bfce7999e482f244bd698268e1f6061
8158fe1f757d26cadb484ed9690ad4d20d4cb382eeec7c9b0627b365afd6576f
9917d608ac0ad05856d31873432d641828ef519825a3f451e6a1ab2519dbf0d1
13175cc97740c834e2404c11ba9fa9418d0c390d27a87e6e869977d6a86c20c0
36571aa758bc335acc463c3ea074422a5123c309a37e1a7fc818a2069941c493
59438a5f6378d218a73d3106ea1984d1c160fe4fcbbb7ec1177067f17430dcb3
60496cd3a1e1ad1dcaed30427b70a57b8b14a122bae7f2cd882f8154a4549978
61544bee8e2c1cd65e999121bb63011a9c1b4139b20b04fa32e3a850ca8c82b7
84046f48a922cd337284bc2448a5d2682ea6a2e3479e71531122aff9ee4cbc93
86022b0cd1043facf7b1c933c3b6a6ff36277a76d50bdb2da6a5690d57381b9e
98129d711a1e807ab7c3ae4c97187ab8505cebf1012218e8530d0829a2ad436f
177451abc7ed0606468250a7793e018725e8c7f370ee8937d4941a11571dcb9d
0217869eb1be5181b7053b993443dac73d9cd0804cd5bedb604edeb43f911702
219118eb01fa7be03fcce2124b74708cacafe66aea617fd2bafa32f0b2d4fd80
394985d0c3db0791b8c7569fccabd36959d00deb285075f9852568c4c81d32eb
722380f945884d4dea921ffb958513e02a4802483ec0886712e5ed3fa28d751c
774878c58b6a8cae6fbecdf656f2c1f09f37a89190068663e923763dbd6969ce
925226a74657c7ed0fcdbcfa9b504a47f7e21d0982c44f7ed9576140fb417146
963079a9efb903a575b363b27e15927312569528b9066511b4c282e01e1ec931
3830913f0478ec59a7a31d538f858f8ef612e1b2ce3bb9058a2d18f7b43abe9c
8579968bcd362a1aa9dcf14e22956b2fd15fd74a2fc2e7369ffb1457c2ce6693
8678479fa55ea3871598eb6914eb8428ba599da4c619c62f231e6931f0cb1f54
13694424a3895e8e73cc1e06af29aae0c3179c3cb5587b9daadeadcdb29b7cc7
67711784cb23efbc0762e83f03365b837ec5216c38f3ba682a82eaff6a7863db
92236992ea73ecd9befe3330e88e96a7aedacd9cbca0bb8c32c31d0e2c914e5b
134995217d29dc47fb0ca1a274ceb5ea74225d36a98c4bbe6e07bf8c8d6898c7
481706314b835ab042583c3107e168932844a162a2adf3b9ef2fa27433a7fd1d
4098005900d38c71b152787ce4bdedfb8e2b2b8b061f87645b2b4a14e0004335
4699188665aa6eb965b7bb9f4938187f377e7a4ad55fc97e44802ea76f3612e9
04762469942ae24c353f929fced777f245bb9f2f888a9f2044ff27fc45933665
a6c297b9282b39caca7e513724219af096a3cf6fd453c3736ee7c4c833ef417d
a22cb584ba3444bc1dbd90b3723b1ad9424352251f2218a92b1884ef74e63b9f
a68fad1bcb1f1030af3811590cc18d74eb1da3c67190af4459fa69118aa8f035
a74b9b2333ee936c17edd0525b49fec1337768ccab68f5576a39486c875ff968
a74b41238ed9ded9e866679ab00f85813d800f92e4bb2642d3f9de28a1655b81
a84ff849188b2bab211fefe8bc61a70f58f48f6a2a6ca25c2645e0bb5c384cbf
a2815ec8af59e0a137aa0cdf2baa48ca6d1b86e291c5728fab9449280d15fa75
aa5cf2d08c68b8d3dfe3330861935fd97ff8fb9169645f6c632d970ad71b575c
aadb8f0be78890f1e08630b7a762a82853dc1402326bd16cd2a2844fa63fef1d
ac48d92438e8d19cf546764cc051172af82092223daad8ccfbfb4cb05100f5d6
ac78e0a5ac10c7d0239e0e1ba3b604cd6fd418d87a6f32b66f3ce98c674164d8
ad79ebffc7d8225cfbee6ad5fec4092ba7376f38dca912d6df8ea932f1eba20b
ad7084f002b17a1a27f70c796e3d7424a064b2ef5b71eadb7b3b08dcc9f59042
ae2a94eac2960e95f944c9a4a0649c94c405fb0e518adfba2e6fa0f80f2a5af2
ae9d5c15cba1adf881044a4449eaf72f5f2ed753c301edc1e43bcfa4560e8d31
ae5499adb73000b6f460e63d6e045fe492702bd73187f868d9988690cb72a453
b0e341cb8fb7f2fb42f7a8512a9b922591cfa40bd3522f31a422a9fdb4586008
b4bc9ff2d9b533e896dfc5082ba865a4ea7676d71259d73aa33d515a5a60dd91
b8d2fbe7e6afc931581bf5f1edacaefb9071bcc9f709e294a3f5ead104f73890
b8dd8697ad52f98dc44ed3c940752aa52e16d6ab7563d36b1c9e221db22d1e11
b21ec6b73a9f1f51623355f2bf8229b5f6f9da1484e1ce105cf8e0363475a5b8
b081c3329ed821e22b0ee9cecbc2f52a5e9be70be2b1cb83bb262c21c84640d1
b274ece5f6e1d506ca0646077964797c3e7b4413c9a9f1e453d9257e6b4d09f9
b676fcf4f5272015b942c8589135a18fa16204c5aec457f1d0898ce6c84638eb
b1591e2a2604b6404d0d18e4b2b7599aafbcfb2bbacba06b5de5ff14abf14be3
b7000ea518cd327f7dfb42858434fdb80c451aecf0a0325b6ccbff1f30545803
beb17a9d330ce361923600aac8e13f8b10e62d0b4067380ad7a95c4d77f0110e
bfb91f5666855fd57228801ed0a4294981bd2a6665a93d1093bf3c4a0e89cb2c
c0fb7358aabef2c38e6921e2ed06b7fdddddecd29d530814545968323eba964e
c1d4fc53203c4b65abb1ff76f9505a46175c57afcd9c95cf445c6a3c443839fb
c3fbcb924a928bca859b69c75e4df275eb5e0abf03029785247313b0fa1cdd27
c4bccf1c99f4990b0a23848b6fa58977dea0bdbf6ab69b7c0c2b90f7f0a2f5c3
c5e875c34f4e4f1fd4edb1c6dbf4862a6543e26387ee480eeba0f5e3f44af7b6
c8bb03639a4d7c41c233fa28d5a1c06dee874fe00614f764df9db3df14da86b5
c16aa92f949bb89a034c6ef22ea8ece859883ab309086a204e43cedced8dd059
c31f2070f92b36708a62c1d53a7aea495fd997440f2c01c851ad83c66357e379
c35e0b961694a882dcc4c7bdb8e657d4b0685687cb5c4469559ce5078c95302a
c56e78b468dfe3991fc787ab7fe30b4282a73d7fd2e79e4dfc9305bb064685ea
c67a888239bc5e11ed44ca31307f3b46f7f76698d706ffc764024110d1a69ceb
c424d546895a59e0f88e2296a665c03f4618ac304ef19742b6f1c543665b9bb3
c716ebc8ba8fa1556e1dddfaae98c7019618d39ece0e78dbd1b9f58dd0760d94
c797d99e68b0efce9b1337dc0e3e9cbf42806bef03021ade362cb4e4d1de4222
c5708e0a13ababf73203b1e297b3b73229cd6370e3fec1653b7cf1dc143a0d0a
c52417cfa3d923ce7168b7c2b082eb3ab31bc1750ff3f3edfc2c1cd59fb74f3d
c53655b36c7abc28db3020511a0ebdffe8fa37d86412753fca86f4caa7ae7a6b
c782734d8be184e0721d0a984b6ac3e8e0052206a9e46d22188a7fb2f923face
cb71ab036375acb25c69afd915261acf65f919008fbd59417989f6ebef110c7a
cb613ceec1bf86b718059ef3e864dce7ed60e5b6a7bd5ab9f7c633350df48f3a
cb10732ef556d77ec0a0a5d7b29c0789b47a9757b67bdb3fa9d5be22809debd0
cf799a4b43f87d63eba6042a73b9eba3f17b354be1fd2d94dfac2048e13f3fce
d3c941cd28b5a692c2532f1381afdc57740d603fbba5eddbe3539f561f26a0ca
d5bd7d95fbb1f56d7617d96a5a6deb65417b4448692cb45f4a0bedd824165fc1
d6a74fc39944848c79012bb06d915c609b92c1099881b90b4cda59074bd1124f
d58b42f643175b6272bb579d354a9510bc34fc88e4e70dda08346997ba3cec13
d256b9490d623a136093e459b9f466dedadaa0d00235d6934044e6591ee7e2c5
d352bb11678cf6cb47a16740ee9b79cfbf4c19d4da23f4fb95621bbdea6b91b2
d053441be51f569ac393c26c220b6369ae3455ae76f3627eba223e8b4e40eacd
daa717bf6363a3afe8dbcd3ab863a81ca737e0999242bd99c618daa0e4fa085b
db0c37c3ce9df2f2090c622eb4194e6860e26846398d4b4a092b9c4c21441af4
db2434b8bc6fb7858aa5eea51b23eb3fe17ed8e8ac025596ebb4f857d00f9ba9
db6910df9d6429a8ecffced74f22c26f45a11d48efea51e48e8097bf43331540
dbcfeebe1162c457fdf6f7cbfff66c971dfaca8a1a8ae2fb5472fb9007f83ddc
dc5c95c9a8f2f01a8eab63c7d591a7d008dbaf5f4b6157380faeeaeab168cd59
de81766fb8e806f93c97771ae1a0ff529831bc5e7f50e2187d41dd606b8e23f1
e0e25d3ed1797b0092c897ad904a4ac7a2bd77e12b96e1790a939aa009851803
e0ee75c206f1b9be41e608c6de05f8fad8532e3bda240cfad0640c673ae46395
e1ae949c5339eca43334dd6720b49df19082036b8f53151b8dfac97f2d2c0b6d
e2ca0579185aa6d7324f144357323b4d5521c1e94e8dc7929f0ffa9a73e1e4cd
e5f9a9a8f7e4b6d097aef1b0493180a547dbf19006920433e7b80aa8aac0026b
e6a40ba40f9ac5f43ba2276b3cb6110bb4c0e20003e866a55ca28c954ddd0e9a
e9e1b0601616187e8934c7212e2fde5b590b50308aa9c8c5dd12e419c6bebc18
e45c71e0680d2856e2945881fd01ad6320868e0a36427c6bca637c53dfecc625
e62af03dd8d599dfbdbecb8c6516d95e582ee803f2ddd3798479fbc769229030
e72bfb25201770edb1889f678f5a844a57c9f5308acd57a86c5f4936b800d441
e311fa91eca24a97e0c558e91d06dca353aa9348a7ea4b111e694e181868fc27
e339a495e0c048e30483e4fd3bef66186712975f3c33c90ef63a3c9686da3160
e668b1c1f44dae28ca34f530e313c1e544751b63bf0c480300be8e242683fecb
e4638cbb5b12548a76a2cb6e87c7f2ada75d61d3c7d1062535ef0bf2b3cde05d
e7945baeafe0ac6d9a1e6761786c35fddad76c81d86e544d369188c186a0389b
ea35c704202ee36415d4f7a0873bcb254d30268450d7c9ed2dc611c1e2f4d5d1
eaeb108b23d455d01ec0c9e44d39ff395522942794d26f3c149e29615be9bf1f
eb420ae07f9c459abc101c1264fa8cf779002ef20748ef97abe7c3764c24f032
ec30ca07d0b0af16afe60f217dedf15573045ed9adc45e21c3592ee6716fbe39
ed02b9c56e48d34910bc97ebff834f1cb082c23ebcae97b0f51f3a2633664466
edcc77bb3d279e3dfe7d687fe30e22f95f5d9391b9908e61b2206a6cf309ea91
eea963e8499939d36d09e42d8d5cd86798e81e264c4d4c012191e42926e508b8
f1b01ee5efb2117033ddcad5f5eafe8e6f65ad6fc3e933902bfc494c13a7d3c0
f01b151ee48f9a3a631457069ece3a2ac3e111df28110f3c06f221ee7c54eff8
f2ec30f9f836ed26cb13fdb80064d1dcabf953d1952fea2d85bb6410f4cb2271
f8a87cab6bc0890c7a2e36f73e533eac1a1cabb13b886b8ed71afa4c8b7d90be
f9b0fe025aedb49e94d80119a8a8dc0f85800bc592e568dc95b0f1e5439c54fc
f56a1ab986e83e118ff174e9805f6151e47ff693c17a2f475fcedd83cb98e051
f82a956615af08264b64e051e09c1441152d92371d4d2db8d5c0ac4ab47a7182
f287b03a768126d72af210dceab12e329573779e7aad56c123ac0dbb14fc4f4e
f347e779fb8c09daba2a757dfc3ee7c415f8f5a2eaace19535d363cc3ab3171a
f547c232f5e1785aa11200ac03dcfda6f056400bf1456a3388db6d73a8158ca0
f6822a239614fc82462535db5b2806dd616696c9552e1d469922f4b7cd2bf56e
fa453f6fb451a564d31e704bbca0bcbcc9ad1109a25a8e5ad5c704789a424c4b
fb5ad60698efb6ee9f45fd440e56c060ba01ba03a854f556e42f8090b2057c7e
fbc407de7b12a4975b60dac518ac287f076659213cce708871162342419ab383
fbf633eb758b7b66ab761c34eeebc759791e2f73020e839b3cfc2d692c9ba21f
fc1bddcbef8c02474db71bf11dace70e1e51d94f3c3fe6d9d45f4a669ac4a9fd
fd453dd47dc82ff7625bd4093c62140fe14a348814f094b43b519f7f59293af7
fdc05b3bfda3101bec7d66b5e0cfb589e06f1f4b4d6b2f9d84dac470b0abf53b
fdebde6f8bcdd5281c50bcb4669c45dc54e33563bec872f8d23d76d2fe3ebfdf
fe503d3e9a34b113d4c56b59c5986e13c44b6e401b6e6681eb62712d24368329
felhom-controller-data
filebrowser_filebrowser_data
immich_immich_ml_cache
immich_immich_postgres_data
immich_immich_redis_data
paperless-ngx_paperless_data
paperless-ngx_paperless_postgres_data
paperless-ngx_paperless_redis_data
privatebin_privatebin_data
ls: cannot access '/mnt/felhom-drives/scratch_hdd/felhom/backups/primary/': No such file or directory
Filesystem Size Used Avail Use% Mounted on
/dev/loop1 69G 11G 54G 17% /var/lib/felhom
/dev/nvme0n1 938G 210G 681G 24% /mnt/felhom-drives/scratch_hdd
@@ -0,0 +1,104 @@
10:10:26Z == 1 deploy
10:10:27Z deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
10:11:12Z state: running
10:11:42Z == 2 marker A + backup
10:11:46Z CREATE TABLE
INSERT 0 1
10:11:49Z [2] DB markers: 'A'
10:11:49Z POST /api/backup/run -> 200 {'ok': True, 'message': 'Mentés elindítva'}
10:12:59Z backup finished: {"db_dump": {"count": 3, "duration": "1m9.055678483s", "last_run": "2026-10-20T10:12:58.690358712Z", "success": true}, "enabled": true, "running": false}
10:13:04Z unit on disk:
UNIT /mnt/sys_drive/felhom-data/backups/primary/rallly
2026-10-20 10:12 487 /mnt/sys_drive/felhom-data/backups/primary/rallly/compose/app.yaml
2026-10-20 10:12 4071 /mnt/sys_drive/felhom-data/backups/primary/rallly/compose/docker-compose.yml
2026-10-20 10:12 11894 /mnt/sys_drive/felhom-data/backups/primary/rallly/compose/.felhom.yml
2026-10-20 10:12 52228608 /mnt/sys_drive/felhom-data/backups/primary/rallly/volume-dumps/rallly_rallly_postgres_data.tar
2026-10-20 10:11 111371 /mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql
2026-10-20 10:12 3195 /mnt/sys_drive/felhom-data/backups/primary/rallly/manifest.json
2026-10-20 10:12 1191 /mnt/sys_drive/felhom-data/backups/primary/rallly/data-stamps.json
10:13:04Z == 3 POSITIVE CONTROL: marker B (live) then a normal unit restore
10:13:09Z INSERT 0 1
10:13:12Z [3-before] DB markers: 'A,B'
10:13:12Z [3] restore points offered: [{"time": "2026-10-20T10:11:50Z", "short_id": "helyi", "tier": 1, "drive_label": "Belső SSD (rendszer)"}]
10:13:12Z [3] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
10:13:12Z [3] restore-status: {"running": true, "op": "restore", "stack": "rallly", "started_at": "2026-10-20T10:13:12.817369857Z", "last": {"op": "offbox-reconstitute", "stack": "rallly", "ok": true, "message": "A(z) rallly: 0 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 20. 09:30) — az alkalmazás újraindult.", "finished_at": "2026-10-20T07:36:57.852528534Z"}}
10:13:40Z [3] restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-20T10:13:12.817369857Z", "last": {"op": "restore", "stack": "rallly", "ok": true, "message": "A(z) rallly: 1 adatkötet és az adatbázis visszaállítva — az alkalmazás újraindult.", "finished_at": "2026-10-20T10:13:39.161573115Z"}, "last_recent": true}
10:14:00Z [3] after: state=running hold=None
10:14:18Z [3-after] DB markers: 'A'
10:14:18Z == 4 marker C (the newest live row), then THE FAULT: the unit's DB volume tar truncated to half
10:14:22Z INSERT 0 1
10:14:25Z [4-live] DB markers: 'A,C'
10:14:29Z TRUNCATED /mnt/sys_drive/felhom-data/backups/primary/rallly/volume-dumps/rallly_rallly_postgres_data.tar 52228608 -> 26114304
10:14:29Z == 5 the unit restore over the damaged copy
10:14:29Z [5] restore points offered: [{"time": "2026-10-20T10:11:50Z", "short_id": "helyi", "tier": 1, "drive_label": "Belső SSD (rendszer)"}]
10:14:29Z [5] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
10:14:29Z [5] restore-status: {"running": true, "op": "restore", "stack": "rallly", "started_at": "2026-10-20T10:14:29.288204925Z", "last": {"op": "restore", "stack": "rallly", "ok": true, "message": "A(z) rallly: 1 adatkötet és az adatbázis visszaállítva — az alkalmazás újraindult.", "finished_at": "2026-10-20T10:13:39.161573115Z"}, "last_recent": true}
10:14:44Z [5] restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-20T10:14:29.288204925Z", "last": {"op": "restore", "stack": "rallly", "ok": false, "message": "Visszaállítás sikertelen: starting rallly after restore from unit: starting stack rallly: exit code 1\nstderr: ...twork rallly_rallly-internal Creating \n Network rallly_rallly-internal Created \n Network rallly_rallly-internal Created \n Container rallly-postgres Creating \n Container rallly-postgres Created \n Container rallly Creating \n Container rallly Created \n Container rallly-postgres Starting \n Container rallly-p
10:15:04Z [5] after: state=degraded hold=None
10:15:38Z [5-after] DB markers: 'Error response from daemon: Container 6012fe2936d0bbea71dd1226f64d872b9d017ae5f5062a2ea234d84f1522029c is restarting, wait until the container is running\nError response from daemon: Container 6012fe2936d0bbea71dd1226f64d872b9d017ae5f5062a2ea234d84f1522029c is restarting, wait until the container is running\nError response from daemon: Container 6012fe2936d0bbea71dd1226f64d872b9d017ae5f5062a2ea234d84f1522029c is restarting, wait until the container is running'
10:15:41Z containers:
rallly Created
rallly-postgres Restarting (1) 5 seconds ago
10:15:44Z db container log tail:
Data page checksums are enabled.
initdb: error: directory "/var/lib/postgresql/18/docker" exists but is not empty
initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/18/docker" or run initdb with an argument other than "/var/lib/postgresql/18/docker".
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are enabled.
initdb: error: directory "/var/lib/postgresql/18/docker" exists but is not empty
initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/18/docker" or run initdb with an argument other than "/var/lib/postgresql/18/docker".
10:15:47Z any undo / safety copy of the live state on disk?
/mnt/sizing-bench/backups/secondary/paperless-ngx/recovery-unit/db-dumps/pre-restore-20260927T094411Z-paperless-ngx-postgres.sql
/mnt/sys_drive/felhom-data/backups/primary/rallly
/mnt/sys_drive/felhom-data/backups/primary/rallly/volume-dumps/rallly_rallly_postgres_data.tar
/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql
10:15:51Z controller log (restore lines):
Container rallly Created
Container rallly-postgres Starting
Container rallly-postgres Started
Container rallly-postgres Waiting
Container rallly-postgres Error dependency rallly-postgres failed to start
dependency failed to start: container rallly-postgres is unhealthy
2026/10/20 10:14:42 manager.go:1362: [ERROR] [stacks] Stack rallly start failed after 1.1s: exit code 1
stderr: ...twork rallly_rallly-internal Creating
Network rallly_rallly-internal Created
Network rallly_rallly-internal Created
Container rallly-postgres Creating
Container rallly-postgres Created
Container rallly Creating
Container rallly Created
Container rallly-postgres Starting
Container rallly-postgres Started
Container rallly-postgres Waiting
Container rallly-postgres Error dependency rallly-postgres failed to start
dependency failed to start: container rallly-postgres is unhealthy
2026/10/20 10:14:42 handlers.go:1881: [ERROR] [web] Restore failed (async): stack=rallly: starting rallly after restore from unit: starting stack rallly: exit code 1
stderr: ...twork rallly_rallly-internal Creating
Network rallly_rallly-internal Created
Network rallly_rallly-internal Created
Container rallly-postgres Creating
Container rallly-postgres Created
Container rallly Creating
Container rallly Created
Container rallly-postgres Starting
Container rallly-postgres Started
Container rallly-postgres Waiting
Container rallly-postgres Error dependency rallly-postgres failed to start
dependency failed to start: container rallly-postgres is unhealthy
2026/10/20 10:14:49 manager.go:920: [DEBUG] [stacks] restart-policy of down member "rallly" = "unless-stopped"
2026/10/20 10:14:59 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
2026/10/20 10:15:09 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
2026/10/20 10:15:09 main.go:4054: [INFO] [deadapp] rallly crossed the crash_loop threshold (8 in 10m0s) while a backup/quiesce/update holds it — NOT stopped
2026/10/20 10:15:19 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
2026/10/20 10:15:29 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
2026/10/20 10:15:39 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
2026/10/20 10:15:49 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(restarting)]
exit 0
@@ -0,0 +1,18 @@
2026/10/20 10:14:29 handlers.go:1873: [WARN] [web] Restore requested (async): stack=rallly, snapshot=helyi from 172.18.0.3:36322
2026/10/20 10:14:29 restore_dbcreds.go:114: [INFO] [backup] Restore rallly: database password(s) [DB_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/20 10:14:29 restore_unit.go:393: [INFO] [backup] Restoring rallly from recovery unit /mnt/sys_drive/felhom-data/backups/primary/rallly: images=2, secrets recovered=2/2, data_keys=0
2026/10/20 10:14:29 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 10:14:40 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 10.8s)
2026/10/20 10:14:40 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 10:14:40 restore.go:246: [ERROR] [backup] Failed to populate volume rallly_rallly_postgres_data: tar: short read — exit status 1
2026/10/20 10:14:40 restore_unit.go:448: [ERROR] [backup] volume restore for rallly: failed to restore 1 volume(s): [rallly_rallly_postgres_data]
2026/10/20 10:14:40 [INFO] [stacks] SaveAppConfig: saved config for rallly
2026/10/20 10:14:40 deploy.go:883: [INFO] [stacks] Redeploying rallly from recovery unit with 4 env vars
2026/10/20 10:14:40 pin.go:93: [INFO] [stacks] pin rallly: rallly=lukevella/rallly:4.15.3, rallly-postgres=postgres:18-alpine
2026/10/20 10:14:40 [INFO] [stacks] SaveAppConfig: saved config for rallly
2026/10/20 10:14:40 restore_unit.go:467: [ERROR] [backup] rallly: NOT replaying the database copy — the volume restore failed, so the database is not known to be the copy's own
2026/10/20 10:14:40 manager.go:1351: [INFO] [stacks] Starting stack: rallly
2026/10/20 10:14:42 manager.go:1704: [ERROR] [stacks] Command failed: docker compose up -d (in /opt/docker/stacks/rallly) — exit code 1 (took 1.1s)
2026/10/20 10:14:42 manager.go:1712: [ERROR] [stacks] stderr (last part): ...twork rallly_rallly-internal Creating
2026/10/20 10:14:42 manager.go:1362: [ERROR] [stacks] Stack rallly start failed after 1.1s: exit code 1
2026/10/20 10:14:42 handlers.go:1881: [ERROR] [web] Restore failed (async): stack=rallly: starting rallly after restore from unit: starting stack rallly: exit code 1
@@ -0,0 +1,28 @@
200
{
"ok": true,
"message": "Stack rallly stop completed"
}
200
{
"ok": true,
"data": {
"removed": "rallly",
"volumes_removed": [
"rallly_rallly_postgres_data"
],
"hdd_paths_removed": [],
"hdd_paths_preserved": [],
"hdd_note": "Az alkalmazás nem tárolt saját adatot külső meghajtón, így ott nem volt mit törölni.",
"userdata_kept": [],
"backup_paths_removed": [
"/mnt/sys_drive/felhom-data/backups/primary/rallly (26M)"
],
"verified": true
},
"message": "Stack rallly removed"
}
0
0
ls: cannot access '/mnt/sys_drive/felhom-data/backups/primary/rallly': No such file or directory
/opt/docker/stacks/rallly
@@ -0,0 +1,25 @@
# C3 — R1/D4 proven live: a failed LOCAL restore leaves a broken app and no copy of what it replaced
Scratch guest 9202 on demo-hp, controller **0.331.0** (the local-restore code is unchanged since v0.328.0 —
`git log` on `restore_unit.go`/`restore.go`; 0.336.0 runs the same lines). Hub off on 9202. The dashboard password was
reset with the controller's own escape hatch (`--print-reset-code` → `/claim`), held in `sec` only.
Architecture read: `07` §6.3 (the ladder „replay → rollback → hold"), §8; `09` §3 decision 154 (R-638 A), D20 (R-893 A).
| step (UTC) | act | observed |
|---|---|---|
| 10:10 | Rallly 4.15.3 + postgres:18 deployed through `POST /api/stacks/rallly/deploy` | running |
| 10:11 | marker A (psql in the app's own DB container); „Mentés most" (`POST /api/backup/run`) | unit written 10:12 (`rallly_rallly_postgres_data.tar` 52 MB + `rallly-postgres.sql`) |
| 10:13 | **positive control:** marker B, then the household's restore (`POST /backup/restore`, point „helyi") | „1 adatkötet és az adatbázis visszaállítva — az alkalmazás újraindult"; markers **A** (B rewound, as designed) |
| 10:14:22 | marker C — the household's newest row | live: **A,C** |
| 10:14:29 | **fault:** the unit's DB volume tar truncated to half (a torn / damaged copy) | 52 228 608 → 26 114 304 B |
| 10:14:29 | the same restore | stop 10.8 s → `volume rm` → `tar: short read` → `[ERROR] volume restore … failed` → definition rewritten → „NOT replaying the database copy" → start → **postgres crash-loops** (`initdb: directory … exists but is not empty`) |
| 10:14:44 | what the household reads | „Visszaállítás sikertelen: starting rallly after restore from unit: starting stack rallly: exit code 1 stderr: ...twork rallly_rallly-internal Creating …" — **raw English Docker output** |
| 10:15:47 | any copy of the live state (marker C)? | **none** — no undo dump, no live-volume copy for Rallly (`find` of `*restore-undo*`/`pre-restore-*` finds only a September paperless file) |
| 10:15 | the dead-app guard | `rallly crossed the crash_loop threshold … while a backup/quiesce/update holds it — NOT stopped` |
**So:** the household's live data (marker C) was destroyed by the restore itself, the app does not start, and nothing
on the box can put the pre-restore state back. The off-site restore got exactly this protection in v0.336.0 (D20 = A:
„put back exactly as it was"); the LOCAL path — 07 §3's main customer restore — did not. Logs: `01-run.log`,
`02-controller-log-fault-window.txt`. Teardown through the product (`03-teardown.txt`): Rallly removed with its data
and backups; no container, no volume, no unit (the `/opt/docker/stacks/rallly` folder is the catalog template every
app has).
@@ -0,0 +1,153 @@
#!/usr/bin/env python3
"""r1_proof.py — C3 proof of candidate R1/D4 on scratch guest 9202 (data-loss hunt 2026-10-20).
Claim under test: a LOCAL (Tier-1 unit) restore that fails after it has started replacing the app's volumes
restarts the app on whatever is left, and keeps NO copy of the live state it replaced — so the household's newer
data is gone and nothing can put it back (unlike the off-site path, which got „put back exactly" in v0.336.0).
Method (mechanism proof — markers are written with psql inside the app's own database container, as the
2026-10-19 R-893 measurement did; the household-facing acts are the dashboard's own endpoints):
1 deploy Rallly (throwaway) through POST /api/stacks/rallly/deploy
2 marker A; „Mentés most" = POST /api/backup/run (whole box, scratch); wait
3 POSITIVE CONTROL: marker B (live), unit restore (POST /backup/restore) -> A present, B gone (expected rewind)
4 marker C (the household's newest live row); THE FAULT: truncate the unit's DB volume tar to half
5 unit restore again -> observe: the answer, the app's state, what the DB holds, any undo/safety copy on disk
6 teardown: remove Rallly with its data and backups through the product; verify nothing left
Env: CTL_BASE, CTL_DOMAIN, CTL_PW_ENV (see tools/ctl.py). Prints a timestamped log (no secrets).
"""
import json, os, re, subprocess, sys, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/rehearsal-2026-10-20/tools")
import ctl # noqa: E402
APP = "rallly"
DOMAIN = os.environ["CTL_DOMAIN"]
def say(*a):
print(time.strftime("%H:%M:%S", time.gmtime()) + "Z " + " ".join(str(x) for x in a), flush=True)
def guest(script, timeout=600):
r = subprocess.run(["ssh", "demo-hp", "export LC_ALL=C; cat > /tmp/r1p.sh; pct push 9202 /tmp/r1p.sh /tmp/r1p.sh;"
" pct exec 9202 -- bash /tmp/r1p.sh; pct exec 9202 -- rm -f /tmp/r1p.sh; rm -f /tmp/r1p.sh"],
input=script, capture_output=True, text=True, timeout=timeout)
return (r.stdout + r.stderr).strip()
def psql(sql):
return guest(f"""C=$(docker ps --format '{{{{.Names}}}}' | grep -E '^rallly.*(postgres|db)' | head -1)
U=$(docker exec $C printenv POSTGRES_USER); D=$(docker exec $C printenv POSTGRES_DB)
docker exec -i $C psql -v ON_ERROR_STOP=1 -U "$U" -d "$D" -tA <<'SQL'
{sql}
SQL""")
def stack():
code, d = ctl.call("GET", f"/api/stacks/{APP}")
return (d.get("data") or {}) if isinstance(d, dict) else {}
def wait_backup(t_cap=1200):
t0 = time.time()
time.sleep(5)
while time.time() - t0 < t_cap:
code, d = ctl.call("GET", "/api/backup/status")
dd = (d.get("data") or {}) if isinstance(d, dict) else {}
if not dd.get("running"):
return dd
time.sleep(5)
return {"timeout": True}
def restore(tag):
code, d = ctl.call("GET", f"/api/backup/snapshots?stack={APP}")
data = d.get("data") if isinstance(d, dict) else None
snaps = data if isinstance(data, list) else next((data[k] for k in ("snapshots", "items", "restore_points")
if isinstance(data, dict) and isinstance(data.get(k), list)), [])
say(f"[{tag}] restore points offered: {json.dumps(snaps, ensure_ascii=False)[:400]}")
sid = snaps[0].get("id") or snaps[0].get("snapshot_id") or snaps[0].get("short_id")
out = subprocess.run(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", ctl.HOST, "-H", "Cookie: " + ctl._SESS,
"-X", "POST", "--data-urlencode", "_csrf=" + ctl._CSRF, "--data-urlencode", "stack_name=" + APP,
"--data-urlencode", "snapshot_id=" + sid, ctl.BASE + "/backup/restore"],
capture_output=True, text=True).stdout
say(f"[{tag}] POST /backup/restore -> {out.splitlines()[0] if out else '?'} "
f"{[l for l in out.splitlines() if l.lower().startswith('location')][:1]}")
t0, last = time.time(), None
while time.time() - t0 < 900:
code, d = ctl.call("GET", "/api/backup/restore-status")
dd = (d.get("data") or {}) if isinstance(d, dict) else {}
cur = json.dumps(dd, ensure_ascii=False)[:600]
if cur != last:
say(f"[{tag}] restore-status: {cur}")
last = cur
if not dd.get("running") and time.time() - t0 > 8:
break
time.sleep(3)
time.sleep(20)
st = stack()
say(f"[{tag}] after: state={st.get('state')} hold={st.get('hold_reason')!r}")
def markers(tag):
say(f"[{tag}] DB markers: {psql('SELECT string_agg(m, \',\' ORDER BY m) FROM r1_marker;')!r}")
def main():
say("== 1 deploy")
if not stack().get("deployed"):
code, d = ctl.call("GET", f"/api/stacks/{APP}/deploy-fields")
fields = (((d.get("data") or {}).get("metadata") or {}).get("deploy_fields")) or []
vals = {"DOMAIN": DOMAIN, "SUBDOMAIN": "r1poll"}
for f in fields:
if f.get("env_var") in vals:
continue
if f.get("type") == "password":
import secrets
vals[f["env_var"]] = "R1-" + secrets.token_hex(10)
elif f.get("required") and f.get("default"):
vals[f["env_var"]] = f["default"]
code, d = ctl.call("POST", f"/api/stacks/{APP}/deploy", {"values": vals})
say("deploy ->", code, str(d)[:160])
for _ in range(90):
time.sleep(5)
st = stack()
if st.get("deployed") and (st.get("app_config") or {}).get("pinned_images") and st.get("state") in ("running", "unhealthy", "degraded"):
break
say("state:", stack().get("state"))
time.sleep(30)
say("== 2 marker A + backup")
say(psql("CREATE TABLE IF NOT EXISTS r1_marker(m text primary key); INSERT INTO r1_marker VALUES ('A') ON CONFLICT DO NOTHING;"))
markers("2")
code, d = ctl.call("POST", "/api/backup/run")
say("POST /api/backup/run ->", code, str(d)[:200])
say("backup finished:", json.dumps(wait_backup(), ensure_ascii=False)[:500])
unit = guest(f"for d in /mnt/felhom-drives/*/backups/primary/{APP} /mnt/sys_drive/felhom-data/backups/primary/{APP}; do "
f"[ -d $d ] && echo UNIT $d && find $d -maxdepth 3 -type f -printf '%TY-%Tm-%Td %TH:%TM %s %p\\n'; done")
say("unit on disk:\n" + unit)
say("== 3 POSITIVE CONTROL: marker B (live) then a normal unit restore")
say(psql("INSERT INTO r1_marker VALUES ('B');"))
markers("3-before")
restore("3")
time.sleep(15)
markers("3-after")
say("== 4 marker C (the newest live row), then THE FAULT: the unit's DB volume tar truncated to half")
say(psql("INSERT INTO r1_marker VALUES ('C');"))
markers("4-live")
say(guest(f"for d in /mnt/felhom-drives/*/backups/primary/{APP} /mnt/sys_drive/felhom-data/backups/primary/{APP}; do "
f"[ -d $d ] || continue; f=$(find $d -name '*.tar' -path '*volume*' | grep -iE 'postgres|db' | head -1); "
f"[ -n \"$f\" ] || f=$(find $d -name '*.tar' | head -1); s=$(stat -c %s \"$f\"); "
f"truncate -s $((s/2)) \"$f\"; echo \"TRUNCATED $f $s -> $(stat -c %s \"$f\")\"; done"))
say("== 5 the unit restore over the damaged copy")
restore("5")
time.sleep(30)
markers("5-after")
say("containers:\n" + guest("docker ps -a --format '{{.Names}} {{.Status}}' | grep -i rallly"))
say("db container log tail:\n" + guest("C=$(docker ps -a --format '{{.Names}}' | grep -E '^rallly.*(postgres|db)' | head -1); docker logs --tail 15 $C 2>&1"))
say("any undo / safety copy of the live state on disk?\n" + guest(
"find / -xdev \\( -path /proc -o -path /sys \\) -prune -o \\( -iname '*restore-undo*' -o -iname 'pre-restore-*' \\) -print 2>/dev/null | head; "
"for d in /mnt/felhom-drives/*/backups /mnt/sys_drive/felhom-data/backups; do find $d -maxdepth 4 -iname '*rallly*' -newer /etc/hostname 2>/dev/null | head; done"))
say("controller log (restore lines):\n" + guest("docker logs --since 30m felhom-controller 2>&1 | grep -iE 'restore|rallly' | grep -vi 'GET /api' | tail -40"))
if __name__ == "__main__":
main()
@@ -0,0 +1,36 @@
10:48:52Z == 1 deploy glance
10:48:52Z deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
10:49:12Z state: running family_gate in app_config: True
10:49:34Z [1 POSITIVE CONTROL after install] gate file: /opt/docker/stacks/traefik/dynamic/family-gate-glance.yml
10:49:34Z [1 POSITIVE CONTROL after install] a stranger's GET https://r1187glance.enkisfelhom.hu/ -> 401
10:49:34Z == 2 export to the data drive
10:49:34Z export start -> 200 {'ok': True}
10:49:34Z /api/export/status {"display_name": "Glance", "done": false, "error": "", "job_type": "export", "ok": true, "output_path": "", "output_size": "", "running": true, "stack_name": "glance", "steps": [{"label": "Előkészítés", "status": "running"}, {"label": "Konfiguráció mentése", "status": "pending"}, {"label": "Adatbázis mentése", "status": "pending"}, {"label": "Felhasználói adatok", "status": "pending"}, {"label": "
10:49:37Z /api/export/status {"display_name": "Glance", "done": true, "error": "", "job_type": "export", "ok": true, "output_path": "/mnt/felhom-drives/scratch_hdd/exports/glance_20261020-104935.fab", "output_size": "5.6 KB", "running": false, "stack_name": "glance", "steps": [{"label": "Előkészítés", "status": "done"}, {"label": "Konfiguráció mentése", "status": "done"}, {"label": "Adatbázis mentése", "status": "done"}, {"la
10:49:37Z bundles for glance: []
10:49:37Z == 3 remove glance (keep nothing)
10:50:09Z remove -> 200 {'ok': True, 'data': {'removed': 'glance', 'volumes_removed': ['glance_glance_config'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': 'Az alka
10:50:21Z [3 after remove] gate file: /opt/docker/stacks/traefik/dynamic/family-gate-glance.yml
10:50:21Z [3 after remove] a stranger's GET https://r1187glance.enkisfelhom.hu/ -> 404
10:50:21Z == 4 import the bundle
10:50:21Z import start -> 400 {'error': 'Missing path', 'ok': False}
10:50:21Z /api/export/import/status {"display_name": "Glance", "done": true, "error": "", "job_type": "export", "ok": true, "output_path": "/mnt/felhom-drives/scratch_hdd/exports/glance_20261020-104935.fab", "output_size": "5.6 KB", "running": false, "stack_name": "glance", "steps": [{"label": "Előkészítés", "status": "done"}, {"label": "Konfiguráció mentése", "status": "done"}, {"label": "Adatbázis mentése", "status": "done"}, {"la
10:53:42Z state after import: not_deployed family_gate in app_config: False app_config keys: []
10:54:14Z [4 FAULT after import] gate file: (none)
10:54:14Z [4 FAULT after import] a stranger's GET https://r1187glance.enkisfelhom.hu/ -> 404
10:54:15Z controller log: 2026/10/20 10:48:52 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:48:58 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:49:34 family_gate.go:325: [DEBUG] [web] family gate glance: GET / without a pass — 401 (visitor 192.168.0.180)
2026/10/20 10:49:35 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DOMAIN, SUBDOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:49:35 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:49:37 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DOMAIN, SUBDOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:49:39 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:49:43 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DOMAIN, SUBDOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/10/20 10:50:09 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/10/20 10:50:09 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/10/20 10:50:21 auth.go:144: [DEBUG] [web] auth: valid session for POST /api/export/import
2026/10/20 10:50:21 handler_export.go:328: [DEBUG] [web] apiImportStart: path="" hasPassword=false
2026/10/20 10:50:29 family_gate.go:190: [INFO] [stacks] glance: removed the family-gate file of an app that is not installed
2026/10/20 10:52:09 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/10/20 10:54:09 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
exit 0
@@ -0,0 +1,24 @@
10:54:26Z == 4 import the bundle /mnt/felhom-drives/scratch_hdd/exports/glance_20261020-104935.fab
10:54:26Z import start -> 200 {'ok': True}
10:54:26Z /api/export/import/status {"display_name": "Glance", "done": false, "error": "", "job_type": "import", "ok": true, "output_path": "", "output_size": "", "running": true, "stack_name": "glance", "steps": [{"label": "Csomag megnyitása", "status": "done"}, {"label": "Alkalmazás előkészítése", "status": "done"}, {"label": "Konfiguráció visszaállítása", "status": "running"}, {"label": "Felhasználói adatok visszaállítása", "stat
10:54:29Z /api/export/import/status {"display_name": "Glance", "done": false, "error": "", "job_type": "import", "ok": true, "output_path": "", "output_size": "", "running": true, "stack_name": "glance", "steps": [{"label": "Csomag megnyitása", "status": "done"}, {"label": "Alkalmazás előkészítése", "status": "done"}, {"label": "Konfiguráció visszaállítása", "status": "done"}, {"label": "Felhasználói adatok visszaállítása", "status"
10:54:32Z /api/export/import/status {"display_name": "Glance", "done": true, "error": "", "job_type": "import", "ok": true, "output_path": "", "output_size": "", "running": false, "stack_name": "glance", "steps": [{"label": "Csomag megnyitása", "status": "done"}, {"label": "Alkalmazás előkészítése", "status": "done"}, {"label": "Konfiguráció visszaállítása", "status": "done"}, {"label": "Felhasználói adatok visszaállítása", "status"
10:56:13Z state after import: running family_gate in app_config: False app_config keys: ['deployed', 'deployed_at', 'desired_state', 'env', 'installed_images', 'locked_fields']
10:56:55Z [4 FAULT after import] gate file: (none)
10:56:55Z [4 FAULT after import] a stranger's GET https://r1187glance.enkisfelhom.hu/ -> 200
10:56:56Z controller log: 2026/10/20 10:54:33 manager.go:1814: [INFO] [stacks] glance glanceapp/glance:v0.8.5 running Up 3 seconds (health: starting)
2026/10/20 10:54:39 healthprobe.go:187: [DEBUG] Health probe glance: HTTP GET :8080/ → 200 (1ms)
2026/10/20 10:54:49 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 10s ago, effective interval 5m0s, healthy=true
2026/10/20 10:54:59 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 20s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:09 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 30s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:19 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 40s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:29 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 50s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:39 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m0s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:49 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m10s ago, effective interval 5m0s, healthy=true
2026/10/20 10:55:59 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m20s ago, effective interval 5m0s, healthy=true
2026/10/20 10:56:09 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m30s ago, effective interval 5m0s, healthy=true
2026/10/20 10:56:19 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m40s ago, effective interval 5m0s, healthy=true
2026/10/20 10:56:29 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 1m50s ago, effective interval 5m0s, healthy=true
2026/10/20 10:56:39 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 2m0s ago, effective interval 5m0s, healthy=true
2026/10/20 10:56:49 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping glance — last check 2m10s ago, effective interval 5m0s, healthy=true
exit 0
@@ -0,0 +1,24 @@
200
{
200
{
"ok": true,
Exception in thread Thread-1 (pump):
Traceback (most recent call last):
File "/usr/lib/python3.13/threading.py", line 1043, in _bootstrap_inner
self.run()
~~~~~~~~^^
File "/usr/lib/python3.13/threading.py", line 994, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/5_hdd/felhom.eu/git/cc-secrets/ccsec/cli.py", line 153, in pump
dst.write(m.close()); dst.flush()
~~~~~~~~~^^
BrokenPipeError: [Errno 32] Broken pipe
Exception ignored on flushing sys.stdout:
BrokenPipeError: [Errno 32] Broken pipe
removed '/mnt/felhom-drives/scratch_hdd/exports/glance_20261020-104935.fab'
0
0
0
stranger GET after teardown: 404
@@ -0,0 +1,23 @@
# C3 — proven live: a `.fab` export → import makes a family-only app public
Scratch guest 9202, controller 0.331.0 (the `.fab` import code — `cmd/controller/main.go:3517-3530`
`SaveEncryptedAppConfig`, `stacks/family_gate.go:173-190` — read the same at 0.336.0, `7ca59e2`). Architecture: `09` §3
decisions 63/64 (the family gate), 221 (Glance only behind it), `07` §6.6 („never open by default").
| UTC | act (the dashboard's own endpoints) | observed (a stranger's GET through traefik; the gate file on disk) |
|---|---|---|
| 10:48:52 | `POST /api/stacks/glance/deploy` | running, `app_config.family_gate` set |
| 10:49:34 | **control** | gate file `traefik/dynamic/family-gate-glance.yml` present; stranger → **401** |
| 10:49:35 | `POST /api/export/start` (stop ticked, no password) | `glance_20261020-104935.fab`, 5.6 KB |
| 10:50:09 | stop + `POST /api/stacks/glance/remove` (data + backups) | removed; 10:50:29 „removed the family-gate file of an app that is not installed" |
| 10:54:26 | `POST /api/export/import` (the household's „Importálás") | import done in 6 s; app running |
| 10:56:13 | the app's record | `app_config` keys: deployed, deployed_at, desired_state, env, installed_images, locked_fields — **no family_gate** |
| 10:56:55 | **fault** | gate file **none**; stranger → **200** (Glance answers anyone who reaches the address) |
The first run's bundle-list parse was a harness slip (`01-run.log`, step 4 sent an empty path → 400, nothing done);
step 4 re-ran alone with the path the export's own status gave (`02-import.log`, `step4.py`). Teardown
(`03-teardown.txt`): Glance removed through the product, the bundle deleted (own file), no container, volume or gate
file left; the address answers 404.
On a household box the address is reachable from the internet through the tunnel. Family-gated apps in the catalog:
Glance, Grimmory, MeTube (the last two hold the family's books and videos).
@@ -0,0 +1,96 @@
#!/usr/bin/env python3
"""fab_gate_proof.py — C3 for R-1187 (e) on scratch 9202: does a `.fab` export → remove → import drop the family gate?
Glance has no login of its own; the catalog puts it ONLY behind the family gate (decision 221). Observables, each
read from a DIFFERENT channel than the act: (1) the gate file `family-gate-glance.yml` on the guest's disk; (2) what a
stranger's request to the app's host gets back from traefik (302 to the family page vs 200 from Glance).
Acts are the dashboard's own endpoints: deploy, /api/export/start, stop+remove, /api/export/import.
Env: CTL_BASE, CTL_DOMAIN, CTL_PW_ENV (tools/ctl.py).
"""
import json, os, subprocess, sys, time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/rehearsal-2026-10-20/tools")
import ctl # noqa: E402
APP, SUB = "glance", "r1187glance"
DOM = os.environ["CTL_DOMAIN"]
def say(*a):
print(time.strftime("%H:%M:%SZ", time.gmtime()), *a, flush=True)
def guest(cmd):
r = subprocess.run(["ssh", "demo-hp", f"export LC_ALL=C; pct exec 9202 -- bash -c {json.dumps(cmd)}"],
capture_output=True, text=True, timeout=300)
return (r.stdout + r.stderr).strip()
def observe(tag):
say(f"[{tag}] gate file:", guest("find / -xdev -name 'family-gate-glance.yml' 2>/dev/null | head -3; true") or "(none)")
out = subprocess.run(["curl", "-sk", "-o", "/dev/null", "-w", "%{http_code} %{redirect_url}",
"-H", f"Host: {SUB}.{DOM}", ctl.BASE + "/"], capture_output=True, text=True).stdout
say(f"[{tag}] a stranger's GET https://{SUB}.{DOM}/ ->", out)
def wait_stack(pred, n=60):
for _ in range(n):
code, d = ctl.call("GET", f"/api/stacks/{APP}")
st = (d.get("data") or {}) if isinstance(d, dict) else {}
if pred(st):
return st
time.sleep(5)
return st
def poll(path, n=120):
last = None
for _ in range(n):
code, d = ctl.call("GET", path)
dd = (d.get("data") or d) if isinstance(d, dict) else {}
s = json.dumps(dd, ensure_ascii=False)[:400]
if s != last:
say(" ", path, s)
last = s
if isinstance(dd, dict) and dd.get("status") in ("completed", "failed", "done", "error") or (
isinstance(dd, dict) and dd.get("running") is False and dd.get("status") not in ("running", "pending")):
return dd
time.sleep(3)
return dd
say("== 1 deploy glance")
code, d = ctl.call("POST", f"/api/stacks/{APP}/deploy", {"values": {"DOMAIN": DOM, "SUBDOMAIN": SUB}})
say("deploy ->", code, str(d)[:150])
st = wait_stack(lambda s: s.get("deployed") and s.get("state") in ("running", "unhealthy", "degraded"))
say("state:", st.get("state"), "family_gate in app_config:", bool((st.get("app_config") or {}).get("family_gate")))
time.sleep(20)
observe("1 POSITIVE CONTROL after install")
say("== 2 export to the data drive")
drive = "/mnt/felhom-drives/scratch_hdd"
code, d = ctl.call("POST", "/api/export/start", {"stack_name": APP, "dest_drive": drive, "password": "", "stop_app": True})
say("export start ->", code, str(d)[:200])
poll("/api/export/status")
code, d = ctl.call("GET", "/api/export/bundles")
bundles = [b for b in ((d.get("data") or {}).get("bundles") or d.get("data") or []) if isinstance(b, dict) and APP in json.dumps(b)]
say("bundles for glance:", json.dumps(bundles, ensure_ascii=False)[:500])
path = (bundles[-1].get("path") if bundles else None)
say("== 3 remove glance (keep nothing)")
ctl.call("POST", f"/api/stacks/{APP}/stop")
time.sleep(5)
code, d = ctl.call("POST", f"/api/stacks/{APP}/remove", {"remove_hdd_data": True, "remove_backups": True})
say("remove ->", code, str(d)[:160])
time.sleep(10)
observe("3 after remove")
say("== 4 import the bundle")
code, d = ctl.call("POST", "/api/export/import", {"path": path, "password": ""})
say("import start ->", code, str(d)[:200])
poll("/api/export/import/status")
st = wait_stack(lambda s: s.get("deployed") and s.get("state") in ("running", "unhealthy", "degraded"), n=40)
say("state after import:", st.get("state"), "family_gate in app_config:", bool((st.get("app_config") or {}).get("family_gate")),
"app_config keys:", sorted((st.get("app_config") or {}).keys()))
time.sleep(30)
observe("4 FAULT after import")
say("controller log:", guest("docker logs --since 15m felhom-controller 2>&1 | grep -iE 'family|import' | grep -v 'GET /api' | tail -15"))
@@ -0,0 +1,17 @@
#!/usr/bin/env python3
"""Step 4 of fab_gate_proof.py re-run alone: the first run's bundle-list parse found nothing (harness slip); the
export's own status gave the path."""
import sys
sys.argv = ["x"]
exec(open("fab_gate_proof.py").read().split('say("== 1 deploy glance")')[0])
path = "/mnt/felhom-drives/scratch_hdd/exports/glance_20261020-104935.fab"
say("== 4 import the bundle", path)
code, d = ctl.call("POST", "/api/export/import", {"path": path, "password": ""})
say("import start ->", code, str(d)[:200])
poll("/api/export/import/status")
st = wait_stack(lambda s: s.get("deployed") and s.get("state") in ("running", "unhealthy", "degraded"), n=40)
say("state after import:", st.get("state"), "family_gate in app_config:", bool((st.get("app_config") or {}).get("family_gate")),
"app_config keys:", sorted((st.get("app_config") or {}).keys()))
time.sleep(40)
observe("4 FAULT after import")
say("controller log:", guest("docker logs --since 6m felhom-controller 2>&1 | grep -iE 'family|import|glance' | grep -vE 'GET /api|ScanStacks|Env vars' | tail -15"))
@@ -0,0 +1,7 @@
# go test at controller 7ca59e2 (v0.336.0), scratch clone; 2026-10-20T11:11:31Z
=== RUN TestRehearsalR12_LeftoverTempBlocksEveryRetry
zz_rehearsal_r12_test.go:21: retry 1: err=fájlmásolás sikertelen: restoring appdata/app/p1.jpg: open /tmp/TestRehearsalR12_LeftoverTempBlocksEveryRetry3138873193/001/usb/appdata/app/p1.jpg.felhom-restoring: file exists; p1.jpg back=false; app restarted=true
zz_rehearsal_r12_test.go:21: retry 2: err=fájlmásolás sikertelen: restoring appdata/app/p1.jpg: open /tmp/TestRehearsalR12_LeftoverTempBlocksEveryRetry3138873193/001/usb/appdata/app/p1.jpg.felhom-restoring: file exists; p1.jpg back=false; app restarted=true
--- PASS: TestRehearsalR12_LeftoverTempBlocksEveryRetry (0.01s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.020s
@@ -0,0 +1,23 @@
package backup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (R-1188 c). Never committed. A crash during the whole restore's
// file copy leaves `<file>.felhom-restoring` behind (the copy writes it with O_EXCL); the retry then meets it.
import (
"os"
"path/filepath"
"testing"
)
func TestRehearsalR12_LeftoverTempBlocksEveryRetry(t *testing.T) {
f, _, liveLeg := wholeFixture(t)
// what a power cut in the middle of copying p1.jpg leaves on the live drive
if err := os.MkdirAll(liveLeg, 0o755); err != nil {
t.Fatal(err)
}
os.WriteFile(filepath.Join(liveLeg, "p1.jpg.felhom-restoring"), []byte("half"), 0o644)
for i := 1; i <= 2; i++ {
_, err := f.m.RestoreTier2Whole("app")
_, statErr := os.Stat(filepath.Join(liveLeg, "p1.jpg"))
t.Logf("retry %d: err=%v; p1.jpg back=%v; app restarted=%v", i, err, statErr == nil, f.fake.fullStarted)
}
}
@@ -0,0 +1,10 @@
# go test at controller 7ca59e2 (v0.336.0), scratch clone, fake provider seams; 2026-10-20T10:13:05Z
=== RUN TestRehearsalR5_WholeRestoreUnitRefusalAfterFileHalf
zz_rehearsal_r5_test.go:22: live files BEFORE: map[p2.jpg:P2 live older]
zz_rehearsal_r5_test.go:25: RestoreTier2Whole err = A(z) app adatbázis-másolata csonka: nem ér véget, ahogy egy teljes másolat. A visszaállítás biztonsági okból nem indult el — az alkalmazás és az adatai érintetlenek.
zz_rehearsal_r5_test.go:26: file counts: {Restored:1 Replaced:1 KeptNewer:0 Unchanged:0 BytesTotal:17}
zz_rehearsal_r5_test.go:27: live files AFTER: map[p1.jpg:P1 p2.jpg:P2 mirror NEWER p2.jpg.felhom-20261020T101306Z:P2 live older]
zz_rehearsal_r5_test.go:28: app stopped=true, full start happened=false, provider calls=[stop]
--- PASS: TestRehearsalR5_WholeRestoreUnitRefusalAfterFileHalf (0.01s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.019s
@@ -0,0 +1,29 @@
package backup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate R5). Never committed.
import (
"path/filepath"
"strings"
"testing"
"time"
)
func TestRehearsalR5_WholeRestoreUnitRefusalAfterFileHalf(t *testing.T) {
cut := strings.Replace(pgDump(1), "PostgreSQL database dump complete", "", 1) // a cut-off copy (R-640)
f := r102Tier2Fixture(t, []string{"app_data.tar"}, cut)
f.m.stackProvider = fileAppProvider{f.fake}
mid := time.Date(2026, 9, 22, 10, 0, 0, 0, time.UTC)
mirrorLeg := filepath.Join(f.destBase, "hdd", "appdata", "app")
liveLeg := filepath.Join(f.liveDrive, "appdata", "app")
writeAt(t, filepath.Join(mirrorLeg, "p1.jpg"), "P1", mid)
writeAt(t, filepath.Join(mirrorLeg, "p2.jpg"), "P2 mirror NEWER", mid.Add(72*time.Hour))
writeAt(t, filepath.Join(liveLeg, "p2.jpg"), "P2 live older", mid.Add(48*time.Hour))
before := fingerprint(t, liveLeg)
t.Logf("live files BEFORE: %v", before)
res, err := f.m.RestoreTier2Whole("app")
t.Logf("RestoreTier2Whole err = %v", err)
t.Logf("file counts: %+v", res.Files)
t.Logf("live files AFTER: %v", fingerprint(t, liveLeg))
t.Logf("app stopped=%v, full start happened=%v, provider calls=%v", f.fake.stopped, f.fake.fullStarted, f.fake.calls)
}
@@ -0,0 +1,8 @@
# go test at controller 7ca59e2 (v0.336.0), scratch clone; the PRODUCTION rsyncMirror (rsync -a --delete) on local temp dirs; 2026-10-20T11:02:49Z
=== RUN TestRehearsalT1_NightlyMirrorRunsDuringARestore
zz_rehearsal_t1_test.go:26: POSITIVE CONTROL: mirror after the night = [a.jpg b.jpg c.jpg d.jpg]
zz_rehearsal_t1_test.go:34: restore in progress: backup flag held = true
zz_rehearsal_t1_test.go:37: FAULT: mirror DURING the restore = [a.jpg b.jpg] (c.jpg, d.jpg — the files the restore is bringing back — are gone from the only copy)
--- PASS: TestRehearsalT1_NightlyMirrorRunsDuringARestore (0.22s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/backup 0.230s
@@ -0,0 +1,39 @@
package backup
// THROWAWAY proof for the 2026-10-20 data-loss hunt (candidate T1 / R-1180). Never committed.
import (
"os"
"path/filepath"
"testing"
)
type t1Provider struct{ *t2v2Provider }
func (p t1Provider) ListDeployedStacks() []StackSummary { return []StackSummary{{Name: "app"}} }
func TestRehearsalT1_NightlyMirrorRunsDuringARestore(t *testing.T) {
m, src, target, prov := newTier2V2(t, "app")
prov.has["app"] = true
prov.binds["app"] = []ClassifiedBind{mHDD("appdata/app/photos")}
m.stackProvider = t1Provider{prov}
m.tier2Mirror = rsyncMirror // the PRODUCTION mirror (rsync -a --delete), local temp dirs only
for _, n := range []string{"a.jpg", "b.jpg", "c.jpg", "d.jpg"} {
mustWrite(t, filepath.Join(src, "appdata", "app", "photos", n), n)
}
m.RunAllTier2()
mir := filepath.Join(target, "backups", "secondary", "app", "hdd", "appdata", "app", "photos")
ls := func(d string) []string { e, _ := os.ReadDir(d); var o []string; for _, x := range e { o = append(o, x.Name()) }; return o }
t.Logf("POSITIVE CONTROL: mirror after the night = %v", ls(mir))
// The household deleted half the photos and starts the second drive's restore; the restore holds the backup flag.
os.Remove(filepath.Join(src, "appdata", "app", "photos", "c.jpg"))
os.Remove(filepath.Join(src, "appdata", "app", "photos", "d.jpg"))
if err := m.acquireRunning(); err != nil {
t.Fatal(err)
}
t.Logf("restore in progress: backup flag held = %v", m.acquireRunning() != nil)
// 03:30 — the nightly second-drive leg fires while the restore is still copying.
m.RunAllTier2()
t.Logf("FAULT: mirror DURING the restore = %v (c.jpg, d.jpg — the files the restore is bringing back — are gone from the only copy)", ls(mir))
m.releaseRunning()
}
@@ -0,0 +1,57 @@
// Replays hub cmd/hub/main.go scheduleDaily's arithmetic (felhom.eu 5c48731, lines 1057-1062) over
// 2026-10-23..27 with a simulated clock, for each hub daily job. Prints every fire time.
package main
import (
"fmt"
"time"
)
func main() {
bud, _ := time.LoadLocation("Europe/Budapest")
jobs := []struct{ name string; h, m int }{{"db-snapshot", 2, 0}, {"prune", 4, 30}, {"deadline-check", 5, 0}, {"offsite-key-audit", 7, 10}}
for _, j := range jobs {
now := time.Date(2026, 10, 23, 12, 0, 0, 0, bud)
end := time.Date(2026, 10, 27, 12, 0, 0, 0, bud)
fmt.Printf("%s (%02d:%02d):\n", j.name, j.h, j.m)
for now.Before(end) {
n := now.In(bud)
next := time.Date(n.Year(), n.Month(), n.Day(), j.h, j.m, 0, 0, bud)
if !next.After(n) {
next = next.Add(24 * time.Hour)
}
fmt.Printf(" fires %s (%s)\n", next.In(bud).Format("2006-01-02 15:04 MST"), next.UTC().Format("15:04Z"))
now = next // fn() runs instantly; loop re-reads the clock at the fire instant
}
}
}
--- go run, go version go1.26.0 linux/amd64
db-snapshot (02:00):
fires 2026-10-24 02:00 CEST (00:00Z)
fires 2026-10-25 02:00 CEST (00:00Z)
fires 2026-10-25 02:00 CET (01:00Z)
fires 2026-10-26 02:00 CET (01:00Z)
fires 2026-10-27 02:00 CET (01:00Z)
fires 2026-10-28 02:00 CET (01:00Z)
prune (04:30):
fires 2026-10-24 04:30 CEST (02:30Z)
fires 2026-10-25 03:30 CET (02:30Z)
fires 2026-10-25 04:30 CET (03:30Z)
fires 2026-10-26 04:30 CET (03:30Z)
fires 2026-10-27 04:30 CET (03:30Z)
fires 2026-10-28 04:30 CET (03:30Z)
deadline-check (05:00):
fires 2026-10-24 05:00 CEST (03:00Z)
fires 2026-10-25 04:00 CET (03:00Z)
fires 2026-10-25 05:00 CET (04:00Z)
fires 2026-10-26 05:00 CET (04:00Z)
fires 2026-10-27 05:00 CET (04:00Z)
fires 2026-10-28 05:00 CET (04:00Z)
offsite-key-audit (07:10):
fires 2026-10-24 07:10 CEST (05:10Z)
fires 2026-10-25 06:10 CET (05:10Z)
fires 2026-10-25 07:10 CET (06:10Z)
fires 2026-10-26 07:10 CET (06:10Z)
fires 2026-10-27 07:10 CET (06:10Z)
fires 2026-10-28 07:10 CET (06:10Z)
@@ -0,0 +1,42 @@
# Part 1a — hub 0.162.0 deploy (operator yes 2026-10-20), read 2026-10-20T06:19:21Z
manifest commit e1d349f1; sync of Deployment/hub only (only it was OutOfSync)
argocd sync=Synced health=Healthy rev=b0ae2c574a8870e0e55455ceae77639b68a3d76f
pod hub-8c44cf5cb-srth9 start 2026-10-20T06:03:39Z image gitea.dooplex.hu/admin/felhom-hub:0.162.0 imageID gitea.dooplex.hu/admin/felhom-hub@sha256:69285e640a9c5e4ce59b1fbb5cd94623fa47a71798e9d86fa0767ee6c69a6ac8
## start-up and R-1001 log lines
2026/10/20 08:03:42 [INFO] felhom-hub 0.162.0 starting
2026/10/20 08:04:19 [INFO] Host staleness checker initialized: 3 ok, 1 already alarmed (seeded silently, R-1001), 0 stale, 0 down (left unseeded → first Check emits; host_stale after 45m0s, host_down after 1h30m0s)
2026/10/20 08:04:57 [INFO] Received report from tester-1 (5760 bytes)
2026/10/20 08:04:57 [INFO] Received report from demo-felhom (6065 bytes)
2026/10/20 08:04:58 [INFO] Received report from demo-hp (10036 bytes)
2026/10/20 08:05:24 [INFO] restore-test staleness: Tester-2 pbs tier still unproven, already reported before the restart — not re-sent (R-1001)
2026/10/20 08:05:24 [INFO] restore-test staleness: Tester-2 local tier still unproven, already reported before the restart — not re-sent (R-1001)
2026/10/20 08:07:33 [INFO] Received report from demo-felhom (6081 bytes)
2026/10/20 08:07:34 [INFO] Received report from tester-1 (5755 bytes)
2026/10/20 08:07:36 [INFO] Received report from demo-hp (10004 bytes)
2026/10/20 08:08:50 [INFO] host-report from demo-hp-bb76ea (1 guests, 4 storage targets, 2 backups, 2 restore-tests, 2 pbs-snapshots, 21418 bytes)
2026/10/20 08:09:21 [INFO] host-report from tester-1-d70be4 (1 guests, 3 storage targets, 2 backups, 2 restore-tests, 2 pbs-snapshots, 20577 bytes)
2026/10/20 08:10:36 [INFO] host-report from demo-felhom-8363b5 (1 guests, 4 storage targets, 2 backups, 2 restore-tests, 3 pbs-snapshots, 21708 bytes)
## events with id > 6129 (the last id before the restart):
(none above = no event)
## before: each earlier restart re-sent Tester-2's alarms
6055|host_down|2026-10-19 02:15:47
6056|restore_test_stale|2026-10-19 02:15:51
6057|restore_test_stale|2026-10-19 02:15:51
6074|host_down|2026-10-19 09:30:04
6075|restore_test_stale|2026-10-19 09:30:09
6076|restore_test_stale|2026-10-19 09:30:09
6087|host_down|2026-10-19 14:12:26
6088|restore_test_stale|2026-10-19 14:12:58
6089|restore_test_stale|2026-10-19 14:12:59
## floor
min_controller_version|0.335.0
min_controller_version_declared_min_agent|0.335.0=0.158.1
## Day-0 agent dropdown (GET /configuration, CC token)
['', '0.160.0', '0.159.2', '0.159.1', '0.159.0', '0.158.1', '0.158.0', '0.157.0', '0.156.1', '0.156.0', '0.155.0', '0.154.0', '0.153.0', '0.152.0', '0.151.0', '0.150.0']
## mailbox (Gmail, second channel): last Tester-2 host_down / restore_test_stale mails = 2026-10-19T14:12:27Z / 14:12:59Z (the 0.161.0 restart); none after the 06:03 UTC restart; the daily 03:00Z expected_* mails present (mailbox live)
@@ -0,0 +1,65 @@
# Part 1b — agent 0.161.0 (operator yes 2026-10-20), read 2026-10-20T07:05:57Z
## release (scripts/release-agent.sh from a clean clone at 5152123)
[release-agent] built ok: sha256 ff4e6dc52dd70234913445ecdeb88d31dea8e394d77c48704d26ff19b999d3b5
[release-agent] config bundle built: sha256 485f36c957d83f772aa22cac24e5e73f44da5cf8b957b1fd513bec2bc1d12c47
[release-agent] tagging v0.161.0 at 5152123 …
[publish-agent] upload OK (HTTP 201)
[publish-agent] round-trip GET verified (sha256 matches)
[release-agent] config bundle published (HTTP 201)
RELEASED — and installable, verified by download, not by this script's own say-so.
sha256 : ff4e6dc52dd70234913445ecdeb88d31dea8e394d77c48704d26ff19b999d3b5
bundle : 485f36c957d83f772aa22cac24e5e73f44da5cf8b957b1fd513bec2bc1d12c47 (felhom-config-bundle.json — vouch it with the agent)
* [new tag] v0.161.0 -> v0.161.0
R-1083 NOT in this release: an agent key for 9202 would make its controller book whole-guest backups through
the agent, one tier of which writes to ep0 (demo-hp namespace) — a change on ep0 the brief forbids; 9202 is
also outside the felhom pool. Recorded in the R-1083 row.
## delivery: one signed agent_update job per box (felhom-opsign, key felhom-op-1)
### demo-hp (signed 06:24:11Z)
Oct 20 08:38:50 demo-hp felhom-agent[2622137]: time=2026-10-20T08:38:50.375+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=e3ca40956e0d5fc9 op=agent_update key_id=felhom-op-1 nonce=9e6c1034fbc50692fd1cbade967b32e6
Oct 20 08:38:51 demo-hp felhom-selfupdate-guarded[791860]: applied 0.161.0 (prev 0.160.0, sha ff4e6dc52dd70234913445ecdeb88d31dea8e394d77c48704d26ff19b999d3b5); detached restart scheduled
Oct 20 08:38:51 demo-hp felhom-agent[2622137]: time=2026-10-20T08:38:51.112+02:00 level=WARN msg="agent_update: signed update verified as root and handed off; restart scheduled" version=0.161.0 report="{\"agent_update\": {\"sha256\": \"ff4e6dc52dd70234913445ec
Oct 20 08:38:51 demo-hp felhom-agent[2622137]: time=2026-10-20T08:38:51.112+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=e3ca40956e0d5fc9 op=agent_update
Oct 20 08:38:53 demo-hp felhom-agent[791945]: time=2026-10-20T08:38:53.170+02:00 level=INFO msg="felhom-agent daemon starting" version=0.161.0 host_id=demo-hp-bb76ea hub_url=https://hub.felhom.eu interval_s=900
Oct 20 08:38:54 demo-hp felhom-agent[791945]: time=2026-10-20T08:38:54.213+02:00 level=INFO msg="capabilities self-check" ok=76 total=76 degraded=0 inactive=0
Oct 20 08:39:55 demo-hp felhom-agent[791945]: time=2026-10-20T08:39:55.311+02:00 level=WARN msg="selfupdate: update committed" version=0.161.0 wrapper=""
### tester-1 (signed 06:42:27Z)
Oct 20 08:54:21 felhom felhom-agent[2443463]: time=2026-10-20T08:54:21.074+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=9a6cc5c3d190a44c op=agent_update key_id=felhom-op-1 nonce=afe8d4d0a5389e1520b318ddf22ba9f2
Oct 20 08:54:22 felhom felhom-agent[2443463]: time=2026-10-20T08:54:22.211+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=9a6cc5c3d190a44c op=agent_update
Oct 20 08:54:24 felhom felhom-agent[560821]: time=2026-10-20T08:54:24.350+02:00 level=INFO msg="felhom-agent daemon starting" version=0.161.0 host_id=tester-1-d70be4 hub_url=https://hub.felhom.eu interval_s=900
Oct 20 08:54:25 felhom felhom-agent[560821]: time=2026-10-20T08:54:25.325+02:00 level=INFO msg="capabilities self-check" ok=76 total=76 degraded=0 inactive=0
Oct 20 08:55:26 felhom felhom-agent[560821]: time=2026-10-20T08:55:26.096+02:00 level=WARN msg="selfupdate: update committed" version=0.161.0 wrapper=""
### demo-felhom (signed 06:42:27Z)
Oct 20 08:55:28 demo-felhom felhom-agent[498196]: time=2026-10-20T08:55:28.000+02:00 level=WARN msg="signedjobs: AUTHORIZED signed op — executing" job=3c9c9c5b9ab01f25 op=agent_update key_id=felhom-op-1 nonce=84e9007d7d8fc1e4fef0d5d3a5250840
Oct 20 08:55:28 demo-felhom felhom-agent[498196]: time=2026-10-20T08:55:28.566+02:00 level=WARN msg="signedjobs: signed op COMPLETED" job=3c9c9c5b9ab01f25 op=agent_update
Oct 20 08:55:30 demo-felhom felhom-agent[2429752]: time=2026-10-20T08:55:30.694+02:00 level=INFO msg="felhom-agent daemon starting" version=0.161.0 host_id=demo-felhom-8363b5 hub_url=https://hub.felhom.eu interval_s=900
Oct 20 08:55:31 demo-felhom felhom-agent[2429752]: time=2026-10-20T08:55:31.379+02:00 level=INFO msg="capabilities self-check" ok=76 total=76 degraded=0 inactive=0
Oct 20 08:56:32 demo-felhom felhom-agent[2429752]: time=2026-10-20T08:56:32.693+02:00 level=WARN msg="selfupdate: update committed" version=0.161.0 wrapper=""
## hub view (latest host report per box)
demo-felhom-8363b5|0.161.0|2026-10-20 06:55:44
demo-hp-bb76ea|0.161.0|2026-10-20 06:54:06
tester-1-d70be4|0.161.0|2026-10-20 06:54:30
## host_busy, live on demo-hp (R-921): see 1b-host-busy-poll.txt — 3 free, 24 busy (backup:local), 21 free
"Mentés most" press 06:41:12Z through POST /api/guest-backup/trigger (the dashboard endpoint), 200 started
Oct 20 08:42:05 demo-hp felhom-agent[791945]: time=2026-10-20T08:42:05.179+02:00 level=INFO msg="local-api: backup reached snapshotted (app may resume)" vmid=9201 target=local job=backup-9201-1792478523540456451
Oct 20 08:49:31 demo-hp felhom-agent[791945]: time=2026-10-20T08:49:31.529+02:00 level=INFO msg="backup: completed" vmid=9201 target=local archive=local:backup/vzdump-lxc-9201-2026_10_20-08_42_04.tar.zst size_bytes=7150133935 unco
## R-1070: the tunnel probe the agent runs (pct exec <vmid> -- docker inspect -f ... cloudflared)
9202 (no tunnel): error: no such object: cloudflared rc=1
9201 (tunnel): running rc=0
fixture row in internal/hub/cloudflared_test.go: 25: {"absent, docker 29", "", "error: no such object: cloudflared", errors.New("exit status 1"), TunnelAbsent, "no tunnel set up"},
## tests on the released commit (5152123)
--- PASS: TestClassifyTunnel (0.00s)
ok gitea.dooplex.hu/admin/felhom-agent/internal/hub 0.011s
--- PASS: TestHostHealthVerdict_R1070_NoTunnelSetUp (0.00s)
ok gitea.dooplex.hu/admin/felhom-agent/internal/osupdate 0.013s
--- PASS: TestBackupStatus_R921_HostBusy (0.00s)
--- PASS: TestStaleLock_R1010_ForcesOnceOnlyWhenTheVolumeIsGone (0.00s)
ok gitea.dooplex.hu/admin/felhom-agent/internal/localapi 0.022s
--- PASS: TestDeleteSnapshotForce_R1010 (0.00s)
ok gitea.dooplex.hu/admin/felhom-agent/internal/proxmox 0.009s
@@ -0,0 +1,48 @@
2026-10-20T06:41:12Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:41:30Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:41:48Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:42:06Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:42:24Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:42:42Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:43:02Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:43:20Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:43:38Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:44:11Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:44:28Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:44:46Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:45:04Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:45:26Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:45:44Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:46:05Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:46:23Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:46:42Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:47:00Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:47:18Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:47:36Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:47:54Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:48:12Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:48:30Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:48:48Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:49:05Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:49:23Z path= /backup/status http= 200 pin=ok keys= ['host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": true, "what": "backup:local"} tiers_in_flight= []
2026-10-20T06:49:42Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:50:00Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:50:17Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:50:35Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:50:53Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:51:11Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:51:28Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:51:46Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:52:04Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:52:22Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:52:39Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:52:57Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:53:15Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:53:33Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:53:51Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:54:08Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:54:26Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:54:44Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:55:02Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:55:19Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
2026-10-20T06:55:37Z path= /backup/status http= 200 pin=ok keys= ['backup', 'host_busy', 'job_id', 'phase', 'tiers', 'vmid'] host_busy= {"busy": false} tiers_in_flight= []
@@ -0,0 +1,11 @@
# Part 1c — installer 1.35.0 publish (operator yes 2026-10-20), read 2026-10-20T06:20:23Z
tag refs:
1aa2e5585b7d13dc7b07fa9cc5e0711c34af291a refs/tags/installer-v1.35.0
e1d349f1001b013fbcd2f26b25d71f9c649412a3 refs/tags/installer-v1.35.0^{}
pins: commit b0ae2c57 (manifests/webpage.yaml, both git-sync refs); ArgoCD sync of Deployment/felhom-webpage only
tag file sha256: f7a196fd5b3389e684aa0766968f29738e0b818d6ac8a79a7e7516fa96c99873
served file sha256: f7a196fd5b3389e684aa0766968f29738e0b818d6ac8a79a7e7516fa96c99873
served version: SCRIPT_VERSION="1.35.0"
die_live_box lines in the served file: 4
before (06:16Z): served 1.34.0, sha256 df722ee4... (= the 1.34.0 tag file)
felhom-webpage-7f5c7968b5-g62t6 3/3 Running 0 2m49s
@@ -0,0 +1,55 @@
=== baseline Tue Oct 20 07:25:33 UTC 2026
image file: gitea.dooplex.hu/admin/felhom-controller:0.331.0
paperless-webserver ghcr.io/paperless-ngx/paperless-ngx:2.20.15 Up 7 hours (healthy)
paperless-postgres postgres:18-alpine Up 7 hours (healthy)
paperless-redis redis:7-alpine Up 7 hours (healthy)
immich-server ghcr.io/immich-app/immich-server:v3.2.4 Up 7 hours (healthy)
immich-postgres ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0 Up 7 hours (healthy)
immich-machine-learning ghcr.io/immich-app/immich-machine-learning:v3.2.4 Up 7 hours (healthy)
immich-redis redis:7-alpine Up 7 hours (healthy)
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.331.0 Up 12 hours (healthy)
filebrowser gtstef/filebrowser:1.5.6-stable Up 12 hours (healthy)
traefik traefik:v3.7.13 Up 4 days
--- images present at baseline (names only)
alpine:latest
curlimages/curl:8.11.1
ghcr.io/paperless-ngx/paperless-ngx:2.20.15
ghcr.io/puppeteer/puppeteer:latest
gitea.dooplex.hu/admin/felhom-controller:0.314.0-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.326.0-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.326.0-rc.2
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.2
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.3
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.4
gitea.dooplex.hu/admin/felhom-controller:0.327.1-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.331.0
gitea.dooplex.hu/admin/felhom-controller:0.331.0-rc.1
gitea.dooplex.hu/admin/felhom-samba:1.2.0
gtstef/filebrowser:1.3.3-stable
gtstef/filebrowser:1.5.6-stable
postgres:18-alpine
redis:7-alpine
redis:7.4-alpine
traefik:v3.6.7
traefik:v3.7.13
--- rallly template dir (pre-existing)
.felhom.yml
docker-compose.yml
hold-logs
--- rallly volumes: 0
/dev/loop1 69G 11G 54G 17% /var/lib/felhom
--- offbox folder (listing only)
total 20
drwx------ 2 root root 4096 Sep 30 08:40 .
drwxr-xr-x 4 root root 4096 Oct 20 07:25 ..
-rw-r--r-- 1 root root 91 Sep 30 08:40 known_hosts
-rw------- 1 root root 64 Sep 30 08:40 repo_password
-rw------- 1 root root 411 Sep 30 08:40 ssh_key
cb6b18f87662cf43d7e100f37366ce639ee5593fbf505751f5c1d831f8053fd1 settings.json
-rw-r--r-- 1 root root 10240 Oct 20 07:25 /root/r893b-offbox.before.tar
-rw-r--r-- 1 root root 27003 Oct 20 01:30 /root/r893b-settings.json.before
offbox target set: False
per-app offbox: None
restore holds: ['chaoscrash', 'chaosoom', 'chaosoomb', 'gokapi']
top-level keys: ['app_backup', 'app_update', 'app_update_events_seeded', 'backup_window_start', 'claim_consumed_generation', 'claimed', 'db_validations', 'filebrowser_admin_decided_at', 'filebrowser_admin_password_enc', 'filebrowser_admin_state', 'language', 'offbox_enlarge_notice_seeded', 'password_hash', 'restore_holds', 'storage_paths', 'unhealthy_stop_event_seeded', 'unhealthy_stops']
--- controller [ERROR] lines since container start: 0
@@ -0,0 +1,16 @@
=== upgrade to 0.336.0-rc.1 Tue Oct 20 07:25:47 UTC 2026
gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1
template parsing error: template: :1:23: executing "" at <.Config.Labels>: map has no entry for key "Labels"
restart rc=0
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1 Up 8 seconds (healthy)
2026/10/20 07:25:49 undo.go:676: [INFO] [stacks] applied-meta backfill (R-646): recorded 0 []; skipped 0 [] — not current with the catalog, their pinned version's .felhom.yml is no longer on the box
2026/10/20 07:25:49 scheduler.go:120: [INFO] [scheduler] Registered periodic job: conversion-copy-release (every 1h0m0s)
2026/10/20 07:25:49 scheduler.go:85: [DEBUG] [scheduler] periodic job registered: name="conversion-copy-release" interval=1h0m0s totalJobs=13
[ERROR] lines after start: 0
image id sha256:0756d4d2b1c83a666c0d8b40b526983ac13fa792111a0ddbb8f430ba2f9588c3
2026/10/20 07:25:49 main.go:353: [INFO] felhom-controller 0.336.0-rc.1 starting (customer: demo-hp, domain: enkisfelhom.hu)
2026/10/20 07:25:49 server.go:315: [DEBUG] [web] NewServer: initializing web server v0.336.0-rc.1
2026/10/20 07:25:50 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: 7ea0989d5c8d felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1
{"ok":true,"message":"felhom-controller is healthy"}
@@ -0,0 +1,10 @@
=== scratch SFTP target Tue Oct 20 07:27:37 UTC 2026
bridge=172.17.0.2 felhom-filebrowser=172.21.0.3 traefik-public=172.18.0.2
docker.io/atmoz/sftp:alpine
5167fd39cf22cc30c1f0507e59377916d921640e12e08ddb4f6318db2c42fc34
r893b-sftp atmoz/sftp:alpine Up 6 seconds 0.0.0.0:2222->22/tcp, [::]:2222->22/tcp
[172.17.0.1]:2222 ssh-ed25519 AAAAC3NzaC
=== off-site target configured through the household's endpoint 07:27:57
07:27:57 POST /backup/offbox/config -> 302 Location: /backups/remote?flash_error=flash.offbox.target_saved_escrow_agent_down
07:27:57 POST /backup/offbox/confirm-escrow -> 302 Location: /backups/remote?flash=flash.offbox.escrow_confirmed
07:27:58 POST /backup/offbox/toggle -> 302 Location: /backups/remote?flash=flash.offbox.app_setting_updated
@@ -0,0 +1,3 @@
09:28:03 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
09:28:53 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
deploy: True
@@ -0,0 +1,23 @@
=== A-written
=== marker A written 07:29:13 UTC
rallly lukevella/rallly:4.15.3 Up 43 seconds (healthy)
rallly-postgres postgres:18-alpine Up 48 seconds (healthy)
markers (phase=rows): A-before-snapshot-1=1
r893_after exists: 0
r893_only_old exists: 0
r893_new2 exists: 0
public tables: 34
prisma migrations: 153
db volume created: 2026-10-20T07:28:21Z
schema-only md5: 8c473c01fccf52724e62a1d73867b2cc (control, second dump: 8c473c01fccf52724e62a1d73867b2cc)
pg_dump: warning: there are circular foreign-key constraints among these tables:
pg_dump: detail: users
pg_dump: detail: provider_calendars
pg_dump: detail: calendar_connections
pg_dump: hint: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.
pg_dump: hint: Consider using a full dump instead of a --data-only dump to avoid this problem.
data-only md5: b914f0553434b56f021043dd5946c2fe
per-table row counts md5: 72061ad756a2f2d3842ad58d92879db2
per-table row counts: _prisma_migrations=153 accounts=0 calendar_connections=0 comments=0 credentials=0 event_types=0 instance_licenses=0 instance_settings=1 license_validations=0 licenses=0 options=0 participants=0 payment_methods=0 poll_activities=0 poll_invites=0 polls=0 provider_calendars=0 r893_marker=1 registered_instances=0 rescheduled_event_dates=0 scheduled_event_invites=0 scheduled_events=0 sessions=0 sheet_slots=0 sheets=0 space_api_keys=0 space_member_invites=0 space_members=0 spaces=0 subscriptions=0 user_notification_preferences=0 users=0 verifications=0 votes=0
definition: image: lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 image: postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873
restore-undo folder: ls: cannot access '/mnt/sys_drive/felhom-data/backups/restore-undo/rallly': No such file or directory
@@ -0,0 +1,18 @@
07:29:29 POST /backup/offbox/run -> 302 Location: /backups/remote?flash=flash.offbox.run_started
07:30:39 {"status": "ok", "snapshots": 1, "last_run": "2026-10-20T07:30:38Z", "last_duration": "1m8s", "repo_size_human": "7.2 MB", "last_error": ""}
=== before snapshot 2 (markers B, C; r893_after, r893_only_old) 07:30:50 UTC
rallly lukevella/rallly:4.15.3 Up 20 seconds (healthy)
rallly-postgres postgres:18-alpine Up 25 seconds (healthy)
markers (phase=rows): A-before-snapshot-1=1, B-after-snapshot-1=1, C-in-snapshot-2=1
r893_after exists: 1 rows: 1
r893_only_old exists: 1 rows: 1
r893_new2 exists: 0
public tables: 36
prisma migrations: 153
db volume created: 2026-10-20T07:28:21Z
schema-only md5: f872bd54b5e09991876d465efb13d754 (control, second dump: f872bd54b5e09991876d465efb13d754)
data-only md5: db5903abeeb4c3a6da32016ad71f01bb
per-table row counts md5: c032377e7ce421083e40fb875cfadb34
per-table row counts: _prisma_migrations=153 accounts=0 calendar_connections=0 comments=0 credentials=0 event_types=0 instance_licenses=0 instance_settings=1 license_validations=0 licenses=0 options=0 participants=0 payment_methods=0 poll_activities=0 poll_invites=0 polls=0 provider_calendars=0 r893_after=1 r893_marker=3 r893_only_old=1 registered_instances=0 rescheduled_event_dates=0 scheduled_event_invites=0 scheduled_events=0 sessions=0 sheet_slots=0 sheets=0 space_api_keys=0 space_member_invites=0 space_members=0 spaces=0 subscriptions=0 user_notification_preferences=0 users=0 verifications=0 votes=0
definition: image: lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 image: postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873
restore-undo folder: ls: cannot access '/mnt/sys_drive/felhom-data/backups/restore-undo/rallly': No such file or directory
@@ -0,0 +1,2 @@
07:30:56 POST /backup/offbox/run -> 302 Location: /backups/remote?flash=flash.offbox.run_started
07:32:07 {"status": "ok", "snapshots": 2, "last_run": "2026-10-20T07:32:04Z", "last_duration": "1m6s", "repo_size_human": "10.1 MB", "last_error": ""}
@@ -0,0 +1,21 @@
=== LIVE before the restore 07:32:38 UTC
rallly lukevella/rallly:4.15.3 Up 40 seconds (healthy)
rallly-postgres postgres:18-alpine Up 45 seconds (healthy)
markers (phase=rows): A-before-snapshot-1=1, B-after-snapshot-1=1, C-in-snapshot-2=1, D-after-snapshot-2=1
r893_after exists: 1 rows: 1
r893_only_old exists: 0
r893_new2 exists: 1 rows: 1
public tables: 36
prisma migrations: 153
db volume created: 2026-10-20T07:28:21Z
schema-only md5: 05828c7714605cb5f2a6b3b691b52a22 (control, second dump: 05828c7714605cb5f2a6b3b691b52a22)
data-only md5: e5c1a72ffb7107fef1d06e918b78194b
per-table row counts md5: d8bcbc4ba364fe3fdee69a2e773cf5be
per-table row counts: _prisma_migrations=153 accounts=0 calendar_connections=0 comments=0 credentials=0 event_types=0 instance_licenses=0 instance_settings=1 license_validations=0 licenses=0 options=0 participants=0 payment_methods=0 poll_activities=0 poll_invites=0 polls=0 provider_calendars=0 r893_after=1 r893_marker=4 r893_new2=1 registered_instances=0 rescheduled_event_dates=0 scheduled_event_invites=0 scheduled_events=0 sessions=0 sheet_slots=0 sheets=0 space_api_keys=0 space_member_invites=0 space_members=0 spaces=0 subscriptions=0 user_notification_preferences=0 users=0 verifications=0 votes=0
definition: image: lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 image: postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873
restore-undo folder: ls: cannot access '/mnt/sys_drive/felhom-data/backups/restore-undo/rallly': No such file or directory
markers (phase=rows): A-before-snapshot-1=1, B-after-snapshot-1=1, C-in-snapshot-2=1, D-after-snapshot-2=1
public tables: 36
schema-only md5: 05828c7714605cb5f2a6b3b691b52a22 (control, second dump: 05828c7714605cb5f2a6b3b691b52a22)
data-only md5: e5c1a72ffb7107fef1d06e918b78194b
per-table row counts md5: d8bcbc4ba364fe3fdee69a2e773cf5be
@@ -0,0 +1,27 @@
07:32:57 POST /backup/offbox/restore -> 302 Location: /backups/restore/app?name=rallly&full_prep=rallly&full_size=66.1 MB
07:32:57 POST /backup/offbox/restore -> 302 Location: /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
07:33:01 200 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-20T07:32:57.875089287Z", "last": {"op": "offbox-restore", "stack": "rallly", "ok": true, "message": "A(z) rallly teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-20T07:33:00.816791263Z"}, "last_recent": true}
=== prepared scratch 07:33:13
total 16
drwxr-xr-x 3 root root 4096 Oct 20 07:33 .
drwxr-xr-x 3 root root 4096 Oct 20 07:32 ..
-rw------- 1 root root 86 Oct 20 07:33 .felhom-restore-complete.json
drwxr-xr-x 3 root root 4096 Oct 14 14:05 mnt
/mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps:
total 120
drwxr-xr-x 2 root root 4096 Oct 20 07:30 .
drwxr-xr-x 5 root root 4096 Oct 20 07:31 ..
-rw-r--r-- 1 root root 111959 Oct 20 07:30 rallly-postgres.sql
/mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/volume-dumps:
total 67580
drwxr-xr-x 2 root root 4096 Oct 20 07:31 .
drwxr-xr-x 5 root root 4096 Oct 20 07:31 ..
-rw-r--r-- 1 root root 69190656 Oct 20 07:31 rallly_rallly_postgres_data.tar
snapshot-2 content check: r893_only_old mentions=5 r893_new2 mentions=0 marker C row=1 marker D row=0
completion markers before: 1
injected before line 2700:
2699---
2700:SELECT r893_forced_replay_failure(); -- R-893 option A proof 2026-10-20: forced error AFTER the volumes are replaced
2701--- PostgreSQL database dump complete
lines: 2705
@@ -0,0 +1,5 @@
07:33:40.967 restore-undo: rallly 4096;rallly/20261020T073340Z 4096;rallly/20261020T073340Z/rallly_rallly_postgres_data.tar.tmp 48553984;
07:33:41.275 restore-undo: rallly 4096;rallly/20261020T073340Z 4096;rallly/20261020T073340Z/rallly_rallly_postgres_data.tar.tmp 69198848;
07:33:41.583 restore-undo: rallly 4096;rallly/20261020T073340Z 4096;rallly/20261020T073340Z/rallly_rallly_postgres_data.tar 69198848;
07:33:54.453 restore-undo: <absent or empty>
watch end 07:35:57
@@ -0,0 +1,3 @@
=== reconstitute (forced failure) T0=2026-10-20T07:33:27Z
07:33:28 POST /backup/offbox/reconstitute -> 302 Location: /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
07:33:55 200 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-20T07:33:28.242768479Z", "last": {"op": "offbox-reconstitute", "stack": "rallly", "ok": false, "message": "A teljes visszaállítás sikertelen: a(z) rallly visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai visszakerültek a visszaállítás előtti állapotba, és az alkalmazás újra fut", "finished_at": "2026-10-20T07:33:54.173657757Z"}, "last_recent": true}
@@ -0,0 +1,307 @@
2026/10/20 07:33:28 auth.go:160: [DEBUG] [web] login attempt: visitor 192.168.0.180 (peer 172.18.0.3:34320, X-Forwarded-For "192.168.0.180", CF-Connecting-IP "")
2026/10/20 07:33:28 auth.go:192: [DEBUG] [web] login successful from 192.168.0.180, creating session
2026/10/20 07:33:28 session_store.go:140: [DEBUG] [web] sessions: saved 145 session(s) to dashboard-sessions.json
2026/10/20 07:33:28 auth.go:316: [DEBUG] [web] session created, expires=2026-10-27T07:33:28Z, active_sessions=145
2026/10/20 07:33:28 auth.go:212: [INFO] [web] Login from 192.168.0.180
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: GET / from 172.18.0.3:34320
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /launcher
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: GET /launcher from 172.18.0.3:34320
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for POST /backup/offbox/reconstitute
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: POST /backup/offbox/reconstitute from 172.18.0.3:34320
2026/10/20 07:33:28 auth.go:160: [DEBUG] [web] login attempt: visitor 192.168.0.180 (peer 172.18.0.3:34320, X-Forwarded-For "192.168.0.180", CF-Connecting-IP "")
2026/10/20 07:33:28 auth.go:192: [DEBUG] [web] login successful from 192.168.0.180, creating session
2026/10/20 07:33:28 session_store.go:140: [DEBUG] [web] sessions: saved 146 session(s) to dashboard-sessions.json
2026/10/20 07:33:28 auth.go:316: [DEBUG] [web] session created, expires=2026-10-27T07:33:28Z, active_sessions=146
2026/10/20 07:33:28 auth.go:212: [INFO] [web] Login from 192.168.0.180
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: GET / from 172.18.0.3:34320
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /launcher
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: GET /launcher from 172.18.0.3:34320
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:28 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:28 [WARN] [backup] ValidateDump: /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql is structurally valid (36 tables) but its accounts table has NO rows — the dump may predate the customer's data
2026/10/20 07:33:28 offbox_reconstitute.go:1253: [WARN] [offbox] rallly: the snapshot dump rallly-postgres.sql has no account rows — it may predate the customer's data
2026/10/20 07:33:29 restore_dbcreds.go:114: [INFO] [backup] Restore rallly: database password(s) [DB_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/20 07:33:29 dbdump.go:130: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/10/20 07:33:29 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: 74f5e7510c45 rallly rallly lukevella/rallly:4.15.3
d0758337136e rallly-postgres rallly postgres:18-alpine
2d8767d09c82 paperless-webserver paperless-ngx ghcr.io/paperless-ngx/paperless-ngx:2.20.15
5ac453c47c19 paperless-postgres paperless-ngx postgres:18-alpine
ac5fbd6a551f paperless-redis paperless-ngx redis:7-alpine
a5743e7ad6c9 immich-server immich ghcr.io/immich-app/immich-server:v3.2.4
66a2711b7a0d immich-postgres immich ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0
4e0f1ce...
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container rallly (image=lukevella/rallly:4.15.3, not a database)
2026/10/20 07:33:29 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: rallly-postgres (id=d0758337136e)
2026/10/20 07:33:29 dbdump.go:198: [DEBUG] DiscoverDatabases: rallly-postgres → stack=rallly, dbUser=rallly, dbName=rallly
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-webserver (image=ghcr.io/paperless-ngx/paperless-ngx:2.20.15, not a database)
2026/10/20 07:33:29 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: paperless-postgres (id=5ac453c47c19)
2026/10/20 07:33:29 dbdump.go:915: [DEBUG] DiscoverDatabases: paperless-postgres → stack "paperless-ngx" from the compose project label (the container name would have given "paperless")
2026/10/20 07:33:29 dbdump.go:198: [DEBUG] DiscoverDatabases: paperless-postgres → stack=paperless-ngx, dbUser=paperless, dbName=paperless
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-server (image=ghcr.io/immich-app/immich-server:v3.2.4, not a database)
2026/10/20 07:33:29 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: immich-postgres (id=66a2711b7a0d)
2026/10/20 07:33:29 dbdump.go:198: [DEBUG] DiscoverDatabases: immich-postgres → stack=immich, dbUser=immich, dbName=immich
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-machine-learning (image=ghcr.io/immich-app/immich-machine-learning:v3.2.4, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container r893b-sftp (image=atmoz/sftp:alpine, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.5.6-stable, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1, not a database)
2026/10/20 07:33:29 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.7.13, not a database)
2026/10/20 07:33:29 dbdump.go:205: [DEBUG] DiscoverDatabases: found 3 database(s), skipped 10 non-DB container(s)
2026/10/20 07:33:29 dbdump.go:208: [INFO] [backup] Discovered 3 databases
2026/10/20 07:33:29 dbdump.go:277: [DEBUG] DumpOne: starting dump for container=rallly-postgres, stack=rallly, dbType=postgres, dest=/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073329Z-rallly-postgres.sql
2026/10/20 07:33:29 dbdump.go:314: [DEBUG] DumpOne: pg_dump command: docker exec d0758337136e pg_dump -U rallly -d rallly --clean --if-exists --no-owner --no-privileges
2026/10/20 07:33:29 [WARN] [backup] ValidateDump: /mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073329Z-rallly-postgres.sql is structurally valid (36 tables) but its accounts table has NO rows — the dump may predate the customer's data
2026/10/20 07:33:29 dbdump.go:424: [DEBUG] DumpOne: completed rallly-postgres → pre-restore-20261020T073329Z-rallly-postgres.sql (size=109.4 KB, valid=true, tables=36, duration=298ms)
2026/10/20 07:33:29 dbdump.go:429: [INFO] [backup] DB dump: rallly-postgres → pre-restore-20261020T073329Z-rallly-postgres.sql (109.4 KB, 298ms, 36 tables)
2026/10/20 07:33:29 offbox_reconstitute.go:262: [INFO] [offbox] rallly: pre-restore safety dump written → pre-restore-20261020T073329Z-rallly-postgres.sql (109.4 KB)
2026/10/20 07:33:29 manager.go:1437: [DEBUG] [stacks] StopStack rallly: current state=running deployed=true containers=2
2026/10/20 07:33:29 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:33:29 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:33:29 manager.go:1695: [DEBUG] Running: docker compose down (in /opt/docker/stacks/rallly)
2026/10/20 07:33:29 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:33:29 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 1m50s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:29 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:33:29 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 1m10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:29 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping rallly — last check 1m10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:29 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (3 skipped not due, 0 skipped no container)
2026/10/20 07:33:30 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:33:31 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:31 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:34 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:34 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:34 scheduler.go:85: [DEBUG] [scheduler] job docker-socket-watch: execution starting
2026/10/20 07:33:37 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:37 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:39 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:33:39 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:33:40 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:33:40 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 2m0s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:40 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 1m20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:40 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping rallly — last check 1m20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:40 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (3 skipped not due, 0 skipped no container)
2026/10/20 07:33:40 manager.go:1717: [DEBUG] Command completed: docker compose down (took 10.8s)
2026/10/20 07:33:40 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 10.8s)
2026/10/20 07:33:40 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:40 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:40 manager.go:838: [INFO] [stacks] Status refresh: 9 containers across 70 stacks
2026/10/20 07:33:41 offbox_restore_undo.go:154: [INFO] [offbox] rallly: the live volumes are copied before the restore (1 copied, 0 new from the snapshot) in 867ms — /mnt/sys_drive/felhom-data/backups/restore-undo/rallly/20261020T073340Z (R-893)
2026/10/20 07:33:41 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:33:42 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:33:42 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:33:42 manager.go:1404: [INFO] [stacks] Starting stack rallly services only: [rallly-postgres]
2026/10/20 07:33:42 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:33:42 manager.go:1695: [DEBUG] Running: docker compose up -d rallly-postgres (in /opt/docker/stacks/rallly)
2026/10/20 07:33:43 manager.go:1717: [DEBUG] Command completed: docker compose up -d rallly-postgres (took 0.4s)
2026/10/20 07:33:43 manager.go:1415: [INFO] [stacks] Stack rallly services [rallly-postgres] started (took 0.4s)
2026/10/20 07:33:43 manager.go:838: [INFO] [stacks] Status refresh: 10 containers across 70 stacks
2026/10/20 07:33:43 dbdump.go:130: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/10/20 07:33:43 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: 306e430406e4 rallly-postgres rallly postgres:18-alpine
2d8767d09c82 paperless-webserver paperless-ngx ghcr.io/paperless-ngx/paperless-ngx:2.20.15
5ac453c47c19 paperless-postgres paperless-ngx postgres:18-alpine
ac5fbd6a551f paperless-redis paperless-ngx redis:7-alpine
a5743e7ad6c9 immich-server immich ghcr.io/immich-app/immich-server:v3.2.4
66a2711b7a0d immich-postgres immich ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0
4e0f1ce12bf2 immich-machine-learning immich ghcr.io/immich...
2026/10/20 07:33:43 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: rallly-postgres (id=306e430406e4)
2026/10/20 07:33:43 dbdump.go:198: [DEBUG] DiscoverDatabases: rallly-postgres → stack=rallly, dbUser=rallly, dbName=rallly
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-webserver (image=ghcr.io/paperless-ngx/paperless-ngx:2.20.15, not a database)
2026/10/20 07:33:43 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: paperless-postgres (id=5ac453c47c19)
2026/10/20 07:33:43 dbdump.go:915: [DEBUG] DiscoverDatabases: paperless-postgres → stack "paperless-ngx" from the compose project label (the container name would have given "paperless")
2026/10/20 07:33:43 dbdump.go:198: [DEBUG] DiscoverDatabases: paperless-postgres → stack=paperless-ngx, dbUser=paperless, dbName=paperless
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-server (image=ghcr.io/immich-app/immich-server:v3.2.4, not a database)
2026/10/20 07:33:43 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: immich-postgres (id=66a2711b7a0d)
2026/10/20 07:33:43 dbdump.go:198: [DEBUG] DiscoverDatabases: immich-postgres → stack=immich, dbUser=immich, dbName=immich
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-machine-learning (image=ghcr.io/immich-app/immich-machine-learning:v3.2.4, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container r893b-sftp (image=atmoz/sftp:alpine, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.5.6-stable, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1, not a database)
2026/10/20 07:33:43 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.7.13, not a database)
2026/10/20 07:33:43 dbdump.go:205: [DEBUG] DiscoverDatabases: found 3 database(s), skipped 9 non-DB container(s)
2026/10/20 07:33:43 dbdump.go:208: [INFO] [backup] Discovered 3 databases
2026/10/20 07:33:43 restore_db.go:87: [INFO] [backup] Restore rallly: replaying DB dump into rallly-postgres (postgres)
2026/10/20 07:33:43 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:33:43 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:43 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:44 dbdump.go:814: [ERROR] [backup] postgres import into rallly-postgres FAILED: exit status 3 — engine output follows:
ERROR: function r893_forced_replay_failure() does not exist
LINE 1: SELECT r893_forced_replay_failure();
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
2026/10/20 07:33:44 offbox_reconstitute.go:1100: [ERROR] [offbox] rallly: database replay failed, rolling back to the pre-restore state: importing postgres dump for rallly: postgres import into rallly-postgres failed: exit status 3
2026/10/20 07:33:44 dbdump.go:130: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/10/20 07:33:44 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: 306e430406e4 rallly-postgres rallly postgres:18-alpine
2d8767d09c82 paperless-webserver paperless-ngx ghcr.io/paperless-ngx/paperless-ngx:2.20.15
5ac453c47c19 paperless-postgres paperless-ngx postgres:18-alpine
ac5fbd6a551f paperless-redis paperless-ngx redis:7-alpine
a5743e7ad6c9 immich-server immich ghcr.io/immich-app/immich-server:v3.2.4
66a2711b7a0d immich-postgres immich ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0
4e0f1ce12bf2 immich-machine-learning immich ghcr.io/immich...
2026/10/20 07:33:44 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: rallly-postgres (id=306e430406e4)
2026/10/20 07:33:44 dbdump.go:198: [DEBUG] DiscoverDatabases: rallly-postgres → stack=rallly, dbUser=rallly, dbName=rallly
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-webserver (image=ghcr.io/paperless-ngx/paperless-ngx:2.20.15, not a database)
2026/10/20 07:33:44 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: paperless-postgres (id=5ac453c47c19)
2026/10/20 07:33:44 dbdump.go:915: [DEBUG] DiscoverDatabases: paperless-postgres → stack "paperless-ngx" from the compose project label (the container name would have given "paperless")
2026/10/20 07:33:44 dbdump.go:198: [DEBUG] DiscoverDatabases: paperless-postgres → stack=paperless-ngx, dbUser=paperless, dbName=paperless
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-server (image=ghcr.io/immich-app/immich-server:v3.2.4, not a database)
2026/10/20 07:33:44 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: immich-postgres (id=66a2711b7a0d)
2026/10/20 07:33:44 dbdump.go:198: [DEBUG] DiscoverDatabases: immich-postgres → stack=immich, dbUser=immich, dbName=immich
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-machine-learning (image=ghcr.io/immich-app/immich-machine-learning:v3.2.4, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-redis (image=redis:7-alpine, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container r893b-sftp (image=atmoz/sftp:alpine, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.5.6-stable, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1, not a database)
2026/10/20 07:33:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.7.13, not a database)
2026/10/20 07:33:44 dbdump.go:205: [DEBUG] DiscoverDatabases: found 3 database(s), skipped 9 non-DB container(s)
2026/10/20 07:33:44 dbdump.go:208: [INFO] [backup] Discovered 3 databases
2026/10/20 07:33:44 offbox_reconstitute.go:603: [DEBUG] [offbox] rallly: rallly-postgres was re-created during the restore (d0758337136e → 306e430406e4) — rolling back into the live container
2026/10/20 07:33:44 offbox_reconstitute.go:606: [INFO] [offbox] rallly: rolling back to the pre-restore state from pre-restore-20261020T073329Z-rallly-postgres.sql
2026/10/20 07:33:44 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073329Z-rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:33:45 dbdump.go:820: [INFO] [backup] Imported DB dump pre-restore-20261020T073329Z-rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:33:45 offbox_reconstitute.go:611: [INFO] [offbox] rallly: rollback complete — 1 database(s) returned to the pre-restore state
2026/10/20 07:33:45 manager.go:1437: [DEBUG] [stacks] StopStack rallly: current state=starting deployed=true containers=1
2026/10/20 07:33:45 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:33:45 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:33:45 manager.go:1695: [DEBUG] Running: docker compose down (in /opt/docker/stacks/rallly)
2026/10/20 07:33:46 manager.go:1717: [DEBUG] Command completed: docker compose down (took 0.9s)
2026/10/20 07:33:46 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 0.9s)
2026/10/20 07:33:46 manager.go:838: [INFO] [stacks] Status refresh: 9 containers across 70 stacks
2026/10/20 07:33:46 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:33:46 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:46 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:47 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:33:47 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:33:47 offbox_restore_undo.go:232: [WARN] [offbox] rallly: the restore failed (importing postgres dump for rallly: postgres import into rallly-postgres failed: exit status 3) — the live volumes and definition are put back; starting the app (R-893)
2026/10/20 07:33:47 notifier.go:1373: [WARN] notifier disabled (no hub configured): DROPPED event backup_run_failures (severity error) — further backup_run_failures events are logged at DEBUG only
2026/10/20 07:33:47 manager.go:1348: [DEBUG] [stacks] StartStack rallly: current state=stopped deployed=true
2026/10/20 07:33:47 manager.go:1351: [INFO] [stacks] Starting stack: rallly
2026/10/20 07:33:47 manager.go:1358: [DEBUG] [stacks] StartStack rallly: prepared 10 env vars for compose
2026/10/20 07:33:47 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:33:47 manager.go:1695: [DEBUG] Running: docker compose up -d (in /opt/docker/stacks/rallly)
2026/10/20 07:33:49 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:49 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714348KB) → used≈12498MB avail≈13400MB
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714348 availKB=15892428 → total=25898MB avail=13400MB used=12498MB (48.3%)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=12.1GB avail=52.7GB (18.6%)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=193.7GB avail=696.4GB (21.8%)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.95 2.29 1.70 5/1649 4507" → 1m=1.95 5m=2.29 15m=1.70
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 51.2°C (hwmon2)
2026/10/20 07:33:49 info.go:13: [DEBUG] [system] GetInfo done in 57ms — mem=12498MB/25898MB (48.3%), rootDisk=12.1GB/68.4GB (18.6%), load=1.95/2.29/1.70, temp=51.2°C (hwmon2), cpu=19.4%
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job docker-socket-watch: execution starting
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:33:49 scheduler.go:450: [INFO] [scheduler] Running job: stack-scan
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job stack-scan: execution starting
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job after-unclean-boot: execution starting
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/10/20 07:33:49 scheduler.go:85: [DEBUG] [scheduler] job ring-spill: execution starting
2026/10/20 07:33:50 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:33:50 manager.go:920: [DEBUG] [stacks] restart-policy of down member "rallly" = "unless-stopped"
2026/10/20 07:33:50 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 2m10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:50 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 1m30s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "chaoscrash" deployed=false composePath=/opt/docker/stacks/chaoscrash/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "chaosoom" deployed=false composePath=/opt/docker/stacks/chaosoom/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "chaosoomb" deployed=false composePath=/opt/docker/stacks/chaosoomb/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "dawarich" deployed=false composePath=/opt/docker/stacks/dawarich/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "grimmory" deployed=false composePath=/opt/docker/stacks/grimmory/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "grocy" deployed=false composePath=/opt/docker/stacks/grocy/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=true composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "karakeep" deployed=false composePath=/opt/docker/stacks/karakeep/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "lubelogger" deployed=false composePath=/opt/docker/stacks/lubelogger/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "metube" deployed=false composePath=/opt/docker/stacks/metube/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "nzbget" deployed=false composePath=/opt/docker/stacks/nzbget/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=true composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=true composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "prowlarr" deployed=false composePath=/opt/docker/stacks/prowlarr/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "qbittorrent" deployed=false composePath=/opt/docker/stacks/qbittorrent/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "radicale" deployed=false composePath=/opt/docker/stacks/radicale/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=true composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "sabnzbd" deployed=false composePath=/opt/docker/stacks/sabnzbd/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "transmission" deployed=false composePath=/opt/docker/stacks/transmission/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=false composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/10/20 07:33:50 manager.go:675: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/10/20 07:33:50 manager.go:1958: [DEBUG] [stacks] getCatalogTemplateSlugs: found 65 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/10/20 07:33:50 manager.go:756: [DEBUG] [stacks] ScanStacks: catalog has 65 template slugs for orphan detection
2026/10/20 07:33:50 manager.go:787: [INFO] [stacks] ScanStacks complete: 70 stacks found (4 deployed, 66 available)
2026/10/20 07:33:50 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:33:50 scheduler.go:467: [INFO] [scheduler] Job stack-scan completed (took 181ms)
2026/10/20 07:33:50 healthprobe.go:105: [DEBUG] [stacks] RunHealthProbes: rallly has a health check but no container to probe — candidates: [rallly(stopped) rallly-postgres(starting)]
2026/10/20 07:33:50 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (2 skipped not due, 1 skipped no container)
2026/10/20 07:33:52 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:52 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:53 manager.go:1717: [DEBUG] Command completed: docker compose up -d (took 6.2s)
2026/10/20 07:33:53 manager.go:1366: [INFO] [stacks] Stack rallly started successfully (took 6.2s)
2026/10/20 07:33:54 installed.go:409: [DEBUG] [stacks] installed-images rallly: unchanged (2 service(s)) — app.yaml not rewritten
2026/10/20 07:33:54 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:33:54 offbox_handlers.go:547: [ERROR] [web] off-box reconstitute rallly (async): a(z) rallly visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai visszakerültek a visszaállítás előtti állapotba, és az alkalmazás újra fut
2026/10/20 07:33:55 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:33:55 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:33:57 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:33:57 manager.go:1695: [DEBUG] Running: docker compose ps -a --format table {{.Name}} {{.Image}} {{.State}} {{.Status}} (in /opt/docker/stacks/rallly)
2026/10/20 07:33:57 manager.go:1717: [DEBUG] Command completed: docker compose ps -a --format table {{.Name}} {{.Image}} {{.State}} {{.Status}} (took 0.1s)
2026/10/20 07:33:57 manager.go:1811: [INFO] [stacks] Stack rallly post-start status:
2026/10/20 07:33:57 manager.go:1814: [INFO] [stacks] rallly lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 running Up 3 seconds (health: starting)
2026/10/20 07:33:57 manager.go:1814: [INFO] [stacks] rallly-postgres postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873 running Up 9 seconds (healthy)
2026/10/20 07:33:59 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:33:59 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:33:59 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 2m20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:59 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 1m40s ago, effective interval 5m0s, healthy=true
2026/10/20 07:33:59 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (2 skipped not due, 0 skipped no container)
2026/10/20 07:34:00 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:34:04 scheduler.go:85: [DEBUG] [scheduler] job docker-socket-watch: execution starting
@@ -0,0 +1,29 @@
2026/10/20 07:33:28 auth.go:144: [DEBUG] [web] auth: valid session for POST /backup/offbox/reconstitute
2026/10/20 07:33:28 server.go:637: [DEBUG] [web] ServeHTTP: POST /backup/offbox/reconstitute from 172.18.0.3:34320
2026/10/20 07:33:28 offbox_reconstitute.go:1253: [WARN] [offbox] rallly: the snapshot dump rallly-postgres.sql has no account rows — it may predate the customer's data
2026/10/20 07:33:29 restore_dbcreds.go:114: [INFO] [backup] Restore rallly: database password(s) [DB_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/20 07:33:29 offbox_reconstitute.go:262: [INFO] [offbox] rallly: pre-restore safety dump written → pre-restore-20261020T073329Z-rallly-postgres.sql (109.4 KB)
2026/10/20 07:33:29 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:33:40 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 10.8s)
2026/10/20 07:33:41 offbox_restore_undo.go:154: [INFO] [offbox] rallly: the live volumes are copied before the restore (1 copied, 0 new from the snapshot) in 867ms — /mnt/sys_drive/felhom-data/backups/restore-undo/rallly/20261020T073340Z (R-893)
2026/10/20 07:33:41 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:33:42 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:33:42 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:33:42 manager.go:1404: [INFO] [stacks] Starting stack rallly services only: [rallly-postgres]
2026/10/20 07:33:43 manager.go:1415: [INFO] [stacks] Stack rallly services [rallly-postgres] started (took 0.4s)
2026/10/20 07:33:43 restore_db.go:87: [INFO] [backup] Restore rallly: replaying DB dump into rallly-postgres (postgres)
2026/10/20 07:33:43 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:33:44 dbdump.go:814: [ERROR] [backup] postgres import into rallly-postgres FAILED: exit status 3 — engine output follows:
2026/10/20 07:33:44 offbox_reconstitute.go:1100: [ERROR] [offbox] rallly: database replay failed, rolling back to the pre-restore state: importing postgres dump for rallly: postgres import into rallly-postgres failed: exit status 3
2026/10/20 07:33:44 offbox_reconstitute.go:603: [DEBUG] [offbox] rallly: rallly-postgres was re-created during the restore (d0758337136e → 306e430406e4) — rolling back into the live container
2026/10/20 07:33:44 offbox_reconstitute.go:606: [INFO] [offbox] rallly: rolling back to the pre-restore state from pre-restore-20261020T073329Z-rallly-postgres.sql
2026/10/20 07:33:44 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073329Z-rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:33:45 offbox_reconstitute.go:611: [INFO] [offbox] rallly: rollback complete — 1 database(s) returned to the pre-restore state
2026/10/20 07:33:45 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:33:46 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 0.9s)
2026/10/20 07:33:46 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:33:47 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:33:47 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:33:47 offbox_restore_undo.go:232: [WARN] [offbox] rallly: the restore failed (importing postgres dump for rallly: postgres import into rallly-postgres failed: exit status 3) — the live volumes and definition are put back; starting the app (R-893)
2026/10/20 07:33:47 manager.go:1351: [INFO] [stacks] Starting stack: rallly
2026/10/20 07:33:54 offbox_handlers.go:547: [ERROR] [web] off-box reconstitute rallly (async): a(z) rallly visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai visszakerültek a visszaállítás előtti állapotba, és az alkalmazás újra fut
@@ -0,0 +1,24 @@
=== AFTER the failed restore + put-back 07:34:25 UTC
rallly lukevella/rallly:4.15.3 Up 31 seconds (healthy)
rallly-postgres postgres:18-alpine Up 37 seconds (healthy)
markers (phase=rows): A-before-snapshot-1=1, B-after-snapshot-1=1, C-in-snapshot-2=1, D-after-snapshot-2=1
r893_after exists: 1 rows: 1
r893_only_old exists: 0
r893_new2 exists: 1 rows: 1
public tables: 36
prisma migrations: 153
db volume created: 2026-10-20T07:33:46Z
schema-only md5: 05828c7714605cb5f2a6b3b691b52a22 (control, second dump: 05828c7714605cb5f2a6b3b691b52a22)
data-only md5: e5c1a72ffb7107fef1d06e918b78194b
per-table row counts md5: d8bcbc4ba364fe3fdee69a2e773cf5be
per-table row counts: _prisma_migrations=153 accounts=0 calendar_connections=0 comments=0 credentials=0 event_types=0 instance_licenses=0 instance_settings=1 license_validations=0 licenses=0 options=0 participants=0 payment_methods=0 poll_activities=0 poll_invites=0 polls=0 provider_calendars=0 r893_after=1 r893_marker=4 r893_new2=1 registered_instances=0 rescheduled_event_dates=0 scheduled_event_invites=0 scheduled_events=0 sessions=0 sheet_slots=0 sheets=0 space_api_keys=0 space_member_invites=0 space_members=0 spaces=0 subscriptions=0 user_notification_preferences=0 users=0 verifications=0 votes=0
definition: image: lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 image: postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873
restore-undo folder: ls: cannot access '/mnt/sys_drive/felhom-data/backups/restore-undo/rallly': No such file or directory
restore-undo root: total 8 drwx------ 2 root root 4096 Oct 20 07:33 . drwxr-xr-x 5 root root 4096 Oct 20 07:33 ..
live unit db-dumps: pre-restore-20261020T073329Z-rallly-postgres.sql rallly-postgres.sql
restore holds: ['chaoscrash', 'chaosoom', 'chaosoomb', 'gokapi'] | rallly hold: None
=== product view 07:34:31
200 {"ok": true, "data": {"name": "rallly", "meta": {"display_name": "Rallly", "description": "Időpont szavazás (Doodle alternatíva)", "category": "productivity", "subdomain": "poll", "slug": "rallly", "catalog_since": "2026-09-30", "resources": {"mem_request": "384M", "mem_limit": "1024M", "pi_compatible": true, "needs_hdd": false, "hungarian_ui": false}, "deploy_fields": [{"env_var": "DOMAIN", "label": "Domain", "type": "domain", "generate": "", "default": "", "required": true, "placeholder": "", "description": "A szerver domain neve", "locked_after_deploy": true}, {"env_var": "SUBDOMAIN", "labe
stack: {'state': 'running', 'deployed': True, 'status': None, 'held': None, 'hold': None, 'restore_hold': None, 'health': None}
09:34:40 gate: poll is gated — passed as the household (cookie set)
front door poll.enkisfelhom.hu/ -> 0 200
@@ -0,0 +1,5 @@
07:36:09 POST /backup/offbox/restore -> 302 Location: /backups/restore/app?name=rallly&full_prep=rallly&full_size=66.1 MB
07:36:09 POST /backup/offbox/restore -> 302 Location: /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
07:36:13 200 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-20T07:36:09.798980152Z", "last": {"op": "offbox-restore", "stack": "rallly", "ok": true, "message": "A(z) rallly teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-20T07:36:12.377386791Z"}, "last_recent": true}
=== re-prepared scratch 07:36:15: injected line count=0 (must be 0); completion markers=1; r893_only_old mentions=5; r893_new2 mentions=0; lines=2704
rallly-postgres.sql
@@ -0,0 +1,5 @@
07:36:41.401 restore-undo: rallly 4096;rallly/20261020T073641Z 4096;
07:36:41.709 restore-undo: rallly 4096;rallly/20261020T073641Z 4096;rallly/20261020T073641Z/rallly_rallly_postgres_data.tar.tmp 69198848;
07:36:42.322 restore-undo: rallly 4096;rallly/20261020T073641Z 4096;rallly/20261020T073641Z/rallly_rallly_postgres_data.tar 69198848;
07:36:57.965 restore-undo: <absent or empty>
watch end 07:38:27
@@ -0,0 +1,3 @@
=== reconstitute (normal) T1=2026-10-20T07:36:28Z
07:36:28 POST /backup/offbox/reconstitute -> 302 Location: /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
07:36:59 200 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-20T07:36:28.909561139Z", "last": {"op": "offbox-reconstitute", "stack": "rallly", "ok": true, "message": "A(z) rallly: 0 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 20. 09:30) — az alkalmazás újraindult.", "finished_at": "2026-10-20T07:36:57.852528534Z"}, "last_recent": true}
@@ -0,0 +1,191 @@
2026/10/20 07:36:28 auth.go:160: [DEBUG] [web] login attempt: visitor 192.168.0.180 (peer 172.18.0.3:34320, X-Forwarded-For "192.168.0.180", CF-Connecting-IP "")
2026/10/20 07:36:28 auth.go:192: [DEBUG] [web] login successful from 192.168.0.180, creating session
2026/10/20 07:36:28 session_store.go:140: [DEBUG] [web] sessions: saved 152 session(s) to dashboard-sessions.json
2026/10/20 07:36:28 auth.go:316: [DEBUG] [web] session created, expires=2026-10-27T07:36:28Z, active_sessions=152
2026/10/20 07:36:28 auth.go:212: [INFO] [web] Login from 192.168.0.180
2026/10/20 07:36:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /
2026/10/20 07:36:28 server.go:637: [DEBUG] [web] ServeHTTP: GET / from 172.18.0.3:34320
2026/10/20 07:36:28 auth.go:144: [DEBUG] [web] auth: valid session for GET /launcher
2026/10/20 07:36:28 server.go:637: [DEBUG] [web] ServeHTTP: GET /launcher from 172.18.0.3:34320
2026/10/20 07:36:28 auth.go:144: [DEBUG] [web] auth: valid session for POST /backup/offbox/reconstitute
2026/10/20 07:36:28 server.go:637: [DEBUG] [web] ServeHTTP: POST /backup/offbox/reconstitute from 172.18.0.3:34320
2026/10/20 07:36:29 auth.go:160: [DEBUG] [web] login attempt: visitor 192.168.0.180 (peer 172.18.0.3:34320, X-Forwarded-For "192.168.0.180", CF-Connecting-IP "")
2026/10/20 07:36:29 auth.go:192: [DEBUG] [web] login successful from 192.168.0.180, creating session
2026/10/20 07:36:29 session_store.go:140: [DEBUG] [web] sessions: saved 153 session(s) to dashboard-sessions.json
2026/10/20 07:36:29 auth.go:316: [DEBUG] [web] session created, expires=2026-10-27T07:36:29Z, active_sessions=153
2026/10/20 07:36:29 auth.go:212: [INFO] [web] Login from 192.168.0.180
2026/10/20 07:36:29 auth.go:144: [DEBUG] [web] auth: valid session for GET /
2026/10/20 07:36:29 server.go:637: [DEBUG] [web] ServeHTTP: GET / from 172.18.0.3:34320
2026/10/20 07:36:29 auth.go:144: [DEBUG] [web] auth: valid session for GET /launcher
2026/10/20 07:36:29 server.go:637: [DEBUG] [web] ServeHTTP: GET /launcher from 172.18.0.3:34320
2026/10/20 07:36:29 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:29 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:29 [WARN] [backup] ValidateDump: /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql is structurally valid (36 tables) but its accounts table has NO rows — the dump may predate the customer's data
2026/10/20 07:36:29 offbox_reconstitute.go:1253: [WARN] [offbox] rallly: the snapshot dump rallly-postgres.sql has no account rows — it may predate the customer's data
2026/10/20 07:36:29 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:36:29 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:36:30 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:30 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 4m10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:30 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping rallly — last check 2m10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:30 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 4m50s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:30 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (3 skipped not due, 0 skipped no container)
2026/10/20 07:36:30 restore_dbcreds.go:114: [INFO] [backup] Restore rallly: database password(s) [DB_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/20 07:36:30 dbdump.go:130: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/10/20 07:36:30 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: 0be48f112fd3 rallly rallly lukevella/rallly:4.15.3
28f60240bf89 rallly-postgres rallly postgres:18-alpine
2d8767d09c82 paperless-webserver paperless-ngx ghcr.io/paperless-ngx/paperless-ngx:2.20.15
5ac453c47c19 paperless-postgres paperless-ngx postgres:18-alpine
ac5fbd6a551f paperless-redis paperless-ngx redis:7-alpine
a5743e7ad6c9 immich-server immich ghcr.io/immich-app/immich-server:v3.2.4
66a2711b7a0d immich-postgres immich ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0
4e0f1ce...
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container rallly (image=lukevella/rallly:4.15.3, not a database)
2026/10/20 07:36:30 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: rallly-postgres (id=28f60240bf89)
2026/10/20 07:36:30 dbdump.go:198: [DEBUG] DiscoverDatabases: rallly-postgres → stack=rallly, dbUser=rallly, dbName=rallly
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-webserver (image=ghcr.io/paperless-ngx/paperless-ngx:2.20.15, not a database)
2026/10/20 07:36:30 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: paperless-postgres (id=5ac453c47c19)
2026/10/20 07:36:30 dbdump.go:915: [DEBUG] DiscoverDatabases: paperless-postgres → stack "paperless-ngx" from the compose project label (the container name would have given "paperless")
2026/10/20 07:36:30 dbdump.go:198: [DEBUG] DiscoverDatabases: paperless-postgres → stack=paperless-ngx, dbUser=paperless, dbName=paperless
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-redis (image=redis:7-alpine, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-server (image=ghcr.io/immich-app/immich-server:v3.2.4, not a database)
2026/10/20 07:36:30 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: immich-postgres (id=66a2711b7a0d)
2026/10/20 07:36:30 dbdump.go:198: [DEBUG] DiscoverDatabases: immich-postgres → stack=immich, dbUser=immich, dbName=immich
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-machine-learning (image=ghcr.io/immich-app/immich-machine-learning:v3.2.4, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-redis (image=redis:7-alpine, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container r893b-sftp (image=atmoz/sftp:alpine, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.5.6-stable, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1, not a database)
2026/10/20 07:36:30 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.7.13, not a database)
2026/10/20 07:36:30 dbdump.go:205: [DEBUG] DiscoverDatabases: found 3 database(s), skipped 10 non-DB container(s)
2026/10/20 07:36:30 dbdump.go:208: [INFO] [backup] Discovered 3 databases
2026/10/20 07:36:30 dbdump.go:277: [DEBUG] DumpOne: starting dump for container=rallly-postgres, stack=rallly, dbType=postgres, dest=/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073630Z-rallly-postgres.sql
2026/10/20 07:36:30 dbdump.go:314: [DEBUG] DumpOne: pg_dump command: docker exec 28f60240bf89 pg_dump -U rallly -d rallly --clean --if-exists --no-owner --no-privileges
2026/10/20 07:36:30 [WARN] [backup] ValidateDump: /mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/pre-restore-20261020T073630Z-rallly-postgres.sql is structurally valid (36 tables) but its accounts table has NO rows — the dump may predate the customer's data
2026/10/20 07:36:30 dbdump.go:424: [DEBUG] DumpOne: completed rallly-postgres → pre-restore-20261020T073630Z-rallly-postgres.sql (size=109.4 KB, valid=true, tables=36, duration=294ms)
2026/10/20 07:36:30 dbdump.go:429: [INFO] [backup] DB dump: rallly-postgres → pre-restore-20261020T073630Z-rallly-postgres.sql (109.4 KB, 294ms, 36 tables)
2026/10/20 07:36:30 offbox_reconstitute.go:262: [INFO] [offbox] rallly: pre-restore safety dump written → pre-restore-20261020T073630Z-rallly-postgres.sql (109.4 KB)
2026/10/20 07:36:30 manager.go:1437: [DEBUG] [stacks] StopStack rallly: current state=running deployed=true containers=2
2026/10/20 07:36:30 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:36:30 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:36:30 manager.go:1695: [DEBUG] Running: docker compose down (in /opt/docker/stacks/rallly)
2026/10/20 07:36:32 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:32 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:34 scheduler.go:85: [DEBUG] [scheduler] job docker-socket-watch: execution starting
2026/10/20 07:36:35 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:35 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:38 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:38 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:39 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:36:39 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:36:40 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:40 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 4m20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:40 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping rallly — last check 2m20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:40 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 1 targets (2 skipped not due, 0 skipped no container)
2026/10/20 07:36:40 healthprobe.go:187: [DEBUG] Health probe immich: API GET :2283/api/server/ping → 200 (2ms)
2026/10/20 07:36:40 healthprobe.go:167: [INFO] Health probes: 1 ok (of 1 probed)
2026/10/20 07:36:41 manager.go:1717: [DEBUG] Command completed: docker compose down (took 10.7s)
2026/10/20 07:36:41 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 10.7s)
2026/10/20 07:36:41 manager.go:838: [INFO] [stacks] Status refresh: 9 containers across 70 stacks
2026/10/20 07:36:41 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:41 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:42 offbox_restore_undo.go:154: [INFO] [offbox] rallly: the live volumes are copied before the restore (1 copied, 0 new from the snapshot) in 875ms — /mnt/sys_drive/felhom-data/backups/restore-undo/rallly/20261020T073641Z (R-893)
2026/10/20 07:36:42 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:36:43 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:36:43 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:36:43 manager.go:1404: [INFO] [stacks] Starting stack rallly services only: [rallly-postgres]
2026/10/20 07:36:43 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:36:43 manager.go:1695: [DEBUG] Running: docker compose up -d rallly-postgres (in /opt/docker/stacks/rallly)
2026/10/20 07:36:43 manager.go:1717: [DEBUG] Command completed: docker compose up -d rallly-postgres (took 0.4s)
2026/10/20 07:36:43 manager.go:1415: [INFO] [stacks] Stack rallly services [rallly-postgres] started (took 0.4s)
2026/10/20 07:36:43 manager.go:838: [INFO] [stacks] Status refresh: 10 containers across 70 stacks
2026/10/20 07:36:43 dbdump.go:130: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/10/20 07:36:43 dbdump.go:149: [DEBUG] DiscoverDatabases: docker ps output: a449dce25682 rallly-postgres rallly postgres:18-alpine
2d8767d09c82 paperless-webserver paperless-ngx ghcr.io/paperless-ngx/paperless-ngx:2.20.15
5ac453c47c19 paperless-postgres paperless-ngx postgres:18-alpine
ac5fbd6a551f paperless-redis paperless-ngx redis:7-alpine
a5743e7ad6c9 immich-server immich ghcr.io/immich-app/immich-server:v3.2.4
66a2711b7a0d immich-postgres immich ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0
4e0f1ce12bf2 immich-machine-learning immich ghcr.io/immich...
2026/10/20 07:36:43 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: rallly-postgres (id=a449dce25682)
2026/10/20 07:36:44 dbdump.go:198: [DEBUG] DiscoverDatabases: rallly-postgres → stack=rallly, dbUser=rallly, dbName=rallly
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-webserver (image=ghcr.io/paperless-ngx/paperless-ngx:2.20.15, not a database)
2026/10/20 07:36:44 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: paperless-postgres (id=5ac453c47c19)
2026/10/20 07:36:44 dbdump.go:915: [DEBUG] DiscoverDatabases: paperless-postgres → stack "paperless-ngx" from the compose project label (the container name would have given "paperless")
2026/10/20 07:36:44 dbdump.go:198: [DEBUG] DiscoverDatabases: paperless-postgres → stack=paperless-ngx, dbUser=paperless, dbName=paperless
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container paperless-redis (image=redis:7-alpine, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-server (image=ghcr.io/immich-app/immich-server:v3.2.4, not a database)
2026/10/20 07:36:44 dbdump.go:178: [DEBUG] DiscoverDatabases: found postgres container: immich-postgres (id=66a2711b7a0d)
2026/10/20 07:36:44 dbdump.go:198: [DEBUG] DiscoverDatabases: immich-postgres → stack=immich, dbUser=immich, dbName=immich
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-machine-learning (image=ghcr.io/immich-app/immich-machine-learning:v3.2.4, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container immich-redis (image=redis:7-alpine, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container r893b-sftp (image=atmoz/sftp:alpine, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.5.6-stable, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.336.0-rc.1, not a database)
2026/10/20 07:36:44 dbdump.go:171: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.7.13, not a database)
2026/10/20 07:36:44 dbdump.go:205: [DEBUG] DiscoverDatabases: found 3 database(s), skipped 9 non-DB container(s)
2026/10/20 07:36:44 dbdump.go:208: [INFO] [backup] Discovered 3 databases
2026/10/20 07:36:44 restore_db.go:87: [INFO] [backup] Restore rallly: replaying DB dump into rallly-postgres (postgres)
2026/10/20 07:36:44 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:36:44 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:44 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:45 dbdump.go:820: [INFO] [backup] Imported DB dump rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:36:45 restore_db.go:97: [INFO] [backup] Restore rallly: replayed 1 DB dump(s)
2026/10/20 07:36:45 manager.go:1348: [DEBUG] [stacks] StartStack rallly: current state=starting deployed=true
2026/10/20 07:36:45 manager.go:1351: [INFO] [stacks] Starting stack: rallly
2026/10/20 07:36:45 manager.go:1358: [DEBUG] [stacks] StartStack rallly: prepared 10 env vars for compose
2026/10/20 07:36:45 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:36:45 manager.go:1695: [DEBUG] Running: docker compose up -d (in /opt/docker/stacks/rallly)
2026/10/20 07:36:47 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:47 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:49 manager.go:1717: [DEBUG] Command completed: docker compose up -d (took 4.4s)
2026/10/20 07:36:49 manager.go:1366: [INFO] [stacks] Stack rallly started successfully (took 4.4s)
2026/10/20 07:36:49 installed.go:409: [DEBUG] [stacks] installed-images rallly: unchanged (2 service(s)) — app.yaml not rewritten
2026/10/20 07:36:49 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:49 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job ring-spill: execution starting
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job docker-socket-watch: execution starting
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:36:49 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 10s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:49 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 4m30s ago, effective interval 5m0s, healthy=true
2026/10/20 07:36:49 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (2 skipped not due, 0 skipped no container)
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/10/20 07:36:49 scheduler.go:85: [DEBUG] [scheduler] job after-unclean-boot: execution starting
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714348KB) → used≈12410MB avail≈13488MB
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714348 availKB=15996140 → total=25898MB avail=13488MB used=12410MB (47.9%)
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=12.1GB avail=52.7GB (18.7%)
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=193.7GB avail=696.4GB (21.8%)
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.48 1.89 1.65 6/1675 5879" → 1m=1.48 5m=1.89 15m=1.65
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 51.1°C (hwmon2)
2026/10/20 07:36:50 info.go:13: [DEBUG] [system] GetInfo done in 77ms — mem=12410MB/25898MB (47.9%), rootDisk=12.1GB/68.4GB (18.7%), load=1.48/1.89/1.65, temp=51.1°C (hwmon2), cpu=16.9%
2026/10/20 07:36:50 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:50 main.go:2287: [INFO] [deadapp] check alive: 20 scans since boot, 4 deployed app(s) evaluated, 0 currently down
2026/10/20 07:36:50 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:50 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:52 manager.go:1686: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, DB_PASSWORD, DOMAIN, SECRET_PASSWORD, SUBDOMAIN, IMPORT_PATH] (10 app + 0 system)
2026/10/20 07:36:52 manager.go:1695: [DEBUG] Running: docker compose ps -a --format table {{.Name}} {{.Image}} {{.State}} {{.Status}} (in /opt/docker/stacks/rallly)
2026/10/20 07:36:52 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:52 restore.go:298: [DEBUG] [backup] Post-restore health check: rallly not yet running, waiting...
2026/10/20 07:36:52 manager.go:1717: [DEBUG] Command completed: docker compose ps -a --format table {{.Name}} {{.Image}} {{.State}} {{.Status}} (took 0.1s)
2026/10/20 07:36:52 manager.go:1811: [INFO] [stacks] Stack rallly post-start status:
2026/10/20 07:36:52 manager.go:1814: [INFO] [stacks] rallly lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 running Up 3 seconds (health: starting)
2026/10/20 07:36:52 manager.go:1814: [INFO] [stacks] rallly-postgres postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873 running Up 9 seconds (healthy)
2026/10/20 07:36:53 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:53 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:56 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:56 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:57 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:36:57 restore.go:293: [DEBUG] [backup] Post-restore health check: rallly is running
2026/10/20 07:36:57 offbox_reconstitute.go:1158: [INFO] [offbox] reconstituted rallly from snapshot c3d94d03: 0 file(s) placed, 1 volume(s) replayed, 1 DB dump(s) replayed, safety dump=pre-restore-20261020T073630Z-rallly-postgres.sql, skewed=false
2026/10/20 07:36:57 offbox_handlers.go:551: [INFO] [web] off-box reconstitute rallly completed (async): files=0 dbs=1 snapshot=c3d94d03
2026/10/20 07:36:59 auth.go:144: [DEBUG] [web] auth: valid session for GET /api/backup/restore-status
2026/10/20 07:36:59 router.go:78: [DEBUG] [api] GET /api/backup/restore-status (path=/backup/restore-status)
2026/10/20 07:36:59 scheduler.go:85: [DEBUG] [scheduler] job status-refresh: execution starting
2026/10/20 07:36:59 scheduler.go:85: [DEBUG] [scheduler] job health-probes: execution starting
2026/10/20 07:37:00 manager.go:838: [INFO] [stacks] Status refresh: 11 containers across 70 stacks
2026/10/20 07:37:00 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping immich — last check 20s ago, effective interval 5m0s, healthy=true
2026/10/20 07:37:00 healthprobe.go:64: [DEBUG] [stacks] RunHealthProbes: skipping paperless-ngx — last check 4m40s ago, effective interval 5m0s, healthy=true
2026/10/20 07:37:00 healthprobe.go:110: [DEBUG] [stacks] RunHealthProbes: collected 1 targets (2 skipped not due, 0 skipped no container)
2026/10/20 07:37:00 healthprobe.go:187: [DEBUG] Health probe rallly: HTTP GET :3000/ → 200 (54ms)
2026/10/20 07:37:00 healthprobe.go:167: [INFO] Health probes: 1 ok (of 1 probed)
@@ -0,0 +1,23 @@
2026/10/20 07:36:28 auth.go:144: [DEBUG] [web] auth: valid session for POST /backup/offbox/reconstitute
2026/10/20 07:36:28 server.go:637: [DEBUG] [web] ServeHTTP: POST /backup/offbox/reconstitute from 172.18.0.3:34320
2026/10/20 07:36:29 offbox_reconstitute.go:1253: [WARN] [offbox] rallly: the snapshot dump rallly-postgres.sql has no account rows — it may predate the customer's data
2026/10/20 07:36:30 restore_dbcreds.go:114: [INFO] [backup] Restore rallly: database password(s) [DB_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/20 07:36:30 offbox_reconstitute.go:262: [INFO] [offbox] rallly: pre-restore safety dump written → pre-restore-20261020T073630Z-rallly-postgres.sql (109.4 KB)
2026/10/20 07:36:30 manager.go:1440: [INFO] [stacks] Stopping stack: rallly
2026/10/20 07:36:41 manager.go:1449: [INFO] [stacks] Stack rallly stopped successfully (took 10.7s)
2026/10/20 07:36:42 offbox_restore_undo.go:154: [INFO] [offbox] rallly: the live volumes are copied before the restore (1 copied, 0 new from the snapshot) in 875ms — /mnt/sys_drive/felhom-data/backups/restore-undo/rallly/20261020T073641Z (R-893)
2026/10/20 07:36:42 restore.go:215: [INFO] [backup] Restoring Docker volume rallly_rallly_postgres_data for rallly
2026/10/20 07:36:43 restore.go:253: [DEBUG] [backup] Volume rallly_rallly_postgres_data restored successfully
2026/10/20 07:36:43 restore.go:258: [INFO] [backup] Restored 1 Docker volume(s) for rallly
2026/10/20 07:36:43 manager.go:1404: [INFO] [stacks] Starting stack rallly services only: [rallly-postgres]
2026/10/20 07:36:43 manager.go:1415: [INFO] [stacks] Stack rallly services [rallly-postgres] started (took 0.4s)
2026/10/20 07:36:44 restore_db.go:87: [INFO] [backup] Restore rallly: replaying DB dump into rallly-postgres (postgres)
2026/10/20 07:36:44 dbdump.go:800: [DEBUG] [backup] ImportDump: importing /mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly/mnt/sys_drive/felhom-data/backups/primary/rallly/db-dumps/rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:36:45 dbdump.go:820: [INFO] [backup] Imported DB dump rallly-postgres.sql into rallly-postgres (postgres)
2026/10/20 07:36:45 restore_db.go:97: [INFO] [backup] Restore rallly: replayed 1 DB dump(s)
2026/10/20 07:36:45 manager.go:1351: [INFO] [stacks] Starting stack: rallly
2026/10/20 07:36:49 manager.go:1366: [INFO] [stacks] Stack rallly started successfully (took 4.4s)
2026/10/20 07:36:52 restore.go:298: [DEBUG] [backup] Post-restore health check: rallly not yet running, waiting...
2026/10/20 07:36:57 restore.go:293: [DEBUG] [backup] Post-restore health check: rallly is running
2026/10/20 07:36:57 offbox_reconstitute.go:1158: [INFO] [offbox] reconstituted rallly from snapshot c3d94d03: 0 file(s) placed, 1 volume(s) replayed, 1 DB dump(s) replayed, safety dump=pre-restore-20261020T073630Z-rallly-postgres.sql, skewed=false
2026/10/20 07:36:57 offbox_handlers.go:551: [INFO] [web] off-box reconstitute rallly completed (async): files=0 dbs=1 snapshot=c3d94d03
@@ -0,0 +1,20 @@
=== AFTER the normal restore of snapshot 2 07:38:31 UTC
rallly lukevella/rallly:4.15.3 Up About a minute (healthy)
rallly-postgres postgres:18-alpine Up About a minute (healthy)
markers (phase=rows): A-before-snapshot-1=1, B-after-snapshot-1=1, C-in-snapshot-2=1
r893_after exists: 1 rows: 1
r893_only_old exists: 1 rows: 1
r893_new2 exists: 0
public tables: 36
prisma migrations: 153
db volume created: 2026-10-20T07:36:42Z
schema-only md5: f872bd54b5e09991876d465efb13d754 (control, second dump: f872bd54b5e09991876d465efb13d754)
data-only md5: 1e688d1bc96fba7e5140f391707a762a
per-table row counts md5: c032377e7ce421083e40fb875cfadb34
per-table row counts: _prisma_migrations=153 accounts=0 calendar_connections=0 comments=0 credentials=0 event_types=0 instance_licenses=0 instance_settings=1 license_validations=0 licenses=0 options=0 participants=0 payment_methods=0 poll_activities=0 poll_invites=0 polls=0 provider_calendars=0 r893_after=1 r893_marker=3 r893_only_old=1 registered_instances=0 rescheduled_event_dates=0 scheduled_event_invites=0 scheduled_events=0 sessions=0 sheet_slots=0 sheets=0 space_api_keys=0 space_member_invites=0 space_members=0 spaces=0 subscriptions=0 user_notification_preferences=0 users=0 verifications=0 votes=0
definition: image: lukevella/rallly:4.15.3@sha256:8cd979aefe8d06e1822bc67054eb2d31088cdb831aa3f7b5615b3768f35431d9 image: postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873
restore-undo folder: ls: cannot access '/mnt/sys_drive/felhom-data/backups/restore-undo/rallly': No such file or directory
restore holds: ['chaoscrash', 'chaosoom', 'chaosoomb', 'gokapi']
stack: {'state': 'running', 'deployed': True, 'status': None, 'held': None, 'hold': None, 'restore_hold': None, 'health': None}
09:38:37 gate: poll is gated — passed as the household (cookie set)
front door poll.enkisfelhom.hu/ -> 0 200
@@ -0,0 +1,79 @@
10:43:11 [X] stop -> 200 {'ok': True, 'message': 'Stack rallly stop completed'}
10:43:43 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'rallly', 'volumes_removed': ['rallly_rallly_postgres_data'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'hdd_note': '
10:43:52 [X] after remove: deployed=False leftovers='/opt/docker/stacks/rallly'
remove: 200
=== machine teardown 08:44:07
rallly stack dir: .felhom.yml docker-compose.yml hold-logs (template dir pre-existed with the same three entries)
rallly containers: 0; rallly volumes: 0
ls: cannot access '/mnt/felhom-drives/scratch_hdd/backups/offsite-restore/rallly': No such file or directory
ls: cannot access '/mnt/sys_drive/felhom-data/backups/primary/rallly': No such file or directory
r893b-sftp
2
restore-undo (empty, created by this drill) removed
cb6b18f87662cf43d7e100f37366ce639ee5593fbf505751f5c1d831f8053fd1 settings.json
total 20
drwx------ 2 root root 4096 Sep 30 08:40 .
drwxr-xr-x 4 root root 4096 Oct 20 08:44 ..
-rw-r--r-- 1 root root 91 Sep 30 08:40 known_hosts
-rw------- 1 root root 64 Sep 30 08:40 repo_password
-rw------- 1 root root 411 Sep 30 08:40 ssh_key
restart rc=0
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.331.0 Up 8 seconds (healthy)
2026/10/20 08:44:08 main.go:353: [INFO] felhom-controller 0.331.0 starting (customer: demo-hp, domain: enkisfelhom.hu)
[ERROR] lines after start: 0
2
0
=== after teardown 08:45:17
image file: gitea.dooplex.hu/admin/felhom-controller:0.331.0
filebrowser gtstef/filebrowser:1.5.6-stable Up About a minute (healthy)
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.331.0 Up About a minute (healthy)
paperless-webserver ghcr.io/paperless-ngx/paperless-ngx:2.20.15 Up About an hour (healthy)
paperless-postgres postgres:18-alpine Up About an hour (healthy)
paperless-redis redis:7-alpine Up About an hour (healthy)
immich-server ghcr.io/immich-app/immich-server:v3.2.4 Up About an hour (healthy)
immich-postgres ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0 Up About an hour (healthy)
immich-machine-learning ghcr.io/immich-app/immich-machine-learning:v3.2.4 Up About an hour (healthy)
immich-redis redis:7-alpine Up About an hour (healthy)
traefik traefik:v3.7.13 Up 4 days
--- images now
alpine:latest
curlimages/curl:8.11.1
ghcr.io/paperless-ngx/paperless-ngx:2.20.15
ghcr.io/puppeteer/puppeteer:latest
gitea.dooplex.hu/admin/felhom-controller:0.314.0-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.326.0-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.326.0-rc.2
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.2
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.3
gitea.dooplex.hu/admin/felhom-controller:0.327.0-rc.4
gitea.dooplex.hu/admin/felhom-controller:0.327.1-rc.1
gitea.dooplex.hu/admin/felhom-controller:0.331.0
gitea.dooplex.hu/admin/felhom-controller:0.331.0-rc.1
gitea.dooplex.hu/admin/felhom-samba:1.2.0
gtstef/filebrowser:1.3.3-stable
gtstef/filebrowser:1.5.6-stable
postgres:18-alpine
redis:7-alpine
redis:7.4-alpine
traefik:v3.6.7
traefik:v3.7.13
offbox target set: False
per-app offbox: None
restore holds: ['chaoscrash', 'chaosoom', 'chaosoomb', 'gokapi']
[ERROR] lines since start: 0
/mnt/felhom-drives/scratch_hdd/backups/offsite-restore/:
total 8
drwxr-xr-x 2 root root 4096 Oct 20 08:43 .
drwxr-xr-x 5 root root 4096 Oct 19 18:52 ..
/mnt/sys_drive/felhom-data/backups/:
total 16
drwxr-xr-x 4 root root 4096 Oct 20 08:44 .
drwxr-xr-x 4 root root 4096 Sep 13 20:26 ..
drwxr-xr-x 3 root root 4096 Oct 20 08:43 primary
drwxr-xr-x 3 root root 4096 Oct 12 20:51 secondary
IMAGE LIST IDENTICAL TO BASELINE
=== host layer (demo-hp)
0
DooPlex scratch: throwaway key shredded
=== hub layer: nothing — 9202 has no hub
@@ -0,0 +1,161 @@
# P2 live: R-893 option A, proved on scratch guest 9202 (2026-10-20, by day)
Night brief 2026-10-20 part 2, Part 2 (operator answer „D20 A"). Controller **0.336.0-rc.1** (commit `93fb251`,
image id `sha256:0756d4d2…`) on Tier 0 only: demo-hp, scratch guest 9202. Code read live:
`felhom-controller/controller/internal/backup/offbox_restore_undo.go` and `offbox_reconstitute.go` at `93fb251`.
Architecture: `07-backup-architecture.md` §6.3 (R-893); `09` §3 decision 192 and D20 = A.
The method repeats `night-2026-10-19/P3/` (the measurement of the old behaviour) step for step, so the two sets of
numbers can be compared.
## Method (endpoint level, the household's buttons; no browser)
- 9202 was on **0.331.0**. For the run it went to 0.336.0-rc.1: pull, write `/etc/felhom-controller-image`,
restart `felhom-controller-bootstrap.service`. Healthy, 0 `[ERROR]` (`01-upgrade.txt`). It was put back after the run.
- **Scratch off-site target:** `atmoz/sftp:alpine` container `r893b-sftp` on 9202 itself (port 2222). The repo is on
9202's own disk at `/var/lib/felhom/r893b-sftp` (nvme-scratch, not `pve/data`). The controller reached it at
`172.17.0.1:2222`, which does not depend on DHCP. Set up through `POST /backup/offbox/config` with a throwaway
ed25519 key and the server's own host key pinned. 9202 has no agent, so the escrow was confirmed with the legacy
manual `POST /backup/offbox/confirm-escrow`. Only `rallly` was switched on (`POST /backup/offbox/toggle`).
- **Throwaway app:** Rallly 4.15.3 + postgres:18-alpine. Its DB is in the named volume `rallly_rallly_postgres_data`.
Deployed through the product (`box_walk.deploy`).
- **Observables, all positive** (`tool-obs.sh.txt`):
- the `r893_marker` rows;
- tables that exist only at certain times;
- the public base-table count;
- an md5 of `pg_dump --schema-only`, with pg 18's random `\restrict` lines removed and **a second dump as its
control** (equal every time);
- an md5 of the per-table row counts;
- an md5 of `pg_dump --data-only`;
- the definition's image lines;
- the `backups/restore-undo/rallly` folder.
- **Forced error:** the same as last night. One line, `SELECT r893_forced_replay_failure();`, goes into the PREPARED
scratch copy of the snapshot's dump, just before its completion marker. The completeness gate still passes, and the
replay fails **after the volume was replaced**.
- **Restore:** `POST /backup/offbox/reconstitute` with `app=rallly confirm=1`. The outcome was read from
`/api/backup/restore-status`, the source the restore page polls.
- **Watch on the undo folder:** while each restore ran, a watcher on 9202 listed
`/mnt/sys_drive/felhom-data/backups/restore-undo` every 0.3 s. This shows the copy from a different channel than
the controller's log.
## Timeline (UTC)
| Time | Act | File |
|---|---|---|
| 07:25:33 | baseline: 0.331.0, no off-site target, `settings.json` and the `offbox/` folder copied | `00-baseline.txt` |
| 07:25:47 | 9202 on 0.336.0-rc.1, healthy | `01-upgrade.txt` |
| 07:27:37–07:27:58 | SFTP target up; off-site configured, escrow confirmed, `rallly` switched on | `02-sftp-target.txt` |
| 07:28:03–07:28:53 | Rallly deployed | `03-deploy.txt` |
| 07:29:13 | marker **A** (34 tables) | `04-marker-A.txt` |
| 07:29:29–07:30:38 | off-site run → snapshot 1 | `05-snapshot-1.txt` |
| 07:30:50 | marker **B** + `r893_after`; `r893_only_old` + marker **C** (36 tables) | `05-snapshot-1.txt` |
| 07:30:56–07:32:04 | off-site run → **snapshot 2** (`c3d94d03`) | `06-snapshot-2.txt` |
| 07:32:38 | `r893_only_old` DROPPED, marker **D**, `r893_new2`: the LIVE record | `07-live-before-restore.txt` |
| 07:32:57–07:33:13 | full restore of snapshot 2 prepared (66.1 MB; content checked: C present, D absent); the failing line injected | `08-prepare-and-inject.txt` |
| 07:33:28 | reconstitute (forced failure) | `10-forced-failure-http.txt`, `11-controller-log-window*.txt` |
| 07:33:29 | undo dump of the live DB; app stopped 07:33:29–07:33:40 | |
| 07:33:40.9–41.6 | **live volume copied** to `restore-undo/rallly/20261020T073340Z/rallly_rallly_postgres_data.tar` (69 198 848 B), tmp then rename | `09-undo-folder-watch.txt` |
| 07:33:42 | snapshot's volume in place (`Restored 1 Docker volume(s)`) | |
| 07:33:44 | replay FAILED (`function r893_forced_replay_failure() does not exist`, exit 3); rows rolled back 07:33:45 | |
| 07:33:46–47 | app stopped; **the copy poured back** (`Restored 1 Docker volume(s)`, second time); „the live volumes and definition are put back; starting the app (R-893)" | |
| 07:33:53 | `Stack rallly started successfully` | |
| 07:33:54 | restore op ends ok=false; the copy folder **gone** (watcher: absent at 07:33:54.45) | |
| 07:34:25 | after state read: identical to 07:32:38 | `12-after-failed-restore.txt` |
| 07:36:09–07:36:15 | full restore prepared again, with no injection (injected-line count 0) | `13-normal-prepare.txt` |
| 07:36:28–07:36:57 | normal reconstitute: copy made 07:36:41–42, volume + dump replayed, app restarted, copy removed 07:36:57.9 | `14-…`, `15-…`, `16-controller-log-normal*.txt` |
| 07:38:31 | after state read = snapshot 2 | `17-after-normal-restore.txt` |
| (stop) | the session was paused by an API rate limit. When it resumed, 9202 was re-read first: nothing was in progress, no restore-undo copy, step 4 already recorded | |
| 08:43–08:45 | teardown, three layers | `18-teardown.txt` |
## Step 3: the forced failure, before and after
| | LIVE before the restore (07:32:38) | After the failed restore + put-back (07:34:25) | 2026-10-19 on 0.335.0 (old behaviour) |
|---|---|---|---|
| marker rows | A, B, C, D | **A, B, C, D** | A, B, C, D |
| `r893_only_old` (in snapshot 2 only) | absent | **absent** | present, 1 row |
| `r893_new2` (written after snapshot 2) | present, 1 row | **present, 1 row** | present, 1 row |
| public base tables | 36 | **36** | 37 |
| schema-only md5 | `05828c77…` | **`05828c77…`** (control equal) | — |
| per-table row-count md5 | `d8bcbc4b…` | **`d8bcbc4b…`** | — |
| data-only md5 | `e5c1a72f…` | **`e5c1a72f…`** | — |
| definition | rallly 4.15.3, postgres 18 (digest pins) | same | same |
| app | running | **running, healthy**; controller `state=running`; front door 200 | stopped, held (`restore_mixed`) |
| restore hold for rallly | none | **none** (holds: chaoscrash, chaosoom, chaosoomb, gokapi, as at baseline) | `restore_mixed` |
| `backups/restore-undo/rallly` | absent | **absent** (it existed 07:33:40–07:33:54) | (did not exist) |
The DB volume's `CreatedAt` moved from 07:28:21 to 07:33:46. That is expected: the put-back recreates the volume
from the copy. Every content observable is equal, the data-only dump included.
## Step 4: the normal restore of snapshot 2
| | Recorded just before snapshot 2 (07:30:50) | After the normal restore (07:38:31) |
|---|---|---|
| marker rows | A, B, C | **A, B, C** |
| `r893_only_old` | present, 1 row | **present, 1 row** |
| `r893_new2` | absent | **absent** |
| public base tables | 36 | **36** |
| schema-only md5 | `f872bd54…` | **`f872bd54…`** |
| per-table row-count md5 | `c032377e…` | **`c032377e…`** |
| data-only md5 | `db5903ab…` | `1e688d1b…` (differs; see below) |
| app | running | **running, healthy**; front door 200; no hold |
| restore-undo folder | — | **absent** (existed 07:36:41–07:36:57) |
- **Table count.** Snapshot 2 has **36** base tables, not 37. It held `r893_only_old` but not `r893_new2`. The
„37" in the brief is last night's MIXED state (36 live tables + the stray `r893_only_old`), not the snapshot's.
- **The data-only md5.** It differs from the read taken 6 s before the snapshot's own dump started, while every row
count and the schema are equal. Not explained here. It may be a row value that Rallly touched between that read
and the dump (the off-site run restarted the app), or row order after the reload. It was not part of the
acceptance list, and no row count moved. In step 3 the same observable was byte-equal, because there the volume
itself was put back.
## The sentences the household sees
- **Failed restore, put back** (`err.backup.restore_failed_put_back`, from `/api/backup/restore-status`): „A teljes
visszaállítás sikertelen: a(z) rallly visszaállítása sikertelen. Nem változott semmi: az alkalmazás adatai
visszakerültek a visszaállítás előtti állapotba, és az alkalmazás újra fut". Measured **true**: the data is
identical and the app runs. It does **not** contain „vedd fel velünk a kapcsolatot".
- **Normal restore:** „A(z) rallly: 0 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 20.
09:30) — az alkalmazás újraindult." True. 09:30 is local time (CEST) for snapshot 2's dump at 07:30 UTC.
- Flash keys seen on the way: `flash.offbox.target_saved_escrow_agent_down` (no agent on 9202, expected),
`escrow_confirmed`, `run_started`, `restore_started`, `full_restore_started`.
## Not measured (said plainly)
- **The version-change branch** (the snapshot's older definition written, then the live one written back). It needs
an app at an older catalog step, the same limit as last night. Pinned by `r893_putback_test.go`.
- **The `_files` sentence** (`restore_failed_put_back_files`). Rallly has no drive files, so 0 files were placed.
- **The refusals before the stop:** the fit check refusing (`restore_undo_no_space`), an unmeasurable volume
(`restore_undo_unmeasured`) and a failed copy (`restore_undo_copy_failed`). Only the positive path of the fit
check ran: it passed and the app was stopped after it.
- **A put-back that itself fails** (hold + kept copy).
- **The operator notification** for a put-back. 9202 has no hub, so it was not observable.
## Side observations
- Each manual off-site run restarted Rallly (its dump leg), as last night.
- The controller logged one expected `[ERROR]` pair per failure (the import and the rollback line) and one
`[ERROR] [web] off-box reconstitute … (async)` line that carries the household sentence. The sentence is good
news, so ERROR is a loud level for a put-back that worked. This is noted for the parent, not changed.
- The empty folder `backups/restore-undo/` is left behind after the per-app folder is removed (the code removes the
per-app folder only). This drill removed it by name.
## Teardown (three layers)
- **Machine (9202):**
- Rallly was removed through the product (`POST /api/stacks/rallly/stop`, then `/remove` with `remove_hdd_data` +
`remove_backups`). Result: `volumes_removed: rallly_rallly_postgres_data`; 0 containers, 0 volumes; no
`backups/primary/rallly`, no `offsite-restore/rallly`. The template folder `/opt/docker/stacks/rallly`
(`.felhom.yml`, `docker-compose.yml`, `hold-logs`) was there before and stays.
- `r893b-sftp` was removed. So were the images `atmoz/sftp:alpine` and `lukevella/rallly:4.15.3` (both absent at
baseline), the repo folder, the key and the empty `backups/restore-undo/`.
- `settings.json` was put back from the 07:25 copy (sha256 `cb6b18f8…` = baseline) and `offbox/` from its tar,
with the controller stopped.
- The controller is back on **0.331.0**: healthy, 0 `[ERROR]`. Off-site target unset, no per-app off-site switch,
restore holds as at baseline.
- The 0.336.0-rc.1 image was removed by name. The image list is **identical to the baseline**. All
`/root/r893b-*` and `/tmp/r893b-*` files are gone.
- Not put back: `restore-status.json`, the controller's record of the last op. It now names this drill's last
restore, as it named last night's at baseline.
- **Host (demo-hp):** only the per-call `/tmp/r893b-g-*` script copies, each removed after its call; 0 left. Nothing
on `pve/data`. No whole-guest backup taken.
- **Hub:** nothing. 9202 has no hub.
- **DooPlex:** the throwaway key was shredded from the session scratchpad.
@@ -0,0 +1,22 @@
#!/bin/bash
# r893b-obs.sh LABEL — positive observables of the Rallly database (read-only)
P="docker exec rallly-postgres psql -U rallly -d rallly -Atq"
echo "=== $1 $(date -u +%T) UTC"
docker ps -a --filter label=com.docker.compose.project=rallly --format '{{.Names}} {{.Image}} {{.Status}}'
echo "markers (phase=rows): $($P -c "select string_agg(phase||'='||n, ', ' order by phase) from (select phase, count(*) n from r893_marker group by phase) x" 2>&1)"
for t in r893_after r893_only_old r893_new2; do
ex=$($P -c "select count(*) from information_schema.tables where table_schema='public' and table_name='$t'")
if [ "$ex" = 1 ]; then echo "$t exists: 1 rows: $($P -c "select count(*) from $t")"; else echo "$t exists: 0"; fi
done
echo "public tables: $($P -c "select count(*) from information_schema.tables where table_schema='public' and table_type='BASE TABLE'")"
echo "prisma migrations: $($P -c 'select count(*) from _prisma_migrations' 2>&1)"
echo "db volume created: $(docker volume inspect -f '{{.CreatedAt}}' rallly_rallly_postgres_data 2>&1)"
S1=$(docker exec rallly-postgres pg_dump -U rallly -d rallly --schema-only | grep -Ev '^\\(un)?restrict ' | md5sum | cut -c1-32)
S2=$(docker exec rallly-postgres pg_dump -U rallly -d rallly --schema-only | grep -Ev '^\\(un)?restrict ' | md5sum | cut -c1-32)
echo "schema-only md5: $S1 (control, second dump: $S2)"
echo "data-only md5: $(docker exec rallly-postgres pg_dump -U rallly -d rallly --data-only | grep -Ev '^\\(un)?restrict ' | md5sum | cut -c1-32)"
RC=$(for t in $($P -c "select table_name from information_schema.tables where table_schema='public' and table_type='BASE TABLE' order by table_name"); do echo "$t=$($P -c "select count(*) from \"$t\"")"; done)
echo "per-table row counts md5: $(echo "$RC" | md5sum | cut -c1-32)"
echo "per-table row counts: $(echo "$RC" | tr '\n' ' ')"
echo "definition: $(grep -E '^\s*image:' /opt/docker/stacks/rallly/docker-compose.yml | tr -s ' ' | tr '\n' ' ')"
echo "restore-undo folder: $(ls -A /mnt/sys_drive/felhom-data/backups/restore-undo/rallly 2>&1 | tr '\n' ' ')"
@@ -0,0 +1,10 @@
put-back skipped RED (good) r893_putback_test.go:135: the live volume was poured back as "" — want the exact pre-restore copy
volume-replay branch without undo RED (good) r893_putback_test.go:170: the replay removes a volume before it recreates it; the copy must be poured back even at a count of 0, got ""
fit check without the copy RED (good) r893_putback_test.go:187: the refusal must come before the stop — StopStack ran 2 time(s)
probe error ignored RED (good) r893_putback_test.go:213: StopStack ran 2 time(s) on an unmeasured copy
no drop on exit RED (good) r893_putback_test.go:232: the copy must be removed after a restore that worked, left [/tmp/TestR893A_ASuccessfulRestoreRemovesTheCopy3779926857/001/backups/restore-undo/immich/20261020T065144Z/immich_pgdata.tar]
copy not kept on a failed put-back RED (good) r893_putback_test.go:259: the copy must stay on disk for support, found []
copy error ignored RED (good) r893_putback_test.go:276: nothing may move after a failed copy: replays 1, rollbacks 1, definition writes []
slice-1 hold after the rollback RED (good) r893_mixed_restore_test.go:170: option A: the app must be started again after the put-back — calls [stop recreate startsvc:app-db recreate stop]
DB-start branch only restarts RED (good) r893_mixed_restore_test.go:202: the live definition must be written back BEFORE the start — calls [stop recreate startsvc:app-db start]
restored; failures-to-go-red: 0
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
"""Red-proof the R-893 option A tests: apply one mutation, run its test, expect FAIL, restore the file."""
import subprocess, sys
ROOT = "/mnt/5_hdd/felhom.eu/git/felhom-controller/controller"
U = ROOT + "/internal/backup/offbox_restore_undo.go"
R = ROOT + "/internal/backup/offbox_reconstitute.go"
CASES = [
("put-back skipped", U, " if volumesMoved {\n if err := m.putBack(stack, c); err != nil {",
" if false {\n if err := m.putBack(stack, c); err != nil {", "TestR893A_AFailedReplayPutsTheLiveVolumesBackExactly"),
("volume-replay branch without undo", R, "if definitionMoved || nVols > 0 || undo != nil {", "if definitionMoved || nVols > 0 {",
"TestR893A_AFailedVolumeReplayStillPutsBackWhenItCountedNothing"),
("fit check without the copy", R, "if free < need+volNeed {", "if free < need {", "TestR893A_TheCopyMustFitBeforeAnythingStops"),
("probe error ignored", U, " if pErr != nil {\n return 0, nil, pErr\n }", " if pErr != nil {\n continue\n }",
"TestR893A_AnUnmeasurableVolumeRefusesBeforeAnythingStops"),
("no drop on exit", R, " defer undo.drop(m, stack)\n", "", "TestR893A_ASuccessfulRestoreRemovesTheCopy"),
("copy not kept on a failed put-back", U, " c.keep = true\n", "", "TestR893A_AFailedPutBackHoldsTheAppAndKeepsTheCopy"),
("copy error ignored", R, " if cErr != nil {\n m.logger.Printf(\"[ERROR] [offbox] %s: the copy of the live volumes failed",
" if cErr != nil && false {\n m.logger.Printf(\"[ERROR] [offbox] %s: the copy of the live volumes failed",
"TestR893A_AFailedCopyRestoresNothingAndStartsTheApp"),
("slice-1 hold after the rollback", R,
" return res, m.putBackAfterFailedRestore(stack, iErr, liveDef, undo, res.VolumesReplayed > 0, res.FilesPlaced, restartStack, \"err.backup.db_restore_failed_held_mixed\")",
" m.holdAppAfterMixedRestore(stack, iErr, liveDef)\n return res, util.MsgError(\"err.backup.db_restore_failed_held_mixed\", stack)",
"TestR893_AVersionChangeThenAFailedReplayStartsTheAppAtItsLiveDefinition"),
("DB-start branch only restarts", R,
" return res, m.putBackAfterFailedRestore(stack, err, liveDef, undo, res.VolumesReplayed > 0, res.FilesPlaced, restartStack, \"err.backup.restore_failed_held_mixed\")",
" _ = restartStack()\n return res, err",
"TestR893_AVersionChangeThenAFailedDBStartStartsTheAppAtItsLiveDefinition"),
]
bad = 0
for name, path, old, new, test in CASES:
src = open(path).read()
if src.count(old) != 1:
print("SETUP-ERROR", name, "match count", src.count(old)); bad += 1; continue
open(path, "w").write(src.replace(old, new))
try:
p = subprocess.run(["go", "test", "./internal/backup/", "-run", "^" + test + "$", "-count=1"], cwd=ROOT,
capture_output=True, text=True)
out = p.stdout + p.stderr
line = next((l.strip() for l in out.splitlines() if "_test.go:" in l), out.strip().splitlines()[-1] if out.strip() else "")
verdict = "RED (good)" if p.returncode != 0 else "STILL GREEN (BAD)"
if p.returncode == 0:
bad += 1
print("%-38s %-18s %s" % (name, verdict, line[:220]))
finally:
open(path, "w").write(src)
print("restored; failures-to-go-red:", bad)
sys.exit(1 if bad else 0)
@@ -0,0 +1,94 @@
# R-1019 — the PRODUCTION classifier (controller main 93fb251) over the templates; hddPath=/mnt/drive
# BEFORE (catalog HEAD 5e37aa6):
=== RUN TestZZ_R1019_Probe
== qbittorrent hasClassification=true
bind root=userdata rel="media/torrents" ro=false class="optional" origin=explicit
secondary copies 1 path(s) [/mnt/drive/userdata/media/torrents]
offsite copies 0 path(s) []
== transmission hasClassification=true
bind root=userdata rel="media/transmission" ro=false class="optional" origin=explicit
bind root=userdata rel="media/transmission/watch" ro=false class="optional" origin=explicit
secondary copies 1 path(s) [/mnt/drive/userdata/media/transmission]
offsite copies 0 path(s) []
== nzbget hasClassification=true
bind root=userdata rel="media/nzbget" ro=false class="optional" origin=explicit
secondary copies 1 path(s) [/mnt/drive/userdata/media/nzbget]
offsite copies 0 path(s) []
== sabnzbd hasClassification=true
bind root=userdata rel="media/usenet" ro=false class="optional" origin=explicit
secondary copies 1 path(s) [/mnt/drive/userdata/media/usenet]
offsite copies 0 path(s) []
== metube hasClassification=true
bind root=userdata rel="media/metube" ro=false class="optional" origin=explicit
secondary copies 1 path(s) [/mnt/drive/userdata/media/metube]
offsite copies 0 path(s) []
== sonarr hasClassification=true
bind root=userdata rel="media" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== radarr hasClassification=true
bind root=userdata rel="media" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== prowlarr hasClassification=true
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== jellyfin hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== plex hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== emby hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
# AFTER (the working tree with the five download folders excluded):
=== RUN TestZZ_R1019_Probe
== qbittorrent hasClassification=true
bind root=userdata rel="media/torrents" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== transmission hasClassification=true
bind root=userdata rel="media/transmission" ro=false class="excluded" origin=explicit
bind root=userdata rel="media/transmission/watch" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== nzbget hasClassification=true
bind root=userdata rel="media/nzbget" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== sabnzbd hasClassification=true
bind root=userdata rel="media/usenet" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== metube hasClassification=true
bind root=userdata rel="media/metube" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== sonarr hasClassification=true
bind root=userdata rel="media" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== radarr hasClassification=true
bind root=userdata rel="media" ro=false class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== prowlarr hasClassification=true
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== jellyfin hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== plex hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
== emby hasClassification=true
bind root=userdata rel="media" ro=true class="excluded" origin=explicit
secondary copies 0 path(s) []
offsite copies 0 path(s) []
@@ -0,0 +1,45 @@
# R-49 — Immich's off-site copy: what it holds, and two ways to shrink it (2026-10-20)
Status: **measure and plan only — nothing changed.** Night brief part 2 (run by day), Part 4. Architecture: `07-backup-architecture.md`
(the off-site tier = the recovery unit + the app's mandatory data). Measured read-only on scratch guest 9202 (demo-hp), Immich
v3.2.4 + `ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0`, data on the drive `/mnt/sizing-bench`, 09:0x UTC.
## What today's off-site copy holds
The off-site tier copies the recovery unit (`backups/primary/immich/`, 1 160 553 825 B) and the mandatory drive folder
`appdata/immich/` (166 077 159 B) — about **1.33 GB** in all. The external library `media/photos` is `optional` (not off-site;
0 B here anyway).
| Part | Where | Bytes | Share | Can it come back without the copy? |
|---|---|---:|---:|---|
| ML model cache | unit `volume-dumps/immich_immich_ml_cache.tar` (volume 823 835 298 B) | 823 764 480 | 62 % | **Yes** — Immich downloads the models again when a smart-search or face job first needs them |
| Raw database folder | unit `volume-dumps/immich_immich_postgres_data.tar` (volume 282 169 461 B) | 283 049 472 | 21 % | **Yes, if** a restore from the logical dump alone is proven (below) |
| Immich's own database backups | `appdata/immich/backups/` | 115 367 547 | 9 % | Yes — a second copy of what the logical dump already holds; it grows every night |
| Logical database dump | unit `db-dumps/immich-postgres.sql` | 53 711 763 | 4 % | **No** — this IS the household's albums, people, metadata |
| Originals | `appdata/immich/upload/` | 48 673 663 | 4 % | **No** — the photos themselves |
| Thumbnails | `appdata/immich/thumbs/` | 2 035 910 | <1 % | Yes — Immich regenerates them |
| Redis | volume `immich_immich_redis_data` (31 594 479 B) | — | — | not in the unit (a queue cache) |
**What must survive: 102 MB of 1.33 GB (8 %).** The 2026-07-19 measurement (R-49) said the same shape: ~60 % model cache.
## Two options
| | A — leave out all three re-fetchable parts | B — leave out only the model cache |
|---|---|---|
| Off-site size here | ~105 MB (dump + originals + thumbnails + unit metadata) — **−92 %** | ~510 MB — **−62 %** |
| What a restore then needs | the models download again (~824 MB, from Immich's model host) before smart search and face recognition work again — the photos, albums and timeline work at once; the database is rebuilt from the logical dump alone into an EMPTY volume (no raw folder to lay under it) | the models download again, as in A; the database comes back as today (volume, then dump) |
| The proof it needs | (1) one off-site restore of Immich onto a box with an empty model cache: photos and albums read back, then a smart search answers after the download (time measured); (2) **one off-site restore from the dump alone** into an empty database volume, on this vectorchord image: the extensions and vector indexes come back, the row counts match, Immich starts and searches — today's restore always lays the raw folder first, so this has never been run | only proof (1) |
| Risk | the dump-only database restore is the unmeasured part; if the vector extension needs more than the dump gives, a restore would fail where it works today (option A's put-back keeps the app as it was, but the backup would be weaker) | none new: the cache is a cache |
| Also | Immich's own `backups/` folder needs a catalog class (`excluded`) — a template change in the `hdd` block | a catalog change: the model-cache volume marked as not captured |
Not measured today: the model download's time and size on a real line (the 824 MB is the cache as it stands, which holds every
model this box used); the off-site bytes after restic's compression and de-duplication (the table is the plain size).
## Pick: B now, then A's other two parts after proof (2)
B removes 62 % of the copy with no new risk — the strongest case R-49 named first — and needs only proof (1). The raw database
folder and Immich's own backups are another 30 %, but leaving out the raw folder changes HOW the database comes back, and that
path has never run for this extension image; it should be a separate step with its own proof, not ride along.
**If the operator does nothing:** every Immich household keeps sending ~12× its real data off-site each night, against its
quota and transfer.
@@ -0,0 +1,36 @@
# Part 5 — R-462: the update test for the installed apps (read 2026-10-20T08:45:32Z, catalog c50adfc)
## installed apps on the test boxes (hub, latest controller report per customer)
bentopdf 2, opengist 2, privatebin 2, bookstack 2, paperless-ngx 2; 1 each: prowlarr radarr qbittorrent sonarr home-assistant romm docmost plex calibre-web adventurelog kimai
## fixture coverage (upgrade_boxport.available() + upgrade_fixtures.FIXTURES)
box-ported fixtures: 58 ; bench-only fixtures: 0
installed apps with a fixture: ['opengist', 'privatebin', 'bookstack', 'paperless-ngx', 'prowlarr', 'radarr', 'qbittorrent', 'sonarr', 'home-assistant', 'romm', 'docmost', 'plex', 'calibre-web', 'adventurelog', 'kimai']
installed apps without one: ['bentopdf'] (bentopdf keeps no data: nothing to seed)
## upstream currency (scripts/check-currency.py, registries read)
opengist opengist 1.15 same-shape: major 1.15, all 1.15 — SHAPE-SWITCH? 1.15.2
privatebin privatebin 2.0.6 same-shape: major 2.1.0, all 2.1.0 — behind
bookstack bookstack 26.09.1 same-shape: major 26.09.1, all 26.09.1 — current
bookstack bookstack-db 12.3 same-shape: major 12.3, all 13.0 — behind
paperless-ngx paperless-webserver 2.20.15 same-shape: major 2.20.15, all 3.3.3 — behind
paperless-ngx paperless-postgres 18-alpine same-shape: major 18-alpine, all 18-alpine — SHAPE-SWITCH? 18.6
paperless-ngx paperless-redis 7-alpine same-shape: major 7-alpine, all 8-alpine — behind
prowlarr prowlarr version-2.6.5.5623 same-shape: major version-2.6.5.5623, all version-2.6.5.5623 — current
radarr radarr 6.4.4 same-shape: major 6.4.4, all 6.4.4 — current
qbittorrent qbittorrent 5.2.4-1 same-shape: major 5.2.4-1, all 5.2.4-1 — current
sonarr sonarr 4.0.20 same-shape: major 4.0.20, all 4.0.20 — SHAPE-SWITCH? 5.14
home-assistant home-assistant 2026.9.4 same-shape: major 2026.10.2, all 2026.10.2 — behind
romm romm 5.3.1 same-shape: major 5.4.0, all 5.4.0 — behind
romm romm-db 11.8 same-shape: major 11.8, all 13.0 — behind
romm romm-redis 7-alpine same-shape: major 7-alpine, all 8-alpine — behind
docmost docmost 0.96.0 same-shape: major 0.96.0, all 0.96.0 — current
docmost docmost-postgres 18-alpine same-shape: major 18-alpine, all 18-alpine — SHAPE-SWITCH? 18.6
docmost docmost-redis 7-alpine same-shape: major 7-alpine, all 8-alpine — behind
plex plex 1.41.4.9463-630c9f557 same-shape: major 1.43.4.10903-e5521bd8c, all 1.43.4.10903-e5521bd8c — behind
calibre-web calibre-web v4.0.8 same-shape: major v4.0.8, all v4.0.8 — current
adventurelog adventurelog v0.13.0 same-shape: major v0.13.0, all v0.13.0 — current
adventurelog adventurelog-postgres 16-3.5-alpine same-shape: major 16-3.6-alpine, all 18-3.6-alpine — behind
adventurelog adventurelog-frontend v0.13.0 same-shape: major v0.13.0, all v0.13.0 — current
kimai kimai 2.67.0 same-shape: major 2.70.0, all 2.70.0 — behind
kimai kimai-db 11.8 same-shape: major 11.8, all 13.0 — behind
@@ -0,0 +1,4 @@
# per-box floors 0.336.0 / MinAgent 0.158.1 set 08:51:06Z; image sha256:93cd67d871125877e935a024765075b5a0b7c0e7683e1165976ff7a654fe8d73 (clean clone 93fb251; rc.1 on 9202 first)
demo-felhom|0.336.0|2026-10-20 08:54:55
demo-hp|0.336.0|2026-10-20 08:54:56
tester-1|0.336.0|2026-10-20 08:54:54
@@ -0,0 +1,27 @@
=== demo-hp (enkisfelhom.hu) 08:53:38
containers: 24 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:19 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 sync.go:142: [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 12
public https://felhom.enkisfelhom.hu/: 302
public https://files.enkisfelhom.hu/: 200
=== demo-felhom (demo-felhom.eu) 08:53:41
containers: 9 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:08 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:11 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 5
public https://felhom.demo-felhom.eu/: 302
public https://files.demo-felhom.eu/: 200
=== tester-1 (enkicsifelhom.hu) 08:53:42
containers: 10 running; not healthy/running: traefik Up 4 days;
unhealthy: 0
2026/10/20 08:51:18 [INFO] [selfupdate] Post-update startup: update successful (0.335.0 → 0.336.0)
allow-list refusals since start: 0
2026/10/20 08:51:19 [INFO] [sync] Initial sync: Sablonok naprakészek — nincs változás
installed apps (stacks with app.yaml): 3
public https://felhom.enkicsifelhom.hu/: 302
public https://files.enkicsifelhom.hu/: 200
@@ -0,0 +1,33 @@
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
== tester-1 (enkicsifelhom.hu): 6 public name(s)
OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1
OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1
OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1
OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1
OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1
== demo-hp (enkisfelhom.hu): 14 public name(s)
OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1
OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1
OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1
OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1
OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1
OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1
OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1
OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1
OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1
OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1
OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1
OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1
OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1
OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1
== demo-felhom (demo-felhom.eu): 8 public name(s)
OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1
OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1
OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1
OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1
OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1
OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1
OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1
OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1
== every public name redirects http -> https
@@ -0,0 +1,16 @@
== demo-hp
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkisfelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkisfelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkisfelhom.hu/__files/open?to=%2Ffiles%2F
== tester-1
dashboard sign-in: 302
the Fajlok button goes to: https://files.enkicsifelhom.hu/_felhom/sso
the pass answer goes to: https://files.enkicsifelhom.hu/files/; files cookie set: 1
FileBrowser with the files cookie: felhom-household admin: False modify: True
FileBrowser without it, a fresh browser: HTTP 401
dashboard sign-out: 302
after the sign-out, the files cookie sends the browser to: https://felhom.enkicsifelhom.hu/__files/open?to=%2Ffiles%2F
@@ -0,0 +1,22 @@
2026-10-20T08:54:35Z
global floor:
HTTP/1.1 303 See Other
Location: /configuration?flash=floor_set
read back (hub DB with WAL):
min_controller_version|0.336.0
min_controller_version_declared_min_agent|0.336.0=0.158.1
clear the per-box floors:
== tester-1
HTTP/1.1 303 See Other
Location: /customers/tester-1?flash=floor_set
== demo-hp
HTTP/1.1 303 See Other
Location: /customers/demo-hp?flash=floor_set
== demo-felhom
HTTP/1.1 303 See Other
Location: /customers/demo-felhom?flash=floor_set
Error: in prepare, no such table: customers
per-box floors after the clear (customer_configs):
demo-felhom|''|''
demo-hp|''|''
tester-1|''|''
@@ -0,0 +1,17 @@
# Versions measured at the start of the rehearsal (2026-10-20 11:40 CEST = 09:40 UTC)
# Method: git origin/main per repo; hub pod image (kubectl); hub /configuration page (token read); hub /hosts and /configs pages;
# installer read live from https://felhom.eu/scripts/felhom-host-install.sh; ISO link + checksum read from https://felhom.eu/letoltes
felhom-controller main 7ca59e2d (v0.336.0 released 10:56 CEST; brief said ae2bfb2f / v0.335.0 — CHANGED before the run started)
felhom-agent main 4e1621c6 (v0.161.0 released + delivered to the 3 test boxes; brief said 51521230)
felhom.eu main 5c487313 (brief said b0ae2c57)
app-catalog main c50adfc6 (brief said 5e37aa6e)
templates in catalog: 65 (ls templates/)
hub pod image: gitea.dooplex.hu/admin/felhom-hub:0.162.0
hub global floor (controller): v0.336.0 (DB override); min_agent 0.158.1
hub Day-0 manifest: agent 0.161.0 (sha ff4e6dc5…), golden 0.331.0 (sha 3881de62…)
installer served at felhom.eu/scripts: SCRIPT_VERSION=1.35.0
ISO on the download page: felhom-installer-1.29.0-pve9.2-1.iso, published sha256 dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829
fleet (hub /hosts, /configs): demo-felhom, demo-hp, tester-1 = agent 0.161.0, controller 0.336.0; Tester-2 = agent 0.142.0, controller 0.292.0 (DOWN, laptop off)
Tester4: customer exists (domain tester4.test); NO host record (old Tester4-31fa0e is gone — precondition met);
off-site: NOT enabled — absent from the hub's 'customers actually using an offsite tier' list (offsite_box.go:166-168),
positive control: the other four customers are listed; no WireGuard peer for Tester4 on ep0's peer table.
@@ -0,0 +1,19 @@
Tue Oct 20 09:41:52 UTC 2026
total used free shared buff/cache available
Mem: 29994 14381 528 200 15724 15612
Swap: 8191 792 7399
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 28477900 9888360 70.40%
local-lvm lvmthin active 56487936 33192311 23295624 58.76%
nvme-scratch dir active 983379700 203081848 730271240 20.65%
Filesystem 1B-blocks Used Available Use% Mounted on
/dev/nvme0n1 1006980812800 207955812352 747797749760 22% /mnt/hdd_1
/dev/mapper/pve-root 41424257024 29161369600 10125680640 75% /
11:41:53 up 4 days, 6:49, 1 user, load average: 1.63, 1.42, 1.27
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
341 night1004-tester1 running 8192 200.00 1851
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
9401 stopped upgrade-harness
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,51 @@
# B6 — failure scenario order, drawn ONCE from seed 20261020 before round 1 (A6)
Method: `random.Random(20261020)`; shuffle the ★ list [1..10], then shuffle the rest [11..16]; this file is written before B1 bound the box (2026-10-20 ~10:00 UTC).
| run | scenario | what |
|---|---|---|
| 1 | ★2 | Power cut mid off-site restore (B8 run) |
| 2 | ★3 | Data disk 100 % during nightly backup (via own upload); system disk 97 % |
| 3 | ★5 | Slow lossy internet (1 Mbit/s up, 5 % loss) during first big off-site run |
| 4 | ★9 | Two actions at once: Restore+Remove in two tabs; double click Visszaallitas |
| 5 | ★7 | DST: clock 2026-10-25 01:30 CEST -> 04:00 CET, NTP off |
| 6 | ★1 | Power cut mid app install (image pull) |
| 7 | ★10 | Box off for 3 days (VM stopped, clock moved forward on start) |
| 8 | ★4 | Data drive pulled during upload, put back (same slot; other slot/order) |
| 9 | ★6 | Off-site path blocked for one night (ep0 + Storage Box dropped at the VM's outer side) |
| 10 | ★8 | Clock wrong at boot: -2 years, then +2 years, NTP blocked |
| 11 | 14 | App removed keeping data, installed again (use kept data) |
| 12 | 16 | English browser: one full pass of the dashboard |
| 13 | 11 | Hard reset mid app update |
| 14 | 12 | DNS answers nothing for an hour |
| 15 | 15 | Box restarted during the catch-up of scenario 10 |
| 16 | 13 | Second drive added later: offered as backup target; accept; remove safely |
## Dependencies fixed NOW (before any result), so the order is never re-chosen after one
- **2** needs a running off-site restore — it runs INSIDE B8's A.1.5 run whatever its slot; its slot is then used for the next scenario.
- **15** runs inside **10**'s catch-up (it is the restart during that catch-up) — it rides with 10.
- **5** needs the FIRST big off-site run — it runs on night one (B5) if off-site is on by then; otherwise at its slot with a fresh large upload, and it is marked „not the first run".
- **6** spans one night — it takes the second night if the run lasts; otherwise a shortened window (≥ 1 off-site schedule), marked.
- **7** (DST) and **8** (wrong clock) change the VM's clock; they run after the off-site and restore work they could disturb, but in this drawn order relative to each other.
- Anything that needs off-site (2, 5, 6) is SKIPPED, not reordered, if Tester4's off-site is still off when its slot comes.
## Amendment written 2026-10-20 ~15:45 UTC — BEFORE scenario 5 runs (no result seen)
- **5** (slow, lossy internet during the first big off-site run): the first big run is started by the household's
„Távoli mentés most" this evening, with `tc netem` 1 Mbit/s up + 5 % loss on the VM's tap for its FIRST 30 MINUTES;
then the shaping is removed and the run must finish (or resume) by itself. Reason: at 1 Mbit/s the ~3.7 GB first copy
needs ~8 h, and B7 (box died) needs a complete off-site copy by the morning. What is measured: progress, what the
page and the hub say while slow, and whether the run finishes or resumes after.
- The box froze twice under ordinary uploads (R-1192). Every heavy scenario now runs ALONE, with the health watch
beside it; a freeze during a scenario is recorded as such, not as the scenario's own result.
## Amendment 2026-10-20 ~17:50 UTC — before any of these ran
Run tonight, before the night chain (B5 must stay „no hands"): #16 English pass, #9 two-at-once, #13 second drive later,
#4 drive pulled, #3 disk full (the „nightly backup" stood in by „Mentés most" — the one real night is reserved for B5;
the filler goes to a share with Felhőmentés OFF and is deleted before the night), #12 DNS dead, #6 off-site blocked
(shortened to one manual run + the catch-up, not a night — same reason). After the night: #7 DST, #8 wrong clock,
#10 three days off (+#15 inside it), #1 power cut mid install, #14 kept data, #11 if an update exists (none expected —
the catalog is frozen). Reason: the clock scenarios move the box's time and would spoil the first night's record.
@@ -0,0 +1,5 @@
dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829 felhom-installer-1.29.0-pve9.2-1.iso
dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829 rehearsal1020-felhom-installer-1.29.0-pve9.2-1.iso
1705324544
secs=62
@@ -0,0 +1,19 @@
Formatting '/mnt/hdd_1/images/9320/vm-9320-disk-0.raw', fmt=raw size=274877906944 preallocation=off
scsi0: successfully created disk 'nvme-scratch:9320/vm-9320-disk-0.raw,size=256G'
Formatting '/mnt/hdd_1/images/9320/vm-9320-disk-1.raw', fmt=raw size=214748364800 preallocation=off
scsi1: successfully created disk 'nvme-scratch:9320/vm-9320-disk-1.raw,size=200G'
boot: order=scsi0;ide2
cores: 4
cpu: host
ide2: local:iso/rehearsal1020-felhom-installer-1.29.0-pve9.2-1.iso,media=cdrom,size=1665356K
memory: 8192
meta: creation-qemu=11.0.3,ctime=1792489316
name: rehearsal1020-box1
net0: virtio=BC:24:11:3F:4F:3F,bridge=vmbr0
ostype: l26
scsi0: nvme-scratch:9320/vm-9320-disk-0.raw,size=256G
scsi1: nvme-scratch:9320/vm-9320-disk-1.raw,size=200G
scsihw: virtio-scsi-single
smbios1: uuid=323698f4-6179-4f14-83c0-8109044c5cda
vga: std
vmgenid: 976cd28b-5675-42f2-bd65-fb0ec8ae6be7
@@ -0,0 +1,23 @@
# B1 — download and install (2026-10-20, 09:40–09:51 UTC)
Method: the guide's URL `felhom.eu/letoltes` (no public page links to it — by design, the guide carries it); the ISO
downloaded onto demo-hp; VM 9320 (4 vCPU, 8 GiB, 256 GB system disk + 200 GB data disk, raw on `nvme-scratch` =
`/mnt/hdd_1` root); the graphical installer driven with `qm sendkey` (`tools/vmctl.sh`), the **Hungarian keyboard
kept**; screenshots by QEMU screendump (`screens/install/`).
| step | result | vs the guide (`runbooks/VOLUNTEER-first-hour.md`) |
|---|---|---|
| download | 1 705 324 544 B in 62 s; sha256 `dceacae5…4829` = the page = the `.sha256` file (`01-iso-download.txt`) | as written. **But the download link is not visible as a link** (white bold file name; no button, no colour, no underline — phone and computer, `screens/b1-site/`) |
| boot menu | auto-boots „Felhom telepítés / Install Felhom" | as written; the boot text „válassza ki a lemezt" is FORMAL (Ön) — the guide and dashboard say „te" |
| EULA → disk | `/dev/sda (256 GiB)` pre-selected = the right disk | as written. Proxmox's own text „Final configuration will be done on the graphical user interface, via a web browser" is not true for a household |
| location | Hungary / Europe/Budapest / Hungarian, pre-filled | as written. **Enter in the Country field does not advance** — a keyboard user must use Next |
| password + e-mail | ≥ 8 chars; the e-mail field pre-filled `mail@example.invalid` | as written |
| network | DHCP address frozen as a STATIC one (192.168.0.134/24) | as written („hagyd, ahogy van"); the static address is the R-1166 shape (a later DHCP lease can clash) |
| hostname | `felhom.tester4.test` | as written |
| summary | auto-reboot ticked; Install pressed 09:46:50 | as written |
| first boot | installer reboots by itself; the console: „Felhom otthoni szerver / Ezen a gépen most nincs dolgod, és bejelentkezni sem kell. A beállításhoz kövesd a Felhomtól kapott útmutatót." | **wording differs from the guide** (guide: „Ezen a képernyőn nincs teendőd…") — harmless |
| pairing code | shown ≤ 09:51 (≤ 4 min after Install), HU + EN, code blacked out in the screenshot | as written |
Harness substitutions (not interventions): H3 the VM boots its disk first (= the stick pulled in time); H5 a nested
VM with virtual disks; the public domain `tester4.test` never resolves (Tester4 is a test customer with no tunnel) —
the dashboard is reached on its LAN address with the `Host:` header, which a household cannot do.
@@ -0,0 +1,9 @@
immich running deployed= True sub= photos gate= True
nextcloud running deployed= True sub= cloud gate= False
paperless-ngx running deployed= True sub= paperless gate= False
vaultwarden running deployed= True sub= vault gate= False
mealie running deployed= True sub= recipes gate= False
actualbudget running deployed= True sub= budget gate= True
radicale running deployed= True sub= calendar gate= False
bookstack running deployed= True sub= wiki gate= False
jellyfin not_deployed deployed= False sub= None gate= False
@@ -0,0 +1,40 @@
14:13:55 diskread=3GB health=200 0.026323
14:14:27 diskread=3GB health=200 0.010294
14:14:59 diskread=4GB health=200 0.011968
14:15:30 diskread=4GB health=200 0.009450
14:16:02 diskread=4GB health=200 0.010128
14:16:33 diskread=4GB health=200 0.009558
14:17:05 diskread=4GB health=200 0.010571
14:17:36 diskread=4GB health=200 0.009807
14:18:08 diskread=4GB health=200 0.010191
14:18:40 diskread=4GB health=200 0.009850
14:19:11 diskread=4GB health=200 0.010203
14:19:43 diskread=4GB health=200 0.011617
14:20:14 diskread=4GB health=200 0.014898
14:20:46 diskread=4GB health=200 0.010567
14:21:17 diskread=4GB health=200 0.011040
14:21:49 diskread=4GB health=200 0.009551
14:22:21 diskread=4GB health=200 0.009957
14:22:52 diskread=4GB health=200 0.010580
14:23:24 diskread=4GB health=200 0.010163
14:23:56 diskread=4GB health=200 0.010898
14:24:27 diskread=4GB health=200 0.010501
14:24:58 diskread=4GB health=200 0.011854
14:25:30 diskread=4GB health=200 0.011567
14:26:01 diskread=4GB health=200 0.010254
14:26:32 diskread=4GB health=200 0.010620
14:27:03 diskread=4GB health=200 0.011295
14:27:35 diskread=4GB health=200 0.010245
14:28:06 diskread=4GB health=200 0.010855
14:28:37 diskread=4GB health=200 0.010371
14:29:09 diskread=4GB health=200 0.015567
14:29:40 diskread=4GB health=200 0.010465
14:30:11 diskread=4GB health=200 0.010190
14:30:42 diskread=4GB health=200 0.011160
14:31:14 diskread=4GB health=200 0.009954
14:31:45 diskread=4GB health=200 0.011131
14:32:16 diskread=4GB health=200 0.011337
14:32:48 diskread=4GB health=200 0.010336
14:33:19 diskread=4GB health=200 0.011064
14:33:50 diskread=4GB health=200 0.010944
14:34:22 diskread=4GB health=200 0.010249
@@ -0,0 +1,2 @@
run 200 {'ok': True, 'message': 'Mentés elindítva'}
120 s {"db_dump": {"count": 4, "duration": "1m58.175464265s", "last_run": "2026-10-20T16:30:58.136294428Z", "success": true}, "enabled": true, "running": false}
@@ -0,0 +1,16 @@
UTC cpu% load1 mem_GB (the box's own /api/metrics/system history)
12:00 1.4 1.6 0.9384765625
12:07 6.1 0.9 0.93359375
12:14 3.0 0.6 0.970703125
12:21 14.0 1.6 1.5107421875
12:28 1.0 0.3 1.6123046875
12:36 1.5 0.3 1.607421875
12:43 11.8 1.4 1.6298828125
12:50 15.2 1.5 2.056640625
12:57 61.3 8.3 2.318359375
13:33 78.1 139.3 2.2900390625
13:55 78.1 151.6 2.3486328125
14:09 0.0 2.0 1.1875
keys: ['cpu', 'labels', 'load1', 'memory', 'temp']
{"ok": true, "data": {"sync_status": {"last_sync": "2026-10-20T14:13:31.264994519Z", "last_status": "ok", "syncing": false}, "system": {"total_mem_mb": 4096, "used_mem_mb": 3638, "avail_mem_mb": 458, "mem_percent": 88.818359375, "disk_total_gb": 49.03971862792969, "disk_used_gb": 12.562141418457031, "disk_avail_gb": 33.96195983886719, "disk_percent": 27.001362904306276, "disk_known": true, "hdd_total_gb": 195.8027114868164, "hdd_used_gb": 0.10123825073242188, "hdd_avail_gb": 185.68584823608398, "hdd_percent": 0.054491543328877075, "hdd_configured": true, "hdd_known": true, "cpu_percent": 55.314861460957175, "load_avg_1": 3.31, "load_avg_5": 1.24, "load_avg_15": 0.44, "temperature_celsius": 0}}}
{"ok": true, "data": [{"name": "felhom-controller", "cpu_percent": 42.69, "mem_usage_mb": 92.52, "mem_limit_mb": 4096}, {"name": "actualbudget", "cpu_percent": 31.28, "mem_usage_mb": 128.6, "mem_limit_mb": 256}, {"name": "radicale", "cpu_percent": 28.31, "mem_usage_mb": 28.39, "mem_limit_mb": 128}, {"name": "bookstack-db", "cpu_percent": 27.86, "mem_usage_mb": 153.2, "mem_limit_mb": 256}, {"name": "immich-machine-learning", "cpu_percent": 27.57, "mem_usage_mb": 107.2, "mem_limit_mb": 2048}, {"name": "paperless-webserver", "cpu_percent": 27.41, "mem_usage_mb": 72.22, "mem_limit_mb": 1280}, {"name": "mealie", "cpu_percent": 26.57, "mem_usage_mb": 67.21, "mem_limit_mb": 1000}, {"name": "nextcloud-db", "cpu_percent": 26.17, "mem_usage_mb": 116.3, "mem_limit_mb": 512}, {"name": "immich-server", "cpu_percent": 22.66, "mem_usage_mb": 206, "mem_limit_mb": 3072}, {"name": "nextcloud", "cpu_percent": 19.4, "mem_usage_mb": 157.1, "mem_limit_mb": 1024}, {"name": "traefik", "cpu_percent": 10.78, "mem_usage_mb": 186.4, "mem_limit_mb": 4096}, {"name": "bookstack", "cpu_percent": 0.61, "mem_usage_mb": 19.94, "mem_limit_mb": 512}, {"name": "paperless-redis", "cpu_percent": 0.47, "mem_usage_mb": 26.13, "mem_limit_mb": 128}, {"name": "immich-redis", "cpu_percent": 0.43, "mem_usage_mb": 3.16, "mem_limit_mb": 128}, {"name": "nextcloud-redis", "cpu_percent": 0.42, "mem_usage_mb": 10.36, "mem_limit_mb": 128}, {"name": "paperless-postgres", "cpu_percent": 0.03, "mem_usage_mb": 58.27, "mem_limit_mb": 256}, {"name": "immich-postgres", "cpu_percent": 0.03, "mem_usage_mb": 133.1, "mem_limit_mb": 768}, {"name": "vaultwarden", "cpu_percent": 0, "mem_usage_mb": 72.27, "mem_limit_mb": 256}, {"name": "filebrowser", "cpu_percent": 0, "mem_usage_mb": 145, "mem_limit_mb": 256}]}
@@ -0,0 +1,60 @@
15:26:05 health=200 0.011492
15:26:35 health=200 0.013093
15:27:05 health=200 0.325949
15:27:55 health=000 20.002381
15:28:45 health=000 20.002064
15:29:35 health=000 20.002874
15:30:26 health=000 20.002573
15:31:16 health=000 20.002897
15:32:06 health=000 20.002446
15:32:56 health=000 20.002815
15:33:46 health=000 20.002487
15:34:36 health=000 20.002728
15:35:26 health=000 20.002934
15:36:16 health=000 20.003039
15:37:06 health=000 20.002029
15:37:56 health=000 20.002896
15:38:46 health=000 20.002072
15:39:36 health=000 20.002908
15:40:26 health=000 20.002099
15:41:16 health=000 20.001909
15:42:06 health=000 20.002225
15:42:56 health=000 20.002048
15:43:46 health=000 20.003050
15:44:36 health=000 20.001694
15:45:26 health=000 20.002376
15:46:16 health=000 20.002820
15:47:06 health=000 20.002634
15:47:56 health=000 20.002259
15:48:46 health=000 20.002093
15:49:36 health=000 20.002486
15:50:26 health=000 20.001753
15:51:16 health=000 20.001476
15:52:06 health=000 20.002140
15:52:56 health=000 20.002111
15:53:46 health=000 20.002107
15:54:36 health=000 20.002294
15:55:26 health=000 20.002923
15:56:16 health=000 20.002691
15:57:06 health=000 20.002300
15:57:56 health=000 20.002884
15:58:46 health=000 20.002233
15:59:36 health=000 20.001755
16:00:26 health=000 20.002217
16:01:16 health=000 20.002917
16:02:06 health=000 20.001900
16:02:41 health=200 4.333646
16:03:31 health=000 20.002229
16:04:21 health=000 20.002154
16:05:11 health=000 20.002066
16:06:01 health=000 20.002208
16:06:51 health=000 20.002962
16:07:41 health=000 20.001192
16:08:31 health=000 20.002116
16:09:21 health=000 20.002092
16:10:11 health=000 20.002032
16:11:01 health=000 20.002964
16:11:51 health=000 20.002792
16:12:41 health=000 20.001994
16:13:31 health=000 20.002290
16:14:21 health=000 20.002875
@@ -0,0 +1,118 @@
2026-10-20T16:03:26 health=000 20.001467 diskread=250GB
2026-10-20T16:04:47 health=000 20.002188 diskread=257GB
2026-10-20T16:06:08 health=000 20.002982 diskread=263GB
2026-10-20T16:07:30 health=000 20.001529 diskread=271GB
2026-10-20T16:08:51 health=000 20.001679 diskread=278GB
2026-10-20T16:10:12 health=000 20.002149 diskread=285GB
2026-10-20T16:11:33 health=000 20.002090 diskread=294GB
2026-10-20T16:12:55 health=000 20.002713 diskread=301GB
2026-10-20T16:14:16 health=000 20.002244 diskread=0GB
2026-10-20T16:15:21 health=000 3.052227 diskread=0GB
2026-10-20T16:16:23 health=200 0.028660 diskread=3GB
2026-10-20T16:17:24 health=200 0.011805 diskread=4GB
2026-10-20T16:18:26 health=200 0.011279 diskread=4GB
2026-10-20T16:19:28 health=200 0.011336 diskread=4GB
2026-10-20T16:20:29 health=200 0.010931 diskread=4GB
2026-10-20T16:21:31 health=200 0.010568 diskread=4GB
2026-10-20T16:22:32 health=200 0.012190 diskread=4GB
2026-10-20T16:23:34 health=200 0.009670 diskread=4GB
2026-10-20T16:24:36 health=200 0.011174 diskread=4GB
2026-10-20T16:25:37 health=200 0.010032 diskread=4GB
2026-10-20T16:26:39 health=200 0.010610 diskread=4GB
2026-10-20T16:27:40 health=200 0.010425 diskread=4GB
2026-10-20T16:28:42 health=200 0.012126 diskread=4GB
2026-10-20T16:29:44 health=200 0.010823 diskread=7GB
2026-10-20T16:30:45 health=200 0.009510 diskread=9GB
2026-10-20T16:31:47 health=200 0.259351 diskread=10GB
2026-10-20T16:32:49 health=200 0.137947 diskread=13GB
2026-10-20T16:33:51 health=200 0.048527 diskread=14GB
2026-10-20T16:34:53 health=200 0.236325 diskread=15GB
2026-10-20T16:35:55 health=200 0.729571 diskread=15GB
2026-10-20T16:36:57 health=200 0.306518 diskread=15GB
2026-10-20T16:37:59 health=200 0.328963 diskread=15GB
2026-10-20T16:39:01 health=200 0.135941 diskread=15GB
2026-10-20T16:40:03 health=200 0.342418 diskread=15GB
2026-10-20T16:41:04 health=200 0.057255 diskread=15GB
2026-10-20T16:42:06 health=200 0.055219 diskread=15GB
2026-10-20T16:43:08 health=200 0.047625 diskread=15GB
2026-10-20T16:44:09 health=200 0.048725 diskread=15GB
2026-10-20T16:45:11 health=200 0.047987 diskread=15GB
2026-10-20T16:46:13 health=200 0.046522 diskread=15GB
2026-10-20T16:47:14 health=200 0.045488 diskread=15GB
2026-10-20T16:48:16 health=200 0.060400 diskread=15GB
2026-10-20T16:49:18 health=200 0.053359 diskread=16GB
2026-10-20T16:50:19 health=200 0.045452 diskread=16GB
2026-10-20T16:51:21 health=200 0.054048 diskread=16GB
2026-10-20T16:52:23 health=200 0.046350 diskread=16GB
2026-10-20T16:53:25 health=200 0.059690 diskread=16GB
2026-10-20T16:54:27 health=200 0.289137 diskread=16GB
2026-10-20T16:55:29 health=200 0.274621 diskread=16GB
2026-10-20T16:56:31 health=200 0.150415 diskread=16GB
2026-10-20T16:57:33 health=200 0.407832 diskread=16GB
2026-10-20T16:58:34 health=200 0.109780 diskread=16GB
2026-10-20T16:59:36 health=200 0.166653 diskread=16GB
2026-10-20T17:00:38 health=200 0.157504 diskread=16GB
2026-10-20T17:01:39 health=200 0.010882 diskread=17GB
2026-10-20T17:02:41 health=200 0.010171 diskread=19GB
2026-10-20T17:03:42 health=200 0.010227 diskread=19GB
2026-10-20T17:04:44 health=200 0.010828 diskread=21GB
2026-10-20T17:05:46 health=200 0.010940 diskread=23GB
2026-10-20T17:06:48 health=200 0.014798 diskread=25GB
2026-10-20T17:07:49 health=200 0.030366 diskread=27GB
2026-10-20T17:08:51 health=200 0.012455 diskread=27GB
2026-10-20T17:09:52 health=200 0.012290 diskread=27GB
2026-10-20T17:10:54 health=200 0.010052 diskread=27GB
2026-10-20T17:11:56 health=200 0.011465 diskread=27GB
2026-10-20T17:12:57 health=200 0.015121 diskread=27GB
2026-10-20T17:13:59 health=200 0.011157 diskread=27GB
2026-10-20T17:15:01 health=200 0.012024 diskread=27GB
2026-10-20T17:16:02 health=200 0.010357 diskread=28GB
2026-10-20T17:17:04 health=200 0.017752 diskread=33GB
2026-10-20T17:18:05 health=200 0.009962 diskread=33GB
2026-10-20T17:19:07 health=200 0.011363 diskread=33GB
2026-10-20T17:20:09 health=200 0.011524 diskread=34GB
2026-10-20T17:21:10 health=200 0.009969 diskread=34GB
2026-10-20T17:22:12 health=200 0.841755 diskread=35GB
2026-10-20T17:23:14 health=200 0.010010 diskread=38GB
2026-10-20T17:24:16 health=200 0.012834 diskread=42GB
2026-10-20T17:25:18 health=200 0.012292 diskread=42GB
2026-10-20T17:26:20 health=200 0.014307 diskread=42GB
2026-10-20T17:27:21 health=200 0.016217 diskread=42GB
2026-10-20T17:28:23 health=200 0.010172 diskread=42GB
2026-10-20T17:29:25 health=000 0.331161 diskread=0GB
2026-10-20T17:30:29 health=000 3.054892 diskread=0GB
2026-10-20T17:31:31 health=200 0.011323 diskread=3GB
2026-10-20T17:32:33 health=200 0.009743 diskread=4GB
2026-10-20T17:33:35 health=200 0.012219 diskread=4GB
2026-10-20T17:34:39 health=000 3.077297 diskread=0GB
2026-10-20T17:35:44 health=000 3.069825 diskread=0GB
2026-10-20T17:36:46 health=200 0.011239 diskread=3GB
2026-10-20T17:37:47 health=200 0.010636 diskread=4GB
2026-10-20T17:38:49 health=200 0.009873 diskread=4GB
2026-10-20T17:39:50 health=200 0.011005 diskread=4GB
2026-10-20T17:40:52 health=200 0.011215 diskread=5GB
2026-10-20T17:41:53 health=200 0.011258 diskread=5GB
2026-10-20T17:42:54 health=200 0.012194 diskread=5GB
2026-10-20T17:43:56 health=200 0.010113 diskread=5GB
2026-10-20T17:44:58 health=200 0.010286 diskread=5GB
2026-10-20T17:45:59 health=200 0.010282 diskread=5GB
2026-10-20T17:47:01 health=200 0.010560 diskread=5GB
2026-10-20T17:48:02 health=200 0.009732 diskread=5GB
2026-10-20T17:49:03 health=200 0.010065 diskread=5GB
2026-10-20T17:50:05 health=200 0.010006 diskread=5GB
2026-10-20T17:51:06 health=200 0.010605 diskread=5GB
2026-10-20T17:52:08 health=200 0.012332 diskread=5GB
2026-10-20T17:53:09 health=200 0.010066 diskread=5GB
2026-10-20T17:54:11 health=200 0.011118 diskread=5GB
2026-10-20T17:55:12 health=200 0.010705 diskread=5GB
2026-10-20T17:56:13 health=200 0.011581 diskread=5GB
2026-10-20T17:57:14 health=200 0.009849 diskread=6GB
2026-10-20T17:58:16 health=200 0.010308 diskread=6GB
2026-10-20T17:59:17 health=200 0.009395 diskread=6GB
2026-10-20T18:00:19 health=200 0.010613 diskread=6GB
2026-10-20T18:01:20 health=200 0.010129 diskread=7GB
2026-10-20T18:02:22 health=200 0.010121 diskread=7GB
2026-10-20T18:03:24 health=200 0.012405 diskread=7GB
2026-10-20T18:04:25 health=200 0.012071 diskread=7GB
2026-10-20T18:05:27 health=200 0.012165 diskread=7GB
2026-10-20T18:06:29 health=200 0.021087 diskread=8GB
@@ -0,0 +1,49 @@
15:26:49
Traceback (most recent call last):
File "/root/work/apps.py", line 206, in <module>
fn(*sys.argv[2:])
~~^^^^^^^^^^^^^^^
File "/root/work/apps.py", line 168, in immich
st, out, _ = http("POST", base + "/api/assets", body, dict(tok, **{"Content-Type": ct}))
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/work/apps.py", line 34, in http
with urllib.request.urlopen(req, context=CTX, timeout=timeout) as r:
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 189, in urlopen
return opener.open(url, data, timeout)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 489, in open
response = self._open(req, data)
File "/usr/lib/python3.13/urllib/request.py", line 506, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
'_open', req)
File "/usr/lib/python3.13/urllib/request.py", line 466, in _call_chain
result = func(*args)
File "/usr/lib/python3.13/urllib/request.py", line 1367, in https_open
return self.do_open(http.client.HTTPSConnection, req,
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
context=self._context)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 1323, in do_open
r = h.getresponse()
File "/usr/lib/python3.13/http/client.py", line 1459, in getresponse
response.begin()
~~~~~~~~~~~~~~^^
File "/usr/lib/python3.13/http/client.py", line 336, in begin
version, status, reason = self._read_status()
~~~~~~~~~~~~~~~~~^^
File "/usr/lib/python3.13/http/client.py", line 297, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/usr/lib/python3.13/socket.py", line 719, in readinto
return self._sock.recv_into(b)
~~~~~~~~~~~~~~~~~~~~^^^
File "/usr/lib/python3.13/ssl.py", line 1304, in recv_into
return self.read(nbytes, buffer)
~~~~~~~~~^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/ssl.py", li15:26:50Z immich admin-sign-up 400 b'{"message":"Admin setup is not available"}'
ne 1138, in read
return self._sslobj.read(len, buffer)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TimeoutError: The read operation timed out
15:32:07
@@ -0,0 +1,49 @@
12:59:51
Traceback (most recent call last):
File "/root/work/apps.py", line 182, in <module>
fn(*sys.argv[2:])
~~^^^^^^^^^^^^^^^
File "/root/work/apps.py", line 168, in immich
st, out, _ = http("POST", base + "/api/assets", body, dict(tok, **{"Content-Type": ct}))
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/work/apps.py", line 34, in http
with urllib.request.urlopen(req, context=CTX, timeout=timeout) as r:
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 189, in urlopen
return opener.open(url, data, timeout)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 489, in open
response = self._open(req, data)
File "/usr/lib/python3.13/urllib/request.py", line 506, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
'_open', req)
File "/usr/lib/python3.13/urllib/request.py", line 466, in _call_chain
result = func(*args)
File "/usr/lib/python3.13/urllib/request.py", line 1367, in https_open
return self.do_open(http.client.HTTPSConnection, req,
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
context=self._context)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/urllib/request.py", line 1323, in do_open
r = h.getresponse()
File "/usr/lib/python3.13/http/client.py", line 1459, in getresponse
response.begin()
~~~~~~~~~~~~~~^^
File "/usr/lib/python3.13/http/client.py", line 336, in begin
version, status, reason = self._read_status()
~~~~~~~~~~~~~~~~~^^
File "/usr/lib/python3.13/http/client.py", line 297, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/usr/lib/python3.13/socket.py", line 719, in readinto
return self._sock.recv_into(b)
~~~~~~~~~~~~~~~~~~~~^^^
File "/usr/lib/python3.13/ssl.py", line 1304, in recv_into
return self.read(nbytes, buffer)
~~~~~~~~~^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/ssl.py", line 1138, in read
return self._sslobj.read(len, buffer)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TimeoutError: The read operation timed out
12:59:52Z immich admin-sign-up 400 b'{"message":"Admin setup is not available"}'
13:05:57
@@ -0,0 +1,218 @@
16:16:15Z used=3638MB avail=458MB load1=4.61 cpu=67% nextcloud-db:270/512MB 29% | immich-server:232/3072MB 25% | traefik:184/4096MB 26% | nextcloud:157/1024MB 0% | filebrowser:145/256MB 0% | immich-postgres:134/768MB 0% | actualbudget:130/256MB 27% | immich-machine-learning:106/2048MB 29%
16:16:46Z used=3638MB avail=458MB load1=4.47 cpu=3% nextcloud-db:270/512MB 29% | immich-server:232/3072MB 25% | traefik:184/4096MB 26% | nextcloud:157/1024MB 0% | filebrowser:145/256MB 0% | immich-postgres:134/768MB 0% | actualbudget:130/256MB 27% | immich-machine-learning:106/2048MB 29%
16:17:16Z used=3638MB avail=458MB load1=4.59 cpu=74% immich-server:1094/3072MB 0% | mealie:215/1000MB 0% | immich-machine-learning:173/2048MB 0% | paperless-webserver:148/1280MB 175% | nextcloud-db:118/512MB 0% | bookstack-db:104/256MB 0% | immich-postgres:78/768MB 0% | filebrowser:64/256MB 0%
16:17:46Z used=3638MB avail=458MB load1=3.6 cpu=3% immich-server:1094/3072MB 0% | mealie:215/1000MB 0% | immich-machine-learning:173/2048MB 0% | paperless-webserver:148/1280MB 175% | nextcloud-db:118/512MB 0% | bookstack-db:104/256MB 0% | immich-postgres:78/768MB 0% | filebrowser:64/256MB 0%
16:18:16Z used=3638MB avail=458MB load1=4.3 cpu=7% immich-server:1018/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:220/1000MB 0% | immich-machine-learning:134/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:98/256MB 0% | immich-postgres:90/768MB 0% | felhom-controller:89/4096MB 26%
16:18:46Z used=3638MB avail=458MB load1=2.92 cpu=5% immich-server:1018/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:220/1000MB 0% | immich-machine-learning:134/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:98/256MB 0% | immich-postgres:90/768MB 0% | felhom-controller:89/4096MB 26%
16:19:16Z used=3638MB avail=458MB load1=2.47 cpu=6% immich-server:778/3072MB 0% | paperless-webserver:545/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:136/2048MB 0% | nextcloud-db:101/512MB 6% | bookstack-db:97/256MB 0% | felhom-controller:90/4096MB 20% | immich-postgres:90/768MB 0%
16:19:47Z used=3638MB avail=458MB load1=1.65 cpu=5% immich-server:778/3072MB 0% | paperless-webserver:545/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:136/2048MB 0% | nextcloud-db:101/512MB 6% | bookstack-db:97/256MB 0% | felhom-controller:90/4096MB 20% | immich-postgres:90/768MB 0%
16:20:17Z used=3638MB avail=458MB load1=1.52 cpu=7% immich-server:778/3072MB 0% | paperless-webserver:545/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:136/2048MB 0% | nextcloud-db:102/512MB 6% | bookstack-db:97/256MB 0% | felhom-controller:92/4096MB 26% | immich-postgres:90/768MB 0%
16:20:47Z used=3638MB avail=458MB load1=1.06 cpu=8% immich-server:778/3072MB 0% | paperless-webserver:545/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:136/2048MB 0% | nextcloud-db:102/512MB 6% | bookstack-db:97/256MB 0% | felhom-controller:92/4096MB 26% | immich-postgres:90/768MB 0%
16:21:17Z used=3638MB avail=458MB load1=1.22 cpu=9% immich-server:780/3072MB 2% | paperless-webserver:550/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 149% | immich-postgres:90/768MB 0%
16:21:47Z used=3638MB avail=458MB load1=1.04 cpu=6% immich-server:780/3072MB 2% | paperless-webserver:550/1280MB 0% | mealie:218/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 149% | immich-postgres:90/768MB 0%
16:22:17Z used=3638MB avail=458MB load1=0.96 cpu=9% immich-server:781/3072MB 1% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 23% | immich-postgres:90/768MB 0%
16:22:47Z used=3638MB avail=458MB load1=0.8 cpu=6% immich-server:781/3072MB 1% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 23% | immich-postgres:90/768MB 0%
16:23:17Z used=3638MB avail=458MB load1=0.71 cpu=9% immich-server:781/3072MB 1% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:102/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:95/4096MB 6% | immich-postgres:90/768MB 0%
16:23:47Z used=3638MB avail=458MB load1=0.65 cpu=7% immich-server:781/3072MB 1% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:102/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:95/4096MB 6% | immich-postgres:90/768MB 0%
16:24:18Z used=3638MB avail=458MB load1=0.58 cpu=9% immich-server:783/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 21% | immich-postgres:90/768MB 0%
16:24:48Z used=3638MB avail=458MB load1=0.35 cpu=7% immich-server:783/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 21% | immich-postgres:90/768MB 0%
16:25:18Z used=3638MB avail=458MB load1=0.29 cpu=8% immich-server:782/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:95/4096MB 6% | immich-postgres:90/768MB 0%
16:25:48Z used=3638MB avail=458MB load1=0.4 cpu=6% immich-server:782/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:95/4096MB 6% | immich-postgres:90/768MB 0%
16:26:18Z used=3638MB avail=458MB load1=0.78 cpu=8% immich-server:782/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 145% | immich-postgres:90/768MB 0%
16:26:48Z used=3638MB avail=458MB load1=0.55 cpu=5% immich-server:782/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 145% | immich-postgres:90/768MB 0%
16:27:18Z used=3638MB avail=458MB load1=0.47 cpu=8% immich-server:783/3072MB 0% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:102/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 12% | immich-postgres:90/768MB 0%
16:27:48Z used=3638MB avail=458MB load1=0.48 cpu=6% immich-server:783/3072MB 0% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:102/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 12% | immich-postgres:90/768MB 0%
16:28:18Z used=3638MB avail=458MB load1=0.43 cpu=9% immich-server:785/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 23% | immich-postgres:90/768MB 0%
16:28:49Z used=3638MB avail=458MB load1=0.26 cpu=6% immich-server:785/3072MB 0% | paperless-webserver:550/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:96/4096MB 23% | immich-postgres:90/768MB 0%
16:29:19Z used=3638MB avail=458MB load1=0.99 cpu=32% immich-server:784/3072MB 0% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:97/4096MB 6% | immich-postgres:90/768MB 0%
16:29:49Z used=3638MB avail=458MB load1=2.24 cpu=21% immich-server:784/3072MB 0% | paperless-webserver:551/1280MB 0% | mealie:254/1000MB 0% | immich-machine-learning:137/2048MB 0% | nextcloud-db:101/512MB 0% | bookstack-db:97/256MB 0% | felhom-controller:97/4096MB 6% | immich-postgres:90/768MB 0%
16:30:19Z used=3288MB avail=808MB load1=3.46 cpu=46% paperless-webserver:533/1280MB 0% | immich-server:502/3072MB 12% | immich-machine-learning:431/2048MB 1% | immich-postgres:132/768MB 3% | bookstack:131/512MB 0% | felhom-controller:116/4096MB 46% | mealie:103/1000MB 87% | bookstack-db:97/256MB 0%
16:30:50Z used=3638MB avail=458MB load1=2.35 cpu=23% paperless-webserver:533/1280MB 0% | immich-server:502/3072MB 12% | immich-machine-learning:431/2048MB 1% | immich-postgres:132/768MB 3% | bookstack:131/512MB 0% | felhom-controller:116/4096MB 46% | mealie:103/1000MB 87% | bookstack-db:97/256MB 0%
16:31:20Z used=3638MB avail=458MB load1=4.47 cpu=95% immich-server:908/3072MB 0% | mealie:244/1000MB 0% | immich-machine-learning:168/2048MB 0% | felhom-controller:166/4096MB 126% | nextcloud:162/1024MB 0% | nextcloud-db:131/512MB 0% | paperless-webserver:114/1280MB 66% | actualbudget:85/256MB 0%
16:31:50Z used=3438MB avail=658MB load1=3.84 cpu=44% immich-server:908/3072MB 0% | mealie:244/1000MB 0% | immich-machine-learning:168/2048MB 0% | felhom-controller:166/4096MB 126% | nextcloud:162/1024MB 0% | nextcloud-db:131/512MB 0% | paperless-webserver:114/1280MB 66% | actualbudget:85/256MB 0%
16:32:21Z used=3638MB avail=458MB load1=3.85 cpu=61% paperless-webserver:526/1280MB 0% | mealie:250/1000MB 0% | nextcloud-db:123/512MB 0% | bookstack-db:116/256MB 0% | felhom-controller:114/4096MB 84% | traefik:84/4096MB 2% | actualbudget:62/256MB 0% | nextcloud:50/1024MB 0%
16:32:51Z used=3288MB avail=808MB load1=5.41 cpu=48% paperless-webserver:526/1280MB 0% | mealie:250/1000MB 0% | nextcloud-db:123/512MB 0% | bookstack-db:116/256MB 0% | felhom-controller:114/4096MB 84% | traefik:84/4096MB 2% | actualbudget:62/256MB 0% | nextcloud:50/1024MB 0%
16:33:23Z used=3038MB avail=1058MB load1=4.16 cpu=48% immich-server:842/3072MB 5% | paperless-webserver:422/1280MB 0% | mealie:208/1000MB 0% | felhom-controller:96/4096MB 0% | immich-machine-learning:89/2048MB 0% | immich-postgres:79/768MB 0% | bookstack-db:74/256MB 0% | traefik:56/4096MB 26%
16:33:53Z used=3638MB avail=458MB load1=3.01 cpu=11% immich-server:842/3072MB 5% | paperless-webserver:422/1280MB 0% | mealie:208/1000MB 0% | felhom-controller:96/4096MB 0% | immich-machine-learning:89/2048MB 0% | immich-postgres:79/768MB 0% | bookstack-db:74/256MB 0% | traefik:56/4096MB 26%
16:34:23Z used=3638MB avail=458MB load1=2.18 cpu=33% immich-server:882/3072MB 4% | felhom-controller:227/4096MB 38% | mealie:208/1000MB 0% | nextcloud:170/1024MB 0% | nextcloud-db:134/512MB 0% | immich-machine-learning:97/2048MB 0% | paperless-webserver:91/1280MB 0% | actualbudget:87/256MB 0%
16:34:54Z used=3638MB avail=458MB load1=2.12 cpu=8% immich-server:882/3072MB 4% | felhom-controller:227/4096MB 38% | mealie:208/1000MB 0% | nextcloud:170/1024MB 0% | nextcloud-db:134/512MB 0% | immich-machine-learning:97/2048MB 0% | paperless-webserver:91/1280MB 0% | actualbudget:87/256MB 0%
16:35:25Z used=3638MB avail=458MB load1=1.42 cpu=7% immich-server:840/3072MB 7% | paperless-webserver:714/1280MB 0% | felhom-controller:273/4096MB 17% | mealie:217/1000MB 0% | nextcloud:177/1024MB 0% | nextcloud-db:123/512MB 7% | immich-machine-learning:102/2048MB 0% | actualbudget:96/256MB 0%
16:35:55Z used=3638MB avail=458MB load1=1 cpu=11% immich-server:840/3072MB 7% | paperless-webserver:714/1280MB 0% | felhom-controller:273/4096MB 17% | mealie:217/1000MB 0% | nextcloud:177/1024MB 0% | nextcloud-db:123/512MB 7% | immich-machine-learning:102/2048MB 0% | actualbudget:96/256MB 0%
16:36:26Z used=3638MB avail=458MB load1=1.33 cpu=7% immich-server:735/3072MB 6% | paperless-webserver:561/1280MB 0% | felhom-controller:281/4096MB 168% | mealie:218/1000MB 0% | nextcloud-db:110/512MB 6% | immich-machine-learning:103/2048MB 0% | actualbudget:96/256MB 0% | immich-postgres:94/768MB 0%
16:36:56Z used=3638MB avail=458MB load1=0.8 cpu=8% immich-server:735/3072MB 6% | paperless-webserver:561/1280MB 0% | felhom-controller:281/4096MB 168% | mealie:218/1000MB 0% | nextcloud-db:110/512MB 6% | immich-machine-learning:103/2048MB 0% | actualbudget:96/256MB 0% | immich-postgres:94/768MB 0%
16:37:26Z used=3638MB avail=458MB load1=0.55 cpu=8% immich-server:736/3072MB 5% | paperless-webserver:561/1280MB 0% | felhom-controller:250/4096MB 26% | mealie:218/1000MB 0% | nextcloud-db:110/512MB 8% | immich-machine-learning:103/2048MB 0% | actualbudget:96/256MB 0% | immich-postgres:94/768MB 0%
16:37:58Z used=3638MB avail=458MB load1=0.62 cpu=7% immich-server:739/3072MB 0% | paperless-webserver:562/1280MB 0% | felhom-controller:251/4096MB 36% | mealie:237/1000MB 0% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:38:28Z used=3638MB avail=458MB load1=0.57 cpu=3% immich-server:739/3072MB 0% | paperless-webserver:562/1280MB 0% | felhom-controller:251/4096MB 36% | mealie:237/1000MB 0% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:38:59Z used=3638MB avail=458MB load1=0.35 cpu=5% immich-server:739/3072MB 0% | paperless-webserver:561/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 18% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 31% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:39:29Z used=3638MB avail=458MB load1=0.36 cpu=3% immich-server:739/3072MB 0% | paperless-webserver:561/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 18% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 31% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:40:00Z used=3638MB avail=458MB load1=0.38 cpu=4% immich-server:739/3072MB 0% | paperless-webserver:562/1280MB 0% | mealie:237/1000MB 26% | felhom-controller:225/4096MB 38% | immich-machine-learning:118/2048MB 27% | nextcloud-db:110/512MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:40:30Z used=3638MB avail=458MB load1=0.76 cpu=10% immich-server:739/3072MB 0% | paperless-webserver:562/1280MB 0% | mealie:237/1000MB 26% | felhom-controller:225/4096MB 38% | immich-machine-learning:118/2048MB 27% | nextcloud-db:110/512MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 0%
16:41:02Z used=3638MB avail=458MB load1=1.27 cpu=19% immich-server:741/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 25% | felhom-controller:224/4096MB 137% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 10%
16:41:32Z used=3638MB avail=458MB load1=1.57 cpu=10% immich-server:741/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 25% | felhom-controller:224/4096MB 137% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:97/256MB 0% | immich-postgres:94/768MB 10%
16:42:03Z used=3638MB avail=458MB load1=1.02 cpu=15% immich-server:741/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 37% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:95/768MB 9%
16:42:34Z used=3638MB avail=458MB load1=0.8 cpu=9% immich-server:741/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 37% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:95/768MB 9%
16:43:04Z used=3638MB avail=458MB load1=0.64 cpu=14% immich-server:739/3072MB 3% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:94/768MB 0%
16:43:34Z used=3638MB avail=458MB load1=0.45 cpu=10% immich-server:739/3072MB 3% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:94/768MB 0%
16:44:04Z used=3638MB avail=458MB load1=0.35 cpu=5% immich-server:740/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 1% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:94/768MB 0%
16:44:35Z used=3638MB avail=458MB load1=0.4 cpu=5% immich-server:740/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:237/1000MB 0% | felhom-controller:224/4096MB 1% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:94/768MB 0%
16:45:06Z used=3638MB avail=458MB load1=0.24 cpu=5% immich-server:750/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:236/1000MB 0% | felhom-controller:224/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:97/768MB 0%
16:45:36Z used=3638MB avail=458MB load1=0.27 cpu=5% immich-server:750/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:236/1000MB 0% | felhom-controller:224/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:98/256MB 0% | immich-postgres:97/768MB 0%
16:46:06Z used=3638MB avail=458MB load1=1.22 cpu=14% immich-server:747/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:233/4096MB 154% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:46:36Z used=3638MB avail=458MB load1=1.26 cpu=5% immich-server:747/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:233/4096MB 154% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:47:06Z used=3638MB avail=458MB load1=0.94 cpu=5% immich-server:747/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:234/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:47:37Z used=3638MB avail=458MB load1=0.84 cpu=6% immich-server:747/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:234/4096MB 21% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:48:09Z used=3638MB avail=458MB load1=0.64 cpu=8% immich-server:748/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:175/4096MB 36% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:48:39Z used=3638MB avail=458MB load1=1.1 cpu=14% immich-server:748/3072MB 0% | paperless-webserver:559/1280MB 0% | mealie:234/1000MB 0% | felhom-controller:175/4096MB 36% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | actualbudget:100/256MB 0% | immich-postgres:98/768MB 0%
16:49:10Z used=3638MB avail=458MB load1=0.78 cpu=6% immich-server:675/3072MB 0% | paperless-webserver:529/1280MB 0% | felhom-controller:270/4096MB 19% | mealie:220/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:49:40Z used=3638MB avail=458MB load1=0.65 cpu=4% immich-server:675/3072MB 0% | paperless-webserver:529/1280MB 0% | felhom-controller:270/4096MB 19% | mealie:220/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:110/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:50:10Z used=3638MB avail=458MB load1=0.66 cpu=4% immich-server:694/3072MB 0% | paperless-webserver:538/1280MB 0% | felhom-controller:268/4096MB 51% | mealie:219/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:50:40Z used=3638MB avail=458MB load1=0.53 cpu=4% immich-server:694/3072MB 0% | paperless-webserver:538/1280MB 0% | felhom-controller:268/4096MB 51% | mealie:219/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:51:10Z used=3638MB avail=458MB load1=0.78 cpu=4% immich-server:700/3072MB 0% | paperless-webserver:537/1280MB 1% | felhom-controller:241/4096MB 160% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:51:41Z used=3638MB avail=458MB load1=0.77 cpu=5% immich-server:700/3072MB 0% | paperless-webserver:537/1280MB 1% | felhom-controller:241/4096MB 160% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:52:11Z used=3638MB avail=458MB load1=0.63 cpu=6% immich-server:701/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:242/4096MB 34% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:52:42Z used=3638MB avail=458MB load1=0.41 cpu=5% immich-server:701/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:242/4096MB 34% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:53:13Z used=3638MB avail=458MB load1=0.44 cpu=4% immich-server:703/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:235/4096MB 20% | mealie:218/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:53:43Z used=3638MB avail=458MB load1=0.47 cpu=6% immich-server:703/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:235/4096MB 20% | mealie:218/1000MB 0% | actualbudget:119/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:54:13Z used=3638MB avail=458MB load1=0.34 cpu=5% immich-server:704/3072MB 2% | paperless-webserver:537/1280MB 0% | felhom-controller:236/4096MB 35% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:54:44Z used=3638MB avail=458MB load1=0.55 cpu=5% immich-server:704/3072MB 2% | paperless-webserver:537/1280MB 0% | felhom-controller:236/4096MB 35% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:55:15Z used=3638MB avail=458MB load1=0.46 cpu=4% immich-server:705/3072MB 1% | paperless-webserver:537/1280MB 0% | felhom-controller:234/4096MB 19% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:55:45Z used=3638MB avail=458MB load1=0.55 cpu=11% immich-server:705/3072MB 1% | paperless-webserver:537/1280MB 0% | felhom-controller:234/4096MB 19% | mealie:218/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:111/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:56:16Z used=3638MB avail=458MB load1=0.7 cpu=13% immich-server:710/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 164% | mealie:217/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:56:47Z used=3638MB avail=458MB load1=0.42 cpu=7% immich-server:710/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 164% | mealie:217/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:57:17Z used=3638MB avail=458MB load1=0.59 cpu=12% immich-server:710/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:231/4096MB 17% | mealie:217/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:57:47Z used=3638MB avail=458MB load1=0.48 cpu=6% immich-server:710/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:231/4096MB 17% | mealie:217/1000MB 0% | actualbudget:118/256MB 0% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
16:58:18Z used=3638MB avail=458MB load1=0.42 cpu=12% immich-server:712/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 38% | mealie:217/1000MB 0% | actualbudget:118/256MB 1% | nextcloud-db:112/512MB 6% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 9%
16:58:50Z used=3638MB avail=458MB load1=0.72 cpu=7% immich-server:712/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 38% | mealie:217/1000MB 0% | actualbudget:118/256MB 1% | nextcloud-db:112/512MB 6% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 9%
16:59:20Z used=3638MB avail=458MB load1=0.63 cpu=45% immich-server:713/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:233/4096MB 24% | mealie:217/1000MB 0% | actualbudget:118/256MB 12% | nextcloud-db:113/512MB 5% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 8%
16:59:50Z used=3638MB avail=458MB load1=0.56 cpu=10% immich-server:713/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:233/4096MB 24% | mealie:217/1000MB 0% | actualbudget:118/256MB 12% | nextcloud-db:113/512MB 5% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 8%
17:00:21Z used=3638MB avail=458MB load1=0.61 cpu=30% immich-server:713/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 37% | mealie:217/1000MB 0% | actualbudget:118/256MB 11% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
17:00:51Z used=3638MB avail=458MB load1=0.72 cpu=17% immich-server:713/3072MB 0% | paperless-webserver:537/1280MB 0% | felhom-controller:232/4096MB 37% | mealie:217/1000MB 0% | actualbudget:118/256MB 11% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
17:01:22Z used=3638MB avail=458MB load1=1.81 cpu=52% immich-server:720/3072MB 0% | paperless-webserver:538/1280MB 0% | felhom-controller:238/4096MB 138% | mealie:216/1000MB 0% | actualbudget:117/256MB 10% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
17:01:52Z used=3638MB avail=458MB load1=1.42 cpu=25% immich-server:720/3072MB 0% | paperless-webserver:538/1280MB 0% | felhom-controller:238/4096MB 138% | mealie:216/1000MB 0% | actualbudget:117/256MB 10% | nextcloud-db:112/512MB 0% | immich-machine-learning:103/2048MB 0% | immich-postgres:102/768MB 0%
17:02:22Z used=3638MB avail=458MB load1=0.93 cpu=29% immich-server:548/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:174/1000MB 0% | felhom-controller:170/4096MB 0% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:70/1024MB 0% | immich-postgres:67/768MB 0%
17:02:52Z used=3638MB avail=458MB load1=0.56 cpu=10% immich-server:548/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:174/1000MB 0% | felhom-controller:170/4096MB 0% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:70/1024MB 0% | immich-postgres:67/768MB 0%
17:03:22Z used=3638MB avail=458MB load1=0.41 cpu=27% immich-server:555/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:177/1000MB 0% | felhom-controller:169/4096MB 17% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:71/1024MB 0% | immich-postgres:67/768MB 0%
17:03:52Z used=3638MB avail=458MB load1=0.42 cpu=10% immich-server:555/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:177/1000MB 0% | felhom-controller:169/4096MB 17% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:71/1024MB 0% | immich-postgres:67/768MB 0%
17:04:22Z used=3638MB avail=458MB load1=0.8 cpu=65% immich-server:556/3072MB 1% | paperless-webserver:496/1280MB 0% | mealie:177/1000MB 0% | felhom-controller:169/4096MB 48% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:71/1024MB 0% | immich-postgres:67/768MB 0%
17:04:53Z used=1590MB avail=2506MB load1=3.55 cpu=20% immich-server:556/3072MB 1% | paperless-webserver:496/1280MB 0% | mealie:177/1000MB 0% | felhom-controller:169/4096MB 48% | nextcloud-db:99/512MB 0% | immich-machine-learning:88/2048MB 0% | nextcloud:71/1024MB 0% | immich-postgres:67/768MB 0%
17:05:23Z used=3288MB avail=808MB load1=4.55 cpu=76% paperless-webserver:498/1280MB 0% | immich-machine-learning:431/2048MB 0% | felhom-controller:190/4096MB 23% | mealie:167/1000MB 0% | bookstack:132/512MB 6% | immich-postgres:129/768MB 0% | traefik:127/4096MB 2% | bookstack-db:118/256MB 0%
17:05:53Z used=3038MB avail=1058MB load1=3.51 cpu=28% paperless-webserver:498/1280MB 0% | immich-machine-learning:431/2048MB 0% | felhom-controller:190/4096MB 23% | mealie:167/1000MB 0% | bookstack:132/512MB 6% | immich-postgres:129/768MB 0% | traefik:127/4096MB 2% | bookstack-db:118/256MB 0%
17:06:23Z used=3638MB avail=458MB load1=4.16 cpu=76% immich-server:891/3072MB 0% | mealie:237/1000MB 0% | nextcloud:161/1024MB 4% | nextcloud-db:125/512MB 0% | immich-machine-learning:118/2048MB 23% | actualbudget:112/256MB 0% | felhom-controller:92/4096MB 147% | immich-postgres:81/768MB 8%
17:06:53Z used=3638MB avail=458MB load1=4.32 cpu=50% immich-server:891/3072MB 0% | mealie:237/1000MB 0% | nextcloud:161/1024MB 4% | nextcloud-db:125/512MB 0% | immich-machine-learning:118/2048MB 23% | actualbudget:112/256MB 0% | felhom-controller:92/4096MB 147% | immich-postgres:81/768MB 8%
17:07:23Z used=3638MB avail=458MB load1=3.32 cpu=43% immich-server:867/3072MB 0% | paperless-webserver:540/1280MB 1% | mealie:232/1000MB 0% | felhom-controller:185/4096MB 193% | nextcloud-db:112/512MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | bookstack-db:66/256MB 0%
17:07:53Z used=3638MB avail=458MB load1=2.39 cpu=16% immich-server:867/3072MB 0% | paperless-webserver:540/1280MB 1% | mealie:232/1000MB 0% | felhom-controller:185/4096MB 193% | nextcloud-db:112/512MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | bookstack-db:66/256MB 0%
17:08:24Z used=3638MB avail=458MB load1=1.63 cpu=27% immich-server:682/3072MB 2% | paperless-webserver:497/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:84/256MB 0% | felhom-controller:79/4096MB 38%
17:08:54Z used=3638MB avail=458MB load1=0.99 cpu=11% immich-server:682/3072MB 2% | paperless-webserver:497/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:84/256MB 0% | felhom-controller:79/4096MB 38%
17:09:24Z used=3638MB avail=458MB load1=0.67 cpu=28% immich-server:663/3072MB 2% | paperless-webserver:497/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:85/256MB 0% | felhom-controller:78/4096MB 16%
17:09:54Z used=3638MB avail=458MB load1=0.56 cpu=9% immich-server:663/3072MB 2% | paperless-webserver:497/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:85/256MB 0% | felhom-controller:78/4096MB 16%
17:10:24Z used=3638MB avail=458MB load1=0.67 cpu=28% immich-server:663/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:85/256MB 0% | felhom-controller:79/4096MB 32%
17:10:54Z used=3638MB avail=458MB load1=0.48 cpu=16% immich-server:663/3072MB 0% | paperless-webserver:496/1280MB 0% | mealie:212/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:102/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:85/256MB 0% | felhom-controller:79/4096MB 32%
17:11:24Z used=3638MB avail=458MB load1=0.55 cpu=28% immich-server:663/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 0% | felhom-controller:77/4096MB 138%
17:11:54Z used=3638MB avail=458MB load1=0.63 cpu=9% immich-server:663/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 0% | felhom-controller:77/4096MB 138%
17:12:25Z used=3638MB avail=458MB load1=0.66 cpu=27% immich-server:663/3072MB 0% | paperless-webserver:495/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 7% | felhom-controller:77/4096MB 32%
17:12:55Z used=3638MB avail=458MB load1=0.4 cpu=8% immich-server:663/3072MB 0% | paperless-webserver:495/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 7% | felhom-controller:77/4096MB 32%
17:13:25Z used=3638MB avail=458MB load1=0.38 cpu=27% immich-server:664/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 6% | felhom-controller:77/4096MB 16%
17:13:55Z used=3638MB avail=458MB load1=0.84 cpu=9% immich-server:664/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 6% | felhom-controller:77/4096MB 16%
17:14:25Z used=3638MB avail=458MB load1=0.88 cpu=47% immich-server:665/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 7% | felhom-controller:77/4096MB 40%
17:14:55Z used=3638MB avail=458MB load1=0.68 cpu=13% immich-server:665/3072MB 0% | paperless-webserver:494/1280MB 0% | mealie:241/1000MB 0% | immich-machine-learning:108/2048MB 0% | immich-postgres:101/768MB 0% | nextcloud-db:100/512MB 0% | bookstack-db:86/256MB 7% | felhom-controller:77/4096MB 40%
17:15:25Z used=3638MB avail=458MB load1=0.6 cpu=4% immich-server:660/3072MB 0% | paperless-webserver:493/1280MB 0% | mealie:110/1000MB 94% | immich-machine-learning:109/2048MB 0% | immich-postgres:100/768MB 0% | nextcloud-db:99/512MB 6% | bookstack-db:85/256MB 0% | felhom-controller:78/4096MB 40%
17:15:55Z used=3638MB avail=458MB load1=0.68 cpu=12% immich-server:660/3072MB 0% | paperless-webserver:493/1280MB 0% | mealie:110/1000MB 94% | immich-machine-learning:109/2048MB 0% | immich-postgres:100/768MB 0% | nextcloud-db:99/512MB 6% | bookstack-db:85/256MB 0% | felhom-controller:78/4096MB 40%
17:16:25Z used=3638MB avail=458MB load1=2.61 cpu=26% immich-server:658/3072MB 0% | paperless-webserver:492/1280MB 0% | mealie:293/1000MB 1% | immich-machine-learning:109/2048MB 0% | immich-postgres:100/768MB 0% | nextcloud-db:98/512MB 7% | felhom-controller:88/4096MB 158% | bookstack-db:84/256MB 0%
17:16:56Z used=3638MB avail=458MB load1=3.83 cpu=14% immich-server:658/3072MB 0% | paperless-webserver:492/1280MB 0% | mealie:293/1000MB 1% | immich-machine-learning:109/2048MB 0% | immich-postgres:100/768MB 0% | nextcloud-db:98/512MB 7% | felhom-controller:88/4096MB 158% | bookstack-db:84/256MB 0%
17:17:27Z used=3638MB avail=458MB load1=2.51 cpu=6% felhom-controller:952/4096MB 22% | immich-server:550/3072MB 0% | paperless-webserver:436/1280MB 0% | mealie:214/1000MB 0% | immich-machine-learning:108/2048MB 0% | nextcloud-db:78/512MB 0% | immich-postgres:62/768MB 0% | nextcloud:61/1024MB 0%
17:17:57Z used=3638MB avail=458MB load1=1.67 cpu=8% felhom-controller:951/4096MB 39% | immich-server:596/3072MB 1% | paperless-webserver:436/1280MB 0% | mealie:215/1000MB 0% | immich-machine-learning:117/2048MB 0% | traefik:100/4096MB 0% | nextcloud-db:77/512MB 0% | immich-postgres:73/768MB 0%
17:18:27Z used=3638MB avail=458MB load1=1.21 cpu=6% felhom-controller:951/4096MB 39% | immich-server:596/3072MB 1% | paperless-webserver:436/1280MB 0% | mealie:215/1000MB 0% | immich-machine-learning:117/2048MB 0% | traefik:100/4096MB 0% | nextcloud-db:77/512MB 0% | immich-postgres:73/768MB 0%
17:18:57Z used=3638MB avail=458MB load1=0.86 cpu=9% felhom-controller:950/4096MB 17% | immich-server:597/3072MB 1% | paperless-webserver:437/1280MB 0% | mealie:215/1000MB 0% | immich-machine-learning:117/2048MB 0% | traefik:100/4096MB 0% | nextcloud-db:77/512MB 0% | immich-postgres:73/768MB 0%
17:19:27Z used=3638MB avail=458MB load1=0.72 cpu=6% felhom-controller:950/4096MB 17% | immich-server:597/3072MB 1% | paperless-webserver:437/1280MB 0% | mealie:215/1000MB 0% | immich-machine-learning:117/2048MB 0% | traefik:100/4096MB 0% | nextcloud-db:77/512MB 0% | immich-postgres:73/768MB 0%
17:19:58Z used=3638MB avail=458MB load1=0.79 cpu=29% felhom-controller:967/4096MB 41% | immich-server:600/3072MB 0% | paperless-webserver:438/1280MB 0% | mealie:215/1000MB 0% | traefik:142/4096MB 0% | nextcloud-db:123/512MB 6% | immich-machine-learning:117/2048MB 0% | immich-postgres:73/768MB 0%
17:20:28Z used=3638MB avail=458MB load1=0.74 cpu=17% felhom-controller:967/4096MB 41% | immich-server:600/3072MB 0% | paperless-webserver:438/1280MB 0% | mealie:215/1000MB 0% | traefik:142/4096MB 0% | nextcloud-db:123/512MB 6% | immich-machine-learning:117/2048MB 0% | immich-postgres:73/768MB 0%
17:20:58Z used=3638MB avail=458MB load1=0.83 cpu=10% felhom-controller:946/4096MB 146% | immich-server:607/3072MB 1% | paperless-webserver:459/1280MB 0% | mealie:247/1000MB 0% | nextcloud:152/1024MB 0% | nextcloud-db:121/512MB 0% | immich-machine-learning:120/2048MB 0% | immich-postgres:71/768MB 9%
17:21:28Z used=3638MB avail=458MB load1=0.64 cpu=4% felhom-controller:946/4096MB 146% | immich-server:607/3072MB 1% | paperless-webserver:459/1280MB 0% | mealie:247/1000MB 0% | nextcloud:152/1024MB 0% | nextcloud-db:121/512MB 0% | immich-machine-learning:120/2048MB 0% | immich-postgres:71/768MB 9%
17:21:58Z used=3438MB avail=658MB load1=1.36 cpu=31% felhom-controller:946/4096MB 146% | immich-server:607/3072MB 1% | paperless-webserver:459/1280MB 0% | mealie:247/1000MB 0% | nextcloud:152/1024MB 0% | nextcloud-db:121/512MB 0% | immich-machine-learning:120/2048MB 0% | immich-postgres:71/768MB 9%
17:22:28Z used=3638MB avail=458MB load1=1.95 cpu=20% immich-server:532/3072MB 0% | paperless-webserver:449/1280MB 0% | mealie:219/1000MB 0% | nextcloud-db:132/512MB 4% | immich-postgres:129/768MB 10% | bookstack-db:113/256MB 101% | felhom-controller:105/4096MB 57% | immich-machine-learning:91/2048MB 0%
17:22:58Z used=3288MB avail=808MB load1=2.14 cpu=25% immich-server:903/3072MB 0% | paperless-webserver:317/1280MB 0% | mealie:232/1000MB 22% | immich-machine-learning:168/2048MB 0% | felhom-controller:99/4096MB 17% | immich-postgres:81/768MB 0% | actualbudget:79/256MB 0% | traefik:70/4096MB 0%
17:23:28Z used=3638MB avail=458MB load1=1.82 cpu=6% immich-server:903/3072MB 0% | paperless-webserver:317/1280MB 0% | mealie:232/1000MB 22% | immich-machine-learning:168/2048MB 0% | felhom-controller:99/4096MB 17% | immich-postgres:81/768MB 0% | actualbudget:79/256MB 0% | traefik:70/4096MB 0%
17:23:59Z used=3638MB avail=458MB load1=2.37 cpu=46% immich-server:979/3072MB 0% | paperless-webserver:249/1280MB 180% | mealie:249/1000MB 12% | immich-machine-learning:168/2048MB 30% | felhom-controller:126/4096MB 63% | nextcloud-db:118/512MB 0% | actualbudget:115/256MB 0% | immich-postgres:103/768MB 0%
17:24:29Z used=3638MB avail=458MB load1=2.35 cpu=9% immich-server:979/3072MB 0% | paperless-webserver:249/1280MB 180% | mealie:249/1000MB 12% | immich-machine-learning:168/2048MB 30% | felhom-controller:126/4096MB 63% | nextcloud-db:118/512MB 0% | actualbudget:115/256MB 0% | immich-postgres:103/768MB 0%
17:24:59Z used=3638MB avail=458MB load1=3.64 cpu=25% immich-server:806/3072MB 0% | paperless-webserver:590/1280MB 0% | mealie:181/1000MB 0% | felhom-controller:173/4096MB 158% | immich-machine-learning:156/2048MB 21% | nextcloud-db:95/512MB 0% | immich-postgres:70/768MB 0% | bookstack:68/512MB 0%
17:25:29Z used=3638MB avail=458MB load1=2.34 cpu=3% immich-server:806/3072MB 0% | paperless-webserver:590/1280MB 0% | mealie:181/1000MB 0% | felhom-controller:173/4096MB 158% | immich-machine-learning:156/2048MB 21% | nextcloud-db:95/512MB 0% | immich-postgres:70/768MB 0% | bookstack:68/512MB 0%
17:25:59Z used=3638MB avail=458MB load1=1.94 cpu=11% immich-server:808/3072MB 1% | paperless-webserver:590/1280MB 0% | mealie:187/1000MB 0% | immich-machine-learning:142/2048MB 0% | felhom-controller:135/4096MB 0% | nextcloud-db:95/512MB 0% | immich-postgres:79/768MB 0% | nextcloud:71/1024MB 0%
17:26:29Z used=3638MB avail=458MB load1=1.44 cpu=11% immich-server:808/3072MB 1% | paperless-webserver:590/1280MB 0% | mealie:187/1000MB 0% | immich-machine-learning:142/2048MB 0% | felhom-controller:135/4096MB 0% | nextcloud-db:95/512MB 0% | immich-postgres:79/768MB 0% | nextcloud:71/1024MB 0%
17:26:59Z used=3638MB avail=458MB load1=1.75 cpu=5% immich-server:732/3072MB 0% | paperless-webserver:590/1280MB 0% | felhom-controller:216/4096MB 17% | mealie:188/1000MB 0% | immich-machine-learning:142/2048MB 0% | nextcloud-db:95/512MB 0% | immich-postgres:79/768MB 0% | nextcloud:72/1024MB 0%
17:27:30Z used=3638MB avail=458MB load1=1.28 cpu=2% immich-server:732/3072MB 0% | paperless-webserver:590/1280MB 0% | felhom-controller:216/4096MB 17% | mealie:188/1000MB 0% | immich-machine-learning:142/2048MB 0% | nextcloud-db:95/512MB 0% | immich-postgres:79/768MB 0% | nextcloud:72/1024MB 0%
17:28:00Z used=3638MB avail=458MB load1=2.24 cpu=17% immich-server:731/3072MB 1% | paperless-webserver:590/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:173/4096MB 76% | immich-machine-learning:142/2048MB 0% | nextcloud-db:95/512MB 0% | bookstack-db:81/256MB 0% | bookstack:81/512MB 0%
17:28:30Z NO ANSWER TimeoutExpired
17:29:25Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:30:00Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:30:36Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:31:13Z used=1590MB avail=2506MB load1=4.44 cpu=0% mealie:222/1000MB 57% | traefik:186/4096MB 23% | nextcloud:170/1024MB 0% | felhom-controller:167/4096MB 48% | nextcloud-db:166/512MB 0% | actualbudget:159/256MB 0% | paperless-webserver:156/1280MB 63% | filebrowser:145/256MB 0%
17:31:43Z used=3638MB avail=458MB load1=5.72 cpu=76% mealie:222/1000MB 57% | traefik:186/4096MB 23% | nextcloud:170/1024MB 0% | felhom-controller:167/4096MB 48% | nextcloud-db:166/512MB 0% | actualbudget:159/256MB 0% | paperless-webserver:156/1280MB 63% | filebrowser:145/256MB 0%
17:32:13Z used=3638MB avail=458MB load1=3.96 cpu=46% immich-server:896/3072MB 1% | mealie:216/1000MB 0% | immich-machine-learning:163/2048MB 0% | paperless-webserver:154/1280MB 195% | nextcloud-db:121/512MB 0% | felhom-controller:92/4096MB 0% | bookstack-db:91/256MB 0% | immich-postgres:79/768MB 0%
17:32:43Z used=3638MB avail=458MB load1=3.33 cpu=62% immich-server:896/3072MB 1% | mealie:216/1000MB 0% | immich-machine-learning:163/2048MB 0% | paperless-webserver:154/1280MB 195% | nextcloud-db:121/512MB 0% | felhom-controller:92/4096MB 0% | bookstack-db:91/256MB 0% | immich-postgres:79/768MB 0%
17:33:13Z used=3638MB avail=458MB load1=2.15 cpu=8% immich-server:887/3072MB 1% | paperless-webserver:628/1280MB 5% | mealie:216/1000MB 0% | immich-machine-learning:158/2048MB 0% | nextcloud-db:113/512MB 0% | felhom-controller:95/4096MB 1% | bookstack-db:88/256MB 0% | immich-postgres:79/768MB 0%
17:33:43Z NO ANSWER TimeoutExpired
17:34:38Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:35:15Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:35:50Z used=NoneMB avail=NoneMB load1=None cpu=0%
17:36:24Z used=3638MB avail=458MB load1=3.94 cpu=78% traefik:187/4096MB 23% | nextcloud:170/1024MB 0% | actualbudget:160/256MB 15% | mealie:159/1000MB 53% | nextcloud-db:153/512MB 0% | filebrowser:145/256MB 0% | immich-postgres:128/768MB 1% | paperless-webserver:122/1280MB 53%
17:36:54Z used=3638MB avail=458MB load1=3.48 cpu=7% traefik:187/4096MB 23% | nextcloud:170/1024MB 0% | actualbudget:160/256MB 15% | mealie:159/1000MB 53% | nextcloud-db:153/512MB 0% | filebrowser:145/256MB 0% | immich-postgres:128/768MB 1% | paperless-webserver:122/1280MB 53%
17:37:25Z used=3638MB avail=458MB load1=3.33 cpu=60% immich-server:1048/3072MB 0% | mealie:332/1000MB 0% | immich-machine-learning:167/2048MB 0% | paperless-webserver:150/1280MB 100% | nextcloud-db:137/512MB 0% | bookstack:133/512MB 0% | felhom-controller:128/4096MB 5% | nextcloud:116/1024MB 0%
17:37:55Z used=3638MB avail=458MB load1=2.46 cpu=6% immich-server:1048/3072MB 0% | mealie:332/1000MB 0% | immich-machine-learning:167/2048MB 0% | paperless-webserver:150/1280MB 100% | nextcloud-db:137/512MB 0% | bookstack:133/512MB 0% | felhom-controller:128/4096MB 5% | nextcloud:116/1024MB 0%
17:38:25Z used=3638MB avail=458MB load1=2.9 cpu=14% immich-server:914/3072MB 3% | paperless-webserver:541/1280MB 0% | mealie:216/1000MB 0% | immich-machine-learning:154/2048MB 0% | nextcloud-db:97/512MB 0% | bookstack-db:96/256MB 0% | felhom-controller:82/4096MB 24% | immich-postgres:65/768MB 9%
17:38:55Z used=3638MB avail=458MB load1=2.13 cpu=11% immich-server:914/3072MB 3% | paperless-webserver:541/1280MB 0% | mealie:216/1000MB 0% | immich-machine-learning:154/2048MB 0% | nextcloud-db:97/512MB 0% | bookstack-db:96/256MB 0% | felhom-controller:82/4096MB 24% | immich-postgres:65/768MB 9%
17:39:25Z used=3638MB avail=458MB load1=1.37 cpu=30% immich-server:717/3072MB 1% | paperless-webserver:518/1280MB 0% | mealie:216/1000MB 0% | immich-machine-learning:152/2048MB 0% | felhom-controller:135/4096MB 6% | bookstack-db:112/256MB 0% | nextcloud-db:94/512MB 0% | bookstack:91/512MB 0%
17:39:56Z used=3638MB avail=458MB load1=1.41 cpu=24% immich-server:717/3072MB 1% | paperless-webserver:518/1280MB 0% | mealie:216/1000MB 0% | immich-machine-learning:152/2048MB 0% | felhom-controller:135/4096MB 6% | bookstack-db:112/256MB 0% | nextcloud-db:94/512MB 0% | bookstack:91/512MB 0%
17:40:26Z used=3638MB avail=458MB load1=1.82 cpu=33% immich-server:584/3072MB 1% | paperless-webserver:426/1280MB 0% | mealie:172/1000MB 0% | felhom-controller:149/4096MB 5% | immich-machine-learning:128/2048MB 0% | nextcloud:104/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:87/512MB 0%
17:40:56Z used=3638MB avail=458MB load1=1.37 cpu=22% immich-server:584/3072MB 1% | paperless-webserver:426/1280MB 0% | mealie:172/1000MB 0% | felhom-controller:149/4096MB 5% | immich-machine-learning:128/2048MB 0% | nextcloud:104/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:87/512MB 0%
17:41:26Z used=3638MB avail=458MB load1=1.09 cpu=32% immich-server:584/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:250/1000MB 0% | felhom-controller:152/4096MB 17% | immich-machine-learning:129/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:41:56Z used=3638MB avail=458MB load1=0.8 cpu=29% immich-server:584/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:250/1000MB 0% | felhom-controller:152/4096MB 17% | immich-machine-learning:129/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:42:26Z used=3638MB avail=458MB load1=0.84 cpu=29% immich-server:585/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:206/1000MB 0% | felhom-controller:153/4096MB 20% | immich-machine-learning:129/2048MB 0% | nextcloud:119/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:42:56Z used=3638MB avail=458MB load1=0.58 cpu=9% immich-server:585/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:206/1000MB 0% | felhom-controller:153/4096MB 20% | immich-machine-learning:129/2048MB 0% | nextcloud:119/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:43:27Z used=3638MB avail=458MB load1=0.43 cpu=30% immich-server:585/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:154/4096MB 1% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 5%
17:43:57Z used=3638MB avail=458MB load1=0.48 cpu=9% immich-server:585/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:154/4096MB 1% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 5%
17:44:27Z used=3638MB avail=458MB load1=0.65 cpu=31% immich-server:586/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:152/4096MB 1% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 5%
17:44:57Z used=3638MB avail=458MB load1=0.45 cpu=9% immich-server:586/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:152/4096MB 1% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 5%
17:45:27Z used=3638MB avail=458MB load1=0.35 cpu=30% immich-server:586/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:152/4096MB 0% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:45:57Z used=3638MB avail=458MB load1=0.29 cpu=20% immich-server:586/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:152/4096MB 0% | immich-machine-learning:129/2048MB 0% | nextcloud:117/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:46:27Z used=3638MB avail=458MB load1=0.5 cpu=30% immich-server:592/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:154/4096MB 3% | immich-machine-learning:129/2048MB 0% | nextcloud:119/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:46:57Z used=3638MB avail=458MB load1=0.43 cpu=10% immich-server:592/3072MB 0% | paperless-webserver:427/1280MB 0% | mealie:220/1000MB 0% | felhom-controller:154/4096MB 3% | immich-machine-learning:129/2048MB 0% | nextcloud:119/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:47:28Z used=3638MB avail=458MB load1=0.58 cpu=30% immich-server:598/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:154/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 6% | nextcloud-db:89/512MB 0%
17:47:58Z used=3638MB avail=458MB load1=0.48 cpu=15% immich-server:598/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:154/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 6% | nextcloud-db:89/512MB 0%
17:48:28Z used=3638MB avail=458MB load1=1.9 cpu=33% immich-server:599/3072MB 0% | paperless-webserver:427/1280MB 0% | felhom-controller:316/4096MB 154% | mealie:225/1000MB 0% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 6% | nextcloud-db:89/512MB 0%
17:48:58Z used=3638MB avail=458MB load1=1.44 cpu=9% immich-server:599/3072MB 0% | paperless-webserver:427/1280MB 0% | felhom-controller:316/4096MB 154% | mealie:225/1000MB 0% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 6% | nextcloud-db:89/512MB 0%
17:49:28Z used=3638MB avail=458MB load1=1.4 cpu=45% immich-server:599/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:156/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 5% | nextcloud-db:89/512MB 0%
17:49:58Z used=3638MB avail=458MB load1=1.13 cpu=9% immich-server:599/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:156/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 5% | nextcloud-db:89/512MB 0%
17:50:28Z used=3638MB avail=458MB load1=0.93 cpu=33% immich-server:600/3072MB 1% | paperless-webserver:427/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:196/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:50:58Z used=3638MB avail=458MB load1=0.7 cpu=20% immich-server:600/3072MB 1% | paperless-webserver:427/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:196/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:51:28Z used=3638MB avail=458MB load1=0.56 cpu=32% immich-server:673/3072MB 63% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:192/4096MB 77% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:51:59Z used=3638MB avail=458MB load1=0.48 cpu=10% immich-server:673/3072MB 63% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:192/4096MB 77% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:91/256MB 0% | nextcloud-db:89/512MB 0%
17:52:29Z used=3638MB avail=458MB load1=0.48 cpu=34% immich-server:641/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:89/512MB 0%
17:52:59Z used=3638MB avail=458MB load1=0.55 cpu=9% immich-server:641/3072MB 0% | paperless-webserver:428/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:89/512MB 0%
17:53:29Z used=3638MB avail=458MB load1=0.47 cpu=31% immich-server:641/3072MB 1% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 0% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:89/512MB 0%
17:53:59Z used=3638MB avail=458MB load1=0.67 cpu=20% immich-server:641/3072MB 1% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 0% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:89/512MB 0%
17:54:29Z used=3638MB avail=458MB load1=0.92 cpu=32% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:54:59Z used=3638MB avail=458MB load1=0.67 cpu=10% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:55:29Z used=3638MB avail=458MB load1=0.49 cpu=49% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:55:59Z used=3638MB avail=458MB load1=0.5 cpu=22% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 1% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:56:30Z used=3638MB avail=458MB load1=0.77 cpu=37% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 22% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:57:00Z used=1240MB avail=2856MB load1=0.65 cpu=11% immich-server:641/3072MB 0% | paperless-webserver:429/1280MB 0% | mealie:225/1000MB 0% | felhom-controller:168/4096MB 22% | immich-machine-learning:130/2048MB 0% | nextcloud:121/1024MB 0% | bookstack-db:92/256MB 0% | nextcloud-db:90/512MB 0%
17:57:30Z used=640MB avail=3456MB load1=0.67 cpu=29% mealie:225/1000MB 0% | felhom-controller:160/4096MB 1% | bookstack-db:93/256MB 0% | traefik:71/4096MB 0% | actualbudget:65/256MB 9% | bookstack:50/512MB 0% | felhom-samba:36/4096MB 0% | filebrowser:35/256MB 0%
17:58:00Z used=640MB avail=3456MB load1=0.59 cpu=8% mealie:225/1000MB 0% | felhom-controller:160/4096MB 1% | bookstack-db:93/256MB 0% | traefik:71/4096MB 0% | actualbudget:65/256MB 9% | bookstack:50/512MB 0% | felhom-samba:36/4096MB 0% | filebrowser:35/256MB 0%
17:58:30Z used=640MB avail=3456MB load1=0.5 cpu=29% mealie:225/1000MB 0% | felhom-controller:161/4096MB 1% | bookstack-db:93/256MB 0% | traefik:72/4096MB 0% | actualbudget:65/256MB 8% | bookstack:50/512MB 0% | felhom-samba:36/4096MB 0% | filebrowser:36/256MB 0%
17:59:00Z used=640MB avail=3456MB load1=0.36 cpu=8% mealie:225/1000MB 0% | felhom-controller:161/4096MB 1% | bookstack-db:93/256MB 0% | traefik:72/4096MB 0% | actualbudget:65/256MB 8% | bookstack:50/512MB 0% | felhom-samba:36/4096MB 0% | filebrowser:36/256MB 0%
17:59:30Z used=640MB avail=3456MB load1=0.35 cpu=30% mealie:225/1000MB 0% | felhom-controller:161/4096MB 0% | bookstack-db:93/256MB 0% | traefik:71/4096MB 1% | actualbudget:70/256MB 8% | bookstack:50/512MB 0% | filebrowser:36/256MB 0% | felhom-samba:36/4096MB 0%
18:00:00Z used=640MB avail=3456MB load1=0.52 cpu=8% mealie:225/1000MB 0% | felhom-controller:161/4096MB 0% | bookstack-db:93/256MB 0% | traefik:71/4096MB 1% | actualbudget:70/256MB 8% | bookstack:50/512MB 0% | filebrowser:36/256MB 0% | felhom-samba:36/4096MB 0%
18:00:30Z used=3638MB avail=458MB load1=1.51 cpu=65% immich-machine-learning:407/2048MB 0% | mealie:225/1000MB 0% | felhom-controller:183/4096MB 16% | immich-server:174/3072MB 97% | nextcloud-db:111/512MB 18% | bookstack-db:93/256MB 0% | actualbudget:80/256MB 8% | traefik:71/4096MB 0%
18:01:01Z used=3638MB avail=458MB load1=2.16 cpu=79% immich-machine-learning:407/2048MB 0% | mealie:225/1000MB 0% | felhom-controller:183/4096MB 16% | immich-server:174/3072MB 97% | nextcloud-db:111/512MB 18% | bookstack-db:93/256MB 0% | actualbudget:80/256MB 8% | traefik:71/4096MB 0%
18:01:31Z used=3638MB avail=458MB load1=1.66 cpu=9% immich-server:936/3072MB 0% | paperless-webserver:532/1280MB 0% | mealie:200/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud-db:106/512MB 0% | actualbudget:103/256MB 0% | immich-postgres:82/768MB 0% | traefik:79/4096MB 3%
18:02:01Z used=3638MB avail=458MB load1=1.3 cpu=7% immich-server:936/3072MB 0% | paperless-webserver:532/1280MB 0% | mealie:200/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud-db:106/512MB 0% | actualbudget:103/256MB 0% | immich-postgres:82/768MB 0% | traefik:79/4096MB 3%
18:02:31Z used=3638MB avail=458MB load1=0.93 cpu=10% immich-server:750/3072MB 0% | paperless-webserver:536/1280MB 0% | mealie:211/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud-db:104/512MB 0% | felhom-controller:86/4096MB 0% | immich-postgres:84/768MB 0% | traefik:79/4096MB 0%
18:03:01Z used=3638MB avail=458MB load1=0.76 cpu=22% immich-server:750/3072MB 0% | paperless-webserver:536/1280MB 0% | mealie:211/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud-db:104/512MB 0% | felhom-controller:86/4096MB 0% | immich-postgres:84/768MB 0% | traefik:79/4096MB 0%
18:03:31Z used=3638MB avail=458MB load1=0.74 cpu=12% immich-server:752/3072MB 0% | paperless-webserver:536/1280MB 0% | mealie:211/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud:113/1024MB 2% | nextcloud-db:110/512MB 0% | felhom-controller:89/4096MB 0% | immich-postgres:84/768MB 0%
18:04:01Z used=1240MB avail=2856MB load1=0.74 cpu=24% immich-server:752/3072MB 0% | paperless-webserver:536/1280MB 0% | mealie:211/1000MB 0% | immich-machine-learning:172/2048MB 0% | nextcloud:113/1024MB 2% | nextcloud-db:110/512MB 0% | felhom-controller:89/4096MB 0% | immich-postgres:84/768MB 0%
18:04:31Z used=640MB avail=3456MB load1=0.66 cpu=13% mealie:212/1000MB 0% | traefik:96/4096MB 0% | felhom-controller:83/4096MB 1% | bookstack-db:63/256MB 0% | bookstack:53/512MB 0% | vaultwarden:44/256MB 0% | filebrowser:44/256MB 0% | actualbudget:41/256MB 0%
18:05:02Z used=640MB avail=3456MB load1=0.45 cpu=4% mealie:212/1000MB 0% | traefik:96/4096MB 0% | felhom-controller:83/4096MB 1% | bookstack-db:63/256MB 0% | bookstack:53/512MB 0% | vaultwarden:44/256MB 0% | filebrowser:44/256MB 0% | actualbudget:41/256MB 0%
18:05:32Z used=2688MB avail=1408MB load1=0.64 cpu=19% mealie:212/1000MB 0% | traefik:95/4096MB 0% | felhom-controller:83/4096MB 0% | bookstack-db:63/256MB 0% | bookstack:53/512MB 0% | vaultwarden:44/256MB 0% | filebrowser:44/256MB 0% | actualbudget:41/256MB 0%
18:06:02Z used=3638MB avail=458MB load1=1.53 cpu=31% mealie:212/1000MB 0% | traefik:95/4096MB 0% | felhom-controller:83/4096MB 0% | bookstack-db:63/256MB 0% | bookstack:53/512MB 0% | vaultwarden:44/256MB 0% | filebrowser:44/256MB 0% | actualbudget:41/256MB 0%
18:06:32Z used=3638MB avail=458MB load1=2.27 cpu=82% immich-server:1089/3072MB 0% | immich-machine-learning:271/2048MB 0% | mealie:212/1000MB 0% | paperless-webserver:143/1280MB 102% | nextcloud-db:119/512MB 0% | felhom-controller:112/4096MB 85% | immich-postgres:97/768MB 0% | traefik:95/4096MB 3%
18:07:02Z used=3638MB avail=458MB load1=1.75 cpu=9% immich-server:1089/3072MB 0% | immich-machine-learning:271/2048MB 0% | mealie:212/1000MB 0% | paperless-webserver:143/1280MB 102% | nextcloud-db:119/512MB 0% | felhom-controller:112/4096MB 85% | imm
@@ -0,0 +1,16 @@
14:23:57
15:20:50Z nextcloud rclone rc=1
2026/10/20 14:23:59 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
2026/10/20 14:23:59 NOTICE: Csalad/Kulonleges_nevek/link_a_nagy_fajlra: Can't follow symlink without -L/--copy-links
2026/10/20 14:24:00 NOTICE: Csalad/Kulonleges_nevek/Ödön születésnapja – fénykép lista.txt: Duplicate object found in source - ignoring
2026/10/20 14:24:04 ERROR : Csalad/nagy_fajl_1_5GB.bin: Failed to copy: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2026/10/20 15:20:25 ERROR : Attempt 1/3 failed with 1 errors and: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2026/10/20 15:20:26 NOTICE: Csalad/Kulonleges_nevek/link_a_nagy_fajlra: Can't follow symlink without -L/--copy-links
2026/10/20 15:20:27 NOTICE: Csalad/Kulonleges_nevek/Ödön születésnapja – fénykép lista.txt: Duplicate object found in source - ignoring
2026/10/20 15:20:34 ERROR : Csalad/nagy_fajl_1_5GB.bin: Failed to copy: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2026/10/20 15:20:38 ERROR : Attempt 2/3 failed with 1 errors and: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2026/10/20 15:20:39 NOTICE: Csalad/Kulonleges_nevek/link_a_nagy_fajlra: Can't follow symlink without -L/--copy-links
2026/10/20 15:20:40 NOTICE: Csalad/Kulonleges_nevek/Ödön születésnapja – fénykép lista.txt: Duplicate object found in source - ignoring
2026/10/20 15:20:45 ERROR : Csalad/nagy_fajl_1_5GB.bin: Failed to copy: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2026/10/20 15:20:50 ERROR : Attempt 3/3 failed with 1 errors and: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
15:20:50
@@ -0,0 +1,7 @@
12:57:15
13:12:06Z nextcloud rclone rc=-15
2026/10/20 12:57:17 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
2026/10/20 12:57:18 NOTICE: Csalad/Kulonleges_nevek/link_a_nagy_fajlra: Can't follow symlink without -L/--copy-links
2026/10/20 12:57:18 NOTICE: Csalad/Kulonleges_nevek/Ödön születésnapja – fénykép lista.txt: Duplicate object found in source - ignoring
2026/10/20 12:57:27 ERROR : Csalad/nagy_fajl_1_5GB.bin: Failed to copy: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
13:12:06
@@ -0,0 +1,120 @@
14:23:58 diskread=4GB health=200 0.010208
14:24:30 diskread=4GB health=200 0.010427
14:25:01 diskread=4GB health=200 0.012785
14:25:32 diskread=4GB health=200 0.010109
14:26:04 diskread=4GB health=200 0.009754
14:26:35 diskread=4GB health=200 0.010561
14:27:06 diskread=4GB health=200 0.013033
14:27:37 diskread=4GB health=200 0.010545
14:28:09 diskread=4GB health=200 0.010882
14:28:40 diskread=4GB health=200 0.010998
14:29:11 diskread=4GB health=200 0.009735
14:29:42 diskread=4GB health=200 0.010706
14:30:14 diskread=4GB health=200 0.012557
14:30:45 diskread=4GB health=200 0.011448
14:31:16 diskread=4GB health=200 0.010879
14:31:47 diskread=4GB health=200 0.012360
14:32:19 diskread=4GB health=200 0.009276
14:32:50 diskread=4GB health=200 0.010233
14:33:22 diskread=4GB health=200 0.013962
14:33:53 diskread=4GB health=200 0.011101
14:34:24 diskread=4GB health=200 0.012738
14:34:55 diskread=4GB health=200 0.011132
14:35:27 diskread=4GB health=200 0.017582
14:35:58 diskread=4GB health=200 0.009786
14:36:30 diskread=4GB health=200 0.011178
14:37:01 diskread=4GB health=200 0.011017
14:37:32 diskread=4GB health=200 0.009835
14:38:03 diskread=4GB health=200 0.011396
14:38:35 diskread=4GB health=200 0.011475
14:39:06 diskread=4GB health=200 0.010567
14:39:37 diskread=4GB health=200 0.010764
14:40:09 diskread=4GB health=200 0.011841
14:40:40 diskread=4GB health=200 0.012188
14:41:11 diskread=4GB health=200 0.010514
14:41:42 diskread=4GB health=200 0.010198
14:42:14 diskread=4GB health=200 0.008837
14:42:45 diskread=4GB health=200 0.013116
14:43:16 diskread=4GB health=200 0.015796
14:43:48 diskread=4GB health=200 0.011376
14:44:19 diskread=4GB health=200 0.013047
14:44:51 diskread=4GB health=200 0.011553
14:45:22 diskread=4GB health=200 0.014702
14:45:53 diskread=4GB health=200 0.011081
14:46:24 diskread=4GB health=200 0.010798
14:46:56 diskread=5GB health=200 0.016907
14:47:27 diskread=5GB health=200 0.009167
14:47:59 diskread=5GB health=200 0.011809
14:48:30 diskread=5GB health=200 0.021601
14:49:01 diskread=5GB health=200 0.012060
14:49:33 diskread=5GB health=200 0.010723
14:50:04 diskread=5GB health=200 0.010155
14:50:35 diskread=5GB health=200 0.015786
14:51:07 diskread=5GB health=200 0.010058
14:51:38 diskread=5GB health=200 0.009848
14:52:09 diskread=5GB health=200 0.009929
14:52:41 diskread=5GB health=200 0.010351
14:53:12 diskread=5GB health=200 0.009107
14:53:43 diskread=5GB health=200 0.011299
14:54:14 diskread=5GB health=200 0.009412
14:54:46 diskread=5GB health=200 0.012795
14:55:17 diskread=5GB health=200 0.010044
14:55:48 diskread=5GB health=200 0.011059
14:56:20 diskread=5GB health=200 0.013508
14:56:51 diskread=5GB health=200 0.013017
14:57:23 diskread=5GB health=200 0.011061
14:57:54 diskread=5GB health=200 0.010914
14:58:25 diskread=5GB health=200 0.010145
14:58:57 diskread=5GB health=200 0.010722
14:59:28 diskread=5GB health=200 0.015195
14:59:59 diskread=5GB health=200 0.011767
15:00:31 diskread=5GB health=200 0.011621
15:01:02 diskread=5GB health=200 0.010509
15:01:33 diskread=5GB health=200 0.010722
15:02:04 diskread=5GB health=200 0.009856
15:02:36 diskread=5GB health=200 0.010521
15:03:07 diskread=5GB health=200 0.013668
15:03:38 diskread=5GB health=200 0.012826
15:04:10 diskread=5GB health=200 0.011463
15:04:41 diskread=5GB health=200 0.011157
15:05:12 diskread=5GB health=200 0.010431
15:05:43 diskread=5GB health=200 0.010361
15:06:15 diskread=5GB health=200 0.011914
15:06:46 diskread=5GB health=200 0.021984
15:07:17 diskread=5GB health=200 0.013204
15:07:49 diskread=5GB health=200 0.010710
15:08:20 diskread=5GB health=200 0.009754
15:08:51 diskread=5GB health=200 0.011999
15:09:23 diskread=5GB health=200 0.010382
15:09:54 diskread=5GB health=200 0.011156
15:10:25 diskread=5GB health=200 0.010280
15:10:57 diskread=5GB health=200 0.011247
15:11:28 diskread=5GB health=200 0.010959
15:11:59 diskread=5GB health=200 0.009834
15:12:31 diskread=5GB health=200 0.013080
15:13:02 diskread=5GB health=200 0.010975
15:13:33 diskread=5GB health=200 0.009572
15:14:04 diskread=5GB health=200 0.010632
15:14:36 diskread=5GB health=200 0.011168
15:15:07 diskread=5GB health=200 0.011665
15:15:38 diskread=5GB health=200 0.009601
15:16:09 diskread=5GB health=200 0.010077
15:16:41 diskread=5GB health=200 0.011031
15:17:12 diskread=5GB health=200 0.009288
15:17:43 diskread=5GB health=200 0.017476
15:18:15 diskread=5GB health=200 0.013927
15:18:46 diskread=5GB health=200 0.011434
15:19:17 diskread=5GB health=200 0.009776
15:19:48 diskread=5GB health=200 0.010952
15:20:20 diskread=5GB health=200 0.011278
15:20:51 diskread=5GB health=200 0.010643
15:21:23 diskread=5GB health=200 0.011549
15:21:54 diskread=5GB health=200 0.009613
15:22:26 diskread=5GB health=200 0.011846
15:22:58 diskread=5GB health=200 0.011471
15:23:29 diskread=5GB health=200 0.010358
15:24:01 diskread=5GB health=200 0.011769
15:24:32 diskread=5GB health=200 0.011816
15:25:03 diskread=5GB health=200 0.010058
15:25:34 diskread=5GB health=200 0.011328
15:26:06 diskread=5GB health=200 0.010774
@@ -0,0 +1,6 @@
diskread: 483315769272
diskwrite: 47257374720
mem: 7075991552
memhost: 8218480640
netin: 4738753971
netout: 916386350
@@ -0,0 +1,16 @@
# DST — what each scheduler does on Sunday 2026-10-25 (03:00 CEST → 02:00 CET), read from code and replayed
No architecture document mentions DST (`07` has no hit for DST, daylight or timezone — checked again 2026-10-20 with
ASCII fragments `DST`, `daylight`, `time.?zone`, `ora.?allit`; positive control: `Europe/Budapest` is found in 07).
| scheduler | 2026-10-25 | 2027-03-28 (spring) | how known |
|---|---|---|---|
| controller `sched.Daily` (db-dump W, second copy W+60, off-site W+105, fill-watch, metrics, asset-sync, abandon-sweep, proof, integrity) | **once each**; a 02:xx time runs at the SECOND (CET) occurrence | a 02:xx time runs at 03:xx CEST — **the default 02:30 dump lands on 03:30, the same instant as the 03:30 second-drive copy** | PRODUCTION `nextDailyRunAt` replayed (`replay.txt`) |
| hub `scheduleDaily` (db-snapshot 02:00, prune 04:30, deadline-check 05:00, key-audit 07:10) | **TWICE** — e.g. the alarm check at 04:00 CET and 05:00 CET | once each, one hour late | the hub's arithmetic replayed (`../../../dataloss-hunt-2026-10-20/C3-T9-hub-dst/replay.txt`) → **R-1183** |
| agent (whole-guest due, restore-test, OS leg, cap) | unaffected (UTC durations) | unaffected | code read (C1 reviewer 4) |
| controller quiesce gate [W+2h, W+6h) by wall minute | 04:30–08:30 CET for W = 02:30 (4 h real) | 04:30–08:30 CEST | code read |
| host timers on a household box | monotonic only | monotonic only | code read |
| DooPlex timers | Oct 25 is a Sunday: both weekly restore tests run on the DST day; the 02:30 hub-db-backup timer is inside the repeated hour — not verified | — | code read |
The live check of the box itself (B6 #7: the rehearsal VM's clock set to 2026-10-25 01:30 CEST and run to 04:00 CET)
is recorded separately when it runs.
@@ -0,0 +1,25 @@
# controller 7ca59e2 (v0.336.0) scheduler.nextDailyRunAt replayed; go version go1.27.2 linux/amd64; 2026-10-20T11:06:36Z
=== RUN TestRehearsalDST_ControllerDailyTimes
zz_rehearsal_dst_test.go:24: 02:00: 10-25 02:00 CET(01:00Z) 10-26 02:00 CET(01:00Z) 10-27 02:00 CET(01:00Z)
zz_rehearsal_dst_test.go:24: 02:15: 10-25 02:15 CET(01:15Z) 10-26 02:15 CET(01:15Z) 10-27 02:15 CET(01:15Z)
zz_rehearsal_dst_test.go:24: 02:30: 10-25 02:30 CET(01:30Z) 10-26 02:30 CET(01:30Z) 10-27 02:30 CET(01:30Z)
zz_rehearsal_dst_test.go:24: 02:59: 10-25 02:59 CET(01:59Z) 10-26 02:59 CET(01:59Z) 10-27 02:59 CET(01:59Z)
zz_rehearsal_dst_test.go:24: 03:00: 10-25 03:00 CET(02:00Z) 10-26 03:00 CET(02:00Z) 10-27 03:00 CET(02:00Z)
zz_rehearsal_dst_test.go:24: 03:30: 10-25 03:30 CET(02:30Z) 10-26 03:30 CET(02:30Z) 10-27 03:30 CET(02:30Z)
zz_rehearsal_dst_test.go:24: 04:15: 10-25 04:15 CET(03:15Z) 10-26 04:15 CET(03:15Z) 10-27 04:15 CET(03:15Z)
zz_rehearsal_dst_test.go:24: 05:30: 10-25 05:30 CET(04:30Z) 10-26 05:30 CET(04:30Z) 10-27 05:30 CET(04:30Z)
zz_rehearsal_dst_test.go:24: 06:00: 10-25 06:00 CET(05:00Z) 10-26 06:00 CET(05:00Z) 10-27 06:00 CET(05:00Z)
zz_rehearsal_dst_test.go:24: 22:00: 10-24 22:00 CEST(20:00Z) 10-25 22:00 CET(21:00Z) 10-26 22:00 CET(21:00Z)
zz_rehearsal_dst_test.go:24: 02:00: 03-28 03:00 CEST(01:00Z) 03-29 02:00 CEST(00:00Z) 03-30 02:00 CEST(00:00Z)
zz_rehearsal_dst_test.go:24: 02:15: 03-28 03:15 CEST(01:15Z) 03-29 02:15 CEST(00:15Z) 03-30 02:15 CEST(00:15Z)
zz_rehearsal_dst_test.go:24: 02:30: 03-28 03:30 CEST(01:30Z) 03-29 02:30 CEST(00:30Z) 03-30 02:30 CEST(00:30Z)
zz_rehearsal_dst_test.go:24: 02:59: 03-28 03:59 CEST(01:59Z) 03-29 02:59 CEST(00:59Z) 03-30 02:59 CEST(00:59Z)
zz_rehearsal_dst_test.go:24: 03:00: 03-28 03:00 CEST(01:00Z) 03-29 03:00 CEST(01:00Z) 03-30 03:00 CEST(01:00Z)
zz_rehearsal_dst_test.go:24: 03:30: 03-28 03:30 CEST(01:30Z) 03-29 03:30 CEST(01:30Z) 03-30 03:30 CEST(01:30Z)
zz_rehearsal_dst_test.go:24: 04:15: 03-28 04:15 CEST(02:15Z) 03-29 04:15 CEST(02:15Z) 03-30 04:15 CEST(02:15Z)
zz_rehearsal_dst_test.go:24: 05:30: 03-28 05:30 CEST(03:30Z) 03-29 05:30 CEST(03:30Z) 03-30 05:30 CEST(03:30Z)
zz_rehearsal_dst_test.go:24: 06:00: 03-28 06:00 CEST(04:00Z) 03-29 06:00 CEST(04:00Z) 03-30 06:00 CEST(04:00Z)
zz_rehearsal_dst_test.go:24: 22:00: 03-27 22:00 CET(21:00Z) 03-28 22:00 CEST(20:00Z) 03-29 22:00 CEST(20:00Z)
--- PASS: TestRehearsalDST_ControllerDailyTimes (0.00s)
PASS
ok gitea.dooplex.hu/admin/felhom-controller/internal/scheduler 0.004s
@@ -0,0 +1,27 @@
package scheduler
// THROWAWAY replay for the 2026-10-20 rehearsal (B6 #7, DST) — never committed. Replays the PRODUCTION
// nextDailyRunAt over the two DST changes for every controller daily time; the loop re-reads the clock at each
// fire instant exactly as the scheduler does.
import (
"testing"
"time"
)
func TestRehearsalDST_ControllerDailyTimes(t *testing.T) {
loc := getBudapestLocation()
for _, win := range []struct{ from, to time.Time }{
{time.Date(2026, 10, 24, 12, 0, 0, 0, loc), time.Date(2026, 10, 26, 12, 0, 0, 0, loc)},
{time.Date(2027, 3, 27, 12, 0, 0, 0, loc), time.Date(2027, 3, 29, 12, 0, 0, 0, loc)},
} {
for _, hm := range []string{"02:00", "02:15", "02:30", "02:59", "03:00", "03:30", "04:15", "05:30", "06:00", "22:00"} {
now, line := win.from, ""
for now.Before(win.to) {
next := nextDailyRunAt(hm, now)
line += " " + next.In(loc).Format("01-02 15:04 MST") + "(" + next.UTC().Format("15:04Z") + ")"
now = next
}
t.Logf("%s:%s", hm, line)
}
}
}

Some files were not shown because too many files have changed in this diff Show More