chore(infra): immutable image tags + parametrized compose + rollback docs (#397) #402

Merged
admin-mrrm merged 1 commit from feat/397-immutable-tags into main 2026-05-25 11:20:49 +02:00
Owner

Closes #397.

Summary

  • Multi-Tag pro Image: publish-api/web/ocr pushen zusätzlich zu :latest jetzt auch ${DRONE_COMMIT_SHA:0:7}. publish-web-dev pusht dev + dev-<sha>.
  • Parametrisiertes Compose: deploy/docker-compose.yml liest ${API_TAG:-latest}, ${WEB_TAG:-latest}, ${OCR_TAG:-latest} aus ../.env. Default unverändert :latest.
  • Prune mit Karenz: docker image prune -f --filter "until=168h" (7 Tage) — alte SHA-Tags überleben so eine Woche, Rollback möglich.
  • Rollback-Doku in CLAUDE.md: Liste verfügbarer Tags via Forgejo-API, Rollback per API_TAG=<sha> docker compose up -d api.
  • DB-Migration-Policy in CLAUDE.md: forward-only & backward-compat, zweistufige Drop-Column.

Parallel-PR in server-stack

https://git.mrrm.de/admin-mrrm/server-stack/compare/master...feat/mrrmlabapp-immutable-tags — spiegelt die Parametrisierung auch in den Ansible-Compose-Vorlagen für prod-alt und dev-neu. Beide PRs zusammen mergen, damit Drone-Upload und Ansible-Source-of-Truth nicht divergieren.

Tag-Version (TAG_VERSION)

Der Punkt "falls Tag: ${TAG_VERSION}" aus #397 ist hier nicht drin — kommt mit #398 (Gitea-Release-Step + Tag-Pipeline). Aktuell pusht Drone nur auf push-Events; Tag-getriggerte Publishes folgen mit dem Release-Workflow.

Test plan

  • Merge → nächster Push auf main: publish-*-Steps pushen sowohl :latest als auch :<sha>
  • Verify Registry: https://git.mrrm.de/admin-mrrm/-/packages/container/mrrmlabapp%2Fapi zeigt beide Tags
  • Deploy läuft mit :latest-Default unverändert
  • Manueller Rollback-Test auf dev: MRRMLABAPP_DEV_API_TAG=<alter-sha> docker compose up -d api, verifizieren dass das alte Image hochgefahren wird
Closes #397. ## Summary - **Multi-Tag pro Image:** `publish-api/web/ocr` pushen zusätzlich zu `:latest` jetzt auch `${DRONE_COMMIT_SHA:0:7}`. `publish-web-dev` pusht `dev` + `dev-<sha>`. - **Parametrisiertes Compose:** `deploy/docker-compose.yml` liest `${API_TAG:-latest}`, `${WEB_TAG:-latest}`, `${OCR_TAG:-latest}` aus `../.env`. Default unverändert `:latest`. - **Prune mit Karenz:** `docker image prune -f --filter "until=168h"` (7 Tage) — alte SHA-Tags überleben so eine Woche, Rollback möglich. - **Rollback-Doku** in `CLAUDE.md`: Liste verfügbarer Tags via Forgejo-API, Rollback per `API_TAG=<sha> docker compose up -d api`. - **DB-Migration-Policy** in `CLAUDE.md`: forward-only & backward-compat, zweistufige Drop-Column. ## Parallel-PR in server-stack https://git.mrrm.de/admin-mrrm/server-stack/compare/master...feat/mrrmlabapp-immutable-tags — spiegelt die Parametrisierung auch in den Ansible-Compose-Vorlagen für prod-alt und dev-neu. **Beide PRs zusammen mergen**, damit Drone-Upload und Ansible-Source-of-Truth nicht divergieren. ## Tag-Version (TAG_VERSION) Der Punkt "falls Tag: ${TAG_VERSION}" aus #397 ist hier **nicht** drin — kommt mit #398 (Gitea-Release-Step + Tag-Pipeline). Aktuell pusht Drone nur auf `push`-Events; Tag-getriggerte Publishes folgen mit dem Release-Workflow. ## Test plan - [ ] Merge → nächster Push auf main: `publish-*`-Steps pushen sowohl `:latest` als auch `:<sha>` - [ ] Verify Registry: `https://git.mrrm.de/admin-mrrm/-/packages/container/mrrmlabapp%2Fapi` zeigt beide Tags - [ ] Deploy läuft mit `:latest`-Default unverändert - [ ] Manueller Rollback-Test auf dev: `MRRMLABAPP_DEV_API_TAG=<alter-sha> docker compose up -d api`, verifizieren dass das alte Image hochgefahren wird
chore(infra): immutable image tags + parametrized compose + rollback docs (#397)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
b186c5c8b2
- publish-api/web/ocr: zusätzlich zu :latest auch ${DRONE_COMMIT_SHA:0:7}
  pushen; publish-web-dev: dev + dev-<sha>
- deploy/docker-compose.yml: image: …/api:${API_TAG:-latest}
  (analog WEB_TAG, OCR_TAG) — Rollback via .env setzen
- docker image prune --filter "until=168h" (7-Tage-Karenz) statt
  bedingungslos — aktualisiert #354s Prune-Verhalten
- CLAUDE.md: Rollback-Anleitung + forward-only/backward-compat
  DB-Migration-Policy (zweistufige Spaltenänderungen)

Closes #397.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
admin-mrrm force-pushed feat/397-immutable-tags from b186c5c8b2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
to fca0775b2e
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-05-25 10:38:52 +02:00
Compare
admin-mrrm deleted branch feat/397-immutable-tags 2026-05-25 11:20:50 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!402
No description provided.