Persistence re-sweep of all 58 (R-801 closed: CLEAN 40 / UNDETERMINED 18 / BROKEN 0), R-788 + R-803 (papra) closed, R-804..R-807 opened; STATUS "Before the first paying customer"; REPORT-persistence-sweep-2026-10-02; register 442
gates / gates (push) Successful in 30s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-02 16:54:26 +02:00
parent 5ed44ada6e
commit 93052884b2
90 changed files with 27056 additions and 48 deletions
+8
View File
@@ -16,6 +16,14 @@
> and holds nothing of its own; this file does hold its own content, namely the standing rulings below.
> **2026-10-02 (afternoon) — the persistence re-sweep (R-801/R-788 CLOSED), controller v0.288.0 (R-800), golden 0.288.0.**
> Rulings `09` §3 66 (licences: Tandoor like SparkyFitness; Emby/Plex/n8n kept; lawyer review before the first paying
> customer, R-802) and 67 (userdata stays on every remove; dialog + result name it — `07` §6.5). The gate now sends
> requests (port from the label NAME), calls the app's own fixture seed when a volume stays empty, and reads an empty
> declared volume as UNDETERMINED. All 58: CLEAN 39 · UNDETERMINED 19 · BROKEN 0 (no data-loss finding). papra's
> 256M limit OOM-killed every fresh install — 768M now (R-803 closed). Open follow-ups R-804..R-807. Report:
> `REPORT-persistence-sweep-2026-10-02.md`.
> **2026-10-02 — the family gate BUILT (R-780 CLOSED), controller v0.287.0 floored, golden 0.287.0 vouched; Grimmory and
> MeTube published behind it (R-767 CLOSED, R-775 narrowed).** `internal/family` + `stacks/family_gate.go` +
> `web/family_gate.go`; template fields `family_gate` / `family_gate_except` (literal, anchored `^/p(/|$)`) /
+148
View File
@@ -0,0 +1,148 @@
# REPORT — every app checked again with the fixed persistence check; the remove dialog tells the truth; licence rulings; v0.288.0 + golden (2026-10-02, afternoon)
Architecture read: `07-backup-architecture.md` §6 (tiers) and §6.5 (kept data — now with decision 67), `09` §3 decisions
36, 65, 66, 67. Evidence root: `documentation/audits/persistence-sweep-2026-10-02/`.
| Part | State | One line |
|---|---|---|
| **A** — the re-sweep (R-801) | **DONE** | R-788 rule + the app's own fixture seed in the gate; all 58 on the bench; **0 BROKEN**; papra's start-up defect found and fixed (R-803). |
| **B** — the remove dialog (R-800) | **DONE** | v0.288.0: `userdata_kept` in the dialog data and both results; the sentence in both languages; red-proofed; live on 9202. |
| **C** — release, floor, golden | **DONE** | Floor 0.288.0 (min_agent 0.131.0), both demo boxes in 20 s; golden 0.288.0 baked, round-tripped, vouched; currency gate OK. |
| Rulings | **RECORDED** | `09` §3 66 (licences) and 67 (userdata stays); `07` §6.5; STATUS "Before the first paying customer". |
**Sweep headline (58 templates):** before (2026-08-02, 53 apps, + the new apps' records) CLEAN 38 · UNDETERMINED 11 ·
BROKEN 4 — **every one of those decided by start-time writes alone** → now **CLEAN 40 · UNDETERMINED 18 · BROKEN 0 ·
INCONCLUSIVE 0** (39 · 19 in the sweep; papra CLEAN after its fix). The August BROKEN four (gramps-web, papra, privatebin,
wishlist) were fixed in Campaign 10; none is BROKEN now. **No data-loss finding: no app writes outside a preserved folder.**
## Claims in the brief, checked
- **"Every stored verdict came only from start-time writes"** — RIGHT for the August sweep: 0 of 53 probes had sent a
request (`ports: []`, `exercise: []` in every `probe.json`). Not quite for today's morning runs of MeTube and
Grimmory, which ran after the R-801 fix.
- **"The upgrade fixtures can serve as exercisers"** — PARTLY. 51 of 58 apps have one; the gate called it for 16 apps;
it decided 2 (metube, privatebin). 13 seeded fine and stayed UNDETERMINED, because the seeds write only to the
database — upload / media / cache / redis volumes stay empty (R-807). plex's seed cannot run (a plex.tv claim token).
- **"Userdata is never touched by a remove"** — RIGHT, and it was already true before this session: the remove reads
`${HDD_PATH}` binds only, pinned since R-442 (`TestRemoveStack_R442_UserdataConventionFromPerAppPath`). What was
wrong was only that nothing SAID so. Measured again on 9202 (the video stayed).
- **The R-788 decoy as written ("an app that writes nothing → exit 2, red on the old rule")** — the old rule already gave
exit 2 for an app that writes nothing. The real gap was an app that writes SOMEWHERE while a declared volume stays
empty (old: CLEAN). The decoy was built for that shape and seen red (`A/RP-R788-empty-volume.txt`).
## Part A — the sweep
Gate changes (catalog): an empty declared volume after the exercise is UNDETERMINED (R-788, red-proofed; three old tests
pinned the old rule and changed with it); when a volume stays empty the gate calls the app's own upgrade-fixture seed
(one call through `upgrade_fixtures` / `upgrade_boxport`, as `upgrade-test.py` does — it replaces the morning's
MeTube-only exerciser). Bench 9401 on demo-hp, 200G, swap 0, Docker Hub logged in, 8 batches; full table with reasons:
`A/sweep/TABLE.md`; verdict lines in the catalog: `audits/persistence-sweep-2026-10-02/verdicts.txt`.
| app | before | now | what made it write | notes |
|---|---|---|---|---|
| actualbudget | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| adventurelog | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| audiobookshelf | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| bentopdf | UNDETERMINED (08-02, start writes) | UNDETERMINED | deep pass | nothing was written to any mount and nothing data-classified in any writable layer — the app produced no data |
| bookstack | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| calcom | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| calibre-web | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | calibre-web: /app/calibre-web-automated/empty_library — database file(s) touched but byte-identical to the ima |
| claper | UNDETERMINED (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Claper: seed OK — claper: see | claper: declared volume /app/priv/static/uploads is EMPTY after the exercise — the app was not shown to write |
| code-server | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| crafty-controller | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Crafty: seed OK — crafty: POS | crafty-controller: declared volume /crafty/servers is EMPTY after the exercise — the app was not shown to writ |
| dawarich | CLEAN (10-01, start writes) | UNDETERMINED | fixture seed OK — `fixture Dawarich: seed OK — dawarich: | dawarich-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the t |
| docmost | UNDETERMINED (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Docmost: seed OK — docmost: / | docmost: declared volume /app/data/storage is EMPTY after the exercise — the app was not shown to write where |
| emby | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| ghost | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| gitea | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| glance | UNDETERMINED (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| gokapi | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| grafana | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| gramps-web | BROKEN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture GrampsWeb: seed OK — gramps-w | gramps-web: declared volume /app/secret is EMPTY after the exercise — the app was not shown to write where the |
| grimmory | CLEAN (10-02, after R-801) | CLEAN | GET exercise (or start) | grimmory: this container's mounts are all empty while it created entries in ['/', '/app', '/etc'] — benign whe |
| home-assistant | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| homebox | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| homepage | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| immich | UNDETERMINED (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Immich: seed OK — immich: see | immich-machine-learning: declared volume /cache is EMPTY after the exercise — the app was not shown to write w |
| jellyfin | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| karakeep | CLEAN (10-01, start writes) | CLEAN | GET exercise (or start) | - |
| kimai | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| komga | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| mealie | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| metube | CLEAN (10-02, after R-801) | CLEAN | fixture seed OK — `fixture MeTube: seed OK — metube: the | - |
| n8n | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| navidrome | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| nextcloud | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| onlyoffice | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | onlyoffice: writable-layer writes at /var/www/onlyoffice/documentserver/sdkjs-plugins/{07FD8DFA-DFE0-4089-AL24 |
| opengist | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| outline | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Outline: seed OK — outline: s | outline: declared volume /var/lib/outline/data is EMPTY after the exercise — the app was not shown to write wh |
| paperless-ngx | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| papra | BROKEN (08-02, start writes) | CLEAN after the fix (768M); UNDETERMINED at 256M (OOM) | nothing answered HTTP | R-803: OOM-killed at 256M; fixed |
| plant-it | UNDETERMINED (08-02, start writes) | UNDETERMINED | start only (no routed port, no HTTP exercise) | no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': |
| plex | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed FAILED — `fixture NoRoute: seed returned nothin | plex: declared volume /transcode is EMPTY after the exercise — the app was not shown to write where the templa |
| privatebin | BROKEN (08-02, start writes) | CLEAN | fixture seed OK — `fixture PrivateBin: seed OK — private | - |
| radarr | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | radarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['mov |
| radicale | CLEAN (10-01, start writes) | CLEAN | GET exercise (or start) | - |
| rallly | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| recipe-importer | UNDETERMINED (08-02, start writes) | UNDETERMINED | deep pass | NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are e |
| romm | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| seerr | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| sonarr | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | sonarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['tv' |
| sparkyfitness | UNDETERMINED (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Sparkyfitness: seed OK — spar | sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise — the app wa |
| tandoor | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Django: seed OK — tandoor: se | tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise — the app was not shown to write |
| termix | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| uptime-kuma | UNDETERMINED (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| vaultwarden | CLEAN (08-02, start writes) | CLEAN | GET exercise (or start) | - |
| vikunja | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Vikunja: seed OK — vikunja: c | vikunja: declared volume /app/vikunja/files is EMPTY after the exercise — the app was not shown to write where |
| wanderer | UNDETERMINED (08-02, start writes) | UNDETERMINED | GET exercise (or start) | wanderer: unhealthy; wanderer: declared volume /app/uploads is EMPTY after the exercise — the app was not show |
| wger | CLEAN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Wger: seed OK — wger: POST /a | wger: declared volume /home/wger/media is EMPTY after the exercise — the app was not shown to write where the |
| wishlist | BROKEN (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Wishlist: seed OK — wishlist: | wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise — the app was not shown to write wh |
| zipline | UNDETERMINED (08-02, start writes) | UNDETERMINED | fixture seed OK — `fixture Zipline: seed OK — zipline: / | zipline: declared volume /zipline/uploads is EMPTY after the exercise — the app was not shown to write where t |
**REFUSED (BROKEN): none** — so no P1 data-loss row, no stop, no box to name.
**UNDETERMINED, why:** 13 apps — a second volume (uploads / media / cache / redis / backup) stays empty after a
successful seed that writes only the database (claper, crafty-controller, dawarich, docmost, gramps-web, immich, outline,
sparkyfitness, tandoor, vikunja, wger, wishlist, zipline — R-807). plex — no seed route (a plex.tv claim token).
bentopdf — stateless by design (no volume; a browser-side PDF tool). recipe-importer — stateless converter (its /data is
never written). wanderer — unhealthy under the gate, no fixture. plant-it — its image is gone from Docker Hub (R-804).
**Found and fixed on the way: papra (R-803, P1).** At its 256M limit every fresh install was OOM-killed in its
migration and crash-looped (its 26.6.2 step was proven by harness v1, without a memory watch). Measured from birth: peak
anon 405 MiB, cgroup peak 483 MiB, ~255 MiB idle. Now 768M (`mem_request` 256M): healthy in 31 s, 0 kills, the seed
read back, persistence CLEAN (`A/papra/`). No box ran papra.
`EXISTING-APPS-GAPS.md` regenerated from the new verdicts (storage 38 → 36 of 53); records 2.1 updated (radicale,
karakeep, grimmory, metube CLEAN; dawarich done with the redis volume named; sparkyfitness and wger open).
## Part B — the remove dialog (controller v0.288.0)
`GET /api/stacks/{name}/hdd-data`, `POST …/remove`, `DELETE /api/stacks/{name}` carry `userdata_kept` (always a
list). Both dialogs and both results: „A fájljaid ezekben a mappákban megmaradnak — a fájlböngészőben látod őket:" /
"Your files in these folders stay — you see them in the file browser:" + the folders. The false "no data on a drive" note
is gone when userdata exists. Tests + red-proof (two mutants, `B/RP-R800-mutants.txt`); parity fixtures regenerated —
additions only, 0 deletions, 109 pages. **Live on 9202** (`B/r800-9202.txt`, endpoint-level, no browser): MeTube from the
live catalog, one download; the dialog's data names the folder; the page carries the line in hu and en (with a negative
control); remove with data → 409 on 9202 (no host agent, R-442 — the with-data result is pinned by the unit test);
remove keeping data → the result names the folder; the video still there.
## Part C — release
Controller v0.288.0 (`580b656`), image built from the pushed tree. Floor 0.288.0 + min_agent 0.131.0 → demo-hp and
demo-felhom on 0.288.0 in 20 s (`C/floor.txt`). Golden 0.288.0: sha `436fdfa1…`, round trip equal, vouched (golden 0.288.0
/ agent 0.138.0 / min_agent 0.131.0), R-120 refused 0.287.0 after; `golden_currency_gate.py`: "OK — the newest released
controller has a golden" (`documentation/tests/golden-0.288.0-2026-10-02/`).
## Rows
Register **436 → 442**. Closed: R-788, R-790, R-791, R-792, R-795, R-801, R-803. Updated: R-789 (Tandoor — trigger),
R-800 (ruled A, built). Opened: R-802 (lawyer review), R-804 (plant-it image gone), R-805 (empty binds not judged),
R-806 (https backends / gramps-web first GET), R-807 (seeds that write only the database).
## Teardown
- **Bench 9401:** built and destroyed twice; `pct list` 9201 + 9202 only; nvme-scratch back to its baseline (+120 KiB).
Docker Hub credentials shredded on DooPlex, demo-hp and the bench; `docker logout` before the destroy.
- **9202:** MeTube removed (keeping data — with data refused by R-442), the harness's own test folder removed by hand;
controller 0.288.0; live catalog.
- **Hub:** the floor and the artifact manifest changed on purpose; nothing else. Tester-2: not touched.
+29 -46
View File
@@ -2,69 +2,52 @@
**Ready for the first real tester (Tester-2): yes. You confirmed the tunnel route and the connect mails (2026-09-30).**
**Updated 2026-10-02. Both demo boxes run controller 0.287.0 and host agent 0.138.0. Hub 0.126.0. New installs get
golden 0.287.0 with agent 0.138.0.**
**Updated 2026-10-02 (afternoon). Both demo boxes run controller 0.288.0 and host agent 0.138.0. Hub 0.126.0. New
installs get golden 0.288.0 with agent 0.138.0.**
**Tester-2 — read only, from the hub.** The customer record exists. Tester-2's box has not registered yet.
## Today: the family gate is built
## Today (afternoon): every app checked again
- **What it is:** a door in front of chosen apps. Only the family gets in. Each family member has their own name and
password. You add, reset and remove them on the dashboard: Settings → Security → **Család** card.
- **Grimmory (e-books) is published behind it.** Strangers cannot reach its login any more, so they cannot lock you out.
E-readers (Kobo, KOReader, OPDS apps) still work with Grimmory's own login.
- **MeTube (video downloads) is published behind it.** It has no login of its own, so the gate is its only door. The page
says: download only what you have the right to.
- **Measured on the scratch box and on demo-hp:** a stranger reached nothing; a stranger's wrong guesses locked only that
stranger; a removed family member was out at the next click; backup, remove and restore kept the gate.
- **Phone test: skipped** — you were not here. A 2-minute test from your phone off wifi would prove the real-internet
family sign-in by a person, not by me.
- **No data-loss fault.** I checked all 58 apps with the fixed check. It made each app really save something, then
looked where the data landed. **No app saves data where the backup does not copy it.**
- **40 apps: proven correct. 18 apps: not proven either way.** In those 18 the check could not fill every folder (for
example an upload folder stays empty because my test saves no upload). Nothing was found outside a backed-up folder.
I list them and work on them later.
- **papra was broken for new installs, now fixed.** It needs more memory than its limit, so a fresh install crashed in a
loop. I measured it and raised the limit. No box runs papra.
- **plant-it's program image is gone from Docker Hub.** It is already hidden from new installs. No box runs it.
## Licences: all 58 apps read
## Removing an app now tells the truth (your choice A)
Most are open source. These need your word (nothing was hidden or changed):
- When the household removes an app, its own files (books, videos) **stay**. The dialog and the result now say so, and
name the folder. Proven on the scratch box: the video was still there after the remove.
| App | The licence says | Choose: keep / hide / ask | I would |
|---|---|---|---|
| **Tandoor** | You may not sell a service whose value comes mostly from it (paid hosting and support named). | | ask the authors; keep meanwhile |
| **Emby** | Personal, non-commercial use only. Jellyfin does the same job. | | hide for new installs |
| **SparkyFitness** | Commercial use needs the author's written permission. (Decided: keep, ask.) | — | send the e-mail draft |
| n8n | Own or personal use is fine; giving it to others only free of charge. | | keep |
| Plex | Your household is the licensee with its own Plex account. | | keep |
| recipe-importer | Our own app — it has no licence file. | | pick one |
## Before the first paying customer
Four apps carry paid "enterprise" parts that stay switched off (Cal.com, Docmost, Outline, search in Wanderer), and seven
apps use Redis 7.4 as a private cache. Both are fine as they run; I watch them.
Everything here must be done before the first customer who pays:
**SparkyFitness e-mail:** drafted, NOT sent. The author has no public e-mail; the draft suggests their Discord.
If no written permission arrives before the first paying customer, SparkyFitness gets hidden from new installs.
1. **SparkyFitness:** written permission from the author (the e-mail draft is ready). If none → hidden from new installs.
2. **Tandoor:** written permission from the authors. If none → hidden from new installs.
3. **A lawyer reviews the licence list** (Tandoor, SparkyFitness, Emby, n8n, Plex, the paid "enterprise" parts, Redis).
4. **Agent updates:** I may sign agent updates only until the first paying customer; after that you sign them.
Your licence decisions are recorded: Emby, Plex and n8n stay. recipe-importer needs nothing unless we share it.
## Also today
- **A new golden (0.287.0).** Baked early, because a box from the old golden would have shown the two apps without the
gate until its first update. The catalog check now refuses that case.
- **A bug in one catalog check, fixed:** the check "does the app keep its data where we back it up" never actually
talked to any app. Fixed and proven; all apps must be checked again (my next work).
- **Rows.** 3 closed, 14 opened (most are your licence choices). The list went from 422 to 436 rows.
- **New version 0.288.0 and a new golden (0.288.0).**
- **Rows.** 7 closed, 6 opened. The list went from 436 to 442 rows.
## What needs you
1. **The licence table above:** keep, hide or ask, per row. **If you say nothing:** everything stays offered.
2. **Send the SparkyFitness request** (the draft is ready). **If you do nothing:** it gets hidden before the first paying
customer.
3. **Removing an app "with data" keeps its files** (Grimmory's books, MeTube's videos) in the household folder, and
the dialog does not say so. **Choose:** keep them and say so on the dialog (I would), or delete the app's own folder
too. **If you say nothing:** files stay, the dialog stays silent.
4. **Demo box apps:** I installed Grimmory and MeTube on demo-hp for the test and removed them after. Want them kept
there for showing? **If you say nothing:** they stay removed.
5. **One phone test (2 minutes), only if you want it:** say so, and I put MeTube back on demo-hp and give you a family
login; you open `video.enkisfelhom.hu` on your phone off wifi. **If you say nothing:** the proof stays my real-internet
test from here.
6. Still open: Invidious and moonlight-web — I advise no to both. Pinchflat stays stopped (upstream paused).
1. **plant-it:** keep the hidden template as it is, or remove it entirely (its image no longer exists). **If you say
nothing:** it stays hidden; nothing runs it.
2. **Send the SparkyFitness request, and ask the Tandoor authors** (the "Before the first paying customer" list).
3. **Phone test (2 minutes), only if you want it:** say so, and I put MeTube back on demo-hp with a family login.
## Standing steps
- **Monthly security re-test: last run 2026-10-01, next due ~2026-11-01.** (You start it with the standing brief.)
- **Weekly:** the golden bake (next around 9 October; today's bake was 0.287.0).
- **SparkyFitness:** written permission from the author before the first paying customer, or `lifecycle: hidden`.
- **Weekly:** the golden bake (next around 9 October; today's bake was 0.288.0).
- **Registry clean-up:** only when the registry disk fills; "show me" mode first, then a person decides.
@@ -0,0 +1,35 @@
# R-803 — papra OOM under its 256M limit: birth measurement and proposed limit (2026-10-02, bench 9401 on demo-hp)
Bench: LXC 9401 `r803-papra` on demo-hp (debian-13 amd64, swap 0, nesting+keyctl, 60G rootfs on nvme-scratch,
12 GiB). Code: catalog-wt febf58c + the uncommitted gate scripts. Image ghcr.io/papra-hq/papra:26.6.2-rootless.
Driver: `r803_birth.py` (scratchpad). It deploys the template the way the volume gate does (same `build_env`, same scratch
paths, `docker compose create` then `start`), samples the container's cgroup v2 every 2 s from creation
(`memory.stat` anon/file, `memory.current`, `memory.peak`, `memory.events` oom/oom_kill/max, plus docker status/health/
restarts/OOMKilled), seeds once and reads back once with papra's own upgrade fixture (`upgrade_fixtures_box.Papra` through
`upgrade_boxport.get`), then idles 300 s. No Docker Hub login this time: the papra pull is from ghcr, and the canary base
image pulled anonymously.
## 1. From birth, no limit (`birth-unlimited/`)
The deploy block was removed in a separate run copy of the catalog (HostConfig.Memory=0).
- healthy at 71.5 s (the image pull is included in that time), 0 restarts, `oom_kill` 0
- **peak anon 425,029,632 B = 405.3 MiB**, sampled during first start/migration (4–28 s after start)
- peak `memory.current` 427 MiB; the cgroup's own `memory.peak` (anon + file, catches what 2-s sampling misses) **483 MiB**
- after healthy: anon ~356 MiB for ~2 min, then settles at **~254 MiB idle**, which is already near the old 256M limit
- fixture: `papra: sign-up http=200` → seed OK; `papra: sign-in as the seeded account http=200 ok=True` → read back **true**
- volume after the run: `db/db.sqlite (581632 B)` in the `/app/app-data` volume
## 2. Proposed limit
405.3 MiB × 1.6 = 648 MiB → next catalog step **768M**. 768M also covers the highest `memory.peak` seen (483 MiB) at 1.59×.
The bench template diff is in `template.diff`. It is NOT applied to the repo.
## 3. From birth at 768M (`run-768M/`)
- HostConfig.Memory=805306368 (768 MiB); `memory.max` = 805306368
- healthy at 31.0 s, final status running/healthy, **restarts 0, oom_kill 0, OOMKilled false**
- fixture seed OK, read back **true**
- peak anon 297,943,040 B = 284.1 MiB, `memory.peak` 341 MiB, idle end anon 251 MiB. This run peaked lower than the
unlimited run: the start-up peak varies between runs (memory.peak 341–483 MiB over two runs), so do not size from one run.
- gate (`gate-papra-768M.txt`, probe in `gate-evidence/papra/probe.json`), verbatim:
`papra CLEAN` / `1 clean · 0 broken · 0 undetermined (of 1 in scope)` / `volume-persistence gate OK` /
`check-volume-persistence exit code = 0`. Exercise `172.18.0.2:1221/ -> 200`; `/app/app-data` holds `db/db.sqlite`.
Note: `mem_request: "50M"` in `.felhom.yml` was left unchanged (not in scope). Measured idle is ~255 MiB.
@@ -0,0 +1,55 @@
+ date -u
Fri Oct 2 14:34:42 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19536696 18829564 48.29%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 77370636 855982452 7.87%
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ pveam list local
+ grep debian-13
local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst 123.93MB
+ pct create 9401 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname r803-papra --cores 6 --memory 12288 --swap 0 --rootfs nvme-scratch:60 --net0 name=eth0,bridge=vmbr0,ip=dhcp --unprivileged 1 --features nesting=1,keyctl=1 --onboot 0
+ tail -1
done: SHA256:ZxJabA9hzMBYA+4Go9i2Ook9/pAunGUO4EgXoYQEGq0 root@r803-papra
+ pct config 9401
arch: amd64
cores: 6
features: nesting=1,keyctl=1
hostname: r803-papra
memory: 12288
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:FA:53:74,ip=dhcp,type=veth
onboot: 0
ostype: debian
rootfs: nvme-scratch:9401/vm-9401-disk-0.raw,size=60G
swap: 0
unprivileged: 1
+ pct start 9401
+ sleep 15
+ pct exec 9401 -- bash -c 'dpkg --print-architecture; hostname; ip -4 -o addr show eth0 | awk "{print \$4}"; apt-get update -qq >/dev/null 2>&1; DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose python3 python3-yaml curl postgresql-client sqlite3 git >/dev/null 2>&1; docker --version; docker compose version; python3 --version; git --version; docker network create traefik-public >/dev/null && echo traefik-public-net; swapon --show; free -m | head -3; df -h /'
amd64
r803-papra
192.168.0.100/24
Docker version 26.1.5+dfsg1, build a72d7cd
Docker Compose version 2.26.1-4
Python 3.13.5
git version 2.47.3
traefik-public-net
total used free shared buff/cache available
Mem: 12288 61 10577 0 1649 12226
Swap: 0 0 0
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 59G 1.3G 55G 3% /
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19536788 18829472 48.29%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 78967692 854385396 8.03%
@@ -0,0 +1,169 @@
t_s,phase,status,health,restarts,oomkilled_flag,exit,limit_bytes,current_bytes,peak_bytes,anon_bytes,file_bytes,ev_oom,ev_oom_kill,ev_max,cgroup
40.8,start,created,,0,false,0,,,,,,,,,no
42.8,start,running,starting,0,false,0,,214106112,214372352,202956800,8192,0,0,0,yes
44.8,start,running,starting,0,false,0,,381394944,381628416,365441024,831488,0,0,0,yes
46.8,start,running,starting,0,false,0,,242147328,419913728,218886144,3166208,0,0,0,yes
48.8,start,running,starting,0,false,0,,447975424,506306560,425029632,3166208,0,0,0,yes
50.8,start,running,starting,0,false,0,,447565824,506306560,425029632,3166208,0,0,0,yes
52.8,start,running,starting,0,false,0,,447561728,506306560,425029632,3166208,0,0,0,yes
54.8,start,running,starting,0,false,0,,447344640,506306560,425029632,3166208,0,0,0,yes
56.8,start,running,starting,0,false,0,,447344640,506306560,425029632,3166208,0,0,0,yes
58.8,start,running,starting,0,false,0,,447344640,506306560,425029632,3166208,0,0,0,yes
60.8,start,running,starting,0,false,0,,447344640,506306560,425029632,3166208,0,0,0,yes
62.8,start,running,starting,0,false,0,,447340544,506306560,425029632,3166208,0,0,0,yes
64.8,start,running,starting,0,false,0,,447340544,506306560,425029632,3166208,0,0,0,yes
66.8,start,running,starting,0,false,0,,447336448,506306560,425029632,3166208,0,0,0,yes
68.8,start,running,starting,0,false,0,,447336448,506306560,425029632,3166208,0,0,0,yes
70.8,start,running,starting,0,false,0,,447336448,506306560,425029632,3166208,0,0,0,yes
72.8,idle,running,healthy,0,false,0,,393814016,506306560,372817920,3293184,0,0,0,yes
74.8,idle,running,healthy,0,false,0,,393834496,506306560,372817920,3293184,0,0,0,yes
76.8,idle,running,healthy,0,false,0,,393703424,506306560,372817920,3420160,0,0,0,yes
78.8,idle,running,healthy,0,false,0,,393703424,506306560,372817920,3420160,0,0,0,yes
80.8,idle,running,healthy,0,false,0,,394362880,506306560,372817920,4063232,0,0,0,yes
82.8,idle,running,healthy,0,false,0,,394362880,506306560,372817920,4063232,0,0,0,yes
84.8,idle,running,healthy,0,false,0,,394362880,506306560,372817920,4063232,0,0,0,yes
86.8,idle,running,healthy,0,false,0,,394362880,506306560,372817920,4063232,0,0,0,yes
88.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
90.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
92.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
94.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
96.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
98.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
100.8,idle,running,healthy,0,false,0,,394338304,506306560,372817920,4063232,0,0,0,yes
102.8,idle,running,healthy,0,false,0,,394354688,506306560,372834304,4063232,0,0,0,yes
104.8,idle,running,healthy,0,false,0,,394354688,506306560,372834304,4063232,0,0,0,yes
106.8,idle,running,healthy,0,false,0,,394354688,506306560,372834304,4063232,0,0,0,yes
108.8,idle,running,healthy,0,false,0,,394362880,506306560,372834304,4063232,0,0,0,yes
110.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
112.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
114.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
116.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
118.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
120.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
122.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
124.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
126.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
128.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
130.8,idle,running,healthy,0,false,0,,394362880,506306560,372842496,4063232,0,0,0,yes
132.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
134.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
136.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
138.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
140.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
142.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
144.8,idle,running,healthy,0,false,0,,394366976,506306560,372846592,4063232,0,0,0,yes
146.8,idle,running,healthy,0,false,0,,382656512,506306560,361402368,4063232,0,0,0,yes
148.8,idle,running,healthy,0,false,0,,382656512,506306560,361402368,4063232,0,0,0,yes
150.8,idle,running,healthy,0,false,0,,370569216,506306560,349626368,4063232,0,0,0,yes
152.8,idle,running,healthy,0,false,0,,370315264,506306560,349626368,4063232,0,0,0,yes
154.8,idle,running,healthy,0,false,0,,370315264,506306560,349626368,4063232,0,0,0,yes
156.8,idle,running,healthy,0,false,0,,370315264,506306560,349626368,4063232,0,0,0,yes
158.8,idle,running,healthy,0,false,0,,370315264,506306560,349626368,4063232,0,0,0,yes
160.8,idle,running,healthy,0,false,0,,370315264,506306560,349626368,4063232,0,0,0,yes
162.8,idle,running,healthy,0,false,0,,370638848,506306560,349786112,4063232,0,0,0,yes
164.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
166.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
168.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
170.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
172.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
174.8,idle,running,healthy,0,false,0,,370462720,506306560,349786112,4063232,0,0,0,yes
176.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
178.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
180.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
182.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
184.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
186.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
188.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
190.8,idle,running,healthy,0,false,0,,287952896,506306560,269946880,4063232,0,0,0,yes
192.8,idle,running,healthy,0,false,0,,288079872,506306560,269955072,4063232,0,0,0,yes
194.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
196.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
198.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
200.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
202.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
204.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
206.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
208.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
210.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
212.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
214.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
216.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
218.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
220.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
222.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
224.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
226.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
228.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
230.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
232.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
234.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
236.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
238.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
240.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
242.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
244.8,idle,running,healthy,0,false,0,,287961088,506306560,269955072,4063232,0,0,0,yes
246.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
248.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
250.8,idle,running,healthy,0,false,0,,287956992,506306560,269955072,4063232,0,0,0,yes
252.8,idle,running,healthy,0,false,0,,287227904,506306560,268812288,4063232,0,0,0,yes
254.8,idle,running,healthy,0,false,0,,286973952,506306560,268812288,4063232,0,0,0,yes
256.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
258.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
260.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
262.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
264.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
266.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
268.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
270.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
272.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
274.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
276.8,idle,running,healthy,0,false,0,,285609984,506306560,267698176,4063232,0,0,0,yes
278.8,idle,running,healthy,0,false,0,,285605888,506306560,267698176,4063232,0,0,0,yes
280.8,idle,running,healthy,0,false,0,,285605888,506306560,267698176,4063232,0,0,0,yes
282.8,idle,running,healthy,0,false,0,,284278784,506306560,266403840,4063232,0,0,0,yes
284.8,idle,running,healthy,0,false,0,,284278784,506306560,266403840,4063232,0,0,0,yes
286.8,idle,running,healthy,0,false,0,,284278784,506306560,266403840,4063232,0,0,0,yes
288.8,idle,running,healthy,0,false,0,,284282880,506306560,266403840,4063232,0,0,0,yes
290.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
292.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
294.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
296.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
298.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
300.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
302.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
304.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
306.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
308.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
310.8,idle,running,healthy,0,false,0,,284282880,506306560,266407936,4063232,0,0,0,yes
312.8,idle,running,healthy,0,false,0,,284483584,506306560,266600448,4063232,0,0,0,yes
314.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
316.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
318.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
320.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
322.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
324.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
326.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
328.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
330.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
332.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
334.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
336.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
338.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
340.8,idle,running,healthy,0,false,0,,284475392,506306560,266600448,4063232,0,0,0,yes
342.8,idle,running,healthy,0,false,0,,284672000,506306560,266784768,4063232,0,0,0,yes
344.8,idle,running,healthy,0,false,0,,284672000,506306560,266784768,4063232,0,0,0,yes
346.8,idle,running,healthy,0,false,0,,284672000,506306560,266784768,4063232,0,0,0,yes
348.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
350.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
352.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
354.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
356.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
358.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
360.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
362.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
364.8,idle,running,healthy,0,false,0,,284667904,506306560,266784768,4063232,0,0,0,yes
366.8,idle,running,healthy,0,false,0,,284663808,506306560,266784768,4063232,0,0,0,yes
368.8,idle,running,healthy,0,false,0,,284663808,506306560,266784768,4063232,0,0,0,yes
370.8,idle,running,healthy,0,false,0,,284663808,506306560,266784768,4063232,0,0,0,yes
372.8,end,running,healthy,0,false,0,,285491200,506306560,267022336,4063232,0,0,0,yes
374.8,end,running,healthy,0,false,0,,285114368,506306560,267022336,4063232,0,0,0,yes
1 t_s phase status health restarts oomkilled_flag exit limit_bytes current_bytes peak_bytes anon_bytes file_bytes ev_oom ev_oom_kill ev_max cgroup
2 40.8 start created 0 false 0 no
3 42.8 start running starting 0 false 0 214106112 214372352 202956800 8192 0 0 0 yes
4 44.8 start running starting 0 false 0 381394944 381628416 365441024 831488 0 0 0 yes
5 46.8 start running starting 0 false 0 242147328 419913728 218886144 3166208 0 0 0 yes
6 48.8 start running starting 0 false 0 447975424 506306560 425029632 3166208 0 0 0 yes
7 50.8 start running starting 0 false 0 447565824 506306560 425029632 3166208 0 0 0 yes
8 52.8 start running starting 0 false 0 447561728 506306560 425029632 3166208 0 0 0 yes
9 54.8 start running starting 0 false 0 447344640 506306560 425029632 3166208 0 0 0 yes
10 56.8 start running starting 0 false 0 447344640 506306560 425029632 3166208 0 0 0 yes
11 58.8 start running starting 0 false 0 447344640 506306560 425029632 3166208 0 0 0 yes
12 60.8 start running starting 0 false 0 447344640 506306560 425029632 3166208 0 0 0 yes
13 62.8 start running starting 0 false 0 447340544 506306560 425029632 3166208 0 0 0 yes
14 64.8 start running starting 0 false 0 447340544 506306560 425029632 3166208 0 0 0 yes
15 66.8 start running starting 0 false 0 447336448 506306560 425029632 3166208 0 0 0 yes
16 68.8 start running starting 0 false 0 447336448 506306560 425029632 3166208 0 0 0 yes
17 70.8 start running starting 0 false 0 447336448 506306560 425029632 3166208 0 0 0 yes
18 72.8 idle running healthy 0 false 0 393814016 506306560 372817920 3293184 0 0 0 yes
19 74.8 idle running healthy 0 false 0 393834496 506306560 372817920 3293184 0 0 0 yes
20 76.8 idle running healthy 0 false 0 393703424 506306560 372817920 3420160 0 0 0 yes
21 78.8 idle running healthy 0 false 0 393703424 506306560 372817920 3420160 0 0 0 yes
22 80.8 idle running healthy 0 false 0 394362880 506306560 372817920 4063232 0 0 0 yes
23 82.8 idle running healthy 0 false 0 394362880 506306560 372817920 4063232 0 0 0 yes
24 84.8 idle running healthy 0 false 0 394362880 506306560 372817920 4063232 0 0 0 yes
25 86.8 idle running healthy 0 false 0 394362880 506306560 372817920 4063232 0 0 0 yes
26 88.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
27 90.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
28 92.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
29 94.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
30 96.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
31 98.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
32 100.8 idle running healthy 0 false 0 394338304 506306560 372817920 4063232 0 0 0 yes
33 102.8 idle running healthy 0 false 0 394354688 506306560 372834304 4063232 0 0 0 yes
34 104.8 idle running healthy 0 false 0 394354688 506306560 372834304 4063232 0 0 0 yes
35 106.8 idle running healthy 0 false 0 394354688 506306560 372834304 4063232 0 0 0 yes
36 108.8 idle running healthy 0 false 0 394362880 506306560 372834304 4063232 0 0 0 yes
37 110.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
38 112.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
39 114.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
40 116.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
41 118.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
42 120.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
43 122.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
44 124.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
45 126.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
46 128.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
47 130.8 idle running healthy 0 false 0 394362880 506306560 372842496 4063232 0 0 0 yes
48 132.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
49 134.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
50 136.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
51 138.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
52 140.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
53 142.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
54 144.8 idle running healthy 0 false 0 394366976 506306560 372846592 4063232 0 0 0 yes
55 146.8 idle running healthy 0 false 0 382656512 506306560 361402368 4063232 0 0 0 yes
56 148.8 idle running healthy 0 false 0 382656512 506306560 361402368 4063232 0 0 0 yes
57 150.8 idle running healthy 0 false 0 370569216 506306560 349626368 4063232 0 0 0 yes
58 152.8 idle running healthy 0 false 0 370315264 506306560 349626368 4063232 0 0 0 yes
59 154.8 idle running healthy 0 false 0 370315264 506306560 349626368 4063232 0 0 0 yes
60 156.8 idle running healthy 0 false 0 370315264 506306560 349626368 4063232 0 0 0 yes
61 158.8 idle running healthy 0 false 0 370315264 506306560 349626368 4063232 0 0 0 yes
62 160.8 idle running healthy 0 false 0 370315264 506306560 349626368 4063232 0 0 0 yes
63 162.8 idle running healthy 0 false 0 370638848 506306560 349786112 4063232 0 0 0 yes
64 164.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
65 166.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
66 168.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
67 170.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
68 172.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
69 174.8 idle running healthy 0 false 0 370462720 506306560 349786112 4063232 0 0 0 yes
70 176.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
71 178.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
72 180.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
73 182.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
74 184.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
75 186.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
76 188.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
77 190.8 idle running healthy 0 false 0 287952896 506306560 269946880 4063232 0 0 0 yes
78 192.8 idle running healthy 0 false 0 288079872 506306560 269955072 4063232 0 0 0 yes
79 194.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
80 196.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
81 198.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
82 200.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
83 202.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
84 204.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
85 206.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
86 208.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
87 210.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
88 212.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
89 214.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
90 216.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
91 218.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
92 220.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
93 222.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
94 224.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
95 226.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
96 228.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
97 230.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
98 232.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
99 234.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
100 236.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
101 238.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
102 240.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
103 242.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
104 244.8 idle running healthy 0 false 0 287961088 506306560 269955072 4063232 0 0 0 yes
105 246.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
106 248.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
107 250.8 idle running healthy 0 false 0 287956992 506306560 269955072 4063232 0 0 0 yes
108 252.8 idle running healthy 0 false 0 287227904 506306560 268812288 4063232 0 0 0 yes
109 254.8 idle running healthy 0 false 0 286973952 506306560 268812288 4063232 0 0 0 yes
110 256.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
111 258.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
112 260.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
113 262.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
114 264.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
115 266.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
116 268.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
117 270.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
118 272.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
119 274.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
120 276.8 idle running healthy 0 false 0 285609984 506306560 267698176 4063232 0 0 0 yes
121 278.8 idle running healthy 0 false 0 285605888 506306560 267698176 4063232 0 0 0 yes
122 280.8 idle running healthy 0 false 0 285605888 506306560 267698176 4063232 0 0 0 yes
123 282.8 idle running healthy 0 false 0 284278784 506306560 266403840 4063232 0 0 0 yes
124 284.8 idle running healthy 0 false 0 284278784 506306560 266403840 4063232 0 0 0 yes
125 286.8 idle running healthy 0 false 0 284278784 506306560 266403840 4063232 0 0 0 yes
126 288.8 idle running healthy 0 false 0 284282880 506306560 266403840 4063232 0 0 0 yes
127 290.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
128 292.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
129 294.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
130 296.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
131 298.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
132 300.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
133 302.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
134 304.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
135 306.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
136 308.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
137 310.8 idle running healthy 0 false 0 284282880 506306560 266407936 4063232 0 0 0 yes
138 312.8 idle running healthy 0 false 0 284483584 506306560 266600448 4063232 0 0 0 yes
139 314.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
140 316.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
141 318.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
142 320.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
143 322.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
144 324.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
145 326.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
146 328.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
147 330.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
148 332.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
149 334.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
150 336.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
151 338.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
152 340.8 idle running healthy 0 false 0 284475392 506306560 266600448 4063232 0 0 0 yes
153 342.8 idle running healthy 0 false 0 284672000 506306560 266784768 4063232 0 0 0 yes
154 344.8 idle running healthy 0 false 0 284672000 506306560 266784768 4063232 0 0 0 yes
155 346.8 idle running healthy 0 false 0 284672000 506306560 266784768 4063232 0 0 0 yes
156 348.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
157 350.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
158 352.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
159 354.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
160 356.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
161 358.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
162 360.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
163 362.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
164 364.8 idle running healthy 0 false 0 284667904 506306560 266784768 4063232 0 0 0 yes
165 366.8 idle running healthy 0 false 0 284663808 506306560 266784768 4063232 0 0 0 yes
166 368.8 idle running healthy 0 false 0 284663808 506306560 266784768 4063232 0 0 0 yes
167 370.8 idle running healthy 0 false 0 284663808 506306560 266784768 4063232 0 0 0 yes
168 372.8 end running healthy 0 false 0 285491200 506306560 267022336 4063232 0 0 0 yes
169 374.8 end running healthy 0 false 0 285114368 506306560 267022336 4063232 0 0 0 yes
@@ -0,0 +1,41 @@
Error response from daemon: No such container: r803papra-papra-1
{"level":"info","message":"Worker started","timestampMs":1790951826314,"namespace":"tasks:services","data":{"processMode":"all","workerId":"default"}}
{"level":"info","message":"Task worker started","timestampMs":1790951826314,"namespace":"tasks:services","data":{"processMode":"all","workerId":"default"}}
{"level":"info","message":"Worker started","timestampMs":1790951826314,"namespace":"app-server","data":{"processMode":"all"}}
{"level":"info","message":"Server started","timestampMs":1790951826320,"namespace":"app-server","data":{"processMode":"all","port":1221}}
{"level":"debug","message":"Consuming job","timestampMs":1790951826321,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-hard-delete-expired-documents","taskName":"hard-delete-expired-documents"}}
{"level":"info","message":"Expired documents deleted","timestampMs":1790951826326,"namespace":"documents:tasks:hardDeleteExpiredDocuments","data":{"processMode":"all","deletedDocumentsCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790951826327,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-hard-delete-expired-documents","taskName":"hard-delete-expired-documents","nextDate":"2026-10-02T22:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790951826327,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-expire-invitations","taskName":"expire-invitations"}}
{"level":"info","message":"Updated expired pending invitations status","timestampMs":1790951826329,"namespace":"organizations:tasks:expireInvitations","data":{"processMode":"all"}}
{"level":"info","message":"Job rescheduled","timestampMs":1790951826330,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-expire-invitations","taskName":"expire-invitations","nextDate":"2026-10-02T22:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790951826330,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expired-organizations"}}
{"level":"info","message":"Found expired soft-deleted organizations to purge","timestampMs":1790951826331,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","organizationCount":0}}
{"level":"info","message":"Purged expired soft-deleted organizations","timestampMs":1790951826331,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","purgedOrganizationCount":0,"totalOrganizationCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790951826332,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expired-organizations","nextDate":"2026-10-02T23:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790951826332,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-kv-entries"}}
{"level":"info","message":"Purged expired kv-store entries","timestampMs":1790951826333,"namespace":"kv-store:tasks:purgeExpiredEntries","data":{"processMode":"all","deletedCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790951826333,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-kv-entries","nextDate":"2026-10-03T00:00:00.000Z"}}
{"level":"info","message":"Request completed","timestampMs":1790951848895,"namespace":"app","data":{"processMode":"all","requestId":"req_n19dkxtm1114laxq56pdt27e","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":30}}
{"level":"info","message":"Request completed","timestampMs":1790951849138,"namespace":"app","data":{"processMode":"all","requestId":"req_fuvh1rragvh9x4bwi23xtldw","status":200,"method":"GET","path":"/api/health","routePath":"/api/health","userAgent":"curl/8.14.1","durationMs":9}}
{"level":"warn","message":"Rate limiting skipped: could not determine client IP address. Ensure your runtime forwards a trusted client IP header and configure `advanced.ipAddress.ipAddressHeaders` if needed.","timestampMs":1790951849177,"namespace":"auth","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","args":[]}}
{"level":"info","message":"User signed up","timestampMs":1790951849366,"namespace":"auth","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","userId":"usr_bpedfbxp4su8qak8owd9dpdp"}}
{"level":"debug","message":"Event emitted","timestampMs":1790951849367,"namespace":"events-services","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","eventName":"user.created","eventId":"evt_zdo5df8yqve9uyf88pqpczef","handlerCount":2,"handlerNames":["roles.assign-admin-to-first-user","tracking.register-user-created-event"]}}
{"level":"info","message":"Request completed","timestampMs":1790951849368,"namespace":"app","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","status":200,"method":"POST","path":"/api/auth/sign-up/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":195}}
{"level":"info","message":"Event handler executed successfully","timestampMs":1790951849371,"namespace":"events-services","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","eventId":"evt_zdo5df8yqve9uyf88pqpczef","eventName":"user.created","handlerName":"tracking.register-user-created-event"}}
{"level":"info","message":"Admin role assigned to first user","timestampMs":1790951849382,"namespace":"events:first-user-admin","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","eventId":"evt_zdo5df8yqve9uyf88pqpczef","eventName":"user.created","handlerName":"roles.assign-admin-to-first-user","userId":"usr_bpedfbxp4su8qak8owd9dpdp"}}
{"level":"info","message":"Event handler executed successfully","timestampMs":1790951849383,"namespace":"events-services","data":{"processMode":"all","requestId":"req_tbxo45jr20ppa7lkfjgamsnz","eventId":"evt_zdo5df8yqve9uyf88pqpczef","eventName":"user.created","handlerName":"roles.assign-admin-to-first-user"}}
{"level":"info","message":"Request completed","timestampMs":1790951849408,"namespace":"app","data":{"processMode":"all","requestId":"req_xesthg827fgu037234tgbykw","status":200,"method":"GET","path":"/","routePath":"/*","userAgent":"curl/8.14.1","durationMs":2}}
{"level":"error","message":"Invalid password","timestampMs":1790951849562,"namespace":"auth","data":{"processMode":"all","requestId":"req_i44cjswl1ymsd6wyjo0tcc21","args":[]}}
{"level":"info","message":"Request completed","timestampMs":1790951849565,"namespace":"app","data":{"processMode":"all","requestId":"req_i44cjswl1ymsd6wyjo0tcc21","status":401,"method":"POST","path":"/api/auth/sign-in/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":122}}
{"level":"info","message":"Request completed","timestampMs":1790951849726,"namespace":"app","data":{"processMode":"all","requestId":"req_imy82mapf1d7ocrq47anw0kn","status":200,"method":"POST","path":"/api/auth/sign-in/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":125}}
{"level":"info","message":"Request completed","timestampMs":1790951879011,"namespace":"app","data":{"processMode":"all","requestId":"req_aiuro4gyph5iuh1zoyx28f0a","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790951909117,"namespace":"app","data":{"processMode":"all","requestId":"req_kz6nixmhcggk34cgklgme0gc","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790951939227,"namespace":"app","data":{"processMode":"all","requestId":"req_ene5chpio70s3ft9yrvtw8av","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790951969347,"namespace":"app","data":{"processMode":"all","requestId":"req_rd77g9po617jwmediluqbmat","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790951999484,"namespace":"app","data":{"processMode":"all","requestId":"req_ujqsjgp3nns1aw6at86qo6y8","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952029581,"namespace":"app","data":{"processMode":"all","requestId":"req_vjf42i6srfie7anna1z1n8s7","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952059706,"namespace":"app","data":{"processMode":"all","requestId":"req_gwmg4mra5d9cidz6c5iyqgfn","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952089818,"namespace":"app","data":{"processMode":"all","requestId":"req_b67si316nwx7c6aoei0pdhwf","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952119931,"namespace":"app","data":{"processMode":"all","requestId":"req_bro2lsyac2l2ftgcvm9420wd","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":2}}
{"level":"info","message":"Request completed","timestampMs":1790952150053,"namespace":"app","data":{"processMode":"all","requestId":"req_w8ktugjx2gdzadz8u9mcwsgq","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
@@ -0,0 +1,39 @@
[ 40.8s] compose create rc=0 container=1e1ace360792 HostConfig.Memory=0
[ 41.2s] compose start rc=0
[ 71.5s] healthy at 71.5s
[ 71.8s] fixture seed -> OK (papra: sign-up http=200)
[ 72.2s] fixture read back -> True (papra: sign-in as the seeded account http=200 ok=True)
[ 72.2s] idle 300s
[ 375.2s] volume files: ['db/db.sqlite (581632 B)']
{
"app": "papra",
"idle_s": 300,
"fixture_said": [
"papra: sign-up http=200",
"papra: sign-in as the seeded account http=200 ok=True"
],
"seed_ok": true,
"readback": true,
"healthy_at_s": 71.5,
"volume_files": [
"db/db.sqlite (581632 B)"
],
"samples": 168,
"peak_anon_bytes": 425029632,
"peak_anon_by_phase": {
"start": 425029632,
"seed": null,
"readback": null,
"idle": 372846592,
"end": 267022336
},
"idle_end_anon_bytes": 267022336,
"peak_current_bytes": 447975424,
"cgroup_memory_peak_bytes_max": 506306560,
"oom_kill_max": 0,
"final_status": "running",
"final_health": "healthy",
"final_restarts": "0",
"final_oomkilled_flag": "false",
"limit_bytes": null
}
@@ -0,0 +1,71 @@
{
"app": "papra",
"env_keys": [
"AUTH_SECRET",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"idle_s": 300,
"fixture_said": [
"papra: sign-up http=200",
"papra: sign-in as the seeded account http=200 ok=True"
],
"seed_ok": true,
"readback": true,
"healthy_at_s": 71.5,
"volume_files": [
"db/db.sqlite (581632 B)"
],
"samples": 168,
"peak_anon_bytes": 425029632,
"peak_anon_by_phase": {
"start": 425029632,
"seed": null,
"readback": null,
"idle": 372846592,
"end": 267022336
},
"idle_end_anon_bytes": 267022336,
"peak_current_bytes": 447975424,
"cgroup_memory_peak_bytes_max": 506306560,
"oom_kill_max": 0,
"final_status": "running",
"final_health": "healthy",
"final_restarts": "0",
"final_oomkilled_flag": "false",
"limit_bytes": null,
"events": [
{
"t": 40.8,
"event": "compose create rc=0 container=1e1ace360792 HostConfig.Memory=0"
},
{
"t": 41.2,
"event": "compose start rc=0"
},
{
"t": 71.5,
"event": "healthy at 71.5s"
},
{
"t": 71.8,
"event": "fixture seed -> OK (papra: sign-up http=200)"
},
{
"t": 72.2,
"event": "fixture read back -> True (papra: sign-in as the seeded account http=200 ok=True)"
},
{
"t": 72.2,
"event": "idle 300s"
},
{
"t": 375.2,
"event": "volume files: ['db/db.sqlite (581632 B)']"
}
]
}
@@ -0,0 +1,58 @@
{
"probe": {
"app": "papra",
"containers": [
{
"diff_added": 176,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 177,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "ghcr.io/papra-hq/papra:26.6.2-rootless",
"mounts": [
{
"class": "named-declared",
"files": 1,
"name": "volgate-papra_papra_data",
"sample": [
"db/db.sqlite"
],
"source": "/var/lib/docker/volumes/volgate-papra_papra_data/_data",
"target": "/app/app-data",
"writable_by_app": "yes"
}
],
"name": "papra",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"papra_data"
],
"env_keys": [
"AUTH_SECRET",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:1221/ -> 200"
],
"fixture": null,
"ports": [
1221
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,8 @@
# check-volume-persistence.py --evidence /root/gate-ev papra — 2026-10-02T14:49:11Z, bench 9401 r803-papra, catalog-wt febf58c + uncommitted gate scripts + BENCH-ONLY papra limit 768M (template.diff)
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
papra CLEAN
1 clean · 0 broken · 0 undetermined (of 1 in scope)
volume-persistence gate OK
check-volume-persistence exit code = 0
@@ -0,0 +1,169 @@
t_s,phase,status,health,restarts,oomkilled_flag,exit,limit_bytes,current_bytes,peak_bytes,anon_bytes,file_bytes,ev_oom,ev_oom_kill,ev_max,cgroup
0.3,start,created,,0,false,0,,,,,,,,,no
2.3,start,running,starting,0,false,0,805306368,216780800,216780800,206794752,8192,0,0,0,yes
4.3,start,running,starting,0,false,0,805306368,305967104,305967104,291098624,770048,0,0,0,yes
6.3,start,running,starting,0,false,0,805306368,244715520,358092800,221315072,2543616,0,0,0,yes
8.3,start,running,starting,0,false,0,805306368,313176064,358092800,295247872,2543616,0,0,0,yes
10.3,start,running,starting,0,false,0,805306368,312532992,358092800,295247872,2543616,0,0,0,yes
12.3,start,running,starting,0,false,0,805306368,312352768,358092800,295247872,2543616,0,0,0,yes
14.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
16.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
18.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
20.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
22.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
24.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
26.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
28.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
30.3,start,running,starting,0,false,0,805306368,312348672,358092800,295247872,2543616,0,0,0,yes
32.3,idle,running,healthy,0,false,0,805306368,315858944,358092800,297943040,2670592,0,0,0,yes
34.3,idle,running,healthy,0,false,0,805306368,315359232,358092800,297943040,2732032,0,0,0,yes
36.3,idle,running,healthy,0,false,0,805306368,315330560,358092800,297943040,2732032,0,0,0,yes
38.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
40.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
42.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
44.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
46.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
48.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
50.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
52.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
54.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
56.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
58.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
60.3,idle,running,healthy,0,false,0,805306368,316055552,358092800,297943040,3440640,0,0,0,yes
62.3,idle,running,healthy,0,false,0,805306368,316231680,358092800,297943040,3440640,0,0,0,yes
64.3,idle,running,healthy,0,false,0,805306368,316231680,358092800,297943040,3440640,0,0,0,yes
66.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
68.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
70.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
72.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
74.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
76.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
78.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
80.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
82.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
84.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
86.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
88.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
90.3,idle,running,healthy,0,false,0,805306368,316039168,358092800,297943040,3440640,0,0,0,yes
92.3,idle,running,healthy,0,false,0,805306368,316313600,358092800,297943040,3440640,0,0,0,yes
94.3,idle,running,healthy,0,false,0,805306368,316313600,358092800,297943040,3440640,0,0,0,yes
96.3,idle,running,healthy,0,false,0,805306368,316043264,358092800,297943040,3440640,0,0,0,yes
98.3,idle,running,healthy,0,false,0,805306368,316043264,358092800,297943040,3440640,0,0,0,yes
100.3,idle,running,healthy,0,false,0,805306368,316043264,358092800,297943040,3440640,0,0,0,yes
102.3,idle,running,healthy,0,false,0,805306368,316043264,358092800,297943040,3440640,0,0,0,yes
104.3,idle,running,healthy,0,false,0,805306368,316043264,358092800,297943040,3440640,0,0,0,yes
106.3,idle,running,healthy,0,false,0,805306368,307179520,358092800,289411072,3440640,0,0,0,yes
108.3,idle,running,healthy,0,false,0,805306368,307179520,358092800,289411072,3440640,0,0,0,yes
110.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
112.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
114.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
116.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
118.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
120.3,idle,running,healthy,0,false,0,805306368,298618880,358092800,281153536,3440640,0,0,0,yes
122.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
124.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
126.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
128.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
130.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
132.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
134.3,idle,running,healthy,0,false,0,805306368,298745856,358092800,281284608,3440640,0,0,0,yes
136.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
138.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
140.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
142.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
144.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
146.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
148.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
150.3,idle,running,healthy,0,false,0,805306368,283545600,358092800,266567680,3440640,0,0,0,yes
152.3,idle,running,healthy,0,false,0,805306368,284090368,358092800,266629120,3440640,0,0,0,yes
154.3,idle,running,healthy,0,false,0,805306368,283865088,358092800,266629120,3440640,0,0,0,yes
156.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
158.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
160.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
162.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
164.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
166.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
168.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
170.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
172.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
174.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
176.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
178.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
180.3,idle,running,healthy,0,false,0,805306368,283615232,358092800,266629120,3440640,0,0,0,yes
182.3,idle,running,healthy,0,false,0,805306368,283774976,358092800,266637312,3440640,0,0,0,yes
184.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
186.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
188.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
190.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
192.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
194.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
196.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
198.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
200.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
202.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
204.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
206.3,idle,running,healthy,0,false,0,805306368,283623424,358092800,266637312,3440640,0,0,0,yes
208.3,idle,running,healthy,0,false,0,805306368,283619328,358092800,266637312,3440640,0,0,0,yes
210.3,idle,running,healthy,0,false,0,805306368,283619328,358092800,266637312,3440640,0,0,0,yes
212.3,idle,running,healthy,0,false,0,805306368,282644480,358092800,265555968,3440640,0,0,0,yes
214.3,idle,running,healthy,0,false,0,805306368,282529792,358092800,265555968,3440640,0,0,0,yes
216.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
218.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
220.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
222.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
224.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
226.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
228.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
230.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
232.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
234.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
236.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
238.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
240.3,idle,running,healthy,0,false,0,805306368,281309184,358092800,264429568,3440640,0,0,0,yes
242.3,idle,running,healthy,0,false,0,805306368,279969792,358092800,262512640,3440640,0,0,0,yes
244.3,idle,running,healthy,0,false,0,805306368,279519232,358092800,262512640,3440640,0,0,0,yes
246.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
248.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
250.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
252.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
254.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
256.3,idle,running,healthy,0,false,0,805306368,279330816,358092800,262512640,3440640,0,0,0,yes
258.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
260.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
262.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
264.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
266.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
268.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
270.3,idle,running,healthy,0,false,0,805306368,279326720,358092800,262512640,3440640,0,0,0,yes
272.3,idle,running,healthy,0,false,0,805306368,279535616,358092800,262713344,3440640,0,0,0,yes
274.3,idle,running,healthy,0,false,0,805306368,279535616,358092800,262713344,3440640,0,0,0,yes
276.3,idle,running,healthy,0,false,0,805306368,279531520,358092800,262713344,3440640,0,0,0,yes
278.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
280.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
282.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
284.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
286.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
288.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
290.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
292.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
294.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
296.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
298.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
300.3,idle,running,healthy,0,false,0,805306368,279527424,358092800,262713344,3440640,0,0,0,yes
302.3,idle,running,healthy,0,false,0,805306368,280551424,358092800,262909952,3440640,0,0,0,yes
304.3,idle,running,healthy,0,false,0,805306368,279789568,358092800,262909952,3440640,0,0,0,yes
306.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
308.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
310.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
312.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
314.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
316.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
318.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
320.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
322.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
324.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
326.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
328.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
330.3,idle,running,healthy,0,false,0,805306368,279732224,358092800,262909952,3440640,0,0,0,yes
332.3,end,running,healthy,0,false,0,805306368,280178688,358092800,263094272,3440640,0,0,0,yes
334.3,end,running,healthy,0,false,0,805306368,280158208,358092800,263094272,3440640,0,0,0,yes
1 t_s phase status health restarts oomkilled_flag exit limit_bytes current_bytes peak_bytes anon_bytes file_bytes ev_oom ev_oom_kill ev_max cgroup
2 0.3 start created 0 false 0 no
3 2.3 start running starting 0 false 0 805306368 216780800 216780800 206794752 8192 0 0 0 yes
4 4.3 start running starting 0 false 0 805306368 305967104 305967104 291098624 770048 0 0 0 yes
5 6.3 start running starting 0 false 0 805306368 244715520 358092800 221315072 2543616 0 0 0 yes
6 8.3 start running starting 0 false 0 805306368 313176064 358092800 295247872 2543616 0 0 0 yes
7 10.3 start running starting 0 false 0 805306368 312532992 358092800 295247872 2543616 0 0 0 yes
8 12.3 start running starting 0 false 0 805306368 312352768 358092800 295247872 2543616 0 0 0 yes
9 14.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
10 16.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
11 18.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
12 20.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
13 22.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
14 24.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
15 26.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
16 28.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
17 30.3 start running starting 0 false 0 805306368 312348672 358092800 295247872 2543616 0 0 0 yes
18 32.3 idle running healthy 0 false 0 805306368 315858944 358092800 297943040 2670592 0 0 0 yes
19 34.3 idle running healthy 0 false 0 805306368 315359232 358092800 297943040 2732032 0 0 0 yes
20 36.3 idle running healthy 0 false 0 805306368 315330560 358092800 297943040 2732032 0 0 0 yes
21 38.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
22 40.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
23 42.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
24 44.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
25 46.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
26 48.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
27 50.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
28 52.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
29 54.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
30 56.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
31 58.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
32 60.3 idle running healthy 0 false 0 805306368 316055552 358092800 297943040 3440640 0 0 0 yes
33 62.3 idle running healthy 0 false 0 805306368 316231680 358092800 297943040 3440640 0 0 0 yes
34 64.3 idle running healthy 0 false 0 805306368 316231680 358092800 297943040 3440640 0 0 0 yes
35 66.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
36 68.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
37 70.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
38 72.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
39 74.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
40 76.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
41 78.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
42 80.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
43 82.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
44 84.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
45 86.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
46 88.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
47 90.3 idle running healthy 0 false 0 805306368 316039168 358092800 297943040 3440640 0 0 0 yes
48 92.3 idle running healthy 0 false 0 805306368 316313600 358092800 297943040 3440640 0 0 0 yes
49 94.3 idle running healthy 0 false 0 805306368 316313600 358092800 297943040 3440640 0 0 0 yes
50 96.3 idle running healthy 0 false 0 805306368 316043264 358092800 297943040 3440640 0 0 0 yes
51 98.3 idle running healthy 0 false 0 805306368 316043264 358092800 297943040 3440640 0 0 0 yes
52 100.3 idle running healthy 0 false 0 805306368 316043264 358092800 297943040 3440640 0 0 0 yes
53 102.3 idle running healthy 0 false 0 805306368 316043264 358092800 297943040 3440640 0 0 0 yes
54 104.3 idle running healthy 0 false 0 805306368 316043264 358092800 297943040 3440640 0 0 0 yes
55 106.3 idle running healthy 0 false 0 805306368 307179520 358092800 289411072 3440640 0 0 0 yes
56 108.3 idle running healthy 0 false 0 805306368 307179520 358092800 289411072 3440640 0 0 0 yes
57 110.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
58 112.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
59 114.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
60 116.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
61 118.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
62 120.3 idle running healthy 0 false 0 805306368 298618880 358092800 281153536 3440640 0 0 0 yes
63 122.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
64 124.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
65 126.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
66 128.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
67 130.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
68 132.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
69 134.3 idle running healthy 0 false 0 805306368 298745856 358092800 281284608 3440640 0 0 0 yes
70 136.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
71 138.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
72 140.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
73 142.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
74 144.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
75 146.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
76 148.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
77 150.3 idle running healthy 0 false 0 805306368 283545600 358092800 266567680 3440640 0 0 0 yes
78 152.3 idle running healthy 0 false 0 805306368 284090368 358092800 266629120 3440640 0 0 0 yes
79 154.3 idle running healthy 0 false 0 805306368 283865088 358092800 266629120 3440640 0 0 0 yes
80 156.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
81 158.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
82 160.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
83 162.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
84 164.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
85 166.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
86 168.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
87 170.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
88 172.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
89 174.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
90 176.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
91 178.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
92 180.3 idle running healthy 0 false 0 805306368 283615232 358092800 266629120 3440640 0 0 0 yes
93 182.3 idle running healthy 0 false 0 805306368 283774976 358092800 266637312 3440640 0 0 0 yes
94 184.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
95 186.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
96 188.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
97 190.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
98 192.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
99 194.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
100 196.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
101 198.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
102 200.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
103 202.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
104 204.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
105 206.3 idle running healthy 0 false 0 805306368 283623424 358092800 266637312 3440640 0 0 0 yes
106 208.3 idle running healthy 0 false 0 805306368 283619328 358092800 266637312 3440640 0 0 0 yes
107 210.3 idle running healthy 0 false 0 805306368 283619328 358092800 266637312 3440640 0 0 0 yes
108 212.3 idle running healthy 0 false 0 805306368 282644480 358092800 265555968 3440640 0 0 0 yes
109 214.3 idle running healthy 0 false 0 805306368 282529792 358092800 265555968 3440640 0 0 0 yes
110 216.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
111 218.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
112 220.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
113 222.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
114 224.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
115 226.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
116 228.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
117 230.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
118 232.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
119 234.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
120 236.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
121 238.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
122 240.3 idle running healthy 0 false 0 805306368 281309184 358092800 264429568 3440640 0 0 0 yes
123 242.3 idle running healthy 0 false 0 805306368 279969792 358092800 262512640 3440640 0 0 0 yes
124 244.3 idle running healthy 0 false 0 805306368 279519232 358092800 262512640 3440640 0 0 0 yes
125 246.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
126 248.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
127 250.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
128 252.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
129 254.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
130 256.3 idle running healthy 0 false 0 805306368 279330816 358092800 262512640 3440640 0 0 0 yes
131 258.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
132 260.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
133 262.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
134 264.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
135 266.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
136 268.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
137 270.3 idle running healthy 0 false 0 805306368 279326720 358092800 262512640 3440640 0 0 0 yes
138 272.3 idle running healthy 0 false 0 805306368 279535616 358092800 262713344 3440640 0 0 0 yes
139 274.3 idle running healthy 0 false 0 805306368 279535616 358092800 262713344 3440640 0 0 0 yes
140 276.3 idle running healthy 0 false 0 805306368 279531520 358092800 262713344 3440640 0 0 0 yes
141 278.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
142 280.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
143 282.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
144 284.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
145 286.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
146 288.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
147 290.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
148 292.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
149 294.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
150 296.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
151 298.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
152 300.3 idle running healthy 0 false 0 805306368 279527424 358092800 262713344 3440640 0 0 0 yes
153 302.3 idle running healthy 0 false 0 805306368 280551424 358092800 262909952 3440640 0 0 0 yes
154 304.3 idle running healthy 0 false 0 805306368 279789568 358092800 262909952 3440640 0 0 0 yes
155 306.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
156 308.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
157 310.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
158 312.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
159 314.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
160 316.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
161 318.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
162 320.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
163 322.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
164 324.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
165 326.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
166 328.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
167 330.3 idle running healthy 0 false 0 805306368 279732224 358092800 262909952 3440640 0 0 0 yes
168 332.3 end running healthy 0 false 0 805306368 280178688 358092800 263094272 3440640 0 0 0 yes
169 334.3 end running healthy 0 false 0 805306368 280158208 358092800 263094272 3440640 0 0 0 yes
@@ -0,0 +1,41 @@
Error response from daemon: No such container: r803papra-papra-1
{"level":"info","message":"Worker started","timestampMs":1790952202404,"namespace":"tasks:services","data":{"processMode":"all","workerId":"default"}}
{"level":"info","message":"Task worker started","timestampMs":1790952202405,"namespace":"tasks:services","data":{"processMode":"all","workerId":"default"}}
{"level":"info","message":"Worker started","timestampMs":1790952202405,"namespace":"app-server","data":{"processMode":"all"}}
{"level":"info","message":"Server started","timestampMs":1790952202412,"namespace":"app-server","data":{"processMode":"all","port":1221}}
{"level":"debug","message":"Consuming job","timestampMs":1790952202412,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-hard-delete-expired-documents","taskName":"hard-delete-expired-documents"}}
{"level":"info","message":"Expired documents deleted","timestampMs":1790952202417,"namespace":"documents:tasks:hardDeleteExpiredDocuments","data":{"processMode":"all","deletedDocumentsCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790952202418,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-hard-delete-expired-documents","taskName":"hard-delete-expired-documents","nextDate":"2026-10-02T22:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790952202418,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-expire-invitations","taskName":"expire-invitations"}}
{"level":"info","message":"Updated expired pending invitations status","timestampMs":1790952202420,"namespace":"organizations:tasks:expireInvitations","data":{"processMode":"all"}}
{"level":"info","message":"Job rescheduled","timestampMs":1790952202420,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-expire-invitations","taskName":"expire-invitations","nextDate":"2026-10-02T22:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790952202420,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expired-organizations"}}
{"level":"info","message":"Found expired soft-deleted organizations to purge","timestampMs":1790952202421,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","organizationCount":0}}
{"level":"info","message":"Purged expired soft-deleted organizations","timestampMs":1790952202421,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","purgedOrganizationCount":0,"totalOrganizationCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790952202422,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expired-organizations","nextDate":"2026-10-02T23:00:00.000Z"}}
{"level":"debug","message":"Consuming job","timestampMs":1790952202422,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-kv-entries"}}
{"level":"info","message":"Purged expired kv-store entries","timestampMs":1790952202423,"namespace":"kv-store:tasks:purgeExpiredEntries","data":{"processMode":"all","deletedCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790952202424,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-kv-entries","nextDate":"2026-10-03T00:00:00.000Z"}}
{"level":"info","message":"Request completed","timestampMs":1790952224957,"namespace":"app","data":{"processMode":"all","requestId":"req_mzlriaig290cp0lo1pueqg8f","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":10}}
{"level":"info","message":"Request completed","timestampMs":1790952225211,"namespace":"app","data":{"processMode":"all","requestId":"req_rbgds36k06nva5ctmyja6wa8","status":200,"method":"GET","path":"/api/health","routePath":"/api/health","userAgent":"curl/8.14.1","durationMs":10}}
{"level":"warn","message":"Rate limiting skipped: could not determine client IP address. Ensure your runtime forwards a trusted client IP header and configure `advanced.ipAddress.ipAddressHeaders` if needed.","timestampMs":1790952225255,"namespace":"auth","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","args":[]}}
{"level":"info","message":"User signed up","timestampMs":1790952225439,"namespace":"auth","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","userId":"usr_ruxg5v735iel8nz8s9lqa7tq"}}
{"level":"debug","message":"Event emitted","timestampMs":1790952225441,"namespace":"events-services","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","eventName":"user.created","eventId":"evt_ow003efa2kswbeylubj7rz7e","handlerCount":2,"handlerNames":["roles.assign-admin-to-first-user","tracking.register-user-created-event"]}}
{"level":"info","message":"Request completed","timestampMs":1790952225443,"namespace":"app","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","status":200,"method":"POST","path":"/api/auth/sign-up/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":193}}
{"level":"info","message":"Event handler executed successfully","timestampMs":1790952225446,"namespace":"events-services","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","eventId":"evt_ow003efa2kswbeylubj7rz7e","eventName":"user.created","handlerName":"tracking.register-user-created-event"}}
{"level":"info","message":"Admin role assigned to first user","timestampMs":1790952225457,"namespace":"events:first-user-admin","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","eventId":"evt_ow003efa2kswbeylubj7rz7e","eventName":"user.created","handlerName":"roles.assign-admin-to-first-user","userId":"usr_ruxg5v735iel8nz8s9lqa7tq"}}
{"level":"info","message":"Event handler executed successfully","timestampMs":1790952225457,"namespace":"events-services","data":{"processMode":"all","requestId":"req_ds7k408u2428ruedcr4wkuyz","eventId":"evt_ow003efa2kswbeylubj7rz7e","eventName":"user.created","handlerName":"roles.assign-admin-to-first-user"}}
{"level":"info","message":"Request completed","timestampMs":1790952225483,"namespace":"app","data":{"processMode":"all","requestId":"req_vq3wue4ynu6w2hgdioirevpy","status":200,"method":"GET","path":"/","routePath":"/*","userAgent":"curl/8.14.1","durationMs":2}}
{"level":"error","message":"Invalid password","timestampMs":1790952225645,"namespace":"auth","data":{"processMode":"all","requestId":"req_j26sizfqgcjoyehnqbqwshp7","args":[]}}
{"level":"info","message":"Request completed","timestampMs":1790952225649,"namespace":"app","data":{"processMode":"all","requestId":"req_j26sizfqgcjoyehnqbqwshp7","status":401,"method":"POST","path":"/api/auth/sign-in/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":131}}
{"level":"info","message":"Request completed","timestampMs":1790952225813,"namespace":"app","data":{"processMode":"all","requestId":"req_fiszwx3skbrokcjkwy25qqqt","status":200,"method":"POST","path":"/api/auth/sign-in/email","routePath":"/api/auth/*","userAgent":"curl/8.14.1","durationMs":129}}
{"level":"info","message":"Request completed","timestampMs":1790952255066,"namespace":"app","data":{"processMode":"all","requestId":"req_jtvkoj6bu97qyx0vn4xlueur","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":2}}
{"level":"info","message":"Request completed","timestampMs":1790952285177,"namespace":"app","data":{"processMode":"all","requestId":"req_lc748l5n8pffmamuf2h1v2i2","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952315288,"namespace":"app","data":{"processMode":"all","requestId":"req_mhiebf8u6rkw5y714kvimxe0","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":2}}
{"level":"info","message":"Request completed","timestampMs":1790952345400,"namespace":"app","data":{"processMode":"all","requestId":"req_n8xfrzfsje6fjmdotkp7jsi6","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952375509,"namespace":"app","data":{"processMode":"all","requestId":"req_z7vnjzysymre102masesv1g7","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952405625,"namespace":"app","data":{"processMode":"all","requestId":"req_sm6dnbj50dom70gj14gtzh9l","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952435760,"namespace":"app","data":{"processMode":"all","requestId":"req_ijng1wv39gjmmt5bfy8aamjj","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":2}}
{"level":"info","message":"Request completed","timestampMs":1790952465867,"namespace":"app","data":{"processMode":"all","requestId":"req_uvkcg2pvsxcfqijm6o3s5666","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952495986,"namespace":"app","data":{"processMode":"all","requestId":"req_mu9yi26i6txf2ebnqgbtr3yj","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
{"level":"info","message":"Request completed","timestampMs":1790952526097,"namespace":"app","data":{"processMode":"all","requestId":"req_xrw5zt9is0bg76uv8jhjxgr0","status":200,"method":"GET","path":"/","routePath":"/*","durationMs":1}}
@@ -0,0 +1,39 @@
[ 0.3s] compose create rc=0 container=334b86886d75 HostConfig.Memory=805306368
[ 0.6s] compose start rc=0
[ 31.0s] healthy at 31.0s
[ 31.2s] fixture seed -> OK (papra: sign-up http=200)
[ 31.6s] fixture read back -> True (papra: sign-in as the seeded account http=200 ok=True)
[ 31.6s] idle 300s
[ 334.6s] volume files: ['db/db.sqlite (581632 B)']
{
"app": "papra",
"idle_s": 300,
"fixture_said": [
"papra: sign-up http=200",
"papra: sign-in as the seeded account http=200 ok=True"
],
"seed_ok": true,
"readback": true,
"healthy_at_s": 31.0,
"volume_files": [
"db/db.sqlite (581632 B)"
],
"samples": 168,
"peak_anon_bytes": 297943040,
"peak_anon_by_phase": {
"start": 295247872,
"seed": null,
"readback": null,
"idle": 297943040,
"end": 263094272
},
"idle_end_anon_bytes": 263094272,
"peak_current_bytes": 316313600,
"cgroup_memory_peak_bytes_max": 358092800,
"oom_kill_max": 0,
"final_status": "running",
"final_health": "healthy",
"final_restarts": "0",
"final_oomkilled_flag": "false",
"limit_bytes": 805306368
}
@@ -0,0 +1,71 @@
{
"app": "papra",
"env_keys": [
"AUTH_SECRET",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"idle_s": 300,
"fixture_said": [
"papra: sign-up http=200",
"papra: sign-in as the seeded account http=200 ok=True"
],
"seed_ok": true,
"readback": true,
"healthy_at_s": 31.0,
"volume_files": [
"db/db.sqlite (581632 B)"
],
"samples": 168,
"peak_anon_bytes": 297943040,
"peak_anon_by_phase": {
"start": 295247872,
"seed": null,
"readback": null,
"idle": 297943040,
"end": 263094272
},
"idle_end_anon_bytes": 263094272,
"peak_current_bytes": 316313600,
"cgroup_memory_peak_bytes_max": 358092800,
"oom_kill_max": 0,
"final_status": "running",
"final_health": "healthy",
"final_restarts": "0",
"final_oomkilled_flag": "false",
"limit_bytes": 805306368,
"events": [
{
"t": 0.3,
"event": "compose create rc=0 container=334b86886d75 HostConfig.Memory=805306368"
},
{
"t": 0.6,
"event": "compose start rc=0"
},
{
"t": 31.0,
"event": "healthy at 31.0s"
},
{
"t": 31.2,
"event": "fixture seed -> OK (papra: sign-up http=200)"
},
{
"t": 31.6,
"event": "fixture read back -> True (papra: sign-in as the seeded account http=200 ok=True)"
},
{
"t": 31.6,
"event": "idle 300s"
},
{
"t": 334.6,
"event": "volume files: ['db/db.sqlite (581632 B)']"
}
]
}
@@ -0,0 +1,44 @@
+ date -u
Fri Oct 2 14:51:49 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
9401 running r803-papra
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19545060 18821200 48.32%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 80190580 853162508 8.15%
+ pct exec 9401 -- bash -c 'docker ps -a --format {{.Names}} | wc -l; docker volume ls -q | wc -l; ls /root/.docker/config.json 2>&1'
0
0
ls: cannot access '/root/.docker/config.json': No such file or directory
+ pct stop 9401
+ pct destroy 9401 --purge
purging CT 9401 from related configurations..
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ ls /mnt/hdd_1/images/
9202
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19544988 18821272 48.31%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 77370636 855982452 7.87%
ls: cannot access '/root/r803-*': No such file or directory
# Teardown statement (R-803), 2026-10-02 ~14:52Z
# machine: bench LXC 9401 (r803-papra): 0 containers and 0 volumes before stop (each run did `compose down -v`); no Docker Hub
# login was made this time (no config.json); destroyed with --purge.
# host: demo-hp: `pct list` = 9201 + 9202 only (both untouched); /mnt/hdd_1/images/ = 9202 only; nvme-scratch 77370636 KiB
# used before create = after destroy; local-lvm unchanged (34954734 KiB); helper scripts removed from /root.
# hub: untouched. No prune anywhere. Nothing committed or pushed; the 768M change existed only in the bench's catalog copy
# (recorded in template.diff). The DooPlex scratchpad catalog-wt was not modified.
@@ -0,0 +1,35 @@
diff --git a/templates/papra/.felhom.yml b/templates/papra/.felhom.yml
index 15c568e..9c68192 100644
--- a/templates/papra/.felhom.yml
+++ b/templates/papra/.felhom.yml
@@ -15,7 +15,7 @@ catalog_since: "2026-09-22"
# --- Resource hints (displayed on deploy screen) ---
resources:
mem_request: "50M"
- mem_limit: "256M"
+ mem_limit: "768M"
pi_compatible: true
needs_hdd: false
diff --git a/templates/papra/docker-compose.yml b/templates/papra/docker-compose.yml
index 44bd7c6..d79cacd 100644
--- a/templates/papra/docker-compose.yml
+++ b/templates/papra/docker-compose.yml
@@ -1,7 +1,7 @@
# Papra - Minimalista dokumentumtár és rendszerező
# Domain: ${SUBDOMAIN}.${DOMAIN}
# Database: None (file-based)
-# RAM: ~50M (mem_limit: 256M) | Pi-compatible: Yes
+# RAM: ~255M idle, ~405M anon at first-start migration (mem_limit: 768M, R-803) | Pi-compatible: Yes
#
# Environment variables:
# DOMAIN - Your domain (e.g., demo-felhom.eu)
@@ -38,7 +38,7 @@ services:
deploy:
resources:
limits:
- memory: 256M
+ memory: 768M
healthcheck:
# A papra képfájlban nincs wget és nincs curl — csak node. A korábbi wget
# próba ezért soha nem futott le, a konténer véglegesen unhealthy maradt,
@@ -0,0 +1,211 @@
# Volume-persistence sweep — all 58 templates, 2026-10-02 (bench LXC 9401 on demo-hp)
Gate: `scripts/check-volume-persistence.py --all --evidence` (catalog-wt febf58c + UNCOMMITTED R-801/R-788/fixture-seed
change), 8 batches, Docker Hub logged in. Raw stdout: `batch-NN.txt`; per-app probe: `evidence/<app>/probe.json`.
## Headline
**CLEAN** 39 · **UNDETERMINED** 19 · **BROKEN** 0 · **INCONCLUSIVE** 0
(of 58). BROKEN = the gate REFUSED. Apps where the gate called the app's own fixture seed: **16**.
"What made it write" is read off the probe: `fixture …` = the gate's third step ran (field `fixture`); `deep pass` = the
second (wider, redirect-following) GET pass produced answers (inferred: >1 hit per ip:port or a non-`/` path); `GET exercise
(or start)` = the first `/` GET answered and nothing further was needed — the probe cannot separate data written at start from
data written because of that GET. A `fixture` field of null on an UNDETERMINED app means the app has no fixture (or the module
did not load), so the gate had nothing to call.
## Reading the headline (added by hand after the generator)
- **Fixture seed: called for 16 apps.** It turned 2 into CLEAN (metube, privatebin). 13 seeded OK and still stay
UNDETERMINED, because a *second* declared volume (uploads / media / cache / redis / backup) stays empty after a
seed that writes only to the database: claper, crafty-controller, dawarich, docmost, gramps-web, immich, outline,
sparkyfitness, tandoor, vikunja, wger, wishlist, zipline. 1 seed could not run: plex (`NoRoute` — the first-run claim
needs a plex.tv token). No fixture crashed the gate.
- **5 UNDETERMINED apps had no fixture to call:** bentopdf (stateless, declares no volume), papra (crash-loop, see
below), plant-it (image gone), recipe-importer (writes nothing; the only `/` entry is its own `/data` mount point),
wanderer (web container **unhealthy**; its pocketbase and meilisearch volumes hold data, `/app/uploads` and
`/data/plugins` are empty).
- **papra does not start under its own memory limit.** Exit 137 in batch 06 and again alone
(`batch-09-papra-rerun.txt`). Separate diagnosis (`papra-oom-diagnosis.txt`): `docker run --memory 256m` (the
template's `deploy.resources.limits.memory`) → `OOMKilled=true` during `tsx src/scripts/migrate-up.script.ts`; no
limit → running at ~416 MiB after 60 s, `db/db.sqlite` written INTO the `/app/app-data` volume. So the R-156 mount
is right; the 256M limit (header comment says "RAM ~50M") is too low for papra 26.6.2. Not a persistence verdict —
a start-up defect. Template not edited.
- **plant-it** (`lifecycle: abandoned`, run only because of `--all`): `msdeluise/plant-it` cannot be pulled
("repository does not exist"), while logged in to Docker Hub. Not throttling, so not INCONCLUSIVE.
- **No pull was throttled** — no `toomanyrequests` / rate-limit text in any batch, so INCONCLUSIVE is 0.
- **Blind spot, not a verdict:** grimmory is CLEAN while its `/app/data` (a BIND to the data drive) holds 0 files;
the R-788 empty-volume rule covers only *named declared* volumes, and grimmory's state is in its MariaDB volume
(355 files). Same shape: komga `/data`, paperless `consume`/`export`, radarr/sonarr media binds — empty binds are
not judged by the gate.
- **No GET answer** on crafty-controller (port 8443 is HTTPS; the gate curls `http://`) and gramps-web (port 5000)
— both reached data only through the fixture.
- `--all` was used so the hidden (wger) and abandoned (plant-it) apps are in scope; 56 are `available`.
| app | verdict now | ports | what made it write | gate's reasons (short) | notes |
|---|---|---|---|---|---|
| actualbudget | CLEAN | 5006 | GET exercise (or start) | - | declared volumes: actualbudget_data · mounts actualbudget:/data=2(named-declared) |
| adventurelog | CLEAN | 80,3000 | GET exercise (or start) | - | declared volumes: adventurelog_media, adventurelog_postgres_data · mounts adventurelog:/code/media=251(named-declared); adventurelog-postgres:/var/lib/postgresql/data=2313(named-declared) |
| audiobookshelf | CLEAN | 80 | GET exercise (or start) | - | declared volumes: audiobookshelf_config, audiobookshelf_metadata · mounts audiobookshelf:/audiobooks=0(bind); audiobookshelf:/podcasts=0(bind); audiobookshelf:/config=16(named-declared); audiobookshelf:/metadata=1(named-declared) |
| bentopdf | UNDETERMINED | 8080 | deep pass | nothing was written to any mount and nothing data-classified in any writable layer — the app produced no data to locate. Health is not data: this is UNDETERMINED, not CLEAN | declared volumes: NONE · fixture: none called (app has no fixture, or step not reached) · mounts |
| bookstack | CLEAN | 80 | GET exercise (or start) | - | declared volumes: bookstack_config, bookstack_db_data · mounts bookstack:/config=22(named-declared); bookstack-db:/var/lib/mysql=291(named-declared) |
| calcom | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: calcom_postgres_data · mounts calcom-postgres:/var/lib/postgresql=2264(named-declared) |
| calibre-web | CLEAN | 8083 | GET exercise (or start) | calibre-web: /app/calibre-web-automated/empty_library — database file(s) touched but byte-identical to the image; a chown sweep, not a write; calibre-web: /app/calibre-web-automated/empty_library — database file(s) touch | declared volumes: calibre_web_config · mounts calibre-web:/cwa-book-ingest=0(bind); calibre-web:/calibre-library=3(bind); calibre-web:/config=11(named-declared) |
| claper | UNDETERMINED | 4000 | fixture seed OK — `fixture Claper: seed OK — claper: seeded user drill-f9ed4c26@gate.invalid` | claper: declared volume /app/priv/static/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; claper: this container's mounts are all empty while it created entries in ['/ | declared volumes: claper_postgres_data, claper_uploads · mounts claper:/app/priv/static/uploads=0(named-declared); claper-postgres:/var/lib/postgresql/data=1471(named-declared) |
| code-server | CLEAN | 8443 | GET exercise (or start) | - | declared volumes: codeserver_config · mounts code-server:/config=12(named-declared) |
| crafty-controller | UNDETERMINED | 8443 | fixture seed OK — `fixture Crafty: seed OK — crafty: POST /api/v2/roles http=200 {"status":"ok","data":{"role_id":1}}` | crafty-controller: declared volume /crafty/servers is EMPTY after the exercise — the app was not shown to write where the template preserves it; crafty-controller: declared volume /crafty/import is EMPTY after the exerci | declared volumes: crafty_backups, crafty_config, crafty_import, crafty_logs, crafty_servers · mounts crafty-controller:/crafty/logs=8(named-declared); crafty-controller:/crafty/servers=0(named-declared); crafty-controller:/crafty/app/config=16(named-declared); crafty-controller:/crafty/import=0(named-declared); crafty-controller:/crafty/backups=0(named-declared) |
| dawarich | UNDETERMINED | 3000 | fixture seed OK — `fixture Dawarich: seed OK — dawarich: POST /api/v1/overland/batches http=201 (47.4056,19.1918 at 2026-09-10T13:50:00Z)` | dawarich-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: dawarich_db_data, dawarich_public, dawarich_redis, dawarich_storage, dawarich_watched · mounts dawarich:/var/app/tmp/imports/watched=0(named-declared); dawarich:/var/app/storage=1(named-declared); dawarich:/var/app/public=646(named-declared); dawarich-db:/var/lib/postgresql/data=2358(named-declared); dawarich-redis:/data=0(named-declared); dawarich-sidekiq:/var/app/public=646(named-declared); |
| docmost | UNDETERMINED | 3000 | fixture seed OK — `fixture Docmost: seed OK — docmost: /api/auth/setup http=200 rc=0` | docmost: declared volume /app/data/storage is EMPTY after the exercise — the app was not shown to write where the template preserves it; docmost: this container's mounts are all empty while it created entries in ['/app/a | declared volumes: docmost_postgres_data, docmost_redis_data, docmost_storage · mounts docmost:/app/data/storage=0(named-declared); docmost-postgres:/var/lib/postgresql=1589(named-declared); docmost-redis:/data=3(named-declared) |
| emby | CLEAN | 8096 | GET exercise (or start) | - | declared volumes: emby_config · mounts emby:/media=3(bind); emby:/config=46(named-declared) |
| ghost | CLEAN | 2368 | GET exercise (or start) | - | declared volumes: ghost_content · mounts ghost:/var/lib/ghost/content=7(named-declared) |
| gitea | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: gitea_data · mounts gitea:/data=8(named-declared) |
| glance | CLEAN | 8080 | GET exercise (or start) | - | declared volumes: glance_config · mounts glance:/app/config=1(named-declared) |
| gokapi | CLEAN | 53842 | GET exercise (or start) | - | declared volumes: gokapi_config, gokapi_data · mounts gokapi:/app/data=4(named-declared); gokapi:/app/config=1(named-declared) |
| grafana | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: grafana_data · mounts grafana:/var/lib/grafana=939(named-declared) |
| gramps-web | UNDETERMINED | 5000 | fixture seed OK — `fixture GrampsWeb: seed OK — gramps-web: seeded user drill1c00babf` | gramps-web: declared volume /app/secret is EMPTY after the exercise — the app was not shown to write where the template preserves it; gramps-web: declared volume /app/indexdir is EMPTY after the exercise — the app was no | declared volumes: gramps_cache, gramps_db, gramps_index, gramps_media, gramps_secret, gramps_thumb_cache, gramps_tmp, gramps_users · mounts gramps-web:/app/cache=1(named-declared); gramps-web:/app/secret=0(named-declared); gramps-web:/tmp=0(named-declared); gramps-web:/app/users=1(named-declared); gramps-web:/root/.gramps/grampsdb=2(named-declared); gramps-web:/app/indexdir=0(named-declared); gramps-web:/app/media=0(named-declared); gra |
| grimmory | CLEAN | 6060 | GET exercise (or start) | grimmory: this container's mounts are all empty while it created entries in ['/', '/app', '/etc'] — benign when a sibling container holds the state, worth a look when none does | declared volumes: grimmory_db · mounts grimmory:/app/data=0(bind); grimmory:/books=0(bind); grimmory:/bookdrop=0(bind); grimmory-db:/var/lib/mysql=355(named-declared) |
| home-assistant | CLEAN | 8123 | GET exercise (or start) | - | declared volumes: homeassistant_config · mounts home-assistant:/config=22(named-declared) |
| homebox | CLEAN | 7745 | GET exercise (or start) | - | declared volumes: homebox_data · mounts homebox:/data=3(named-declared) |
| homepage | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: homepage_config · mounts homepage:/var/run/docker.sock=-1(bind); homepage:/app/config=3(named-declared) |
| immich | UNDETERMINED | 2283 | fixture seed OK — `fixture Immich: seed OK — immich: seeded album drillalbuma6820f47` | immich-machine-learning: declared volume /cache is EMPTY after the exercise — the app was not shown to write where the template preserves it; immich-machine-learning: this container's mounts are all empty while it create | declared volumes: immich_ml_cache, immich_postgres_data, immich_redis_data · mounts immich-machine-learning:/cache=0(named-declared); immich-postgres:/var/lib/postgresql/data=1879(named-declared); immich-redis:/data=3(named-declared); immich-server:/usr/src/app/upload=6(bind); immich-server:/external/photos=0(bind); immich-server:/data=0(anonymous) |
| jellyfin | CLEAN | 8096 | GET exercise (or start) | - | declared volumes: jellyfin_cache, jellyfin_config · mounts jellyfin:/media=3(bind); jellyfin:/config=20(named-declared); jellyfin:/cache=2(named-declared) |
| karakeep | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: karakeep_data, karakeep_meili · mounts karakeep:/data=2(named-declared); karakeep-meilisearch:/meili_data=5(named-declared) |
| kimai | CLEAN | 8001 | GET exercise (or start) | - | declared volumes: kimai_db_data, kimai_var · mounts kimai:/opt/kimai/var=2038(named-declared); kimai-db:/var/lib/mysql=279(named-declared) |
| komga | CLEAN | 25600 | GET exercise (or start) | - | declared volumes: komga_config · mounts komga:/data=0(bind); komga:/config=11(named-declared) |
| mealie | CLEAN | 9000 | GET exercise (or start) | - | declared volumes: mealie_data · mounts mealie:/app/data=5(named-declared) |
| metube | CLEAN | 8081 | fixture seed OK — `fixture MeTube: seed OK — metube: the download finished (991017 bytes)` | - | declared volumes: metube_state · mounts metube:/downloads=1(bind); metube:/state=2(named-declared) |
| n8n | CLEAN | 5678 | GET exercise (or start) | - | declared volumes: n8n_data · mounts n8n:/home/node/.n8n=7(named-declared) |
| navidrome | CLEAN | 4533 | GET exercise (or start) | - | declared volumes: navidrome_data · mounts navidrome:/music=0(bind); navidrome:/data=6(named-declared) |
| nextcloud | CLEAN | 80 | GET exercise (or start) | - | declared volumes: nextcloud_db_data, nextcloud_html, nextcloud_redis_data · mounts nextcloud:/var/www/html=4001(named-declared); nextcloud:/var/www/html/data=69(bind); nextcloud-db:/var/lib/mysql=471(named-declared); nextcloud-redis:/data=3(named-declared) |
| onlyoffice | CLEAN | 80 | GET exercise (or start) | onlyoffice: writable-layer writes at /var/www/onlyoffice/documentserver/sdkjs-plugins/{07FD8DFA-DFE0-4089-AL24-0730933CC80A}/resources/store (path suggests state, no database signature — judgement needed): ['icons', 'scr | declared volumes: onlyoffice_data, onlyoffice_logs · mounts onlyoffice:/var/log/onlyoffice=11(named-declared); onlyoffice:/usr/share/fonts/truetype/custom=0(anonymous); onlyoffice:/var/lib/onlyoffice=0(anonymous); onlyoffice:/var/www/onlyoffice/Data=3(named-declared) |
| opengist | CLEAN | 6157 | GET exercise (or start) | - | declared volumes: opengist_data · mounts opengist:/opengist=9(named-declared) |
| outline | UNDETERMINED | 3000 | fixture seed OK — `fixture Outline: seed OK — outline: seeded document drilldoc-ed522bc2` | outline: declared volume /var/lib/outline/data is EMPTY after the exercise — the app was not shown to write where the template preserves it; outline-redis: declared volume /data is EMPTY after the exercise — the app was | declared volumes: outline_data, outline_postgres_data, outline_redis_data · mounts outline:/var/lib/outline/data=0(named-declared); outline-postgres:/var/lib/postgresql=1669(named-declared); outline-redis:/data=0(named-declared) |
| paperless-ngx | CLEAN | 8000 | GET exercise (or start) | - | declared volumes: paperless_data, paperless_postgres_data, paperless_redis_data · mounts paperless-postgres:/var/lib/postgresql=1931(named-declared); paperless-redis:/data=3(named-declared); paperless-webserver:/usr/src/paperless/media=1(bind); paperless-webserver:/usr/src/paperless/consume=0(bind); paperless-webserver:/usr/src/paperless/export=0(bind); paperless-webserver:/usr/src/pape |
| papra | UNDETERMINED | 1221 | nothing answered HTTP | papra: not running (status=restarting exit=137 restarts=None) | not running: papra=restarting · declared volumes: papra_data · fixture: none called (app has no fixture, or step not reached) · mounts papra:/app/app-data=0(named-declared) |
| plant-it | UNDETERMINED | none | start only (no routed port, no HTTP exercise) | no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for msdelui | probe error: no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denie · declared volumes: NONE · fixture: none called (app has no fixture, or step not reached) · mounts |
| plex | UNDETERMINED | 32400 | fixture seed FAILED — `fixture NoRoute: seed returned nothing (tried: the first-run claim needs a token minted at plex.tv by a real Plex account; no account exists` | plex: declared volume /transcode is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: plex_config, plex_transcode · mounts plex:/media=4(bind); plex:/transcode=0(named-declared); plex:/config=82(named-declared) |
| privatebin | CLEAN | 8080 | fixture seed OK — `fixture PrivateBin: seed OK — privatebin: seeded paste id=260cce3d99910079` | - | declared volumes: privatebin_data · mounts privatebin:/srv/data=5(named-declared); privatebin:/run=14(anonymous); privatebin:/tmp=0(anonymous); privatebin:/var/lib/nginx/tmp=0(anonymous) |
| radarr | CLEAN | 7878 | GET exercise (or start) | radarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['movies'] | declared volumes: radarr_config · mounts radarr:/media/movies=0(bind); radarr:/downloads=0(bind); radarr:/config=9(named-declared) |
| radicale | CLEAN | 5232 | GET exercise (or start) | - | declared volumes: radicale_data · mounts radicale:/var/lib/radicale=1(named-declared) |
| rallly | CLEAN | 3000 | GET exercise (or start) | - | declared volumes: rallly_postgres_data · mounts rallly-postgres:/var/lib/postgresql=1607(named-declared) |
| recipe-importer | UNDETERMINED | 8000 | deep pass | NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are empty, yet entries were created in ['/']. Needs adjudication.; recipe-importer: declared volume /data is EMPTY | declared volumes: recipe_data · fixture: none called (app has no fixture, or step not reached) · mounts recipe-importer:/data=0(named-declared) |
| romm | CLEAN | 8080 | GET exercise (or start) | - | declared volumes: romm_config, romm_db_data, romm_redis_data · mounts romm:/romm/config=1(named-declared); romm:/redis-data=0(anonymous); romm:/romm=0(anonymous); romm:/romm/library=0(bind); romm:/romm/resources=0(bind); romm-db:/var/lib/mysql=302(named-declared); romm-redis:/data=4(named-declared) |
| seerr | CLEAN | 5055 | GET exercise (or start) | - | declared volumes: seerr_config · mounts seerr:/app/config=11(named-declared) |
| sonarr | CLEAN | 8989 | GET exercise (or start) | sonarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['tv'] | declared volumes: sonarr_config · mounts sonarr:/media/tv=0(bind); sonarr:/downloads=0(bind); sonarr:/config=11(named-declared) |
| sparkyfitness | UNDETERMINED | 80 | fixture seed OK — `fixture Sparkyfitness: seed OK — sparkyfitness: seeded user drill4cb3a4 with a weight of 64.59 on 2026-09-01` | sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise — the app was not shown to write where the template preserves it; sparkyfitness-server: declared volume /app/SparkyFitness | declared volumes: sparkyfitness_backup, sparkyfitness_db_data, sparkyfitness_uploads · mounts sparkyfitness-db:/var/lib/postgresql=1822(named-declared); sparkyfitness-server:/app/SparkyFitnessServer/backup=0(named-declared); sparkyfitness-server:/app/SparkyFitnessServer/uploads=0(named-declared) |
| tandoor | UNDETERMINED | 80 | fixture seed OK — `fixture Django: seed OK — tandoor: seeded superuser drill425a04` | tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: tandoor_media, tandoor_postgres_data, tandoor_static · mounts tandoor:/opt/recipes/staticfiles=3359(named-declared); tandoor:/opt/recipes/mediafiles=0(named-declared); tandoor-postgres:/var/lib/postgresql/data=2003(named-declared) |
| termix | CLEAN | 8080 | GET exercise (or start) | - | declared volumes: termix_data · mounts termix:/app/data=5(named-declared) |
| uptime-kuma | CLEAN | 3001 | GET exercise (or start) | - | declared volumes: uptime_kuma_data · mounts uptime-kuma:/app/data=4(named-declared) |
| vaultwarden | CLEAN | 80 | GET exercise (or start) | - | declared volumes: vaultwarden_data · mounts vaultwarden:/data=4(named-declared) |
| vikunja | UNDETERMINED | 3456 | fixture seed OK — `fixture Vikunja: seed OK — vikunja: create project http=201` | vikunja: declared volume /app/vikunja/files is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: vikunja_data, vikunja_db · mounts vikunja:/db=3(named-declared); vikunja:/app/vikunja/files=0(named-declared) |
| wanderer | UNDETERMINED | 3000,8090 | GET exercise (or start) | wanderer: unhealthy; wanderer: declared volume /app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; wanderer-db: declared volume /data/plugins is EMPTY after the exer | declared volumes: wanderer_data, wanderer_meili_data, wanderer_plugins, wanderer_uploads · fixture: none called (app has no fixture, or step not reached) · mounts wanderer:/app/uploads=0(named-declared); wanderer-db:/data/plugins=0(named-declared); wanderer-db:/pb_data=6(named-declared); wanderer-search:/meili_data=11(named-declared) |
| wger | UNDETERMINED | 8000 | fixture seed OK — `fixture Wger: seed OK — wger: POST /api/v2/weightentry/ http=201` | wger: declared volume /home/wger/media is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: wger_data, wger_media · mounts wger:/home/wger/db=2(named-declared); wger:/home/wger/media=0(named-declared) |
| wishlist | UNDETERMINED | 3000 | fixture seed OK — `fixture Wishlist: seed OK — wishlist: /signup http=200 type=success` | wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it | declared volumes: wishlist_data, wishlist_uploads · mounts wishlist:/usr/src/app/uploads=0(named-declared); wishlist:/usr/src/app/data=3(named-declared) |
| zipline | UNDETERMINED | 3000 | fixture seed OK — `fixture Zipline: seed OK — zipline: /api/setup http=200 :: {"firstSetup":false,"user":{"id":"ay6n2g4wkn7i2kkg6dvag03n","username":"drill` | zipline: declared volume /zipline/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; zipline: declared volume /zipline/public is EMPTY after the exercise — the app was n | declared volumes: zipline_postgres_data, zipline_public, zipline_uploads · mounts zipline:/zipline/uploads=0(named-declared); zipline:/zipline/public=0(named-declared); zipline-postgres:/var/lib/postgresql/data=1435(named-declared) |
## BROKEN — reasons verbatim (0)
none
## UNDETERMINED — reasons verbatim (19)
### bentopdf (batch-01.txt)
```
nothing was written to any mount and nothing data-classified in any writable layer — the app produced no data to locate. Health is not data: this is UNDETERMINED, not CLEAN
```
### claper (batch-02.txt)
```
claper: declared volume /app/priv/static/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
claper: this container's mounts are all empty while it created entries in ['/app/priv', '/app/priv/static'] — benign when a sibling container holds the state, worth a look when none does
```
### crafty-controller (batch-02.txt)
```
crafty-controller: declared volume /crafty/servers is EMPTY after the exercise — the app was not shown to write where the template preserves it
crafty-controller: declared volume /crafty/import is EMPTY after the exercise — the app was not shown to write where the template preserves it
crafty-controller: declared volume /crafty/backups is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### dawarich (batch-02.txt)
```
dawarich-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### docmost (batch-02.txt)
```
docmost: declared volume /app/data/storage is EMPTY after the exercise — the app was not shown to write where the template preserves it
docmost: this container's mounts are all empty while it created entries in ['/app/apps/client/dist'] — benign when a sibling container holds the state, worth a look when none does
```
### gramps-web (batch-03.txt)
```
gramps-web: declared volume /app/secret is EMPTY after the exercise — the app was not shown to write where the template preserves it
gramps-web: declared volume /app/indexdir is EMPTY after the exercise — the app was not shown to write where the template preserves it
gramps-web: declared volume /app/media is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### immich (batch-04.txt)
```
immich-machine-learning: declared volume /cache is EMPTY after the exercise — the app was not shown to write where the template preserves it
immich-machine-learning: this container's mounts are all empty while it created entries in ['/'] — benign when a sibling container holds the state, worth a look when none does
```
### outline (batch-06.txt)
```
outline: declared volume /var/lib/outline/data is EMPTY after the exercise — the app was not shown to write where the template preserves it
outline-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### papra (batch-09-papra-rerun.txt)
```
papra: not running (status=restarting exit=137 restarts=None)
```
### plant-it (batch-06.txt)
```
no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for msdeluise/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
)
probe error: no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for msdeluise/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
)
```
### plex (batch-06.txt)
```
plex: declared volume /transcode is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### recipe-importer (batch-07.txt)
```
NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are empty, yet entries were created in ['/']. Needs adjudication.
recipe-importer: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it
recipe-importer: this container's mounts are all empty while it created entries in ['/'] — benign when a sibling container holds the state, worth a look when none does
```
### sparkyfitness (batch-07.txt)
```
sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise — the app was not shown to write where the template preserves it
sparkyfitness-server: declared volume /app/SparkyFitnessServer/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
sparkyfitness-server: this container's mounts are all empty while it created entries in ['/app/SparkyFitnessServer'] — benign when a sibling container holds the state, worth a look when none does
```
### tandoor (batch-08.txt)
```
tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### vikunja (batch-08.txt)
```
vikunja: declared volume /app/vikunja/files is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### wanderer (batch-08.txt)
```
wanderer: unhealthy
wanderer: declared volume /app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
wanderer-db: declared volume /data/plugins is EMPTY after the exercise — the app was not shown to write where the template preserves it
wanderer: this container's mounts are all empty while it created entries in ['/root'] — benign when a sibling container holds the state, worth a look when none does
wanderer-db: writable-layer writes at /data (path suggests state, no database signature — judgement needed): ['plugins']
```
### wger (batch-08.txt)
```
wger: declared volume /home/wger/media is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### wishlist (batch-08.txt)
```
wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
```
### zipline (batch-08.txt)
```
zipline: declared volume /zipline/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
zipline: declared volume /zipline/public is EMPTY after the exercise — the app was not shown to write where the template preserves it
zipline: this container's mounts are all empty while it created entries in ['/zipline'] — benign when a sibling container holds the state, worth a look when none does
```
@@ -0,0 +1,38 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-01 actualbudget adventurelog audiobookshelf bentopdf bookstack calcom calibre-web
# batch 01 started 2026-10-02T11:47:49Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
actualbudget CLEAN
adventurelog CLEAN
audiobookshelf CLEAN
bentopdf UNDETERMINED nothing was written to any mount and nothing data-classified in any writable layer — the app produced no data to locate. Health is not data: this is U
bookstack CLEAN
calcom CLEAN
calibre-web CLEAN calibre-web: /app/calibre-web-automated/empty_library — database file(s) touched but byte-identical to the image; a chown sweep, not a write; calibre-
UNDETERMINED — NOT a pass. The question was not answered for these:
bentopdf: nothing was written to any mount and nothing data-classified in any writable layer — the app produced no data to locate. Health is not data: this is UNDETERMINED, not CLEAN
6 clean · 0 broken · 1 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 1 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 01 finished 2026-10-02T12:06:35Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi actualbudget/actual-server:26.9.0: Deleted: sha256:1d69a5fd31932841d7825ef4780c06f008eea65aaa9f3110fe09d5832ed5c7d8
rmi calcom/cal.com:v6.2.0: Deleted: sha256:ac0b59386af04eb1adb3ecce007f7bfa052e5c2da2b2ab4d683a2e73ef866825
rmi crocodilestick/calibre-web-automated:v4.0.8: Deleted: sha256:570560e87f1fd49773f66d9023984d132b3fa6a084c9860f5e9a16cf48a77b02
rmi ghcr.io/advplyr/audiobookshelf:2.37.1: Deleted: sha256:d1b11da75466b874d025016f2bfa1d9fd5bf0d496fcd29c3a883d71ae3813305
rmi ghcr.io/alam00000/bentopdf:v2.8.6: Deleted: sha256:29df493baa13de438d6d2ece3a8333032e0b7b9b9d8cce4ee82194da255f61e1
rmi ghcr.io/seanmorley15/adventurelog-backend:v0.13.0: Deleted: sha256:6f94328331290cbd81edab450664d42da7b64c191416c9346cd5d28c84f76035
rmi ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0: Deleted: sha256:dd1bd006b01b2376c14e6d53a087269594004c64f8e841c350ec83af959359a0
rmi lscr.io/linuxserver/bookstack:26.09.1: Deleted: sha256:2a166eefd3a01440135c036b5a9949974c0632d72ed8da69b97931ed975d7943
rmi mariadb:12.3: Deleted: sha256:d81fb2a7c6ee3be05fdefaa7fd223be219c1ab172083ec1b994c3ecda33ac0a8
rmi postgis/postgis:16-3.5-alpine: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi postgres:18-alpine: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.3G 185G 1% /
@@ -0,0 +1,42 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-02 claper code-server crafty-controller dawarich docmost emby ghost
# batch 02 started 2026-10-02T12:06:51Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
claper UNDETERMINED claper: declared volume /app/priv/static/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; claper:
code-server CLEAN
crafty-controller UNDETERMINED crafty-controller: declared volume /crafty/servers is EMPTY after the exercise — the app was not shown to write where the template preserves it; craft
dawarich UNDETERMINED dawarich-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it
docmost UNDETERMINED docmost: declared volume /app/data/storage is EMPTY after the exercise — the app was not shown to write where the template preserves it; docmost: this
emby CLEAN
ghost CLEAN
UNDETERMINED — NOT a pass. The question was not answered for these:
claper: claper: declared volume /app/priv/static/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; claper: this container's mounts are all empty while it cr
crafty-controller: crafty-controller: declared volume /crafty/servers is EMPTY after the exercise — the app was not shown to write where the template preserves it; crafty-controller: declared volume /crafty/import is EM
dawarich: dawarich-redis: declared volume /data is EMPTY after the exercise — the app was not shown to write where the template preserves it
docmost: docmost: declared volume /app/data/storage is EMPTY after the exercise — the app was not shown to write where the template preserves it; docmost: this container's mounts are all empty while it created
3 clean · 0 broken · 4 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 4 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 02 finished 2026-10-02T12:27:29Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi docmost/docmost:0.96.0: Deleted: sha256:411a86676185cb54d695a805b238194a64e9b77e0c723f3802fbb87d333ea0b3
rmi emby/embyserver:4.11.0.4: Deleted: sha256:0f8918d0fe4f272ce8acece89916a9ba0b240584d3c1dd1943f343f69b0d0ffb
rmi freikin/dawarich:1.15.3: Deleted: sha256:3edb2192497af6e965b9b7e57dc6dbdce1f3ea721d14a98110419d4ded523298
rmi ghcr.io/claperco/claper:2.5: Deleted: sha256:538812a4b9bd45adaac2b5e5b967daa6999aa44eb110aa32ae7c69702b906475
rmi ghost:6.67.0-alpine: Deleted: sha256:e63b02c2b5c761df2cb95e657d744f27d95da4e051235a13c80b88cd68eab188
rmi lscr.io/linuxserver/code-server:4.129.0: Deleted: sha256:c3cbb340bc39ecbf4b83ee7f6a316ec0fac5da776f4c1929f5fd432d575ff9c7
rmi postgis/postgis:17-3.5-alpine: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi postgres:17-alpine: Deleted: sha256:e1620fab5a27ab00df25b18312374e46098fd95842107fa7e3c7f52547b4f121
rmi postgres:18-alpine: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
rmi redis:7-alpine: Untagged: redis:7-alpine
rmi redis:7.4-alpine: Deleted: sha256:1073f425247ed24670458429c13a67afbd36f83d2004dade046ddbd6519b1839
rmi registry.gitlab.com/crafty-controller/crafty-4:4.11.0: Deleted: sha256:65e5d715ea720349e6475f91651a0956279fc295a45fd73aa04f1cec046281a1
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.3G 185G 1% /
@@ -0,0 +1,35 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-03 gitea glance gokapi grafana gramps-web grimmory home-assistant
# batch 03 started 2026-10-02T12:27:43Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
gitea CLEAN
glance CLEAN
gokapi CLEAN
grafana CLEAN
gramps-web UNDETERMINED gramps-web: declared volume /app/secret is EMPTY after the exercise — the app was not shown to write where the template preserves it; gramps-web: decl
grimmory CLEAN grimmory: this container's mounts are all empty while it created entries in ['/', '/app', '/etc'] — benign when a sibling container holds the state, w
home-assistant CLEAN
UNDETERMINED — NOT a pass. The question was not answered for these:
gramps-web: gramps-web: declared volume /app/secret is EMPTY after the exercise — the app was not shown to write where the template preserves it; gramps-web: declared volume /app/indexdir is EMPTY after the exerc
6 clean · 0 broken · 1 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 1 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 03 finished 2026-10-02T12:46:32Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi f0rc3/gokapi:v1.9.6: Deleted: sha256:ba79b2c0127890636a791eb3ec3993cce08a50cc01fcb1513f0e8fbae41977af
rmi ghcr.io/gramps-project/grampsweb:v25.6.0: Deleted: sha256:2f7436e79a0bc6cdec6536da54ae6a5863c8e3b5f145e0f8ac0b96306baddbc9
rmi ghcr.io/grimmory-tools/grimmory:v3.5.0: Deleted: sha256:215c7bd754081cf750e00fb94bb99fc5dac69903300f6ec07b86c9f265b3b915
rmi ghcr.io/home-assistant/home-assistant:2026.9.4: Deleted: sha256:77e69aa15022f2dab499f24031ca2a8c68aa8891d848518ef4817058878a1d42
rmi gitea/gitea:1.27.3: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi glanceapp/glance:v0.8.5: Deleted: sha256:0854555d70acaa318b38ee50bc667cb51ff6bf0757624624c7ff3b6fe17459a0
rmi grafana/grafana:13.2.3: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
rmi mariadb:11.4: Deleted: sha256:d81fb2a7c6ee3be05fdefaa7fd223be219c1ab172083ec1b994c3ecda33ac0a8
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.3G 185G 1% /
@@ -0,0 +1,40 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-04 homebox homepage immich jellyfin karakeep kimai komga
# batch 04 started 2026-10-02T12:46:42Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
homebox CLEAN
homepage CLEAN
immich UNDETERMINED immich-machine-learning: declared volume /cache is EMPTY after the exercise — the app was not shown to write where the template preserves it; immich-m
jellyfin CLEAN
karakeep CLEAN
kimai CLEAN
komga CLEAN
UNDETERMINED — NOT a pass. The question was not answered for these:
immich: immich-machine-learning: declared volume /cache is EMPTY after the exercise — the app was not shown to write where the template preserves it; immich-machine-learning: this container's mounts are all e
6 clean · 0 broken · 1 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 1 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 04 finished 2026-10-02T13:02:31Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi getmeili/meilisearch:v1.41.0: Deleted: sha256:cce92674e98722970ab3fdce76a2566f54db535beeb24f0b4397f070ab5f6987
rmi ghcr.io/gethomepage/homepage:v1.13.2: Deleted: sha256:29df493baa13de438d6d2ece3a8333032e0b7b9b9d8cce4ee82194da255f61e1
rmi ghcr.io/immich-app/immich-machine-learning:v3.2.4: Deleted: sha256:8db1b4d0e54f2fbc2baf1563e57d88a8e72d3c79a72a38b9e4dee36e84f1d8ce
rmi ghcr.io/immich-app/immich-server:v3.2.4: Deleted: sha256:411a86676185cb54d695a805b238194a64e9b77e0c723f3802fbb87d333ea0b3
rmi ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0: Deleted: sha256:eb5f13bce9936c760b9fa73aeb1b608787daa36106cc888104132e353ed37252
rmi ghcr.io/karakeep-app/karakeep-chrome:151.0.7922.47-r1: Deleted: sha256:f2ec4de84f559f5c7be4233b589cdbdbb5507807e05621b77320edd55a1f2a0f
rmi ghcr.io/karakeep-app/karakeep:0.33.2: Deleted: sha256:81f823b9617547261c907396f63f770deaa554748ff739bedfa650e3bb74595a
rmi ghcr.io/sysadminsmedia/homebox:0.26.2: Deleted: sha256:bc5a3fe779ad9e705b6c5d7fb7a482d1bf8b633e4e3e72152ea3f8953460cda9
rmi gotson/komga:1.28.0: Deleted: sha256:485d137fd3bfb545f1b417ea708e2281594be7a334e8a85ab75c5332db6089e9
rmi jellyfin/jellyfin:10.11.11: Deleted: sha256:219a998c60509502b47b97f1158067d5dd62640d2d689560d32cfd5594f6bc40
rmi kimai/kimai2:2.67.0: Deleted: sha256:1d69a5fd31932841d7825ef4780c06f008eea65aaa9f3110fe09d5832ed5c7d8
rmi mariadb:11.8: Deleted: sha256:d81fb2a7c6ee3be05fdefaa7fd223be219c1ab172083ec1b994c3ecda33ac0a8
rmi redis:7-alpine: Deleted: sha256:1073f425247ed24670458429c13a67afbd36f83d2004dade046ddbd6519b1839
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.3G 185G 1% /
@@ -0,0 +1,33 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-05 mealie metube n8n navidrome nextcloud onlyoffice opengist
# batch 05 started 2026-10-02T13:02:39Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
mealie CLEAN
metube CLEAN
n8n CLEAN
navidrome CLEAN
nextcloud CLEAN
onlyoffice CLEAN onlyoffice: writable-layer writes at /var/www/onlyoffice/documentserver/sdkjs-plugins/{07FD8DFA-DFE0-4089-AL24-0730933CC80A}/resources/store (path sug
opengist CLEAN
7 clean · 0 broken · 0 undetermined (of 7 in scope)
volume-persistence gate OK
check-volume-persistence exit code = 0
# batch 05 finished 2026-10-02T13:19:32Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi deluan/navidrome:0.64.2: Deleted: sha256:f0dd00851e339a40ac77d88b5174441169a5052dd18fa399fc174dd710662990
rmi ghcr.io/alexta69/metube:2026.09.29: Deleted: sha256:7eb8357547f12f331ee069361f87420db6b522e3c35e94830c50eb0c133d8d5e
rmi ghcr.io/mealie-recipes/mealie:v3.28.0: Deleted: sha256:acc27b89f4a07b2a31f349e11d761c366d19e64b7b8e08498e47a537880da6a3
rmi ghcr.io/thomiceli/opengist:1.15: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi mariadb:12.3: Deleted: sha256:d81fb2a7c6ee3be05fdefaa7fd223be219c1ab172083ec1b994c3ecda33ac0a8
rmi n8nio/n8n:2.42.1: Deleted: sha256:87e8744ef8d6da508455c6acc8b02a0f64c95d91e833e26652d9d81f6f75d521
rmi nextcloud:34.0.4-apache: Deleted: sha256:a6dc765193a52cbaede3c93a9ff48b9540948dd0774bbe7031fcb5847606f9ac
rmi onlyoffice/documentserver:9.4.0: Deleted: sha256:538812a4b9bd45adaac2b5e5b967daa6999aa44eb110aa32ae7c69702b906475
rmi redis:7-alpine: Deleted: sha256:1073f425247ed24670458429c13a67afbd36f83d2004dade046ddbd6519b1839
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.4G 185G 1% /
@@ -0,0 +1,39 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-06 outline paperless-ngx papra plant-it plex privatebin radarr
# batch 06 started 2026-10-02T13:19:43Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
outline UNDETERMINED outline: declared volume /var/lib/outline/data is EMPTY after the exercise — the app was not shown to write where the template preserves it; outline-r
paperless-ngx CLEAN
papra UNDETERMINED papra: not running (status=restarting exit=137 restarts=None)
plant-it UNDETERMINED no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resourc
plex UNDETERMINED plex: declared volume /transcode is EMPTY after the exercise — the app was not shown to write where the template preserves it
privatebin CLEAN
radarr CLEAN radarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['movies']
UNDETERMINED — NOT a pass. The question was not answered for these:
outline: outline: declared volume /var/lib/outline/data is EMPTY after the exercise — the app was not shown to write where the template preserves it; outline-redis: declared volume /data is EMPTY after the exe
papra: papra: not running (status=restarting exit=137 restarts=None)
plant-it: no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull acces
plex: plex: declared volume /transcode is EMPTY after the exercise — the app was not shown to write where the template preserves it
3 clean · 0 broken · 4 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 4 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 06 finished 2026-10-02T13:38:47Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi ghcr.io/paperless-ngx/paperless-ngx:2.20.15: Deleted: sha256:70a290c5e58b68f39496ab93a62f21b8b2ca0502e97905131838de1b39a37cbb
rmi ghcr.io/papra-hq/papra:26.6.2-rootless: Deleted: sha256:3edb2192497af6e965b9b7e57dc6dbdce1f3ea721d14a98110419d4ded523298
rmi lscr.io/linuxserver/radarr:6.4.4: Deleted: sha256:2a166eefd3a01440135c036b5a9949974c0632d72ed8da69b97931ed975d7943
rmi outlinewiki/outline:1.10.1: Deleted: sha256:f4f8b983b714f130e2cff99176baa26352db6a55d3622e10ada40f2b4720a4eb
rmi plexinc/pms-docker:1.41.4.9463-630c9f557: Deleted: sha256:fffe76c64ef2dee2d80a8bb3ad13d65d596d04a45510b1956a976a69215dae92
rmi postgres:18-alpine: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
rmi privatebin/pdo:2.0.6: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi redis:7-alpine: Deleted: sha256:1073f425247ed24670458429c13a67afbd36f83d2004dade046ddbd6519b1839
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.4G 185G 1% /
@@ -0,0 +1,39 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-07 radicale rallly recipe-importer romm seerr sonarr sparkyfitness
# batch 07 started 2026-10-02T13:38:54Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
radicale CLEAN
rallly CLEAN
recipe-importer UNDETERMINED NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are empty, yet entries were created in ['/'].
romm CLEAN
seerr CLEAN
sonarr CLEAN sonarr: writable-layer writes at /media (path suggests state, no database signature — judgement needed): ['tv']
sparkyfitness UNDETERMINED sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise — the app was not shown to write where the template
UNDETERMINED — NOT a pass. The question was not answered for these:
recipe-importer: NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are empty, yet entries were created in ['/']. Needs adjudication.; recipe-importer: declared vo
sparkyfitness: sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise — the app was not shown to write where the template preserves it; sparkyfitness-server: declared volum
5 clean · 0 broken · 2 undetermined (of 7 in scope)
INCOMPLETE — no broken template among those decided, but 2 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 07 finished 2026-10-02T13:55:18Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi codewithcj/sparkyfitness:v0.17.3: Deleted: sha256:256f393e029fa2063d8c93720da36a74a032bed3355a2bc3e313ad12f8bde9d1
rmi codewithcj/sparkyfitness_server:v0.17.3: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi fallenbagel/jellyseerr:2.7.3: Deleted: sha256:418dccb7d85a63a6aa574439840f7a6fa6fd2321b3e2394568a317735e867d35
rmi ghcr.io/kozea/radicale:3.8.1: Deleted: sha256:068f42d7c61f0f0e344fa35ad66e109e3d089007afcc39110f9f361a75eaca24
rmi gitea.dooplex.hu/admin/recipe-importer:v0.9.11: Deleted: sha256:a257f20c716c7b5d0474b1b5998f4d1090b573d90b82f764b8f1f1faeb4b524f
rmi lscr.io/linuxserver/sonarr:4.0.20: Deleted: sha256:2a166eefd3a01440135c036b5a9949974c0632d72ed8da69b97931ed975d7943
rmi lukevella/rallly:4.15.3: Deleted: sha256:34467cc93912af891dfee8a3902adf9b4f355a9bca4eaa46f658d1181a21de0d
rmi mariadb:11.8: Deleted: sha256:d81fb2a7c6ee3be05fdefaa7fd223be219c1ab172083ec1b994c3ecda33ac0a8
rmi postgres:18-alpine: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
rmi redis:7-alpine: Deleted: sha256:1073f425247ed24670458429c13a67afbd36f83d2004dade046ddbd6519b1839
rmi rommapp/romm:5.3.1: Deleted: sha256:575af51c6d53817070d5b9e4f03a5ea98bb687c097741ea228fc8db065db558b
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.4G 185G 1% /
@@ -0,0 +1,47 @@
# check-volume-persistence.py --all --evidence /root/sweep/ev-08 tandoor termix uptime-kuma vaultwarden vikunja wanderer wger wishlist zipline
# batch 08 started 2026-10-02T13:55:25Z on bench LXC 9401 @ demo-hp (debian-13 amd64, swap 0, nvme-scratch 200G), docker hub logged in
# catalog-wt febf58c + uncommitted:
# M scripts/check-volume-persistence.py
# M scripts/test_check_volume_persistence.py
# check-volume-persistence.py sha256 ecc6a6945f8bcdf4
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
tandoor UNDETERMINED tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise — the app was not shown to write where the template preserves it
termix CLEAN
uptime-kuma CLEAN
vaultwarden CLEAN
vikunja UNDETERMINED vikunja: declared volume /app/vikunja/files is EMPTY after the exercise — the app was not shown to write where the template preserves it
wanderer UNDETERMINED wanderer: unhealthy; wanderer: declared volume /app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves
wger UNDETERMINED wger: declared volume /home/wger/media is EMPTY after the exercise — the app was not shown to write where the template preserves it
wishlist UNDETERMINED wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
zipline UNDETERMINED zipline: declared volume /zipline/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; zipline: decla
UNDETERMINED — NOT a pass. The question was not answered for these:
tandoor: tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise — the app was not shown to write where the template preserves it
vikunja: vikunja: declared volume /app/vikunja/files is EMPTY after the exercise — the app was not shown to write where the template preserves it
wanderer: wanderer: unhealthy; wanderer: declared volume /app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; wanderer-db: declared volume /data/plugins is
wger: wger: declared volume /home/wger/media is EMPTY after the exercise — the app was not shown to write where the template preserves it
wishlist: wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it
zipline: zipline: declared volume /zipline/uploads is EMPTY after the exercise — the app was not shown to write where the template preserves it; zipline: declared volume /zipline/public is EMPTY after the exer
3 clean · 0 broken · 6 undetermined (of 9 in scope)
INCOMPLETE — no broken template among those decided, but 6 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
# batch 08 finished 2026-10-02T14:19:38Z
# leftover volgate containers: 0
# --- cleanup (by name; no prune) ---
rmi flomp/wanderer-db:v0.20.0: Deleted: sha256:fea850b45905deb562386275d9f75fafd2087d6ef8bc189fa2cf2ec0cfc4dd71
rmi flomp/wanderer-web:v0.20.0: Deleted: sha256:34884abbe92863fce933ed7c39c0e045631af0ed86d5cc0dfbdf9fdca426ce3c
rmi getmeili/meilisearch:v1.36.0: Deleted: sha256:cce92674e98722970ab3fdce76a2566f54db535beeb24f0b4397f070ab5f6987
rmi ghcr.io/cmintey/wishlist:v0.67.1: Deleted: sha256:1d69a5fd31932841d7825ef4780c06f008eea65aaa9f3110fe09d5832ed5c7d8
rmi ghcr.io/diced/zipline:4.8.0: Deleted: sha256:e63b02c2b5c761df2cb95e657d744f27d95da4e051235a13c80b88cd68eab188
rmi ghcr.io/lukegus/termix:2.8.0: Deleted: sha256:a6dc765193a52cbaede3c93a9ff48b9540948dd0774bbe7031fcb5847606f9ac
rmi ghcr.io/tandoorrecipes/recipes:2.6.15: Deleted: sha256:31ad4a471c6852bfec14d757cc75a566c82a9769f12c3918cf6bf52cc0eeb3d0
rmi louislam/uptime-kuma:2.5.5: Deleted: sha256:b2008ac19409fa6fee4b52596271400498aebd0be04dffac5351bd1dcf230f2a
rmi postgres:16-alpine: Deleted: sha256:32034eca5c342e5e224fa97bff71b9c8d6edb64d4043660558dfed1b247cce29
rmi postgres:17-alpine: Deleted: sha256:74d97c428c51a828f9051a7a40a53ff1fc99e54fc30323ce36760701b0b7f711
rmi vaultwarden/server:1.36.0-alpine: Deleted: sha256:29df493baa13de438d6d2ece3a8333032e0b7b9b9d8cce4ee82194da255f61e1
rmi vikunja/vikunja:2.6.0: Deleted: sha256:3c889b99e3ccd594794c0c3738db5c8150535d0894b764667dfa041bb51c8dfe
rmi wger/server:2.7: Deleted: sha256:b9a65b3c65ab22d490085bd0bf5490e2409da8748b406870f2463bdc41cd6795
# images now: 1; volgate volumes now: 0
/dev/loop2 196G 1.4G 185G 1% /
@@ -0,0 +1,11 @@
# papra re-run alone (exit 137 in batch 06) 2026-10-02T14:20:34Z
self-testing the prober (both directions)…
prober flags the R-156 signature and clears a correct template — trustworthy
papra UNDETERMINED papra: not running (status=restarting exit=137 restarts=None)
UNDETERMINED — NOT a pass. The question was not answered for these:
papra: papra: not running (status=restarting exit=137 restarts=None)
0 clean · 0 broken · 1 undetermined (of 1 in scope)
INCOMPLETE — no broken template among those decided, but 1 were never decided. This is not a clean bill of health.
check-volume-persistence exit code = 2
@@ -0,0 +1,55 @@
+ date -u
Fri Oct 2 11:45:45 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19503216 18863044 48.21%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 77370516 855982572 7.87%
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ pveam list local
+ grep debian-13
local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst 123.93MB
+ pct create 9401 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname volgate-sweep --cores 6 --memory 12288 --swap 0 --rootfs nvme-scratch:200 --net0 name=eth0,bridge=vmbr0,ip=dhcp --unprivileged 1 --features nesting=1,keyctl=1 --onboot 0
+ tail -1
done: SHA256:Z6wLOMGtPMNgxH7pwJ0jpFTf4llG+Hqwh1t1WMq0U2A root@volgate-sweep
+ pct config 9401
arch: amd64
cores: 6
features: nesting=1,keyctl=1
hostname: volgate-sweep
memory: 12288
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:D8:CF:F8,ip=dhcp,type=veth
onboot: 0
ostype: debian
rootfs: nvme-scratch:9401/vm-9401-disk-0.raw,size=200G
swap: 0
unprivileged: 1
+ pct start 9401
+ sleep 15
+ pct exec 9401 -- bash -c 'dpkg --print-architecture; hostname; ip -4 -o addr show eth0 | awk "{print \$4}"; apt-get update -qq >/dev/null 2>&1; DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose python3 python3-yaml curl postgresql-client sqlite3 git >/dev/null 2>&1; docker --version; docker compose version; python3 --version; git --version; docker network create traefik-public >/dev/null && echo traefik-public-net; swapon --show; free -m | head -3; df -h /'
amd64
volgate-sweep
192.168.0.123/24
Docker version 26.1.5+dfsg1, build a72d7cd
Docker Compose version 2.26.1-4
Python 3.13.5
git version 2.47.3
traefik-public-net
total used free shared buff/cache available
Mem: 12288 58 10530 0 1699 12229
Swap: 0 0 0
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 196G 1.3G 185G 1% /
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19503308 18862952 48.21%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 79803936 853549152 8.12%
@@ -0,0 +1,58 @@
{
"probe": {
"app": "actualbudget",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "actualbudget/actual-server:26.9.0",
"mounts": [
{
"class": "named-declared",
"files": 2,
"name": "volgate-actualbudget_actualbudget_data",
"sample": [
".migrate",
"server-files/account.sqlite"
],
"source": "/var/lib/docker/volumes/volgate-actualbudget_actualbudget_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "actualbudget",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"actualbudget_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:5006/ -> 200"
],
"fixture": null,
"ports": [
5006
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,251 @@
{
"probe": {
"app": "adventurelog",
"containers": [
{
"diff_added": 12,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 4,
"db_signature": false,
"dir": "/",
"files": [
"etc",
"code",
"var",
"run"
]
},
{
"added": [
"adventurelog"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc",
"files": [
"adventurelog"
]
},
{
"added": [
"cron.env"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/adventurelog",
"files": [
"cron.env"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"lib"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var/lib",
"files": [
"nginx"
]
}
],
"diff_token_dirs": [],
"diff_total": 18,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/seanmorley15/adventurelog-backend:v0.13.0",
"mounts": [
{
"class": "named-declared",
"files": 251,
"name": "volgate-adventurelog_adventurelog_media",
"sample": [
"countries+regions+states-v3.1.json",
"flags/gh.png",
"flags/me.png",
"flags/cf.png",
"flags/tn.png",
"flags/mm.png",
"flags/ao.png",
"flags/im.png",
"flags/af.png",
"flags/na.png",
"flags/sm.png",
"flags/bg.png",
"flags/gi.png",
"flags/is.png",
"flags/dm.png",
"flags/eg.png",
"flags/tm.png",
"flags/mq.png",
"flags/pw.png",
"flags/ge.png",
"flags/ms.png",
"flags/yt.png",
"flags/cl.png",
"flags/ga.png",
"flags/zm.png",
"flags/az.png",
"flags/gd.png",
"flags/cd.png",
"flags/so.png",
"flags/ie.png",
"flags/ht.png",
"flags/sh.png",
"flags/ee.png",
"flags/al.png",
"flags/ad.png",
"flags/uz.png",
"flags/eh.png",
"flags/bq.png",
"flags/la.png",
"flags/ki.png"
],
"source": "/var/lib/docker/volumes/volgate-adventurelog_adventurelog_media/_data",
"target": "/code/media",
"writable_by_app": "yes"
}
],
"name": "adventurelog",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 65532,
"health": "healthy",
"image": "ghcr.io/seanmorley15/adventurelog-frontend:v0.13.0",
"mounts": [],
"name": "adventurelog-frontend",
"restarts": null,
"status": "running",
"uid": 65532
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgis/postgis:16-3.5-alpine",
"mounts": [
{
"class": "named-declared",
"files": 2313,
"name": "volgate-adventurelog_adventurelog_postgres_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/2612",
"base/5/1418",
"base/5/6117",
"base/5/2655",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm",
"base/5/6106",
"base/5/3433",
"base/5/4150",
"base/5/3606"
],
"source": "/var/lib/docker/volumes/volgate-adventurelog_adventurelog_postgres_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "adventurelog-postgres",
"restarts": null,
"status": "running",
"uid": 70
}
],
"declared_volumes": [
"adventurelog_media",
"adventurelog_postgres_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 200",
"172.21.0.3:3000/ -> 200"
],
"fixture": null,
"ports": [
80,
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,120 @@
{
"probe": {
"app": "audiobookshelf",
"containers": [
{
"diff_added": 4,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"podcasts",
"audiobooks",
"metadata",
"config"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"podcasts",
"audiobooks",
"metadata",
"config"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/advplyr/audiobookshelf:2.37.1",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/audiobooks",
"target": "/audiobooks",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/podcasts",
"target": "/podcasts",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 16,
"name": "volgate-audiobookshelf_audiobookshelf_config",
"sample": [
"absdatabase.sqlite",
"migrations/v2.19.1-copy-title-to-library-items.js",
"migrations/v2.17.3-fk-constraints.js",
"migrations/v2.15.2-index-creation.js",
"migrations/v2.17.5-remove-host-from-feed-urls.js",
"migrations/v2.20.0-improve-author-sort-queries.js",
"migrations/v2.17.7-add-indices.js",
"migrations/v2.15.0-series-column-unique.js",
"migrations/v2.17.0-uuid-replacement.js",
"migrations/v2.17.4-use-subfolder-for-oidc-redirect-uris.js",
"migrations/v2.26.0-create-auth-tables.js",
"migrations/v2.33.0-add-discover-query-indexes.js",
"migrations/v2.15.1-reindex-nocase.js",
"migrations/v2.17.6-share-add-isdownloadable.js",
"migrations/v2.35.0-add-last-refresh-token.js",
"migrations/v2.19.4-improve-podcast-queries.js"
],
"source": "/var/lib/docker/volumes/volgate-audiobookshelf_audiobookshelf_config/_data",
"target": "/config",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-audiobookshelf_audiobookshelf_metadata",
"sample": [
"logs/daily/2026-10-02.txt"
],
"source": "/var/lib/docker/volumes/volgate-audiobookshelf_audiobookshelf_metadata/_data",
"target": "/metadata",
"writable_by_app": "yes"
}
],
"name": "audiobookshelf",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"audiobookshelf_config",
"audiobookshelf_metadata"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 200"
],
"fixture": null,
"ports": [
80
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,88 @@
{
"probe": {
"app": "bentopdf",
"containers": [
{
"diff_added": 6,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"var",
"etc"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc",
"files": [
"nginx"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"cache"
]
}
],
"diff_token_dirs": [],
"diff_total": 14,
"diff_unresolved": [],
"exit": 0,
"gid": 101,
"health": "healthy",
"image": "ghcr.io/alam00000/bentopdf:v2.8.6",
"mounts": [],
"name": "bentopdf",
"restarts": null,
"status": "running",
"uid": 101
}
],
"declared_volumes": [],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8080/ -> 200",
"172.18.0.2:8080/ -> 200",
"172.18.0.2:8080/login -> 404",
"172.18.0.2:8080/setup -> 404",
"172.18.0.2:8080/signup -> 404",
"172.18.0.2:8080/register -> 404",
"172.18.0.2:8080/install -> 404",
"172.18.0.2:8080/admin -> 404",
"172.18.0.2:8080/api/health -> 404",
"172.18.0.2:8080/health -> 404",
"172.18.0.2:8080/healthz -> 404",
"172.18.0.2:8080/status -> 404",
"172.18.0.2:8080/web -> 404",
"172.18.0.2:8080/index.php -> 404",
"172.18.0.2:8080/dashboard -> 404"
],
"fixture": null,
"ports": [
8080
]
},
"reasons": [
"nothing was written to any mount and nothing data-classified in any writable layer \u2014 the app produced no data to locate. Health is not data: this is UNDETERMINED, not CLEAN"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,254 @@
{
"probe": {
"app": "bookstack",
"containers": [
{
"diff_added": 248,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 6,
"db_signature": false,
"dir": "/",
"files": [
"defaults",
"etc",
"usr",
"app",
"var",
"run"
]
},
{
"added": [],
"changed_count": 5,
"db_signature": false,
"dir": "/etc",
"files": [
"crontabs",
"passwd-",
"logrotate.d",
"group-",
"s6-overlay"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/crontabs",
"files": [
"root"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay",
"files": [
"s6-rc.d"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d",
"files": [
"init-adduser"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d/init-adduser",
"files": [
"branding"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"lib"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/var",
"files": [
"lib",
"log"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var/lib",
"files": [
"nginx"
]
}
],
"diff_token_dirs": [],
"diff_total": 278,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "lscr.io/linuxserver/bookstack:26.09.1",
"mounts": [
{
"class": "named-declared",
"files": 22,
"name": "volgate-bookstack_bookstack_config",
"sample": [
".migrations",
"keys/cert.crt",
"keys/cert.key",
"php/www2.conf",
"php/php-local.ini",
"log/php/error.log",
"log/nginx/access.log",
"log/nginx/error.log",
"nginx/worker_processes.conf",
"nginx/nginx.conf",
"nginx/nginx.conf.sample",
"nginx/resolver.conf",
"nginx/ssl.conf",
"nginx/ssl.conf.sample",
"nginx/site-confs/default.conf",
"nginx/site-confs/default.conf.sample",
"www/.env",
"www/index.html",
"www/framework/sessions/SLuOJjkQuFQsL6gg9CusAB8UQhSbJdCDF1aKaU1T",
"www/framework/sessions/uiYBj6sj13SEzi2Q35iTFw96jgGfPta08t7ywIhC",
"www/framework/sessions/FpHKVCsJDznfkVyK9dbd6S41422rvGKTxZshqdT6",
"www/framework/sessions/7TrTRDmQEdVh7D017tnhGndTETROnvKEa15IyHPJ"
],
"source": "/var/lib/docker/volumes/volgate-bookstack_bookstack_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "bookstack",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "mariadb:12.3",
"mounts": [
{
"class": "named-declared",
"files": 291,
"name": "volgate-bookstack_bookstack_db_data",
"sample": [
"tc.log",
".my-healthcheck.cnf",
"aria_log.00000001",
"aria_log_control",
"undo001",
"ibtmp1",
"ib_buffer_pool",
"ibdata1",
"undo002",
"multi-master.info",
"mariadb_upgrade_info",
"ddl_recovery.log",
"ib_logfile0",
"undo003",
"bookstack/role_user.frm",
"bookstack/failed_jobs.frm",
"bookstack/activities.ibd",
"bookstack/favourites.frm",
"bookstack/deletions.ibd",
"bookstack/joint_permissions.ibd",
"bookstack/api_tokens.frm",
"bookstack/cache.ibd",
"bookstack/tags.frm",
"bookstack/webhook_tracked_events.frm",
"bookstack/social_accounts.frm",
"bookstack/roles.ibd",
"bookstack/sessions.frm",
"bookstack/permission_role.frm",
"bookstack/user_invites.ibd",
"bookstack/api_tokens.ibd",
"bookstack/images.ibd",
"bookstack/users.ibd",
"bookstack/migrations.ibd",
"bookstack/permission_role.ibd",
"bookstack/references.ibd",
"bookstack/role_permissions.ibd",
"bookstack/mfa_values.ibd",
"bookstack/webhook_tracked_events.ibd",
"bookstack/entity_container_data.ibd",
"bookstack/entity_permissions.frm"
],
"source": "/var/lib/docker/volumes/volgate-bookstack_bookstack_db_data/_data",
"target": "/var/lib/mysql",
"writable_by_app": "yes"
}
],
"name": "bookstack-db",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"bookstack_config",
"bookstack_db_data"
],
"env_keys": [
"ADMIN_PASSWORD",
"APP_KEY",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 302",
"172.22.0.3:80/ -> 302"
],
"fixture": null,
"ports": [
80
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,184 @@
{
"probe": {
"app": "claper",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"priv"
]
},
{
"added": [
"static"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app/priv",
"files": [
"static"
]
},
{
"added": [
"uploads"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app/priv/static",
"files": [
"uploads"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/claperco/claper:2.5",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-claper_claper_uploads",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-claper_claper_uploads/_data",
"target": "/app/priv/static/uploads",
"writable_by_app": "yes"
}
],
"name": "claper",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:17-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1471,
"name": "volgate-claper_claper_postgres_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/2612",
"base/5/1418",
"base/5/6117",
"base/5/13510_fsm",
"base/5/2655",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/13500_vm",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm",
"base/5/6106",
"base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-claper_claper_postgres_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "claper-postgres",
"restarts": null,
"status": "running",
"uid": 70
}
],
"declared_volumes": [
"claper_postgres_data",
"claper_uploads"
],
"env_keys": [
"ADMIN_PASSWORD",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY_BASE",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:4000/ -> 200",
"172.26.0.3:4000/ -> 200",
"fixture Claper: seed OK \u2014 claper: seeded user drill-f9ed4c26@gate.invalid"
],
"fixture": "fixture Claper: seed OK \u2014 claper: seeded user drill-f9ed4c26@gate.invalid",
"ports": [
4000
]
},
"reasons": [
"claper: declared volume /app/priv/static/uploads is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"claper: this container's mounts are all empty while it created entries in ['/app/priv', '/app/priv/static'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,120 @@
{
"probe": {
"app": "code-server",
"containers": [
{
"diff_added": 196,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 4,
"db_signature": false,
"dir": "/",
"files": [
"defaults",
"etc",
"app",
"run"
]
},
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/etc",
"files": [
"group-",
"passwd-",
"s6-overlay"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay",
"files": [
"s6-rc.d"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d",
"files": [
"init-adduser"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d/init-adduser",
"files": [
"branding"
]
}
],
"diff_token_dirs": [],
"diff_total": 208,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "lscr.io/linuxserver/code-server:4.129.0",
"mounts": [
{
"class": "named-declared",
"files": 12,
"name": "volgate-codeserver_codeserver_config",
"sample": [
".profile",
".bashrc",
".cache/Microsoft/DeveloperTools/deviceid",
".local/share/code-server/heartbeat",
".local/share/code-server/coder-logs/code-server-stdout.log",
".local/share/code-server/coder-logs/code-server-stderr.log",
"extensions/extensions.json",
".config/code-server/config.yaml",
"data/code-server-ipc.sock",
"data/logs/20261002T141202/remoteagent.log",
"data/logs/20261002T141202/mcpGateway.log",
"data/CachedProfilesData/__default__profile__/extensions.builtin.cache"
],
"source": "/var/lib/docker/volumes/volgate-codeserver_codeserver_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "code-server",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"codeserver_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"PASSWORD",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8443/ -> 302"
],
"fixture": null,
"ports": [
8443
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,361 @@
{
"probe": {
"app": "dawarich",
"containers": [
{
"diff_added": 5111,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"var"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"app"
]
}
],
"diff_token_dirs": [],
"diff_total": 5116,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "freikin/dawarich:1.15.3",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-dawarich_dawarich_watched",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_watched/_data",
"target": "/var/app/tmp/imports/watched",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-dawarich_dawarich_storage",
"sample": [
".keep"
],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_storage/_data",
"target": "/var/app/storage",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 646,
"name": "volgate-dawarich_dawarich_public",
"sample": [
"400.html",
"icon.svg",
"site.webmanifest",
"favicon.ico",
"404.html",
"apple-touch-icon-precomposed.png",
"apple-touch-icon.png",
"406-unsupported-browser.html",
"icon-512.png",
"422.html",
"500.html",
"icon-192-maskable.png",
"icon-512-maskable.png",
"robots.txt",
"icon-192.png",
"icon.png",
".well-known/assetlinks.json",
".well-known/apple-app-site-association",
"assets/turbo.min-b86d83036ff04169e5bf3ebbc82e0ad528456259e47091b448f41a3cadabdb40.js.gz",
"assets/achievements-de86cbccec6f7fcb81e35bc8c035982f0192a543534d9d29486cd2d9cd383504.css",
"assets/application-0a04ba66afa1fa29d9079d22048b5ff5a211f1b597cc569f315784b4f21e68d6.css.gz",
"assets/application-6739e9e5befc5afb1c8035d71ddc83acb274c0ccb24a6171c1e27cc5aeb57e11.js.gz",
"assets/maps_maplibre_panel-2143bca483b257f4798b58d75803ede7d622e4479c4e0e1b7b02bb8347f65d9a.css.gz",
"assets/Inter-roman.latin-ext.var-46bc23ba7e33ea447579cd95b95f34665d7560377065b72f3a77df8bca4b0e5c.woff2",
"assets/Inter-italic.latin-ext.var-802705fb8496b82eda3f410c7e70a35c9407ba98b97cc5d9754db82750466fad.woff2",
"assets/trix-27b67936197943926cb14d19903e2a81f4ed2cb745aec0e8f198e70ddf292774.css",
"assets/posthog-e801a7c556e92fcb63d04dd9296eca08930ce3eb785518770ed3f60b84e62b02.js",
"assets/actiontext-7c6127c5682cea9debf5454351dae886079b68330ba4f5299bd31d4de53a761b.css",
"assets/mp4-muxer-3395e507185a33132f10b664d1c577e8593fec15d75b952e629d828f9b684ae4.js.gz",
"assets/Inter-roman.cyrillic.var-8aa524d3da3b8fd4a03ff2d0d41ea50520113fb2e8ae57c15079dabea44b3529.woff2",
"assets/activestorage.esm-3f2e9c040e7870f701a98bbbb1c77c979bbbdab80af967b59174f14d9388a0c1.js",
"assets/turbo.min.js-c6732dc7c1683ff78fbfb710f7dda227e58db136b253b8d07628207a5ccdb6b7.map.gz",
"assets/activestorage-540a3fb0ba30935e8ef6a0c69d58dec4561a97dcfd297908db089c4d725bb22a.js.gz",
"assets/application.tailwind-b198a91fdd7f7b90dc81a8108870b999692bb21890338a4cc47bc0c129280624.css",
"assets/stimulus-autoloader-c584942b568ba74879da31c7c3d51366737bacaf6fbae659383c0a5653685693.js",
"assets/brand_fonts-3cf2ea412ef4dfc5717c1bd2357c4f10cfcb0cfa8f2df789bad54925d8ac4d36.css",
"assets/logo-e019d04aed76f3c68a9289e687cc788067b9c0a283949e7cac9a6ba6aef8b2fc.svg.gz",
"assets/Inter-roman.alternates.var-29781a209d7978155bf343eb1653779269965fa4a43d504b1fb361ab20e8487b.woff2",
"assets/favicon-2e5b300516831fcc0f9b76243d556ca802455bb2764cf158b36ecf3c69147ca8.jpeg",
"assets/manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js"
],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_public/_data",
"target": "/var/app/public",
"writable_by_app": "yes"
}
],
"name": "dawarich",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgis/postgis:17-3.5-alpine",
"mounts": [
{
"class": "named-declared",
"files": 2358,
"name": "volgate-dawarich_dawarich_db_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/2612",
"base/5/1418",
"base/5/6117",
"base/5/13510_fsm",
"base/5/2655",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/13500_vm",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm",
"base/5/6106",
"base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_db_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "dawarich-db",
"restarts": null,
"status": "running",
"uid": 70
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7.4-alpine",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-dawarich_dawarich_redis",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_redis/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "dawarich-redis",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 4475,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"var"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"app"
]
}
],
"diff_token_dirs": [],
"diff_total": 4479,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "freikin/dawarich:1.15.3",
"mounts": [
{
"class": "named-declared",
"files": 646,
"name": "volgate-dawarich_dawarich_public",
"sample": [
"400.html",
"icon.svg",
"site.webmanifest",
"favicon.ico",
"404.html",
"apple-touch-icon-precomposed.png",
"apple-touch-icon.png",
"406-unsupported-browser.html",
"icon-512.png",
"422.html",
"500.html",
"icon-192-maskable.png",
"icon-512-maskable.png",
"robots.txt",
"icon-192.png",
"icon.png",
".well-known/assetlinks.json",
".well-known/apple-app-site-association",
"assets/turbo.min-b86d83036ff04169e5bf3ebbc82e0ad528456259e47091b448f41a3cadabdb40.js.gz",
"assets/achievements-de86cbccec6f7fcb81e35bc8c035982f0192a543534d9d29486cd2d9cd383504.css",
"assets/application-0a04ba66afa1fa29d9079d22048b5ff5a211f1b597cc569f315784b4f21e68d6.css.gz",
"assets/application-6739e9e5befc5afb1c8035d71ddc83acb274c0ccb24a6171c1e27cc5aeb57e11.js.gz",
"assets/maps_maplibre_panel-2143bca483b257f4798b58d75803ede7d622e4479c4e0e1b7b02bb8347f65d9a.css.gz",
"assets/Inter-roman.latin-ext.var-46bc23ba7e33ea447579cd95b95f34665d7560377065b72f3a77df8bca4b0e5c.woff2",
"assets/Inter-italic.latin-ext.var-802705fb8496b82eda3f410c7e70a35c9407ba98b97cc5d9754db82750466fad.woff2",
"assets/trix-27b67936197943926cb14d19903e2a81f4ed2cb745aec0e8f198e70ddf292774.css",
"assets/posthog-e801a7c556e92fcb63d04dd9296eca08930ce3eb785518770ed3f60b84e62b02.js",
"assets/actiontext-7c6127c5682cea9debf5454351dae886079b68330ba4f5299bd31d4de53a761b.css",
"assets/mp4-muxer-3395e507185a33132f10b664d1c577e8593fec15d75b952e629d828f9b684ae4.js.gz",
"assets/Inter-roman.cyrillic.var-8aa524d3da3b8fd4a03ff2d0d41ea50520113fb2e8ae57c15079dabea44b3529.woff2",
"assets/activestorage.esm-3f2e9c040e7870f701a98bbbb1c77c979bbbdab80af967b59174f14d9388a0c1.js",
"assets/turbo.min.js-c6732dc7c1683ff78fbfb710f7dda227e58db136b253b8d07628207a5ccdb6b7.map.gz",
"assets/activestorage-540a3fb0ba30935e8ef6a0c69d58dec4561a97dcfd297908db089c4d725bb22a.js.gz",
"assets/application.tailwind-b198a91fdd7f7b90dc81a8108870b999692bb21890338a4cc47bc0c129280624.css",
"assets/stimulus-autoloader-c584942b568ba74879da31c7c3d51366737bacaf6fbae659383c0a5653685693.js",
"assets/brand_fonts-3cf2ea412ef4dfc5717c1bd2357c4f10cfcb0cfa8f2df789bad54925d8ac4d36.css",
"assets/logo-e019d04aed76f3c68a9289e687cc788067b9c0a283949e7cac9a6ba6aef8b2fc.svg.gz",
"assets/Inter-roman.alternates.var-29781a209d7978155bf343eb1653779269965fa4a43d504b1fb361ab20e8487b.woff2",
"assets/favicon-2e5b300516831fcc0f9b76243d556ca802455bb2764cf158b36ecf3c69147ca8.jpeg",
"assets/manifest-597b5199768f5efff6ec880a4180aec95099b04608cc46e56dfe4e0940ee4665.js"
],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_public/_data",
"target": "/var/app/public",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-dawarich_dawarich_watched",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_watched/_data",
"target": "/var/app/tmp/imports/watched",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-dawarich_dawarich_storage",
"sample": [
".keep"
],
"source": "/var/lib/docker/volumes/volgate-dawarich_dawarich_storage/_data",
"target": "/var/app/storage",
"writable_by_app": "yes"
}
],
"name": "dawarich-sidekiq",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"dawarich_db_data",
"dawarich_public",
"dawarich_redis",
"dawarich_storage",
"dawarich_watched"
],
"env_keys": [
"ADMIN_PASSWORD",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY_BASE",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 403",
"172.27.0.4:3000/ -> 403",
"fixture Dawarich: seed OK \u2014 dawarich: POST /api/v1/overland/batches http=201 (47.4056,19.1918 at 2026-09-10T13:50:00Z)"
],
"fixture": "fixture Dawarich: seed OK \u2014 dawarich: POST /api/v1/overland/batches http=201 (47.4056,19.1918 at 2026-09-10T13:50:00Z)",
"ports": [
3000
]
},
"reasons": [
"dawarich-redis: declared volume /data is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,223 @@
{
"probe": {
"app": "docmost",
"containers": [
{
"diff_added": 5,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"apps"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/apps",
"files": [
"client"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/apps/client",
"files": [
"dist"
]
},
{
"added": [
"index-template.html"
],
"changed_count": 1,
"db_signature": false,
"dir": "/app/apps/client/dist",
"files": [
"index-template.html"
]
}
],
"diff_token_dirs": [],
"diff_total": 11,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "docmost/docmost:0.96.0",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-docmost_docmost_storage",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-docmost_docmost_storage/_data",
"target": "/app/data/storage",
"writable_by_app": "yes"
}
],
"name": "docmost",
"restarts": null,
"status": "running",
"uid": 1000
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:18-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1589,
"name": "volgate-docmost_docmost_postgres_data",
"sample": [
"18/docker/pg_ident.conf",
"18/docker/pg_hba.conf",
"18/docker/postmaster.pid",
"18/docker/postgresql.conf",
"18/docker/PG_VERSION",
"18/docker/postgresql.auto.conf",
"18/docker/postmaster.opts",
"18/docker/base/5/2612",
"18/docker/base/5/1418",
"18/docker/base/5/6117",
"18/docker/base/5/13510_fsm",
"18/docker/base/5/2655",
"18/docker/base/5/3609",
"18/docker/base/5/2662",
"18/docker/base/5/2683",
"18/docker/base/5/2832",
"18/docker/base/5/2679",
"18/docker/base/5/2608_vm",
"18/docker/base/5/2673",
"18/docker/base/5/2690",
"18/docker/base/5/2336",
"18/docker/base/5/2754",
"18/docker/base/5/2701",
"18/docker/base/5/4168",
"18/docker/base/5/2650",
"18/docker/base/5/2839",
"18/docker/base/5/2688",
"18/docker/base/5/2840",
"18/docker/base/5/1247_fsm",
"18/docker/base/5/3997",
"18/docker/base/5/3456_vm",
"18/docker/base/5/2667",
"18/docker/base/5/2678",
"18/docker/base/5/2696",
"18/docker/base/5/3456",
"18/docker/base/5/2228",
"18/docker/base/5/1259_fsm",
"18/docker/base/5/6351",
"18/docker/base/5/6106",
"18/docker/base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-docmost_docmost_postgres_data/_data",
"target": "/var/lib/postgresql",
"writable_by_app": "yes"
}
],
"name": "docmost-postgres",
"restarts": null,
"status": "running",
"uid": 70
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-docmost_docmost_redis_data",
"sample": [
"appendonlydir/appendonly.aof.1.incr.aof",
"appendonlydir/appendonly.aof.manifest",
"appendonlydir/appendonly.aof.1.base.rdb"
],
"source": "/var/lib/docker/volumes/volgate-docmost_docmost_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "docmost-redis",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"docmost_postgres_data",
"docmost_redis_data",
"docmost_storage"
],
"env_keys": [
"APP_SECRET",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 200",
"172.28.0.4:3000/ -> 200",
"fixture Docmost: seed OK \u2014 docmost: /api/auth/setup http=200 rc=0"
],
"fixture": "fixture Docmost: seed OK \u2014 docmost: /api/auth/setup http=200 rc=0",
"ports": [
3000
]
},
"reasons": [
"docmost: declared volume /app/data/storage is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"docmost: this container's mounts are all empty while it created entries in ['/app/apps/client/dist'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,123 @@
{
"probe": {
"app": "emby",
"containers": [
{
"diff_added": 205,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"media",
"config"
],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"media",
"config"
]
}
],
"diff_token_dirs": [],
"diff_total": 207,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "emby/embyserver:4.11.0.4",
"mounts": [
{
"class": "bind",
"files": 3,
"name": null,
"sample": [
"books/metadata.db-wal",
"books/metadata.db",
"books/metadata.db-shm"
],
"source": "/srv/felhom-gate/hdd/userdata/media",
"target": "/media",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 46,
"name": "volgate-emby_emby_config",
"sample": [
"logs/hardware_detection-63926547843.txt",
"logs/readme.txt",
"logs/embyserver.txt",
"plugins/Emby.Dlna.dll",
"plugins/NfoMetadata.dll",
"plugins/OpenSubtitles.dll",
"plugins/Emby.XmlTV.dll",
"plugins/StudioImages.dll",
"plugins/Emby.Webhooks.dll",
"plugins/MBBackup.dll",
"plugins/Fanart.dll",
"plugins/Emby.Server.CinemaMode.dll",
"plugins/BlurayMounter.dll",
"plugins/Emby.M3UTuner.dll",
"plugins/DvdMounter.dll",
"plugins/OMDb.dll",
"plugins/MusicBrainz.dll",
"plugins/Emby.PortMapper.dll",
"plugins/AudioDb.dll",
"plugins/EmbyGuideData.dll",
"plugins/Tvdb.dll",
"plugins/MovieDb.dll",
"config/system.xml",
"config/users/adf1dbe640d3417fa792f025e60b6b44/policy.xml",
"cache/httpclient/0fb243ded9649ae6d18059c674a4ae00_1",
"cache/ffmpeg/hwaccels_4.11.0.4.txt",
"cache/ffmpeg/filters_4.11.0.4.txt",
"cache/ffmpeg/decoders_4.11.0.4.txt",
"cache/ffmpeg/version_4.11.0.4.txt",
"cache/ffmpeg/encoders_4.11.0.4.txt",
"cache/ffmpeg/protocols_4.11.0.4.txt",
"data/activitylog.db",
"data/lastversion.txt",
"data/library.db",
"data/library.db-wal",
"data/device.txt",
"data/activitylog.db-shm",
"data/authentication.db-wal",
"data/activitylog.db-wal",
"data/wan.dat"
],
"source": "/var/lib/docker/volumes/volgate-emby_emby_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "emby",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"emby_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8096/ -> 302"
],
"fixture": null,
"ports": [
8096
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,63 @@
{
"probe": {
"app": "ghost",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghost:6.67.0-alpine",
"mounts": [
{
"class": "named-declared",
"files": 7,
"name": "volgate-ghost_ghost_content",
"sample": [
"logs/https___blog_gate_invalid_production.error.log",
"logs/https___blog_gate_invalid_production.log",
"themes/source",
"themes/casper",
"public/.well-known/recommendations.json",
"public/admin-auth/index.html",
"data/ghost.db"
],
"source": "/var/lib/docker/volumes/volgate-ghost_ghost_content/_data",
"target": "/var/lib/ghost/content",
"writable_by_app": "yes"
}
],
"name": "ghost",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"ghost_content"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:2368/ -> 301"
],
"fixture": null,
"ports": [
2368
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,197 @@
{
"probe": {
"app": "gitea",
"containers": [
{
"diff_added": 16,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data"
],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"data"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"gitea"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/gitea",
"files": [
"gitea"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/etc",
"files": [
"s6",
"ssh"
]
},
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/etc/s6",
"files": [
".s6-svscan",
"gitea",
"openssh"
]
},
{
"added": [
"control",
"lock"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/s6/.s6-svscan",
"files": [
"control",
"lock"
]
},
{
"added": [
"event",
"supervise"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/s6/gitea",
"files": [
"event",
"supervise"
]
},
{
"added": [
"control",
"death_tally",
"lock",
"status"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/s6/gitea/supervise",
"files": [
"control",
"death_tally",
"lock",
"status"
]
},
{
"added": [
"supervise",
"event"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/s6/openssh",
"files": [
"supervise",
"event"
]
},
{
"added": [
"control",
"death_tally",
"lock",
"status"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/s6/openssh/supervise",
"files": [
"control",
"death_tally",
"lock",
"status"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/ssh",
"files": [
"sshd_config"
]
}
],
"diff_token_dirs": [],
"diff_total": 27,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "gitea/gitea:1.27.3",
"mounts": [
{
"class": "named-declared",
"files": 8,
"name": "volgate-gitea_gitea_data",
"sample": [
"gitea/conf/app.ini",
"git/.ssh/environment",
"ssh/ssh_host_rsa_key.pub",
"ssh/ssh_host_rsa_key",
"ssh/ssh_host_ed25519_key",
"ssh/ssh_host_ecdsa_key.pub",
"ssh/ssh_host_ed25519_key.pub",
"ssh/ssh_host_ecdsa_key"
],
"source": "/var/lib/docker/volumes/volgate-gitea_gitea_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "gitea",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"gitea_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 200"
],
"fixture": null,
"ports": [
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,78 @@
{
"probe": {
"app": "glance",
"containers": [
{
"diff_added": 1,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [
"config"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app",
"files": [
"config"
]
}
],
"diff_token_dirs": [],
"diff_total": 2,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "glanceapp/glance:v0.8.5",
"mounts": [
{
"class": "named-declared",
"files": 1,
"name": "volgate-glance_glance_config",
"sample": [
"glance.yml"
],
"source": "/var/lib/docker/volumes/volgate-glance_glance_config/_data",
"target": "/app/config",
"writable_by_app": "yes"
}
],
"name": "glance",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"glance_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8080/ -> 200"
],
"fixture": null,
"ports": [
8080
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,96 @@
{
"probe": {
"app": "gokapi",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [
"config",
"data"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app",
"files": [
"config",
"data"
]
}
],
"diff_token_dirs": [],
"diff_total": 3,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "f0rc3/gokapi:v1.9.6",
"mounts": [
{
"class": "named-declared",
"files": 4,
"name": "volgate-gokapi_gokapi_data",
"sample": [
"gokapi.sqlite-wal",
"gokapi.sqlite",
"log.txt",
"gokapi.sqlite-shm"
],
"source": "/var/lib/docker/volumes/volgate-gokapi_gokapi_data/_data",
"target": "/app/data",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-gokapi_gokapi_config",
"sample": [
"config.json"
],
"source": "/var/lib/docker/volumes/volgate-gokapi_gokapi_config/_data",
"target": "/app/config",
"writable_by_app": "yes"
}
],
"name": "gokapi",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"gokapi_config",
"gokapi_data"
],
"env_keys": [
"DOMAIN",
"GOKAPI_PASSWORD",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:53842/ -> 200"
],
"fixture": null,
"ports": [
53842
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,116 @@
{
"probe": {
"app": "grafana",
"containers": [
{
"diff_added": 13,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"usr"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"share"
]
}
],
"diff_token_dirs": [],
"diff_total": 28,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "grafana/grafana:13.2.3",
"mounts": [
{
"class": "named-declared",
"files": 939,
"name": "volgate-grafana_grafana_data",
"sample": [
"grafana.db",
"plugins/grafana-lokiexplore-app/963.js.map",
"plugins/grafana-lokiexplore-app/8067.js.map",
"plugins/grafana-lokiexplore-app/3069.js",
"plugins/grafana-lokiexplore-app/5281.js",
"plugins/grafana-lokiexplore-app/8077.js.map",
"plugins/grafana-lokiexplore-app/3803.js",
"plugins/grafana-lokiexplore-app/2531.js",
"plugins/grafana-lokiexplore-app/1949.js",
"plugins/grafana-lokiexplore-app/8990.js",
"plugins/grafana-lokiexplore-app/6842.js",
"plugins/grafana-lokiexplore-app/9436.js.map",
"plugins/grafana-lokiexplore-app/6178.js",
"plugins/grafana-lokiexplore-app/4623.js",
"plugins/grafana-lokiexplore-app/3252.js.map",
"plugins/grafana-lokiexplore-app/75.js.map",
"plugins/grafana-lokiexplore-app/7409.js",
"plugins/grafana-lokiexplore-app/4803.js.map",
"plugins/grafana-lokiexplore-app/821.js",
"plugins/grafana-lokiexplore-app/8438.js.map",
"plugins/grafana-lokiexplore-app/2250.js",
"plugins/grafana-lokiexplore-app/3508.js",
"plugins/grafana-lokiexplore-app/4803.js",
"plugins/grafana-lokiexplore-app/087755a1246f96c42579.svg",
"plugins/grafana-lokiexplore-app/2729.js",
"plugins/grafana-lokiexplore-app/9859.js.map",
"plugins/grafana-lokiexplore-app/module.js",
"plugins/grafana-lokiexplore-app/3960.js",
"plugins/grafana-lokiexplore-app/LICENSE.txt",
"plugins/grafana-lokiexplore-app/9701.js",
"plugins/grafana-lokiexplore-app/8389.js",
"plugins/grafana-lokiexplore-app/7409.js.map",
"plugins/grafana-lokiexplore-app/4582.js.map",
"plugins/grafana-lokiexplore-app/9793.js.map",
"plugins/grafana-lokiexplore-app/8627.js.map",
"plugins/grafana-lokiexplore-app/8627.js",
"plugins/grafana-lokiexplore-app/7557.js",
"plugins/grafana-lokiexplore-app/5888.js.map",
"plugins/grafana-lokiexplore-app/85b746ba2cec564b9a89.svg",
"plugins/grafana-lokiexplore-app/8751.js.map"
],
"source": "/var/lib/docker/volumes/volgate-grafana_grafana_data/_data",
"target": "/var/lib/grafana",
"writable_by_app": "yes"
}
],
"name": "grafana",
"restarts": null,
"status": "running",
"uid": 472
}
],
"declared_volumes": [
"grafana_data"
],
"env_keys": [
"DOMAIN",
"GF_SECURITY_ADMIN_PASSWORD",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 302"
],
"fixture": null,
"ports": [
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,260 @@
{
"probe": {
"app": "gramps-web",
"containers": [
{
"diff_added": 121,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"root",
"usr",
"app"
]
},
{
"added": [
"secret"
],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"secret"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/app/src",
"files": [
"gramps_webapi",
"alembic_users"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/src/alembic_users",
"files": [
"versions"
]
},
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/app/src/gramps_webapi",
"files": [
"auth",
"util",
"api"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/app/src/gramps_webapi/api",
"files": [
"search",
"resources"
]
},
{
"added": [
".gramps"
],
"changed_count": 1,
"db_signature": false,
"dir": "/root",
"files": [
".gramps"
]
},
{
"added": [
"grampsdb"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.gramps",
"files": [
"grampsdb"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/root/gramps",
"files": [
"gramps60"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/root/gramps/gramps60",
"files": [
"plugins"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/root/gramps/gramps60/plugins",
"files": [
"FilterRules"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"lib"
]
}
],
"diff_token_dirs": [],
"diff_total": 143,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/gramps-project/grampsweb:v25.6.0",
"mounts": [
{
"class": "named-declared",
"files": 1,
"name": "volgate-grampsweb_gramps_cache",
"sample": [
"request_cache/2029240f6d1128be89ddc32729463129"
],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_cache/_data",
"target": "/app/cache",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-grampsweb_gramps_secret",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_secret/_data",
"target": "/app/secret",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-grampsweb_gramps_tmp",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_tmp/_data",
"target": "/tmp",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-grampsweb_gramps_users",
"sample": [
"users.sqlite"
],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_users/_data",
"target": "/app/users",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 2,
"name": "volgate-grampsweb_gramps_db",
"sample": [
"a6bc6a5b-8996-4df6-aded-8af86d23f81a/name.txt",
"a6bc6a5b-8996-4df6-aded-8af86d23f81a/database.txt"
],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_db/_data",
"target": "/root/.gramps/grampsdb",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-grampsweb_gramps_index",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_index/_data",
"target": "/app/indexdir",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-grampsweb_gramps_media",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_media/_data",
"target": "/app/media",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 1,
"name": "volgate-grampsweb_gramps_thumb_cache",
"sample": [
"2029240f6d1128be89ddc32729463129"
],
"source": "/var/lib/docker/volumes/volgate-grampsweb_gramps_thumb_cache/_data",
"target": "/app/thumbnail_cache",
"writable_by_app": "yes"
}
],
"name": "gramps-web",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"gramps_cache",
"gramps_db",
"gramps_index",
"gramps_media",
"gramps_secret",
"gramps_thumb_cache",
"gramps_tmp",
"gramps_users"
],
"env_keys": [
"DOMAIN",
"GRAMPSWEB_SECRET_KEY",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"fixture GrampsWeb: seed OK \u2014 gramps-web: seeded user drill1c00babf"
],
"fixture": "fixture GrampsWeb: seed OK \u2014 gramps-web: seeded user drill1c00babf",
"ports": [
5000
]
},
"reasons": [
"gramps-web: declared volume /app/secret is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"gramps-web: declared volume /app/indexdir is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"gramps-web: declared volume /app/media is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,206 @@
{
"probe": {
"app": "grimmory",
"containers": [
{
"diff_added": 17,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"books"
],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"books"
]
},
{
"added": [
"data"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app",
"files": [
"data"
]
},
{
"added": [
"group-",
"passwd-",
"shadow-"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc",
"files": [
"group-",
"passwd-",
"shadow-"
]
},
{
"added": [
"booklore"
],
"changed_count": 0,
"db_signature": false,
"dir": "/home",
"files": [
"booklore"
]
}
],
"diff_token_dirs": [],
"diff_total": 24,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghcr.io/grimmory-tools/grimmory:v3.5.0",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/appdata/grimmory/data",
"target": "/app/data",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/grimmory",
"target": "/books",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/import/grimmory",
"target": "/bookdrop",
"writable_by_app": "yes"
}
],
"name": "grimmory",
"restarts": null,
"status": "running",
"uid": 1000
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "mariadb:11.4",
"mounts": [
{
"class": "named-declared",
"files": 355,
"name": "volgate-grimmory_grimmory_db",
"sample": [
"tc.log",
".my-healthcheck.cnf",
"aria_log.00000001",
"aria_log_control",
"undo001",
"ibtmp1",
"ib_buffer_pool",
"ibdata1",
"undo002",
"multi-master.info",
"mariadb_upgrade_info",
"ddl_recovery.log",
"ib_logfile0",
"undo003",
"performance_schema/db.opt",
"mysql/func.frm",
"mysql/index_stats.MAD",
"mysql/transaction_registry.ibd",
"mysql/time_zone_transition_type.frm",
"mysql/global_priv.MAD",
"mysql/time_zone_leap_second.MAI",
"mysql/column_stats.MAD",
"mysql/time_zone_transition.MAI",
"mysql/plugin.MAD",
"mysql/time_zone.MAD",
"mysql/column_stats.frm",
"mysql/db.MAD",
"mysql/help_keyword.frm",
"mysql/help_relation.frm",
"mysql/procs_priv.MAI",
"mysql/servers.frm",
"mysql/innodb_index_stats.frm",
"mysql/roles_mapping.frm",
"mysql/plugin.MAI",
"mysql/time_zone_name.MAD",
"mysql/user.frm",
"mysql/time_zone.MAI",
"mysql/global_priv.frm",
"mysql/proxies_priv.MAI",
"mysql/time_zone_transition_type.MAI"
],
"source": "/var/lib/docker/volumes/volgate-grimmory_grimmory_db/_data",
"target": "/var/lib/mysql",
"writable_by_app": "yes"
}
],
"name": "grimmory-db",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"grimmory_db"
],
"env_keys": [
"DB_PASSWORD",
"DB_ROOT_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:6060/ -> 200",
"172.31.0.3:6060/ -> 200"
],
"fixture": null,
"ports": [
6060
]
},
"reasons": [
"grimmory: this container's mounts are all empty while it created entries in ['/', '/app', '/etc'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "CLEAN"
}
@@ -0,0 +1,119 @@
{
"probe": {
"app": "home-assistant",
"containers": [
{
"diff_added": 2308,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"usr",
"root",
"run"
]
},
{
"added": [
".config"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".config"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local",
"files": [
"lib"
]
}
],
"diff_token_dirs": [],
"diff_total": 2600,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/home-assistant/home-assistant:2026.9.4",
"mounts": [
{
"class": "named-declared",
"files": 22,
"name": "volgate-homeassistant_homeassistant_config",
"sample": [
"home-assistant_v2.db-shm",
"home-assistant_v2.db-wal",
"home-assistant_v2.db",
"configuration.yaml",
".ha_run.lock",
"home-assistant.log.1",
"home-assistant.log.fault",
"home-assistant.log",
".HA_VERSION",
".storage/core.uuid",
".storage/core.restore_state",
".storage/core.entity_registry",
".storage/http.auth",
".storage/core.device_registry",
".storage/http",
".storage/auth",
".storage/core.config_entries",
".storage/homeassistant.exposed_entities",
".storage/assist_pipeline.pipelines",
"blueprints/script/homeassistant/confirmable_notification.yaml",
"blueprints/automation/homeassistant/notify_leaving_zone.yaml",
"blueprints/automation/homeassistant/motion_light.yaml"
],
"source": "/var/lib/docker/volumes/volgate-homeassistant_homeassistant_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "home-assistant",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"homeassistant_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8123/ -> 302"
],
"fixture": null,
"ports": [
8123
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,72 @@
{
"probe": {
"app": "homebox",
"containers": [
{
"diff_added": 1,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"data"
]
}
],
"diff_token_dirs": [],
"diff_total": 1,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/sysadminsmedia/homebox:0.26.2",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-homebox_homebox_data",
"sample": [
"homebox.db",
"homebox.db-shm",
"homebox.db-wal"
],
"source": "/var/lib/docker/volumes/volgate-homebox_homebox_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "homebox",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"homebox_data"
],
"env_keys": [
"DOMAIN",
"HBOX_AUTH_API_KEY_PEPPER",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:7745/ -> 200"
],
"fixture": null,
"ports": [
7745
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,90 @@
{
"probe": {
"app": "homepage",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"app",
"run"
]
},
{
"added": [
"config"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app",
"files": [
"config"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/gethomepage/homepage:v1.13.2",
"mounts": [
{
"class": "bind",
"files": -1,
"name": null,
"sample": [],
"source": "/var/run/docker.sock",
"target": "/var/run/docker.sock",
"writable_by_app": "no-source"
},
{
"class": "named-declared",
"files": 3,
"name": "volgate-homepage_homepage_config",
"sample": [
"kubernetes.yaml",
"settings.yaml",
"logs/homepage.log"
],
"source": "/var/lib/docker/volumes/volgate-homepage_homepage_config/_data",
"target": "/app/config",
"writable_by_app": "yes"
}
],
"name": "homepage",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"homepage_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 200"
],
"fixture": null,
"ports": [
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,314 @@
{
"probe": {
"app": "immich",
"containers": [
{
"diff_added": 1,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"cache"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"cache"
]
}
],
"diff_token_dirs": [],
"diff_total": 1,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/immich-app/immich-machine-learning:v3.2.4",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-immich_immich_ml_cache",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-immich_immich_ml_cache/_data",
"target": "/cache",
"writable_by_app": "yes"
}
],
"name": "immich-machine-learning",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 3,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"run",
"etc"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc",
"files": [
"postgresql"
]
},
{
"added": [
"postgresql.conf"
],
"changed_count": 0,
"db_signature": false,
"dir": "/etc/postgresql",
"files": [
"postgresql.conf"
]
}
],
"diff_token_dirs": [],
"diff_total": 7,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0",
"mounts": [
{
"class": "named-declared",
"files": 1879,
"name": "volgate-immich_immich_postgres_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/13401_fsm",
"base/5/2612",
"base/5/13410",
"base/5/1418",
"base/5/6117",
"base/5/2655",
"base/5/13406_fsm",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/13401_vm",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm"
],
"source": "/var/lib/docker/volumes/volgate-immich_immich_postgres_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "immich-postgres",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-immich_immich_redis_data",
"sample": [
"appendonlydir/appendonly.aof.1.incr.aof",
"appendonlydir/appendonly.aof.manifest",
"appendonlydir/appendonly.aof.1.base.rdb"
],
"source": "/var/lib/docker/volumes/volgate-immich_immich_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "immich-redis",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 4,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data",
"external"
],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"data",
"external"
]
},
{
"added": [
"photos"
],
"changed_count": 0,
"db_signature": false,
"dir": "/external",
"files": [
"photos"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"src"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/src",
"files": [
"app"
]
},
{
"added": [
"upload"
],
"changed_count": 0,
"db_signature": false,
"dir": "/usr/src/app",
"files": [
"upload"
]
}
],
"diff_token_dirs": [],
"diff_total": 7,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/immich-app/immich-server:v3.2.4",
"mounts": [
{
"class": "bind",
"files": 6,
"name": null,
"sample": [
"upload/.immich",
"backups/.immich",
"library/.immich",
"profile/.immich",
"encoded-video/.immich",
"thumbs/.immich"
],
"source": "/srv/felhom-gate/hdd/appdata/immich",
"target": "/usr/src/app/upload",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/photos",
"target": "/external/photos",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 0,
"name": "711f413018201c75e07a40945663b7efbf2fb99d957942f85d36d6f1ee9f2bc7",
"sample": [],
"source": "/var/lib/docker/volumes/711f413018201c75e07a40945663b7efbf2fb99d957942f85d36d6f1ee9f2bc7/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "immich-server",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"immich_ml_cache",
"immich_postgres_data",
"immich_redis_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:2283/ -> 200",
"192.168.48.5:2283/ -> 200",
"fixture Immich: seed OK \u2014 immich: seeded album drillalbuma6820f47"
],
"fixture": "fixture Immich: seed OK \u2014 immich: seeded album drillalbuma6820f47",
"ports": [
2283
]
},
"reasons": [
"immich-machine-learning: declared volume /cache is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"immich-machine-learning: this container's mounts are all empty while it created entries in ['/'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,157 @@
{
"probe": {
"app": "jellyfin",
"containers": [
{
"diff_added": 7,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"root",
"jellyfin"
]
},
{
"added": [
"Dictionaries"
],
"changed_count": 0,
"db_signature": false,
"dir": "/jellyfin",
"files": [
"Dictionaries"
]
},
{
"added": [
".aspnet"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".aspnet"
]
},
{
"added": [
"DataProtection-Keys"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.aspnet",
"files": [
"DataProtection-Keys"
]
},
{
"added": [
"key-007ed6d3-8630-4eee-8875-b3a09c521ea0.xml"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.aspnet/DataProtection-Keys",
"files": [
"key-007ed6d3-8630-4eee-8875-b3a09c521ea0.xml"
]
}
],
"diff_token_dirs": [],
"diff_total": 10,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "jellyfin/jellyfin:10.11.11",
"mounts": [
{
"class": "bind",
"files": 3,
"name": null,
"sample": [
"books/metadata.db-wal",
"books/metadata.db",
"books/metadata.db-shm"
],
"source": "/srv/felhom-gate/hdd/userdata/media",
"target": "/media",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 20,
"name": "volgate-jellyfin_jellyfin_config",
"sample": [
".jellyfin-data",
"plugins/.jellyfin-plugin",
"plugins/configurations/Jellyfin.Plugin.MusicBrainz.xml",
"plugins/configurations/Jellyfin.Plugin.Tmdb.xml",
"config/database.xml",
"config/system.xml",
"config/.jellyfin-config",
"config/encoding.xml",
"config/logging.default.json",
"root/.jellyfin-root",
"log/log_20261002.log",
"log/.jellyfin-log",
"data/.jellyfin-data",
"data/jellyfin.db",
"data/jellyfin.db-wal",
"data/device.txt",
"data/jellyfin.db-shm",
"data/ScheduledTasks/3a025083-141d-3c17-dd96-d5f9b951287b.js",
"data/ScheduledTasks/f9b057c0-54e9-e6da-ee4a-88ffd146a403.js",
"data/ScheduledTasks/7d8088c1-0902-f1bf-4072-ded42437bcfb.js"
],
"source": "/var/lib/docker/volumes/volgate-jellyfin_jellyfin_config/_data",
"target": "/config",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 2,
"name": "volgate-jellyfin_jellyfin_cache",
"sample": [
".jellyfin-cache",
"transcodes/.jellyfin-transcode"
],
"source": "/var/lib/docker/volumes/volgate-jellyfin_jellyfin_cache/_data",
"target": "/cache",
"writable_by_app": "yes"
}
],
"name": "jellyfin",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"jellyfin_cache",
"jellyfin_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8096/ -> 302"
],
"fixture": null,
"ports": [
8096
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,157 @@
{
"probe": {
"app": "karakeep",
"containers": [
{
"diff_added": 203,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data"
],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"data"
]
}
],
"diff_token_dirs": [],
"diff_total": 205,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/karakeep-app/karakeep:0.33.2",
"mounts": [
{
"class": "named-declared",
"files": 2,
"name": "volgate-karakeep_karakeep_data",
"sample": [
"db.db",
"queue.db"
],
"source": "/var/lib/docker/volumes/volgate-karakeep_karakeep_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "karakeep",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 1,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"usr"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"sbin"
]
},
{
"added": [
"docker-init"
],
"changed_count": 0,
"db_signature": false,
"dir": "/usr/sbin",
"files": [
"docker-init"
]
}
],
"diff_token_dirs": [],
"diff_total": 3,
"diff_unresolved": [],
"exit": 0,
"gid": 65534,
"health": "healthy",
"image": "ghcr.io/karakeep-app/karakeep-chrome:151.0.7922.47-r1",
"mounts": [],
"name": "karakeep-chrome",
"restarts": null,
"status": "running",
"uid": 65534
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "getmeili/meilisearch:v1.41.0",
"mounts": [
{
"class": "named-declared",
"files": 5,
"name": "volgate-karakeep_karakeep_meili",
"sample": [
"data.ms/VERSION",
"data.ms/tasks/lock.mdb",
"data.ms/tasks/data.mdb",
"data.ms/auth/lock.mdb",
"data.ms/auth/data.mdb"
],
"source": "/var/lib/docker/volumes/volgate-karakeep_karakeep_meili/_data",
"target": "/meili_data",
"writable_by_app": "yes"
}
],
"name": "karakeep-meilisearch",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"karakeep_data",
"karakeep_meili"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"MEILI_MASTER_KEY",
"NEXTAUTH_SECRET",
"OPENAI_API_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 307",
"192.168.64.4:3000/ -> 307"
],
"fixture": null,
"ports": [
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,266 @@
{
"probe": {
"app": "kimai",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"opt",
"run",
"usr"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/opt",
"files": [
"kimai"
]
},
{
"added": [
".env.local"
],
"changed_count": 1,
"db_signature": false,
"dir": "/opt/kimai",
"files": [
".env.local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/opt/kimai/config",
"files": [
"packages"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/opt/kimai/config/packages",
"files": [
"monolog.yaml"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local",
"files": [
"etc"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local/etc",
"files": [
"php"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local/etc/php",
"files": [
"php.ini"
]
}
],
"diff_token_dirs": [],
"diff_total": 14,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "kimai/kimai2:2.67.0",
"mounts": [
{
"class": "named-declared",
"files": 2038,
"name": "volgate-kimai_kimai_var",
"sample": [
"installed",
"plugins/.gitkeep",
"cache/.gitkeep",
"cache/prod/annotations.map",
"cache/prod/webpack_encore.cache.php",
"cache/prod/url_generating_routes.php",
"cache/prod/url_matching_routes.php",
"cache/prod/App_KernelProdContainer.preload.php",
"cache/prod/url_generating_routes.php.meta",
"cache/prod/App_KernelProdContainer.php",
"cache/prod/url_matching_routes.php.meta",
"cache/prod/serialization.php",
"cache/prod/validation.php",
"cache/prod/App_KernelProdContainer.php.meta",
"cache/prod/App_KernelProdContainer.php.lock",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityProjectComment.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityInvoiceTemplate.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityCustomerMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityTeamMember.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityTimesheet.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityConfiguration.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityInvoice.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityRole.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityActivity.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityTag.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityRolePermission.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityCustomerRate.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityCustomer.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityTimesheetMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityAccessToken.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityInvoiceMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityActivityMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityProjectMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityInvoiceTemplateMeta.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityProjectRate.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityTeam.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityBookmark.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityCustomerComment.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityExportTemplate.php",
"cache/prod/doctrine/orm/Proxies/__CG__AppEntityProject.php"
],
"source": "/var/lib/docker/volumes/volgate-kimai_kimai_var/_data",
"target": "/opt/kimai/var",
"writable_by_app": "yes"
}
],
"name": "kimai",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "mariadb:11.8",
"mounts": [
{
"class": "named-declared",
"files": 279,
"name": "volgate-kimai_kimai_db_data",
"sample": [
"tc.log",
".my-healthcheck.cnf",
"aria_log.00000001",
"aria_log_control",
"undo001",
"ibtmp1",
"ib_buffer_pool",
"ibdata1",
"undo002",
"multi-master.info",
"mariadb_upgrade_info",
"ddl_recovery.log",
"ib_logfile0",
"undo003",
"performance_schema/db.opt",
"mysql/func.frm",
"mysql/index_stats.MAD",
"mysql/transaction_registry.ibd",
"mysql/time_zone_transition_type.frm",
"mysql/global_priv.MAD",
"mysql/time_zone_leap_second.MAI",
"mysql/column_stats.MAD",
"mysql/time_zone_transition.MAI",
"mysql/plugin.MAD",
"mysql/time_zone.MAD",
"mysql/column_stats.frm",
"mysql/db.MAD",
"mysql/help_keyword.frm",
"mysql/help_relation.frm",
"mysql/procs_priv.MAI",
"mysql/servers.frm",
"mysql/innodb_index_stats.frm",
"mysql/roles_mapping.frm",
"mysql/plugin.MAI",
"mysql/time_zone_name.MAD",
"mysql/user.frm",
"mysql/time_zone.MAI",
"mysql/global_priv.frm",
"mysql/proxies_priv.MAI",
"mysql/time_zone_transition_type.MAI"
],
"source": "/var/lib/docker/volumes/volgate-kimai_kimai_db_data/_data",
"target": "/var/lib/mysql",
"writable_by_app": "yes"
}
],
"name": "kimai-db",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"kimai_db_data",
"kimai_var"
],
"env_keys": [
"ADMIN_EMAIL",
"ADMIN_PASSWORD",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8001/ -> 302",
"192.168.80.3:8001/ -> 302"
],
"fixture": null,
"ports": [
8001
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,90 @@
{
"probe": {
"app": "komga",
"containers": [
{
"diff_added": 12,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data",
"config"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"data",
"config"
]
}
],
"diff_token_dirs": [],
"diff_total": 13,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "gotson/komga:1.28.0",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/comics",
"target": "/data",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 11,
"name": "volgate-komga_komga_config",
"sample": [
"database.sqlite",
"tasks.sqlite-wal",
"database.sqlite-shm",
"tasks.sqlite",
"database.sqlite-wal",
"tasks.sqlite-shm",
"logs/komga.log",
"lucene/_0.si",
"lucene/_0.cfs",
"lucene/segments_1",
"lucene/_0.cfe"
],
"source": "/var/lib/docker/volumes/volgate-komga_komga_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "komga",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"komga_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:25600/ -> 200"
],
"fixture": null,
"ports": [
25600
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,94 @@
{
"probe": {
"app": "mealie",
"containers": [
{
"diff_added": 1,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"app",
"etc"
]
},
{
"added": [
"data"
],
"changed_count": 3,
"db_signature": false,
"dir": "/app",
"files": [
"data"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/etc",
"files": [
"passwd-",
"group-"
]
}
],
"diff_token_dirs": [],
"diff_total": 10,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghcr.io/mealie-recipes/mealie:v3.28.0",
"mounts": [
{
"class": "named-declared",
"files": 5,
"name": "volgate-mealie_mealie_data",
"sample": [
".secret",
".session_secret",
"mealie.log",
"mealie.db",
"users/aeacef6a-b1ac-4b48-9cfd-94d9a92df832/profile.webp"
],
"source": "/var/lib/docker/volumes/volgate-mealie_mealie_data/_data",
"target": "/app/data",
"writable_by_app": "yes"
}
],
"name": "mealie",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"mealie_data"
],
"env_keys": [
"ADMIN_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:9000/ -> 200"
],
"fixture": null,
"ports": [
9000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,224 @@
{
"probe": {
"app": "metube",
"containers": [
{
"diff_added": 13,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"downloads",
"state"
],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"downloads",
"state"
]
},
{
"added": [],
"changed_count": 5,
"db_signature": false,
"dir": "/app",
"files": [
"pyproject.toml",
"ui",
"uv.lock",
"app",
"docker-entrypoint.sh"
]
},
{
"added": [],
"changed_count": 9,
"db_signature": false,
"dir": "/app/app",
"files": [
"dl_formats.py",
"main.py",
"music_metadata.py",
"state_store.py",
"subscriptions.py",
"tests",
"ytdl.py",
"bg_tasks.py",
"url_guard.py"
]
},
{
"added": [],
"changed_count": 14,
"db_signature": false,
"dir": "/app/app/tests",
"files": [
"test_persistent_queue.py",
"test_state_store.py",
"test_ytdl_utils.py",
"conftest.py",
"test_api.py",
"test_dl_formats.py",
"test_download_queue.py",
"test_main_helpers.py",
"test_nightly_update.py",
"test_subscriptions.py",
"test_url_guard.py",
"test_bg_tasks.py",
"test_config.py",
"test_music_metadata.py"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/ui",
"files": [
"dist"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/ui/dist",
"files": [
"metube"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/app/ui/dist/metube",
"files": [
"3rdpartylicenses.txt",
"browser"
]
},
{
"added": [],
"changed_count": 12,
"db_signature": false,
"dir": "/app/ui/dist/metube/browser",
"files": [
"manifest.webmanifest",
"ngsw.json",
"safety-worker.js",
"styles-GJAVEZGM.css",
"favicon.ico",
"index.html",
"main-CXU5VOAO.js",
"ngsw-worker.js",
"polyfills-DB62ZRJ7.js",
"worker-basic.min.js",
"assets",
"custom-service-worker.js"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/ui/dist/metube/browser/assets",
"files": [
"icons"
]
},
{
"added": [],
"changed_count": 9,
"db_signature": false,
"dir": "/app/ui/dist/metube/browser/assets/icons",
"files": [
"apple-touch-icon.png",
"browserconfig.xml",
"android-chrome-192x192.png",
"android-chrome-384x384.png",
"favicon-16x16.png",
"favicon-32x32.png",
"favicon.ico",
"mstile-150x150.png",
"safari-pinned-tab.svg"
]
}
],
"diff_token_dirs": [],
"diff_total": 69,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/alexta69/metube:2026.09.29",
"mounts": [
{
"class": "bind",
"files": 1,
"name": null,
"sample": [
"Big_Buck_Bunny_360_10s_1MB.mp4"
],
"source": "/srv/felhom-gate/hdd/userdata/media/metube",
"target": "/downloads",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 2,
"name": "volgate-metube_metube_state",
"sample": [
"completed.json",
"queue.json"
],
"source": "/var/lib/docker/volumes/volgate-metube_metube_state/_data",
"target": "/state",
"writable_by_app": "yes"
}
],
"name": "metube",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"metube_state"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8081/ -> 200",
"172.18.0.2:8081/ -> 200",
"172.18.0.2:8081/login -> 404",
"172.18.0.2:8081/setup -> 404",
"172.18.0.2:8081/signup -> 404",
"172.18.0.2:8081/register -> 404",
"172.18.0.2:8081/install -> 404",
"172.18.0.2:8081/admin -> 404",
"172.18.0.2:8081/api/health -> 404",
"172.18.0.2:8081/health -> 404",
"172.18.0.2:8081/healthz -> 404",
"172.18.0.2:8081/status -> 404",
"172.18.0.2:8081/web -> 404",
"172.18.0.2:8081/index.php -> 404",
"172.18.0.2:8081/dashboard -> 404",
"fixture MeTube: seed OK \u2014 metube: the download finished (991017 bytes)"
],
"fixture": "fixture MeTube: seed OK \u2014 metube: the download finished (991017 bytes)",
"ports": [
8081
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,83 @@
{
"probe": {
"app": "n8n",
"containers": [
{
"diff_added": 503,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"home"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/home",
"files": [
"node"
]
}
],
"diff_token_dirs": [],
"diff_total": 506,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "n8nio/n8n:2.42.1",
"mounts": [
{
"class": "named-declared",
"files": 7,
"name": "volgate-n8n_n8n_data",
"sample": [
"crash.journal",
"database.sqlite",
"config",
"database.sqlite-shm",
"n8nEventLog.log",
"database.sqlite-wal",
"nodes/package.json"
],
"source": "/var/lib/docker/volumes/volgate-n8n_n8n_data/_data",
"target": "/home/node/.n8n",
"writable_by_app": "yes"
}
],
"name": "n8n",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"n8n_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"N8N_ENCRYPTION_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:5678/ -> 200"
],
"fixture": null,
"ports": [
5678
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,85 @@
{
"probe": {
"app": "navidrome",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data",
"music"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"data",
"music"
]
}
],
"diff_token_dirs": [],
"diff_total": 2,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "deluan/navidrome:0.64.2",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/music",
"target": "/music",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 6,
"name": "volgate-navidrome_navidrome_data",
"sample": [
"navidrome.db-shm",
"navidrome.db",
"navidrome.db-wal",
"cache/images/.nd-migrated",
"cache/backgrounds/.nd-migrated",
"cache/transcoding/.nd-migrated"
],
"source": "/var/lib/docker/volumes/volgate-navidrome_navidrome_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "navidrome",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"navidrome_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:4533/ -> 302"
],
"fixture": null,
"ports": [
4533
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,322 @@
{
"probe": {
"app": "nextcloud",
"containers": [
{
"diff_added": 4,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"run",
"usr"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local",
"files": [
"etc"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local/etc",
"files": [
"php"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local/etc/php",
"files": [
"conf.d"
]
},
{
"added": [
"redis-session.ini"
],
"changed_count": 0,
"db_signature": false,
"dir": "/usr/local/etc/php/conf.d",
"files": [
"redis-session.ini"
]
}
],
"diff_token_dirs": [],
"diff_total": 12,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "nextcloud:34.0.4-apache",
"mounts": [
{
"class": "named-declared",
"files": 4001,
"name": "volgate-nextcloud_nextcloud_html",
"sample": [
"cron.php",
"index.php",
"index.html",
"remote.php",
"package.json",
"console.php",
"AUTHORS",
"nextcloud-init-sync.lock",
"composer.lock",
"public.php",
".user.ini",
"version.php",
"COPYING",
".htaccess",
"status.php",
"REUSE.toml",
"occ",
"robots.txt",
"package-lock.json",
"composer.json",
"dist/index-BA6DHN8z.chunk.mjs",
"dist/common-NcUserBubble-BXR7vT0V-f2DD9EAL.chunk.css",
"dist/files_external-auth_rsa.mjs.license",
"dist/FilePicker-DcPPaTgX.chunk.mjs.license",
"dist/core-public.js.license",
"dist/1930-1930.js",
"dist/index-yD-5b5y_.chunk.mjs.license",
"dist/9811-9811.js.map.license",
"dist/2426-2426.js.license",
"dist/settings-vue-settings-admin-ai.js.map",
"dist/files_trashbin-files_trashbin-init-nOmQ7X71.chunk.css",
"dist/systemtags-init.mjs",
"dist/NcUserStatusIcon-BF5OEQFU-B7JEw9np.chunk.mjs.map.license",
"dist/core-unsupported-browser.js.map",
"dist/oauth2-settings-admin.mjs.map",
"dist/428-428.js.map",
"dist/index-Cp0kcsps.chunk.mjs.map.license",
"dist/files_external-settings.mjs.map.license",
"dist/index-CwlKovrj.chunk.mjs.map.license",
"dist/SetStatusModal-DOl5_a4J.chunk.mjs.map"
],
"source": "/var/lib/docker/volumes/volgate-nextcloud_nextcloud_html/_data",
"target": "/var/www/html",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 69,
"name": null,
"sample": [
"nextcloud.log",
"index.html",
".ncdata",
".htaccess",
"admin/files/Reasons to use Nextcloud.pdf",
"admin/files/Nextcloud Manual.pdf",
"admin/files/Readme.md",
"admin/files/Nextcloud intro.mp4",
"admin/files/Templates credits.md",
"admin/files/Nextcloud.png",
"admin/files/Templates/Gotong royong.odp",
"admin/files/Templates/Business model canvas.ods",
"admin/files/Templates/Mind map.whiteboard",
"admin/files/Templates/Venn diagram.whiteboard",
"admin/files/Templates/Mother's day.odt",
"admin/files/Templates/Meeting agenda.whiteboard",
"admin/files/Templates/Meeting notes.md",
"admin/files/Templates/Business model canvas.odg",
"admin/files/Templates/Impact effort.whiteboard",
"admin/files/Templates/Report.odt",
"admin/files/Templates/Party invitation.odt",
"admin/files/Templates/Kanban board.whiteboard",
"admin/files/Templates/Invoice.ods",
"admin/files/Templates/Brainstorming.whiteboard",
"admin/files/Templates/Checklist.ods",
"admin/files/Templates/Mindmap.odg",
"admin/files/Templates/Certificate.odt",
"admin/files/Templates/Sticky notes.whiteboard",
"admin/files/Templates/Business model canvas.whiteboard",
"admin/files/Templates/Diagram & table.ods",
"admin/files/Templates/Triangle.odp",
"admin/files/Templates/Menu.odt",
"admin/files/Templates/Modern company.odp",
"admin/files/Templates/Invoice.odt",
"admin/files/Templates/Pitch deck.odp",
"admin/files/Templates/Flowchart.odg",
"admin/files/Templates/Timesheet.ods",
"admin/files/Templates/Product plan.md",
"admin/files/Templates/Syllabus.odt",
"admin/files/Templates/Onboarding.odp"
],
"source": "/srv/felhom-gate/hdd/appdata/nextcloud",
"target": "/var/www/html/data",
"writable_by_app": "yes"
}
],
"name": "nextcloud",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "mariadb:12.3",
"mounts": [
{
"class": "named-declared",
"files": 471,
"name": "volgate-nextcloud_nextcloud_db_data",
"sample": [
"tc.log",
".my-healthcheck.cnf",
"aria_log.00000001",
"aria_log_control",
"undo001",
"ibtmp1",
"ib_buffer_pool",
"ibdata1",
"undo002",
"multi-master.info",
"mariadb_upgrade_info",
"ddl_recovery.log",
"ib_logfile0",
"undo003",
"performance_schema/db.opt",
"mysql/func.frm",
"mysql/index_stats.MAD",
"mysql/transaction_registry.ibd",
"mysql/time_zone_transition_type.frm",
"mysql/global_priv.MAD",
"mysql/time_zone_leap_second.MAI",
"mysql/column_stats.MAD",
"mysql/time_zone_transition.MAI",
"mysql/plugin.MAD",
"mysql/time_zone.MAD",
"mysql/column_stats.frm",
"mysql/db.MAD",
"mysql/help_keyword.frm",
"mysql/help_relation.frm",
"mysql/procs_priv.MAI",
"mysql/servers.frm",
"mysql/innodb_index_stats.frm",
"mysql/roles_mapping.frm",
"mysql/plugin.MAI",
"mysql/time_zone_name.MAD",
"mysql/user.frm",
"mysql/time_zone.MAI",
"mysql/global_priv.frm",
"mysql/proxies_priv.MAI",
"mysql/time_zone_transition_type.MAI"
],
"source": "/var/lib/docker/volumes/volgate-nextcloud_nextcloud_db_data/_data",
"target": "/var/lib/mysql",
"writable_by_app": "yes"
}
],
"name": "nextcloud-db",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-nextcloud_nextcloud_redis_data",
"sample": [
"appendonlydir/appendonly.aof.1.incr.aof",
"appendonlydir/appendonly.aof.manifest",
"appendonlydir/appendonly.aof.1.base.rdb"
],
"source": "/var/lib/docker/volumes/volgate-nextcloud_nextcloud_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "nextcloud-redis",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"nextcloud_db_data",
"nextcloud_html",
"nextcloud_redis_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"MYSQL_ROOT_PASSWORD",
"NEXTCLOUD_ADMIN_PASSWORD",
"NEXTCLOUD_ADMIN_USER",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 302",
"192.168.128.4:80/ -> 302"
],
"fixture": null,
"ports": [
80
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,107 @@
{
"probe": {
"app": "opengist",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"opengist"
],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"opengist"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/etc",
"files": [
"passwd-",
"group-"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/home",
"files": [
"opengist"
]
},
{
"added": [
".gitconfig"
],
"changed_count": 0,
"db_signature": false,
"dir": "/home/opengist",
"files": [
".gitconfig"
]
}
],
"diff_token_dirs": [],
"diff_total": 10,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghcr.io/thomiceli/opengist:1.15",
"mounts": [
{
"class": "named-declared",
"files": 9,
"name": "volgate-opengist_opengist_data",
"sample": [
"opengist.db",
"opengist-secret.key",
"sessions/session-encrypt.key",
"opengist.index/index_meta.json",
"opengist.index/store/root.bolt",
"symlinks/config.yml",
"symlinks/opengist",
"log/opengist.log",
"ssh/opengist-ed25519"
],
"source": "/var/lib/docker/volumes/volgate-opengist_opengist_data/_data",
"target": "/opengist",
"writable_by_app": "yes"
}
],
"name": "opengist",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"opengist_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:6157/ -> 302"
],
"fixture": null,
"ports": [
6157
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,172 @@
{
"probe": {
"app": "outline",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1001,
"health": "healthy",
"image": "outlinewiki/outline:1.10.1",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-outline_outline_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-outline_outline_data/_data",
"target": "/var/lib/outline/data",
"writable_by_app": "yes"
}
],
"name": "outline",
"restarts": null,
"status": "running",
"uid": 1001
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:18-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1669,
"name": "volgate-outline_outline_postgres_data",
"sample": [
"18/docker/pg_ident.conf",
"18/docker/pg_hba.conf",
"18/docker/postmaster.pid",
"18/docker/postgresql.conf",
"18/docker/PG_VERSION",
"18/docker/postgresql.auto.conf",
"18/docker/postmaster.opts",
"18/docker/base/5/2612",
"18/docker/base/5/1418",
"18/docker/base/5/6117",
"18/docker/base/5/13510_fsm",
"18/docker/base/5/2655",
"18/docker/base/5/3609",
"18/docker/base/5/2662",
"18/docker/base/5/2683",
"18/docker/base/5/2832",
"18/docker/base/5/2679",
"18/docker/base/5/2608_vm",
"18/docker/base/5/2673",
"18/docker/base/5/2690",
"18/docker/base/5/2336",
"18/docker/base/5/2754",
"18/docker/base/5/2701",
"18/docker/base/5/4168",
"18/docker/base/5/2650",
"18/docker/base/5/2839",
"18/docker/base/5/2688",
"18/docker/base/5/2840",
"18/docker/base/5/1247_fsm",
"18/docker/base/5/3997",
"18/docker/base/5/3456_vm",
"18/docker/base/5/2667",
"18/docker/base/5/2678",
"18/docker/base/5/2696",
"18/docker/base/5/3456",
"18/docker/base/5/2228",
"18/docker/base/5/1259_fsm",
"18/docker/base/5/6351",
"18/docker/base/5/6106",
"18/docker/base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-outline_outline_postgres_data/_data",
"target": "/var/lib/postgresql",
"writable_by_app": "yes"
}
],
"name": "outline-postgres",
"restarts": null,
"status": "running",
"uid": 70
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-outline_outline_redis_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-outline_outline_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "outline-redis",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"outline_data",
"outline_postgres_data",
"outline_redis_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH",
"UTILS_SECRET"
],
"exercise": [
"172.18.0.2:3000/ -> 301",
"192.168.176.4:3000/ -> 301",
"fixture Outline: seed OK \u2014 outline: seeded document drilldoc-ed522bc2"
],
"fixture": "fixture Outline: seed OK \u2014 outline: seeded document drilldoc-ed522bc2",
"ports": [
3000
]
},
"reasons": [
"outline: declared volume /var/lib/outline/data is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"outline-redis: declared volume /data is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,255 @@
{
"probe": {
"app": "paperless-ngx",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:18-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1931,
"name": "volgate-paperlessngx_paperless_postgres_data",
"sample": [
"18/docker/pg_ident.conf",
"18/docker/pg_hba.conf",
"18/docker/postmaster.pid",
"18/docker/postgresql.conf",
"18/docker/PG_VERSION",
"18/docker/postgresql.auto.conf",
"18/docker/postmaster.opts",
"18/docker/base/5/2612",
"18/docker/base/5/1418",
"18/docker/base/5/6117",
"18/docker/base/5/13510_fsm",
"18/docker/base/5/2655",
"18/docker/base/5/3609",
"18/docker/base/5/2662",
"18/docker/base/5/2683",
"18/docker/base/5/2832",
"18/docker/base/5/2679",
"18/docker/base/5/2608_vm",
"18/docker/base/5/2673",
"18/docker/base/5/2690",
"18/docker/base/5/2336",
"18/docker/base/5/2754",
"18/docker/base/5/2701",
"18/docker/base/5/4168",
"18/docker/base/5/2650",
"18/docker/base/5/2839",
"18/docker/base/5/2688",
"18/docker/base/5/2840",
"18/docker/base/5/1247_fsm",
"18/docker/base/5/3997",
"18/docker/base/5/3456_vm",
"18/docker/base/5/2667",
"18/docker/base/5/2678",
"18/docker/base/5/2696",
"18/docker/base/5/3456",
"18/docker/base/5/2228",
"18/docker/base/5/1259_fsm",
"18/docker/base/5/6351",
"18/docker/base/5/6106",
"18/docker/base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-paperlessngx_paperless_postgres_data/_data",
"target": "/var/lib/postgresql",
"writable_by_app": "yes"
}
],
"name": "paperless-postgres",
"restarts": null,
"status": "running",
"uid": 70
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-paperlessngx_paperless_redis_data",
"sample": [
"appendonlydir/appendonly.aof.1.incr.aof",
"appendonlydir/appendonly.aof.manifest",
"appendonlydir/appendonly.aof.1.base.rdb"
],
"source": "/var/lib/docker/volumes/volgate-paperlessngx_paperless_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "paperless-redis",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 265,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"run",
"usr",
"var"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"share"
]
},
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/var",
"files": [
"log",
"cache",
"lib"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/var/lib",
"files": [
"apt",
"dpkg"
]
}
],
"diff_token_dirs": [],
"diff_total": 294,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/paperless-ngx/paperless-ngx:2.20.15",
"mounts": [
{
"class": "bind",
"files": 1,
"name": null,
"sample": [
"media.lock"
],
"source": "/srv/felhom-gate/hdd/appdata/paperless/media",
"target": "/usr/src/paperless/media",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/import/paperless",
"target": "/usr/src/paperless/consume",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/appdata/paperless/export",
"target": "/usr/src/paperless/export",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 9,
"name": "volgate-paperlessngx_paperless_data",
"sample": [
"migration_lock",
".index_version",
"celerybeat-schedule.db",
"log/celery.log",
"log/.__celery.lock",
"log/paperless.log",
"log/.__paperless.lock",
"index/MAIN_WRITELOCK",
"index/_MAIN_1.toc"
],
"source": "/var/lib/docker/volumes/volgate-paperlessngx_paperless_data/_data",
"target": "/usr/src/paperless/data",
"writable_by_app": "yes"
}
],
"name": "paperless-webserver",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"paperless_data",
"paperless_postgres_data",
"paperless_redis_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"PAPERLESS_ADMIN_PASSWORD",
"PAPERLESS_ADMIN_USER",
"PAPERLESS_OCR_LANGUAGE",
"PAPERLESS_SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8000/ -> 302",
"192.168.192.4:8000/ -> 302"
],
"fixture": null,
"ports": [
8000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,56 @@
{
"probe": {
"app": "papra",
"containers": [
{
"diff_added": 176,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 177,
"diff_unresolved": [],
"exit": 137,
"gid": null,
"health": "unhealthy",
"image": "ghcr.io/papra-hq/papra:26.6.2-rootless",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-papra_papra_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-papra_papra_data/_data",
"target": "/app/app-data",
"writable_by_app": "unknown-uid"
}
],
"name": "papra",
"restarts": null,
"status": "restarting",
"uid": null
}
],
"declared_volumes": [
"papra_data"
],
"env_keys": [
"AUTH_SECRET",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [],
"fixture": null,
"ports": [
1221
]
},
"reasons": [
"papra: not running (status=restarting exit=137 restarts=None)"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,56 @@
{
"probe": {
"app": "papra",
"containers": [
{
"diff_added": 175,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 176,
"diff_unresolved": [],
"exit": 137,
"gid": null,
"health": "unhealthy",
"image": "ghcr.io/papra-hq/papra:26.6.2-rootless",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-papra_papra_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-papra_papra_data/_data",
"target": "/app/app-data",
"writable_by_app": "unknown-uid"
}
],
"name": "papra",
"restarts": null,
"status": "restarting",
"uid": null
}
],
"declared_volumes": [
"papra_data"
],
"env_keys": [
"AUTH_SECRET",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [],
"fixture": null,
"ports": [
1221
]
},
"reasons": [
"papra: not running (status=restarting exit=137 restarts=None)"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,10 @@
{
"probe": {
"app": "plant-it",
"error": "no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\nError response from daemon: pull access denied for msdeluise/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\n)"
},
"reasons": [
"no containers created (compose up rc=18: se/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\nError response from daemon: pull access denied for msdeluise/plant-it, repository does not exist or may require 'docker login': denied: requested access to the resource is denied\n)"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,176 @@
{
"probe": {
"app": "plex",
"containers": [
{
"diff_added": 63,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
".firstRunComplete"
],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
".firstRunComplete"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/etc",
"files": [
"cont-init.d",
"services.d"
]
},
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/etc/cont-init.d",
"files": [
"40-plex-first-run",
"45-plex-hw-transcode-and-connected-tuner",
"50-plex-update"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/services.d",
"files": [
"plex"
]
},
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/etc/services.d/plex",
"files": [
"finish",
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 74,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "plexinc/pms-docker:1.41.4.9463-630c9f557",
"mounts": [
{
"class": "bind",
"files": 4,
"name": null,
"sample": [
"books/metadata.db-wal",
"books/metadata.db",
"books/metadata.db-shm",
"metube/Big_Buck_Bunny_360_10s_1MB.mp4"
],
"source": "/srv/felhom-gate/hdd/userdata/media",
"target": "/media",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-plex_plex_transcode",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-plex_plex_transcode/_data",
"target": "/transcode",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 82,
"name": "volgate-plex_plex_config",
"sample": [
"Library/Application Support/Plex Media Server/Preferences.xml",
"Library/Application Support/Plex Media Server/plexmediaserver.pid",
"Library/Application Support/Plex Media Server/Setup Plex.html",
"Library/Application Support/Plex Media Server/.LocalAdminToken",
"Library/Application Support/Plex Media Server/Codecs/.device-id",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/org.musicbrainz.agents.music/Albums.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/org.musicbrainz.agents.music/Artists.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.imdb/Movies.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.lastfm/Albums.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.lastfm/Artists.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.thetvdb/TV Shows.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/tv.plex.agents.music/Albums.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/tv.plex.agents.music/Artists.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.themoviedb/Movies.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.none/Movies.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.none/Albums.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.none/Artists.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.none/TV Shows.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.localmedia/Movies.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.localmedia/Albums.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.localmedia/Artists.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Metadata Combination/com.plexapp.agents.localmedia/TV Shows.xml",
"Library/Application Support/Plex Media Server/Plug-in Support/Caches/com.plexapp.agents.imdb/HTTP.system/CacheInfo",
"Library/Application Support/Plex Media Server/Plug-in Support/Caches/com.plexapp.agents.localmedia/HTTP.system/CacheInfo",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/org.musicbrainz.agents.music/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/org.musicbrainz.agents.music/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.lyricfind/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.lyricfind/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.movieposterdb/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.movieposterdb/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.htbackdrops/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.htbackdrops/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.imdb/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.imdb/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.lastfm/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.lastfm/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.thetvdb/HTTPCookies",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.agents.thetvdb/StoredValues",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.system/Dict",
"Library/Application Support/Plex Media Server/Plug-in Support/Data/com.plexapp.system/HTTPCookies"
],
"source": "/var/lib/docker/volumes/volgate-plex_plex_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "plex",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"plex_config",
"plex_transcode"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"PLEX_CLAIM",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:32400/ -> 200",
"fixture NoRoute: seed returned nothing (tried: the first-run claim needs a token minted at plex.tv by a real Plex account; no account exists for this venue) \u2014 plex: no non-browser seed route \u2014 the first-run claim needs a token minted at plex.tv by a real Plex account; no account exists for this venue"
],
"fixture": "fixture NoRoute: seed returned nothing (tried: the first-run claim needs a token minted at plex.tv by a real Plex account; no account exists for this venue) \u2014 plex: no non-browser seed route \u2014 the first-run claim needs a token minted at plex.tv by a real Plex account; no account exists for this venue",
"ports": [
32400
]
},
"reasons": [
"plex: declared volume /transcode is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,104 @@
{
"probe": {
"app": "privatebin",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 82,
"health": "healthy",
"image": "privatebin/pdo:2.0.6",
"mounts": [
{
"class": "named-declared",
"files": 5,
"name": "volgate-privatebin_privatebin_data",
"sample": [
"traffic_limiter.php",
"salt.php",
"purge_limiter.php",
".htaccess",
"26/0c/260cce3d99910079.php"
],
"source": "/var/lib/docker/volumes/volgate-privatebin_privatebin_data/_data",
"target": "/srv/data",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 14,
"name": "7eb4e7f20411a82cdac9c3704a0f2d963b055c0fb16b3061595d9727c140ee64",
"sample": [
"nginx.pid",
"php-fpm.sock",
"services/nginx/run",
"services/nginx/supervise/control",
"services/nginx/supervise/death_tally",
"services/nginx/supervise/status",
"services/nginx/supervise/lock",
"services/.s6-svscan/control",
"services/.s6-svscan/lock",
"services/php-fpm85/run",
"services/php-fpm85/supervise/control",
"services/php-fpm85/supervise/death_tally",
"services/php-fpm85/supervise/status",
"services/php-fpm85/supervise/lock"
],
"source": "/var/lib/docker/volumes/7eb4e7f20411a82cdac9c3704a0f2d963b055c0fb16b3061595d9727c140ee64/_data",
"target": "/run",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 0,
"name": "bf4b15e53ba87a7f8a4077ecefc4fbe9956af355f85d44612981763a579b77fe",
"sample": [],
"source": "/var/lib/docker/volumes/bf4b15e53ba87a7f8a4077ecefc4fbe9956af355f85d44612981763a579b77fe/_data",
"target": "/tmp",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 0,
"name": "24726ad13c5aae4968b89fb34d33e56f9bd4977d82b37f239790fcbd4d364128",
"sample": [],
"source": "/var/lib/docker/volumes/24726ad13c5aae4968b89fb34d33e56f9bd4977d82b37f239790fcbd4d364128/_data",
"target": "/var/lib/nginx/tmp",
"writable_by_app": "yes"
}
],
"name": "privatebin",
"restarts": null,
"status": "running",
"uid": 65534
}
],
"declared_volumes": [
"privatebin_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8080/ -> 200",
"fixture PrivateBin: seed OK \u2014 privatebin: seeded paste id=260cce3d99910079"
],
"fixture": "fixture PrivateBin: seed OK \u2014 privatebin: seeded paste id=260cce3d99910079",
"ports": [
8080
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,157 @@
{
"probe": {
"app": "radarr",
"containers": [
{
"diff_added": 207,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"downloads"
],
"changed_count": 5,
"db_signature": false,
"dir": "/",
"files": [
"downloads"
]
},
{
"added": [],
"changed_count": 4,
"db_signature": false,
"dir": "/etc",
"files": [
"crontabs",
"group-",
"s6-overlay",
"passwd-"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/crontabs",
"files": [
"root"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay",
"files": [
"s6-rc.d"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d",
"files": [
"init-adduser"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d/init-adduser",
"files": [
"branding"
]
}
],
"diff_token_dirs": [
{
"added": [
"movies"
],
"changed_count": 0,
"db_signature": false,
"dir": "/media",
"files": [
"movies"
]
}
],
"diff_total": 222,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "lscr.io/linuxserver/radarr:6.4.4",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/movies",
"target": "/media/movies",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/downloads",
"target": "/downloads",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 9,
"name": "volgate-radarr_radarr_config",
"sample": [
"radarr.pid",
"logs.db",
"radarr.db-wal",
"radarr.db-shm",
"radarr.db",
"config.xml",
"logs/radarr.debug.txt",
"logs/radarr.txt",
"asp/key-9e066fdb-a00e-470f-970d-5e947dfa0e1c.xml"
],
"source": "/var/lib/docker/volumes/volgate-radarr_radarr_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "radarr",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"radarr_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:7878/ -> 200"
],
"fixture": null,
"ports": [
7878
]
},
"reasons": [
"radarr: writable-layer writes at /media (path suggests state, no database signature \u2014 judgement needed): ['movies']"
],
"verdict": "CLEAN"
}
@@ -0,0 +1,59 @@
{
"probe": {
"app": "radicale",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghcr.io/kozea/radicale:3.8.1",
"mounts": [
{
"class": "named-declared",
"files": 1,
"name": "volgate-radicale_radicale_data",
"sample": [
"users"
],
"source": "/var/lib/docker/volumes/volgate-radicale_radicale_data/_data",
"target": "/var/lib/radicale",
"writable_by_app": "yes"
}
],
"name": "radicale",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"radicale_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"RADICALE_PASSWORD",
"RADICALE_USER",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:5232/ -> 302"
],
"fixture": null,
"ports": [
5232
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,164 @@
{
"probe": {
"app": "rallly",
"containers": [
{
"diff_added": 6,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"apps"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/apps",
"files": [
"web"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/apps/web",
"files": [
".next"
]
}
],
"diff_token_dirs": [],
"diff_total": 11,
"diff_unresolved": [],
"exit": 0,
"gid": 101,
"health": "healthy",
"image": "lukevella/rallly:4.15.3",
"mounts": [],
"name": "rallly",
"restarts": null,
"status": "running",
"uid": 100
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:18-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1607,
"name": "volgate-rallly_rallly_postgres_data",
"sample": [
"18/docker/pg_ident.conf",
"18/docker/pg_hba.conf",
"18/docker/postmaster.pid",
"18/docker/postgresql.conf",
"18/docker/PG_VERSION",
"18/docker/postgresql.auto.conf",
"18/docker/postmaster.opts",
"18/docker/base/5/2612",
"18/docker/base/5/1418",
"18/docker/base/5/6117",
"18/docker/base/5/13510_fsm",
"18/docker/base/5/2655",
"18/docker/base/5/3609",
"18/docker/base/5/2662",
"18/docker/base/5/2683",
"18/docker/base/5/2832",
"18/docker/base/5/2679",
"18/docker/base/5/2608_vm",
"18/docker/base/5/2673",
"18/docker/base/5/2690",
"18/docker/base/5/2336",
"18/docker/base/5/2754",
"18/docker/base/5/2701",
"18/docker/base/5/4168",
"18/docker/base/5/2650",
"18/docker/base/5/2839",
"18/docker/base/5/2688",
"18/docker/base/5/2840",
"18/docker/base/5/1247_fsm",
"18/docker/base/5/3997",
"18/docker/base/5/3456_vm",
"18/docker/base/5/2667",
"18/docker/base/5/2678",
"18/docker/base/5/2696",
"18/docker/base/5/3456",
"18/docker/base/5/2228",
"18/docker/base/5/1259_fsm",
"18/docker/base/5/6351",
"18/docker/base/5/6106",
"18/docker/base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-rallly_rallly_postgres_data/_data",
"target": "/var/lib/postgresql",
"writable_by_app": "yes"
}
],
"name": "rallly-postgres",
"restarts": null,
"status": "running",
"uid": 70
}
],
"declared_volumes": [
"rallly_postgres_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_PASSWORD",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 200",
"192.168.240.3:3000/ -> 200"
],
"fixture": null,
"ports": [
3000
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,113 @@
{
"probe": {
"app": "recipe-importer",
"containers": [
{
"diff_added": 14,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"data"
],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"data"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"app"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local",
"files": [
"lib"
]
}
],
"diff_token_dirs": [],
"diff_total": 25,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "gitea.dooplex.hu/admin/recipe-importer:v0.9.11",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-recipeimporter_recipe_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-recipeimporter_recipe_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "recipe-importer",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"recipe_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8000/ -> 302",
"172.18.0.2:8000/ -> 200",
"172.18.0.2:8000/login -> 404",
"172.18.0.2:8000/setup -> 404",
"172.18.0.2:8000/signup -> 404",
"172.18.0.2:8000/register -> 404",
"172.18.0.2:8000/install -> 404",
"172.18.0.2:8000/admin -> 404",
"172.18.0.2:8000/api/health -> 404",
"172.18.0.2:8000/health -> 200",
"172.18.0.2:8000/healthz -> 404",
"172.18.0.2:8000/status -> 404",
"172.18.0.2:8000/web -> 404",
"172.18.0.2:8000/index.php -> 404",
"172.18.0.2:8000/dashboard -> 404"
],
"fixture": null,
"ports": [
8000
]
},
"reasons": [
"NOTHING this app wrote landed in ANY folder the template preserves: all 1 mount(s) across 1 container(s) are empty, yet entries were created in ['/']. Needs adjudication.",
"recipe-importer: declared volume /data is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"recipe-importer: this container's mounts are all empty while it created entries in ['/'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,253 @@
{
"probe": {
"app": "romm",
"containers": [
{
"diff_added": 14,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"etc",
"root"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc",
"files": [
"nginx"
]
},
{
"added": [
".gunicorn"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".gunicorn"
]
},
{
"added": [
"gunicorn.ctl"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.gunicorn",
"files": [
"gunicorn.ctl"
]
}
],
"diff_token_dirs": [],
"diff_total": 20,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "rommapp/romm:5.3.1",
"mounts": [
{
"class": "named-declared",
"files": 1,
"name": "volgate-romm_romm_config",
"sample": [
"config.yml"
],
"source": "/var/lib/docker/volumes/volgate-romm_romm_config/_data",
"target": "/romm/config",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 0,
"name": "31468144ed55da1c8bdb6ad0b92cb853ddb07e3fb19c331b0da029ff16059249",
"sample": [],
"source": "/var/lib/docker/volumes/31468144ed55da1c8bdb6ad0b92cb853ddb07e3fb19c331b0da029ff16059249/_data",
"target": "/redis-data",
"writable_by_app": "yes"
},
{
"class": "anonymous",
"files": 0,
"name": "a74329f8446959f3471049d810da801e405c77cb541b14a9547c94d460307db9",
"sample": [],
"source": "/var/lib/docker/volumes/a74329f8446959f3471049d810da801e405c77cb541b14a9547c94d460307db9/_data",
"target": "/romm",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/roms",
"target": "/romm/library",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/appdata/romm/resources",
"target": "/romm/resources",
"writable_by_app": "yes"
}
],
"name": "romm",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 999,
"health": "healthy",
"image": "mariadb:11.8",
"mounts": [
{
"class": "named-declared",
"files": 302,
"name": "volgate-romm_romm_db_data",
"sample": [
"tc.log",
".my-healthcheck.cnf",
"aria_log.00000001",
"aria_log_control",
"undo001",
"ibtmp1",
"ib_buffer_pool",
"ibdata1",
"undo002",
"multi-master.info",
"mariadb_upgrade_info",
"ddl_recovery.log",
"ib_logfile0",
"undo003",
"romm/roms_facets_after_insert.TRN",
"romm/music_playlists.frm",
"romm/collections.ibd",
"romm/streaming_container_adoptions.ibd",
"romm/devices.ibd",
"romm/smart_collections.frm",
"romm/virtual_collection_roms.ibd",
"romm/FTS_000000000000009c_DELETED.ibd",
"romm/FTS_000000000000009c_BEING_DELETED_CACHE.ibd",
"romm/rom_identity_keys_au.TRN",
"romm/saves.ibd",
"romm/track_meta.frm",
"romm/screenshots.frm",
"romm/permission_group_grants.ibd",
"romm/streaming_container_adoptions.frm",
"romm/rom_user.ibd",
"romm/device_save_sync.frm",
"romm/rom_similarity.ibd",
"romm/rom_identity_keys.ibd",
"romm/users.ibd",
"romm/virtual_collections.frm",
"romm/FTS_000000000000009c_0000000000000200_INDEX_1.ibd",
"romm/firmware.ibd",
"romm/screenshots.ibd",
"romm/rom_file_doc_meta.frm",
"romm/FTS_000000000000009c_DELETED_CACHE.ibd"
],
"source": "/var/lib/docker/volumes/volgate-romm_romm_db_data/_data",
"target": "/var/lib/mysql",
"writable_by_app": "yes"
}
],
"name": "romm-db",
"restarts": null,
"status": "running",
"uid": 999
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "redis:7-alpine",
"mounts": [
{
"class": "named-declared",
"files": 4,
"name": "volgate-romm_romm_redis_data",
"sample": [
"dump.rdb",
"appendonlydir/appendonly.aof.1.incr.aof",
"appendonlydir/appendonly.aof.manifest",
"appendonlydir/appendonly.aof.1.base.rdb"
],
"source": "/var/lib/docker/volumes/volgate-romm_romm_redis_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "romm-redis",
"restarts": null,
"status": "running",
"uid": 999
}
],
"declared_volumes": [
"romm_config",
"romm_db_data",
"romm_redis_data"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"MYSQL_ROOT_PASSWORD",
"ROMM_AUTH_SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8080/ -> 200",
"172.19.0.4:8080/ -> 200"
],
"fixture": null,
"ports": [
8080
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,67 @@
{
"probe": {
"app": "seerr",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "fallenbagel/jellyseerr:2.7.3",
"mounts": [
{
"class": "named-declared",
"files": 11,
"name": "volgate-seerr_seerr_config",
"sample": [
"DOCKER",
"settings.json",
"logs/.20136e5b8544ec13f7fc29ce3d35150d597108bb-audit.json",
"logs/jellyseerr.log",
"logs/.machinelogs-2026-10-02.json",
"logs/.4295fcfc416647ffc3751a1d488b45a096cf2d4f-audit.json",
"logs/jellyseerr-2026-10-02.log",
"logs/.machinelogs.json",
"db/db.sqlite3",
"db/db.sqlite3-shm",
"db/db.sqlite3-wal"
],
"source": "/var/lib/docker/volumes/volgate-seerr_seerr_config/_data",
"target": "/app/config",
"writable_by_app": "yes"
}
],
"name": "seerr",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"seerr_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:5055/ -> 307"
],
"fixture": null,
"ports": [
5055
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,159 @@
{
"probe": {
"app": "sonarr",
"containers": [
{
"diff_added": 209,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"downloads"
],
"changed_count": 5,
"db_signature": false,
"dir": "/",
"files": [
"downloads"
]
},
{
"added": [],
"changed_count": 4,
"db_signature": false,
"dir": "/etc",
"files": [
"passwd-",
"s6-overlay",
"crontabs",
"group-"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/crontabs",
"files": [
"root"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay",
"files": [
"s6-rc.d"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d",
"files": [
"init-adduser"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc/s6-overlay/s6-rc.d/init-adduser",
"files": [
"branding"
]
}
],
"diff_token_dirs": [
{
"added": [
"tv"
],
"changed_count": 0,
"db_signature": false,
"dir": "/media",
"files": [
"tv"
]
}
],
"diff_total": 224,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "lscr.io/linuxserver/sonarr:4.0.20",
"mounts": [
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/media/tv",
"target": "/media/tv",
"writable_by_app": "yes"
},
{
"class": "bind",
"files": 0,
"name": null,
"sample": [],
"source": "/srv/felhom-gate/hdd/userdata/downloads",
"target": "/downloads",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 11,
"name": "volgate-sonarr_sonarr_config",
"sample": [
"sonarr.db-shm",
"sonarr.pid",
"logs.db",
"sonarr.db-wal",
"config.xml",
"logs.db-shm",
"logs.db-wal",
"sonarr.db",
"logs/sonarr.txt",
"logs/sonarr.debug.txt",
"asp/key-6ffba64a-2d7f-4565-9e2c-76f140125460.xml"
],
"source": "/var/lib/docker/volumes/volgate-sonarr_sonarr_config/_data",
"target": "/config",
"writable_by_app": "yes"
}
],
"name": "sonarr",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"sonarr_config"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8989/ -> 200"
],
"fixture": null,
"ports": [
8989
]
},
"reasons": [
"sonarr: writable-layer writes at /media (path suggests state, no database signature \u2014 judgement needed): ['tv']"
],
"verdict": "CLEAN"
}
@@ -0,0 +1,237 @@
{
"probe": {
"app": "sparkyfitness",
"containers": [
{
"diff_added": 11,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"var",
"etc",
"run"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc",
"files": [
"nginx"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"cache"
]
}
],
"diff_token_dirs": [],
"diff_total": 19,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "codewithcj/sparkyfitness:v0.17.3",
"mounts": [],
"name": "sparkyfitness",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:18-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1822,
"name": "volgate-sparkyfitness_sparkyfitness_db_data",
"sample": [
"data/pgdata/pg_ident.conf",
"data/pgdata/pg_hba.conf",
"data/pgdata/postmaster.pid",
"data/pgdata/postgresql.conf",
"data/pgdata/PG_VERSION",
"data/pgdata/postgresql.auto.conf",
"data/pgdata/postmaster.opts",
"data/pgdata/base/5/2612",
"data/pgdata/base/5/1418",
"data/pgdata/base/5/6117",
"data/pgdata/base/5/13510_fsm",
"data/pgdata/base/5/2655",
"data/pgdata/base/5/3609",
"data/pgdata/base/5/2662",
"data/pgdata/base/5/2683",
"data/pgdata/base/5/2832",
"data/pgdata/base/5/2679",
"data/pgdata/base/5/2608_vm",
"data/pgdata/base/5/2673",
"data/pgdata/base/5/2690",
"data/pgdata/base/5/2336",
"data/pgdata/base/5/2754",
"data/pgdata/base/5/2701",
"data/pgdata/base/5/4168",
"data/pgdata/base/5/2650",
"data/pgdata/base/5/2839",
"data/pgdata/base/5/2688",
"data/pgdata/base/5/2840",
"data/pgdata/base/5/1247_fsm",
"data/pgdata/base/5/3997",
"data/pgdata/base/5/3456_vm",
"data/pgdata/base/5/2667",
"data/pgdata/base/5/2678",
"data/pgdata/base/5/2696",
"data/pgdata/base/5/3456",
"data/pgdata/base/5/2228",
"data/pgdata/base/5/1259_fsm",
"data/pgdata/base/5/6351",
"data/pgdata/base/5/6106",
"data/pgdata/base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-sparkyfitness_sparkyfitness_db_data/_data",
"target": "/var/lib/postgresql",
"writable_by_app": "yes"
}
],
"name": "sparkyfitness-db",
"restarts": null,
"status": "running",
"uid": 70
},
{
"diff_added": 392,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"app"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"SparkyFitnessServer"
]
},
{
"added": [
"backup",
"temp_uploads",
"uploads"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app/SparkyFitnessServer",
"files": [
"backup",
"temp_uploads",
"uploads"
]
}
],
"diff_token_dirs": [],
"diff_total": 395,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "codewithcj/sparkyfitness_server:v0.17.3",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-sparkyfitness_sparkyfitness_backup",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-sparkyfitness_sparkyfitness_backup/_data",
"target": "/app/SparkyFitnessServer/backup",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-sparkyfitness_sparkyfitness_uploads",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-sparkyfitness_sparkyfitness_uploads/_data",
"target": "/app/SparkyFitnessServer/uploads",
"writable_by_app": "yes"
}
],
"name": "sparkyfitness-server",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"sparkyfitness_backup",
"sparkyfitness_db_data",
"sparkyfitness_uploads"
],
"env_keys": [
"API_ENCRYPTION_KEY",
"APP_DB_PASSWORD",
"BETTER_AUTH_SECRET",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 200",
"172.20.0.4:80/ -> 200",
"fixture Sparkyfitness: seed OK \u2014 sparkyfitness: seeded user drill4cb3a4 with a weight of 64.59 on 2026-09-01"
],
"fixture": "fixture Sparkyfitness: seed OK \u2014 sparkyfitness: seeded user drill4cb3a4 with a weight of 64.59 on 2026-09-01",
"ports": [
80
]
},
"reasons": [
"sparkyfitness-server: declared volume /app/SparkyFitnessServer/backup is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"sparkyfitness-server: declared volume /app/SparkyFitnessServer/uploads is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"sparkyfitness-server: this container's mounts are all empty while it created entries in ['/app/SparkyFitnessServer'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,292 @@
{
"probe": {
"app": "tandoor",
"containers": [
{
"diff_added": 443,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 3,
"db_signature": false,
"dir": "/",
"files": [
"root",
"opt",
"usr"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/opt",
"files": [
"recipes"
]
},
{
"added": [
"mediafiles",
"staticfiles"
],
"changed_count": 3,
"db_signature": false,
"dir": "/opt/recipes",
"files": [
"mediafiles",
"staticfiles"
]
},
{
"added": [],
"changed_count": 7,
"db_signature": false,
"dir": "/opt/recipes/cookbook",
"files": [
"views",
"connectors",
"migrations",
"provider",
"templatetags",
"integration",
"helper"
]
},
{
"added": [
"Recipes.conf"
],
"changed_count": 0,
"db_signature": false,
"dir": "/opt/recipes/http.d",
"files": [
"Recipes.conf"
]
},
{
"added": [
".gunicorn"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".gunicorn"
]
},
{
"added": [
"gunicorn.ctl"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.gunicorn",
"files": [
"gunicorn.ctl"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"local"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/local",
"files": [
"lib"
]
}
],
"diff_token_dirs": [],
"diff_total": 493,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"mounts": [
{
"class": "named-declared",
"files": 3359,
"name": "volgate-tandoor_tandoor_static",
"sample": [
"staticfiles.json",
"assets/logo_color_shopping_144.png",
"assets/logo_black.svg",
"assets/logo_color_180.png",
"assets/logo_color_shopping_512.6b2e69402327.png",
"assets/brand_logo.ad2e3aa263da.svg.gz",
"assets/logo_color_180.0fcae5e85a72.png",
"assets/logo_black.dc487b18028c.svg.gz",
"assets/brand_logo.ad2e3aa263da.svg",
"assets/brand_logo_white.svg",
"assets/logo_color_svg.svg.gz",
"assets/logo_color_144.png",
"assets/logo_color_svg.d7c2e31a63b7.svg",
"assets/header.48e8ad9e7540.svg.gz",
"assets/spinner.168a09fd2600.svg.gz",
"assets/spinner.168a09fd2600.svg",
"assets/recipe_no_image.c659e2604ad6.svg",
"assets/logo_color_shopping.svg.gz",
"assets/logo_color_144.f09537dbf142.png",
"assets/brand_logo.svg.gz",
"assets/logo_color_plan.4ccbb336af9d.svg.gz",
"assets/brand_logo.6ebe02bf6707.png",
"assets/logo_black.dc487b18028c.svg",
"assets/logo_color_32.b7d9707eac91.png",
"assets/logo_color_32.png",
"assets/logo_black.svg.gz",
"assets/logo_color_plan_512.png",
"assets/header.svg",
"assets/logo_color_plan.4ccbb336af9d.svg",
"assets/logo_color_512.png",
"assets/logo_color_shopping.svg",
"assets/logo_color_shopping.fd1e81a4dcab.svg",
"assets/logo_color_shopping_144.6c05e01d07b2.png",
"assets/recipe_no_image.svg",
"assets/logo_color_shopping_512.png",
"assets/logo_color_192.c9b9177ff941.png",
"assets/logo_color_128.a90db52449d9.png",
"assets/logo_color_plan_144.png",
"assets/spinner.svg",
"assets/brand_logo.svg"
],
"source": "/var/lib/docker/volumes/volgate-tandoor_tandoor_static/_data",
"target": "/opt/recipes/staticfiles",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-tandoor_tandoor_media",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-tandoor_tandoor_media/_data",
"target": "/opt/recipes/mediafiles",
"writable_by_app": "yes"
}
],
"name": "tandoor",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:17-alpine",
"mounts": [
{
"class": "named-declared",
"files": 2003,
"name": "volgate-tandoor_tandoor_postgres_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/2612",
"base/5/1418",
"base/5/6117",
"base/5/13510_fsm",
"base/5/2655",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/13500_vm",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm",
"base/5/6106",
"base/5/3433"
],
"source": "/var/lib/docker/volumes/volgate-tandoor_tandoor_postgres_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "tandoor-postgres",
"restarts": null,
"status": "running",
"uid": 70
}
],
"declared_volumes": [
"tandoor_media",
"tandoor_postgres_data",
"tandoor_static"
],
"env_keys": [
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 400",
"172.23.0.3:80/ -> 400",
"fixture Django: seed OK \u2014 tandoor: seeded superuser drill425a04"
],
"fixture": "fixture Django: seed OK \u2014 tandoor: seeded superuser drill425a04",
"ports": [
80
]
},
"reasons": [
"tandoor: declared volume /opt/recipes/mediafiles is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,99 @@
{
"probe": {
"app": "termix",
"containers": [
{
"diff_added": 9,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"app",
"etc"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"html"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app/html",
"files": [
"sw.js"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/etc",
"files": [
"group-"
]
}
],
"diff_token_dirs": [],
"diff_total": 17,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "ghcr.io/lukegus/termix:2.8.0",
"mounts": [
{
"class": "named-declared",
"files": 5,
"name": "volgate-termix_termix_data",
"sample": [
".env",
"db.sqlite.encrypted",
"opkssh/version.txt",
"opkssh/checksum.txt",
"opkssh/opkssh-linux-amd64"
],
"source": "/var/lib/docker/volumes/volgate-termix_termix_data/_data",
"target": "/app/data",
"writable_by_app": "yes"
}
],
"name": "termix",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"termix_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8080/ -> 200"
],
"fixture": null,
"ports": [
8080
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,80 @@
{
"probe": {
"app": "uptime-kuma",
"containers": [
{
"diff_added": 4,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"var",
"run"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/var",
"files": [
"cache"
]
}
],
"diff_token_dirs": [],
"diff_total": 8,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "louislam/uptime-kuma:2.5.5",
"mounts": [
{
"class": "named-declared",
"files": 4,
"name": "volgate-uptimekuma_uptime_kuma_data",
"sample": [
"kuma.db",
"kuma.db-shm",
"db-config.json",
"kuma.db-wal"
],
"source": "/var/lib/docker/volumes/volgate-uptimekuma_uptime_kuma_data/_data",
"target": "/app/data",
"writable_by_app": "yes"
}
],
"name": "uptime-kuma",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"uptime_kuma_data"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3001/ -> 302"
],
"fixture": null,
"ports": [
3001
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,62 @@
{
"probe": {
"app": "vaultwarden",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "vaultwarden/server:1.36.0-alpine",
"mounts": [
{
"class": "named-declared",
"files": 4,
"name": "volgate-vaultwarden_vaultwarden_data",
"sample": [
"db.sqlite3",
"db.sqlite3-shm",
"rsa_key.pem",
"db.sqlite3-wal"
],
"source": "/var/lib/docker/volumes/volgate-vaultwarden_vaultwarden_data/_data",
"target": "/data",
"writable_by_app": "yes"
}
],
"name": "vaultwarden",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"vaultwarden_data"
],
"env_keys": [
"ADMIN_TOKEN",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SIGNUPS_ALLOWED",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:80/ -> 200"
],
"fixture": null,
"ports": [
80
]
},
"reasons": [],
"verdict": "CLEAN"
}
@@ -0,0 +1,105 @@
{
"probe": {
"app": "vikunja",
"containers": [
{
"diff_added": 4,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"db"
],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"db"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/app",
"files": [
"vikunja"
]
},
{
"added": [
"files"
],
"changed_count": 0,
"db_signature": false,
"dir": "/app/vikunja",
"files": [
"files"
]
}
],
"diff_token_dirs": [],
"diff_total": 6,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": null,
"image": "vikunja/vikunja:2.6.0",
"mounts": [
{
"class": "named-declared",
"files": 3,
"name": "volgate-vikunja_vikunja_db",
"sample": [
"vikunja.db-wal",
"vikunja.db",
"vikunja.db-shm"
],
"source": "/var/lib/docker/volumes/volgate-vikunja_vikunja_db/_data",
"target": "/db",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-vikunja_vikunja_data",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-vikunja_vikunja_data/_data",
"target": "/app/vikunja/files",
"writable_by_app": "yes"
}
],
"name": "vikunja",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"vikunja_data",
"vikunja_db"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH",
"VIKUNJA_SERVICE_JWTSECRET"
],
"exercise": [
"172.18.0.2:3456/ -> 200",
"fixture Vikunja: seed OK \u2014 vikunja: create project http=201"
],
"fixture": "fixture Vikunja: seed OK \u2014 vikunja: create project http=201",
"ports": [
3456
]
},
"reasons": [
"vikunja: declared volume /app/vikunja/files is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,202 @@
{
"probe": {
"app": "wanderer",
"containers": [
{
"diff_added": 6,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"root"
]
},
{
"added": [
".npm"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".npm"
]
}
],
"diff_token_dirs": [],
"diff_total": 8,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "unhealthy",
"image": "flomp/wanderer-web:v0.20.0",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-wanderer_wanderer_uploads",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-wanderer_wanderer_uploads/_data",
"target": "/app/uploads",
"writable_by_app": "yes"
}
],
"name": "wanderer",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 3,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [
"pb_data",
"data"
],
"changed_count": 0,
"db_signature": false,
"dir": "/",
"files": [
"pb_data",
"data"
]
}
],
"diff_token_dirs": [
{
"added": [
"plugins"
],
"changed_count": 0,
"db_signature": false,
"dir": "/data",
"files": [
"plugins"
]
}
],
"diff_total": 3,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "flomp/wanderer-db:v0.20.0",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-wanderer_wanderer_plugins",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-wanderer_wanderer_plugins/_data",
"target": "/data/plugins",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 6,
"name": "volgate-wanderer_wanderer_data",
"sample": [
"auxiliary.db-shm",
"data.db-wal",
"auxiliary.db-wal",
"auxiliary.db",
"data.db-shm",
"data.db"
],
"source": "/var/lib/docker/volumes/volgate-wanderer_wanderer_data/_data",
"target": "/pb_data",
"writable_by_app": "yes"
}
],
"name": "wanderer-db",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "getmeili/meilisearch:v1.36.0",
"mounts": [
{
"class": "named-declared",
"files": 11,
"name": "volgate-wanderer_wanderer_meili_data",
"sample": [
"data.ms/VERSION",
"data.ms/tasks/lock.mdb",
"data.ms/tasks/data.mdb",
"data.ms/auth/lock.mdb",
"data.ms/auth/data.mdb",
"data.ms/indexes/4e83ddf5-89a0-4d4e-9362-1fb63168a68a/lock.mdb",
"data.ms/indexes/4e83ddf5-89a0-4d4e-9362-1fb63168a68a/data.mdb",
"data.ms/indexes/788ef67d-3283-4fca-83ae-262af6bd7ddd/lock.mdb",
"data.ms/indexes/788ef67d-3283-4fca-83ae-262af6bd7ddd/data.mdb",
"data.ms/indexes/61e46453-f5a8-45b1-97ab-749e8ff8ed7e/lock.mdb",
"data.ms/indexes/61e46453-f5a8-45b1-97ab-749e8ff8ed7e/data.mdb"
],
"source": "/var/lib/docker/volumes/volgate-wanderer_wanderer_meili_data/_data",
"target": "/meili_data",
"writable_by_app": "yes"
}
],
"name": "wanderer-search",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"wanderer_data",
"wanderer_meili_data",
"wanderer_plugins",
"wanderer_uploads"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"MEILI_MASTER_KEY",
"POCKETBASE_ENCRYPTION_KEY",
"SUBDOMAIN",
"SUBDOMAIN_DB",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.3:3000/ -> 500",
"172.24.0.4:3000/ -> 500",
"172.18.0.2:8090/ -> 404",
"172.24.0.3:8090/ -> 404"
],
"fixture": null,
"ports": [
3000,
8090
]
},
"reasons": [
"wanderer: unhealthy",
"wanderer: declared volume /app/uploads is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"wanderer-db: declared volume /data/plugins is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"wanderer: this container's mounts are all empty while it created entries in ['/root'] \u2014 benign when a sibling container holds the state, worth a look when none does",
"wanderer-db: writable-layer writes at /data (path suggests state, no database signature \u2014 judgement needed): ['plugins']"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,73 @@
{
"probe": {
"app": "wger",
"containers": [
{
"diff_added": 0,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [],
"diff_token_dirs": [],
"diff_total": 0,
"diff_unresolved": [],
"exit": 0,
"gid": 1000,
"health": "healthy",
"image": "wger/server:2.7",
"mounts": [
{
"class": "named-declared",
"files": 2,
"name": "volgate-wger_wger_data",
"sample": [
"database.sqlite",
".felhom-jwt.env"
],
"source": "/var/lib/docker/volumes/volgate-wger_wger_data/_data",
"target": "/home/wger/db",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-wger_wger_media",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-wger_wger_media/_data",
"target": "/home/wger/media",
"writable_by_app": "yes"
}
],
"name": "wger",
"restarts": null,
"status": "running",
"uid": 1000
}
],
"declared_volumes": [
"wger_data",
"wger_media"
],
"env_keys": [
"ADMIN_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SECRET_KEY",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:8000/ -> 302",
"fixture Wger: seed OK \u2014 wger: POST /api/v2/weightentry/ http=201"
],
"fixture": "fixture Wger: seed OK \u2014 wger: POST /api/v2/weightentry/ http=201",
"ports": [
8000
]
},
"reasons": [
"wger: declared volume /home/wger/media is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,173 @@
{
"probe": {
"app": "wishlist",
"containers": [
{
"diff_added": 40,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 2,
"db_signature": false,
"dir": "/",
"files": [
"root",
"usr"
]
},
{
"added": [
".config",
".local"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root",
"files": [
".config",
".local"
]
},
{
"added": [
"caddy",
"prisma-nodejs"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.config",
"files": [
"caddy",
"prisma-nodejs"
]
},
{
"added": [
"autosave.json"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.config/caddy",
"files": [
"autosave.json"
]
},
{
"added": [
"commands.json"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.config/prisma-nodejs",
"files": [
"commands.json"
]
},
{
"added": [
"share"
],
"changed_count": 0,
"db_signature": false,
"dir": "/root/.local",
"files": [
"share"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr",
"files": [
"src"
]
},
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/usr/src",
"files": [
"app"
]
},
{
"added": [
"data",
"uploads"
],
"changed_count": 0,
"db_signature": false,
"dir": "/usr/src/app",
"files": [
"data",
"uploads"
]
}
],
"diff_token_dirs": [],
"diff_total": 50,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/cmintey/wishlist:v0.67.1",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-wishlist_wishlist_uploads",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-wishlist_wishlist_uploads/_data",
"target": "/usr/src/app/uploads",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 3,
"name": "volgate-wishlist_wishlist_data",
"sample": [
"prod.db-shm",
"prod.db",
"prod.db-wal"
],
"source": "/var/lib/docker/volumes/volgate-wishlist_wishlist_data/_data",
"target": "/usr/src/app/data",
"writable_by_app": "yes"
}
],
"name": "wishlist",
"restarts": null,
"status": "running",
"uid": 0
}
],
"declared_volumes": [
"wishlist_data",
"wishlist_uploads"
],
"env_keys": [
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 307",
"fixture Wishlist: seed OK \u2014 wishlist: /signup http=200 type=success"
],
"fixture": "fixture Wishlist: seed OK \u2014 wishlist: /signup http=200 type=success",
"ports": [
3000
]
},
"reasons": [
"wishlist: declared volume /usr/src/app/uploads is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,176 @@
{
"probe": {
"app": "zipline",
"containers": [
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"zipline"
]
},
{
"added": [
"public",
"uploads"
],
"changed_count": 0,
"db_signature": false,
"dir": "/zipline",
"files": [
"public",
"uploads"
]
}
],
"diff_token_dirs": [],
"diff_total": 3,
"diff_unresolved": [],
"exit": 0,
"gid": 0,
"health": "healthy",
"image": "ghcr.io/diced/zipline:4.8.0",
"mounts": [
{
"class": "named-declared",
"files": 0,
"name": "volgate-zipline_zipline_uploads",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-zipline_zipline_uploads/_data",
"target": "/zipline/uploads",
"writable_by_app": "yes"
},
{
"class": "named-declared",
"files": 0,
"name": "volgate-zipline_zipline_public",
"sample": [],
"source": "/var/lib/docker/volumes/volgate-zipline_zipline_public/_data",
"target": "/zipline/public",
"writable_by_app": "yes"
}
],
"name": "zipline",
"restarts": null,
"status": "running",
"uid": 0
},
{
"diff_added": 2,
"diff_benign_db_touches": [],
"diff_data_dirs": [],
"diff_other_dirs": [
{
"added": [],
"changed_count": 1,
"db_signature": false,
"dir": "/",
"files": [
"run"
]
}
],
"diff_token_dirs": [],
"diff_total": 4,
"diff_unresolved": [],
"exit": 0,
"gid": 70,
"health": "healthy",
"image": "postgres:16-alpine",
"mounts": [
{
"class": "named-declared",
"files": 1435,
"name": "volgate-zipline_zipline_postgres_data",
"sample": [
"pg_ident.conf",
"pg_hba.conf",
"postmaster.pid",
"postgresql.conf",
"PG_VERSION",
"postgresql.auto.conf",
"postmaster.opts",
"base/5/2612",
"base/5/1418",
"base/5/6117",
"base/5/2655",
"base/5/3609",
"base/5/2662",
"base/5/2683",
"base/5/2832",
"base/5/2679",
"base/5/2608_vm",
"base/5/2673",
"base/5/2690",
"base/5/2336",
"base/5/2754",
"base/5/2701",
"base/5/4168",
"base/5/2650",
"base/5/2839",
"base/5/2688",
"base/5/2840",
"base/5/1247_fsm",
"base/5/3997",
"base/5/3456_vm",
"base/5/2667",
"base/5/2678",
"base/5/2696",
"base/5/3456",
"base/5/2228",
"base/5/1259_fsm",
"base/5/6106",
"base/5/3433",
"base/5/4150",
"base/5/3606"
],
"source": "/var/lib/docker/volumes/volgate-zipline_zipline_postgres_data/_data",
"target": "/var/lib/postgresql/data",
"writable_by_app": "yes"
}
],
"name": "zipline-postgres",
"restarts": null,
"status": "running",
"uid": 70
}
],
"declared_volumes": [
"zipline_postgres_data",
"zipline_public",
"zipline_uploads"
],
"env_keys": [
"CORE_SECRET",
"DB_PASSWORD",
"DOMAIN",
"HDD_PATH",
"IMPORT_PATH",
"SUBDOMAIN",
"TZ",
"USERDATA_PATH"
],
"exercise": [
"172.18.0.2:3000/ -> 301",
"172.25.0.3:3000/ -> 301",
"fixture Zipline: seed OK \u2014 zipline: /api/setup http=200 :: {\"firstSetup\":false,\"user\":{\"id\":\"ay6n2g4wkn7i2kkg6dvag03n\",\"username\":\"drill52906a\",\"createdAt\":\"2026-10-02T14:18:38.794Z\","
],
"fixture": "fixture Zipline: seed OK \u2014 zipline: /api/setup http=200 :: {\"firstSetup\":false,\"user\":{\"id\":\"ay6n2g4wkn7i2kkg6dvag03n\",\"username\":\"drill52906a\",\"createdAt\":\"2026-10-02T14:18:38.794Z\",",
"ports": [
3000
]
},
"reasons": [
"zipline: declared volume /zipline/uploads is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"zipline: declared volume /zipline/public is EMPTY after the exercise \u2014 the app was not shown to write where the template preserves it",
"zipline: this container's mounts are all empty while it created entries in ['/zipline'] \u2014 benign when a sibling container holds the state, worth a look when none does"
],
"verdict": "UNDETERMINED"
}
@@ -0,0 +1,33 @@
# papra diagnosis 2026-10-02 ~14:30Z, bench 9401: docker run ghcr.io/papra-hq/papra:26.6.2-rootless, named volume at /app/app-data, dummy AUTH_SECRET, 60 s each; first with --memory 256m (the template's limit), then no limit
=== memory=256m
status=exited exit=137 oomkilled=true restarts=0
mem=0B / 0B
$ pnpm migrate:up:prod && pnpm start
$ tsx src/scripts/migrate-up.script.ts
Killed
/var/lib/docker/volumes/diagpapra-256m/_data:
db
documents
/var/lib/docker/volumes/diagpapra-256m/_data/db:
/var/lib/docker/volumes/diagpapra-256m/_data/documents:
=== memory=0
status=running exit=0 oomkilled=false restarts=0
mem=415.6MiB / 12GiB
{"level":"info","message":"Job rescheduled","timestampMs":1790951362359,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-expire-invitations","taskName":"expire-invitations","
{"level":"debug","message":"Consuming job","timestampMs":1790951362359,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expired
{"level":"info","message":"Found expired soft-deleted organizations to purge","timestampMs":1790951362360,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","organ
{"level":"info","message":"Purged expired soft-deleted organizations","timestampMs":1790951362360,"namespace":"organizations:tasks:purgeExpiredOrganizations","data":{"processMode":"all","purgedOrganiz
{"level":"info","message":"Job rescheduled","timestampMs":1790951362361,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-organizations","taskName":"purge-expire
{"level":"debug","message":"Consuming job","timestampMs":1790951362361,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-kv
{"level":"info","message":"Purged expired kv-store entries","timestampMs":1790951362362,"namespace":"kv-store:tasks:purgeExpiredEntries","data":{"processMode":"all","deletedCount":0}}
{"level":"info","message":"Job rescheduled","timestampMs":1790951362363,"namespace":"tasks:services","data":{"processMode":"all","jobId":"periodic-purge-expired-kv-entries","taskName":"purge-expired-k
/var/lib/docker/volumes/diagpapra-0/_data:
db
documents
/var/lib/docker/volumes/diagpapra-0/_data/db:
db.sqlite
/var/lib/docker/volumes/diagpapra-0/_data/documents:
@@ -0,0 +1,54 @@
+ date -u
Fri Oct 2 14:31:30 UTC 2026
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
9401 running volgate-sweep
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19536760 18829500 48.29%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 134196284 799156804 13.65%
+ pct exec 9401 -- bash -c 'docker logout 2>&1 | tail -1; ls /root/.docker/config.json 2>&1; docker ps -a --format {{.Names}} | wc -l; docker volume ls -q | grep -c ^volgate; docker volume ls -q | wc -l; docker image ls --format {{.Repository}}:{{.Tag}}'
Removing login credentials for https://index.docker.io/v1/
/root/.docker/config.json
0
0
3
felhom-volgate-canary:1
+ pct stop 9401
+ pct destroy 9401 --purge
purging CT 9401 from related configurations..
+ pct list
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
+ pct config 9401
+ head -1
Configuration file 'nodes/demo-hp/lxc/9401.conf' does not exist
+ ls /mnt/hdd_1/images/
9202
+ pvesm status
Name Type Status Total (KiB) Used (KiB) Available (KiB) %
felhom-pbs pbs active 0 0 0 0.00%
local dir active 40453376 19536688 18829572 48.29%
local-lvm lvmthin active 56487936 34954734 21533201 61.88%
nvme-scratch dir active 983379700 77370636 855982452 7.87%
+ rm -f /root/volgate-create.sh
+ ls /root/volgate-teardown.sh /root/du /root/dp
ls: cannot access '/root/du': No such file or directory
ls: cannot access '/root/dp': No such file or directory
/root/volgate-teardown.sh
ls: cannot access '/root/volgate-teardown.sh': No such file or directory
# Teardown statement, 2026-10-02 ~14:32Z
# machine: bench LXC 9401 (volgate-sweep) — docker logout done, 0 containers, 0 volgate-* volumes, 3 anonymous
# image volumes + the canary image left inside it, all removed with the rootfs by `pct destroy 9401 --purge`.
# host: demo-hp — `pct list` shows only 9201 + 9202 (both untouched all session); no 9401 config; /mnt/hdd_1/images/
# holds only 9202; nvme-scratch used 77370516 KiB before create -> 77370636 KiB after destroy (+120 KiB, back to
# baseline). local-lvm never used (34954734 KiB before and after). Helper scripts and credential files removed from
# /root on demo-hp; the Docker Hub credential files were shredded on DooPlex, demo-hp and in the bench right after login.
# hub: untouched (nothing provisioned there).
# no prune of any kind anywhere; nothing committed or pushed in any repo; catalog-wt copy not modified.
+7 -2
View File
@@ -899,7 +899,7 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-785** | **[P3-LOW] SparkyFitness is pinned 11 releases and a major behind upstream (v0.17.3; upstream v1.7.3, v1.6.0 dated 2026-07-24).** READ 2026-10-01 (`audits/visitors-2026-10-01/C/bench/C1-previous-tag.txt`). **Needs:** an update walk 0.17 → 1.x through the ladder (bench + box), after R-784 is decided. | **OPEN — rank P3-LOW; owner: CC (after R-784)** |
| **R-786** | **[P3-LOW] SparkyFitness's onboarding record has six open rows** (`app-catalog-felhom.eu/onboarding/sparkyfitness.md`): 0.5 runtime internet (food search providers), 0.7 the phone app's sign-in route through traefik, 1.6 the env names the server reads, 1.7 the entrypoint read, 5.4 a second memory watch at another limit, 8.3 no logo/screenshots on felhom.eu (404). Everything else measured this session (bench + 9202). **Needs:** each row measured, or n/a with a reason. | **READY — rank P3-LOW; owner: CC (catalog)** |
| **R-787** | **[P2-MEDIUM] No catalog app's LICENCE has been checked against Felhom being a paid service; the first look (SparkyFitness, R-784) found a non-commercial-only licence.** The new-app checklist row 0.1 binds apps opened from 2026-10-01; the 53 exempt apps were never read. **Needs:** a read of every template's licence at its pinned tag (SPDX + any custom terms), one table, and the non-open ones to the operator. **UPDATE 2026-10-02 — READ:** all 58 templates (56 published + Grimmory + MeTube), every image, at the pinned tag — one table: `audits/licences-2026-10-02/TABLE.md` (method in `read-1.md`, `read-2.md`). OSI-approved: all but the rows below. Not OSI / limiting, each now its own row: Tandoor (Commons Clause, R-789), Emby (R-790), n8n (R-791), Plex (R-792), the EE/BUSL parts of Cal.com, Docmost, Outline and meilisearch (R-793), redis 7.4 in seven apps (R-794), recipe-importer has no licence file (R-795); SparkyFitness is R-784. Nothing was hidden or changed because of the read (the brief's rule). New apps carry their licence in record row 0.1. | **CLOSED 2026-10-02 — the read (decisions are R-784, R-789..R-795)** |
| **R-788** | **[P3-LOW] The volume-persistence gate reads an EMPTY declared volume as CLEAN — MeTube's `/state` passed while the app had written nothing there.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/C-metube-bench/C2-volume-persistence-metube.txt`): "declared volume /state is EMPTY" → exit 0. The catalog's CLAUDE.md says an app that wrote nothing is UNDETERMINED (exit 2), never a pass. MeTube's real proof came from elsewhere (the history read back after a recreate and after a restore). **Needs:** the gate treats an empty declared volume as undecided, or the app gets an exerciser (MeTube: one `POST /add`); a decoy that is an app writing nothing. **UPDATE 2026-10-02:** part of the cause was R-801 (no port → no exercise at all); the catalog now also has `APP_EXERCISE` (MeTube: one `POST /add`). The empty-volume → CLEAN path itself is still to be checked. | **READY — rank P3-LOW; owner: CC** |
| **R-788** | **[P3-LOW] The volume-persistence gate reads an EMPTY declared volume as CLEAN — MeTube's `/state` passed while the app had written nothing there.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/C-metube-bench/C2-volume-persistence-metube.txt`): "declared volume /state is EMPTY" → exit 0. The catalog's CLAUDE.md says an app that wrote nothing is UNDETERMINED (exit 2), never a pass. MeTube's real proof came from elsewhere (the history read back after a recreate and after a restore). **Needs:** the gate treats an empty declared volume as undecided, or the app gets an exerciser (MeTube: one `POST /add`); a decoy that is an app writing nothing. **UPDATE 2026-10-02:** part of the cause was R-801 (no port → no exercise at all); the catalog now also has `APP_EXERCISE` (MeTube: one `POST /add`). The empty-volume → CLEAN path itself is still to be checked. **DONE 2026-10-02:** an empty declared volume after the exercise is UNDETERMINED (red-proofed: `audits/persistence-sweep-2026-10-02/A/RP-R788-empty-volume.txt`); the gate calls the app's own upgrade-fixture seed when a volume stays empty. Bind mounts: R-805. | **CLOSED 2026-10-02 — catalog** |
| **R-789** | **[P2-MEDIUM] Tandoor's licence is AGPL-3.0 WITH the Commons Clause: it forbids selling "a product or service whose value derives, entirely or substantially, from the functionality of the Software" — fees for hosting or support included.** READ 2026-10-02 at 2.6.15 (`audits/licences-2026-10-02/TABLE.md`). Felhom charges for installing and caring for the household's apps; whether that value comes "substantially" from Tandoor is the question. **Needs (operator):** keep (the fee is for the box, not Tandoor), hide for new installs, or ask the authors. Nothing changed meanwhile. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** treated like SparkyFitness — stays offered; the operator asks the authors for written permission; without it before the first paying customer Tandoor is hidden (`lifecycle: hidden`). STATUS "Before the first paying customer". | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (the request; trigger: first paying customer)** |
| **R-790** | **[P2-MEDIUM] Emby is proprietary: a personal, non-commercial, non-transferable licence.** READ 2026-10-02 (emby.media/terms.html; `audits/licences-2026-10-02/TABLE.md`). The household's private use fits; Felhom installs the official image from Emby (no copy distributed) as part of a paid service, a context the licence does not cover. Jellyfin (GPL) offers the same. **Needs (operator):** keep, hide, or ask Emby. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** KEPT — the household is the licensee; Felhom installs the official, unchanged image. Part of the lawyer's review (R-802). | **CLOSED 2026-10-02 — operator ruling (kept)** |
| **R-791** | **[P3-LOW] n8n's Sustainable Use License allows own internal or personal use, and distribution only free of charge for non-commercial purposes.** READ 2026-10-02 at 2.42.1 (`audits/licences-2026-10-02/TABLE.md`). The household's own use is allowed; Felhom pulling the unchanged official image onto the household's box is arguably not distributing — a grey zone. **Needs (operator):** keep (recommended reading) or ask n8n. **RULED 2026-10-02 afternoon (`09` §3 decision 66):** KEPT — the household is the user; the official, unchanged image. Part of the lawyer's review (R-802). | **CLOSED 2026-10-02 — operator ruling (kept)** |
@@ -912,8 +912,13 @@ class (an image `VOLUME` at an unmounted path) is still live — `immich-server`
| **R-798** | **[P3-LOW] Grimmory's template sets `SWAGGER_ENABLED=false`, which v3.5.0 does not read (it reads `API_DOCS_ENABLED`, default false).** READ 2026-10-02 (`audits/family-gate-2026-10-02/B/grimmory-reads/upstream-v3.5.0.txt`). Harmless today — the API docs are off by default. **Needs:** remove the dead line or set the right name, on the next Grimmory step. | **READY — rank P3-LOW; owner: CC** |
| **R-799** | **[P3-LOW] The MeTube fixture's `POST /add` leaves out `download_type`, which upstream's validator lists as required.** MEASURED 2026-10-02 (`audits/family-gate-2026-10-02/C-metube-bench/`): both 2026.09.28 and .29 answered 200 and downloaded anyway. Fragile if a later tag enforces it. **Needs:** add `download_type: video` to the fixture with the next MeTube step. | **READY — rank P3-LOW; owner: CC** |
| **R-800** | **[P2-MEDIUM] "Delete your data from the hard drive" keeps the app's files in the household's userdata folder — and neither the dialog nor the result says so.** MEASURED 2026-10-02. On demo-hp (live catalog, `audits/family-gate-2026-10-02/B4/grimmory-demo.txt`, `metube-demo.txt`): remove WITH data removed Grimmory's database volume, appdata and backups but KEPT the uploaded EPUB in `userdata/media/grimmory`; for MeTube the dialog offers no data checkbox at all and the result says "the app stored no data of its own on a drive" while the downloaded video stays in `userdata/media/metube`. On 9202 "keeping data" answers `hdd_paths_preserved: []` for the same reason (`audits/family-gate-2026-10-02/B/box/life.txt`): the remove reads `${HDD_PATH}` binds only. The model behind it may be right — userdata is the household's own files (a shared `media/` tree must never go with one app) — but then the dialog must say the files stay and where. **Needs (operator):** keep userdata on remove (and say so on the dialog), or delete an app's OWN userdata subfolder when the household ticks the box. **RULED 2026-10-02 afternoon (`09` §3 decision 67, option A):** the household's userdata files stay on every remove; the dialog and the result say so and name the folder. Recorded in `07` §6.5. Built in the next controller release. | **READY — rank P2-MEDIUM; owner: CC (the dialog and the result text)** |
| **R-801** | **[P2-MEDIUM] The volume-persistence gate never sent a request to ANY app: it read the routed port from label VALUES while `docker compose config --format json` puts the port in the label NAME.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/B/volume-persistence-metube-exerciser-diag.txt`: `"ports": []`, `"exercise": []` for MeTube; the label shape read on Compose 2.26.1). So every verdict since the gate exists came only from what an app writes at start by itself; the GET exercise and the deep second pass never ran. **Fixed in the catalog** (`routed_ports()`, key=value; unit tests, red-proofed: `audits/family-gate-2026-10-02/B/RP-R801-routed-ports.txt`). **Still owed:** a full re-sweep of all 58 templates on the bench with the fixed gate — an app whose data path is written only on a request may now read differently. | **READY — rank P2-MEDIUM; owner: CC (the re-sweep)** |
| **R-801** | **[P2-MEDIUM] The volume-persistence gate never sent a request to ANY app: it read the routed port from label VALUES while `docker compose config --format json` puts the port in the label NAME.** MEASURED 2026-10-02 on the bench (`audits/family-gate-2026-10-02/B/volume-persistence-metube-exerciser-diag.txt`: `"ports": []`, `"exercise": []` for MeTube; the label shape read on Compose 2.26.1). So every verdict since the gate exists came only from what an app writes at start by itself; the GET exercise and the deep second pass never ran. **Fixed in the catalog** (`routed_ports()`, key=value; unit tests, red-proofed: `audits/family-gate-2026-10-02/B/RP-R801-routed-ports.txt`). **Still owed:** a full re-sweep of all 58 templates on the bench with the fixed gate — an app whose data path is written only on a request may now read differently. **DONE 2026-10-02:** the re-sweep of all 58 ran with the fixed gate (`audits/persistence-sweep-2026-10-02/A/sweep/TABLE.md`): CLEAN 39 · UNDETERMINED 19 · BROKEN 0 (August: 38 · 11 · 4 of 53, every one of those decided by start-time writes alone — 0 of 53 probes had sent a request). Follow-ups R-805..R-807. | **CLOSED 2026-10-02 — catalog (the fixed gate + the re-sweep)** |
| **R-802** | **[P2-MEDIUM] A lawyer reviews the non-OSI licence list before the first paying customer.** Operator ruling 2026-10-02 (`09` §3 decision 66): Tandoor (R-789), SparkyFitness (R-784), Emby, n8n, Plex (kept — R-790..R-792), the EE/BUSL parts (R-793), redis 7.4 (R-794); the table is `audits/licences-2026-10-02/TABLE.md`. STATUS "Before the first paying customer". | **WAITING-ON-OPERATOR — rank P2-MEDIUM; owner: operator (trigger: first paying customer)** |
| **R-803** | **[P1-HIGH] papra cannot start under its own memory limit: a fresh install is OOM-killed in its migration and crash-loops.** MEASURED 2026-10-02 on the bench (`audits/persistence-sweep-2026-10-02/A/sweep/papra-oom-diagnosis.txt`, `audits/persistence-sweep-2026-10-02/A/sweep/batch-09-papra-rerun.txt`): `ghcr.io/papra-hq/papra:26.6.2-rootless` at the template's 256M → `OOMKilled=true` during `tsx src/scripts/migrate-up.script.ts`; with no limit it runs at ~416 MiB after 60 s, and its database lands correctly in `/app/app-data` (the R-156 mount is right). The 26.6.1 → 26.6.2 step was proven with harness v1 (no memory watch), which is how 256M stayed. **No box runs papra** (demo-hp, demo-felhom read 2026-10-02). **Needs:** a from-birth memory watch, then the limit raised with headroom, proven on the bench (install, seed, read back, persistence CLEAN). **FIXED 2026-10-02:** measured from birth on the bench (`audits/persistence-sweep-2026-10-02/A/papra/SUMMARY.md`): peak anon 405 MiB (cgroup peak 483 MiB), ~255 MiB idle; the limit is now 768M (`mem_request` 256M); at 768M healthy in 31 s, 0 kills, the seed read back, persistence CLEAN. No image move; no box ran papra. | **CLOSED 2026-10-02 — catalog (papra 768M)** |
| **R-804** | **[P3-LOW] plant-it's image is gone from Docker Hub: `msdeluise/plant-it:0.10.0` answers "pull access denied … repository does not exist".** MEASURED 2026-10-02 on the bench, logged in (`audits/persistence-sweep-2026-10-02/A/sweep/batch-*.txt`, plant-it). The app is already `lifecycle: abandoned` (not offered for new installs); a box that runs it could no longer reinstall or restore it from images. **No box runs it** (read 2026-10-02). **Needs (operator):** keep the abandoned template as it is, or hide it entirely. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator** |
| **R-805** | **[P3-LOW] The volume-persistence gate judges an empty NAMED volume (R-788) but not an empty BIND mount.** MEASURED 2026-10-02 (`audits/persistence-sweep-2026-10-02/A/sweep/TABLE.md`): Grimmory's `/app/data` bind held 0 files and read CLEAN (its state is in MariaDB); komga, paperless-ngx, radarr and sonarr also carry empty binds that are not judged. **Needs:** decide whether an empty bind after the exercise is UNDETERMINED like a named volume, with a decoy. | **READY — rank P3-LOW; owner: CC** |
| **R-806** | **[P3-LOW] The gate's GET exercise speaks plain http to an HTTPS backend (crafty-controller :8443), and gramps-web did not answer on :5000.** MEASURED 2026-10-02 (`audits/persistence-sweep-2026-10-02/A/sweep/TABLE.md`): both reached data only through their fixture seed. **Needs:** read the `loadbalancer.server.scheme` label (upgrade_boxport already does); find why gramps-web's first GET got no answer. | **READY — rank P3-LOW; owner: CC** |
| **R-807** | **[P3-LOW] 13 apps stay UNDETERMINED because their seeds write only to the database, so their upload / media / cache / redis volumes stay empty.** MEASURED 2026-10-02 (`audits/persistence-sweep-2026-10-02/A/sweep/TABLE.md`): claper, crafty-controller, dawarich (redis), docmost, gramps-web, immich (ML cache), outline (+redis), sparkyfitness, tandoor, vikunja, wger, wishlist, zipline — plus plex (no seed route: a plex.tv claim token) and wanderer (no fixture; unhealthy under the gate). None is BROKEN: nothing was written outside a preserved folder. **Needs:** per app, a seed that uploads one file (or the volume named n/a with a reason: a redis cache, an ML model cache). | **READY — rank P3-LOW; owner: CC** |
<!-- DUE-CHECKS-BEGIN — machine-readable. Parsed by scripts/due_checks_gate.py.
One row per dated check. The R-number must have a row above. Dates are UTC.