Skip to content

updates: per-service, SBOM diff, partial update, health check, rollback - #14

Merged
ahze merged 11 commits into
mainfrom
updates
Sep 23, 2026
Merged

ahze merged 11 commits into
mainfrom
updates

Conversation

@ahze

@ahze ahze commented Sep 23, 2026

Copy link
Copy Markdown
Member
  • updates: report per service, judged by what the container runs
  • ui: Update opens a per-service panel instead of acting on click
  • update: pull and recreate only the services that changed
  • ui: mark the service that has an update, on its own row
  • ui: one Services tab; Update applies a version bump
  • stack: write stack files atomically
  • update: say what an update changes; make partial updates actually happen (e.g: immich stack)
  • exec: close open terminals when fjordd stops
  • update: watch updated containers say up before calling it done-done
  • update: roll a service back to the image it's last update replaced
  • stack: refuse a save made to a compose fjord has since rewritten

ahze added 11 commits September 22, 2026 18:18
The update check reported a stack as one state, taken from the first
drifted image with no service or image named, so for a four-image stack
like immich "release moved" could mean any of them.

- Status.Services lists every service: state, image, running and
  registry digests, from/to versions. The top-level fields are summarised
  with the same precedence as before, so existing badges are unchanged.
- "current" is judged by the digest the service's CONTAINER was created
  from (podman ImageDigest), not by the local tag. Any pull of a shared
  tag (redis is in eight stacks, the maintenance playbook) made every
  other stack on it read current while still running the old image. The
  image cannot be asked after the fact: a pull that moves the tag strips
  the old image's RepoDigests.
- An index digest changes when any platform is rebuilt. The running image
  counts as current when it matches the tag's index or this host's
  platform manifest inside it, so an arm64-only rebuild is not an update
  on amd64 (whether or not it has been pulled).
- A registry error marks that service unknown instead of failing the
  whole check; /update-check returns 200 rather than 502.
- AppJail reports no running images yet and keeps the local-tag check.
- POST /update takes an optional {"services": [...]}; names are checked
  against the compose before anything is pulled. No body = whole stack.
- podman: `compose pull <svc…>` then `up -d --force-recreate --no-deps
  <svc…>`. Services that depend on them, or that they depend on, keep
  running untouched.
- Never --remove-orphans with a service list: podman-compose 1.5 counts
  every service not named as an orphan and deletes its container
  (measured on saturn). A whole-stack up still removes real orphans.
- The refused-recreate fallback force-removes, and the final start
  starts, only the named services.
- Capabilities.UpdateServices; update-check reports it as perService.
  appjail refuses a subset rather than widening it to the whole project.
- UI: the panel updates just the changed services ("Update 1 service");
  a partial update leaves the saved-but-unapplied banner in place.
os.WriteFile truncates before writing, so a save that fails partway
leaves an empty file. On netlab a full disk emptied zensical's
compose.yaml during a version change; the container kept running and
fjord lost its definition.
- Before an update, state.json records per service what it ran.
@ahze ahze self-assigned this Sep 23, 2026
@ahze
ahze merged commit f45f826 into main Sep 23, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant