Night 2026-10-17: restore keeps the DB password (R-1106, 07 §7.4), restic 0.19.1, hardening; 8 rows closed, 7 filed; evidence
gates / gates (push) Successful in 6m57s

This commit is contained in:
2026-10-16 23:59:53 +02:00
parent 96e15c15ba
commit 5c36d4c110
39 changed files with 2250 additions and 23 deletions
@@ -46,7 +46,7 @@ for V in 0.14.0 0.18.1; do
$R -r $W/dmg check --read-data > $O/check-damaged.txt 2>&1; chmod -R u+w $W/dmg; rm -rf $W/dmg
done
# rewrite every local path to /data/x and the user/host names to neutral ones
for f in $W/out/*/*; do sed -i -e "s#$W#/data/x#g" -e "s#<scratch> \"]*#/data/x#g" -e 's/user/root/g' -e 's/dooplex/box/g' "$f"; done
for f in $W/out/*/*; do sed -i -e "s#$W#/data/x#g" -e "s#$S#/data/x#g" -e "s/$(id -un)/root/g" -e "s/$(hostname)/box/g" "$f"; done
mkdir -p $DEST; cp -r $W/out/* $DEST/
for V in 0.14.0 0.18.1; do echo "$V: $(ls $DEST/$V | wc -l) files, $(du -sh $DEST/$V | cut -f1)"; done
grep -rl "$S\|claude-1000\|user" $DEST && echo "LEAK" || echo "no local path left"
grep -rl "$S\|$(id -un)" $DEST && echo "LEAK" || echo "no local path left"
@@ -0,0 +1,107 @@
##### PATH A — off-site full restore after a reinstall
22:49:18 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:50:08 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
22:50:08 install rallly: True
22:50:08 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
22:50:08 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:51:29 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
22:51:29 install grimmory: True
22:51:33 seed rallly r1106-A: LINE 1: ...te varchar(80)); insert into r1106_marker values (r1106-A); ...
^
CREATE TABLE
22:51:33 check rallly: deployed=True state=running hold=None
22:51:36 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker\n ^' (want 'r1106-A' present)
22:51:39 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
22:51:43 app login to its DB (the app's own DATABASE_URL user): 1
22:51:46 front door: 301
22:51:49 seed grimmory r1106-A: --------------
ERROR 1054 (42S22) at line 1: Unknown column 'r1106' in 'VALUES'
22:51:52 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
22:51:53 check grimmory: deployed=True state=running hold=None
22:51:56 marker row: '' (want 'r1106-A' present)
22:51:59 root login (the product's dump user): 1
22:52:03 app user login (the app's own DB user): 1
22:52:06 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T22:52:05.285639702","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T22:52:05.28566
22:52:09 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
22:52:09 off-site before: status=ok last_run=2026-10-16T18:48:30Z snapshots=202
22:52:09 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
22:52:09 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
22:54:47 + 157.4s ('running', '', 'plex', 0) files 0/0 bytes /
22:54:50 + 160.4s ('running', '', 'prowlarr', 0) files 0/0 bytes /
22:54:53 + 163.4s ('running', '', 'radarr', 0) files 0/0 bytes /
22:54:56 + 166.5s ('running', '', 'romm', 100) files 8/10 bytes 187.9 MB/187.9 MB
22:54:59 + 169.5s ('running', '', 'sonarr', 91) files 3/4 bytes 11.1 KB/12.2 KB
22:55:02 + 172.5s ('running', '', 'privatebin', 0) files 0/0 bytes /
22:55:05 + 175.6s ('running', '', 'rallly', 0) files 0/0 bytes /
22:55:08 + 178.6s ('running', '', 'rallly', 100) files 7/7 bytes 50.1 MB/50.1 MB
22:55:14 + 184.7s ('running', '', 'grimmory', 0) files 0/0 bytes /
22:55:17 + 187.7s ('running', '', 'grimmory', 100) files 8/8 bytes 156.7 MB/156.7 MB
22:55:20 + 190.7s ('running', '', 'bookstack', 100) files 11/11 bytes 160.7 MB/160.7 MB
22:55:23 + 193.7s ('running', '', 'home-assistant', 0) files 0/0 bytes /
22:55:26 + 196.8s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.5 MB/12.5 MB
22:55:29 + 199.8s ('running', '', 'paperless-ngx', 0) files 0/0 bytes /
22:55:32 + 202.8s ('running', '', 'paperless-ngx', 100) files 74/74 bytes 154.1 MB/154.1 MB
22:55:35 + 205.8s ('running', '', 'docmost', 0) files 0/0 bytes /
22:55:38 + 208.9s ('running', '', 'kimai', 100) files 10/10 bytes 173.0 MB/173.0 MB
22:55:41 + 211.9s ('running', 'retention', '', 0) files 0/0 bytes /
22:55:47 + 217.9s ('ok', '', '', 0) files 0/0 bytes /
22:55:47 off-site after: status=ok last_run=2026-10-16T20:55:46Z duration=3m31s snapshots=218 size=653.5 MB error=''
22:56:30 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
22:57:04 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
22:57:07 household deletes the books-folder files: 1
22:57:08 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:57:58 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
22:57:58 install rallly: True
22:57:58 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
22:57:58 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:59:29 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
22:59:29 install grimmory: True
## negative control after the reinstall
22:59:29 check rallly: deployed=True state=running hold=None
22:59:33 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker\n ^' (want 'r1106-A' present)
22:59:36 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
22:59:39 app login to its DB (the app's own DATABASE_URL user): 1
22:59:42 front door: 301
22:59:43 check grimmory: deployed=True state=running hold=None
22:59:46 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-A' present)
22:59:49 root login (the product's dump user): 1
22:59:53 app user login (the app's own DB user): 1
22:59:56 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T22:59:55.464371994","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T22:59:55.46441
22:59:59 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt: No such file or directory
23:00:03 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=rallly&full_prep=rallly&full_size=50.1+MB
23:00:03 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
23:00:03 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:00:12 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:00:12 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-16T21:00:03.606006931Z", "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/hdd_1/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:00:11.039016046Z"}, "last_recent": true}
23:00:12 POST /backup/offbox/reconstitute {'app': 'rallly', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
23:00:12 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:00:43 + 30.3s restore-status (False, 'offbox-reconstitute', None, '')
23:00:43 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-16T21:00:12.737270741Z", "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. 16. 22:52) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:00:41.713460862Z"}, "last_recent": true}
23:00:46 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=grimmory&full_prep=grimmory&full_size=156.7+MB
23:00:46 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.restore_started
23:00:46 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:00:55 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:00:55 {"running": false, "op": "offbox-restore", "stack": "grimmory", "started_at": "2026-10-16T21:00:46.868233201Z", "last": {"op": "offbox-restore", "stack": "grimmory", "ok": true, "message": "A(z) grimmory teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/hdd_1/backups/offsite-restore/grimmory — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:00:55.045276695Z"}, "last_recent": true}
23:00:55 POST /backup/offbox/reconstitute {'app': 'grimmory', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.full_restore_started
23:00:56 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:01:50 + 54.5s restore-status (False, 'offbox-reconstitute', None, '')
23:01:50 {"running": false, "op": "offbox-reconstitute", "stack": "grimmory", "started_at": "2026-10-16T21:00:55.98356812Z", "last": {"op": "offbox-reconstitute", "stack": "grimmory", "ok": true, "message": "A(z) grimmory: 1 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 16. 22:52) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:01:48.947953301Z"}, "last_recent": true}
## after the off-site restore
23:02:50 check rallly: deployed=True state=running hold=None
23:02:54 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-A' present)
23:02:57 rallly log auth errors (10 min) / status: 0 | Up | 2 | minutes | (healthy)
23:03:00 app login to its DB (the app's own DATABASE_URL user): 1
23:03:03 front door: 301
23:03:04 check grimmory: deployed=True state=running hold=None
23:03:07 marker row: '' (want 'r1106-A' present)
23:03:10 root login (the product's dump user): 1
23:03:14 app user login (the app's own DB user): 1
23:03:17 app health: Up 2 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:03:16.428599078","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:03:16.42862
23:03:20 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
@@ -0,0 +1,95 @@
##### PATH A2 — off-site full restore after a reinstall (seed fixed)
23:12:31 seed rallly r1106-A2: CREATE TABLE
INSERT 0 1
r1106-A2
23:12:31 check rallly: deployed=True state=running hold=None
23:12:34 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:12:37 rallly log auth errors (10 min) / status: 0 | Up | 12 | minutes | (healthy)
23:12:41 app login to its DB (the app's own DATABASE_URL user): 1
23:12:44 front door: 301
23:12:48 seed grimmory r1106-A2: r1106-A2
23:12:51 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
23:12:51 check grimmory: deployed=True state=running hold=None
23:12:54 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:12:58 root login (the product's dump user): 1
23:13:01 app user login (the app's own DB user): 1
23:13:04 app health: Up 11 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:13:03.583521678","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:13:03.58356
23:13:07 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
23:13:07 off-site before: status=ok last_run=2026-10-16T20:55:46Z snapshots=218
23:13:07 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:13:07 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:15:42 + 154.3s ('running', '', 'romm', 0) files 0/0 bytes /
23:15:45 + 157.4s ('running', '', 'sonarr', 0) files 0/0 bytes /
23:15:48 + 160.4s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:15:51 + 163.4s ('running', '', 'rallly', 0) files 0/0 bytes /
23:15:54 + 166.4s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:15:57 + 169.5s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:16:00 + 172.5s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:16:03 + 175.5s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.6 MB/12.6 MB
23:16:06 + 178.5s ('running', '', 'paperless-ngx', 0) files 0/0 bytes /
23:16:09 + 181.6s ('running', '', 'docmost', 0) files 0/0 bytes /
23:16:12 + 184.6s ('running', '', 'kimai', 0) files 0/0 bytes /
23:16:15 + 187.6s ('running', '', 'plex', 0) files 0/0 bytes /
23:16:18 + 190.6s ('running', 'retention', '', 0) files 0/0 bytes /
23:16:24 + 196.7s ('ok', '', '', 0) files 0/0 bytes /
23:16:24 off-site after: status=ok last_run=2026-10-16T21:16:23Z duration=3m12s snapshots=234 size=670.9 MB error=''
23:17:07 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
23:17:41 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
23:17:45 household deletes the books-folder files: 2
23:17:45 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:18:35 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
23:18:35 install rallly: True
23:18:35 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:18:36 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:19:56 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:19:56 install grimmory: True
## A2 negative control after the reinstall
23:19:56 check rallly: deployed=True state=running hold=None
23:20:00 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-A2' present)
23:20:03 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:20:06 app login to its DB (the app's own DATABASE_URL user): 1
23:20:10 front door: 301
23:20:10 check grimmory: deployed=True state=running hold=None
23:20:13 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-A2' present)
23:20:16 root login (the product's dump user): 1
23:20:20 app user login (the app's own DB user): 1
23:20:23 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:20:22.859735764","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:20:22.85975
23:20:26 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt: No such file or directory
23:20:30 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=rallly&full_prep=rallly&full_size=66.9+MB
23:20:30 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
23:20:30 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:20:39 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:20:39 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-16T21:20:30.883566825Z", "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/hdd_1/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:20:38.696061676Z"}, "last_recent": true}
23:20:40 POST /backup/offbox/reconstitute {'app': 'rallly', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
23:20:40 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:21:10 + 30.3s restore-status (False, 'offbox-reconstitute', None, '')
23:21:10 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-16T21:20:40.00486394Z", "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. 16. 23:13) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:21:09.345344912Z"}, "last_recent": true}
23:21:14 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=grimmory&full_prep=grimmory&full_size=156.8+MB
23:21:14 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.restore_started
23:21:14 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:21:23 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:21:23 {"running": false, "op": "offbox-restore", "stack": "grimmory", "started_at": "2026-10-16T21:21:14.156589916Z", "last": {"op": "offbox-restore", "stack": "grimmory", "ok": true, "message": "A(z) grimmory teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/hdd_1/backups/offsite-restore/grimmory — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:21:22.333018655Z"}, "last_recent": true}
23:21:23 POST /backup/offbox/reconstitute {'app': 'grimmory', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.full_restore_started
23:21:23 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:22:17 + 54.5s restore-status (False, 'offbox-reconstitute', None, '')
23:22:17 {"running": false, "op": "offbox-reconstitute", "stack": "grimmory", "started_at": "2026-10-16T21:21:23.276103566Z", "last": {"op": "offbox-reconstitute", "stack": "grimmory", "ok": true, "message": "A(z) grimmory: 2 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 16. 23:13) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:22:15.633221727Z"}, "last_recent": true}
## A2 after the off-site restore
23:23:02 check rallly: deployed=True state=running hold=None
23:23:07 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:23:10 rallly log auth errors (10 min) / status: 0 | Up | 2 | minutes | (healthy)
23:23:14 app login to its DB (the app's own DATABASE_URL user): 1
23:23:18 front door: 301
23:23:18 check grimmory: deployed=True state=running hold=None
23:23:22 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:23:26 root login (the product's dump user): 1
23:23:30 app user login (the app's own DB user): 1
23:23:34 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:23:33.152578787","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:23:33.15260
23:23:38 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/night-restore-2026-10-17/tools/run_AB.sh: line 12: syntax error near unexpected token `)'
/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/night-restore-2026-10-17/tools/run_AB.sh: line 12: `echo "##### PATH B — on-box restore („Visszaállítás") after a reinstall"'
@@ -0,0 +1,79 @@
##### PATH B — on-box restore (Visszaallitas) after a reinstall
23:24:08 seed rallly r1106-B: INSERT 0 1
r1106-A2
r1106-B
23:24:13 seed grimmory r1106-B: r1106-A2
r1106-B
23:24:17 file: c90bc7913f76e3b72bd245b1f4f0b6c3b2be0a6de62bf95374eb47f62b9fb7cf /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt
23:24:17 off-site before: status=ok last_run=2026-10-16T21:16:23Z snapshots=234
23:24:17 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:24:17 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:27:10 + 172.5s ('running', '', 'opengist', 0) files 0/0 bytes /
23:27:13 + 175.6s ('running', '', 'docmost', 0) files 0/0 bytes /
23:27:16 + 178.6s ('running', '', 'kimai', 0) files 0/0 bytes /
23:27:19 + 181.6s ('running', '', 'plex', 0) files 0/0 bytes /
23:27:22 + 184.6s ('running', '', 'prowlarr', 100) files 4/4 bytes 9.1 KB/9.1 KB
23:27:25 + 187.7s ('running', '', 'romm', 0) files 0/0 bytes /
23:27:28 + 190.7s ('running', '', 'sonarr', 0) files 0/0 bytes /
23:27:31 + 193.7s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:27:34 + 196.8s ('running', '', 'rallly', 0) files 0/0 bytes /
23:27:37 + 199.8s ('running', '', 'rallly', 100) files 8/8 bytes 67.0 MB/67.0 MB
23:27:40 + 202.8s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:27:43 + 205.8s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:27:46 + 208.9s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:27:49 + 211.9s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:27:52 + 214.9s ('running', 'retention', '', 0) files 0/0 bytes /
23:27:58 + 221.0s ('ok', '', '', 0) files 0/0 bytes /
23:27:58 off-site after: status=ok last_run=2026-10-16T21:27:57Z duration=3m35s snapshots=250 size=687.5 MB error=''
23:28:41 remove rallly (keepbackups: remove_hdd_data=True, remove_backups=False) -> 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ü
23:29:15 remove grimmory (keepbackups: remove_hdd_data=True, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
23:29:19 household deletes the books-folder files: 3
23:29:20 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:30:15 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
23:30:15 install rallly: True
23:30:15 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:30:15 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:31:36 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:31:36 install grimmory: True
## B negative control after the reinstall
23:31:36 check rallly: deployed=True state=running hold=None
23:31:40 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-B' present)
23:31:43 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:31:46 app login to its DB (the app's own DATABASE_URL user): 1
23:31:50 front door: 301
23:31:50 check grimmory: deployed=True state=running hold=None
23:31:53 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-B' present)
23:31:56 root login (the product's dump user): 1
23:32:00 app user login (the app's own DB user): 1
23:32:03 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:32:02.311256259","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:32:02.31127
23:32:06 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt: No such file or directory
23:32:06 [R] restoring rallly from snapshot 'helyi' (of 1 offered)
23:32:06 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
23:32:06 + 0.0s restore (True, None, None)
23:32:34 + 28.3s restore (False, None, None)
23:32:34 [R] after restore: state=running hold=None phase=None
23:32:38 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash=flash.restore.started"], "seconds": 28.4}
23:32:38 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:32:06.602574836Z", "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-16T21:32:33.370797695Z"}, "last_recent": true}
23:32:38 [R] restoring grimmory from snapshot 'helyi' (of 1 offered)
23:33:18 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash_error=Ez+a+ment%C3%A9s+nem+tartalmazza+az+alkalmaz%C3%A1s+f%C3%A1jljait%2C+ez%C3%A9rt+nem+%C3%A1ll%C3%ADtjuk+vissza+az+adatb%C3%A1zist+f%C3%B6l%C3%A9j%C3%BCk+%E2%80%94+a+f%C3%A1jlok+%C3%ADgy+a+hely%C3%BCk%C3%B6n+maradnak.+A+f%C3%A1jlok+a+t%C3%A1voli+m%C3%A1solatb%C3%B3l+%C3%A1ll%C3%ADthat%C3%B3k+vissza%3A+Biztons%C3%A1gi+ment%C3%A9s+%E2%86%92+Vissza%C3%A1ll%C3%ADt%C3%A1s%2C+%E2%80%9ETeljes+vissza%C3%A1ll%C3%ADt%C3%A1s+%28f%C3%A1jlok+%2B+adatb%C3%A1zis%29%E2%80%9D.']
23:33:18 + 0.0s restore (False, None, None)
23:33:25 [R] after restore: state=running hold=None phase=None
23:33:28 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash_error=Ez+a+ment%C3%A9s+nem+tartalmazza+az+alkalmaz%C3%A1s+f%C3%A1jljait%2C+ez%C3%A9rt+nem+%C3%A1ll%C3%ADtjuk+vissza+az+adatb%C3%A1zist+f%C3%B6l%C3%A9j%C3%BCk+%E2%80%94+a+f%C3%A1jlok+%C3%ADgy+a+hely%C3%BCk%C3%B6n+maradnak.+A+f%C3%A1jlok+a+t%C3%A1voli+m%C3%A1solatb%C3%B3l+%C3%A1ll%C3%ADthat%C3%B3k+vissza%3A+Biztons%C3%A1gi+ment%C3%A9s+%E2%86%92+Vissza%C3%A1ll%C3%ADt%C3%A1s%2C+%E2%80%9ETeljes+vissza%C3%A1ll%C3%ADt%C3%A1s+%28f%C3%A1jlok+%2B+adatb%C3%A1zis%29%E2%80%9D."], "seconds": 6.1}
23:33:28 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:32:06.602574836Z", "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-16T21:32:33.370797695Z"}, "last_recent": true}
## B after the on-box restore
23:34:14 check rallly: deployed=True state=running hold=None
23:34:17 marker row: 'r1106-A2\nr1106-B' (want 'r1106-B' present)
23:34:21 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:34:24 app login to its DB (the app's own DATABASE_URL user): 1
23:34:27 front door: 301
23:34:27 check grimmory: deployed=True state=running hold=None
23:34:31 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-B' present)
23:34:34 root login (the product's dump user): 1
23:34:37 app user login (the app's own DB user): 1
23:34:41 app health: Up 3 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:34:39.959127823","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:34:39.95916
23:34:44 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt: No such file or directory
##### DONE
@@ -0,0 +1,18 @@
##### REFUSAL — a unit without the database password, over a newer install (rallly)
unit app.yaml now carries DB_PASSWORD: 0
deployed_at: "2026-10-16T21:32:19Z"
"dumps_at": "2026-10-16T21:24:17Z
23:35:13 [R] restoring rallly from snapshot 'helyi' (of 1 offered)
23:35:13 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
23:35:13 + 0.0s restore (False, None, None)
23:35:19 [R] after restore: state=running hold=None phase=None
23:35:22 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash=flash.restore.started"], "seconds": 6.1}
23:35:22 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:35:13.244020136Z", "last": {"op": "restore", "stack": "rallly", "ok": false, "message": "Visszaállítás sikertelen: Ezt a mentést nem lehet visszaállítani: nem tartalmazza az adatbázis jelszavát, és nélküle az alkalmazás nem tudna elindulni. A mostani telepítés érintetlen maradt.", "finished_at": "2026-10-16T21:35:13.253731205Z"}, "last_recent": true}
23:35:42 check rallly: deployed=True state=running hold=None
23:35:46 marker row: 'r1106-A2\nr1106-B' (want 'r1106-B' present)
23:35:49 rallly log auth errors (10 min) / status: 0 | Up | 3 | minutes | (healthy)
23:35:52 app login to its DB (the app's own DATABASE_URL user): 1
23:35:55 front door: 301
2026/10/16 21:35:13 restore_dbcreds.go:111: [ERROR] [backup] Restore REFUSED for rallly before any change: restore refused: the backup does not carry the database password: [DB_PASSWORD] (the current install is not older than the data, or no value at all) (R-1
unit restored: DB_PASSWORD lines 1
@@ -0,0 +1,51 @@
##### PATH D — install from backup (use kept data), grimmory
23:36:10 seed grimmory r1106-D: r1106-D
23:36:13 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
23:36:13 check grimmory: deployed=True state=running hold=None
23:36:16 marker row: 'r1106-D' (want 'r1106-D' present)
23:36:19 root login (the product's dump user): 1
23:36:23 app user login (the app's own DB user): 1
23:36:26 app health: Up 5 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:36:25.554584861","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:36:25.55460
23:36:29 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
23:36:29 off-site before: status=ok last_run=2026-10-16T21:27:57Z snapshots=250
23:36:29 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:36:30 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:39:07 + 157.3s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:39:10 + 160.4s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:39:13 + 163.4s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:39:16 + 166.4s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:39:19 + 169.4s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.7 MB/12.7 MB
23:39:22 + 172.5s ('running', '', 'opengist', 0) files 0/0 bytes /
23:39:25 + 175.5s ('running', '', 'paperless-ngx', 100) files 74/74 bytes 154.1 MB/154.1 MB
23:39:28 + 178.5s ('running', '', 'docmost', 100) files 12/12 bytes 105.1 MB/105.1 MB
23:39:31 + 181.5s ('running', '', 'plex', 0) files 0/0 bytes /
23:39:34 + 184.6s ('running', '', 'prowlarr', 0) files 0/0 bytes /
23:39:37 + 187.6s ('running', '', 'romm', 0) files 0/0 bytes /
23:39:40 + 190.6s ('running', '', 'romm', 100) files 10/10 bytes 189.8 MB/189.8 MB
23:39:43 + 193.6s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:39:46 + 196.7s ('running', '', 'privatebin', 0) files 0/0 bytes /
23:39:49 + 199.7s ('running', '', 'rallly', 100) files 8/8 bytes 67.5 MB/67.5 MB
23:39:52 + 202.7s ('running', 'retention', '', 0) files 0/0 bytes /
23:39:58 + 208.8s ('ok', '', '', 0) files 0/0 bytes /
23:39:58 off-site after: status=ok last_run=2026-10-16T21:39:56Z duration=3m23s snapshots=266 size=704.6 MB error=''
23:40:32 remove grimmory (keepdata: remove_hdd_data=False, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': [], 'hdd_paths_preserved': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'us
## after remove (data kept)
/mnt/felhom-drives/hdd_1/appdata/grimmory/:
data
/mnt/felhom-drives/hdd_1/userdata/media/grimmory/:
r1106-D.txt
0
23:40:33 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:40:34 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:41:59 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:41:59 install grimmory with kept_data=use: True
## after install with kept data
23:42:29 check grimmory: deployed=True state=running hold=None
23:42:33 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-D' present)
23:42:36 root login (the product's dump user): 1
23:42:39 app user login (the app's own DB user): 1
23:42:43 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:42:42.23419292","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:42:42.234213
23:42:46 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
@@ -0,0 +1,43 @@
##### PATH D2 — install from backup (use kept data), grimmory, with app data in appdata/grimmory/data
dc2f9452f403591fc4a69f587af72cab73fb8d942d14a4e196481caf6703546e /mnt/felhom-drives/hdd_1/appdata/grimmory/data/r1106-cover.bin
23:43:14 seed grimmory r1106-D2: r1106-D2
23:43:17 file: a584aeaa731c68ace4355bbcffa492f6f578af38c12142ff943aeb2880564ab0 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D2.txt
23:43:18 off-site before: status=ok last_run=2026-10-16T21:39:56Z snapshots=266
23:43:18 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:43:18 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:45:52 + 154.3s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:45:55 + 157.3s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:45:58 + 160.4s ('running', '', 'opengist', 0) files 0/0 bytes /
23:46:01 + 163.4s ('running', '', 'paperless-ngx', 28) files 70/74 bytes 42.6 MB/154.2 MB
23:46:04 + 166.4s ('running', '', 'docmost', 0) files 0/0 bytes /
23:46:07 + 169.4s ('running', '', 'plex', 0) files 0/0 bytes /
23:46:10 + 172.5s ('running', '', 'prowlarr', 0) files 0/0 bytes /
23:46:13 + 175.5s ('running', '', 'radarr', 0) files 0/0 bytes /
23:46:16 + 178.5s ('running', '', 'romm', 100) files 10/10 bytes 190.0 MB/190.0 MB
23:46:19 + 181.5s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:46:22 + 184.6s ('running', '', 'privatebin', 0) files 0/0 bytes /
23:46:25 + 187.6s ('running', '', 'rallly', 100) files 8/8 bytes 67.5 MB/67.5 MB
23:46:28 + 190.6s ('running', '', 'grimmory', 100) files 11/11 bytes 156.9 MB/156.9 MB
23:46:31 + 193.6s ('running', 'retention', '', 0) files 0/0 bytes /
23:46:37 + 199.7s ('ok', '', '', 0) files 0/0 bytes /
23:46:37 off-site after: status=ok last_run=2026-10-16T21:46:35Z duration=3m13s snapshots=282 size=719.2 MB error=''
23:47:11 remove grimmory (keepdata: remove_hdd_data=False, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': [], 'hdd_paths_preserved': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (8.0K)'], 'us
23:47:11 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:47:13 [1] deploy -> 202 {'ok': True, 'message': 'A(z) Grimmory megőrzött adatainak betöltése elindult.'}
23:47:38 [1] deployed, controller state=unhealthy, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:47:38 [1] NOTE: the controller's own state is 'unhealthy', not 'running' — recorded, not treated as a failure; the fixture's front-door wait is the real gate
23:47:38 install grimmory with kept_data=use: True
2026/10/16 21:47:12 image_retention.go:238: [INFO] [stacks] image retention (remove of grimmory): pass over 53 image(s) of [ghcr.io/grimmory-tools/grimmory mariadb] — 2 candidate(s), 2 deleted, the rest kept
2026/10/16 21:47:13 kept_install.go:97: [INFO] [api] Deploy grimmory: USE MY KEPT DATA — loading from /mnt/felhom-drives/hdd_1/backups/primary/grimmory (tier 1, 2026-10-16T21:43:18Z) under the kept files [/mnt/felhom-drives/hdd_
2026/10/16 21:47:13 restore_dbcreds.go:114: [INFO] [backup] Restore grimmory: database password(s) [DB_PASSWORD DB_ROOT_PASSWORD] come from the backup, [] stay as installed (older than the data) — values not logged (R-1106)
2026/10/16 21:48:29 restore_unit.go:487: [INFO] [backup] Restore-from-unit completed: grimmory — 1 volume(s) of 1 listed, 1 database(s) of 1 listed
2026/10/16 21:48:29 kept_load.go:331: [INFO] [backup] kept load grimmory from /mnt/felhom-drives/hdd_1/backups/primary/grimmory done in 1m16s (volumes 1/1, dbs 1/1)
dc2f9452f403591fc4a69f587af72cab73fb8d942d14a4e196481caf6703546e /mnt/felhom-drives/hdd_1/appdata/grimmory/data/r1106-cover.bin
## after install with kept data
23:48:40 check grimmory: deployed=True state=running hold=None
23:48:43 marker row: 'r1106-D2' (want 'r1106-D2' present)
23:48:47 root login (the product's dump user): 1
23:48:50 app user login (the app's own DB user): 1
23:48:53 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:48:52.592861758","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:48:52.59288
23:48:56 file: a584aeaa731c68ace4355bbcffa492f6f578af38c12142ff943aeb2880564ab0 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D2.txt
@@ -0,0 +1,11 @@
23:54:12 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
23:54:46 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (8.0K)'], 'hdd_paths_preserved': [], 'us
23:54:49 household deletes the books-folder files: 2
0
rmdir: failed to remove '/mnt/felhom-drives/hdd_1/appdata/grimmory/data': No such file or directory
0
0
ls: cannot access '/mnt/sys_drive/felhom-data/backups/primary/rallly': No such file or directory
ls: cannot access '/mnt/felhom-drives/hdd_1/backups/primary/grimmory': No such file or directory
ls: cannot access '/mnt/felhom-drives/hdd_1/backups/offsite-restore/*': No such file or directory
holds: ['kimai']
@@ -0,0 +1,360 @@
22:49:18 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:50:08 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
22:50:08 install rallly: True
22:50:08 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
22:50:08 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:51:29 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
22:51:29 install grimmory: True
22:51:33 seed rallly r1106-A: LINE 1: ...te varchar(80)); insert into r1106_marker values (r1106-A); ...
^
CREATE TABLE
22:51:33 check rallly: deployed=True state=running hold=None
22:51:36 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker\n ^' (want 'r1106-A' present)
22:51:39 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
22:51:43 app login to its DB (the app's own DATABASE_URL user): 1
22:51:46 front door: 301
22:51:49 seed grimmory r1106-A: --------------
ERROR 1054 (42S22) at line 1: Unknown column 'r1106' in 'VALUES'
22:51:52 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
22:51:53 check grimmory: deployed=True state=running hold=None
22:51:56 marker row: '' (want 'r1106-A' present)
22:51:59 root login (the product's dump user): 1
22:52:03 app user login (the app's own DB user): 1
22:52:06 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T22:52:05.285639702","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T22:52:05.28566
22:52:09 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
22:52:09 off-site before: status=ok last_run=2026-10-16T18:48:30Z snapshots=202
22:52:09 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
22:52:09 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
22:54:47 + 157.4s ('running', '', 'plex', 0) files 0/0 bytes /
22:54:50 + 160.4s ('running', '', 'prowlarr', 0) files 0/0 bytes /
22:54:53 + 163.4s ('running', '', 'radarr', 0) files 0/0 bytes /
22:54:56 + 166.5s ('running', '', 'romm', 100) files 8/10 bytes 187.9 MB/187.9 MB
22:54:59 + 169.5s ('running', '', 'sonarr', 91) files 3/4 bytes 11.1 KB/12.2 KB
22:55:02 + 172.5s ('running', '', 'privatebin', 0) files 0/0 bytes /
22:55:05 + 175.6s ('running', '', 'rallly', 0) files 0/0 bytes /
22:55:08 + 178.6s ('running', '', 'rallly', 100) files 7/7 bytes 50.1 MB/50.1 MB
22:55:14 + 184.7s ('running', '', 'grimmory', 0) files 0/0 bytes /
22:55:17 + 187.7s ('running', '', 'grimmory', 100) files 8/8 bytes 156.7 MB/156.7 MB
22:55:20 + 190.7s ('running', '', 'bookstack', 100) files 11/11 bytes 160.7 MB/160.7 MB
22:55:23 + 193.7s ('running', '', 'home-assistant', 0) files 0/0 bytes /
22:55:26 + 196.8s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.5 MB/12.5 MB
22:55:29 + 199.8s ('running', '', 'paperless-ngx', 0) files 0/0 bytes /
22:55:32 + 202.8s ('running', '', 'paperless-ngx', 100) files 74/74 bytes 154.1 MB/154.1 MB
22:55:35 + 205.8s ('running', '', 'docmost', 0) files 0/0 bytes /
22:55:38 + 208.9s ('running', '', 'kimai', 100) files 10/10 bytes 173.0 MB/173.0 MB
22:55:41 + 211.9s ('running', 'retention', '', 0) files 0/0 bytes /
22:55:47 + 217.9s ('ok', '', '', 0) files 0/0 bytes /
22:55:47 off-site after: status=ok last_run=2026-10-16T20:55:46Z duration=3m31s snapshots=218 size=653.5 MB error=''
22:56:30 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
22:57:04 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
22:57:07 household deletes the books-folder files: 1
22:57:08 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:57:58 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
22:57:58 install rallly: True
22:57:58 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
22:57:58 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
22:59:29 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
22:59:29 install grimmory: True
22:59:29 check rallly: deployed=True state=running hold=None
22:59:33 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker\n ^' (want 'r1106-A' present)
22:59:36 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
22:59:39 app login to its DB (the app's own DATABASE_URL user): 1
22:59:42 front door: 301
22:59:43 check grimmory: deployed=True state=running hold=None
22:59:46 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-A' present)
22:59:49 root login (the product's dump user): 1
22:59:53 app user login (the app's own DB user): 1
22:59:56 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T22:59:55.464371994","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T22:59:55.46441
22:59:59 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt: No such file or directory
23:00:03 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=rallly&full_prep=rallly&full_size=50.1+MB
23:00:03 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
23:00:03 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:00:12 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:00:12 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-16T21:00:03.606006931Z", "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/hdd_1/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:00:11.039016046Z"}, "last_recent": true}
23:00:12 POST /backup/offbox/reconstitute {'app': 'rallly', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
23:00:12 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:00:43 + 30.3s restore-status (False, 'offbox-reconstitute', None, '')
23:00:43 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-16T21:00:12.737270741Z", "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. 16. 22:52) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:00:41.713460862Z"}, "last_recent": true}
23:00:46 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=grimmory&full_prep=grimmory&full_size=156.7+MB
23:00:46 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.restore_started
23:00:46 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:00:55 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:00:55 {"running": false, "op": "offbox-restore", "stack": "grimmory", "started_at": "2026-10-16T21:00:46.868233201Z", "last": {"op": "offbox-restore", "stack": "grimmory", "ok": true, "message": "A(z) grimmory teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/hdd_1/backups/offsite-restore/grimmory — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:00:55.045276695Z"}, "last_recent": true}
23:00:55 POST /backup/offbox/reconstitute {'app': 'grimmory', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.full_restore_started
23:00:56 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:01:50 + 54.5s restore-status (False, 'offbox-reconstitute', None, '')
23:01:50 {"running": false, "op": "offbox-reconstitute", "stack": "grimmory", "started_at": "2026-10-16T21:00:55.98356812Z", "last": {"op": "offbox-reconstitute", "stack": "grimmory", "ok": true, "message": "A(z) grimmory: 1 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 16. 22:52) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:01:48.947953301Z"}, "last_recent": true}
23:02:50 check rallly: deployed=True state=running hold=None
23:02:54 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-A' present)
23:02:57 rallly log auth errors (10 min) / status: 0 | Up | 2 | minutes | (healthy)
23:03:00 app login to its DB (the app's own DATABASE_URL user): 1
23:03:03 front door: 301
23:03:04 check grimmory: deployed=True state=running hold=None
23:03:07 marker row: '' (want 'r1106-A' present)
23:03:10 root login (the product's dump user): 1
23:03:14 app user login (the app's own DB user): 1
23:03:17 app health: Up 2 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:03:16.428599078","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:03:16.42862
23:03:20 file: 0f4abe3bee6cd83e56b7a0f554cad3f6f7f91a8a0af59c024e67fbf7a01440cd /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A.txt
23:12:31 seed rallly r1106-A2: CREATE TABLE
INSERT 0 1
r1106-A2
23:12:31 check rallly: deployed=True state=running hold=None
23:12:34 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:12:37 rallly log auth errors (10 min) / status: 0 | Up | 12 | minutes | (healthy)
23:12:41 app login to its DB (the app's own DATABASE_URL user): 1
23:12:44 front door: 301
23:12:48 seed grimmory r1106-A2: r1106-A2
23:12:51 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
23:12:51 check grimmory: deployed=True state=running hold=None
23:12:54 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:12:58 root login (the product's dump user): 1
23:13:01 app user login (the app's own DB user): 1
23:13:04 app health: Up 11 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:13:03.583521678","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:13:03.58356
23:13:07 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
23:13:07 off-site before: status=ok last_run=2026-10-16T20:55:46Z snapshots=218
23:13:07 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:13:07 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:15:42 + 154.3s ('running', '', 'romm', 0) files 0/0 bytes /
23:15:45 + 157.4s ('running', '', 'sonarr', 0) files 0/0 bytes /
23:15:48 + 160.4s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:15:51 + 163.4s ('running', '', 'rallly', 0) files 0/0 bytes /
23:15:54 + 166.4s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:15:57 + 169.5s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:16:00 + 172.5s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:16:03 + 175.5s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.6 MB/12.6 MB
23:16:06 + 178.5s ('running', '', 'paperless-ngx', 0) files 0/0 bytes /
23:16:09 + 181.6s ('running', '', 'docmost', 0) files 0/0 bytes /
23:16:12 + 184.6s ('running', '', 'kimai', 0) files 0/0 bytes /
23:16:15 + 187.6s ('running', '', 'plex', 0) files 0/0 bytes /
23:16:18 + 190.6s ('running', 'retention', '', 0) files 0/0 bytes /
23:16:24 + 196.7s ('ok', '', '', 0) files 0/0 bytes /
23:16:24 off-site after: status=ok last_run=2026-10-16T21:16:23Z duration=3m12s snapshots=234 size=670.9 MB error=''
23:17:07 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
23:17:41 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
23:17:45 household deletes the books-folder files: 2
23:17:45 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:18:35 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
23:18:35 install rallly: True
23:18:35 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:18:36 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:19:56 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:19:56 install grimmory: True
23:19:56 check rallly: deployed=True state=running hold=None
23:20:00 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-A2' present)
23:20:03 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:20:06 app login to its DB (the app's own DATABASE_URL user): 1
23:20:10 front door: 301
23:20:10 check grimmory: deployed=True state=running hold=None
23:20:13 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-A2' present)
23:20:16 root login (the product's dump user): 1
23:20:20 app user login (the app's own DB user): 1
23:20:23 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:20:22.859735764","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:20:22.85975
23:20:26 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt: No such file or directory
23:20:30 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=rallly&full_prep=rallly&full_size=66.9+MB
23:20:30 POST /backup/offbox/restore {'app': 'rallly', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.restore_started
23:20:30 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:20:39 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:20:39 {"running": false, "op": "offbox-restore", "stack": "rallly", "started_at": "2026-10-16T21:20:30.883566825Z", "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/hdd_1/backups/offsite-restore/rallly — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:20:38.696061676Z"}, "last_recent": true}
23:20:40 POST /backup/offbox/reconstitute {'app': 'rallly', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=rallly&flash=flash.offbox.full_restore_started
23:20:40 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:21:10 + 30.3s restore-status (False, 'offbox-reconstitute', None, '')
23:21:10 {"running": false, "op": "offbox-reconstitute", "stack": "rallly", "started_at": "2026-10-16T21:20:40.00486394Z", "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. 16. 23:13) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:21:09.345344912Z"}, "last_recent": true}
23:21:14 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full'} -> HTTP/2 302 /backups/restore/app?name=grimmory&full_prep=grimmory&full_size=156.8+MB
23:21:14 POST /backup/offbox/restore {'app': 'grimmory', 'mode': 'full', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.restore_started
23:21:14 + 0.0s restore-status (True, 'offbox-restore', None, '')
23:21:23 + 9.1s restore-status (False, 'offbox-restore', None, '')
23:21:23 {"running": false, "op": "offbox-restore", "stack": "grimmory", "started_at": "2026-10-16T21:21:14.156589916Z", "last": {"op": "offbox-restore", "stack": "grimmory", "ok": true, "message": "A(z) grimmory teljes mentése visszaállítva ellenőrző mappába: /mnt/felhom-drives/hdd_1/backups/offsite-restore/grimmory — a saját fájljaiddal együtt. A meglévő adatok változatlanok.", "finished_at": "2026-10-16T21:21:22.333018655Z"}, "last_recent": true}
23:21:23 POST /backup/offbox/reconstitute {'app': 'grimmory', 'confirm': '1'} -> HTTP/2 302 /backups/restore/app?name=grimmory&flash=flash.offbox.full_restore_started
23:21:23 + 0.0s restore-status (True, 'offbox-reconstitute', None, '')
23:22:17 + 54.5s restore-status (False, 'offbox-reconstitute', None, '')
23:22:17 {"running": false, "op": "offbox-reconstitute", "stack": "grimmory", "started_at": "2026-10-16T21:21:23.276103566Z", "last": {"op": "offbox-reconstitute", "stack": "grimmory", "ok": true, "message": "A(z) grimmory: 2 fájl és 1 adatkötet és az adatbázis visszaállítva (mentés: 2026. 10. 16. 23:13) — az alkalmazás újraindult.", "finished_at": "2026-10-16T21:22:15.633221727Z"}, "last_recent": true}
23:23:02 check rallly: deployed=True state=running hold=None
23:23:07 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:23:10 rallly log auth errors (10 min) / status: 0 | Up | 2 | minutes | (healthy)
23:23:14 app login to its DB (the app's own DATABASE_URL user): 1
23:23:18 front door: 301
23:23:18 check grimmory: deployed=True state=running hold=None
23:23:22 marker row: 'r1106-A2' (want 'r1106-A2' present)
23:23:26 root login (the product's dump user): 1
23:23:30 app user login (the app's own DB user): 1
23:23:34 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:23:33.152578787","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:23:33.15260
23:23:38 file: 50a1cfbcde9a13e801c30d3bd9f65457e3249704a3c925fe5e8d6baba886ea79 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-A2.txt
23:24:08 seed rallly r1106-B: INSERT 0 1
r1106-A2
r1106-B
23:24:13 seed grimmory r1106-B: r1106-A2
r1106-B
23:24:17 file: c90bc7913f76e3b72bd245b1f4f0b6c3b2be0a6de62bf95374eb47f62b9fb7cf /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt
23:24:17 off-site before: status=ok last_run=2026-10-16T21:16:23Z snapshots=234
23:24:17 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:24:17 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:27:10 + 172.5s ('running', '', 'opengist', 0) files 0/0 bytes /
23:27:13 + 175.6s ('running', '', 'docmost', 0) files 0/0 bytes /
23:27:16 + 178.6s ('running', '', 'kimai', 0) files 0/0 bytes /
23:27:19 + 181.6s ('running', '', 'plex', 0) files 0/0 bytes /
23:27:22 + 184.6s ('running', '', 'prowlarr', 100) files 4/4 bytes 9.1 KB/9.1 KB
23:27:25 + 187.7s ('running', '', 'romm', 0) files 0/0 bytes /
23:27:28 + 190.7s ('running', '', 'sonarr', 0) files 0/0 bytes /
23:27:31 + 193.7s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:27:34 + 196.8s ('running', '', 'rallly', 0) files 0/0 bytes /
23:27:37 + 199.8s ('running', '', 'rallly', 100) files 8/8 bytes 67.0 MB/67.0 MB
23:27:40 + 202.8s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:27:43 + 205.8s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:27:46 + 208.9s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:27:49 + 211.9s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:27:52 + 214.9s ('running', 'retention', '', 0) files 0/0 bytes /
23:27:58 + 221.0s ('ok', '', '', 0) files 0/0 bytes /
23:27:58 off-site after: status=ok last_run=2026-10-16T21:27:57Z duration=3m35s snapshots=250 size=687.5 MB error=''
23:28:41 remove rallly (keepbackups: remove_hdd_data=True, remove_backups=False) -> 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ü
23:29:15 remove grimmory (keepbackups: remove_hdd_data=True, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'hdd_paths_preserved': [], 'us
23:29:19 household deletes the books-folder files: 3
23:29:20 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:30:15 [1] deployed, controller state=running, pinned={'rallly': 'lukevella/rallly:4.15.3', 'rallly-postgres': 'postgres:18-alpine'}
23:30:15 install rallly: True
23:30:15 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:30:15 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:31:36 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:31:36 install grimmory: True
23:31:36 check rallly: deployed=True state=running hold=None
23:31:40 marker row: 'ERROR: relation "r1106_marker" does not exist\nLINE 1: select note from r1106_marker;\n ^' (want 'r1106-B' present)
23:31:43 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:31:46 app login to its DB (the app's own DATABASE_URL user): 1
23:31:50 front door: 301
23:31:50 check grimmory: deployed=True state=running hold=None
23:31:53 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-B' present)
23:31:56 root login (the product's dump user): 1
23:32:00 app user login (the app's own DB user): 1
23:32:03 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:32:02.311256259","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:32:02.31127
23:32:06 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt: No such file or directory
23:32:06 [R] restoring rallly from snapshot 'helyi' (of 1 offered)
23:32:06 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
23:32:06 + 0.0s restore (True, None, None)
23:32:34 + 28.3s restore (False, None, None)
23:32:34 [R] after restore: state=running hold=None phase=None
23:32:38 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash=flash.restore.started"], "seconds": 28.4}
23:32:38 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:32:06.602574836Z", "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-16T21:32:33.370797695Z"}, "last_recent": true}
23:32:38 [R] restoring grimmory from snapshot 'helyi' (of 1 offered)
23:33:18 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash_error=Ez+a+ment%C3%A9s+nem+tartalmazza+az+alkalmaz%C3%A1s+f%C3%A1jljait%2C+ez%C3%A9rt+nem+%C3%A1ll%C3%ADtjuk+vissza+az+adatb%C3%A1zist+f%C3%B6l%C3%A9j%C3%BCk+%E2%80%94+a+f%C3%A1jlok+%C3%ADgy+a+hely%C3%BCk%C3%B6n+maradnak.+A+f%C3%A1jlok+a+t%C3%A1voli+m%C3%A1solatb%C3%B3l+%C3%A1ll%C3%ADthat%C3%B3k+vissza%3A+Biztons%C3%A1gi+ment%C3%A9s+%E2%86%92+Vissza%C3%A1ll%C3%ADt%C3%A1s%2C+%E2%80%9ETeljes+vissza%C3%A1ll%C3%ADt%C3%A1s+%28f%C3%A1jlok+%2B+adatb%C3%A1zis%29%E2%80%9D.']
23:33:18 + 0.0s restore (False, None, None)
23:33:25 [R] after restore: state=running hold=None phase=None
23:33:28 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash_error=Ez+a+ment%C3%A9s+nem+tartalmazza+az+alkalmaz%C3%A1s+f%C3%A1jljait%2C+ez%C3%A9rt+nem+%C3%A1ll%C3%ADtjuk+vissza+az+adatb%C3%A1zist+f%C3%B6l%C3%A9j%C3%BCk+%E2%80%94+a+f%C3%A1jlok+%C3%ADgy+a+hely%C3%BCk%C3%B6n+maradnak.+A+f%C3%A1jlok+a+t%C3%A1voli+m%C3%A1solatb%C3%B3l+%C3%A1ll%C3%ADthat%C3%B3k+vissza%3A+Biztons%C3%A1gi+ment%C3%A9s+%E2%86%92+Vissza%C3%A1ll%C3%ADt%C3%A1s%2C+%E2%80%9ETeljes+vissza%C3%A1ll%C3%ADt%C3%A1s+%28f%C3%A1jlok+%2B+adatb%C3%A1zis%29%E2%80%9D."], "seconds": 6.1}
23:33:28 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:32:06.602574836Z", "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-16T21:32:33.370797695Z"}, "last_recent": true}
23:34:14 check rallly: deployed=True state=running hold=None
23:34:17 marker row: 'r1106-A2\nr1106-B' (want 'r1106-B' present)
23:34:21 rallly log auth errors (10 min) / status: 0 | Up | About | a | minute | (healthy)
23:34:24 app login to its DB (the app's own DATABASE_URL user): 1
23:34:27 front door: 301
23:34:27 check grimmory: deployed=True state=running hold=None
23:34:31 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-B' present)
23:34:34 root login (the product's dump user): 1
23:34:37 app user login (the app's own DB user): 1
23:34:40 app health: Up 3 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:34:39.959127823","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:34:39.95916
23:34:44 file: sha256sum: /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-B.txt: No such file or directory
23:35:13 [R] restoring rallly from snapshot 'helyi' (of 1 offered)
23:35:13 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
23:35:13 + 0.0s restore (False, None, None)
23:35:19 [R] after restore: state=running hold=None phase=None
23:35:22 onbox restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash=flash.restore.started"], "seconds": 6.1}
23:35:22 restore-status: {"running": false, "op": "restore", "stack": "rallly", "started_at": "2026-10-16T21:35:13.244020136Z", "last": {"op": "restore", "stack": "rallly", "ok": false, "message": "Visszaállítás sikertelen: Ezt a mentést nem lehet visszaállítani: nem tartalmazza az adatbázis jelszavát, és nélküle az alkalmazás nem tudna elindulni. A mostani telepítés érintetlen maradt.", "finished_at": "2026-10-16T21:35:13.253731205Z"}, "last_recent": true}
23:35:42 check rallly: deployed=True state=running hold=None
23:35:46 marker row: 'r1106-A2\nr1106-B' (want 'r1106-B' present)
23:35:49 rallly log auth errors (10 min) / status: 0 | Up | 3 | minutes | (healthy)
23:35:52 app login to its DB (the app's own DATABASE_URL user): 1
23:35:55 front door: 301
23:36:10 seed grimmory r1106-D: r1106-D
23:36:13 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
23:36:13 check grimmory: deployed=True state=running hold=None
23:36:16 marker row: 'r1106-D' (want 'r1106-D' present)
23:36:19 root login (the product's dump user): 1
23:36:23 app user login (the app's own DB user): 1
23:36:26 app health: Up 5 minutes (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:36:25.554584861","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:36:25.55460
23:36:29 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
23:36:29 off-site before: status=ok last_run=2026-10-16T21:27:57Z snapshots=250
23:36:29 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:36:30 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:39:07 + 157.3s ('running', '', 'grimmory', 0) files 0/0 bytes /
23:39:10 + 160.4s ('running', '', 'bookstack', 0) files 0/0 bytes /
23:39:13 + 163.4s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:39:16 + 166.4s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:39:19 + 169.4s ('running', '', 'home-assistant', 100) files 6/6 bytes 12.7 MB/12.7 MB
23:39:22 + 172.5s ('running', '', 'opengist', 0) files 0/0 bytes /
23:39:25 + 175.5s ('running', '', 'paperless-ngx', 100) files 74/74 bytes 154.1 MB/154.1 MB
23:39:28 + 178.5s ('running', '', 'docmost', 100) files 12/12 bytes 105.1 MB/105.1 MB
23:39:31 + 181.5s ('running', '', 'plex', 0) files 0/0 bytes /
23:39:34 + 184.6s ('running', '', 'prowlarr', 0) files 0/0 bytes /
23:39:37 + 187.6s ('running', '', 'romm', 0) files 0/0 bytes /
23:39:40 + 190.6s ('running', '', 'romm', 100) files 10/10 bytes 189.8 MB/189.8 MB
23:39:43 + 193.6s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:39:46 + 196.7s ('running', '', 'privatebin', 0) files 0/0 bytes /
23:39:49 + 199.7s ('running', '', 'rallly', 100) files 8/8 bytes 67.5 MB/67.5 MB
23:39:52 + 202.7s ('running', 'retention', '', 0) files 0/0 bytes /
23:39:58 + 208.8s ('ok', '', '', 0) files 0/0 bytes /
23:39:58 off-site after: status=ok last_run=2026-10-16T21:39:56Z duration=3m23s snapshots=266 size=704.6 MB error=''
23:40:32 remove grimmory (keepdata: remove_hdd_data=False, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': [], 'hdd_paths_preserved': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (4.0K)'], 'us
23:40:33 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:40:34 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
23:41:59 [1] deployed, controller state=running, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:41:59 install grimmory with kept_data=use: True
23:42:29 check grimmory: deployed=True state=running hold=None
23:42:33 marker row: "--------------\n\nERROR 1146 (42S02) at line 1: Table 'grimmory.r1106_marker' doesn't exist" (want 'r1106-D' present)
23:42:36 root login (the product's dump user): 1
23:42:39 app user login (the app's own DB user): 1
23:42:43 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:42:42.23419292","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:42:42.234213
23:42:46 file: b9a6247e71922dce28dfccaabaebee528e89f125052cb799ea3e8ba2bd579b9e /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D.txt
23:43:14 seed grimmory r1106-D2: r1106-D2
23:43:17 file: a584aeaa731c68ace4355bbcffa492f6f578af38c12142ff943aeb2880564ab0 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D2.txt
23:43:18 off-site before: status=ok last_run=2026-10-16T21:39:56Z snapshots=266
23:43:18 POST /backup/offbox/run {} -> HTTP/2 302 /backups/remote?flash=flash.offbox.run_started
23:43:18 + 0.0s ('running', 'dump', '', 0) files 0/0 bytes /
23:45:52 + 154.3s ('running', '', 'calibre-web', 0) files 0/0 bytes /
23:45:55 + 157.3s ('running', '', 'home-assistant', 0) files 0/0 bytes /
23:45:58 + 160.4s ('running', '', 'opengist', 0) files 0/0 bytes /
23:46:01 + 163.4s ('running', '', 'paperless-ngx', 28) files 70/74 bytes 42.6 MB/154.2 MB
23:46:04 + 166.4s ('running', '', 'docmost', 0) files 0/0 bytes /
23:46:07 + 169.4s ('running', '', 'plex', 0) files 0/0 bytes /
23:46:10 + 172.5s ('running', '', 'prowlarr', 0) files 0/0 bytes /
23:46:13 + 175.5s ('running', '', 'radarr', 0) files 0/0 bytes /
23:46:16 + 178.5s ('running', '', 'romm', 100) files 10/10 bytes 190.0 MB/190.0 MB
23:46:19 + 181.5s ('running', '', 'bentopdf', 0) files 0/0 bytes /
23:46:22 + 184.6s ('running', '', 'privatebin', 0) files 0/0 bytes /
23:46:25 + 187.6s ('running', '', 'rallly', 100) files 8/8 bytes 67.5 MB/67.5 MB
23:46:28 + 190.6s ('running', '', 'grimmory', 100) files 11/11 bytes 156.9 MB/156.9 MB
23:46:31 + 193.6s ('running', 'retention', '', 0) files 0/0 bytes /
23:46:37 + 199.7s ('ok', '', '', 0) files 0/0 bytes /
23:46:37 off-site after: status=ok last_run=2026-10-16T21:46:35Z duration=3m13s snapshots=282 size=719.2 MB error=''
23:47:11 remove grimmory (keepdata: remove_hdd_data=False, remove_backups=False) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': [], 'hdd_paths_preserved': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (8.0K)'], 'us
23:47:11 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['HDD_PATH']
23:47:13 [1] deploy -> 202 {'ok': True, 'message': 'A(z) Grimmory megőrzött adatainak betöltése elindult.'}
23:47:38 [1] deployed, controller state=unhealthy, pinned={'grimmory': 'ghcr.io/grimmory-tools/grimmory:v3.5.0', 'grimmory-db': 'mariadb:11.4'}
23:47:38 [1] NOTE: the controller's own state is 'unhealthy', not 'running' — recorded, not treated as a failure; the fixture's front-door wait is the real gate
23:47:38 install grimmory with kept_data=use: True
23:48:40 check grimmory: deployed=True state=running hold=None
23:48:43 marker row: 'r1106-D2' (want 'r1106-D2' present)
23:48:47 root login (the product's dump user): 1
23:48:50 app user login (the app's own DB user): 1
23:48:53 app health: Up About a minute (healthy)
{"data":{"status":"UP","message":"Application is running smoothly.","timestamp":"2026-10-16T23:48:52.592861758","version":"v3.5.0"},"message":"Pong","status":200,"timestamp":"2026-10-16T23:48:52.59288
23:48:56 file: a584aeaa731c68ace4355bbcffa492f6f578af38c12142ff943aeb2880564ab0 /mnt/felhom-drives/hdd_1/userdata/media/grimmory/r1106-D2.txt
23:54:12 remove rallly (all: remove_hdd_data=True, remove_backups=True) -> 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ü
23:54:46 remove grimmory (all: remove_hdd_data=True, remove_backups=True) -> 200 {'ok': True, 'data': {'removed': 'grimmory', 'volumes_removed': ['grimmory_grimmory_db'], 'hdd_paths_removed': ['/mnt/felhom-drives/hdd_1/appdata/grimmory/data (8.0K)'], 'hdd_paths_preserved': [], 'us
23:54:49 household deletes the books-folder files: 2
@@ -0,0 +1,5 @@
snapshots: 0.14.0-made f3f16e0e (bookstack), 0.18.1-made 6d9dd607 (rallly), 0.19.1-made fd048a06 (bookstack, newest)
f3f16e0e: restic 0.14.0 → 0929043ef22edf09 (11 files) restic 0.18.1 → 0929043ef22edf09 (11 files) restic 0.19.1 → 0929043ef22edf09 (11 files)
6d9dd607: restic 0.14.0 → 8008e687404bd9a7 (7 files) restic 0.18.1 → 8008e687404bd9a7 (7 files) restic 0.19.1 → 8008e687404bd9a7 (7 files)
fd048a06: restic 0.14.0 → 1567422ecd060fbb (11 files) restic 0.18.1 → 1567422ecd060fbb (11 files) restic 0.19.1 → 1567422ecd060fbb (11 files)
store listed by each: 0.14.0=234 0.18.1=234 0.19.1=234
@@ -0,0 +1,561 @@
Applying Policy: keep 7 daily, 4 weekly, 6 monthly snapshots
keep 14 snapshots:
ID Time Host Tags Reasons Paths
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8f70dd2d 2026-05-31 02:30:00 box a,felhom-offbox monthly snapshot <W>/src/a
e5685e89 2026-06-30 14:10:00 box a,felhom-offbox monthly snapshot <W>/src/a
48fcf709 2026-07-31 02:30:00 box a,felhom-offbox monthly snapshot <W>/src/a
9cec0dfb 2026-08-31 02:30:00 box a,felhom-offbox monthly snapshot <W>/src/a
8d8b6744 2026-09-27 02:30:00 box a,felhom-offbox weekly snapshot <W>/src/a
60e75e0a 2026-09-30 02:30:00 box a,felhom-offbox monthly snapshot <W>/src/a
8f26ea70 2026-10-04 02:30:00 box a,felhom-offbox weekly snapshot <W>/src/a
3f469a9f 2026-10-10 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
64ab4ec2 2026-10-11 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
weekly snapshot
60a96942 2026-10-12 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
a15f14a3 2026-10-13 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
d5a6f655 2026-10-14 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
666514eb 2026-10-15 02:30:00 box a,felhom-offbox daily snapshot <W>/src/a
09367c72 2026-10-16 14:10:00 box a,felhom-offbox daily snapshot <W>/src/a
weekly snapshot
monthly snapshot
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Timestamps shown in UTC
14 snapshots
remove 243 snapshots:
ID Time Host Tags Paths
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
771de67e 2026-02-28 02:30:00 box a,felhom-offbox <W>/src/a
6dd387ac 2026-03-01 02:30:00 box a,felhom-offbox <W>/src/a
1e07d089 2026-03-02 02:30:00 box a,felhom-offbox <W>/src/a
ff409d60 2026-03-03 02:30:00 box a,felhom-offbox <W>/src/a
e40a98b5 2026-03-04 02:30:00 box a,felhom-offbox <W>/src/a
1c44dfba 2026-03-05 02:30:00 box a,felhom-offbox <W>/src/a
72974001 2026-03-05 14:10:00 box a,felhom-offbox <W>/src/a
d4419552 2026-03-06 02:30:00 box a,felhom-offbox <W>/src/a
0f19842b 2026-03-07 02:30:00 box a,felhom-offbox <W>/src/a
489ee511 2026-03-08 02:30:00 box a,felhom-offbox <W>/src/a
87a1ebb8 2026-03-09 02:30:00 box a,felhom-offbox <W>/src/a
a405062a 2026-03-10 02:30:00 box a,felhom-offbox <W>/src/a
7547886f 2026-03-11 02:30:00 box a,felhom-offbox <W>/src/a
255407da 2026-03-12 02:30:00 box a,felhom-offbox <W>/src/a
96c9161e 2026-03-13 02:30:00 box a,felhom-offbox <W>/src/a
993bcf63 2026-03-14 02:30:00 box a,felhom-offbox <W>/src/a
43e3394d 2026-03-14 14:10:00 box a,felhom-offbox <W>/src/a
a8985a5f 2026-03-15 02:30:00 box a,felhom-offbox <W>/src/a
85f15ec0 2026-03-16 02:30:00 box a,felhom-offbox <W>/src/a
7057b877 2026-03-17 02:30:00 box a,felhom-offbox <W>/src/a
e9fac77a 2026-03-18 02:30:00 box a,felhom-offbox <W>/src/a
131c441a 2026-03-19 02:30:00 box a,felhom-offbox <W>/src/a
8324988f 2026-03-20 02:30:00 box a,felhom-offbox <W>/src/a
d1e609c0 2026-03-21 02:30:00 box a,felhom-offbox <W>/src/a
442ebff9 2026-03-22 02:30:00 box a,felhom-offbox <W>/src/a
0e2fa801 2026-03-23 02:30:00 box a,felhom-offbox <W>/src/a
767ab4e3 2026-03-23 14:10:00 box a,felhom-offbox <W>/src/a
33137cc5 2026-03-24 02:30:00 box a,felhom-offbox <W>/src/a
3e8a2c5a 2026-03-25 02:30:00 box a,felhom-offbox <W>/src/a
053d36f8 2026-03-26 02:30:00 box a,felhom-offbox <W>/src/a
f47d2804 2026-03-27 02:30:00 box a,felhom-offbox <W>/src/a
7685b131 2026-03-28 02:30:00 box a,felhom-offbox <W>/src/a
962b5504 2026-03-29 02:30:00 box a,felhom-offbox <W>/src/a
7890ed38 2026-03-30 02:30:00 box a,felhom-offbox <W>/src/a
3b108715 2026-03-31 02:30:00 box a,felhom-offbox <W>/src/a
3a958277 2026-04-01 02:30:00 box a,felhom-offbox <W>/src/a
cd7aba44 2026-04-01 14:10:00 box a,felhom-offbox <W>/src/a
681b0d03 2026-04-02 02:30:00 box a,felhom-offbox <W>/src/a
d4d72cf7 2026-04-03 02:30:00 box a,felhom-offbox <W>/src/a
2b02c165 2026-04-04 02:30:00 box a,felhom-offbox <W>/src/a
4ca97426 2026-04-05 02:30:00 box a,felhom-offbox <W>/src/a
b9e29684 2026-04-06 02:30:00 box a,felhom-offbox <W>/src/a
d571e1bb 2026-04-07 02:30:00 box a,felhom-offbox <W>/src/a
ae53fc44 2026-04-08 02:30:00 box a,felhom-offbox <W>/src/a
5deeec58 2026-04-09 02:30:00 box a,felhom-offbox <W>/src/a
97ee4d90 2026-04-10 02:30:00 box a,felhom-offbox <W>/src/a
608267b5 2026-04-10 14:10:00 box a,felhom-offbox <W>/src/a
711776df 2026-04-11 02:30:00 box a,felhom-offbox <W>/src/a
21f7f406 2026-04-12 02:30:00 box a,felhom-offbox <W>/src/a
21418f80 2026-04-13 02:30:00 box a,felhom-offbox <W>/src/a
f39bbb32 2026-04-14 02:30:00 box a,felhom-offbox <W>/src/a
a484fc5e 2026-04-15 02:30:00 box a,felhom-offbox <W>/src/a
c917f1da 2026-04-16 02:30:00 box a,felhom-offbox <W>/src/a
38b2529a 2026-04-17 02:30:00 box a,felhom-offbox <W>/src/a
15bd7c6f 2026-04-18 02:30:00 box a,felhom-offbox <W>/src/a
bc987be4 2026-04-19 02:30:00 box a,felhom-offbox <W>/src/a
907a9646 2026-04-19 14:10:00 box a,felhom-offbox <W>/src/a
f36759fb 2026-04-20 02:30:00 box a,felhom-offbox <W>/src/a
86e604e7 2026-04-21 02:30:00 box a,felhom-offbox <W>/src/a
208bf342 2026-04-22 02:30:00 box a,felhom-offbox <W>/src/a
9e65ba46 2026-04-23 02:30:00 box a,felhom-offbox <W>/src/a
38c1f3e4 2026-04-24 02:30:00 box a,felhom-offbox <W>/src/a
4ad7e0ad 2026-04-25 02:30:00 box a,felhom-offbox <W>/src/a
2835c7d4 2026-04-26 02:30:00 box a,felhom-offbox <W>/src/a
b34dc0c9 2026-04-27 02:30:00 box a,felhom-offbox <W>/src/a
2e47ed5d 2026-04-28 02:30:00 box a,felhom-offbox <W>/src/a
37863bf3 2026-04-28 14:10:00 box a,felhom-offbox <W>/src/a
0dfcdf46 2026-04-29 02:30:00 box a,felhom-offbox <W>/src/a
256e43e6 2026-04-30 02:30:00 box a,felhom-offbox <W>/src/a
6cf6cb2c 2026-05-01 02:30:00 box a,felhom-offbox <W>/src/a
125d79cb 2026-05-02 02:30:00 box a,felhom-offbox <W>/src/a
43a78ef7 2026-05-03 02:30:00 box a,felhom-offbox <W>/src/a
fc826c25 2026-05-04 02:30:00 box a,felhom-offbox <W>/src/a
4aec4215 2026-05-05 02:30:00 box a,felhom-offbox <W>/src/a
75bdd2d8 2026-05-06 02:30:00 box a,felhom-offbox <W>/src/a
2b90ac52 2026-05-07 02:30:00 box a,felhom-offbox <W>/src/a
d5b8c85b 2026-05-07 14:10:00 box a,felhom-offbox <W>/src/a
efff3a99 2026-05-08 02:30:00 box a,felhom-offbox <W>/src/a
ca6478bb 2026-05-09 02:30:00 box a,felhom-offbox <W>/src/a
b99c0056 2026-05-10 02:30:00 box a,felhom-offbox <W>/src/a
47f0537b 2026-05-11 02:30:00 box a,felhom-offbox <W>/src/a
36f9ebf9 2026-05-12 02:30:00 box a,felhom-offbox <W>/src/a
1a1c6121 2026-05-13 02:30:00 box a,felhom-offbox <W>/src/a
eed37ee7 2026-05-14 02:30:00 box a,felhom-offbox <W>/src/a
9e50d9dd 2026-05-15 02:30:00 box a,felhom-offbox <W>/src/a
123f3b9a 2026-05-16 02:30:00 box a,felhom-offbox <W>/src/a
2ff01eae 2026-05-16 14:10:00 box a,felhom-offbox <W>/src/a
acbb7fe6 2026-05-17 02:30:00 box a,felhom-offbox <W>/src/a
f20f3fc4 2026-05-18 02:30:00 box a,felhom-offbox <W>/src/a
497de3c8 2026-05-19 02:30:00 box a,felhom-offbox <W>/src/a
c36d44cf 2026-05-20 02:30:00 box a,felhom-offbox <W>/src/a
05171c35 2026-05-21 02:30:00 box a,felhom-offbox <W>/src/a
ed9ab1fe 2026-05-22 02:30:00 box a,felhom-offbox <W>/src/a
2e4e8278 2026-05-23 02:30:00 box a,felhom-offbox <W>/src/a
7570e58e 2026-05-24 02:30:00 box a,felhom-offbox <W>/src/a
d1761e38 2026-05-25 02:30:00 box a,felhom-offbox <W>/src/a
d54f9281 2026-05-25 14:10:00 box a,felhom-offbox <W>/src/a
c1b802c4 2026-05-26 02:30:00 box a,felhom-offbox <W>/src/a
d6502728 2026-05-27 02:30:00 box a,felhom-offbox <W>/src/a
9ea083d0 2026-05-28 02:30:00 box a,felhom-offbox <W>/src/a
a2d178ee 2026-05-29 02:30:00 box a,felhom-offbox <W>/src/a
8885d6ac 2026-05-30 02:30:00 box a,felhom-offbox <W>/src/a
7088f0cc 2026-06-01 02:30:00 box a,felhom-offbox <W>/src/a
db51dbc5 2026-06-02 02:30:00 box a,felhom-offbox <W>/src/a
c42cb86a 2026-06-03 02:30:00 box a,felhom-offbox <W>/src/a
1f7fad88 2026-06-03 14:10:00 box a,felhom-offbox <W>/src/a
fcd28986 2026-06-04 02:30:00 box a,felhom-offbox <W>/src/a
588b64a8 2026-06-05 02:30:00 box a,felhom-offbox <W>/src/a
caee2672 2026-06-06 02:30:00 box a,felhom-offbox <W>/src/a
48908f97 2026-06-07 02:30:00 box a,felhom-offbox <W>/src/a
7c5b5505 2026-06-08 02:30:00 box a,felhom-offbox <W>/src/a
4f849183 2026-06-09 02:30:00 box a,felhom-offbox <W>/src/a
28307a76 2026-06-10 02:30:00 box a,felhom-offbox <W>/src/a
c9182c36 2026-06-11 02:30:00 box a,felhom-offbox <W>/src/a
48d17034 2026-06-12 02:30:00 box a,felhom-offbox <W>/src/a
a0c476e1 2026-06-12 14:10:00 box a,felhom-offbox <W>/src/a
37940620 2026-06-13 02:30:00 box a,felhom-offbox <W>/src/a
b0240087 2026-06-14 02:30:00 box a,felhom-offbox <W>/src/a
573fbae8 2026-06-15 02:30:00 box a,felhom-offbox <W>/src/a
5e759a21 2026-06-16 02:30:00 box a,felhom-offbox <W>/src/a
cf724e77 2026-06-17 02:30:00 box a,felhom-offbox <W>/src/a
4b118972 2026-06-18 02:30:00 box a,felhom-offbox <W>/src/a
f8793dc2 2026-06-19 02:30:00 box a,felhom-offbox <W>/src/a
0f16b002 2026-06-20 02:30:00 box a,felhom-offbox <W>/src/a
11be0ee3 2026-06-21 02:30:00 box a,felhom-offbox <W>/src/a
df2cd6a0 2026-06-21 14:10:00 box a,felhom-offbox <W>/src/a
45b73f82 2026-06-22 02:30:00 box a,felhom-offbox <W>/src/a
1deb37d6 2026-06-23 02:30:00 box a,felhom-offbox <W>/src/a
a28a97b2 2026-06-24 02:30:00 box a,felhom-offbox <W>/src/a
fd399042 2026-06-25 02:30:00 box a,felhom-offbox <W>/src/a
902bbc6e 2026-06-26 02:30:00 box a,felhom-offbox <W>/src/a
6b994fb0 2026-06-27 02:30:00 box a,felhom-offbox <W>/src/a
4841074f 2026-06-28 02:30:00 box a,felhom-offbox <W>/src/a
0757e64a 2026-06-29 02:30:00 box a,felhom-offbox <W>/src/a
37fadb18 2026-06-30 02:30:00 box a,felhom-offbox <W>/src/a
7aae1393 2026-07-01 02:30:00 box a,felhom-offbox <W>/src/a
dcc3ec41 2026-07-02 02:30:00 box a,felhom-offbox <W>/src/a
c8f6eb05 2026-07-03 02:30:00 box a,felhom-offbox <W>/src/a
e2bf3420 2026-07-04 02:30:00 box a,felhom-offbox <W>/src/a
ab10a3bb 2026-07-05 02:30:00 box a,felhom-offbox <W>/src/a
77072eae 2026-07-06 02:30:00 box a,felhom-offbox <W>/src/a
6a6b4e52 2026-07-07 02:30:00 box a,felhom-offbox <W>/src/a
e7232f1d 2026-07-08 02:30:00 box a,felhom-offbox <W>/src/a
57f98a04 2026-07-09 02:30:00 box a,felhom-offbox <W>/src/a
454fe67a 2026-07-09 14:10:00 box a,felhom-offbox <W>/src/a
6bf3bb2f 2026-07-10 02:30:00 box a,felhom-offbox <W>/src/a
22a6f643 2026-07-11 02:30:00 box a,felhom-offbox <W>/src/a
4c584c3c 2026-07-12 02:30:00 box a,felhom-offbox <W>/src/a
6b212603 2026-07-13 02:30:00 box a,felhom-offbox <W>/src/a
bea3a812 2026-07-14 02:30:00 box a,felhom-offbox <W>/src/a
e6bace4c 2026-07-15 02:30:00 box a,felhom-offbox <W>/src/a
77d4182e 2026-07-16 02:30:00 box a,felhom-offbox <W>/src/a
63bcd85b 2026-07-17 02:30:00 box a,felhom-offbox <W>/src/a
3b1a43dc 2026-07-18 02:30:00 box a,felhom-offbox <W>/src/a
0bc845a4 2026-07-18 14:10:00 box a,felhom-offbox <W>/src/a
18a865dc 2026-07-19 02:30:00 box a,felhom-offbox <W>/src/a
ba7ff236 2026-07-20 02:30:00 box a,felhom-offbox <W>/src/a
3acec8c9 2026-07-21 02:30:00 box a,felhom-offbox <W>/src/a
fd032617 2026-07-22 02:30:00 box a,felhom-offbox <W>/src/a
fa6d63e1 2026-07-23 02:30:00 box a,felhom-offbox <W>/src/a
69f6bb28 2026-07-24 02:30:00 box a,felhom-offbox <W>/src/a
69dba03f 2026-07-25 02:30:00 box a,felhom-offbox <W>/src/a
85128e1a 2026-07-26 02:30:00 box a,felhom-offbox <W>/src/a
64bb4c3f 2026-07-27 02:30:00 box a,felhom-offbox <W>/src/a
2ec9bd3e 2026-07-27 14:10:00 box a,felhom-offbox <W>/src/a
d0dad73a 2026-07-28 02:30:00 box a,felhom-offbox <W>/src/a
5a9303b6 2026-07-29 02:30:00 box a,felhom-offbox <W>/src/a
055989d8 2026-07-30 02:30:00 box a,felhom-offbox <W>/src/a
fead4fb4 2026-08-01 02:30:00 box a,felhom-offbox <W>/src/a
4a1fd03b 2026-08-02 02:30:00 box a,felhom-offbox <W>/src/a
b76bbe6b 2026-08-03 02:30:00 box a,felhom-offbox <W>/src/a
3fc058ca 2026-08-04 02:30:00 box a,felhom-offbox <W>/src/a
809fbefd 2026-08-05 02:30:00 box a,felhom-offbox <W>/src/a
034515e1 2026-08-05 14:10:00 box a,felhom-offbox <W>/src/a
dfbe7317 2026-08-06 02:30:00 box a,felhom-offbox <W>/src/a
871d237a 2026-08-07 02:30:00 box a,felhom-offbox <W>/src/a
ee702f60 2026-08-08 02:30:00 box a,felhom-offbox <W>/src/a
efbae105 2026-08-09 02:30:00 box a,felhom-offbox <W>/src/a
f2dccbdc 2026-08-10 02:30:00 box a,felhom-offbox <W>/src/a
034f04d0 2026-08-11 02:30:00 box a,felhom-offbox <W>/src/a
cfcc9376 2026-08-12 02:30:00 box a,felhom-offbox <W>/src/a
2c8fbc96 2026-08-13 02:30:00 box a,felhom-offbox <W>/src/a
16e7c50a 2026-08-14 02:30:00 box a,felhom-offbox <W>/src/a
5b178039 2026-08-14 14:10:00 box a,felhom-offbox <W>/src/a
8b5e7881 2026-08-15 02:30:00 box a,felhom-offbox <W>/src/a
48129420 2026-08-16 02:30:00 box a,felhom-offbox <W>/src/a
cbace118 2026-08-17 02:30:00 box a,felhom-offbox <W>/src/a
5041239e 2026-08-18 02:30:00 box a,felhom-offbox <W>/src/a
f0001b70 2026-08-19 02:30:00 box a,felhom-offbox <W>/src/a
35511892 2026-08-20 02:30:00 box a,felhom-offbox <W>/src/a
a25ddedb 2026-08-21 02:30:00 box a,felhom-offbox <W>/src/a
83b7a7bb 2026-08-22 02:30:00 box a,felhom-offbox <W>/src/a
d3606ba9 2026-08-23 02:30:00 box a,felhom-offbox <W>/src/a
a8caee32 2026-08-23 14:10:00 box a,felhom-offbox <W>/src/a
31d6b8f7 2026-08-24 02:30:00 box a,felhom-offbox <W>/src/a
cac533c3 2026-08-25 02:30:00 box a,felhom-offbox <W>/src/a
f50266af 2026-08-26 02:30:00 box a,felhom-offbox <W>/src/a
3ff86b96 2026-08-27 02:30:00 box a,felhom-offbox <W>/src/a
533e5a7d 2026-08-28 02:30:00 box a,felhom-offbox <W>/src/a
ed6d22d5 2026-08-29 02:30:00 box a,felhom-offbox <W>/src/a
37b9d011 2026-08-30 02:30:00 box a,felhom-offbox <W>/src/a
b5a1a0ac 2026-09-01 02:30:00 box a,felhom-offbox <W>/src/a
b4b57fc7 2026-09-01 14:10:00 box a,felhom-offbox <W>/src/a
d04c4116 2026-09-02 02:30:00 box a,felhom-offbox <W>/src/a
02b2f992 2026-09-03 02:30:00 box a,felhom-offbox <W>/src/a
6dab8693 2026-09-04 02:30:00 box a,felhom-offbox <W>/src/a
36acac77 2026-09-05 02:30:00 box a,felhom-offbox <W>/src/a
06eb52f2 2026-09-06 02:30:00 box a,felhom-offbox <W>/src/a
8cdd6ceb 2026-09-07 02:30:00 box a,felhom-offbox <W>/src/a
cd407456 2026-09-08 02:30:00 box a,felhom-offbox <W>/src/a
ea01bb40 2026-09-09 02:30:00 box a,felhom-offbox <W>/src/a
95c7e048 2026-09-10 02:30:00 box a,felhom-offbox <W>/src/a
0afaee19 2026-09-10 14:10:00 box a,felhom-offbox <W>/src/a
265703f3 2026-09-11 02:30:00 box a,felhom-offbox <W>/src/a
d7010979 2026-09-12 02:30:00 box a,felhom-offbox <W>/src/a
36341c94 2026-09-13 02:30:00 box a,felhom-offbox <W>/src/a
2fe66096 2026-09-14 02:30:00 box a,felhom-offbox <W>/src/a
eff9c539 2026-09-15 02:30:00 box a,felhom-offbox <W>/src/a
5037d619 2026-09-16 02:30:00 box a,felhom-offbox <W>/src/a
13362fe8 2026-09-17 02:30:00 box a,felhom-offbox <W>/src/a
7bc717c3 2026-09-18 02:30:00 box a,felhom-offbox <W>/src/a
3a0162bd 2026-09-19 02:30:00 box a,felhom-offbox <W>/src/a
0629599b 2026-09-19 14:10:00 box a,felhom-offbox <W>/src/a
338bb83f 2026-09-20 02:30:00 box a,felhom-offbox <W>/src/a
6ef1247b 2026-09-21 02:30:00 box a,felhom-offbox <W>/src/a
0e9f2fd3 2026-09-22 02:30:00 box a,felhom-offbox <W>/src/a
e391dae4 2026-09-23 02:30:00 box a,felhom-offbox <W>/src/a
67f9dbb1 2026-09-24 02:30:00 box a,felhom-offbox <W>/src/a
3a93ae89 2026-09-25 02:30:00 box a,felhom-offbox <W>/src/a
60dabff3 2026-09-26 02:30:00 box a,felhom-offbox <W>/src/a
504c5bd6 2026-09-28 02:30:00 box a,felhom-offbox <W>/src/a
357c7267 2026-09-28 14:10:00 box a,felhom-offbox <W>/src/a
4391b722 2026-09-29 02:30:00 box a,felhom-offbox <W>/src/a
488452f5 2026-10-01 02:30:00 box a,felhom-offbox <W>/src/a
52995377 2026-10-02 02:30:00 box a,felhom-offbox <W>/src/a
d92eafc1 2026-10-03 02:30:00 box a,felhom-offbox <W>/src/a
d4947064 2026-10-05 02:30:00 box a,felhom-offbox <W>/src/a
c9460062 2026-10-06 02:30:00 box a,felhom-offbox <W>/src/a
a3363dc9 2026-10-07 02:30:00 box a,felhom-offbox <W>/src/a
268dc8f4 2026-10-07 14:10:00 box a,felhom-offbox <W>/src/a
fea94d1c 2026-10-08 02:30:00 box a,felhom-offbox <W>/src/a
4fbbc2b9 2026-10-09 02:30:00 box a,felhom-offbox <W>/src/a
6479bd91 2026-10-16 02:30:00 box a,felhom-offbox <W>/src/a
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Timestamps shown in UTC
243 snapshots
keep 14 snapshots:
ID Time Host Tags Reasons Paths
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
36accea8 2026-05-31 02:30:00 box b,felhom-offbox monthly snapshot <W>/src/b
e82153e3 2026-06-30 02:30:00 box b,felhom-offbox monthly snapshot <W>/src/b
7db7628f 2026-07-31 02:30:00 box b,felhom-offbox monthly snapshot <W>/src/b
96548538 2026-08-31 02:30:00 box b,felhom-offbox monthly snapshot <W>/src/b
3c827e18 2026-09-27 02:30:00 box b,felhom-offbox weekly snapshot <W>/src/b
b7a6d53e 2026-09-30 02:30:00 box b,felhom-offbox monthly snapshot <W>/src/b
f8ab7abd 2026-10-04 02:30:00 box b,felhom-offbox weekly snapshot <W>/src/b
dd10b8c4 2026-10-10 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
b7b3a5e5 2026-10-11 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
weekly snapshot
9727e882 2026-10-12 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
d79e9f8f 2026-10-13 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
9f0146b2 2026-10-14 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
304b8e9e 2026-10-15 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
d76b401f 2026-10-16 02:30:00 box b,felhom-offbox daily snapshot <W>/src/b
weekly snapshot
monthly snapshot
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Timestamps shown in UTC
14 snapshots
remove 231 snapshots:
ID Time Host Tags Paths
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6a402dc0 2026-02-28 02:30:00 box b,felhom-offbox <W>/src/b
beb44caf 2026-03-01 02:30:00 box b,felhom-offbox <W>/src/b
66ac8d3c 2026-03-02 02:30:00 box b,felhom-offbox <W>/src/b
d4722099 2026-03-03 02:30:00 box b,felhom-offbox <W>/src/b
dc4433db 2026-03-04 02:30:00 box b,felhom-offbox <W>/src/b
917dca0d 2026-03-05 02:30:00 box b,felhom-offbox <W>/src/b
4a98db6a 2026-03-06 02:30:00 box b,felhom-offbox <W>/src/b
d46839d3 2026-03-07 02:30:00 box b,felhom-offbox <W>/src/b
d22b6a34 2026-03-08 02:30:00 box b,felhom-offbox <W>/src/b
b8f477ee 2026-03-08 23:40:00 box b,felhom-offbox <W>/src/b
db8f3f50 2026-03-09 02:30:00 box b,felhom-offbox <W>/src/b
bff6bc4a 2026-03-10 02:30:00 box b,felhom-offbox <W>/src/b
d9427e12 2026-03-11 02:30:00 box b,felhom-offbox <W>/src/b
9d487b80 2026-03-12 02:30:00 box b,felhom-offbox <W>/src/b
95eaac16 2026-03-13 02:30:00 box b,felhom-offbox <W>/src/b
d003ea92 2026-03-14 02:30:00 box b,felhom-offbox <W>/src/b
c08f7015 2026-03-15 02:30:00 box b,felhom-offbox <W>/src/b
0239cfc4 2026-03-16 02:30:00 box b,felhom-offbox <W>/src/b
6496efdd 2026-03-17 02:30:00 box b,felhom-offbox <W>/src/b
5369ad4a 2026-03-18 02:30:00 box b,felhom-offbox <W>/src/b
ecce625b 2026-03-19 02:30:00 box b,felhom-offbox <W>/src/b
a9891d86 2026-03-20 02:30:00 box b,felhom-offbox <W>/src/b
4d4a77f1 2026-03-21 02:30:00 box b,felhom-offbox <W>/src/b
c7c9eaa7 2026-03-22 02:30:00 box b,felhom-offbox <W>/src/b
24143eb5 2026-03-23 02:30:00 box b,felhom-offbox <W>/src/b
55613027 2026-03-24 02:30:00 box b,felhom-offbox <W>/src/b
c1d613e6 2026-03-25 02:30:00 box b,felhom-offbox <W>/src/b
c3e44c0b 2026-03-25 23:40:00 box b,felhom-offbox <W>/src/b
b11a66ef 2026-03-26 02:30:00 box b,felhom-offbox <W>/src/b
8fbe9d3b 2026-03-27 02:30:00 box b,felhom-offbox <W>/src/b
6c9df060 2026-03-28 02:30:00 box b,felhom-offbox <W>/src/b
d9084464 2026-03-29 02:30:00 box b,felhom-offbox <W>/src/b
e41f49b6 2026-03-30 02:30:00 box b,felhom-offbox <W>/src/b
2c2da14e 2026-03-31 02:30:00 box b,felhom-offbox <W>/src/b
ed46e7f4 2026-04-01 02:30:00 box b,felhom-offbox <W>/src/b
c7c247ee 2026-04-02 02:30:00 box b,felhom-offbox <W>/src/b
c639f637 2026-04-03 02:30:00 box b,felhom-offbox <W>/src/b
b54b9eeb 2026-04-04 02:30:00 box b,felhom-offbox <W>/src/b
4a91df7b 2026-04-05 02:30:00 box b,felhom-offbox <W>/src/b
da8ace42 2026-04-06 02:30:00 box b,felhom-offbox <W>/src/b
3661cf00 2026-04-07 02:30:00 box b,felhom-offbox <W>/src/b
12506e4b 2026-04-08 02:30:00 box b,felhom-offbox <W>/src/b
ca81d3bf 2026-04-09 02:30:00 box b,felhom-offbox <W>/src/b
cb4ac262 2026-04-10 02:30:00 box b,felhom-offbox <W>/src/b
6b191a1b 2026-04-11 02:30:00 box b,felhom-offbox <W>/src/b
7c5da2c1 2026-04-11 22:40:00 box b,felhom-offbox <W>/src/b
50829770 2026-04-12 02:30:00 box b,felhom-offbox <W>/src/b
9d4de4d0 2026-04-13 02:30:00 box b,felhom-offbox <W>/src/b
9940ffa2 2026-04-14 02:30:00 box b,felhom-offbox <W>/src/b
fc26f5c2 2026-04-15 02:30:00 box b,felhom-offbox <W>/src/b
7e86073f 2026-04-16 02:30:00 box b,felhom-offbox <W>/src/b
f33c694b 2026-04-17 02:30:00 box b,felhom-offbox <W>/src/b
055bd980 2026-04-18 02:30:00 box b,felhom-offbox <W>/src/b
a5b7c6ee 2026-04-19 02:30:00 box b,felhom-offbox <W>/src/b
12acc17d 2026-04-20 02:30:00 box b,felhom-offbox <W>/src/b
e2412763 2026-04-21 02:30:00 box b,felhom-offbox <W>/src/b
cbe3e534 2026-04-22 02:30:00 box b,felhom-offbox <W>/src/b
04fec27c 2026-04-23 02:30:00 box b,felhom-offbox <W>/src/b
f2c51703 2026-04-24 02:30:00 box b,felhom-offbox <W>/src/b
a2fc8669 2026-04-25 02:30:00 box b,felhom-offbox <W>/src/b
efac66aa 2026-04-26 02:30:00 box b,felhom-offbox <W>/src/b
24be8a0a 2026-04-27 02:30:00 box b,felhom-offbox <W>/src/b
7d9e6ac5 2026-04-28 02:30:00 box b,felhom-offbox <W>/src/b
6d1bfcbf 2026-04-28 22:40:00 box b,felhom-offbox <W>/src/b
b7570692 2026-04-29 02:30:00 box b,felhom-offbox <W>/src/b
7859f130 2026-04-30 02:30:00 box b,felhom-offbox <W>/src/b
5501314e 2026-05-01 02:30:00 box b,felhom-offbox <W>/src/b
852384d0 2026-05-02 02:30:00 box b,felhom-offbox <W>/src/b
1a806311 2026-05-03 02:30:00 box b,felhom-offbox <W>/src/b
22050be5 2026-05-04 02:30:00 box b,felhom-offbox <W>/src/b
d2bf9a42 2026-05-05 02:30:00 box b,felhom-offbox <W>/src/b
ca8c2f85 2026-05-06 02:30:00 box b,felhom-offbox <W>/src/b
26b220be 2026-05-07 02:30:00 box b,felhom-offbox <W>/src/b
506491f2 2026-05-08 02:30:00 box b,felhom-offbox <W>/src/b
688189a0 2026-05-09 02:30:00 box b,felhom-offbox <W>/src/b
ecaac318 2026-05-10 02:30:00 box b,felhom-offbox <W>/src/b
e0b9a354 2026-05-11 02:30:00 box b,felhom-offbox <W>/src/b
e2a52b54 2026-05-12 02:30:00 box b,felhom-offbox <W>/src/b
3ec096df 2026-05-13 02:30:00 box b,felhom-offbox <W>/src/b
e9738d4d 2026-05-14 02:30:00 box b,felhom-offbox <W>/src/b
052e0896 2026-05-15 02:30:00 box b,felhom-offbox <W>/src/b
84b7a47d 2026-05-15 22:40:00 box b,felhom-offbox <W>/src/b
7583f66d 2026-05-16 02:30:00 box b,felhom-offbox <W>/src/b
058d5813 2026-05-17 02:30:00 box b,felhom-offbox <W>/src/b
cbbe7dd1 2026-05-18 02:30:00 box b,felhom-offbox <W>/src/b
b1cb0174 2026-05-19 02:30:00 box b,felhom-offbox <W>/src/b
54cf284e 2026-05-20 02:30:00 box b,felhom-offbox <W>/src/b
b3e53f97 2026-05-21 02:30:00 box b,felhom-offbox <W>/src/b
76846bd0 2026-05-22 02:30:00 box b,felhom-offbox <W>/src/b
3c3c3196 2026-05-23 02:30:00 box b,felhom-offbox <W>/src/b
7a099ec5 2026-05-24 02:30:00 box b,felhom-offbox <W>/src/b
3f2d9830 2026-05-25 02:30:00 box b,felhom-offbox <W>/src/b
4f18917e 2026-05-26 02:30:00 box b,felhom-offbox <W>/src/b
04df6307 2026-05-27 02:30:00 box b,felhom-offbox <W>/src/b
10afba47 2026-05-28 02:30:00 box b,felhom-offbox <W>/src/b
f50ed158 2026-05-29 02:30:00 box b,felhom-offbox <W>/src/b
0ba92ebe 2026-05-30 02:30:00 box b,felhom-offbox <W>/src/b
2facd99e 2026-06-01 02:30:00 box b,felhom-offbox <W>/src/b
1084e6fd 2026-06-01 22:40:00 box b,felhom-offbox <W>/src/b
8f4863ec 2026-06-02 02:30:00 box b,felhom-offbox <W>/src/b
20c5e566 2026-06-03 02:30:00 box b,felhom-offbox <W>/src/b
aa1fe73c 2026-06-04 02:30:00 box b,felhom-offbox <W>/src/b
b259befd 2026-06-05 02:30:00 box b,felhom-offbox <W>/src/b
b361cc39 2026-06-06 02:30:00 box b,felhom-offbox <W>/src/b
a9fe08a7 2026-06-07 02:30:00 box b,felhom-offbox <W>/src/b
03a3a73c 2026-06-08 02:30:00 box b,felhom-offbox <W>/src/b
236e0f4c 2026-06-09 02:30:00 box b,felhom-offbox <W>/src/b
a4dc8756 2026-06-10 02:30:00 box b,felhom-offbox <W>/src/b
468c771f 2026-06-11 02:30:00 box b,felhom-offbox <W>/src/b
c14384d3 2026-06-12 02:30:00 box b,felhom-offbox <W>/src/b
31486f77 2026-06-13 02:30:00 box b,felhom-offbox <W>/src/b
ae3b14ac 2026-06-14 02:30:00 box b,felhom-offbox <W>/src/b
a24c3aa1 2026-06-15 02:30:00 box b,felhom-offbox <W>/src/b
bc3c78db 2026-06-16 02:30:00 box b,felhom-offbox <W>/src/b
2ad5af51 2026-06-17 02:30:00 box b,felhom-offbox <W>/src/b
2680ffc7 2026-06-18 02:30:00 box b,felhom-offbox <W>/src/b
2c424261 2026-06-18 22:40:00 box b,felhom-offbox <W>/src/b
bd97943b 2026-06-19 02:30:00 box b,felhom-offbox <W>/src/b
b825d642 2026-06-20 02:30:00 box b,felhom-offbox <W>/src/b
d417005e 2026-06-21 02:30:00 box b,felhom-offbox <W>/src/b
9940af16 2026-06-22 02:30:00 box b,felhom-offbox <W>/src/b
5f309e2c 2026-06-23 02:30:00 box b,felhom-offbox <W>/src/b
f71f4a3b 2026-06-24 02:30:00 box b,felhom-offbox <W>/src/b
8308f20d 2026-06-25 02:30:00 box b,felhom-offbox <W>/src/b
394d9ceb 2026-06-26 02:30:00 box b,felhom-offbox <W>/src/b
eec81a2c 2026-06-27 02:30:00 box b,felhom-offbox <W>/src/b
1d2ea3fe 2026-06-28 02:30:00 box b,felhom-offbox <W>/src/b
3c5d64c0 2026-06-29 02:30:00 box b,felhom-offbox <W>/src/b
42068a48 2026-07-01 02:30:00 box b,felhom-offbox <W>/src/b
0e911cf9 2026-07-02 02:30:00 box b,felhom-offbox <W>/src/b
c0e5084c 2026-07-03 02:30:00 box b,felhom-offbox <W>/src/b
93940831 2026-07-04 02:30:00 box b,felhom-offbox <W>/src/b
4e6adc60 2026-07-05 02:30:00 box b,felhom-offbox <W>/src/b
03ee4458 2026-07-05 22:40:00 box b,felhom-offbox <W>/src/b
230bd9ae 2026-07-06 02:30:00 box b,felhom-offbox <W>/src/b
8b257ab2 2026-07-07 02:30:00 box b,felhom-offbox <W>/src/b
703c6fd9 2026-07-08 02:30:00 box b,felhom-offbox <W>/src/b
c9a36d5c 2026-07-09 02:30:00 box b,felhom-offbox <W>/src/b
14f21efd 2026-07-10 02:30:00 box b,felhom-offbox <W>/src/b
c970ed6f 2026-07-11 02:30:00 box b,felhom-offbox <W>/src/b
57f5c22e 2026-07-12 02:30:00 box b,felhom-offbox <W>/src/b
43b23661 2026-07-13 02:30:00 box b,felhom-offbox <W>/src/b
13c2ac05 2026-07-14 02:30:00 box b,felhom-offbox <W>/src/b
a9b8e21c 2026-07-15 02:30:00 box b,felhom-offbox <W>/src/b
b7830a8a 2026-07-16 02:30:00 box b,felhom-offbox <W>/src/b
b2bda3c4 2026-07-17 02:30:00 box b,felhom-offbox <W>/src/b
54ec14ca 2026-07-18 02:30:00 box b,felhom-offbox <W>/src/b
688c5e87 2026-07-19 02:30:00 box b,felhom-offbox <W>/src/b
fe60b55b 2026-07-20 02:30:00 box b,felhom-offbox <W>/src/b
8410e869 2026-07-21 02:30:00 box b,felhom-offbox <W>/src/b
4e33c281 2026-07-22 02:30:00 box b,felhom-offbox <W>/src/b
7f924a70 2026-07-22 22:40:00 box b,felhom-offbox <W>/src/b
11020603 2026-07-23 02:30:00 box b,felhom-offbox <W>/src/b
82d8cc6d 2026-07-24 02:30:00 box b,felhom-offbox <W>/src/b
30645b80 2026-07-25 02:30:00 box b,felhom-offbox <W>/src/b
00ba72b7 2026-07-26 02:30:00 box b,felhom-offbox <W>/src/b
d0f27361 2026-07-27 02:30:00 box b,felhom-offbox <W>/src/b
817beade 2026-07-28 02:30:00 box b,felhom-offbox <W>/src/b
be12d398 2026-07-29 02:30:00 box b,felhom-offbox <W>/src/b
88543a7f 2026-07-30 02:30:00 box b,felhom-offbox <W>/src/b
7e766bfd 2026-08-01 02:30:00 box b,felhom-offbox <W>/src/b
104fda2d 2026-08-02 02:30:00 box b,felhom-offbox <W>/src/b
d4a3ead0 2026-08-03 02:30:00 box b,felhom-offbox <W>/src/b
79d589c5 2026-08-04 02:30:00 box b,felhom-offbox <W>/src/b
7a23ddd0 2026-08-05 02:30:00 box b,felhom-offbox <W>/src/b
694583af 2026-08-06 02:30:00 box b,felhom-offbox <W>/src/b
07905789 2026-08-07 02:30:00 box b,felhom-offbox <W>/src/b
66eb1cea 2026-08-08 02:30:00 box b,felhom-offbox <W>/src/b
da6fecd2 2026-08-08 22:40:00 box b,felhom-offbox <W>/src/b
876812a8 2026-08-09 02:30:00 box b,felhom-offbox <W>/src/b
3d88252f 2026-08-10 02:30:00 box b,felhom-offbox <W>/src/b
475b1897 2026-08-11 02:30:00 box b,felhom-offbox <W>/src/b
4bc78500 2026-08-12 02:30:00 box b,felhom-offbox <W>/src/b
0c015408 2026-08-13 02:30:00 box b,felhom-offbox <W>/src/b
62346cc4 2026-08-14 02:30:00 box b,felhom-offbox <W>/src/b
a8695b01 2026-08-15 02:30:00 box b,felhom-offbox <W>/src/b
c081b4c3 2026-08-16 02:30:00 box b,felhom-offbox <W>/src/b
05191842 2026-08-17 02:30:00 box b,felhom-offbox <W>/src/b
fc548112 2026-08-18 02:30:00 box b,felhom-offbox <W>/src/b
bd460956 2026-08-19 02:30:00 box b,felhom-offbox <W>/src/b
e9f8dccc 2026-08-20 02:30:00 box b,felhom-offbox <W>/src/b
84eb1974 2026-08-21 02:30:00 box b,felhom-offbox <W>/src/b
c1f9df12 2026-08-22 02:30:00 box b,felhom-offbox <W>/src/b
f1a8340a 2026-08-23 02:30:00 box b,felhom-offbox <W>/src/b
ba65914b 2026-08-24 02:30:00 box b,felhom-offbox <W>/src/b
9dfa74cb 2026-08-25 02:30:00 box b,felhom-offbox <W>/src/b
9da83081 2026-08-25 22:40:00 box b,felhom-offbox <W>/src/b
1a74877e 2026-08-26 02:30:00 box b,felhom-offbox <W>/src/b
d46ac7a8 2026-08-27 02:30:00 box b,felhom-offbox <W>/src/b
d28f0225 2026-08-28 02:30:00 box b,felhom-offbox <W>/src/b
b20ddf0c 2026-08-29 02:30:00 box b,felhom-offbox <W>/src/b
566e708b 2026-08-30 02:30:00 box b,felhom-offbox <W>/src/b
5e77a4b4 2026-09-01 02:30:00 box b,felhom-offbox <W>/src/b
e57521de 2026-09-02 02:30:00 box b,felhom-offbox <W>/src/b
d4c9a9be 2026-09-03 02:30:00 box b,felhom-offbox <W>/src/b
5aa997a3 2026-09-04 02:30:00 box b,felhom-offbox <W>/src/b
eb221b8b 2026-09-05 02:30:00 box b,felhom-offbox <W>/src/b
6de4d01b 2026-09-06 02:30:00 box b,felhom-offbox <W>/src/b
7a54ac59 2026-09-07 02:30:00 box b,felhom-offbox <W>/src/b
8a9f46fc 2026-09-08 02:30:00 box b,felhom-offbox <W>/src/b
e381761e 2026-09-09 02:30:00 box b,felhom-offbox <W>/src/b
9ea9a862 2026-09-10 02:30:00 box b,felhom-offbox <W>/src/b
e37779c4 2026-09-11 02:30:00 box b,felhom-offbox <W>/src/b
5a50be81 2026-09-11 22:40:00 box b,felhom-offbox <W>/src/b
8619c49a 2026-09-12 02:30:00 box b,felhom-offbox <W>/src/b
fafb42b7 2026-09-13 02:30:00 box b,felhom-offbox <W>/src/b
dce8f22f 2026-09-14 02:30:00 box b,felhom-offbox <W>/src/b
1c324ca6 2026-09-15 02:30:00 box b,felhom-offbox <W>/src/b
9c7d21c8 2026-09-16 02:30:00 box b,felhom-offbox <W>/src/b
beb3becb 2026-09-17 02:30:00 box b,felhom-offbox <W>/src/b
1c2538d2 2026-09-18 02:30:00 box b,felhom-offbox <W>/src/b
797667df 2026-09-19 02:30:00 box b,felhom-offbox <W>/src/b
b036fb39 2026-09-20 02:30:00 box b,felhom-offbox <W>/src/b
52617b0f 2026-09-21 02:30:00 box b,felhom-offbox <W>/src/b
0fb2da28 2026-09-22 02:30:00 box b,felhom-offbox <W>/src/b
4cfb09bd 2026-09-23 02:30:00 box b,felhom-offbox <W>/src/b
a39ced85 2026-09-24 02:30:00 box b,felhom-offbox <W>/src/b
015979f0 2026-09-25 02:30:00 box b,felhom-offbox <W>/src/b
3abe3ef9 2026-09-26 02:30:00 box b,felhom-offbox <W>/src/b
7033fff6 2026-09-28 02:30:00 box b,felhom-offbox <W>/src/b
d85ee2c6 2026-09-28 22:40:00 box b,felhom-offbox <W>/src/b
5629a380 2026-09-29 02:30:00 box b,felhom-offbox <W>/src/b
544613c7 2026-10-01 02:30:00 box b,felhom-offbox <W>/src/b
54b5463c 2026-10-02 02:30:00 box b,felhom-offbox <W>/src/b
3fa9ba77 2026-10-03 02:30:00 box b,felhom-offbox <W>/src/b
5d0405f0 2026-10-05 02:30:00 box b,felhom-offbox <W>/src/b
4c51d9f0 2026-10-06 02:30:00 box b,felhom-offbox <W>/src/b
0f19d9b7 2026-10-07 02:30:00 box b,felhom-offbox <W>/src/b
338aeaae 2026-10-08 02:30:00 box b,felhom-offbox <W>/src/b
840009d1 2026-10-09 02:30:00 box b,felhom-offbox <W>/src/b
67143204 2026-10-15 22:40:00 box b,felhom-offbox <W>/src/b
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Timestamps shown in UTC
231 snapshots
[0:00] 100.00% 474 / 474 files deleted
474 snapshots have been removed, running prune
loading all snapshots...
finding data that is still in use for 28 snapshots
[0:00] 100.00% 28 / 28 snapshots
searching used packs...
collecting packs for deletion and repacking
[0:00] 100.00% 964 / 964 packs processed
to repack: 310 blobs / 86.833 KiB
this removes: 2 blobs / 486 B
to delete: 4938 blobs / 1.129 MiB
total prune: 4940 blobs / 1.129 MiB
remaining: 308 blobs / 71.907 KiB
unused size after prune: 0 B (0.00% of remaining size)
repacking packs
[0:00] 100.00% 58 / 58 packs repacked
rebuilding index
[0:00] 100.00% 503 / 503 indexes processed
[0:00] 100.00% 503 / 503 old indexes deleted
removing 964 old packs
[0:00] 100.00% 964 / 964 files deleted
done
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
snapshots made by 0.14.0: 502
plan-0.14.0-Europe_Budapest.json: remove 474 keep 28 — identical to 0.14.0/UTC: True
plan-0.14.0-UTC.json: remove 474 keep 28 — identical to 0.14.0/UTC: True
plan-0.19.1-Europe_Budapest.json: remove 474 keep 28 — identical to 0.14.0/UTC: True
plan-0.19.1-UTC.json: remove 474 keep 28 — identical to 0.14.0/UTC: True
after 0.19.1 forget --prune + a 0.19.1 backup:
0.14.0 lists: 29
0.19.1 lists: 29
0.14.0 check --read-data rc=0 (no errors were found)
0.14.0 restores the 0.19.1 snapshot: rc=0 content=f-new
0.19.1 restores a 0.14.0 snapshot (09367c72): rc=0 content=2026-10-16 a
@@ -0,0 +1,6 @@
trivy 0.74.0, felhom-controller:0.324.0-rc.1 (critical/high, fixable in brackets)
gitea.dooplex.hu/admin/felhom-controller:0.324.0-rc.1 (debia crit 1 (0) high 70 (0)
usr/libexec/docker/cli-plugins/docker-compose crit 0 (0) high 4 (4) ['golang.org/x/net@v0.58.0', 'stdlib@v1.26.8']
usr/local/bin/restic crit 0 (0) high 19 (19) ['golang.org/x/crypto@v0.52.0', 'golang.org/x/net@v0.55.0', 'golang.org/x/text@v0.37.0', 'google.golang.org/grpc@v1.81.1', 'stdlib@v1.26.4']
TOTAL crit 1 (0) high 93 (23)
before (0.323.0 = restic 0.18.1): crit 3 (2) high 122 (52), of which restic 2 (2) / 48 (48)
@@ -0,0 +1,5 @@
23:24:26 POST /sharing/enable {'enabled': 'on', 'server_name': 'FELHOMHP'} -> HTTP/2 303 /sharing?flash=flash.sharing.saved_preparing
23:24:26 POST /sharing/shares {'name': 'r1108', 'mode': 'new', 'storage_root': '/mnt/felhom-drives/hdd_1'} -> HTTP/2 303 /sharing?flash=flash.sharing.created
23:24:27 POST /sharing/password (value not shown) -> location: /sharing?flash=flash.sharing.pw_set_preparing
23:25:07 POST /sharing/shares/delete {'name': 'r1108'} -> HTTP/2 303 /sharing?flash=flash.sharing.deleted
23:25:07 POST /sharing/enable {'enabled': 'off', 'server_name': 'FELHOMHP'} -> HTTP/2 303 /sharing?flash=flash.sharing.disabled
@@ -0,0 +1,17 @@
== r1108-live — 2026-10-16T21:24:47Z
-- 1. smbclient with the household password: write, list, read back, delete
putting file /tmp/probe.txt as \probe-r1108-live.txt (2.8 kB/s) (average 2.8 kB/s)
probe-r1108-live.txt A 17 Fri Oct 16 21:24:47 2026
getting file \probe-r1108-live.txt of size 17 as /tmp/back.txt (16.6 KiloBytes/sec) (average 16.6 KiloBytes/sec)
read back: r1105-r1108-live
-- 2. negative control: a wrong password
session setup failed: NT_STATUS_LOGON_FAILURE
-- 3. nmbd: NetBIOS name query from DooPlex
192.168.0.155 FELHOMHP<00>
-- 4. avahi: mDNS A query for FELHOMHP.local
answer from 192.168.0.155: 192.168.0.155 for felhomhp.local
-- 5. wsdd: WS-Discovery Probe
ProbeMatches from: ['192.168.0.110', '192.168.0.155'] — the box (192.168.0.155) answered
rmdir: removing directory, '/mnt/felhom-drives/hdd_1/shares/r1108'
rmdir: removing directory, '/mnt/felhom-drives/hdd_1/shares'
0
@@ -0,0 +1,80 @@
rm: cannot remove '/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/night-restore-2026-10-17/P4/browser/.profile/Default': Directory not empty
{
"1_sign_in_lands_on": "/launcher",
"2_headers": {
"status": 200,
"xfo": "DENY",
"csp": "frame-ancestors 'none'"
},
"3_signout_control": {
"method": "post",
"hasCsrf": true
},
"4_after_signout": "/login",
"5_launcher_after_signout": "/login",
"6_sign_in_again": "/launcher",
"7_app grimmory-r1106.enkisfelhom.hu": {
"host": "grimmory-r1106.enkisfelhom.hu",
"path": "/setup",
"title": "Grimmory",
"gatePage": false
},
"7_app rallly-r1106.enkisfelhom.hu": {
"host": "rallly-r1106.enkisfelhom.hu",
"path": "/login",
"title": "Login",
"gatePage": false
},
"console": [
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
],
[
"log-error",
"Failed to load resource: the server responded with a status of 404 ()",
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
]
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@@ -0,0 +1,29 @@
# R-1096 — Redis persistence in the catalog (research, 2026-10-16 night; catalog HEAD af75dc0; nothing changed)
Read-only research (catalog compose files + upstream docs/source). No valkey image in the catalog. No `.felhom.yml`
classifies a Redis volume; every named volume (Redis included) rides the nightly volume dump, taken with the stack
stopped, so Redis saves cleanly first.
Facts that hold for all: `redis:7-alpine` / `7.4-alpine` without a config saves RDB snapshots to `/data` (3600/1,
300/100, 60/10000). An RDB file is written to a temp file and renamed only when complete — a full disk leaves the old
file intact (and `stop-writes-on-bgsave-error` refuses writes until a save succeeds, then recovers by itself). An
APPEND-ONLY file damaged in the middle (2026-09-24: zero bytes near the end, „Expected \r\n, got: 0000") makes Redis
abort until `redis-check-aof --fix`; `aof-load-truncated yes` only covers a cut-off tail.
| app | service | persistence today | volume | what the app keeps in Redis | verdict | recommendation | source |
|---|---|---|---|---|---|---|---|
| romm 5.3.1 | romm-redis (redis:7-alpine) | AOF + RDB | romm_redis_data | sessions; RQ job queues; caches reloaded at start; Switch TitleDB / LaunchBox stores (refilled by the next metadata task) | sessions + queue | AOF → RDB (`--appendonly no`) | docs.romm.app/4.9.2/install/redis-or-valkey/ ; github.com/rommapp/romm 5.3.1 backend/handler/redis_handler.py, backend/startup.py |
| docmost 0.96.0 | docmost-redis | AOF + RDB | docmost_redis_data | BullMQ queues (email, notifications, page history, search index, import/export) | queue | AOF → RDB | github.com/docmost/docmost docker-compose.yml, queue.constants.ts |
| paperless-ngx 2.20.15 | paperless-redis | AOF + RDB | paperless_redis_data | Celery queue (consumption, mail fetch, classifier) | queue | AOF → RDB (upstream's own broker uses the default RDB) | paperless-ngx docs/configuration.md, docker-compose.postgres.yml |
| immich v3.2.4 | immich-redis | AOF + RDB | immich_redis_data | BullMQ job queues + websocket pub/sub; every job can be re-queued from Administration → Jobs | throwaway queue | OFF (`--save "" --appendonly no`, tmpfs /data) — upstream runs it with no volume | immich docker/docker-compose.yml |
| nextcloud 34.0.4 | nextcloud-redis | AOF + RDB | nextcloud_redis_data | file-locking cache, shared cache, PHP sessions | cache + sessions | OFF (same shape) — upstream examples have no volume | nextcloud/docker README (REDIS_HOST), .examples |
| outline 1.10.1 | outline-redis | RDB (image default) | outline_redis_data | Bull queues, pub/sub, collaboration | queue | keep (RDB is full-disk-safe) | outline server/queues/index.ts, server/storage/redis.ts |
| dawarich 1.15.3 | dawarich-redis (7.4) | RDB only (`--save 900 1 --save 300 10 --appendonly no`) | dawarich_redis | Sidekiq queue + Rails cache | queue | keep (= upstream) | Freika/dawarich docker/docker-compose.yml |
Open before any template edit (why it was NOT edited tonight): the same Redis lines sit in ladder step files
(romm 2, docmost 1, nextcloud 2, immich 2) and the step rule for a compose-only change was not checked; removing a
volume from compose leaves the old volume on installed boxes (orphan — nightly dump and old-backup restore behaviour
unchecked); the AOF → RDB switch keeping existing data is likely (Redis 7 writes `dump.rdb` at a clean shutdown) but
unproven. Also: R-1096's own history is wrong — `audits/r672-2026-09-24/B7-redis-aof-fix.txt` shows RomM's AOF WAS
repaired on 2026-09-24 (cut by 6 631 B, fix_rc=0, romm-redis then running); the 2026-10-16 crash loop has no proven
cause (its Redis log was never read).
@@ -0,0 +1,15 @@
=== demo-hp
containers: 28 not healthy/running: none
restic 0.19.1 compiled with go1.26.4 on linux/amd64
2026/10/16 21:51:51 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.324.0-rc.1 → 0.324.0)
=== felhom-pve
containers: 9 not healthy/running: none
restic 0.19.1 compiled with go1.26.4 on linux/amd64
2026/10/16 21:51:43 [INFO] [selfupdate] Post-update startup: update successful (0.323.0 → 0.324.0)
=== root@192.168.0.154
containers: 17 not healthy/running: none
restic 0.19.1 compiled with go1.26.4 on linux/amd64
2026/10/16 21:51:54 [INFO] [selfupdate] Post-update startup: update successful (0.323.0 → 0.324.0)
felhom.enkisfelhom.hu /login: 200
felhom.demo-felhom.eu /login: 200
felhom.enkicsifelhom.hu /login: 200
@@ -0,0 +1,42 @@
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
== tester-1 (enkicsifelhom.hu): 13 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://media.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://media.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://plex.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://plex.enkicsifelhom.hu/r1033-check?q=1
OK http://prowlarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://prowlarr.enkicsifelhom.hu/r1033-check?q=1
OK http://radarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://radarr.enkicsifelhom.hu/r1033-check?q=1
OK http://sonarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://sonarr.enkicsifelhom.hu/r1033-check?q=1
OK http://torrent.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://torrent.enkicsifelhom.hu/r1033-check?q=1
OK http://transmission.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://transmission.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): 16 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://grimmory-r1106.enkisfelhom.hu/r1033-check?q=1 -> 301 https://grimmory-r1106.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://rallly-r1106.enkisfelhom.hu/r1033-check?q=1 -> 301 https://rallly-r1106.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,121 @@
#!/usr/bin/env python3
"""v0.324.0 night (R-983, R-976): the household's normal flow in headless Chrome through the PUBLIC addresses — sign in, sign out (now a POST form),
sign in again, a family-gated app (Grimmory), a setup-gated app (Rallly). Minimal CDP client: log in to the controller through its PUBLIC address in headless Chrome, open each
app-page tab, assert computed styles, collect console errors, save screenshots. The password is read
from a 0600 file and only ever sent inside a CDP message; it is never printed."""
import base64, json, os, socket, struct, subprocess, sys, time, urllib.request
CHROME = os.path.expanduser('~/.cache/ms-playwright/chromium_headless_shell-1243/chrome-headless-shell-linux64/chrome-headless-shell')
BASE = sys.argv[1] # https://felhom.enkisfelhom.hu
PWFILE = sys.argv[2] # the controller password (0600 file)
APPS = sys.argv[3].split(',') # family-gated,setup-gated app hostnames
OUT = sys.argv[4]
PORT = 9333
os.makedirs(OUT, exist_ok=True)
prof = os.path.join(OUT, '.profile')
proc = subprocess.Popen([CHROME, f'--remote-debugging-port={PORT}', '--no-sandbox', f'--user-data-dir={prof}',
'--window-size=1280,900', 'about:blank'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
try:
for _ in range(50):
try:
tabs = json.load(urllib.request.urlopen(f'http://127.0.0.1:{PORT}/json'))
break
except Exception:
time.sleep(0.2)
ws_url = [t for t in tabs if t['type'] == 'page'][0]['webSocketDebuggerUrl']
host, path = ws_url[len('ws://'):].split('/', 1)
h, p = host.split(':')
sock = socket.create_connection((h, int(p)))
key = base64.b64encode(os.urandom(16)).decode()
sock.send(f'GET /{path} HTTP/1.1\r\nHost: {host}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: {key}\r\nSec-WebSocket-Version: 13\r\n\r\n'.encode())
buf = b''
while b'\r\n\r\n' not in buf:
buf += sock.recv(4096)
st = {'pending': buf.split(b'\r\n\r\n', 1)[1]}
def send(obj):
data = json.dumps(obj).encode()
hdr = bytearray([0x81])
n = len(data)
if n < 126: hdr.append(0x80 | n)
elif n < 65536: hdr.append(0x80 | 126); hdr += struct.pack('>H', n)
else: hdr.append(0x80 | 127); hdr += struct.pack('>Q', n)
mask = os.urandom(4); hdr += mask
sock.sendall(bytes(hdr) + bytes(b ^ mask[i % 4] for i, b in enumerate(data)))
def recv_exact(n):
while len(st['pending']) < n:
st['pending'] += sock.recv(1 << 20)
out, st['pending'] = st['pending'][:n], st['pending'][n:]
return out
def recv():
msg = b''
while True:
b0, b1 = recv_exact(2)
n = b1 & 0x7f
if n == 126: n = struct.unpack('>H', recv_exact(2))[0]
elif n == 127: n = struct.unpack('>Q', recv_exact(8))[0]
msg += recv_exact(n)
if b0 & 0x80: return json.loads(msg)
console = []
mid = [0]
def call(method, **params):
mid[0] += 1; i = mid[0]
send({'id': i, 'method': method, 'params': params})
while True:
m = recv()
if m.get('method') == 'Runtime.exceptionThrown':
console.append(('exception', m['params']['exceptionDetails'].get('text', ''), m['params']['exceptionDetails'].get('exception', {}).get('description', '')[:200]))
elif m.get('method') == 'Runtime.consoleAPICalled' and m['params']['type'] in ('error', 'warning'):
console.append((m['params']['type'], ' '.join(str(a.get('value', a.get('description', ''))) for a in m['params']['args'])[:200]))
elif m.get('method') == 'Log.entryAdded' and m['params']['entry']['level'] in ('error', 'warning'):
e = m['params']['entry']; console.append(('log-' + e['level'], e.get('text', '')[:200], e.get('url', '')))
if m.get('id') == i:
if 'error' in m: raise RuntimeError(f'{method}: {m["error"]}')
return m.get('result', {})
def ev(expr):
r = call('Runtime.evaluate', expression=expr, returnByValue=True, awaitPromise=True)
return r.get('result', {}).get('value')
def goto(url):
call('Page.navigate', url=url)
for _ in range(100):
time.sleep(0.2)
if ev('document.readyState') == 'complete':
break
time.sleep(1.5) # images' onerror, layout
for d in ('Page', 'Runtime', 'Log', 'Network'):
call(d + '.enable')
res = {}
def login():
pw = open(PWFILE).read().strip()
goto(BASE + '/login')
ev("(function(){var f=document.querySelector('input[type=password]'); f.value=%s; f.form.submit(); return 1})()" % json.dumps(pw))
time.sleep(3)
return ev('location.pathname')
res['1_sign_in_lands_on'] = login()
res['2_headers'] = ev("fetch('/launcher',{credentials:'include'}).then(r=>({status:r.status, xfo:r.headers.get('x-frame-options'), csp:r.headers.get('content-security-policy')}))")
res['3_signout_control'] = ev("(function(){var f=[...document.querySelectorAll('form')].find(f=>/logout/.test(f.action)); return f?{method:f.method, hasCsrf:!!f.querySelector('input[name=_csrf]')}:null})()")
ev("(function(){var f=[...document.querySelectorAll('form')].find(f=>/logout/.test(f.action)); if(f){f.submit()} return !!f})()")
time.sleep(3)
res['4_after_signout'] = ev('location.pathname')
goto(BASE + '/launcher')
res['5_launcher_after_signout'] = ev('location.pathname')
res['6_sign_in_again'] = login()
for host in APPS:
goto('https://' + host + '/')
time.sleep(4)
res['7_app ' + host] = ev("({host: location.host, path: location.pathname, title: document.title, gatePage: !!document.querySelector('form[action*=\"__family\"],form[action*=\"__felhom_gate\"],[data-gate]') })")
def shot(name):
s = call('Page.captureScreenshot', format='png')
open(os.path.join(OUT, name + '.png'), 'wb').write(base64.b64decode(s['data']))
shot('last-app')
res['console'] = console[:20]
print(json.dumps(res, indent=1, ensure_ascii=False))
finally:
proc.terminate()
subprocess.run(['rm', '-rf', prof])
@@ -0,0 +1,116 @@
#!/usr/bin/env python3
"""drill.py — R-1105 Part 2 on demo-hp guest 9201, THROUGH THE PRODUCT (the endpoints the dashboard's buttons post).
Runs on DooPlex. Env: SC (0600 dir with .ctlpw), EV (evidence dir), TARGET=9201. Steps (one per invocation):
restore-old the product's off-site restore („Visszaállítás a távoli tárolóból", unit only) BEFORE any 0.18 backup:
restic 0.18.1 restores the newest snapshot, which restic 0.14.0 made
offsite-run „Távoli mentés most" (POST /backup/offbox/run: dumps + units + push), polled to its end
restore APP the household's full off-site restore: prepare (size), confirm → download, then „Teljes
visszaállítás" (POST /backup/offbox/reconstitute), each polled to its end
delcopy APP remove the verification copy (POST /backup/offbox/verify-copy/delete)
Nothing here writes to an app's data except what those buttons write.
"""
import json
import os
import re
import sys
import time
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
import box_walk as w # noqa: E402
EV = os.environ["EV"]
LOG = open(os.path.join(EV, "drill-console.txt"), "a", buffering=1)
_say = w.say
def say(*a):
_say(*a)
LOG.write(time.strftime("%H:%M:%S ") + " ".join(str(x) for x in a) + "\n")
w.say = say
def form(path, fields):
"""A dashboard FORM post with the session's CSRF — exactly what the button sends."""
sess = open(f"{w.SC}/sess{os.getpid()}.txt").read().strip()
csrf = open(f"{w.SC}/csrf{os.getpid()}.txt").read().strip()
args = ["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", w.HOSTHDR, "-H", f"Cookie: {sess}", "-X", "POST",
"--data-urlencode", f"_csrf={csrf}"]
for k, v in fields.items():
args += ["--data-urlencode", f"{k}={v}"]
r = w.sh(args + [f"{w.BASE}{path}"], timeout=180)
head = (r.stdout or "").split("\n")[0].strip()
loc = next((l.split(":", 1)[1].strip() for l in (r.stdout or "").split("\n") if l.lower().startswith("location:")), "")
say(f"POST {path} {fields} -> {head} {loc}")
return head, loc
def wait_restore(cap=3600):
t0, last = time.time(), None
while time.time() - t0 < cap:
code, d = w.ctl("GET", "/api/backup/restore-status")
dd = (d or {}).get("data") or d or {}
cur = (dd.get("running"), dd.get("op"), dd.get("ok"), (dd.get("message") or "")[:300])
if cur != last:
say(f" +{time.time()-t0:7.1f}s restore-status {cur}")
last = cur
if not dd.get("running") and time.time() - t0 > 4:
return dd
time.sleep(3)
say(" restore did not end within the cap")
return {}
def offsite_status():
return w.ctl("GET", "/backup/offbox/status")[1]
def offsite_run(cap=3600):
before = offsite_status()
say(f"off-site before: status={before.get('status')} last_run={before.get('last_run')} snapshots={before.get('snapshots')}")
form("/backup/offbox/run", {})
t0, last = time.time(), None
while time.time() - t0 < cap:
s = offsite_status()
p = s.get("progress") or {}
cur = (s.get("status"), p.get("phase"), p.get("current_app"), round(p.get("percent") or 0))
if cur != last:
say(f" +{time.time()-t0:7.1f}s {cur} files {p.get('files_done')}/{p.get('total_files')} bytes {p.get('done_human')}/{p.get('total_human')}")
last = cur
if s.get("last_run") != before.get("last_run") and not p.get("active") and s.get("status") != "running":
say(f"off-site after: status={s.get('status')} last_run={s.get('last_run')} duration={s.get('last_duration')} "
f"snapshots={s.get('snapshots')} size={s.get('repo_size_human')} error={s.get('last_error')!r}")
return s
time.sleep(3)
say("off-site run did not end within the cap")
return {}
def main():
step = sys.argv[1]
w.login()
if step == "restore-old":
app = sys.argv[2]
form("/backup/offbox/restore", {"app": app})
say(json.dumps(wait_restore()))
elif step == "offsite-run":
offsite_run()
elif step == "restore":
app = sys.argv[2]
head, loc = form("/backup/offbox/restore", {"app": app, "mode": "full"})
m = re.search(r"full_size=([^&]+)", loc)
say(f" prepared: size {m.group(1) if m else '?'}")
form("/backup/offbox/restore", {"app": app, "mode": "full", "confirm": "1"})
say(json.dumps(wait_restore()))
form("/backup/offbox/reconstitute", {"app": app, "confirm": "1"})
say(json.dumps(wait_restore()))
elif step == "delcopy":
form("/backup/offbox/verify-copy/delete", {"stack": sys.argv[2], "confirm": "1"})
else:
sys.exit(f"unknown step {step}")
if __name__ == "__main__":
main()
@@ -0,0 +1,118 @@
#!/usr/bin/env python3
"""drill2.py — R-1106 proof on demo-hp 9201 (controller 0.324.0-rc.N), THROUGH THE PRODUCT.
Runs on DooPlex. Env: SC (0600 dir with .ctlpw), EV (evidence dir), TARGET=9201. One step per call:
install APP deploy fresh (new generated passwords)
seed APP TAG a marker row in the app's database (+ a file in Grimmory's books folder); TAG names it
check APP TAG the app's state, the marker, auth errors in the app log, the DB logins with the app's env
offsite-run „Távoli mentés most" (dumps + units + push)
remove APP MODE MODE all = drive data + backups; keepbackups = drive data gone, backups kept;
keepdata = drive data kept, backups kept
restore-offsite APP full off-site restore (prepare, confirm, „Teljes visszaállítás")
restore-onbox APP the backups page's „Visszaállítás" from the app's own unit (POST /backup/restore)
install-kept APP install choosing „A megőrzött adataimat használom" (kept_data=use)
Database probes run INSIDE the app's own containers with the container's own env (`docker exec … sh -c '…$VAR…'`):
no password leaves the box or reaches this log.
"""
import json
import os
import sys
import time
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import drill # noqa: E402
w = drill.w
say = drill.say
SUB = {"rallly": "rallly-r1106", "grimmory": "grimmory-r1106"}
VALUES = {"grimmory": {"HDD_PATH": "/mnt/felhom-drives/hdd_1"}}
BOOKS = "/mnt/felhom-drives/hdd_1/userdata/media/grimmory"
SQL = {
"rallly": ("rallly-postgres", "psql -U rallly -d rallly -v ON_ERROR_STOP=1 -Atc"),
"grimmory": ("grimmory-db", 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" grimmory -N -e'),
}
def sql(app, q):
"""The SQL goes in on STDIN (a heredoc), so no quote inside it can break the shell around it. (The first version
passed it with `-c "…"` inside `sh -c '…'`, and the marker's own single quotes broke it — run A1, recorded.)"""
c, cmd = SQL[app]
cmd = cmd.replace(" -Atc", " -At").replace(" -N -e", " -N")
return w.guest(f"docker exec -i {c} sh -c '{cmd}' 2>&1 <<'R1106SQL' | tail -3\n{q};\nR1106SQL\n").strip()
def seed(app, tag):
say(f"seed {app} {tag}: " + sql(app, f"create table if not exists r1106_marker(note varchar(80)); insert into r1106_marker values ('{tag}'); select note from r1106_marker"))
if app == "grimmory":
say(" file: " + w.guest(f"printf '%s\\n' '{tag}' > {BOOKS}/{tag}.txt && chown 1000:1000 {BOOKS}/{tag}.txt && sha256sum {BOOKS}/{tag}.txt").strip())
def check(app, tag):
st = w.stack(app)
say(f"check {app}: deployed={st.get('deployed')} state={st.get('state')} hold={st.get('hold_reason')!r}")
say(f" marker row: {sql(app, 'select note from r1106_marker')!r} (want {tag!r} present)")
if app == "rallly":
logs = w.guest("docker logs --since 10m rallly 2>&1 | grep -c -E 'P1000|Authentication failed' ; docker ps --filter name=^rallly$ --format '{{.Status}}'")
say(f" rallly log auth errors (10 min) / status: {' | '.join(logs.split())}")
say(" app login to its DB (the app's own DATABASE_URL user): " + w.guest(
"docker exec rallly-postgres sh -c 'PGPASSWORD=\"$POSTGRES_PASSWORD\" psql -h 127.0.0.1 -U rallly -d rallly -Atc \"select 1\"' 2>&1 | tail -1").strip())
say(" front door: " + w.guest("curl -s -o /dev/null -w '%{http_code}' --max-time 15 -H 'Host: rallly-r1106.enkisfelhom.hu' http://127.0.0.1/ 2>/dev/null; echo"))
else:
say(" root login (the product's dump user): " + w.guest(
"docker exec grimmory-db sh -c 'mariadb -uroot -p\"$MARIADB_ROOT_PASSWORD\" -N -e \"select 1\"' 2>&1 | tail -1").strip())
say(" app user login (the app's own DB user): " + w.guest(
"docker exec grimmory-db sh -c 'mariadb -ugrimmory -p\"$MARIADB_PASSWORD\" grimmory -N -e \"select 1\"' 2>&1 | tail -1").strip())
say(" app health: " + w.guest("docker ps --filter name=^grimmory$ --format '{{.Status}}'; docker exec grimmory wget -q -O- http://127.0.0.1:6060/api/v1/healthcheck 2>&1 | head -c 200; echo").strip())
say(" file: " + w.guest(f"sha256sum {BOOKS}/{tag}.txt 2>&1").strip())
def remove(app, mode):
hdd = mode == "all" or mode == "keepbackups"
bk = mode == "all"
c1, _ = w.ctl("POST", f"/api/stacks/{app}/stop")
for _ in range(24):
time.sleep(5)
if w.stack(app).get("state") != "running":
break
code, d = w.ctl("POST", f"/api/stacks/{app}/remove", {"remove_hdd_data": hdd, "remove_backups": bk})
say(f"remove {app} ({mode}: remove_hdd_data={hdd}, remove_backups={bk}) -> {code} {str(d)[:200]}")
if app == "grimmory" and hdd:
# the household's books folder is never removed by the product (decision 67); the household deletes its file
say(" household deletes the books-folder files: " + w.guest(f"rm -fv {BOOKS}/r1106-*.txt | wc -l").strip())
def main():
step, args = sys.argv[1], sys.argv[2:]
w.login()
if step == "install":
say(f"install {args[0]}: {w.deploy(args[0], SUB[args[0]], VALUES.get(args[0]))}")
elif step == "install-kept":
os.environ["KEPT"] = "use"
say(f"install {args[0]} with kept_data=use: {w.deploy(args[0], SUB[args[0]], VALUES.get(args[0]))}")
elif step == "seed":
seed(args[0], args[1])
elif step == "check":
check(args[0], args[1])
elif step == "offsite-run":
drill.offsite_run()
elif step == "remove":
remove(args[0], args[1])
elif step == "restore-offsite":
app = args[0]
head, loc = drill.form("/backup/offbox/restore", {"app": app, "mode": "full"})
drill.form("/backup/offbox/restore", {"app": app, "mode": "full", "confirm": "1"})
say(json.dumps(drill.wait_restore(), ensure_ascii=False)[:700])
drill.form("/backup/offbox/reconstitute", {"app": app, "confirm": "1"})
say(json.dumps(drill.wait_restore(), ensure_ascii=False)[:900])
elif step == "restore-onbox":
r = w.restore(args[0])
say("onbox restore: " + json.dumps({k: r.get(k) for k in ("ok", "snapshot_id", "http", "location", "seconds")}, ensure_ascii=False))
c, d = w.ctl("GET", "/api/backup/restore-status")
say(" restore-status: " + json.dumps((d or {}).get("data"), ensure_ascii=False)[:900])
else:
sys.exit("unknown step " + step)
if __name__ == "__main__":
main()
@@ -0,0 +1,20 @@
#!/bin/bash
# R-1106 drill, paths A (rerun with the fixed seed) and B, on demo-hp 9201. Env SC, EV, TARGET from the caller.
E=$(cd "$(dirname "$0")/.." && pwd); D="python3 $E/tools/drill2.py"
echo "##### PATH A2 — off-site full restore after a reinstall (seed fixed)"
for a in rallly grimmory; do $D seed $a r1106-A2; $D check $a r1106-A2; done
$D offsite-run
for a in rallly grimmory; do $D remove $a all; done
for a in rallly grimmory; do $D install $a; done
echo "## A2 negative control after the reinstall"; for a in rallly grimmory; do $D check $a r1106-A2; done
for a in rallly grimmory; do $D restore-offsite $a; done
sleep 45; echo "## A2 after the off-site restore"; for a in rallly grimmory; do $D check $a r1106-A2; done
echo "##### PATH B — on-box restore (Visszaallitas) after a reinstall"
for a in rallly grimmory; do $D seed $a r1106-B; done
$D offsite-run
for a in rallly grimmory; do $D remove $a keepbackups; done
for a in rallly grimmory; do $D install $a; done
echo "## B negative control after the reinstall"; for a in rallly grimmory; do $D check $a r1106-B; done
for a in rallly grimmory; do $D restore-onbox $a; done
sleep 45; echo "## B after the on-box restore"; for a in rallly grimmory; do $D check $a r1106-B; done
echo "##### DONE"
@@ -0,0 +1,11 @@
#!/bin/bash
E=$(cd "$(dirname "$0")/.." && pwd); D="python3 $E/tools/drill2.py"
echo "##### PATH B — on-box restore (Visszaallitas) after a reinstall"
for a in rallly grimmory; do $D seed $a r1106-B; done
$D offsite-run
for a in rallly grimmory; do $D remove $a keepbackups; done
for a in rallly grimmory; do $D install $a; done
echo "## B negative control after the reinstall"; for a in rallly grimmory; do $D check $a r1106-B; done
for a in rallly grimmory; do $D restore-onbox $a; done
sleep 45; echo "## B after the on-box restore"; for a in rallly grimmory; do $D check $a r1106-B; done
echo "##### DONE"
@@ -0,0 +1,27 @@
#!/bin/bash
# R-1105 — run ONE read-only restic command against THIS box's off-site store, with the restic of a chosen controller
# image (0.322.0 = restic 0.14.0, 0.323.0-rc.N = 0.18.1). Runs INSIDE the guest (pushed by pct). It builds the same
# `rclone:` repo + `rclone.program` the controller builds (offboxBaseArgs, pinned transport) from settings.json, mounts
# the controller's own volumes READ-ONLY (--volumes-from …:ro) and shares its network. It prints no host, user, path,
# key or password. ALLOWED verbs: snapshots, restore, ls, cat config — each with --no-lock, so nothing is written to the
# store. Usage: rx.sh <image> <restic args…>
set -euo pipefail
IMG="$1"; shift
case "$1" in snapshots|restore|ls|cat) ;; *) echo "rx.sh: refusing verb '$1' (read-only verbs only)" >&2; exit 2 ;; esac
S=/var/lib/docker/volumes/felhom-controller-data/_data/data/settings.json
eval "$(python3 - "$S" <<'EOF'
import json, shlex, sys
o = json.load(open(sys.argv[1]))["offbox"]
assert o.get("transport") == "rclone-pinned", "rx.sh handles the pinned transport only"
d = "/opt/docker/felhom-controller/data/offbox"
prog = (f"ssh -p {o.get('port') or 23} -oBatchMode=yes -oConnectTimeout=10 -oStrictHostKeyChecking=yes "
f"-oUserKnownHostsFile={d}/known_hosts -oIdentitiesOnly=yes -i {d}/ssh_key {o['user']}@{o['host']} rclone")
print("REPO=" + shlex.quote("rclone:" + o["repo_path"]))
print("PROG=" + shlex.quote("rclone.program=" + prog))
EOF
)"
mkdir -p /tmp/r1105
exec docker run --rm --network container:felhom-controller --volumes-from felhom-controller:ro \
-v /tmp/r1105:/tmp/r1105 -e RESTIC_PASSWORD_FILE=/opt/docker/felhom-controller/data/offbox/repo_password \
-e RESTIC_CACHE_DIR=/tmp/r1105/cache-$(echo "$IMG" | tr -c 'a-z0-9.\n' '_') \
--entrypoint restic "$IMG" -r "$REPO" -o "$PROG" --no-lock "$@"
@@ -0,0 +1,54 @@
#!/bin/bash
# R-972 Part 4 — the LAN sharing checks, run ON DOOPLEX against demo-hp 9201's felhom-samba. Usage: sambacheck.sh <label>
# The household SMB password is read from $SC/.smbpw (0600) into a 0600 smbclient auth file; it is never printed.
# smbclient runs from our own felhom-samba image as a throwaway client container (--rm, host network, nothing
# installed on DooPlex); nmblookup is DooPlex's own; the mDNS and WS-Discovery probes are plain python sockets.
set -u
LABEL=${1:?label}; IP=192.168.0.155; NAME=FELHOMHP; SHARE=r1105; USERNAME=felhom
IMG=gitea.dooplex.hu/admin/felhom-samba:1.2.0
A=$(mktemp -p "$SC"); chmod 600 "$A"; printf 'username=%s\npassword=%s\n' "$USERNAME" "$(cat "$SC/.smbpw")" > "$A"
B=$(mktemp -p "$SC"); chmod 600 "$B"; printf 'username=%s\npassword=%s\n' "$USERNAME" "not-the-password" > "$B"
echo "== $LABEL — $(date -u +%FT%TZ)"
echo "-- 1. smbclient with the household password: write, list, read back, delete"
docker run --rm --network host -v "$A":/auth:ro --entrypoint sh "$IMG" -c \
"echo r1105-$LABEL > /tmp/probe.txt && smbclient //$IP/$SHARE -A /auth -m SMB3 -c 'put /tmp/probe.txt probe-$LABEL.txt; ls probe-*; get probe-$LABEL.txt /tmp/back.txt; rm probe-$LABEL.txt' 2>&1 | grep -vE '^\s*$|blocks of size'; echo \"read back: \$(cat /tmp/back.txt 2>/dev/null || echo NOTHING)\""
echo "-- 2. negative control: a wrong password"
docker run --rm --network host -v "$B":/auth:ro --entrypoint smbclient "$IMG" //$IP/$SHARE -A /auth -m SMB3 -c 'ls' 2>&1 | tail -1
rm -f "$A" "$B"
echo "-- 3. nmbd: NetBIOS name query from DooPlex"
nmblookup -U $IP "$NAME" 2>&1 | tail -1
echo "-- 4. avahi: mDNS A query for $NAME.local"
python3 - "$NAME" <<'EOF'
import socket, struct, sys, time
name = sys.argv[1].lower() + ".local"
q = struct.pack(">HHHHHH", 0, 0, 1, 0, 0, 0) + b"".join(bytes([len(p)]) + p.encode() for p in name.split(".")) + b"\0" + struct.pack(">HH", 1, 0x8001)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(3)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
s.sendto(q, ("224.0.0.251", 5353))
try:
while True:
d, a = s.recvfrom(4096)
if d[-4:] and len(d) > 12 and struct.unpack(">H", d[6:8])[0] > 0:
print(f"answer from {a[0]}: {socket.inet_ntoa(d[-4:])} for {name}"); break
except socket.timeout:
print(f"NO mDNS answer for {name}")
EOF
echo "-- 5. wsdd: WS-Discovery Probe"
python3 - <<'EOF'
import socket, uuid
probe = f'''<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2006/02/devprof"><soap:Header><wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action><wsa:MessageID>urn:uuid:{uuid.uuid4()}</wsa:MessageID></soap:Header><soap:Body><wsd:Probe><wsd:Types>wsdp:Device</wsd:Types></wsd:Probe></soap:Body></soap:Envelope>'''
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(3)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
s.sendto(probe.encode(), ("239.255.255.250", 3702))
seen = []
try:
while True:
d, a = s.recvfrom(65535)
if b"ProbeMatches" in d:
seen.append(a[0])
except socket.timeout:
pass
print("ProbeMatches from:", sorted(set(seen)) or "NOBODY", "— the box (192.168.0.155) answered" if "192.168.0.155" in seen else "— the box did NOT answer")
EOF
echo "-- 6. processes in the samba container, and its image"
ssh -o BatchMode=yes demo-hp "LC_ALL=C pct exec 9201 -- sh -c 'docker inspect felhom-samba --format \"{{.Config.Image}} created {{.Created}}\"; docker exec felhom-samba ps -o pid,comm,args | grep -E \"smbd|nmbd|wsdd|avahi|dbus|tini\" | grep -v grep | cut -c1-90; docker volume ls -q | grep -i samba'" 2>/dev/null
@@ -0,0 +1,54 @@
#!/bin/bash
# R-972 Part 4 — the LAN sharing checks, run ON DOOPLEX against demo-hp 9201's felhom-samba. Usage: sambacheck.sh <label>
# The household SMB password is read from $SC/.smbpw (0600) into a 0600 smbclient auth file; it is never printed.
# smbclient runs from our own felhom-samba image as a throwaway client container (--rm, host network, nothing
# installed on DooPlex); nmblookup is DooPlex's own; the mDNS and WS-Discovery probes are plain python sockets.
set -u
LABEL=${1:?label}; IP=192.168.0.155; NAME=FELHOMHP; SHARE=r1108; USERNAME=felhom
IMG=gitea.dooplex.hu/admin/felhom-samba:1.2.0
A=$(mktemp -p "$SC"); chmod 600 "$A"; printf 'username=%s\npassword=%s\n' "$USERNAME" "$(cat "$SC/.smbpw")" > "$A"
B=$(mktemp -p "$SC"); chmod 600 "$B"; printf 'username=%s\npassword=%s\n' "$USERNAME" "not-the-password" > "$B"
echo "== $LABEL — $(date -u +%FT%TZ)"
echo "-- 1. smbclient with the household password: write, list, read back, delete"
docker run --rm --network host -v "$A":/auth:ro --entrypoint sh "$IMG" -c \
"echo r1105-$LABEL > /tmp/probe.txt && smbclient //$IP/$SHARE -A /auth -m SMB3 -c 'put /tmp/probe.txt probe-$LABEL.txt; ls probe-*; get probe-$LABEL.txt /tmp/back.txt; rm probe-$LABEL.txt' 2>&1 | grep -vE '^\s*$|blocks of size'; echo \"read back: \$(cat /tmp/back.txt 2>/dev/null || echo NOTHING)\""
echo "-- 2. negative control: a wrong password"
docker run --rm --network host -v "$B":/auth:ro --entrypoint smbclient "$IMG" //$IP/$SHARE -A /auth -m SMB3 -c 'ls' 2>&1 | tail -1
rm -f "$A" "$B"
echo "-- 3. nmbd: NetBIOS name query from DooPlex"
nmblookup -U $IP "$NAME" 2>&1 | tail -1
echo "-- 4. avahi: mDNS A query for $NAME.local"
python3 - "$NAME" <<'EOF'
import socket, struct, sys, time
name = sys.argv[1].lower() + ".local"
q = struct.pack(">HHHHHH", 0, 0, 1, 0, 0, 0) + b"".join(bytes([len(p)]) + p.encode() for p in name.split(".")) + b"\0" + struct.pack(">HH", 1, 0x8001)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(3)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
s.sendto(q, ("224.0.0.251", 5353))
try:
while True:
d, a = s.recvfrom(4096)
if d[-4:] and len(d) > 12 and struct.unpack(">H", d[6:8])[0] > 0:
print(f"answer from {a[0]}: {socket.inet_ntoa(d[-4:])} for {name}"); break
except socket.timeout:
print(f"NO mDNS answer for {name}")
EOF
echo "-- 5. wsdd: WS-Discovery Probe"
python3 - <<'EOF'
import socket, uuid
probe = f'''<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2006/02/devprof"><soap:Header><wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action><wsa:MessageID>urn:uuid:{uuid.uuid4()}</wsa:MessageID></soap:Header><soap:Body><wsd:Probe><wsd:Types>wsdp:Device</wsd:Types></wsd:Probe></soap:Body></soap:Envelope>'''
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(3)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
s.sendto(probe.encode(), ("239.255.255.250", 3702))
seen = []
try:
while True:
d, a = s.recvfrom(65535)
if b"ProbeMatches" in d:
seen.append(a[0])
except socket.timeout:
pass
print("ProbeMatches from:", sorted(set(seen)) or "NOBODY", "— the box (192.168.0.155) answered" if "192.168.0.155" in seen else "— the box did NOT answer")
EOF
echo "-- 6. processes in the samba container, and its image"
ssh -o BatchMode=yes demo-hp "LC_ALL=C pct exec 9201 -- sh -c 'docker inspect felhom-samba --format \"{{.Config.Image}} created {{.Created}}\"; docker exec felhom-samba ps -o pid,comm,args | grep -E \"smbd|nmbd|wsdd|avahi|dbus|tini\" | grep -v grep | cut -c1-90; docker volume ls -q | grep -i samba'" 2>/dev/null
@@ -0,0 +1,22 @@
#!/bin/bash
# R-1107 — restic 0.19.1 vs 0.18.1 vs 0.14.0 on demo-hp's REAL store, read-only (rx.sh: --no-lock, read verbs only).
# Runs in the guest. Each snapshot is restored by every version; the tree hashes must agree.
set -u
I=gitea.dooplex.hu/admin/felhom-controller
declare -A IMG=([0.14.0]=$I:0.322.0 [0.18.1]=$I:0.323.0 [0.19.1]=$I:0.324.0-rc.1)
for v in 0.14.0 0.18.1 0.19.1; do docker image inspect ${IMG[$v]} >/dev/null 2>&1 || docker pull -q ${IMG[$v]} >/dev/null; done
NEW19=$(/root/rx.sh ${IMG[0.19.1]} snapshots --tag bookstack --json 2>/dev/null | python3 -c 'import json,sys; s=[x for x in json.load(sys.stdin) if x.get("program_version","").startswith("restic 0.19")]; print(s[-1]["short_id"] if s else "")')
echo "snapshots: 0.14.0-made f3f16e0e (bookstack), 0.18.1-made 6d9dd607 (rallly), 0.19.1-made $NEW19 (bookstack, newest)"
for snap in f3f16e0e 6d9dd607 $NEW19; do
line="$snap:"
for v in 0.14.0 0.18.1 0.19.1; do
d=/tmp/r1105/x-$snap-$v; rm -rf $d
if /root/rx.sh ${IMG[$v]} restore $snap --target $d >/dev/null 2>&1; then
h=$(cd $d && find . -type f -exec sha256sum {} + | sort -k2 | sha256sum | cut -c1-16); n=$(find $d -type f | wc -l)
line="$line restic $v → $h ($n files)"
else line="$line restic $v → FAILED"; fi
rm -rf $d
done
echo "$line"
done
echo "store listed by each: $(for v in 0.14.0 0.18.1 0.19.1; do printf '%s=%s ' $v $(/root/rx.sh ${IMG[$v]} snapshots --json 2>/dev/null | python3 -c 'import json,sys;print(len(json.load(sys.stdin)))'); done)"