Update arc resumed: the state measured, R-524/R-520/R-589/R-469 closed, seven questions put to the operator
gates / gates (push) Successful in 24s

Phase 0 — measured, never estimated:
- both demo boxes: 10 apps, 0 behind, 0 unknown
- 46 of 58 exact catalog pins are behind upstream; 39 within a major, 7 across
- 6 of 7 measurable floating pins have been repushed since the catalog set them
  (R-446 is no longer theoretical)
- the "23 of 66 floating pins" figure repeated in four places was STALE; recounted
  to 10, with the definition written down beside it

Three claims in the brief corrected, named first:
- R-589 was NOT open — it shipped in v0.258.0; only the row was stale
- the chaos-night canary is NOT a defect — both gates refused to certify by design
- the hub half of the report confirmed, with the nuance that the raw payload is
  stored whole, so Slice 7 is cheaper than the row implies

Closed: R-524 (controller v0.260.0, proven live in both languages), R-520 (power cut
during a REAL version change — the pin goes back, the app runs, the page says so),
R-589, R-469 (MariaDB half). Filed: R-605, R-606. R-462's stale scope corrected.

09 gains §3 decision 10 (decided by CC unattended — operator may reverse), §3b with
the seven questions in the decision shape, §6.2/6.3 the two open slices, and §6.4 an
update night costed from R-462's real numbers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-21 13:13:23 +02:00
parent bcdd5b2058
commit 0c263c77f2
26 changed files with 3125 additions and 16 deletions
@@ -0,0 +1,346 @@
# UPDATE ARC — the state, measured (2026-09-21)
Phase 0 of the resumed update arc. **Nothing here is an estimate.** Every number was read from a
live box, a live registry or live source on 2026-09-21. Raw captures:
`audits/update-arc-2026-09-21/`.
Baselines at the start: controller `19ef0329ab66` v0.259.0 · agent `d9864a94bf62` v0.132.0 ·
felhom.eu `bcdd5b205875` hub v0.119.0 · catalog `18a6d2d8243e`. All four trees clean and level with
`origin/main`.
---
## 1. Three claims in the brief that turned out wrong — named first
**1.1 R-589 is NOT open. It shipped in v0.258.0.** The brief said, reviewer-verified, that
`updatebadge.go` L82–L99 builds the badge from four raw Hungarian literals and that R-589 is
therefore open. **The literals are real and the conclusion does not follow.** Those literals are the
Hungarian form, and they are deliberately frozen — that IS the localisation parity guarantee. The
ENGLISH form has been rebuilt from the bundle in `web.localeFuncs` (`internal/web/i18n_web.go`,
the `"updateBadge"` entry) since **v0.258.0**, with `badge.update.*` in both `hu.json` and `en.json`,
pinned by `TestUpdateBadgeFollowsTheLanguage`, and **proven live on a fresh box the same morning** —
`DRILL-first-hour-en-0258-2026-09-20.md` item 9 reads *"PASS — 'Up to date' in English (R-589, fixed
this morning, proven on a fresh box)"*, and R-561's own row records R-589 among the three defects
Part 0 of v0.258.0 fixed.
**The register row is stale, not the code.** It is closed in this session with that citation. The
lesson is the general one: *a reviewer who reads one producer cannot see a second producer that
overrides it.* Reading `updatebadge.go` alone gives exactly the wrong answer, and the file now says
so in its own comment.
**1.2 The chaos-night canary is NOT a defect to fix.** The brief asked why
`check-image-resolvable` and `check-volume-persistence` returned INCONCLUSIVE on 2026-09-17 and
whether the fix is bounded. **They behaved exactly as designed.** Both scripts' own headers state the
rule: a detector that cannot prove itself must refuse to report rather than guess —
`check-image-resolvable.py` cites the 2026-07-21 incident where treating a Docker Hub throttle as
failure swept 24 of 65 pins as falsely dead, and the phrase in the drill doc, *"its own canary
failed"*, is `check-volume-persistence.py`'s own literal error text (its `self_test`, which needs to
`docker build` a canary image and therefore needs registry access). The most-supported reading is
that registry access was constrained at that moment; **that is inferred from the code plus the
documented throttle precedent, not observed** — no raw stdout of the gate run survives in either
evidence directory. Round 7's response — substitute `use` for `update`, log the deviation, leave the
tree clean — is what the scripts' own documentation asks for.
**No register row named it, and there is one real gap**, which is diagnostic rather than behavioural:
`catalog_gates.py` collapses *"the harness refused to run at all"* and *"a per-app result is
genuinely undetermined"* into one `INCONCLUSIVE` label, so a reader cannot tell which happened
without re-running with output captured. Filed as **R-605**.
**1.3 "The hub report carries no image field" — CONFIRMED, on both sides, with one useful nuance.**
The brief confirmed the controller half (`internal/report/types.go` L98–103: name, state, CPU,
memory). The hub half was this session's to check. `Store.SaveReport`
(`hub/internal/store/store.go:965`) **stores the raw report JSON whole** and denormalises only a
fixed list out of it — controller version, URL, language, CPU/memory percent, container **total and
running counts**, last snapshot, health status. `Containers` is two integers; there is no per-app
structure anywhere, and no hub code reads an image tag.
**The nuance matters for costing Slice 7:** because the raw payload is kept whole, a new
controller-side field would already be *stored* the day the controller sends it — what is missing is
the denormalisation and the page, not the transport. That makes Slice 7 additive on both sides, as
`09` §8.9 says, and slightly cheaper than "a hub-side change" suggests.
---
## 2. How far behind are the two demo boxes? Not at all.
Read on-disk on both boxes (`app.yaml` `installed_images` against the syncer's own catalog clone at
`<data>/catalog-cache/templates/<app>/docker-compose.yml` — the exact two inputs
`stacks.CatalogOrder` reads), controller v0.259.0 on both, catalog cache at `18a6d2d8` on both.
| box | deployed apps | behind | unknown (no record) | oldest `catalog_since` |
|---|---|---|---|---|
| N100 `demo-felhom-8363b5` | 1 (opengist) | **0** | **0** | 2026-07-18 |
| HP t740 `demo-hp-bb76ea` | 9 | **0** | **0** | 2026-07-12 |
**Every deployed app on the fleet reads „Naprakész" today, and every one of them has a record.** The
v0.234.0 backfill has done its job: the "unknown on a quiet box" residue of §8.3 is zero here.
**This is the honest caveat, and it is the whole of §8.1:** „Naprakész" on these boxes means *the
reference matches*, not *the image has not moved*. Section 3 measures exactly how false that can be.
---
## 3. Upstream drift — the number that decides how urgent Slice 6 is
53 apps · 79 `image:` lines · **66 unique pins**. Measured from DooPlex
against the public registries, never from a box (§8.1's rule applies to the product, not to an
audit). The dead-image sweep used the catalog's own `check-image-resolvable.py --all`, unmodified.
### 3.1 The exact pins
| | count |
|---|---|
| exact pins evaluated | 58 |
| **behind upstream today** | **46** |
| …of those, a MAJOR step | **7** |
| …of those, a minor/patch step | **39** |
| already newest | 10 |
| Felhom's own internal image (not upstream) | 1 |
| inconclusive | 1 |
**39 of 46 are within a major — that is the population Slice 6's automatic update would serve.**
Seven cross a major and are human work by the 2026-09-02 ruling: nextcloud 34→35, paperless-ngx
2.20→3.2, claper 2.5→3.0, gokapi 1.9→2.2, homepage 1.13→2.4, sparkyfitness 0.17→1.7 (two images).
**All seven were pinned 2026-07-18 — 65 days ago.**
### 3.2 By class
| class | apps | pins | floating | behind (of exact) | major | minor/patch |
|---|---|---|---|---|---|---|
| database | 14 | 23 | 7 | 14 of 16 | 5 | 9 |
| file-leg | 9 | 9 | 0 | 7 of 9 | 0 | 7 |
| other | 30 | 34 | 1 | 25 of 33 | 2 | 23 |
*Classification caveat, stated rather than folded in:* `adventurelog` runs a `postgis/postgis`
sidecar, which is PostgreSQL, but the literal substring rule puts it in `other`. It is the one app
that moves if postgis counts as a database (`other` 30→29, `database` 14→15). **v0.240.0's R-484
already treats PostGIS/pgvector/TimescaleDB as Postgres for the logical dump**, so the product is
right and only this table's rule is literal.
### 3.3 The floating pins — §8.1 is now MEASURED, and its COUNT was stale
**First, the count itself.** `09` §8.1, `REUSE.md`, the badge's own comment and R-446 all said
*"23 of the catalog's 66 distinct pins float"*. **That number matches no definition the catalog
supports today**, and it has been corrected in all four places. Recounted at catalog `18a6d2d8`,
with the definition written down so it can be rechecked: **a pin FLOATS when its tag names a version
LINE rather than an exact release.**
| shape | count | examples |
|---|---|---|
| full `X.Y.Z` | 48 | `privatebin/pdo:2.0.5` |
| **two-part line** | **6** | `mariadb:11.4`/`11.6`/`12.3`, `claper:2.5`, `opengist:1.13`, `wger/server:2.6` |
| **major line** | **4** | `postgres:15-alpine`, `postgres:16-alpine`, `redis:7-alpine`, `postgis:16-3.5-alpine` |
| exact version + variant suffix | 8 | `ghost:6.53.0-alpine`, `nextcloud:34.0.1-apache`, `kimai/kimai2:apache-2.57.0` |
**10 of 66 float.** The last row does not, by this definition — those name an exact release and only
wear a flavour.
**Then, the movement.** The sweep measured the 8 database and cache engine pins, of which 7 were
measurable:
For each floating tag, the registry's own last-push date against the date the catalog set the pin:
| pin | apps | pinned | last repushed upstream | moved? |
|---|---|---|---|---|
| `postgres:16-alpine` | 8 apps | 2026-07-18 | 2026-09-21 | **yes** |
| `postgres:15-alpine` | sparkyfitness | 2026-07-18 | 2026-09-21 | **yes** |
| `redis:7-alpine` | 6 apps | 2026-07-18 | 2026-09-18 | **yes** |
| `mariadb:11.4` | romm | 2026-07-18 | 2026-09-18 | **yes** |
| `mariadb:12.3` | bookstack | 2026-07-18 | 2026-09-18 | **yes** |
| `postgis/postgis:16-3.5-alpine` | adventurelog | 2026-07-18 | 2026-08-31 | **yes** |
| `mariadb:11.6` | kimai, nextcloud | 2026-07-18 | 2025-02-04 | no |
| `ghcr.io/immich-app/postgres:16-vectorchord…` | immich | 2026-07-18 | — | **UNMEASURED** |
**Six of the seven measurable floating tags have been repushed since the catalog pinned them.** So on
demo-hp today, `adventurelog`, `bookstack`, `docmost` and `romm` read „Naprakész" over a database
engine image that has demonstrably moved. The badge is not lying — it answers the question it was
built to answer — but the question a household hears is the other one. **R-446 is no longer a
theoretical blind spot: it is six pins out of seven.** The eighth (immich's own ghcr build) could not
be measured: ghcr's anonymous API exposes no last-modified timestamp and no authenticated token was
used. Stated unmeasured rather than guessed.
### 3.4 One image is gone upstream
`msdeluise/plant-it:0.10.0` — the gate says INCONCLUSIVE (a `denied`/`unauthorized` stderr, which it
refuses to read as "dead"), and two independent signals say it really is gone: Docker Hub's catalog
API answers `object not found` for the whole repository, and the upstream GitHub repo 404s. The app
is already `lifecycle: abandoned`, so this is the expected end state, not an incident. **A deployed
plant-it would survive — nothing re-pulls a running image — but it can never be redeployed.**
---
## 4. What this session then did
- **controller v0.260.0** — R-524 closed: a box AHEAD of the catalog reads „Naprakész", and the
guarded Update refuses to move a pin backwards (`downgrade`, 409). The comparison moved to
`stacks.CatalogOrder` so the badge and the refusal cannot drift. Three red-proofs, each seen to
fail. See the repo's CHANGELOG.
- **catalog** — R-469: the MariaDB half of the engine-major rule lifted, with R-450's own-edge clause
enforced in its place; PostgreSQL and MySQL stay refused, now citing R-463 rather than the shipped
R-448. Two new decoys, two red-proofs.
- **R-589** closed as already-shipped (§1.1). **R-605** filed (§1.2).
Live proof of v0.260.0 and the R-520 power cut: `audits/update-arc-2026-09-21/`.
---
## 4a. R-524 — PROVEN LIVE, both languages, both surfaces
The state was built the honest way, not by editing a file on the box: a throwaway `uptime-kuma` on
the scratch guest, a real catalog move **2.4.0 → 2.5.0**, the guarded Update pressed and run to
completion, then the catalog **reverted to 2.4.0** — exactly the BIGNIGHT Phase 6 shape that R-524
recorded. The box then runs 2.5.0 against a 2.4.0 catalog.
**The badge — app page AND apps list, both languages:**
```
[hu] <span class="tag tag-ok" title="Ez az alkalmazás a katalógusnál újabb változatot futtat,
ezért nincs teendőd.">Naprakész</span>
[en] <span class="tag tag-ok" title="This app is running a version newer than the catalog offers,
so there is nothing for you to do.">Up to date</span>
```
`tag-warn` is **absent** on all four captures (negative control), and the AHEAD title is a *different
sentence* from the ordinary up-to-date title captured at baseline — which is the v0.260.0 behaviour,
not a coincidence of wording.
**The refusal — the endpoint the button invokes:**
| request | code | body |
|---|---|---|
| `POST /api/stacks/uptime-kuma/update` | **409** | „Ez a változat újabb a katalógusban lévőnél — visszalépés csak az üzemeltető kérésére." |
| the same with `?lang=en` | **409** | "This version is newer than the one in the catalog — moving back needs the operator." |
| the same with `?lang=hu` (control) | **409** | the Hungarian sentence |
**The English one is the half that was nearly missed.** The new refusal was born as a bundle key, but
`api.Router` rendered update refusals from `ref.Message` — the Hungarian fallback — so without the
one-line change to `errText` in the same release the key would have been a seam built and never
wired. The `?lang=en` row above is the proof that it is wired.
**The log names both maps, so the verdict can be audited without guessing:**
```
[ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the
catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 …}]
catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
```
**And NOTHING MOVED — which is the property that makes the refusal safe to add.** After three refused
POSTs the app is still up and healthy on 2.5.0, the live compose line still reads 2.5.0, and **no
update journal exists** (with a positive control proving the directory searched was the real one).
That is §6.1's phase-0 contract intact: a refusal taken *before* the intent is recorded leaves no
trace, so a household that presses a refused button has changed nothing.
---
## 4b. R-520 — a power cut during a REAL version change. CLOSED, and it behaved.
**What R-520 asked for**, and why the 2026-09-14 attempt could not answer it: that night the only
Update the catalog allowed was a **same-version** one, so nothing could have gone wrong and nothing
did. The row asked for the same cut on a **real bump**.
**The measurement**, on the scratch guest 9202 (demo-hp), controller v0.260.0, with a throwaway
`uptime-kuma` and a real one-step catalog move 2.4.0 → 2.5.0 (reverted in the same session):
| | |
|---|---|
| 11:04:54.436Z | poller sees `updating: true`, `update_phase: pulling` |
| 11:04:54.439Z | `pct stop 9202` — the cut |
| 11:04:58.207Z | stopped |
*Honest limit on the instrument, recorded rather than smoothed:* `pct stop` took 3.8 s to return, so
the phase **at the moment of the decision** is observed and the phase **at the moment the kernel
froze** is inferred.
**After `pct start`, the box said so itself** — the POSITIVE observable, not an absence:
```
update recovery: uptime-kuma was interrupted in pulling (started 2026-09-21T11:04:52Z)
— nothing had run; putting the pin back
pin uptime-kuma: uptime-kuma=louislam/uptime-kuma:2.4.0
update uptime-kuma: pin and definition PUT BACK to the pre-update version
```
- `pinned_images` **and** `installed_images` both 2.4.0; the live compose line back to 2.4.0.
- No hold (correctly — nothing ran), `update_phase: failed`.
- The app is **running and healthy on 2.4.0**, 31 s after boot.
- The household is told, and the sentence is true: *„A frissítés megszakadt, mert a vezérlő
újraindult, mielőtt az új verzió elindult volna. Az alkalmazás a korábbi verzióval fut tovább."*
**R-520 closes.** A power cut in `pulling` during a real version change is recovered honestly: the
pin goes back, the old version runs, and the page says what happened.
### The instrument trap this run found, and it is worth more than the result
The first post-crash read, taken from the host against the **stopped** guest, reported the update
journal **ABSENT** — which would have made this a defect finding. It was a **false negative**.
**`pct mount` maps the guest's ROOTFS ONLY and does not apply the guest's own internal mounts.**
Guest 9202 keeps `/var/lib/docker` on its own ext4 mount under the `mp0` volume; from the host that
path exists and is an **empty stub**. The journal was at
`/var/lib/lxc/9202/rootfs/var/lib/felhom/docker/volumes/felhom-controller-data/_data/data/`, and the
box's own recovery read it at the next boot — which is the proof that it was there all along.
**It was caught by running `find` over the whole rootfs instead of trusting one constructed path**,
and by demanding a positive control for the directory being searched. **An empty directory is not
evidence of an absent file** — it is equally consistent with "you are looking at an unmounted stub".
That is R-96 rule 3 in a new place.
---
## 4c. A defect the live run found — filed, not fixed today
**On the English app page, the badge is English and the sentence under it is Hungarian.** Captured
verbatim at step 5, directly above one another:
```
[en] <span class="tag tag-warn" title="A newer version of this app is available…">Update available — today</span>
A frissítés megszakadt, mert a vezérlő újraindult, mielőtt az új verzió elindult volna.
Az alkalmazás a korábbi verzióval fut tovább.
```
`Stack.UpdateError` is a finished Hungarian STRING, not a key. `Manager.finishUpdate` stores it from
eight raw literals in `update.go`, and **both** `app_info.html` and `stacks.html` render it verbatim.
The same path carries `UpdatePhaseLabel` and the HOLD sentence — including
`backup.UpdateCopyHolds`'s *„csak a beállításokat és az adatbázist tartalmazza, a fájlokat nem"*,
**which is a promise about whether the customer's files come back**.
**v0.260.0 did not close this.** That release routed the 409 REFUSAL through `errText`, and a refusal
is the path where nothing happened; these are the sentences for when something did. **Filed as
R-606 (P2), not fixed** — one release per repo per session, and today's had already shipped.
---
## 4d. Teardown — three layers, stated
| layer | state |
|---|---|
| **machine** (guest 9202) | throwaway `uptime-kuma` removed **through the product** — the API refused the remove while it ran (409, *"stop it first"*), so it was stopped through the product and then removed, taking its volume and its 24K backup. Only the three protected infra containers remain, as at baseline. No update journal. |
| **host** (demo-hp) | guest 9202 left running, as it was found. **Guest 9201 untouched** — 24 containers before and after. `felhom-pve` not involved. |
| **hub** | nothing provisioned, nothing enrolled, nothing discarded. Guest 9202 reports to no hub by design. |
**The catalog is back where it started:** `louislam/uptime-kuma:2.4.0`, tree clean and level with
`origin/main`. `catalog_since` reads 2026-09-21 rather than 2026-07-18 — the gate requires an image
move to carry the day's date, and the bump and its revert are two moves that net to zero. No box is
behind on that app, so no age count is affected.
---
## 5. What the numbers say about the two open slices
**Slice 6 (automatic within a major) is worth more than its P2 suggests, and the reason is §3.1:**
39 of 58 exact pins are one minor step behind, every one of them a change the 2026-09-02 ruling
already says may happen without a human. Nobody presses 39 buttons. The support window (§3 decision
2) runs on how far behind the catalog a box is, so today every box is inside it only because the
catalog has not moved since 2026-09-15 — the moment the catalog catches up with upstream, every box
on the fleet is 46 pins behind at once.
**Slice 7 (the fleet view) is still correctly P3-LOW** at two enrolled boxes — but §2 shows why it
will not stay cheap: the only reason a person could answer "is the fleet current?" today is that a
session read both boxes' files by hand.
**R-446 (digests) is the cheapest real improvement on this list.** §3.3 measured the blind spot at
six pins of seven, and the catalog's `check-image-resolvable.py` already resolves a digest for every
pin at push time. Recording it costs one field and closes the gap without the box ever reaching a
registry.
@@ -0,0 +1,225 @@
#!/usr/bin/env python3
"""Measure upstream drift for app-catalog-felhom.eu image pins. Read-only, DooPlex-only.
Reuses the auth-handling approach of scripts/check-image-resolvable.py (per-registry anonymous
bearer-token flow against the Docker Registry v2 API), but instead of `docker manifest inspect`
per-ref, lists the full upstream tag catalogue so we can compare the pinned tag against the newest
one available, and classify the step as same-major (minor/patch) or major.
"""
import json
import re
import sys
import time
from pathlib import Path
import requests
SCRATCH = Path("/tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/5f83c0fb-b1bf-404e-b99e-2e3b28a31615/scratchpad")
SESSION = requests.Session()
SESSION.headers.update({"User-Agent": "felhom-catalog-drift-audit/1.0 (read-only measurement)"})
def get_bearer_token(www_auth: str) -> str:
assert www_auth.startswith("Bearer ")
parts = www_auth[len("Bearer "):].split(",")
d = {}
for p in parts:
k, v = p.split("=", 1)
d[k] = v.strip('"')
r = SESSION.get(d["realm"], params={"service": d.get("service"), "scope": d.get("scope")}, timeout=20)
r.raise_for_status()
return r.json()["token"]
def tags_list_all(host: str, repo: str, max_pages=1000):
"""Full tag list via Docker Registry v2 API, following RFC5988 Link pagination."""
url = f"https://{host}/v2/{repo}/tags/list"
params = {"n": 1000}
r = SESSION.get(url, params=params, timeout=30)
headers = {}
if r.status_code == 401:
tok = get_bearer_token(r.headers["WWW-Authenticate"])
headers = {"Authorization": f"Bearer {tok}"}
r = SESSION.get(url, params=params, headers=headers, timeout=30)
r.raise_for_status()
j = r.json()
tags = list(j.get("tags") or [])
link = r.headers.get("Link")
pages = 1
while link and pages < max_pages:
m = re.search(r'<([^>]+)>;\s*rel="next"', link)
if not m:
break
nexturl = m.group(1)
if nexturl.startswith("/"):
nexturl = f"https://{host}{nexturl}"
r = SESSION.get(nexturl, headers=headers, timeout=30)
r.raise_for_status()
j = r.json()
tags.extend(j.get("tags") or [])
link = r.headers.get("Link")
pages += 1
return tags
def manifest_digest(host: str, repo: str, ref: str):
"""Resolve one ref's manifest digest (for floating-tag drift: 'has the tag moved'). Read-only."""
url = f"https://{host}/v2/{repo}/manifests/{ref}"
accept = ("application/vnd.docker.distribution.manifest.v2+json,"
"application/vnd.docker.distribution.manifest.list.v2+json,"
"application/vnd.oci.image.manifest.v1+json,"
"application/vnd.oci.image.index.v1+json")
r = SESSION.head(url, headers={"Accept": accept}, timeout=30)
if r.status_code == 401:
tok = get_bearer_token(r.headers["WWW-Authenticate"])
r = SESSION.head(url, headers={"Accept": accept, "Authorization": f"Bearer {tok}"}, timeout=30)
if r.status_code != 200:
return None, f"HTTP {r.status_code}"
return r.headers.get("Docker-Content-Digest"), None
# host resolution per repo prefix, mirroring how these refs are actually pulled
def resolve_host_repo(ref_repo: str):
if ref_repo.startswith("ghcr.io/"):
return "ghcr.io", ref_repo[len("ghcr.io/"):]
if ref_repo.startswith("lscr.io/"):
return "lscr.io", ref_repo[len("lscr.io/"):]
if ref_repo.startswith("registry.gitlab.com/"):
return "registry.gitlab.com", ref_repo[len("registry.gitlab.com/"):]
if ref_repo.startswith("gitea.dooplex.hu/"):
return "gitea.dooplex.hu", ref_repo[len("gitea.dooplex.hu/"):]
if ref_repo.startswith("quay.io/"):
return "quay.io", ref_repo[len("quay.io/"):]
# Docker Hub
if "/" not in ref_repo:
return "registry-1.docker.io", f"library/{ref_repo}"
return "registry-1.docker.io", ref_repo
VERSION_CORE_RE = re.compile(r'(\d+(?:\.\d+){1,3})')
UNSTABLE_MARKERS = ("rc", "beta", "alpha", "dev", "nightly", "canary", "edge", "preview", "snapshot", "-pr", "test")
def split_tag(tag: str):
"""(prefix, core_version_tuple, suffix) — first maximal dotted-numeric run of len>=2 is the core."""
m = VERSION_CORE_RE.search(tag)
if not m:
return None
prefix = tag[:m.start()]
core = tuple(int(x) for x in m.group(1).split("."))
suffix = tag[m.end():]
return prefix, core, suffix
def is_unstable(tag: str) -> bool:
low = tag.lower()
return any(mk in low for mk in UNSTABLE_MARKERS)
def newest_matching(all_tags, current_tag):
"""Find the newest tag sharing the current tag's prefix/suffix 'shape', by core version tuple."""
cur = split_tag(current_tag)
if not cur:
return None, "current tag has no parseable version core"
cur_prefix, cur_core, cur_suffix = cur
# suffix "shape": if suffix contains a long hex-looking token, treat it as a wildcard hash
def suffix_shape(suf):
if re.search(r'[0-9a-f]{7,40}', suf.lower()) and re.search(r'[a-f]', suf.lower()):
return re.sub(r'[0-9a-f]{7,40}', '<hash>', suf.lower())
return suf
cur_shape = suffix_shape(cur_suffix)
best = None
best_core = None
for t in all_tags:
if t == current_tag:
continue
if is_unstable(t):
continue
parsed = split_tag(t)
if not parsed:
continue
p, core, suf = parsed
if p != cur_prefix:
continue
if suffix_shape(suf) != cur_shape:
continue
if len(core) != len(cur_core):
continue
# Some registries (linuxserver.io/lscr.io in particular) publish EXTRA tags for a
# same-app-version base-image rebuild, shaped like the release tag plus a YYYYMMDD-ish
# trailing component (e.g. bookstack 26.05.2 coexists with 26.05.20260608). That is not a
# newer application release — it is a rebuild of an existing one — so any component that
# looks like a calendar date (>= 20000, comfortably above any real release counter we saw
# across all 58 pinned-semver images, all of which stayed under 10000) is excluded as a
# candidate "newest" rather than misread as a huge version jump.
if any(c >= 20000 for c in core):
continue
if best_core is None or core > best_core:
best_core = core
best = t
if best is None:
return None, "no matching newer tag found (same prefix/suffix shape)"
if best_core <= cur_core:
return None, "up to date (no tag newer than current within the same shape)"
return (best, best_core, cur_core), None
def main():
pins = json.load(open(SCRATCH / "pins.json"))
results = {}
for i, (ref, p) in enumerate(sorted(pins.items())):
repo = p["repo"]
tag = p["tag"]
host, hrepo = resolve_host_repo(repo)
entry = {"ref": ref, "repo": repo, "tag": tag, "kind": p["kind"], "host": host, "hrepo": hrepo}
if repo.startswith("gitea.dooplex.hu"):
entry["status"] = "internal-not-upstream"
results[ref] = entry
print(f"[{i+1}/{len(pins)}] SKIP internal: {ref}")
continue
try:
if p["kind"] == "floating":
dig, err = manifest_digest(host, hrepo, tag)
if err:
entry["status"] = "error"
entry["error"] = err
else:
entry["status"] = "ok"
entry["current_digest"] = dig
print(f"[{i+1}/{len(pins)}] FLOAT {ref} -> {entry.get('current_digest') or entry.get('error')}")
else:
tags = tags_list_all(host, hrepo)
entry["n_upstream_tags"] = len(tags)
res, err = newest_matching(tags, tag)
if err:
entry["status"] = "no-newer-or-unparsed"
entry["detail"] = err
else:
best, best_core, cur_core = res
entry["status"] = "behind"
entry["newest_tag"] = best
entry["newest_core"] = list(best_core)
entry["current_core"] = list(cur_core)
entry["major_step"] = best_core[0] != cur_core[0]
print(f"[{i+1}/{len(pins)}] SEMVER {ref} ({len(tags)} tags) -> {entry.get('newest_tag') or entry.get('detail')}")
except requests.HTTPError as e:
entry["status"] = "error"
entry["error"] = f"HTTP error: {e}"
print(f"[{i+1}/{len(pins)}] ERROR {ref}: {e}")
except Exception as e:
entry["status"] = "error"
entry["error"] = f"{type(e).__name__}: {e}"
print(f"[{i+1}/{len(pins)}] ERROR {ref}: {e}")
results[ref] = entry
time.sleep(0.15)
json.dump(results, open(SCRATCH / "results.json", "w"), indent=2)
print("\nwrote", SCRATCH / "results.json")
if __name__ == "__main__":
main()
@@ -0,0 +1,192 @@
upstream image drift audit — app-catalog-felhom.eu — 2026-09-21
======================================================================
Read-only measurement, run from DooPlex against public registries only
(Docker Hub, ghcr.io, lscr.io, registry.gitlab.com). Nothing was queried
from a customer/demo box. The catalog repo was not modified and nothing
was committed.
PRE-EXISTING REPO STATE NOTE: at the start of this session `git status
--porcelain` in app-catalog-felhom.eu already showed 3 modified files
(CLAUDE.md, scripts/check-engine-major.py, scripts/test_gate_decoys.py) —
an in-progress, uncommitted R-469 change (MariaDB major-upgrade gate)
that predates this session. This audit did not touch those files and
made no edits/commits anywhere in the repo; flagging only because the
task said 'do not modify' and the tree was already not clean.
1. INVENTORY
----------------------------------------------------------------------
Apps (templates/*/docker-compose.yml): 53
Total `image:` lines across all composes: 79
Unique image refs (pins): 66
floating (DB-engine family tag, e.g. postgres:16-alpine, mariadb:11.6,
redis:7-alpine, postgis:16-3.5-alpine): 8
pinned-semver (full app release tag): 58
App classification (from compose + .felhom.yml, not memory):
database = has a postgres/mariadb/mysql/mongo sidecar image
file-leg = binds host media/library paths (HDD_PATH / USERDATA_PATH),
no DB sidecar
other = neither
database: 14 apps -> bookstack, calcom, claper, docmost, immich, kimai, nextcloud, outline, paperless-ngx, rallly, romm, sparkyfitness, tandoor, zipline
file-leg: 9 apps -> audiobookshelf, calibre-web, emby, jellyfin, komga, navidrome, plex, radarr, sonarr
other: 30 apps -> actualbudget, adventurelog, bentopdf, code-server, crafty-controller, ghost, gitea, glance, gokapi, grafana, gramps-web, home-assistant, homebox, homepage, mealie, n8n, onlyoffice, opengist, papra, plant-it, privatebin, recipe-importer, seerr, termix, uptime-kuma, vaultwarden, vikunja, wanderer, wger, wishlist
EDGE CASE flagged, not silently folded in: `adventurelog` runs a
postgis/postgis (postgres-derivative) DB sidecar, but the string
'postgis' does not contain 'postgres'/'mariadb'/'mysql'/'mongo', so by
the literal substring rule it lands in 'other', not 'database'. If you
want postgis apps folded into 'database', adventurelog is the one app
that moves (other: 30->29, database: 14->15).
2. DEAD-IMAGE CHECK (does the pin still resolve at all)
----------------------------------------------------------------------
Ran the repo's own gate, unmodified, exactly as documented in CLAUDE.md:
$ python3 scripts/check-image-resolvable.py --all
Result: 65 of 66 pins verified via `docker manifest inspect`, ALL resolve.
NO dead images among those checked.
The 1 unchecked: msdeluise/plant-it:0.10.0 (app `plant-it`,
lifecycle: abandoned). The gate calls it INCONCLUSIVE (rc=0 but
stderr contains 'denied'/'unauthorized', which its own trap-1 logic
refuses to read as success). Independently: hub.docker.com's own
catalog API returns {"message":"object not found"} for the whole
msdeluise/plant-it repository (not just the tag), and the upstream
GitHub repo msdeluise/plant-it now 404s too — two positive signals the
image is gone, stronger than the registry gate alone captures, but I'm
stating both rather than asserting 'dead' from a registry API that
itself only said INCONCLUSIVE. This matches its already-documented
`lifecycle: abandoned` state — expected, not a new incident.
3. PINNED-SEMVER: IS THERE A NEWER TAG UPSTREAM
----------------------------------------------------------------------
pinned-semver pins evaluated: 58
behind: 46
no-newer-or-unparsed: 10
error: 1
internal-not-upstream: 1
Of the 46 pins with a newer upstream tag: 7 cross a MAJOR version,
39 are MINOR/PATCH steps (same leading version number).
NOTE ON THE MAJOR/MINOR RULE: 'major' = the first dot-separated numeric
component changed. This is literal, not semantic — it correctly reads a
real major bump for apps like nextcloud/claper/paperless-ngx, but for
calendar-versioned images (home-assistant: YYYY.MM.PATCH,
actualbudget: YY.MM.PATCH) the 'first number' is a year, so a same-year
update is correctly minor/patch and would only misread as 'major' at a
year rollover — noted, not a defect found in this sweep's data.
4. APPS BEHIND ON A PINNED-SEMVER IMAGE, sorted furthest-behind first
----------------------------------------------------------------------
STEP IMAGE REPO CURRENT NEWEST APP(S) PINNED SINCE
MAJOR nextcloud 34.0.1-apache 35.0.0-apache nextcloud 2026-07-18
MAJOR f0rc3/gokapi v1.9.6 v2.2.4 gokapi 2026-07-18
MAJOR ghcr.io/gethomepage/homepage v1.13.2 v2.4.0 homepage 2026-07-18
MAJOR codewithcj/sparkyfitness_server v0.17.3 v1.7.2 sparkyfitness 2026-07-18
MAJOR codewithcj/sparkyfitness v0.17.3 v1.7.2 sparkyfitness 2026-07-18
MAJOR ghcr.io/paperless-ngx/paperless-ngx 2.20.15 3.2.1 paperless-ngx 2026-07-18
MAJOR ghcr.io/claperco/claper 2.5 3.0 claper 2026-07-18
minor/patch plexinc/pms-docker 1.41.4.9463-630c9f557 -> 1.43.4.10903-e5521bd8c plex 2026-02-15
minor/patch emby/embyserver 4.10.0.20 4.11.0.1 emby 2026-07-18
minor/patch getmeili/meilisearch v1.36.0 v1.54.0 wanderer 2026-07-21
minor/patch ghost 6.53.0-alpine 6.64.0-alpine ghost 2026-07-18
minor/patch n8nio/n8n 2.31.3 2.40.4 n8n 2026-07-18
minor/patch lscr.io/linuxserver/code-server 4.129.0 4.138.0 code-server 2026-07-18
minor/patch ghcr.io/mealie-recipes/mealie v3.20.1 v3.27.0 mealie 2026-07-18
minor/patch lukevella/rallly 4.11.1 4.15.1 rallly 2026-07-18
minor/patch ghcr.io/lukegus/termix 2.5.0 2.8.0 termix 2026-07-12
minor/patch vikunja/vikunja 2.3.0 2.6.0 vikunja 2026-07-18
minor/patch ghcr.io/home-assistant/home-assistant 2026.7.2 2026.9.3 home-assistant 2026-07-18
minor/patch actualbudget/actual-server 26.7.0 26.9.0 actualbudget 2026-07-18
minor/patch gotson/komga 1.25.0 1.27.0 komga 2026-07-18
minor/patch rommapp/romm 5.0.0 5.2.0 romm 2026-07-18
minor/patch ghcr.io/immich-app/immich-server v3.0.3 v3.2.2 immich 2026-07-18
minor/patch ghcr.io/immich-app/immich-machine-learning v3.0.3 v3.2.2 immich 2026-07-18
minor/patch louislam/uptime-kuma 2.4.0 2.5.5 uptime-kuma 2026-07-18
minor/patch lscr.io/linuxserver/radarr 6.3.0 6.4.4 radarr 2026-07-18
minor/patch vaultwarden/server 1.36.0-alpine 1.37.3-alpine vaultwarden 2026-07-18
minor/patch grafana/grafana 13.1.0 13.2.2 grafana 2026-07-18
minor/patch ghcr.io/advplyr/audiobookshelf 2.35.1 2.36.1 audiobookshelf 2026-07-18
minor/patch docmost/docmost 0.95.0 0.96.0 docmost 2026-07-18
minor/patch outlinewiki/outline 1.9.1 1.10.1 outline 2026-07-18
minor/patch ghcr.io/cmintey/wishlist v0.66.0 v0.67.0 wishlist 2026-07-19
minor/patch ghcr.io/seanmorley15/adventurelog-backend v0.12.1 v0.13.0 adventurelog 2026-07-18
minor/patch ghcr.io/seanmorley15/adventurelog-frontend v0.12.1 v0.13.0 adventurelog 2026-07-18
minor/patch ghcr.io/diced/zipline 4.6.1 4.7.0 zipline 2026-07-18
minor/patch deluan/navidrome 0.63.2 0.64.0 navidrome 2026-07-18
minor/patch registry.gitlab.com/crafty-controller/crafty-4 4.10.7 4.11.0 crafty-controller 2026-06-26
minor/patch lscr.io/linuxserver/bookstack 26.05.2 26.05.5 bookstack 2026-07-18
minor/patch gitea/gitea 1.27.0 1.27.3 gitea 2026-07-18
minor/patch ghcr.io/alam00000/bentopdf v2.8.6 v2.8.8 bentopdf 2026-07-12
minor/patch ghcr.io/thomiceli/opengist 1.13 1.15 opengist 2026-07-18
minor/patch ghcr.io/tandoorrecipes/recipes 2.6.13 2.6.15 tandoor 2026-07-18
minor/patch glanceapp/glance v0.8.5 v0.8.6 glance 2026-07-18
minor/patch ghcr.io/papra-hq/papra 26.6.1-rootless 26.6.2-rootless papra 2026-07-12
minor/patch privatebin/pdo 2.0.5 2.0.6 privatebin 2026-09-14
minor/patch lscr.io/linuxserver/sonarr 4.0.19 4.0.20 sonarr 2026-07-18
minor/patch wger/server 2.6 2.7 wger 2026-07-19
5. BY APP CLASS
----------------------------------------------------------------------
database (14 apps, 23 unique pins):
floating: 7 pinned-semver: 16
of pinned-semver -> behind: 14 (major: 5, minor/patch: 9), up to date: 2, other: 0
file-leg (9 apps, 9 unique pins):
floating: 0 pinned-semver: 9
of pinned-semver -> behind: 7 (major: 0, minor/patch: 7), up to date: 2, other: 0
other (30 apps, 34 unique pins):
floating: 1 pinned-semver: 33
of pinned-semver -> behind: 25 (major: 2, minor/patch: 23), up to date: 6, other: 2
6. FLOATING PINS — has the tag's digest moved since the catalog set it
----------------------------------------------------------------------
Method: compare each floating tag's registry-reported last-push date
(Docker Hub API tag metadata; ghcr.io has no equivalent public
timestamp API reachable anonymously) against the app's own
`catalog_since` (the date THIS repo last moved that pin — CLAUDE.md's
own definition of 'when we set it').
mariadb:11.4 apps=romm catalog_since=2026-07-18 registry last push=2026-09-18T02:36:29.445608Z
mariadb:11.6 apps=kimai, nextcloud catalog_since=2026-07-18 registry last push=2025-02-04T13:35:57.325706Z
mariadb:12.3 apps=bookstack catalog_since=2026-07-18 registry last push=2026-09-18T02:37:26.402424Z
postgres:15-alpine apps=sparkyfitness catalog_since=2026-07-18 registry last push=2026-09-21T07:07:40.622579Z
postgres:16-alpine apps=8 apps (see below) catalog_since=2026-07-18 registry last push=2026-09-21T04:07:46.010722Z
redis:7-alpine apps=6 apps (see below) catalog_since=2026-07-18 registry last push=2026-09-18T03:04:58.155237Z
postgis/postgis:16-3.5-alpine apps=adventurelog catalog_since=2026-07-18 registry last push=2026-08-31T11:37:24.0266Z
Verdict (comparing dates above): 6 of 7 Docker-Hub-hosted floating pins
have had their tag repushed (new digest) at least once since the catalog
set them (mariadb:11.4, mariadb:12.3, postgres:15-alpine,
postgres:16-alpine, redis:7-alpine, postgis:16-3.5-alpine — pushes on or
after 2026-08-31, vs. catalog_since 2026-07-18 for all of them). Only
mariadb:11.6 (kimai, nextcloud) has NOT been repushed since pinning —
its last Docker Hub push was 2025-02-04, well before catalog_since.
ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0 (immich):
COULD NOT TELL. ghcr.io's anonymous v2 API exposes no last-modified
timestamp, and I did not have an authenticated GitHub Packages token to
query the versions API. Digest resolved today:
sha256:1a078b237c1d9b420b0ee59147386b4aa60d3a07a8e6a402fc84a57e41b043a4
but I have no earlier digest recorded anywhere to compare it to, so
'has it moved since catalog_since' is unmeasured for this one pin —
stated as unmeasured rather than guessed.
7. REPRODUCIBLE COMMANDS
----------------------------------------------------------------------
Dead-image check (the repo's own gate, unmodified):
cd app-catalog-felhom.eu && python3 scripts/check-image-resolvable.py --all
Newer-tag-upstream check (this audit's script, not part of the repo,
kept in the scratchpad — reuses the registry-v2 anonymous-bearer-token
auth flow from scripts/check-image-resolvable.py, but lists the full
upstream tag set per repo instead of testing one ref):
python3 /tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/5f83c0fb-b1bf-404e-b99e-2e3b28a31615/scratchpad/drift.py
(writes results.json next to it; apps.json/pins.json are the inventory
extracted from the catalog's compose/.felhom.yml files)
Floating-tag last-push check (Docker Hub API only, no docker CLI):
curl -s https://hub.docker.com/v2/repositories/<ns>/<repo>/tags/<tag>
@@ -0,0 +1,20 @@
=== 9202 stacks: deployed==true, before the drill (2026-09-21) ===
total templates: 55
traefik deployed= False running= None protected= True orphaned= False
=== catalog cache pin on the box for uptime-kuma ===
11: image: louislam/uptime-kuma:2.4.0
11:# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
13:catalog_since: "2026-07-18"
=== DooPlex catalog repo HEAD ===
5ff36d098cbcca8a025bb7852e20c10f9ecec691
(clean)
repo pin: image: louislam/uptime-kuma:2.4.0
repo catalog_since: # catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
catalog_since: "2026-07-18"
=== controller version ===
felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.260.0 Up 4 minutes (healthy)
filebrowser gtstef/filebrowser:1.3.3-stable Up 7 days (healthy)
traefik traefik:v3.6.7 Up 7 days
@@ -0,0 +1,3 @@
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
HTTPCODE:202
@@ -0,0 +1,136 @@
{
"ok": true,
"data": {
"name": "uptime-kuma",
"meta": {
"display_name": "Uptime Kuma",
"description": "Szolg\u00e1ltat\u00e1s \u00e9s weboldal monitoring",
"category": "dashboard",
"subdomain": "status",
"slug": "uptime-kuma",
"catalog_since": "2026-07-18",
"resources": {
"mem_request": "50M",
"mem_limit": "256M",
"pi_compatible": true,
"needs_hdd": false,
"hungarian_ui": false
},
"deploy_fields": [
{
"env_var": "DOMAIN",
"label": "Domain",
"type": "domain",
"generate": "",
"default": "",
"required": true,
"placeholder": "",
"description": "A szerver domain neve",
"locked_after_deploy": true
},
{
"env_var": "SUBDOMAIN",
"label": "Aldomain",
"type": "subdomain",
"generate": "",
"default": "status",
"required": true,
"placeholder": "",
"description": "Az alkalmaz\u00e1s aldomainje",
"locked_after_deploy": true
}
],
"app_info": {
"tagline": "Szolg\u00e1ltat\u00e1s monitoring - \u00e9rtes\u00edt\u00e9s ha valami nem m\u0171k\u00f6dik",
"use_cases": [
"Weboldalak \u00e9s szolg\u00e1ltat\u00e1sok el\u00e9rhet\u0151s\u00e9g\u00e9nek figyel\u00e9se",
"HTTP, TCP, DNS, ping \u00e9s egy\u00e9b protokollok t\u00e1mogat\u00e1sa",
"\u00c9rtes\u00edt\u00e9sek emailben, Telegramon, Discord-on, stb.",
"Nyilv\u00e1nos st\u00e1tusz oldal a felhaszn\u00e1l\u00f3knak",
"Sz\u00e9p grafikonok a rendelkez\u00e9sre \u00e1ll\u00e1sr\u00f3l"
],
"first_steps": [
"Nyisd meg a status.DOMAIN c\u00edmet a b\u00f6ng\u00e9sz\u0151ben",
"Hozd l\u00e9tre az admin fi\u00f3kot az els\u0151 megnyit\u00e1skor",
"Add hozz\u00e1 az els\u0151 monitort (pl. a saj\u00e1t weboldalad)",
"\u00c1ll\u00edts be \u00e9rtes\u00edt\u00e9seket (email, Telegram, stb.)",
"Opcion\u00e1lisan: hozz l\u00e9tre egy nyilv\u00e1nos st\u00e1tusz oldalt"
],
"prerequisites": null,
"default_creds": "",
"docs_url": "https://github.com/louislam/uptime-kuma/wiki"
},
"optional_config": null,
"healthcheck": {
"interval": "5m",
"checks": [
{
"type": "http",
"port": 3001,
"path": "/",
"method": ""
}
]
}
},
"compose_path": "/opt/docker/stacks/uptime-kuma/docker-compose.yml",
"state": "running",
"deployed": true,
"protected": false,
"orphaned": false,
"containers": [
{
"name": "uptime-kuma",
"image": "louislam/uptime-kuma:2.4.0",
"state": "running",
"status": "Up About a minute (healthy)"
}
],
"app_config": {
"deployed": true,
"deployed_at": "2026-09-21T10:57:12Z",
"env": {
"DOMAIN": "enkisfelhom.hu",
"SUBDOMAIN": "status"
},
"locked_fields": [
"DOMAIN",
"SUBDOMAIN"
],
"desired_state": "running",
"installed_images": {
"uptime-kuma": {
"ref": "louislam/uptime-kuma:2.4.0",
"digest": "sha256:91e963bfda569ba115206e843febb446f473ab525add4e08b2b9e3beffa16985",
"at": "2026-09-21T10:57:45Z"
}
},
"pinned_images": {
"uptime-kuma": "louislam/uptime-kuma:2.4.0"
}
},
"deploying": false,
"updating": false,
"health_probe": {
"healthy": true,
"last_check": "2026-09-21T10:58:06.444077946Z",
"details": [
{
"type": "http",
"target": ":3001/",
"healthy": true,
"status": 302,
"latency": "3ms"
}
]
},
"last_updated": "2026-09-21T10:59:16.464548662Z",
"restarting_since": "0001-01-01T00:00:00Z",
"template_images": {
"uptime-kuma": "louislam/uptime-kuma:2.4.0"
},
"catalog_images": {
"uptime-kuma": "louislam/uptime-kuma:2.4.0"
}
}
}
@@ -0,0 +1,44 @@
### STEP 2 — BASELINE BADGE (installed 2.4.0 == catalog 2.4.0)
--- app page /apps/uptime-kuma ---
<span class="tag tag-ok" title="Ez az alkalmazás a legfrissebb elérhető változatot futtatja.">Naprakész</span>
[raw badge markup, grep 'tag-ok\|tag-warn' context]
ugrep: error: error at position 84
xbf][\x80-\xbf]*){0,200}
\___exceeds complexity limits
--- apps list /stacks (uptime-kuma row) ---
--- app page /apps/uptime-kuma?lang=en ---
<span class="tag tag-ok" title="This app is running the newest version available.">Up to date</span>
[raw badge markup, grep 'tag-ok\|tag-warn' context]
ugrep: error: error at position 84
xbf][\x80-\xbf]*){0,200}
\___exceeds complexity limits
--- apps list /stacks?lang=en (uptime-kuma row) ---
### STEP 2b — apps list page /stacks, both languages
--- stacks-hu.html (133504 bytes) ---
badges present:
51 class="tag tag-off">
1 class="tag tag-ok" title="Ez az alkalmazás a legfrissebb elérhető változatot futtatja.">Naprakész
3 class="tag tag-run">
uptime-kuma mentioned: 9 times
--- stacks-en.html (132005 bytes) ---
badges present:
51 class="tag tag-off">
1 class="tag tag-ok" title="This app is running the newest version available.">Up to date
3 class="tag tag-run">
uptime-kuma mentioned: 9 times
### SEARCH CONTROLS (ASCII-only fragments, R-rule)
POSITIVE control 'Naprak' in stacks-hu.html : 1 (expect >0)
POSITIVE control 'Up to date' in stacks-en.html: 1 (expect >0)
NEGATIVE control 'Frissites elerheto' (deaccented, never in output): 0 (expect 0)
NEGATIVE control 'tag-warn' in stacks-hu.html at baseline: 0 (expect 0 for uptime-kuma)
NEGATIVE control 'ZZZ-not-present': 0 (expect 0)
@@ -0,0 +1,72 @@
==============================================================================
== gate: image-pins (check-image-pins.py)
==============================================================================
image-pin gate OK — 53 templates, 0 unpinned images
==============================================================================
== gate: engine-major (check-engine-major.py --range=bd22749e501540cfe2526408613832fef29f8de7..89304ab89617e4467726f055901d0d0ee83531b7)
==============================================================================
engine-major gate — range bd22749e501540cfe2526408613832fef29f8de7..89304ab89617e4467726f055901d0d0ee83531b7: 1 compose file(s) changed, 0 engine pin(s) compared
engine-major gate OK — no forbidden engine major, and no engine major bundled with another image move (rule: CLAUDE.md, amended by R-469 2026-09-21)
==============================================================================
== gate: catalog-since (check-catalog-since.py --range=bd22749e501540cfe2526408613832fef29f8de7..89304ab89617e4467726f055901d0d0ee83531b7)
==============================================================================
catalog-since gate — range bd22749e501540cfe2526408613832fef29f8de7..89304ab89617e4467726f055901d0d0ee83531b7: 1 compose file(s) changed, 1 image move(s) dated
catalog-since gate OK — every image move in the range carries a catalog_since on or after its commit day
==============================================================================
== gate: copy-i18n (check-copy-i18n.py)
==============================================================================
copy-i18n: matcher controls OK (positive „Jelentkezz be…" convicts, negative „Encrypted notes…" does not)
copy-i18n: retrieval-promise vocabulary matches the sibling clone
copy-i18n: 53 apps · 1032 Hungarian copy strings frozen · 1031 with English
copy-i18n: translated so far — actualbudget 15/15, adventurelog 17/17, audiobookshelf 21/21, bentopdf 14/14, bookstack 19/19, calcom 21/21, calibre-web 24/24, claper 17/17, code-server 20/20, crafty-controller 24/24, docmost 19/19, emby 22/22, ghost 16/16, gitea 16/16, glance 15/15, gokapi 19/19, grafana 19/19, gramps-web 16/16, home-assistant 18/18, homebox 16/16, homepage 15/15, immich 24/24, jellyfin 22/22, kimai 20/20, komga 21/21, mealie 17/17, n8n 17/17, navidrome 21/21, nextcloud 28/28, onlyoffice 24/24, opengist 15/15, outline 21/21, paperless-ngx 33/33, papra 13/14, plant-it 16/16, plex 25/25, privatebin 14/14, radarr 22/22, rallly 17/17, recipe-importer 19/19, romm 42/42, seerr 18/18, sonarr 22/22, sparkyfitness 20/20, tandoor 18/18, termix 11/11, uptime-kuma 16/16, vaultwarden 23/23, vikunja 17/17, wanderer 19/19, wger 18/18, wishlist 15/15, zipline 20/20
copy-i18n: OK
==============================================================================
== summary
==============================================================================
image-pins OK (exit 0)
engine-major OK (exit 0)
catalog-since OK (exit 0)
copy-i18n OK (exit 0)
all catalog gates OK
pre-push [app-catalog-felhom.eu]: gates OK - push proceeding.
remote: . Processing 1 references
remote: Processed 1 references in total
To https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
bd22749..89304ab main -> main
PUSH_RC=0
[exited with code 0]
=== commit ===
89304ab DRILL: uptime-kuma 2.4.0 -> 2.5.0 for the update-arc measurement (reverted in this session)
bd22749 REPORT for the R-469 rule lift
=== the bump diff ===
commit 89304ab89617e4467726f055901d0d0ee83531b7
Author: kisfenyo <nagyfenyvesi.viktor@gmail.com>
Date: Mon Sep 21 13:03:42 2026 +0200
DRILL: uptime-kuma 2.4.0 -> 2.5.0 for the update-arc measurement (reverted in this session)
A temporary image move so a live box can be walked through the update arc on demo-hp LXC 9202
(audit update-arc-2026-09-21): the badge going to "Frissites elerheto - ma", a power cut mid-pull
(R-520), then the revert that leaves the box AHEAD of the catalog (R-524).
2.5.0 is the next REAL released upstream tag: 2.4.1 and 2.4.2 do not exist on Docker Hub
(docker manifest inspect, all three checked). catalog_since moves to today as the catalog-since
gate requires of any commit that moves an image: line.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
templates/uptime-kuma/.felhom.yml | 2 +-
templates/uptime-kuma/docker-compose.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
-catalog_since: "2026-07-18"
+catalog_since: "2026-09-21"
- image: louislam/uptime-kuma:2.4.0
+ image: louislam/uptime-kuma:2.5.0
@@ -0,0 +1,16 @@
### STEP 3 — force catalog sync on 9202
-- POST /api/sync --
{"ok":true,"data":{"ok":true,"updated":["uptime-kuma"],"message":"Sablonok frissítve — frissítve: uptime-kuma"},"message":"Sablonok frissítve — frissítve: uptime-kuma"}
HTTPCODE:200
-- box catalog cache AFTER sync --
11: image: louislam/uptime-kuma:2.5.0
13:catalog_since: "2026-09-21"
-- what the controller now reports as catalog_images vs installed_images --
catalog_images : {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
template_images : {'uptime-kuma': 'louislam/uptime-kuma:2.4.0'}
installed_images: {'uptime-kuma': 'louislam/uptime-kuma:2.4.0'}
pinned_images : {'uptime-kuma': 'louislam/uptime-kuma:2.4.0'}
meta.catalog_since: 2026-09-21
@@ -0,0 +1,22 @@
### STEP 4 — BADGE AFTER THE BUMP (installed 2.4.0, catalog 2.5.0, catalog_since = today)
--- app page /apps/uptime-kuma [hu] ---
<span class="tag tag-warn" title="Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.">Frissítés elérhető — ma</span>
--- apps list /stacks [hu] ---
51 class="tag tag-off">
3 class="tag tag-run">
1 class="tag tag-warn" title="Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.">Frissítés elérhető — ma
--- app page /apps/uptime-kuma [en] ---
<span class="tag tag-warn" title="A newer version of this app is available. Select the Update button to start it.">Update available — today</span>
--- apps list /stacks [en] ---
51 class="tag tag-off">
3 class="tag tag-run">
1 class="tag tag-warn" title="A newer version of this app is available. Select the Update button to start it.">Update available — today
### SEARCH CONTROLS
POSITIVE 'tag-warn' in app-behind-hu.html : 1 (expect >0)
POSITIVE 'tag-warn' in app-behind-en.html : 1 (expect >0)
NEGATIVE 'Naprak' in app-behind-hu.html : 0 (expect 0 — it moved off 'up to date')
NEGATIVE 'Up to date' in app-behind-en.html: 0 (expect 0)
NEGATIVE 'ZZZ-not-present' : 0 (expect 0)
@@ -0,0 +1,23 @@
### STEP 5 PRE-CUT STATE (host clock: Mon Sep 21 11:04:42 UTC 2026)
-- update-journal.json present before the update? --
ABSENT
-- app.yaml before the update --
# Auto-generated by felhom-controller — do not edit locked fields manually
deployed: true
deployed_at: "2026-09-21T10:57:12Z"
env:
DOMAIN: enkisfelhom.hu
SUBDOMAIN: status
locked_fields:
- DOMAIN
- SUBDOMAIN
desired_state: running
installed_images:
uptime-kuma:
ref: louislam/uptime-kuma:2.4.0
digest: sha256:91e963bfda569ba115206e843febb446f473ab525add4e08b2b9e3beffa16985
at: "2026-09-21T10:57:45Z"
pinned_images:
uptime-kuma: louislam/uptime-kuma:2.4.0
-- live compose image line before the update --
image: louislam/uptime-kuma:2.4.0
@@ -0,0 +1,79 @@
### STEP 5 — THE CUT (poller observations, host UTC)
11:04:49.596Z poller armed, waiting for update_phase=pulling
11:04:50.561Z "updating":false
11:04:52.501Z "updating":false
11:04:54.436Z "updating":true "update_phase":"pulling"
11:04:54.439Z >>> CUTTING POWER: pct stop 9202
11:04:58.207Z >>> pct stop returned rc=0 ; status: status: stopped
NOTE: pct stop is not instantaneous — it returned 3.8 s after the decision, so the guest
had up to ~3.8 s more of life inside the pulling phase. The phase at the moment of
the decision is OBSERVED; the phase at the moment the kernel actually froze is INFERRED.
### POST-CRASH ON-DISK STATE, read from the STOPPED guest's rootfs (pct mount, no boot yet)
-- update-journal.json --
ABSENT
-- app.yaml as the crash left it --
# Auto-generated by felhom-controller — do not edit locked fields manually
deployed: true
deployed_at: "2026-09-21T10:57:12Z"
env:
DOMAIN: enkisfelhom.hu
SUBDOMAIN: status
locked_fields:
- DOMAIN
- SUBDOMAIN
desired_state: running
installed_images:
uptime-kuma:
ref: louislam/uptime-kuma:2.4.0
digest: sha256:91e963bfda569ba115206e843febb446f473ab525add4e08b2b9e3beffa16985
at: "2026-09-21T10:57:45Z"
pinned_images:
uptime-kuma: louislam/uptime-kuma:2.5.0
-- live docker-compose.yml image line as the crash left it --
image: louislam/uptime-kuma:2.5.0
-- pre-update compose copy, if one was saved --
total 32
drwxr-xr-x 2 100000 100000 4096 Sep 21 13:04 .
drwxr-xr-x 57 100000 100000 4096 Sep 13 22:22 ..
-rw-r--r-- 1 100000 100000 3318 Sep 21 13:04 .felhom.yml
-rw------- 1 100000 100000 506 Sep 21 13:04 app.yaml
-rw-r--r-- 1 100000 100000 1597 Sep 21 13:04 applied-compose.yml
-rw-r--r-- 1 100000 100000 1597 Sep 21 13:04 docker-compose.yml
-rw-r--r-- 1 100000 100000 1597 Sep 21 13:04 pre-update-applied.yml
-rw-r--r-- 1 100000 100000 1597 Sep 21 13:04 pre-update-compose.yml
(unmounted)
### CORRECTION — the journal read above was WRONG.
/var/lib/docker inside the guest is a separate MOUNT (not a symlink — my first wording was
wrong too): mp0 mounts a 70G disk at /var/lib/felhom and its /docker subdirectory is bound
onto /var/lib/docker (findmnt: /dev/loop1[/docker] /var/lib/docker ext4).
'pct mount 9202' maps only the ROOTFS and does not apply the guest's internal mounts, so
<rootfs>/var/lib/docker is an EMPTY MOUNTPOINT STUB from the host. 'test -f' therefore
answered ABSENT for a file that exists — a FALSE NEGATIVE, not evidence.
From the host the bytes are at <rootfs>/var/lib/felhom/docker/volumes/.../_data/data/.
Found by running 'find' over the whole rootfs instead of trusting the one path.
Path provenance and positive controls: 12-journal-path-provenance.txt.
### POST-CRASH update-journal.json, read from the STOPPED guest (correct path, still no boot)
-rw------- 1 100000 100000 439 Sep 21 13:04 /var/lib/lxc/9202/rootfs/var/lib/felhom/docker/volumes/felhom-controller-data/_data/data/update-journal.json
--- contents ---
{
"updates": {
"uptime-kuma": {
"phase": "pulling",
"started_at": "2026-09-21T11:04:52.924206274Z",
"prev_pin": {
"uptime-kuma": "louislam/uptime-kuma:2.4.0"
},
"prev_compose": "/opt/docker/stacks/uptime-kuma/pre-update-compose.yml",
"prev_applied": "/opt/docker/stacks/uptime-kuma/pre-update-applied.yml",
"proven_copy_at": "2026-09-21T11:01:46Z",
"proven_tier": 1
}
}
}
@@ -0,0 +1,244 @@
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
2026/09/21 11:06:12 main.go:334: [INFO] felhom-controller 0.260.0 starting (customer: demo-hp, domain: enkisfelhom.hu)
2026/09/21 11:06:12 settings.go:693: [INFO] [settings] Loaded settings from /opt/docker/felhom-controller/data/settings.json
2026/09/21 11:06:12 settings.go:1611: [DEBUG] [settings] AutoDiscoverStoragePaths discovered=[] fallback="" existing=1
2026/09/21 11:06:12 main.go:360: [INFO] Encryption key loaded from /opt/docker/felhom-controller/data/encryption.key
2026/09/21 11:06:12 manager.go:283: [INFO] [stacks] Using compose command: docker compose
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=false composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=false composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=false composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=false composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=true composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/09/21 11:06:12 manager.go:1620: [DEBUG] [stacks] getCatalogTemplateSlugs: found 53 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/09/21 11:06:12 manager.go:630: [DEBUG] [stacks] ScanStacks: catalog has 53 template slugs for orphan detection
2026/09/21 11:06:12 manager.go:661: [INFO] [stacks] ScanStacks complete: 55 stacks found (1 deployed, 54 available)
2026/09/21 11:06:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:12 deploy.go:1086: [DEBUG] [stacks] InjectMissingFields: checking 1 stacks
2026/09/21 11:06:12 deploy.go:1108: [DEBUG] [stacks] InjectMissingFields: checking stack uptime-kuma — 2 deploy fields, 2 existing env vars
2026/09/21 11:06:12 deploy.go:1171: [INFO] [stacks] InjectMissingFields: processed 1 stacks
2026/09/21 11:06:12 manager.go:422: [DEBUG] [stacks] MigrateEncryption: checking 1 deployed stacks for plaintext sensitive values
2026/09/21 11:06:12 manager.go:466: [INFO] [stacks] Encryption migration: no stacks needed migration
2026/09/21 11:06:12 desiredstate.go:137: [INFO] [stacks] desired-state backfill: 0 app(s) recorded as running, 0 left unrecorded (state ambiguous — legacy boot behaviour retained)
2026/09/21 11:06:12 installed.go:525: [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 1 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing)
2026/09/21 11:06:12 pin.go:289: [INFO] [stacks] pin adoption: 0 pinned, 1 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers)
2026/09/21 11:06:12 sync.go:117: [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s)
2026/09/21 11:06:12 sync.go:208: [INFO] [sync] Starting catalog sync
2026/09/21 11:06:12 sync.go:296: [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main)
2026/09/21 11:06:12 sync.go:298: [DEBUG] [sync] git fetch --depth 1 origin main in /opt/docker/felhom-controller/data/catalog-cache
2026/09/21 11:06:12 update.go:904: [WARN] [stacks] update recovery: uptime-kuma was interrupted in pulling (started 2026-09-21T11:04:52Z) — nothing had run; putting the pin back
2026/09/21 11:06:12 sync.go:592: [DEBUG] [sync] Running: git fetch --depth 1 origin main
2026/09/21 11:06:12 [DEBUG] [stacks] SaveAppConfig: saving /opt/docker/stacks/uptime-kuma — 2 env vars, 0 encrypted, 0 sensitive fields
2026/09/21 11:06:12 [INFO] [stacks] SaveAppConfig: saved config for uptime-kuma
2026/09/21 11:06:12 pin.go:93: [INFO] [stacks] pin uptime-kuma: uptime-kuma=louislam/uptime-kuma:2.4.0
2026/09/21 11:06:12 update.go:705: [INFO] [stacks] update uptime-kuma: pin and definition PUT BACK to the pre-update version (uptime-kuma=louislam/uptime-kuma:2.4.0)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] CPUCollector.Start: sampleRate=5s
2026/09/21 11:06:12 main.go:511: [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db
2026/09/21 11:06:12 main.go:523: [INFO] Metrics collector started (60s interval)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:06:12 restore_record_wiring.go:35: [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false)
2026/09/21 11:06:12 notifier.go:75: [INFO] Notifier disabled (hub not configured)
2026/09/21 11:06:12 main.go:642: [INFO] [mailrelay] app-email shim unavailable (no hub configured or disabled in config)
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: status-refresh (every 10s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="status-refresh" interval=10s totalJobs=1
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: stack-scan (every 2m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="stack-scan" interval=2m0s totalJobs=2
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: health-probes (every 10s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="health-probes" interval=10s totalJobs=3
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: system-health (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="system-health" interval=5m0s totalJobs=4
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: deadapp-check (every 30s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="deadapp-check" interval=30s totalJobs=5
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: ring-spill (every 30s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="ring-spill" interval=30s totalJobs=6
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job db-dump scheduled for 2026-09-22 02:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="db-dump" schedule="02:30" nextRun=2026-09-22T02:30:00+02:00 totalJobs=7
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: offsite-credential-retry (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="offsite-credential-retry" interval=5m0s totalJobs=8
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: backup-cache (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="backup-cache" interval=5m0s totalJobs=9
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-09-22 03:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="tier2-backup" schedule="03:30" nextRun=2026-09-22T03:30:00+02:00 totalJobs=10
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-09-22 04:15 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offbox-backup" schedule="04:15" nextRun=2026-09-22T04:15:00+02:00 totalJobs=11
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-09-22 05:10 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-abandon-sweep" schedule="05:10" nextRun=2026-09-22T05:10:00+02:00 totalJobs=12
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-09-22 06:00 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-integrity" schedule="06:00" nextRun=2026-09-22T06:00:00+02:00 totalJobs=13
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-09-22 05:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-proof" schedule="05:30" nextRun=2026-09-22T05:30:00+02:00 totalJobs=14
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-09-22 04:00 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="metrics-prune" schedule="04:00" nextRun=2026-09-22T04:00:00+02:00 totalJobs=15
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job fill-watch scheduled for 2026-09-22 03:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="fill-watch" schedule="03:30" nextRun=2026-09-22T03:30:00+02:00 totalJobs=16
2026/09/21 11:06:12 selftest.go:50: [INFO] ========== Startup Self-Test ==========
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3844MB avail≈22054MB
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26154728 → total=25898MB avail=22054MB used=3844MB (14.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.32 1.05 0.94 11/1204 124" → 1m=1.32 5m=1.05 15m=0.94
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 60.6°C (hwmon2)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo done in 66ms — mem=3844MB/25898MB (14.8%), rootDisk=6.7GB/68.4GB (9.8%), load=1.32/1.05/0.94, temp=60.6°C (hwmon2), cpu=0.0%
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Docker socket: reachable (v29.8.0)
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Stacks directory: /opt/docker/stacks
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Data directory: /opt/docker/felhom-controller/data (writable)
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] System data path: /mnt/sys_drive
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Storage paths: 1 connected, 0 disconnected
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Git catalog: 53 app definitions found
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Hub connectivity: hub disabled, skipped
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Metrics DB: 4.5 MB
2026/09/21 11:06:12 selftest.go:70: [INFO] ========================================
2026/09/21 11:06:12 selftest.go:71: [INFO] Self-test complete: 8 passed, 0 warnings, 0 failed
2026/09/21 11:06:12 scheduler.go:206: [INFO] [scheduler] Starting scheduler with 16 jobs
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] scheduler started: periodic=8 daily=8
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-abandon-sweep: next run at 2026-09-22 05:10:00 CEST (waiting 16h3m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job db-dump: next run at 2026-09-22 02:30:00 CEST (waiting 13h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-proof: next run at 2026-09-22 05:30:00 CEST (waiting 16h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-integrity: next run at 2026-09-22 06:00:00 CEST (waiting 16h53m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job tier2-backup: next run at 2026-09-22 03:30:00 CEST (waiting 14h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offbox-backup: next run at 2026-09-22 04:15:00 CEST (waiting 15h8m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job metrics-prune: next run at 2026-09-22 04:00:00 CEST (waiting 14h53m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job fill-watch: next run at 2026-09-22 03:30:00 CEST (waiting 14h23m48s)
2026/09/21 11:06:12 server.go:250: [DEBUG] [web] NewServer: initializing web server v0.260.0
2026/09/21 11:06:12 server.go:251: [DEBUG] [web] NewServer: backup=true scheduler=true alertMgr=true notifier=true updater=false
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:06:12 backup.go:465: [DEBUG] groupStacksByDrive: /mnt/sys_drive → [uptime-kuma]
2026/09/21 11:06:12 backup.go:1107: [INFO] [backup] Found 0 DB dump files across drives
2026/09/21 11:06:12 dbdump.go:128: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/09/21 11:06:12 sync.go:212: [ERROR] [sync] Catalog sync failed: git fetch: git fetch --depth 1 origin main: exit status 128
stderr: fatal: unable to access 'https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git/': Could not resolve host: gitea.dooplex.hu
2026/09/21 11:06:12 sync.go:122: [INFO] [sync] Initial sync: Git hiba: git fetch: git fetch --depth 1 origin main: exit status 128
stderr: fatal: unable to access 'https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git/': Could not resolve host: gitea.dooplex.hu
2026/09/21 11:06:12 dbdump.go:147: [DEBUG] DiscoverDatabases: docker ps output: 7c794623b894 felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.260.0
e87c990f2026 uptime-kuma uptime-kuma louislam/uptime-kuma:2.4.0
6d206504c99e filebrowser filebrowser gtstef/filebrowser:1.3.3-stable
2515331bc19e traefik traefik traefik:v3.6.7
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.260.0, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container uptime-kuma (image=louislam/uptime-kuma:2.4.0, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.3.3-stable, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.6.7, not a database)
2026/09/21 11:06:12 dbdump.go:203: [DEBUG] DiscoverDatabases: found 0 database(s), skipped 4 non-DB container(s)
2026/09/21 11:06:12 dbdump.go:206: [INFO] [backup] Discovered 0 databases
2026/09/21 11:06:12 [INFO] [stacks] ParseComposeHDDMounts: found 0 HDD mounts for /opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:06:12 [INFO] [backup] Discovered app data: 1 apps
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/sys_drive" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 recovery_unit.go:224: [INFO] [backup] Recovery unit captured for uptime-kuma → /mnt/sys_drive/felhom-data/backups/primary/uptime-kuma (images=1, secrets-referenced=0, data_keys=0, portable-carried=0/0, withheld=0)
2026/09/21 11:06:12 backup.go:1177: [INFO] [backup] Backup status cache refreshed
2026/09/21 11:06:12 server.go:324: [DEBUG] [web] loadTemplates: lang=hu loaded 81 templates, 1877 markers expanded in 28.728841ms
2026/09/21 11:06:12 server.go:324: [DEBUG] [web] loadTemplates: lang=en loaded 81 templates, 1877 markers expanded in 19.600884ms
2026/09/21 11:06:12 server.go:270: [INFO] [web] Auth: using password from settings.json
2026/09/21 11:06:12 server.go:811: [DEBUG] [web] CatchAllMiddleware: controller host=felhom.enkisfelhom.hu
2026/09/21 11:06:12 main.go:1856: [INFO] Web UI listening on :8080
2026/09/21 11:06:12 manager.go:258: [DEBUG] [integrations] ReapplyConfigForTarget: target=filebrowser integrations=0
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3874MB avail≈22024MB
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26119944 → total=25898MB avail=22024MB used=3874MB (15.0%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.32 1.05 0.94 6/1204 179" → 1m=1.32 5m=1.05 15m=0.94
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 60.6°C (hwmon2)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo done in 79ms — mem=3874MB/25898MB (15.0%), rootDisk=6.7GB/68.4GB (9.8%), load=1.32/1.05/0.94, temp=60.6°C (hwmon2), cpu=0.0%
2026/09/21 11:06:12 healthcheck.go:86: [DEBUG] [monitor] Raw values: disk=9.8%, hdd=1.8% (configured=true), mem=15.0% (3874MB/25898MB), cpu=0.0%, temp=60.6°C (hwmon2)
2026/09/21 11:06:12 healthcheck.go:118: [DEBUG] [monitor] SSD disk: OK (10%)
2026/09/21 11:06:12 healthcheck.go:151: [DEBUG] [monitor] Memory: OK (15%)
2026/09/21 11:06:12 healthcheck.go:187: [DEBUG] [monitor] Temperature: OK (61°C)
2026/09/21 11:06:12 infra.go:228: [INFO] [infra] connected felhom-controller to traefik-public
2026/09/21 11:06:12 infra.go:67: [INFO] [infra] cloudflared skipped — no cf_tunnel_token configured (LAN-only node)
2026/09/21 11:06:12 healthcheck.go:201: [DEBUG] [monitor] Docker daemon: OK
2026/09/21 11:06:12 healthcheck.go:209: [DEBUG] [monitor] Checking 1 protected containers: [traefik]
2026/09/21 11:06:12 healthcheck.go:219: [DEBUG] [monitor] All protected containers running
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/felhom-drives/scratch_hdd" total=937.8 GB used=17.0 GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 healthcheck.go:238: [INFO] [monitor] Health check: status=ok
2026/09/21 11:06:12 healthcheck.go:242: [DEBUG] [monitor] Final status: ok (issues=0, warnings=0, info=4)
2026/09/21 11:06:12 handlers.go:3399: [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (1 storage path(s))
2026/09/21 11:06:17 info.go:13: [DEBUG] [system] CPUCollector: first sample — cpu=16.8% (idle=3282 total=3943)
2026/09/21 11:06:17 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 1 targets (0 skipped not due, 0 skipped no container)
2026/09/21 11:06:22 healthprobe.go:153: [DEBUG] Health probe uptime-kuma: HTTP GET :3001/ → 302 (4ms)
2026/09/21 11:06:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 healthprobe.go:133: [INFO] Health probes: 1 ok (of 1 probed)
2026/09/21 11:06:27 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:27 main.go:2273: [INFO] [bootrecon] boot window: fleet settled after 10s (3 identical samples 5s apart) — sweeping
2026/09/21 11:06:27 bootrecon.go:255: [INFO] [bootrecon] Boot reconciliation: no boot-orphaned apps (nothing to start)
2026/09/21 11:06:32 auth.go:154: [DEBUG] [web] login attempt from 172.18.0.3:56160 (X-Forwarded-For: 172.18.0.1)
2026/09/21 11:06:32 auth.go:202: [DEBUG] [web] login successful from 172.18.0.1, creating session
2026/09/21 11:06:32 auth.go:268: [DEBUG] [web] session created, expires=2026-09-28T11:06:32Z, active_sessions=1
2026/09/21 11:06:32 auth.go:222: [INFO] [web] Login from 172.18.0.3:56160
2026/09/21 11:06:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:06:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:32 auth.go:142: [DEBUG] [web] auth: valid session for GET /stacks
2026/09/21 11:06:32 server.go:542: [DEBUG] [web] ServeHTTP: GET /stacks from 172.18.0.3:56160
2026/09/21 11:06:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
@@ -0,0 +1,78 @@
### STEP 5 RESULT — after pct start 9202
== 1. Controller log lines about the interrupted update (verbatim) ==
2026/09/21 11:06:12 installed.go:525: [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 1 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing)
2026/09/21 11:06:12 pin.go:289: [INFO] [stacks] pin adoption: 0 pinned, 1 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers)
2026/09/21 11:06:12 sync.go:117: [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s)
2026/09/21 11:06:12 sync.go:208: [INFO] [sync] Starting catalog sync
2026/09/21 11:06:12 sync.go:296: [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main)
2026/09/21 11:06:12 sync.go:298: [DEBUG] [sync] git fetch --depth 1 origin main in /opt/docker/felhom-controller/data/catalog-cache
2026/09/21 11:06:12 update.go:904: [WARN] [stacks] update recovery: uptime-kuma was interrupted in pulling (started 2026-09-21T11:04:52Z) — nothing had run; putting the pin back
2026/09/21 11:06:12 sync.go:592: [DEBUG] [sync] Running: git fetch --depth 1 origin main
2026/09/21 11:06:12 [DEBUG] [stacks] SaveAppConfig: saving /opt/docker/stacks/uptime-kuma — 2 env vars, 0 encrypted, 0 sensitive fields
2026/09/21 11:06:12 [INFO] [stacks] SaveAppConfig: saved config for uptime-kuma
2026/09/21 11:06:12 pin.go:93: [INFO] [stacks] pin uptime-kuma: uptime-kuma=louislam/uptime-kuma:2.4.0
2026/09/21 11:06:12 update.go:705: [INFO] [stacks] update uptime-kuma: pin and definition PUT BACK to the pre-update version (uptime-kuma=louislam/uptime-kuma:2.4.0)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] CPUCollector.Start: sampleRate=5s
2026/09/21 11:06:12 main.go:511: [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db
2026/09/21 11:06:12 main.go:523: [INFO] Metrics collector started (60s interval)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
== 2. app.yaml — pinned_images vs installed_images ==
# Auto-generated by felhom-controller — do not edit locked fields manually
deployed: true
deployed_at: "2026-09-21T10:57:12Z"
env:
DOMAIN: enkisfelhom.hu
SUBDOMAIN: status
locked_fields:
- DOMAIN
- SUBDOMAIN
desired_state: running
installed_images:
uptime-kuma:
ref: louislam/uptime-kuma:2.4.0
digest: sha256:91e963bfda569ba115206e843febb446f473ab525add4e08b2b9e3beffa16985
at: "2026-09-21T10:57:45Z"
pinned_images:
uptime-kuma: louislam/uptime-kuma:2.4.0
== live docker-compose.yml image line ==
image: louislam/uptime-kuma:2.4.0
== 3. update-journal.json after recovery ==
== 4. Was a HOLD set? (API view) ==
state 'running'
deployed True
updating False
deploying False
update_phase 'failed'
update_phase_label 'A frissítés nem sikerült'
update_error 'A frissítés megszakadt, mert a vezérlő újraindult, mielőtt az új verzió elindult volna. Az alkalmazás a korábbi verzióval fut tovább.'
health_probe.healthy True
containers [('louislam/uptime-kuma:2.4.0', 'Up 31 seconds (healthy)')]
installed_images {'uptime-kuma': 'louislam/uptime-kuma:2.4.0'}
pinned_images {'uptime-kuma': 'louislam/uptime-kuma:2.4.0'}
catalog_images {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
template_images {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
== hold-related log lines (positive+negative control) ==
grep -ci 'hold' in the log: 0
(negative control) grep -c 'ZZZ-not-present': 0
== 5. What the app page says to the household after the cut ==
--- [hu] badge + update-state block ---
<span class="tag tag-warn" title="Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.">Frissítés elérhető — ma</span>
sentences shown:
A frissítés indításához nyomd meg a Frissítés gombot.">Frissítés elérhető — ma
A frissítés megszakadt, mert a vezérlő újraindult, mielőtt az új verzió elindult volna. Az alkalmazás a korábbi verzióval fut tovább.
--- [en] badge + update-state block ---
<span class="tag tag-warn" title="A newer version of this app is available. Select the Update button to start it.">Update available — today</span>
sentences shown:
A frissítés megszakadt, mert a vezérlő újraindult, mielőtt az új verzió elindult volna. Az alkalmazás a korábbi verzióval fut tovább.
== 6. Is the app running AND serving? ==
uptime-kuma | louislam/uptime-kuma:2.4.0 | Up 2 minutes (healthy)
HTTP from inside the guest to the app container :3001/ -> 302
controller health probe:
{'healthy': True, 'last_check': '2026-09-21T11:06:22.247118521Z', 'details': [{'type': 'http', 'target': ':3001/', 'healthy': True, 'status': 302, 'latency': '4ms'}]}
@@ -0,0 +1,66 @@
### PATH PROVENANCE — exactly where I looked, with positive controls
== A. What /var/lib/docker actually IS inside the running guest ==
drwx--x--- 12 root root 4096 Sep 21 11:06 /var/lib/docker
drwx--x--- 12 root root 4096 Sep 21 11:06 /var/lib/felhom/docker
/var/lib/docker
== B. Configured data_dir (controller.yaml, path INSIDE the container) ==
== C. POSITIVE CONTROL — the directory I searched really is the controller data dir.
Listing it via the RUNNING guest, where the symlink resolves correctly:
total 9540
drwxr-xr-x 3 root root 4096 Sep 21 11:06 .
drwxr-xr-x 3 root root 4096 Sep 13 20:20 ..
drwxr-xr-x 9 root root 4096 Sep 21 11:04 catalog-cache
-rw-r--r-- 1 root root 870169 Sep 21 11:06 debug-ring.log
-rw------- 1 root root 32 Sep 13 20:22 encryption.key
-rw-r--r-- 1 root root 4673536 Sep 21 09:22 metrics.db
-rw-r--r-- 1 root root 32768 Sep 21 11:06 metrics.db-shm
-rw-r--r-- 1 root root 4157112 Sep 21 11:06 metrics.db-wal
-rw-r--r-- 1 root root 572 Sep 16 19:18 settings.json
-rw-r--r-- 1 root root 784 Sep 16 19:17 settings.json.bak
...and the SAME directory by its physical path (no symlink):
total 9540
drwxr-xr-x 3 root root 4096 Sep 21 11:06 .
drwxr-xr-x 3 root root 4096 Sep 13 20:20 ..
drwxr-xr-x 9 root root 4096 Sep 21 11:04 catalog-cache
-rw-r--r-- 1 root root 870169 Sep 21 11:06 debug-ring.log
-rw------- 1 root root 32 Sep 13 20:22 encryption.key
-rw-r--r-- 1 root root 4673536 Sep 21 09:22 metrics.db
-rw-r--r-- 1 root root 32768 Sep 21 11:06 metrics.db-shm
-rw-r--r-- 1 root root 4157112 Sep 21 11:06 metrics.db-wal
-rw-r--r-- 1 root root 572 Sep 16 19:18 settings.json
-rw-r--r-- 1 root root 784 Sep 16 19:17 settings.json.bak
== D. WHY the host-side read missed it: it is a BIND MOUNT, not a symlink ==
-- guest 9202 LXC config mountpoints (from the host) --
mp0: nvme-scratch:9202/vm-9202-disk-1.raw,mp=/var/lib/felhom,backup=1,size=70G
mp8: /mnt/hdd_1/scratch-drives/scratch_hdd,mp=/mnt/felhom-drives/scratch_hdd
mp9: /var/lib/felhom-agent/guests/9202/bootstrap,mp=/etc/felhom-bootstrap,ro=1
rootfs: nvme-scratch:9202/vm-9202-disk-0.raw,size=32G
-- inside the guest: is /var/lib/docker its own mount? --
/dev/loop1[/docker] /var/lib/docker ext4
-- readlink -f says it is NOT a symlink --
/var/lib/docker
CONCLUSION ON PATHS:
* INSIDE the running guest the coordinator's path is correct and is what I used for every
live read: /var/lib/docker/volumes/felhom-controller-data/_data/data/
* FROM THE HOST, reading the STOPPED guest via 'pct mount 9202', that same path is an EMPTY
mountpoint stub, because pct mount maps only the rootfs and does not apply the guest's
internal bind mounts. The bytes live at
/var/lib/lxc/9202/rootfs/var/lib/felhom/docker/volumes/felhom-controller-data/_data/data/
* My FIRST host-side read used the stub path and reported ABSENT. That was a FALSE NEGATIVE,
found by running 'find' over the whole rootfs rather than trusting the one path.
== E. controller.yaml location (the /etc/felhom guess was wrong too) ==
/mnt -> /mnt
/etc/felhom-bootstrap -> /etc/felhom-bootstrap
/var/lib/docker/volumes/felhom-controller-data/_data -> /opt/docker/felhom-controller
/opt/docker/stacks -> /opt/docker/stacks
/var/run/docker.sock -> /var/run/docker.sock
/var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml
/var/lib/felhom/docker/volumes/felhom-controller-data/_data/controller.yaml
@@ -0,0 +1,29 @@
### FINDING — the interrupted-update sentence is NOT localised (English page shows Hungarian)
-- EN page: does it carry the HUNGARIAN sentence? (ASCII fragments) --
'megszakadt' in app-postcut-en.html : 1 (expect >0 = the bug)
'vez'+'rl' stem in en : 1 (expect >0 = the bug)
-- EN page: is there any ENGLISH equivalent? --
'interrupted' in en : 0 (expect 0)
'restarted' in en : 0 (expect 0)
-- POSITIVE CONTROL: the page IS in English otherwise --
'Update available' in en : 1 (expect >0)
'Naprak' in en : 0 (expect 0)
-- NEGATIVE CONTROL --
'ZZZ-not-present' in en : 0 (expect 0)
-- source: the sentence is a bare Hungarian literal stored in Stack.UpdateError,
not a bundle key, so errText never sees it (it is stored state, rendered directly): --
95: MsgUpdateInterrupted = "A frissítés megszakadt, mert a vezérlő újraindult, mielőtt az új verzió elindult volna. Az alkalmazás a korábbi verzióval fut tovább."
902: m.finishUpdate(name, UpdatePhaseFailed, MsgUpdateInterrupted)
907: m.finishUpdate(name, UpdatePhaseFailed, MsgUpdateInterrupted)
936: m.finishUpdate(name, UpdatePhaseFailed, MsgUpdateInterrupted)
943: m.finishUpdate(name, UpdatePhaseFailed, MsgUpdateInterrupted)
-- does hu.json/en.json carry a key for it? --
/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/i18n/locales/en.json:115: "app_info.megszakadt": "Stopped:",
/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/i18n/locales/en.json:387: "app_import.a_feltoltes_megszakadt_ellenorizze_a": "The upload stopped — check the connection, then try again.",
/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/i18n/locales/en.json:844: "backups_restore.megszakadt_visszaallitas": "Interrupted restore",
/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/i18n/locales/en.json:1149: "storage.megszakadt": "Stopped:",
/mnt/5_hdd/felhom.eu/git/felhom-controller/controller/internal/i18n/locales/hu.json:115: "app_info.megszakadt": "Megszakadt:",
(grep count in i18n bundle dir: 2 files)
@@ -0,0 +1,64 @@
### STEP 6 — POST the update again, let it run to completion
-- POST /api/stacks/uptime-kuma/update --
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
HTTPCODE:202
-- phase timeline observed (poller) --
11:08:47Z "update_phase":"pulling"
11:08:58Z "update_phase":"verifying"
11:09:09Z "update_phase":"done"
[exited with code 0]
-- state after the update completed --
update_phase : done | Frissítve
update_error : None
updating : False
state : running
containers : [('louislam/uptime-kuma:2.5.0', 'Up 25 seconds (healthy)')]
installed_images: {'uptime-kuma': ('louislam/uptime-kuma:2.5.0', 'sha256:a8610b3b4c38077922b...')}
pinned_images : {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
catalog_images : {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
health_probe : {'healthy': True, 'last_check': '2026-09-21T11:09:07.392077664Z', 'details': [{'type': 'http', 'target': ':3001/', 'healthy': True, 'status': 302, 'latency': '3ms'}]}
-- app.yaml on disk --
installed_images:
uptime-kuma:
ref: louislam/uptime-kuma:2.5.0
digest: sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240
at: "2026-09-21T11:09:07Z"
pinned_images:
uptime-kuma: louislam/uptime-kuma:2.5.0
-- live compose image line --
image: louislam/uptime-kuma:2.5.0
-- controller log, the completed update --
2026/09/21 11:06:12 update.go:904: [WARN] [stacks] update recovery: uptime-kuma was interrupted in pulling (started 2026-09-21T11:04:52Z) — nothing had run; putting the pin back
2026/09/21 11:06:12 pin.go:93: [INFO] [stacks] pin uptime-kuma: uptime-kuma=louislam/uptime-kuma:2.4.0
2026/09/21 11:06:12 update.go:705: [INFO] [stacks] update uptime-kuma: pin and definition PUT BACK to the pre-update version (uptime-kuma=louislam/uptime-kuma:2.4.0)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container uptime-kuma (image=louislam/uptime-kuma:2.4.0, not a database)
2026/09/21 11:06:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 20s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 30s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 40s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 50s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m0s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m20s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m30s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m40s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m50s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m0s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:42 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/uptime-kuma/update
2026/09/21 11:08:42 router.go:81: [DEBUG] [api] POST /api/stacks/uptime-kuma/update (path=/stacks/uptime-kuma/update)
2026/09/21 11:08:42 router.go:582: [INFO] [api] update requested for stack: uptime-kuma
-- badge now that installed == catalog (2.5.0) --
<span class="tag tag-ok" title="Ez az alkalmazás a legfrissebb elérhető változatot futtatja.">Naprakész</span>
<span class="tag tag-ok" title="This app is running the newest version available.">Up to date</span>
-- container now serving --
uptime-kuma | louislam/uptime-kuma:2.5.0 | Up 40 seconds (healthy)
@@ -0,0 +1,19 @@
ff9717d REVERT the drill bump: uptime-kuma back to 2.4.0 (update-arc measurement finished)
==============================================================================
== summary
==============================================================================
image-pins OK (exit 0)
engine-major OK (exit 0)
catalog-since OK (exit 0)
copy-i18n OK (exit 0)
all catalog gates OK
pre-push [app-catalog-felhom.eu]: gates OK - push proceeding.
remote: . Processing 1 references
remote: Processed 1 references in total
To https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
89304ab..ff9717d main -> main
PUSH_RC=0
[exited with code 0]
@@ -0,0 +1,14 @@
### STEP 7 — R-524: the box now runs something NEWER than the catalog
-- force sync --
{"ok":true,"data":{"ok":true,"message":"Sablonok naprakészek — nincs változás"},"message":"Sablonok naprakészek — nincs változás"}
HTTPCODE:200
-- box catalog cache after the revert --
image: louislam/uptime-kuma:2.4.0
-- the asymmetry the whole row is about --
installed_images (what the box RUNS) : {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
catalog_images (what the catalog has): {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
pinned_images : {'uptime-kuma': 'louislam/uptime-kuma:2.5.0'}
@@ -0,0 +1,24 @@
### R-524 CAPTURE — box AHEAD (installed 2.5.0 vs catalog 2.4.0)
== 1+2. THE BADGE AND ITS TITLE, both languages (app page) ==
--- [hu] ---
<span class="tag tag-ok" title="Ez az alkalmazás a katalógusnál újabb változatot futtat, ezért nincs teendőd.">Naprakész</span>
--- [en] ---
<span class="tag tag-ok" title="This app is running a version newer than the catalog offers, so there is nothing for you to do.">Up to date</span>
== the same badge on the apps LIST page ==
[hu] class="tag tag-ok" title="Ez az alkalmazás a katalógusnál újabb változatot futtat, ezért nincs teendőd.">Naprakész
[en] class="tag tag-ok" title="This app is running a version newer than the catalog offers, so there is nothing for you to do.">Up to date
== CONTRAST: the ORDINARY up-to-date title, captured at step 2 when installed == catalog ==
[hu] title="Ez az alkalmazás a legfrissebb elérhető változatot futtatja."
[en] title="This app is running the newest version available."
-> the AHEAD title above is a DIFFERENT sentence, which is the v0.260.0 behaviour.
== SEARCH CONTROLS ==
POSITIVE 'tag-ok' in app-ahead-hu : 1 (expect >0)
POSITIVE 'Naprak' in app-ahead-hu : 1 (expect >0)
POSITIVE 'Up to date' in app-ahead-en: 1 (expect >0)
NEGATIVE 'tag-warn' in app-ahead-hu : 0 (expect 0 — NOT 'update available')
NEGATIVE 'tag-warn' in app-ahead-en : 0 (expect 0)
NEGATIVE 'ZZZ-not-present' : 0 (expect 0)
@@ -0,0 +1,33 @@
### R-524 — THE GUARDED UPDATE MUST REFUSE (409), both languages
== 3a. POST /api/stacks/uptime-kuma/update (Hungarian, the box's saved language) ==
{"ok":false,"error":"Ez a változat újabb a katalógusban lévőnél — visszalépés csak az üzemeltető kérésére."}
HTTPCODE:409
== 3b. POST /api/stacks/uptime-kuma/update?lang=en (English) ==
{"ok":false,"error":"This version is newer than the one in the catalog — moving back needs the operator."}
HTTPCODE:409
== 3c. control — ?lang=hu explicitly ==
{"ok":false,"error":"Ez a változat újabb a katalógusban lévőnél — visszalépés csak az üzemeltető kérésére."}
HTTPCODE:409
== 4. The controller log line for the refusal (verbatim, names BOTH image maps) ==
2026/09/21 11:11:06 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
2026/09/21 11:11:07 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
2026/09/21 11:11:08 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
-- controls --
POSITIVE 'downgrade' in the log : 3 (expect >0)
POSITIVE 'REFUSED' in the log : 3 (expect 3 = the three POSTs)
NEGATIVE 'ZZZ-not-present' : 0 (expect 0)
-- proof nothing moved: the app is untouched by the three refused POSTs --
uptime-kuma | louislam/uptime-kuma:2.5.0 | Up 2 minutes (healthy)
image: louislam/uptime-kuma:2.5.0
update-journal.json present (should be ABSENT — a refused update records nothing): ABSENT
(positive control that this path is real — catalog-cache is beside it:)
catalog-cache debug-ring.log encryption.key metrics.db metrics.db-shm metrics.db-wal settings.json settings.json.bak
@@ -0,0 +1,912 @@
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_NUMERIC = (unset),
LC_COLLATE = (unset),
LC_TIME = (unset),
LC_MESSAGES = (unset),
LC_MONETARY = (unset),
LC_ADDRESS = (unset),
LC_IDENTIFICATION = (unset),
LC_MEASUREMENT = (unset),
LC_PAPER = (unset),
LC_TELEPHONE = (unset),
LC_NAME = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
2026/09/21 11:06:12 main.go:334: [INFO] felhom-controller 0.260.0 starting (customer: demo-hp, domain: enkisfelhom.hu)
2026/09/21 11:06:12 settings.go:693: [INFO] [settings] Loaded settings from /opt/docker/felhom-controller/data/settings.json
2026/09/21 11:06:12 settings.go:1611: [DEBUG] [settings] AutoDiscoverStoragePaths discovered=[] fallback="" existing=1
2026/09/21 11:06:12 main.go:360: [INFO] Encryption key loaded from /opt/docker/felhom-controller/data/encryption.key
2026/09/21 11:06:12 manager.go:283: [INFO] [stacks] Using compose command: docker compose
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=false composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=false composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=false composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=false composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=true composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/09/21 11:06:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/09/21 11:06:12 manager.go:1620: [DEBUG] [stacks] getCatalogTemplateSlugs: found 53 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/09/21 11:06:12 manager.go:630: [DEBUG] [stacks] ScanStacks: catalog has 53 template slugs for orphan detection
2026/09/21 11:06:12 manager.go:661: [INFO] [stacks] ScanStacks complete: 55 stacks found (1 deployed, 54 available)
2026/09/21 11:06:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:12 deploy.go:1086: [DEBUG] [stacks] InjectMissingFields: checking 1 stacks
2026/09/21 11:06:12 deploy.go:1108: [DEBUG] [stacks] InjectMissingFields: checking stack uptime-kuma — 2 deploy fields, 2 existing env vars
2026/09/21 11:06:12 deploy.go:1171: [INFO] [stacks] InjectMissingFields: processed 1 stacks
2026/09/21 11:06:12 manager.go:422: [DEBUG] [stacks] MigrateEncryption: checking 1 deployed stacks for plaintext sensitive values
2026/09/21 11:06:12 manager.go:466: [INFO] [stacks] Encryption migration: no stacks needed migration
2026/09/21 11:06:12 desiredstate.go:137: [INFO] [stacks] desired-state backfill: 0 app(s) recorded as running, 0 left unrecorded (state ambiguous — legacy boot behaviour retained)
2026/09/21 11:06:12 installed.go:525: [INFO] [stacks] installed-images backfill: 0 app(s) recorded, 1 already had a record, 0 left unrecorded (could not be observed completely — unknown, which renders nothing)
2026/09/21 11:06:12 pin.go:289: [INFO] [stacks] pin adoption: 0 pinned, 1 already pinned, 0 left unpinned (0 not completely observed, 0 running something the template no longer offers)
2026/09/21 11:06:12 sync.go:117: [INFO] [sync] Starting catalog sync (repo: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git, interval: 15m0s)
2026/09/21 11:06:12 sync.go:208: [INFO] [sync] Starting catalog sync
2026/09/21 11:06:12 sync.go:296: [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main)
2026/09/21 11:06:12 sync.go:298: [DEBUG] [sync] git fetch --depth 1 origin main in /opt/docker/felhom-controller/data/catalog-cache
2026/09/21 11:06:12 update.go:904: [WARN] [stacks] update recovery: uptime-kuma was interrupted in pulling (started 2026-09-21T11:04:52Z) — nothing had run; putting the pin back
2026/09/21 11:06:12 sync.go:592: [DEBUG] [sync] Running: git fetch --depth 1 origin main
2026/09/21 11:06:12 [DEBUG] [stacks] SaveAppConfig: saving /opt/docker/stacks/uptime-kuma — 2 env vars, 0 encrypted, 0 sensitive fields
2026/09/21 11:06:12 [INFO] [stacks] SaveAppConfig: saved config for uptime-kuma
2026/09/21 11:06:12 pin.go:93: [INFO] [stacks] pin uptime-kuma: uptime-kuma=louislam/uptime-kuma:2.4.0
2026/09/21 11:06:12 update.go:705: [INFO] [stacks] update uptime-kuma: pin and definition PUT BACK to the pre-update version (uptime-kuma=louislam/uptime-kuma:2.4.0)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] CPUCollector.Start: sampleRate=5s
2026/09/21 11:06:12 main.go:511: [INFO] Metrics store opened at /opt/docker/felhom-controller/data/metrics.db
2026/09/21 11:06:12 main.go:523: [INFO] Metrics collector started (60s interval)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:06:12 restore_record_wiring.go:35: [INFO] [backup] restore record wired: /opt/docker/felhom-controller/data/restore-status.json (interrupted at startup: false)
2026/09/21 11:06:12 notifier.go:75: [INFO] Notifier disabled (hub not configured)
2026/09/21 11:06:12 main.go:642: [INFO] [mailrelay] app-email shim unavailable (no hub configured or disabled in config)
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: status-refresh (every 10s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="status-refresh" interval=10s totalJobs=1
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: stack-scan (every 2m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="stack-scan" interval=2m0s totalJobs=2
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: health-probes (every 10s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="health-probes" interval=10s totalJobs=3
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: system-health (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="system-health" interval=5m0s totalJobs=4
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: deadapp-check (every 30s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="deadapp-check" interval=30s totalJobs=5
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: ring-spill (every 30s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="ring-spill" interval=30s totalJobs=6
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job db-dump scheduled for 2026-09-22 02:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="db-dump" schedule="02:30" nextRun=2026-09-22T02:30:00+02:00 totalJobs=7
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: offsite-credential-retry (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="offsite-credential-retry" interval=5m0s totalJobs=8
2026/09/21 11:06:12 scheduler.go:102: [INFO] [scheduler] Registered periodic job: backup-cache (every 5m0s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] periodic job registered: name="backup-cache" interval=5m0s totalJobs=9
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job tier2-backup scheduled for 2026-09-22 03:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="tier2-backup" schedule="03:30" nextRun=2026-09-22T03:30:00+02:00 totalJobs=10
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offbox-backup scheduled for 2026-09-22 04:15 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offbox-backup" schedule="04:15" nextRun=2026-09-22T04:15:00+02:00 totalJobs=11
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-abandon-sweep scheduled for 2026-09-22 05:10 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-abandon-sweep" schedule="05:10" nextRun=2026-09-22T05:10:00+02:00 totalJobs=12
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-integrity scheduled for 2026-09-22 06:00 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-integrity" schedule="06:00" nextRun=2026-09-22T06:00:00+02:00 totalJobs=13
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job offsite-proof scheduled for 2026-09-22 05:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="offsite-proof" schedule="05:30" nextRun=2026-09-22T05:30:00+02:00 totalJobs=14
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job metrics-prune scheduled for 2026-09-22 04:00 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="metrics-prune" schedule="04:00" nextRun=2026-09-22T04:00:00+02:00 totalJobs=15
2026/09/21 11:06:12 scheduler.go:132: [INFO] [scheduler] Daily job fill-watch scheduled for 2026-09-22 03:30 CEST
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job registered: name="fill-watch" schedule="03:30" nextRun=2026-09-22T03:30:00+02:00 totalJobs=16
2026/09/21 11:06:12 selftest.go:50: [INFO] ========== Startup Self-Test ==========
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3844MB avail≈22054MB
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26154728 → total=25898MB avail=22054MB used=3844MB (14.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.32 1.05 0.94 11/1204 124" → 1m=1.32 5m=1.05 15m=0.94
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 60.6°C (hwmon2)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo done in 66ms — mem=3844MB/25898MB (14.8%), rootDisk=6.7GB/68.4GB (9.8%), load=1.32/1.05/0.94, temp=60.6°C (hwmon2), cpu=0.0%
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Docker socket: reachable (v29.8.0)
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Stacks directory: /opt/docker/stacks
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Data directory: /opt/docker/felhom-controller/data (writable)
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] System data path: /mnt/sys_drive
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Storage paths: 1 connected, 0 disconnected
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Git catalog: 53 app definitions found
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Hub connectivity: hub disabled, skipped
2026/09/21 11:06:12 selftest.go:68: [INFO] [PASS] Metrics DB: 4.5 MB
2026/09/21 11:06:12 selftest.go:70: [INFO] ========================================
2026/09/21 11:06:12 selftest.go:71: [INFO] Self-test complete: 8 passed, 0 warnings, 0 failed
2026/09/21 11:06:12 scheduler.go:206: [INFO] [scheduler] Starting scheduler with 16 jobs
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] scheduler started: periodic=8 daily=8
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-abandon-sweep: next run at 2026-09-22 05:10:00 CEST (waiting 16h3m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job db-dump: next run at 2026-09-22 02:30:00 CEST (waiting 13h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-proof: next run at 2026-09-22 05:30:00 CEST (waiting 16h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offsite-integrity: next run at 2026-09-22 06:00:00 CEST (waiting 16h53m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job tier2-backup: next run at 2026-09-22 03:30:00 CEST (waiting 14h23m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job offbox-backup: next run at 2026-09-22 04:15:00 CEST (waiting 15h8m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job metrics-prune: next run at 2026-09-22 04:00:00 CEST (waiting 14h53m48s)
2026/09/21 11:06:12 scheduler.go:67: [DEBUG] [scheduler] daily job fill-watch: next run at 2026-09-22 03:30:00 CEST (waiting 14h23m48s)
2026/09/21 11:06:12 server.go:250: [DEBUG] [web] NewServer: initializing web server v0.260.0
2026/09/21 11:06:12 server.go:251: [DEBUG] [web] NewServer: backup=true scheduler=true alertMgr=true notifier=true updater=false
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:06:12 backup.go:465: [DEBUG] groupStacksByDrive: /mnt/sys_drive → [uptime-kuma]
2026/09/21 11:06:12 backup.go:1107: [INFO] [backup] Found 0 DB dump files across drives
2026/09/21 11:06:12 dbdump.go:128: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/09/21 11:06:12 sync.go:212: [ERROR] [sync] Catalog sync failed: git fetch: git fetch --depth 1 origin main: exit status 128
stderr: fatal: unable to access 'https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git/': Could not resolve host: gitea.dooplex.hu
2026/09/21 11:06:12 sync.go:122: [INFO] [sync] Initial sync: Git hiba: git fetch: git fetch --depth 1 origin main: exit status 128
stderr: fatal: unable to access 'https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git/': Could not resolve host: gitea.dooplex.hu
2026/09/21 11:06:12 dbdump.go:147: [DEBUG] DiscoverDatabases: docker ps output: 7c794623b894 felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.260.0
e87c990f2026 uptime-kuma uptime-kuma louislam/uptime-kuma:2.4.0
6d206504c99e filebrowser filebrowser gtstef/filebrowser:1.3.3-stable
2515331bc19e traefik traefik traefik:v3.6.7
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.260.0, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container uptime-kuma (image=louislam/uptime-kuma:2.4.0, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.3.3-stable, not a database)
2026/09/21 11:06:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.6.7, not a database)
2026/09/21 11:06:12 dbdump.go:203: [DEBUG] DiscoverDatabases: found 0 database(s), skipped 4 non-DB container(s)
2026/09/21 11:06:12 dbdump.go:206: [INFO] [backup] Discovered 0 databases
2026/09/21 11:06:12 [INFO] [stacks] ParseComposeHDDMounts: found 0 HDD mounts for /opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:06:12 [INFO] [backup] Discovered app data: 1 apps
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/sys_drive" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 recovery_unit.go:224: [INFO] [backup] Recovery unit captured for uptime-kuma → /mnt/sys_drive/felhom-data/backups/primary/uptime-kuma (images=1, secrets-referenced=0, data_keys=0, portable-carried=0/0, withheld=0)
2026/09/21 11:06:12 backup.go:1177: [INFO] [backup] Backup status cache refreshed
2026/09/21 11:06:12 server.go:324: [DEBUG] [web] loadTemplates: lang=hu loaded 81 templates, 1877 markers expanded in 28.728841ms
2026/09/21 11:06:12 server.go:324: [DEBUG] [web] loadTemplates: lang=en loaded 81 templates, 1877 markers expanded in 19.600884ms
2026/09/21 11:06:12 server.go:270: [INFO] [web] Auth: using password from settings.json
2026/09/21 11:06:12 server.go:811: [DEBUG] [web] CatchAllMiddleware: controller host=felhom.enkisfelhom.hu
2026/09/21 11:06:12 main.go:1856: [INFO] Web UI listening on :8080
2026/09/21 11:06:12 manager.go:258: [DEBUG] [integrations] ReapplyConfigForTarget: target=filebrowser integrations=0
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3874MB avail≈22024MB
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26119944 → total=25898MB avail=22024MB used=3874MB (15.0%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.32 1.05 0.94 6/1204 179" → 1m=1.32 5m=1.05 15m=0.94
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 60.6°C (hwmon2)
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetInfo done in 79ms — mem=3874MB/25898MB (15.0%), rootDisk=6.7GB/68.4GB (9.8%), load=1.32/1.05/0.94, temp=60.6°C (hwmon2), cpu=0.0%
2026/09/21 11:06:12 healthcheck.go:86: [DEBUG] [monitor] Raw values: disk=9.8%, hdd=1.8% (configured=true), mem=15.0% (3874MB/25898MB), cpu=0.0%, temp=60.6°C (hwmon2)
2026/09/21 11:06:12 healthcheck.go:118: [DEBUG] [monitor] SSD disk: OK (10%)
2026/09/21 11:06:12 healthcheck.go:151: [DEBUG] [monitor] Memory: OK (15%)
2026/09/21 11:06:12 healthcheck.go:187: [DEBUG] [monitor] Temperature: OK (61°C)
2026/09/21 11:06:12 infra.go:228: [INFO] [infra] connected felhom-controller to traefik-public
2026/09/21 11:06:12 infra.go:67: [INFO] [infra] cloudflared skipped — no cf_tunnel_token configured (LAN-only node)
2026/09/21 11:06:12 healthcheck.go:201: [DEBUG] [monitor] Docker daemon: OK
2026/09/21 11:06:12 healthcheck.go:209: [DEBUG] [monitor] Checking 1 protected containers: [traefik]
2026/09/21 11:06:12 healthcheck.go:219: [DEBUG] [monitor] All protected containers running
2026/09/21 11:06:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/felhom-drives/scratch_hdd" total=937.8 GB used=17.0 GB avail=873.2GB (1.8%)
2026/09/21 11:06:12 healthcheck.go:238: [INFO] [monitor] Health check: status=ok
2026/09/21 11:06:12 healthcheck.go:242: [DEBUG] [monitor] Final status: ok (issues=0, warnings=0, info=4)
2026/09/21 11:06:12 handlers.go:3399: [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (1 storage path(s))
2026/09/21 11:06:17 info.go:13: [DEBUG] [system] CPUCollector: first sample — cpu=16.8% (idle=3282 total=3943)
2026/09/21 11:06:17 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 1 targets (0 skipped not due, 0 skipped no container)
2026/09/21 11:06:22 healthprobe.go:153: [DEBUG] Health probe uptime-kuma: HTTP GET :3001/ → 302 (4ms)
2026/09/21 11:06:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:22 healthprobe.go:133: [INFO] Health probes: 1 ok (of 1 probed)
2026/09/21 11:06:27 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:27 main.go:2273: [INFO] [bootrecon] boot window: fleet settled after 10s (3 identical samples 5s apart) — sweeping
2026/09/21 11:06:27 bootrecon.go:255: [INFO] [bootrecon] Boot reconciliation: no boot-orphaned apps (nothing to start)
2026/09/21 11:06:32 auth.go:154: [DEBUG] [web] login attempt from 172.18.0.3:56160 (X-Forwarded-For: 172.18.0.1)
2026/09/21 11:06:32 auth.go:202: [DEBUG] [web] login successful from 172.18.0.1, creating session
2026/09/21 11:06:32 auth.go:268: [DEBUG] [web] session created, expires=2026-09-28T11:06:32Z, active_sessions=1
2026/09/21 11:06:32 auth.go:222: [INFO] [web] Login from 172.18.0.3:56160
2026/09/21 11:06:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:06:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:32 auth.go:142: [DEBUG] [web] auth: valid session for GET /stacks
2026/09/21 11:06:32 server.go:542: [DEBUG] [web] ServeHTTP: GET /stacks from 172.18.0.3:56160
2026/09/21 11:06:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:42 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:06:42 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:42 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:06:42 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 20s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:42 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:06:42 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:52 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:06:52 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:06:52 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:06:52 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:06:52 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:06:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 30s ago, effective interval 5m0s, healthy=true
2026/09/21 11:06:52 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:02 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 40s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:02 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:02 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈4073MB avail≈21825MB
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=25883456 → total=25898MB avail=21825MB used=4073MB (15.7%)
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="0.94 0.98 0.92 2/1190 371" → 1m=0.94 5m=0.98 15m=0.92
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 53.8°C (hwmon2)
2026/09/21 11:07:12 info.go:13: [DEBUG] [system] GetInfo done in 62ms — mem=4073MB/25898MB (15.7%), rootDisk=6.7GB/68.4GB (9.8%), load=0.94/0.98/0.92, temp=53.8°C (hwmon2), cpu=15.9%
2026/09/21 11:07:12 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:12 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:07:12 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 50s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:12 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:12 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:07:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:07:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:07:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m0s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:07:42 info.go:13: [DEBUG] [system] GetDiskUsage: path="/" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:07:42 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/felhom-drives/scratch_hdd" total=937.8 GB used=17.0 GB avail=873.2GB (1.8%)
2026/09/21 11:07:42 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/sys_drive" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:07:42 fillwatch.go:256: [INFO] [fillwatch] checked 3 filesystem(s), 0 unreadable/skipped, 0 notification(s); bands: all ok
2026/09/21 11:07:42 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:07:42 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:07:42 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m20s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:42 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:42 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:42 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:07:52 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:07:52 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:07:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m30s ago, effective interval 5m0s, healthy=true
2026/09/21 11:07:52 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:07:52 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:02 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:02 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m40s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:02 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:11 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:08:11 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3984MB avail≈21914MB
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=25988332 → total=25898MB avail=21914MB used=3984MB (15.4%)
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.7GB avail=58.2GB (9.8%)
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.2GB (1.8%)
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="0.75 0.92 0.91 7/1193 488" → 1m=0.75 5m=0.92 15m=0.91
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 54.6°C (hwmon2)
2026/09/21 11:08:12 info.go:13: [DEBUG] [system] GetInfo done in 72ms — mem=3984MB/25898MB (15.4%), rootDisk=6.7GB/68.4GB (9.8%), load=0.75/0.92/0.91, temp=54.6°C (hwmon2), cpu=8.7%
2026/09/21 11:08:12 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:08:12 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:08:12 scheduler.go:346: [INFO] [scheduler] Running job: stack-scan
2026/09/21 11:08:12 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m50s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:12 scheduler.go:67: [DEBUG] [scheduler] job stack-scan: execution starting
2026/09/21 11:08:12 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:12 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=false composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=false composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=false composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=false composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=true composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/09/21 11:08:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/09/21 11:08:12 manager.go:1620: [DEBUG] [stacks] getCatalogTemplateSlugs: found 53 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/09/21 11:08:12 manager.go:630: [DEBUG] [stacks] ScanStacks: catalog has 53 template slugs for orphan detection
2026/09/21 11:08:12 manager.go:661: [INFO] [stacks] ScanStacks complete: 55 stacks found (1 deployed, 54 available)
2026/09/21 11:08:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:12 scheduler.go:363: [INFO] [scheduler] Job stack-scan completed (took 68ms)
2026/09/21 11:08:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:13 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:08:13 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:08:16 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:08:16 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:08:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m0s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m10s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:42 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/uptime-kuma/update
2026/09/21 11:08:42 router.go:81: [DEBUG] [api] POST /api/stacks/uptime-kuma/update (path=/stacks/uptime-kuma/update)
2026/09/21 11:08:42 router.go:582: [INFO] [api] update requested for stack: uptime-kuma
2026/09/21 11:08:42 router.go:81: [DEBUG] [api] actionStack: action=update name=uptime-kuma
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈4062MB avail≈21836MB
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=25896520 → total=25898MB avail=21836MB used=4062MB (15.7%)
2026/09/21 11:08:42 deploy.go:1232: [INFO] [stacks] Memory check: total=25898MB, reserved=384MB, usable=25514MB, committed_used=0MB, new_req=50MB, remaining=25464MB
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] GetDiskUsage: path="/" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈4040MB avail≈21858MB
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=25922964 → total=25898MB avail=21858MB used=4040MB (15.6%)
2026/09/21 11:08:42 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:42 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:08:42 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:08:42 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:42 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:42 deploy.go:1232: [INFO] [stacks] Memory check: total=25898MB, reserved=384MB, usable=25514MB, committed_used=0MB, new_req=50MB, remaining=25464MB
2026/09/21 11:08:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m20s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:42 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:42 info.go:13: [DEBUG] [system] GetDiskUsage: path="/" total=68.4 GB used=6.7 GB avail=58.2GB (9.8%)
2026/09/21 11:08:42 update.go:429: [INFO] [stacks] update uptime-kuma: accepted — guarded update started
2026/09/21 11:08:42 update.go:858: [INFO] [stacks] update uptime-kuma: phase checking
2026/09/21 11:08:42 update_guard.go:224: [DEBUG] [backup] update precondition for uptime-kuma: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/21 11:08:42 update.go:544: [INFO] [stacks] update uptime-kuma: precondition met — Tier 1 (own recovery unit) copy from 2026-09-21T11:06:12Z (3m0s old, limit 24h0m0s)
2026/09/21 11:08:42 update.go:858: [INFO] [stacks] update uptime-kuma: phase safety-dump
2026/09/21 11:08:42 dbdump.go:128: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/09/21 11:08:42 dbdump.go:147: [DEBUG] DiscoverDatabases: docker ps output: 7c794623b894 felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.260.0
e87c990f2026 uptime-kuma uptime-kuma louislam/uptime-kuma:2.4.0
6d206504c99e filebrowser filebrowser gtstef/filebrowser:1.3.3-stable
2515331bc19e traefik traefik traefik:v3.6.7
2026/09/21 11:08:42 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.260.0, not a database)
2026/09/21 11:08:42 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container uptime-kuma (image=louislam/uptime-kuma:2.4.0, not a database)
2026/09/21 11:08:42 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.3.3-stable, not a database)
2026/09/21 11:08:42 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.6.7, not a database)
2026/09/21 11:08:42 dbdump.go:203: [DEBUG] DiscoverDatabases: found 0 database(s), skipped 4 non-DB container(s)
2026/09/21 11:08:42 dbdump.go:206: [INFO] [backup] Discovered 0 databases
2026/09/21 11:08:42 update_guard.go:452: [INFO] [backup] update safety dump for uptime-kuma: the app has no database — nothing to copy (no-op)
2026/09/21 11:08:42 update.go:576: [INFO] [stacks] update uptime-kuma: safety dump done (0 file(s)) []
2026/09/21 11:08:42 update.go:858: [INFO] [stacks] update uptime-kuma: phase pinning
2026/09/21 11:08:42 [DEBUG] [stacks] SaveAppConfig: saving /opt/docker/stacks/uptime-kuma — 2 env vars, 0 encrypted, 0 sensitive fields
2026/09/21 11:08:42 [INFO] [stacks] SaveAppConfig: saved config for uptime-kuma
2026/09/21 11:08:42 pin.go:362: [INFO] [stacks] update uptime-kuma: pin advanced to the catalog's current definition (uptime-kuma=louislam/uptime-kuma:2.5.0)
2026/09/21 11:08:42 update.go:858: [INFO] [stacks] update uptime-kuma: phase pulling
2026/09/21 11:08:42 manager.go:1384: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/09/21 11:08:42 manager.go:1393: [DEBUG] Running: docker compose pull (in /opt/docker/stacks/uptime-kuma)
2026/09/21 11:08:47 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:08:47 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:08:52 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:08:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m30s ago, effective interval 5m0s, healthy=true
2026/09/21 11:08:52 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:08:52 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:08:52 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:56 manager.go:1413: [DEBUG] Command completed: docker compose pull (took 13.9s)
2026/09/21 11:08:56 update.go:858: [INFO] [stacks] update uptime-kuma: phase starting
2026/09/21 11:08:56 manager.go:1384: [DEBUG] Env vars for compose: [PATH, HOSTNAME, FELHOM_BOOTSTRAP_PATH, HOME, DOMAIN, SUBDOMAIN, DOMAIN, IMPORT_PATH] (8 app + 0 system)
2026/09/21 11:08:56 manager.go:1393: [DEBUG] Running: docker compose up -d --remove-orphans (in /opt/docker/stacks/uptime-kuma)
2026/09/21 11:08:56 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:08:56 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:08:57 manager.go:1413: [DEBUG] Command completed: docker compose up -d --remove-orphans (took 1.1s)
2026/09/21 11:08:57 update.go:858: [INFO] [stacks] update uptime-kuma: phase verifying
2026/09/21 11:08:57 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:08:58 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:08:58 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:02 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:02 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:02 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (0 skipped not due, 0 skipped no container)
2026/09/21 11:09:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:07 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:07 healthprobe.go:153: [DEBUG] Health probe uptime-kuma: HTTP GET :3001/ → 302 (3ms)
2026/09/21 11:09:07 update.go:652: [INFO] [stacks] update uptime-kuma: healthy after 10s (the app's health check passed)
2026/09/21 11:09:07 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:09:07 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:07 [DEBUG] [stacks] SaveAppConfig: saving /opt/docker/stacks/uptime-kuma — 2 env vars, 0 encrypted, 0 sensitive fields
2026/09/21 11:09:07 [INFO] [stacks] SaveAppConfig: saved config for uptime-kuma
2026/09/21 11:09:07 installed.go:408: [INFO] [stacks] installed-images uptime-kuma: recorded 1 service(s) (uptime-kuma=louislam/uptime-kuma:2.5.0 (sha256:a8610b3b4c38…))
2026/09/21 11:09:07 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:07 update.go:658: [INFO] [stacks] update uptime-kuma: DONE in 25s
2026/09/21 11:09:09 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:09:09 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:11 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:09:11 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:12 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:09:12 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈4093MB avail≈21805MB
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=25860040 → total=25898MB avail=21805MB used=4093MB (15.8%)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.9GB avail=57.9GB (10.2%)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.1GB (1.8%)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.07 0.97 0.92 3/1195 889" → 1m=1.07 5m=0.97 15m=0.92
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 53.0°C (hwmon2)
2026/09/21 11:09:12 info.go:13: [DEBUG] [system] GetInfo done in 63ms — mem=4093MB/25898MB (15.8%), rootDisk=6.9GB/68.4GB (10.2%), load=1.07/0.97/0.92, temp=53.0°C (hwmon2), cpu=6.5%
2026/09/21 11:09:12 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:12 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:12 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:09:12 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:09:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 5s ago, effective interval 5m0s, healthy=true
2026/09/21 11:09:12 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:09:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 15s ago, effective interval 5m0s, healthy=true
2026/09/21 11:09:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:09:24 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:09:24 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:09:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 25s ago, effective interval 5m0s, healthy=true
2026/09/21 11:09:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:09:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:34 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:09:34 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:09:36 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:09:36 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:09:42 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:42 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:09:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 35s ago, effective interval 5m0s, healthy=true
2026/09/21 11:09:42 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:42 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:09:42 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:09:42 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:52 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:09:52 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:09:52 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:09:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 45s ago, effective interval 5m0s, healthy=true
2026/09/21 11:09:52 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:02 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:02 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 55s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:02 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3939MB avail≈21959MB
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26042720 → total=25898MB avail=21959MB used=3939MB (15.2%)
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.9GB avail=57.9GB (10.2%)
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.1GB (1.8%)
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.17 1.01 0.94 4/1190 1029" → 1m=1.17 5m=1.01 15m=0.94
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 55.4°C (hwmon2)
2026/09/21 11:10:12 info.go:13: [DEBUG] [system] GetInfo done in 66ms — mem=3939MB/25898MB (15.2%), rootDisk=6.9GB/68.4GB (10.2%), load=1.17/1.01/0.94, temp=55.4°C (hwmon2), cpu=3.4%
2026/09/21 11:10:12 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:10:12 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:10:12 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m5s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:12 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:12 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:12 scheduler.go:346: [INFO] [scheduler] Running job: stack-scan
2026/09/21 11:10:12 scheduler.go:67: [DEBUG] [scheduler] job stack-scan: execution starting
2026/09/21 11:10:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=false composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=false composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=false composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=false composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=true composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/09/21 11:10:12 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/09/21 11:10:12 manager.go:1620: [DEBUG] [stacks] getCatalogTemplateSlugs: found 53 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/09/21 11:10:12 manager.go:630: [DEBUG] [stacks] ScanStacks: catalog has 53 template slugs for orphan detection
2026/09/21 11:10:12 manager.go:661: [INFO] [stacks] ScanStacks complete: 55 stacks found (1 deployed, 54 available)
2026/09/21 11:10:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:12 scheduler.go:363: [INFO] [scheduler] Job stack-scan completed (took 82ms)
2026/09/21 11:10:12 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/sync
2026/09/21 11:10:12 router.go:81: [DEBUG] [api] POST /api/sync (path=/sync)
2026/09/21 11:10:12 router.go:1002: [INFO] [api] Manual catalog sync requested
2026/09/21 11:10:12 sync.go:208: [INFO] [sync] Starting catalog sync
2026/09/21 11:10:12 sync.go:296: [INFO] [sync] Pulling latest from https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (branch: main)
2026/09/21 11:10:12 sync.go:298: [DEBUG] [sync] git fetch --depth 1 origin main in /opt/docker/felhom-controller/data/catalog-cache
2026/09/21 11:10:12 sync.go:592: [DEBUG] [sync] Running: git fetch --depth 1 origin main
2026/09/21 11:10:12 sync.go:592: [DEBUG] [sync] Running: git reset --hard origin/main
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] actualbudget/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] actualbudget/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] adventurelog/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] adventurelog/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] audiobookshelf/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] audiobookshelf/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] bentopdf/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] bentopdf/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] bookstack/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] bookstack/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] calcom/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] calcom/.felhom.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] calibre-web/docker-compose.yml: hash match, skipped
2026/09/21 11:10:12 sync.go:416: [DEBUG] [sync] calibre-web/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] claper/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] claper/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] code-server/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] code-server/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] crafty-controller/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] crafty-controller/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] docmost/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] docmost/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] emby/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] emby/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] ghost/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] ghost/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gitea/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gitea/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] glance/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] glance/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gokapi/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gokapi/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] grafana/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] grafana/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gramps-web/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] gramps-web/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] home-assistant/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] home-assistant/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] homebox/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] homebox/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] homepage/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] homepage/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] immich/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] immich/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] jellyfin/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] jellyfin/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] kimai/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] kimai/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] komga/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] komga/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] mealie/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] mealie/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] n8n/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] n8n/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] navidrome/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] navidrome/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] nextcloud/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] nextcloud/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] onlyoffice/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] onlyoffice/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] opengist/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] opengist/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] outline/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] outline/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] paperless-ngx/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] paperless-ngx/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] papra/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] papra/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] plant-it/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] plant-it/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] plex/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] plex/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] privatebin/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] privatebin/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] radarr/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] radarr/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] rallly/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] rallly/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] recipe-importer/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] recipe-importer/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] romm/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] romm/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] seerr/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] seerr/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] sonarr/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] sonarr/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] sparkyfitness/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] sparkyfitness/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] tandoor/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] tandoor/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] termix/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] termix/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:509: [DEBUG] [sync] uptime-kuma: catalog has moved past the pin — rendering the stored applied definition
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] uptime-kuma/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] uptime-kuma/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] vaultwarden/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] vaultwarden/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] vikunja/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] vikunja/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wanderer/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wanderer/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wger/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wger/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wishlist/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] wishlist/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] zipline/docker-compose.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:416: [DEBUG] [sync] zipline/.felhom.yml: hash match, skipped
2026/09/21 11:10:13 sync.go:263: [INFO] [sync] Catalog sync complete
2026/09/21 11:10:13 router.go:1008: [INFO] [api] Catalog sync completed: Sablonok naprakészek — nincs változás
2026/09/21 11:10:15 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:10:15 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:10:22 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:22 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:22 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m15s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:22 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:22 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:32 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:32 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:32 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m25s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:32 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:32 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/rescan
2026/09/21 11:10:32 router.go:81: [DEBUG] [api] POST /api/stacks/rescan (path=/stacks/rescan)
2026/09/21 11:10:32 router.go:362: [INFO] [api] Manual stack rescan requested
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "actualbudget" deployed=false composePath=/opt/docker/stacks/actualbudget/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "adventurelog" deployed=false composePath=/opt/docker/stacks/adventurelog/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "audiobookshelf" deployed=false composePath=/opt/docker/stacks/audiobookshelf/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bentopdf" deployed=false composePath=/opt/docker/stacks/bentopdf/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "bookstack" deployed=false composePath=/opt/docker/stacks/bookstack/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calcom" deployed=false composePath=/opt/docker/stacks/calcom/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "calibre-web" deployed=false composePath=/opt/docker/stacks/calibre-web/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "claper" deployed=false composePath=/opt/docker/stacks/claper/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "code-server" deployed=false composePath=/opt/docker/stacks/code-server/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "crafty-controller" deployed=false composePath=/opt/docker/stacks/crafty-controller/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "docmost" deployed=false composePath=/opt/docker/stacks/docmost/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "emby" deployed=false composePath=/opt/docker/stacks/emby/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "filebrowser" deployed=false composePath=/opt/docker/stacks/filebrowser/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "ghost" deployed=false composePath=/opt/docker/stacks/ghost/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gitea" deployed=false composePath=/opt/docker/stacks/gitea/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "glance" deployed=false composePath=/opt/docker/stacks/glance/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gokapi" deployed=false composePath=/opt/docker/stacks/gokapi/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "grafana" deployed=false composePath=/opt/docker/stacks/grafana/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "gramps-web" deployed=false composePath=/opt/docker/stacks/gramps-web/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "home-assistant" deployed=false composePath=/opt/docker/stacks/home-assistant/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homebox" deployed=false composePath=/opt/docker/stacks/homebox/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "homepage" deployed=false composePath=/opt/docker/stacks/homepage/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "immich" deployed=false composePath=/opt/docker/stacks/immich/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "jellyfin" deployed=false composePath=/opt/docker/stacks/jellyfin/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "kimai" deployed=false composePath=/opt/docker/stacks/kimai/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "komga" deployed=false composePath=/opt/docker/stacks/komga/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "mealie" deployed=false composePath=/opt/docker/stacks/mealie/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "n8n" deployed=false composePath=/opt/docker/stacks/n8n/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "navidrome" deployed=false composePath=/opt/docker/stacks/navidrome/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "nextcloud" deployed=false composePath=/opt/docker/stacks/nextcloud/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "onlyoffice" deployed=false composePath=/opt/docker/stacks/onlyoffice/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "opengist" deployed=false composePath=/opt/docker/stacks/opengist/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "outline" deployed=false composePath=/opt/docker/stacks/outline/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "paperless-ngx" deployed=false composePath=/opt/docker/stacks/paperless-ngx/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "papra" deployed=false composePath=/opt/docker/stacks/papra/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plant-it" deployed=false composePath=/opt/docker/stacks/plant-it/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "plex" deployed=false composePath=/opt/docker/stacks/plex/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "privatebin" deployed=false composePath=/opt/docker/stacks/privatebin/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "radarr" deployed=false composePath=/opt/docker/stacks/radarr/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "rallly" deployed=false composePath=/opt/docker/stacks/rallly/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "recipe-importer" deployed=false composePath=/opt/docker/stacks/recipe-importer/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "romm" deployed=false composePath=/opt/docker/stacks/romm/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "seerr" deployed=false composePath=/opt/docker/stacks/seerr/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sonarr" deployed=false composePath=/opt/docker/stacks/sonarr/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "sparkyfitness" deployed=false composePath=/opt/docker/stacks/sparkyfitness/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "tandoor" deployed=false composePath=/opt/docker/stacks/tandoor/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "termix" deployed=false composePath=/opt/docker/stacks/termix/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "traefik" deployed=false composePath=/opt/docker/stacks/traefik/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "uptime-kuma" deployed=true composePath=/opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vaultwarden" deployed=false composePath=/opt/docker/stacks/vaultwarden/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "vikunja" deployed=false composePath=/opt/docker/stacks/vikunja/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wanderer" deployed=false composePath=/opt/docker/stacks/wanderer/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wger" deployed=false composePath=/opt/docker/stacks/wger/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "wishlist" deployed=false composePath=/opt/docker/stacks/wishlist/docker-compose.yml
2026/09/21 11:10:32 manager.go:563: [DEBUG] [stacks] ScanStacks: found stack "zipline" deployed=false composePath=/opt/docker/stacks/zipline/docker-compose.yml
2026/09/21 11:10:32 manager.go:1620: [DEBUG] [stacks] getCatalogTemplateSlugs: found 53 template slugs in /opt/docker/felhom-controller/data/catalog-cache/templates
2026/09/21 11:10:32 manager.go:630: [DEBUG] [stacks] ScanStacks: catalog has 53 template slugs for orphan detection
2026/09/21 11:10:32 manager.go:661: [INFO] [stacks] ScanStacks complete: 55 stacks found (1 deployed, 54 available)
2026/09/21 11:10:32 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:32 router.go:369: [INFO] [api] Stack rescan completed: 55 stacks found
2026/09/21 11:10:33 auth.go:142: [DEBUG] [web] auth: valid session for GET /api/stacks/uptime-kuma
2026/09/21 11:10:33 router.go:81: [DEBUG] [api] GET /api/stacks/uptime-kuma (path=/stacks/uptime-kuma)
2026/09/21 11:10:42 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:10:42 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:10:42 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:42 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:42 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:42 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m35s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:42 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:52 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:10:52 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:10:52 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:10:52 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m45s ago, effective interval 5m0s, healthy=true
2026/09/21 11:10:52 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:10:55 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:10:55 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:10:56 auth.go:142: [DEBUG] [web] auth: valid session for GET /stacks
2026/09/21 11:10:56 server.go:542: [DEBUG] [web] ServeHTTP: GET /stacks from 172.18.0.3:56160
2026/09/21 11:10:57 auth.go:142: [DEBUG] [web] auth: valid session for GET /apps/uptime-kuma
2026/09/21 11:10:57 server.go:542: [DEBUG] [web] ServeHTTP: GET /apps/uptime-kuma from 172.18.0.3:56160
2026/09/21 11:10:58 auth.go:142: [DEBUG] [web] auth: valid session for GET /stacks
2026/09/21 11:10:58 server.go:542: [DEBUG] [web] ServeHTTP: GET /stacks from 172.18.0.3:56160
2026/09/21 11:11:02 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:11:02 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 1m55s ago, effective interval 5m0s, healthy=true
2026/09/21 11:11:02 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:11:02 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:11:02 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:11:06 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/uptime-kuma/update
2026/09/21 11:11:06 router.go:81: [DEBUG] [api] POST /api/stacks/uptime-kuma/update (path=/stacks/uptime-kuma/update)
2026/09/21 11:11:06 router.go:582: [INFO] [api] update requested for stack: uptime-kuma
2026/09/21 11:11:06 router.go:81: [DEBUG] [api] actionStack: action=update name=uptime-kuma
2026/09/21 11:11:06 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
2026/09/21 11:11:07 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/uptime-kuma/update
2026/09/21 11:11:07 router.go:81: [DEBUG] [api] POST /api/stacks/uptime-kuma/update (path=/stacks/uptime-kuma/update)
2026/09/21 11:11:07 router.go:582: [INFO] [api] update requested for stack: uptime-kuma
2026/09/21 11:11:07 router.go:81: [DEBUG] [api] actionStack: action=update name=uptime-kuma
2026/09/21 11:11:07 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
2026/09/21 11:11:08 auth.go:142: [DEBUG] [web] auth: valid session for POST /api/stacks/uptime-kuma/update
2026/09/21 11:11:08 router.go:81: [DEBUG] [api] POST /api/stacks/uptime-kuma/update (path=/stacks/uptime-kuma/update)
2026/09/21 11:11:08 router.go:582: [INFO] [api] update requested for stack: uptime-kuma
2026/09/21 11:11:08 router.go:81: [DEBUG] [api] actionStack: action=update name=uptime-kuma
2026/09/21 11:11:08 update.go:292: [ERROR] [stacks] update uptime-kuma REFUSED (downgrade): installed is provably NEWER than the catalog on every differing service (installed=map[uptime-kuma:{louislam/uptime-kuma:2.5.0 sha256:a8610b3b4c38077922ba51b036691e06887d7cefd91fe620fd3d6d23d03dc240 2026-09-21T11:09:07Z}] catalog=map[uptime-kuma:louislam/uptime-kuma:2.4.0])
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3967MB avail≈21931MB
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26008684 → total=25898MB avail=21931MB used=3967MB (15.3%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.9GB avail=57.9GB (10.2%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.1GB (1.8%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.08 1.02 0.95 3/1183 1190" → 1m=1.08 5m=1.02 15m=0.95
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 52.9°C (hwmon1)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetInfo done in 59ms — mem=3967MB/25898MB (15.3%), rootDisk=6.9GB/68.4GB (10.2%), load=1.08/1.02/0.95, temp=52.9°C (hwmon1), cpu=7.2%
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job status-refresh: execution starting
2026/09/21 11:11:12 scheduler.go:346: [INFO] [scheduler] Running job: offsite-credential-retry
2026/09/21 11:11:12 scheduler.go:346: [INFO] [scheduler] Running job: system-health
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job system-health: execution starting
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetInfo starting (hddPath="/mnt/felhom-drives/scratch_hdd", hasCPUCollector=true)
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job health-probes: execution starting
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job deadapp-check: execution starting
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job ring-spill: execution starting
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job offsite-credential-retry: execution starting
2026/09/21 11:11:12 scheduler.go:363: [INFO] [scheduler] Job offsite-credential-retry completed (took 0s)
2026/09/21 11:11:12 scheduler.go:346: [INFO] [scheduler] Running job: backup-cache
2026/09/21 11:11:12 scheduler.go:67: [DEBUG] [scheduler] job backup-cache: execution starting
2026/09/21 11:11:12 manager.go:712: [INFO] [stacks] Status refresh: 3 containers across 55 stacks
2026/09/21 11:11:12 healthprobe.go:53: [DEBUG] [stacks] RunHealthProbes: skipping uptime-kuma — last check 2m5s ago, effective interval 5m0s, healthy=true
2026/09/21 11:11:12 healthprobe.go:76: [DEBUG] [stacks] RunHealthProbes: collected 0 targets (1 skipped not due, 0 skipped no container)
2026/09/21 11:11:12 backup.go:465: [DEBUG] groupStacksByDrive: /mnt/sys_drive → [uptime-kuma]
2026/09/21 11:11:12 backup.go:1107: [INFO] [backup] Found 0 DB dump files across drives
2026/09/21 11:11:12 dbdump.go:128: [DEBUG] DiscoverDatabases: running docker ps to find database containers
2026/09/21 11:11:12 dbdump.go:147: [DEBUG] DiscoverDatabases: docker ps output: c8741bfa31f7 uptime-kuma uptime-kuma louislam/uptime-kuma:2.5.0
7c794623b894 felhom-controller gitea.dooplex.hu/admin/felhom-controller:0.260.0
6d206504c99e filebrowser filebrowser gtstef/filebrowser:1.3.3-stable
2515331bc19e traefik traefik traefik:v3.6.7
2026/09/21 11:11:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container uptime-kuma (image=louislam/uptime-kuma:2.5.0, not a database)
2026/09/21 11:11:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container felhom-controller (image=gitea.dooplex.hu/admin/felhom-controller:0.260.0, not a database)
2026/09/21 11:11:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container filebrowser (image=gtstef/filebrowser:1.3.3-stable, not a database)
2026/09/21 11:11:12 dbdump.go:169: [DEBUG] DiscoverDatabases: skipping container traefik (image=traefik:v3.6.7, not a database)
2026/09/21 11:11:12 dbdump.go:203: [DEBUG] DiscoverDatabases: found 0 database(s), skipped 4 non-DB container(s)
2026/09/21 11:11:12 dbdump.go:206: [INFO] [backup] Discovered 0 databases
2026/09/21 11:11:12 [INFO] [stacks] ParseComposeHDDMounts: found 0 HDD mounts for /opt/docker/stacks/uptime-kuma/docker-compose.yml
2026/09/21 11:11:12 [INFO] [backup] Discovered app data: 1 apps
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/sys_drive" total=68.4 GB used=6.9 GB avail=57.9GB (10.2%)
2026/09/21 11:11:12 recovery_unit.go:224: [INFO] [backup] Recovery unit captured for uptime-kuma → /mnt/sys_drive/felhom-data/backups/primary/uptime-kuma (images=1, secrets-referenced=0, data_keys=0, portable-carried=0/0, withheld=0)
2026/09/21 11:11:12 backup.go:1177: [INFO] [backup] Backup status cache refreshed
2026/09/21 11:11:12 scheduler.go:363: [INFO] [scheduler] Job backup-cache completed (took 53ms)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readMemInfo: guest cap=25898MB (host total was 30714460KB) → used≈3951MB avail≈21947MB
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readMemInfo: totalKB=30714460 availKB=26027912 → total=25898MB avail=21947MB used=3951MB (15.3%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/" bsize=4096 total=68.4GB used=6.9GB avail=57.9GB (10.2%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readDiskUsage: path="/mnt/felhom-drives/scratch_hdd" bsize=4096 total=937.8GB used=17.0GB avail=873.1GB (1.8%)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readLoadAvg: raw="1.08 1.02 0.95 4/1195 1254" → 1m=1.08 5m=1.02 15m=0.95
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readThermalZones: /sys — found 1 zones
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] readTemperature: found via hwmon at /sys — 52.9°C (hwmon1)
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetInfo done in 65ms — mem=3951MB/25898MB (15.3%), rootDisk=6.9GB/68.4GB (10.2%), load=1.08/1.02/0.95, temp=52.9°C (hwmon1), cpu=8.9%
2026/09/21 11:11:12 healthcheck.go:86: [DEBUG] [monitor] Raw values: disk=10.2%, hdd=1.8% (configured=true), mem=15.3% (3951MB/25898MB), cpu=8.9%, temp=52.9°C (hwmon1)
2026/09/21 11:11:12 healthcheck.go:118: [DEBUG] [monitor] SSD disk: OK (10%)
2026/09/21 11:11:12 healthcheck.go:151: [DEBUG] [monitor] Memory: OK (15%)
2026/09/21 11:11:12 healthcheck.go:169: [DEBUG] [monitor] CPU: OK (9%)
2026/09/21 11:11:12 healthcheck.go:187: [DEBUG] [monitor] Temperature: OK (53°C)
2026/09/21 11:11:12 healthcheck.go:201: [DEBUG] [monitor] Docker daemon: OK
2026/09/21 11:11:12 healthcheck.go:209: [DEBUG] [monitor] Checking 1 protected containers: [traefik]
2026/09/21 11:11:12 healthcheck.go:219: [DEBUG] [monitor] All protected containers running
2026/09/21 11:11:12 info.go:13: [DEBUG] [system] GetDiskUsage: path="/mnt/felhom-drives/scratch_hdd" total=937.8 GB used=17.0 GB avail=873.1GB (1.8%)
2026/09/21 11:11:12 healthcheck.go:238: [INFO] [monitor] Health check: status=ok
2026/09/21 11:11:12 healthcheck.go:242: [DEBUG] [monitor] Final status: ok (issues=0, warnings=0, info=5)
2026/09/21 11:11:12 scheduler.go:363: [INFO] [scheduler] Job system-health completed (took 140ms)
2026/09/21 11:11:12 infra.go:67: [INFO] [infra] cloudflared skipped — no cf_tunnel_token configured (LAN-only node)
@@ -0,0 +1,117 @@
### STEP 8 — TEARDOWN
== LAYER 1 — the guest (9202): remove the throwaway app through the product ==
-- POST /api/stacks/uptime-kuma/remove {remove_hdd_data:true, remove_backups:true} --
{"ok":false,"error":"stack \"uptime-kuma\" is still running — stop it first before removing"}
HTTPCODE:409
-> 409: the product requires a stop first. Doing that through the product too.
-- POST /api/stacks/uptime-kuma/stop --
{"ok":true,"message":"Stack uptime-kuma stop completed"}
HTTPCODE:200
-- POST /api/stacks/uptime-kuma/remove --
{"ok":true,"data":{"removed":"uptime-kuma","volumes_removed":["uptime-kuma_uptime_kuma_data"],"hdd_paths_removed":[],"hdd_paths_preserved":[],"hdd_note":"Az alkalmazás nem tárolt saját adatot külső meghajtón, így ott nem volt mit törölni.","backup_paths_removed":["/mnt/sys_drive/felhom-data/backups/primary/uptime-kuma (24K)"]},"message":"Stack uptime-kuma removed"}
HTTPCODE:200
-- verify the guest is back to how I found it --
felhom-controller | gitea.dooplex.hu/admin/felhom-controller:0.260.0 | Up 5 minutes (healthy)
filebrowser | gtstef/filebrowser:1.3.3-stable | Up 5 minutes (healthy)
traefik | traefik:v3.6.7 | Up 5 minutes
stack dir /opt/docker/stacks/uptime-kuma : STILL-PRESENT
docker volume uptime-kuma_uptime_kuma_data : 0
deployed stacks now (expect only protected traefik, as at baseline):
total templates: 55
traefik deployed= False protected= True orphaned= False
update-journal.json: ABSENT
== LAYER 2 — the host (demo-hp): guest 9202 left RUNNING, 9201 untouched ==
status: running
9201 -> status: running
(9201 was never a target: no pct exec, no stop, no start was issued against it this session)
helper files I left on the host/guest, now removed:
cleaned
== LAYER 3 — the hub ==
Nothing provisioned. Guest 9202 has hub reporting OFF and no tunnel, so no host, no escrow,
no report and no customer record was created at any point. Nothing to tear down.
-- NOTE: /opt/docker/stacks/uptime-kuma survived the remove. Contents: --
total 20
drwxr-xr-x 2 root root 4096 Sep 21 11:11 .
drwxr-xr-x 57 root root 4096 Sep 13 20:22 ..
-rw-r--r-- 1 root root 3318 Sep 21 11:04 .felhom.yml
-rw-r--r-- 1 root root 1597 Sep 21 11:08 applied-compose.yml
-rw-r--r-- 1 root root 1597 Sep 21 11:08 docker-compose.yml
-- is this normal for this box? compare with another never-deployed app's dir --
actualbudget
adventurelog
audiobookshelf
bentopdf
bookstack
calcom
calibre-web
claper
code-server
crafty-controller
docmost
emby
filebrowser
ghost
gitea
glance
gokapi
grafana
gramps-web
home-assistant
-- does app.yaml still claim deployed? --
(no app.yaml — the deploy record is gone)
-- POSITIVE CONTROL: a never-deployed app has the SAME shape, so this is not a leftover --
total 16
drwxr-xr-x 2 root root 4096 Sep 13 20:22 .
drwxr-xr-x 57 root root 4096 Sep 13 20:22 ..
-rw-r--r-- 1 root root 3517 Sep 20 14:47 .felhom.yml
-rw-r--r-- 1 root root 1412 Sep 13 20:22 docker-compose.yml
-> uptime-kuma now matches: .felhom.yml + docker-compose.yml + applied-compose.yml, NO app.yaml.
-> the pre-update-compose.yml / pre-update-applied.yml copies the update left are GONE.
CORRECTION to the line above: applied-compose.yml is NOT present on both. actualbudget has only
.felhom.yml + docker-compose.yml; uptime-kuma additionally retains applied-compose.yml after the
remove. So the remove leaves ONE residual file that a never-deployed app does not have.
Stated as observed, not diagnosed: I did not establish whether that is intended (a record of what
was last applied) or a small gap in RemoveStack. It carries no customer data. Not called a defect
on one observation.
== CATALOG REPO — back to the pre-bump image, clean, pushed ==
-- git log --
ff9717d REVERT the drill bump: uptime-kuma back to 2.4.0 (update-arc measurement finished)
89304ab DRILL: uptime-kuma 2.4.0 -> 2.5.0 for the update-arc measurement (reverted in this session)
bd22749 REPORT for the R-469 rule lift
-- working tree --
(empty above = clean)
-- HEAD vs origin/main --
HEAD=ff9717d3794974724e09f8fd58abf058d4cdc2d0
origin/main=ff9717d3794974724e09f8fd58abf058d4cdc2d0
-- the actual image: line --
11: image: louislam/uptime-kuma:2.4.0
-- catalog_since (deliberately today, not 2026-07-18 — the gate's rule) --
13:catalog_since: "2026-09-21"
-- diff of the whole drill against the pre-drill commit 5ff36d0 --
-catalog_since: "2026-07-18"
+catalog_since: "2026-09-21"
(image line identical to pre-drill; only catalog_since differs, as the gate requires)
-- and the box's cached copy agrees --
image: louislam/uptime-kuma:2.4.0
== FINAL STATE CHECK ==
9202 status: status: running
felhom-controller | gitea.dooplex.hu/admin/felhom-controller:0.260.0 | Up 6 minutes (healthy)
filebrowser | gtstef/filebrowser:1.3.3-stable | Up 6 minutes (healthy)
traefik | traefik:v3.6.7 | Up 6 minutes
credential file /tmp/.ctlpw on DooPlex: removed
NOTE: 00-drift.py and 00-upstream-drift-raw.txt in this directory are NOT mine — they predate
my first write (12:53 vs 12:56) and belong to another session. Files 01-20 are mine.