docs: v0.85.0 self-update rework — README/CHANGELOG/REPORT (live-validated)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TtXesNa2LGbMmE4DNL6SE7
This commit is contained in:
+18
-6
@@ -1065,18 +1065,30 @@ Notification preferences (email, enabled events, cooldown hours) are:
|
||||
|
||||
#### Controller Self-Update (`internal/selfupdate/`)
|
||||
|
||||
The controller can update itself — a Watchtower-style pull-and-restart mechanism for a single container. Replaces manual SSH-based `docker pull + sed + docker compose up -d` with a one-click Settings page button or scheduled auto-update.
|
||||
The controller can update itself to the latest registry version with a one-click Settings button. In the
|
||||
LXC architecture there is **no in-container compose** to drive (the old `docker compose -f
|
||||
/opt/docker/felhom-controller/docker-compose.yml up -d` path does not exist in the guest — it produced
|
||||
"docker-compose.yml nem elérhető"). Instead (Phase 1, v0.85.0) the controller **pulls** the target image
|
||||
in-guest and delegates the container **swap to the host agent**, which owns the restart + health-verify +
|
||||
**rollback**.
|
||||
|
||||
##### How It Works
|
||||
|
||||
```
|
||||
1. Check Gitea Docker Registry V2 API for new image tags
|
||||
2. Compare highest semver tag with current Version (set at build time via ldflags)
|
||||
3. If newer version exists → pull image → update compose file → docker compose up -d
|
||||
4. Current container is replaced by Docker → new container starts with new version
|
||||
5. On startup, new container reads update-state.json → marks update success/failure
|
||||
1. Check Gitea Docker Registry V2 API for the latest semver tag (queryRegistry, BasicAuth).
|
||||
2. If newer than current (ldflags Version): docker login --password-stdin → docker pull <image>
|
||||
→ docker logout — IN-GUEST over the shared docker socket (token via stdin, never argv).
|
||||
3. Delegate to the host agent: agentapi.SwapController → POST /controller/swap {image} (202). The agent
|
||||
(external to this container) rewrites /etc/felhom-controller-image, restarts
|
||||
felhom-controller-bootstrap.service, polls the new controller to healthy, and ROLLS BACK to the
|
||||
previous image if it doesn't come up. The controller never docker-rm/recreates itself.
|
||||
4. On startup the new container reads update-state.json → VerifyStartup marks success (current==target)
|
||||
or failure (rollback → version mismatch). The Settings button polls /api/health and reloads.
|
||||
```
|
||||
|
||||
Latest-only (no version picker). Per-customer version floor + operator desired-version fleet-push are
|
||||
Phase 2 (hub-side). No host agent wired (un-provisioned guest) → self-update unavailable.
|
||||
|
||||
##### Design Philosophy
|
||||
|
||||
- **No automatic rollback** — follows the Watchtower pattern (24k+ GitHub stars, no rollback). Docker's `restart: unless-stopped` policy is the crash safety net. The Hub's dead man's switch detects when the controller goes down.
|
||||
|
||||
Reference in New Issue
Block a user