Files
felhom.eu/REPORT-break-the-circle-2026-10-09.md
T
admin a05345eeb6
gates / gates (push) Successful in 5m55s
R-924: live run + restore test evidence; STATUS and report
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-09 15:02:37 +02:00

5.2 KiB

REPORT — break the circle: the password manager off-site, every recovery key listed, one sheet to print (2026-10-09)

Part What Result
A Vaultwarden's data in the nightly off-site copy DONE, LIVE (operator yes in chat) — run by hand, restore test, throwaway start
B Recovery-key inventory + printable sheet + paper walk DONE — runbooks/total-loss-of-dooplex.md, runbooks/break-glass-sheet.md
C R-922 A, a quiet restored hub, R-921 BUILT, committed, NOT released (hub + controller); R-921 partly

Register: before 135 · after 138 · opened 2 (R-923, R-924) · closed 0. A parallel session added R-925 meanwhile.

Rulings recorded first: (1) the operator's finding → R-923 (P2); "off DooPlex" corrected in the hub-DB runbook (Step 0 and §3), gitea-restore.md, secrets.md, STATUS; (2) R-922 → option A, recorded in the row.

Part A — Vaultwarden (vaultwarden-system, 1.37.3, 7.4 MB)

  • Method: Vaultwarden's own vaultwarden backup (SQLite VACUUM INTO, consistent while it runs; its backup guidance), plus rsa_key.pem and — when present — attachments/, sends/, config.json. The one backup file it writes into /data is copied out and removed (also on refusal). Same archive, key and write-only token as Gitea.
  • Live: first run 2026-10-09T10:02Z: vaultwarden: integrity ok, 1 user(s), pushed in 13 s; /data clean after.
  • Restore test (Sunday job, run by hand): 27 969 files match, 10 repos pass git fsck, Vaultwarden 1 user(s) / 797 item(s).
  • Throwaway (bench 9401): row counts only — users 1, ciphers 797, folders 5, twofactor 0, sso_users 1; a Vaultwarden 1.37.3 started on the copy, /alive 200, no route out. Deleted (0 containers, 0 volumes, bench stopped); DooPlex scratch shredded. No login, no item opened, the master password never asked for.
  • Tests: 26 (6 new), green with GNU, BusyBox and the fake sqlite3; 4 red-proofs (audits/dooplex-survival-2026-10-09/vaultwarden/). The tests found a defect before the live run (the optional-file listing failed when the last file was absent).
  • Seen, not changed: Vaultwarden warns its ADMIN_TOKEN is plain text (in R-923).

Part B — what a total loss needs

18 secrets/logins listed with where each lives today. Exists only on DooPlex (lost with it): S1 the DooPlex off-site key, S2 the hub-DB key (otherwise only in Vaultwarden, which is behind S1), S6 the signing keys (in no backup at all, no passphrase — R-924), S7 the restore token (re-mintable). Circles: S8 Hetzner and S11 Cloudflare logins if kept only in Vaultwarden. Checked: the nightly Secrets export opens with the DooPlex restic passphrase (S5) and holds all eight Secrets the hub uses (names only read). Paper walk: with a filled sheet and the master password, no Felhom recovery step needs DooPlex; without it, S1, S6 and S8 block.

Part C — code (waits for the next release)

  • Hub (d55c590c, e5b9151e, CI 1605 and 1606 success): R-922 A (email_cleared deletes the notification address; F12 guard kept); MAIL-HOLD (<data_dir>/MAIL-HOLD → no mail on any path, dropped not queued, banner, release button) — now step 1 of the hub restore runbook; two log lines no longer print the address; SECURITY: /preferences and /notify accepted any box's key for any household — now 403 (red-proved).
  • Controller (ec9b997, CI 1607 success): R-922 sends email_cleared after a household's clear; R-921 pre-check — no stop while another tier's job is in flight. Not covered: the agent's host-wide busy lock (the case measured on demo-hp) — no agent endpoint serves it; needs an agent field (R-921 LEFT).
  • Release order: hub first, then the controller (the controller sends a field an older hub ignores).
  • Built by two helpers under this brief's fences; reviewed, tested again and committed here. One stash of mine briefly held a helper's uncommitted work (about a minute; nothing lost).

Teardown

Machine: bench 9401 — 0 containers, 0 volumes, image removed, stopped as it was. Host: DooPlex scratch dirs shredded. Hub: provisioned nothing. Vaultwarden: its one test backup file removed by name.

Done after the report: R-924 option A (operator, 2026-10-09)

The three signing key files and their public halves ride the nightly copy (felhom.eu 96f68f1b, CI 1614 success). Live run 12:57Z: signing: 3 key(s) with their public halves, pushed in 22 s; restore test: 3 signing key(s) match (audits/dooplex-survival-2026-10-09/signing/). 4 new tests, 3 red-proofs. R-924 narrowed: left is printing them.

Decisions for the operator (as asked; 1 is answered — A)

  1. R-924 — the signing keys. (A) Print both on the sheet AND add them to the nightly encrypted copy (CC changes the DooPlex job with your yes). (B) Print only the recovery key and keep it away from home. Pick A. If you do nothing: after a loss of DooPlex no box accepts a signed update, bundle or OS step until it is re-enrolled on site.
  2. Print the sheet (runbooks/break-glass-sheet.md, commands at its top, run from your workstation). If you do nothing: the off-site copies exist but cannot be opened after a loss of DooPlex.