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
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:
@@ -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
|
||||
+29
@@ -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.
|
||||
Reference in New Issue
Block a user