Release process and Prod stage provisioning #89
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#89
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
The final pipeline stage: semver releases with a manual gate deploying to the Prod stack (deployment.md).
Scope
Implement the release workflow (tag
vX.Y.Z→ build/push semver images → require manual approval → deploy Prod), release-notes generation from merged PR titles withmigrationlabel call-outs, and provision the Prod stage (/home/DOCKER/dorfteich-prod/, RAID volumes,dorfteich.onlinevhost, full backup profile incl. BASEL mirror, prod monitors) on the host the repo owner decides at go-live — the VPS188.245.116.44(wheredorfteich.onlineDNS already points) or a dedicated host (then DNS switch with the repo owner); document the go-live checklist (Prod-host decision recorded, legal texts applied #82, monitors alerting #85, backup verified #87, seed Site Admin) indeploy/go-live.md.Acceptance criteria
Technical notes
Dependencies
Depends on #8, #84, #85, #88.
Size: ~1.5 days
Conventions: English code/comments, clear human-readable code, no hard-coded UI strings (ADR 0012, add
deanden), permission checks only via the shared guard (docs/architecture/permissions.md). Read the referenced ADRs before starting.Implemented in
28f05e2and exercised end to end with real releasesv0.1.0/v0.1.1.Release workflow (
release.yml) — pushingvX.Y.Zbuilds and pushes the four semver images (web/api/collab/backup) and publishes a Gitea release whose notes list every change since the previous release tag, with a migration call-out derived from the migrations diff. Deliberate deviation from the issue text: the repo is trunk-based without PRs, so commit subjects stand in for "merged PR titles", and the migrations diff replaces amigrationlabel — both are the truthful sources this repo actually has.Manual gate + Prod deploy (
prod-deploy.yml) — Gitea 1.22 has no environment approvals, so the gate is a human act with an audit trail: after reviewing the release, pushprod-vX.Y.Z-<suffix>. The workflow verifies the release images exist (never deploys unbuilt tags), pinsTAGin the Prod.env, pulls, restarts, and waits for readiness. Re-deploys and rollbacks are just new suffix tags on the target release.Prod stage provisioned —
/home/DOCKER/dorfteich-prod/on ONE (the prepared ports 8120–8122; the "host decided at go-live" default is recorded in the checklist — ONE is where Test/Int and the registry already live, the old VPS the issue text mentions predates the infra move). Secrets generated on the host, never in any log; full backup profile (30 d retention, failure mail); SMTP intentionally unset until go-live. The stack runsv0.1.1, every container healthy, first backup taken, the first-run wizard waiting — exactly the go-live posture.Acceptance criteria
v0.1.0→ release published with notes →prod-v0.1.0-initial→ deploy green → readyz 200 (fullyokafter the first backup).v0.1.0's notes carry the full history plus the migration call-out;v0.1.1(no new migrations) states "No database migrations in this release."prod-v0.1.1-upgrade→ v0.1.1 live →prod-v0.1.0-rollback1→ v0.1.0 live, readyzokboth ways; finished onprod-v0.1.1-final.deploy/go-live.md: the executed mechanics are ticked with dates; the operator items that block the DNS switch are enumerated (Prod-host confirmation, DNSdorfteich.online→ ONE, Caddy block + real-domain ACME, wizard/SMTP, legal texts #82, Kuma monitors #85, Prod drill #87, BASEL mirror #84, optional dedicatedDEPLOY_SSH_KEY_PRODsecret).Deploying to Prod before the DNS switch is deliberate: the stack serves on localhost ports only, unreachable from outside until the operator activates the prepared Caddy block.