Skip to content

fix: show why deploys fail; 409 instead of silent no-ops while a deploy runs; retry skipped reconciles - #128

Merged
vazra merged 4 commits into
mainfrom
fix/deploy-errors-rollback
Oct 11, 2026
Merged

vazra merged 4 commits into
mainfrom
fix/deploy-errors-rollback

Conversation

@vazra

@vazra vazra commented Oct 11, 2026

Copy link
Copy Markdown
Owner

Found by the E2E audit.

  • Failed deploys only said "compose up: exit status 1", so users (activity feed, deploy events, app status) never learned why (pull unauthorized, port in use, bad image). The error now includes the relevant lines of docker compose's own output, trimmed, with registry credentials redacted. Same for rollback and pull.
  • Rollback, restart and pull during a running deploy returned 200/202 but did nothing. They now return 409 "a deploy is already running for this app, try again when it finishes"; a rollback that loses the race writes the previous compose file back.
  • A reconcile skipped behind a running deploy was never retried, so a compose edit made during a deploy could sit undeployed with a stale stored hash until some later, surprising redeploy. One reconcile per app is now queued for when the running deploy finishes (a no-op when nothing changed; cannot loop).
  • Metrics prune with an unknown tier pruned the raw tier. Now 400 listing the valid tiers.

Docs: reference/api.md (409s, prune tiers), architecture/reconciler.md.

Tests: compose error extraction and redaction, audit summary, 409 for rollback/restart/pull, rollback race restores the file, skipped reconcile retried after the deploy finishes (real deploy tracker, -race), prune tier validation.

@vazra
vazra merged commit 7d728c6 into main Oct 11, 2026
8 checks passed
@vazra
vazra deleted the fix/deploy-errors-rollback branch October 11, 2026 17:20
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