WP-0005 T12: Option A — keep Gitea fallback, 30-day window
Some checks failed
CI Smoke / host-smoke (push) Successful in 2s
CI Smoke / container-smoke (push) Has been cancelled

Operator decision: retain coulombcore Gitea Helm as read-only fallback with a
30-day rollback window (2026-07-08 → 2026-08-07). Mark T12 done; update
rollback runbook and retirement checklist.
This commit is contained in:
tegwick 2026-07-09 11:32:25 +02:00
parent 040ccccc8e
commit 1404e56c0e
3 changed files with 75 additions and 85 deletions

View file

@ -1,8 +1,9 @@
# Forgejo Cutover Rollback Runbook # Forgejo Cutover Rollback Runbook
Date: 2026-07-08 Date: 2026-07-09
Workplan: `RAIL-HO-WP-0005-T11` Workplan: `RAIL-HO-WP-0005-T11` / `T12`
Canon: `the-custodian/docs/forgejo-tier3-remote-url-sweep-playbook.md` Canon: `the-custodian/docs/forgejo-tier3-remote-url-sweep-playbook.md`,
`the-custodian/docs/forgejo-production-decisions.md` § T12
## Current production state (post-T11) ## Current production state (post-T11)
@ -13,8 +14,10 @@ Canon: `the-custodian/docs/forgejo-tier3-remote-url-sweep-playbook.md`
| Workstation `origin` | `forgejo-remote:coulomb/<slug>.git` | `gitea` legacy remote retained | | Workstation `origin` | `forgejo-remote:coulomb/<slug>.git` | `gitea` legacy remote retained |
| ArgoCD (coulombcore) | `https://forgejo.coulomb.social/coulomb/*.git` | Gitea URLs in AppProject allow-list for emergency | | ArgoCD (coulombcore) | `https://forgejo.coulomb.social/coulomb/*.git` | Gitea URLs in AppProject allow-list for emergency |
Gitea safety contract: **no repo deletes** for ≥90 days after promotion. Archived Gitea safety contract (T12 Option A, 2026-07-09): **no repo deletes** for **30 days**
repos remain cloneable; pushes are rejected. after cutover (2026-07-08 → rollback window ends **2026-08-07**). coulombcore
Gitea Helm retained as read-only fallback. Archived repos remain cloneable; pushes
are rejected. Revisit Helm retirement after **2026-08-07**.
## Per-repo git rollback ## Per-repo git rollback

View file

@ -1,22 +1,32 @@
# Gitea Retirement Checklist (T12 prep) # Gitea Retirement Checklist (T12)
Date: 2026-07-09 Date: 2026-07-09
Workplan: `RAIL-HO-WP-0005-T12` Workplan: `RAIL-HO-WP-0005-T12`
Status: **prep only** — no Gitea retirement executed Status: **Option A decided** — Gitea retained as read-only fallback
## Prerequisites (not yet met) ## Operator decision (2026-07-09)
| Gate | Status | ETA | **Option A:** Keep coulombcore `gitea` Helm running as documented read-only fallback.
| --- | --- | --- |
| T04/T09 7-day backup gate | **4/7** (`make forgejo-backup-status`) | **2026-07-12** if daily 02:15 UTC cron keeps succeeding |
| `state-hub` stabilization window | Ends **2026-07-09** | Met |
| Operator approval (`needs_human`) | Pending | Required before any Helm teardown |
Monitor: | Parameter | Value |
| --- | --- |
| Rollback window | **30 days** from cutover (2026-07-08 → **2026-08-07**) |
| Gitea repo deletes | Forbidden until **2026-08-07** |
| Helm retirement revisit | After **2026-08-07** (Option B reassessment) |
| Canon | `the-custodian/docs/forgejo-production-decisions.md` § T12 |
## Prerequisites
| Gate | Status |
| --- | --- |
| T04/T09 7-day backup gate | **4/7** (ETA **2026-07-12**) — does not block T12 Option A |
| `state-hub` stabilization window | Met (closed 2026-07-09) |
| Operator approval (`needs_human`) | **Met** — Option A, 30-day window |
Monitor backup gate:
```bash ```bash
cd ~/railiance-platform && make forgejo-backup-status cd ~/railiance-platform && make forgejo-backup-status
tail -5 ~/.cache/railiance/backups/forgejo/cron.log
``` ```
## Dependency scan (2026-07-09) ## Dependency scan (2026-07-09)
@ -29,76 +39,44 @@ tail -5 ~/.cache/railiance/backups/forgejo/cron.log
| Workstation `origin` using `gitea-remote` | **0** (legacy `gitea` remotes retained for rollback only) | | Workstation `origin` using `gitea-remote` | **0** (legacy `gitea` remotes retained for rollback only) |
| Forgejo Actions workflows referencing `gitea-remote` | **0** | | Forgejo Actions workflows referencing `gitea-remote` | **0** |
### Gitea still running (intentional fallback) ### Gitea retained intentionally
| Host | Release | Namespace | Notes | | Host | Release | Namespace | Notes |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| coulombcore (`~/.kube/config`) | `gitea` Helm 12.5.0 | `default` | Archived read-only repos; package push disabled | | coulombcore (`~/.kube/config`) | `gitea` Helm 12.5.0 | `default` | Read-only fallback through **2026-08-07** |
| railiance01 (`config-hosteurope`) | `forgejo` Helm 12.5.0 | `forgejo` | Production canonical | | railiance01 (`config-hosteurope`) | `forgejo` Helm 12.5.0 | `forgejo` | Production canonical |
Rollback runbook: `docs/forgejo-cutover-rollback.md` (90-day no-delete contract). Rollback runbook: `docs/forgejo-cutover-rollback.md` (30-day no-delete contract).
### Stale references — docs/config, not live git remotes ### Follow-up backlog (non-blocking for T12 Option A)
These do **not** block Forgejo operation but should be cleaned before or during
Gitea retirement:
| Area | Examples | Owner repo | | Area | Examples | Owner repo |
| --- | --- | --- | | --- | --- | --- |
| OCI image repos in Helm values | `gitea.coulomb.social/coulomb/inter-hub`, `reuse-surface`, `vergabe-teilnahme` | `railiance-apps` | | OCI image repos in Helm values | `gitea.coulomb.social/coulomb/inter-hub`, etc. | `railiance-apps` |
| npm registry URLs | `gitea.coulomb.social/api/packages/coulomb/npm/` | `secrets-engine`, `activity-core` | | npm registry URLs | `gitea.coulomb.social/api/packages/coulomb/npm/` | `secrets-engine`, `activity-core` |
| Ops inventory endpoint | `activity-core/k8s/railiance/20-runtime.yaml` | `activity-core` | | Ops inventory endpoint | `activity-core/k8s/railiance/20-runtime.yaml` | `activity-core` |
| Deploy runbook | `docs/deploy-stack.md` (this repo) | `railiance-infra` — updated 2026-07-09 | | State Hub alias | `railiance-bootstrap` vs `railiance-cluster` (same fingerprint) | operator / State Hub |
### State Hub alias: `railiance-bootstrap` ## T12 checklist
| Field | `railiance-bootstrap` | `railiance-cluster` | - [x] Operator chooses **Option A** (30-day rollback window)
| --- | --- | --- | - [x] No active remotes/webhooks/dashboards on Gitea (re-verified 2026-07-09)
| `local_path` | `/home/worsch/railiance-bootstrap` | `/home/worsch/railiance-cluster` | - [x] Runbooks point to Forgejo (`deploy-stack.md` updated 2026-07-09)
| `remote_url` | `forgejo-remote:coulomb/railiance-bootstrap.git` | `forgejo-remote:coulomb/railiance-cluster.git` | - [x] Gitea intentionally retained — coulombcore Helm stays running
| `git_fingerprint` | `6b930728…` (same) | `6b930728…` (same) | - [ ] T04/T09 7-day gate **7/7** (workplan close gate; ETA 2026-07-12)
- [ ] Final Gitea volume snapshot catalogued (recommended before 2026-08-07)
- [ ] `railiance-bootstrap` hub alias resolved (follow-up)
- [ ] Stale OCI/npm references migrated to `forgejo.coulomb.social` (follow-up)
- [ ] After **2026-08-07**: reassess Option B (Helm retirement)
Working assumption confirmed: stale logical alias. T12 action: operator decides ## Option B (deferred)
whether to archive the hub entry or repoint `local_path` to `railiance-cluster`
after confirming no checkout depends on `/home/worsch/railiance-bootstrap`.
## Operator decision Helm retirement deferred until after the 30-day rollback window. See prior
version of this checklist for Option B steps if reassessment proceeds.
Choose one before executing T12:
### Option A — Keep Gitea as documented fallback (recommended until 2026-10-08)
- Leave coulombcore `gitea` Helm release running.
- Document in runbooks: read-only archive, no new pushes.
- Revisit retirement after 90-day rollback window.
- **T12 done when:** Forgejo is sole *active* forge; Gitea retained intentionally.
### Option B — Retire Gitea Helm release
Only after prerequisites + explicit approval:
1. Re-run dependency scan (State Hub remotes, ArgoCD `repoURL`, CI workflows).
2. Take final Gitea backup (`forgejo dump` equivalent via Gitea admin or volume snapshot).
3. Export archived repo list for audit.
4. Scale down or uninstall `gitea` Helm on coulombcore.
5. Update `docs/forgejo-cutover-rollback.md` — rollback becomes volume-restore only.
6. Prune DNS/ingress if no longer needed.
## T12 task checklist
- [ ] T04/T09 7-day gate **7/7**
- [ ] Operator chooses Option A or B
- [ ] Final Gitea backup captured and catalogued
- [ ] No active remotes/webhooks/dashboards on Gitea (re-verify)
- [ ] Runbooks point to Forgejo (`deploy-stack.md`, layer repo docs)
- [ ] `railiance-bootstrap` hub alias resolved
- [ ] Stale OCI/npm references migrated to `forgejo.coulomb.social` (follow-up workplans in `railiance-apps`, `activity-core`)
- [ ] If Option B: Gitea Helm retired; evidence logged to State Hub
## References ## References
- `workplans/RAIL-HO-WP-0005-forgejo-production-migration.md` - `workplans/RAIL-HO-WP-0005-forgejo-production-migration.md`
- `docs/forgejo-cutover-rollback.md` - `docs/forgejo-cutover-rollback.md`
- `docs/forgejo-migration-inventory.md` - `docs/forgejo-migration-inventory.md`
- `railiance-platform/docs/forgejo-backup.md` - `the-custodian/docs/forgejo-production-decisions.md`
- `the-custodian/tools/gitea-set-readonly.sh`

View file

@ -77,6 +77,11 @@ change is made there.
6. ~~Cutover mode~~ **DECIDED 2026-07-09 (Option A):** staged per-repo promotion 6. ~~Cutover mode~~ **DECIDED 2026-07-09 (Option A):** staged per-repo promotion
(no org-wide freeze). Freeze-all documented as emergency fallback only. Record: (no org-wide freeze). Freeze-all documented as emergency fallback only. Record:
`the-custodian/docs/forgejo-production-decisions.md` § Cutover. `the-custodian/docs/forgejo-production-decisions.md` § Cutover.
7. ~~Gitea retirement (T12)~~ **DECIDED 2026-07-09 (Option A):** keep coulombcore
Gitea Helm as read-only fallback; **30-day** rollback window (cutover 2026-07-08
→ ends **2026-08-07**). Revisit Helm retirement after window. Record:
`the-custodian/docs/forgejo-production-decisions.md` § T12,
`docs/forgejo-gitea-retirement-checklist.md`.
## Safety Contract ## Safety Contract
@ -577,31 +582,35 @@ read-only fallback, and rollback instructions are documented. **Met.**
```task ```task
id: RAIL-HO-WP-0005-T12 id: RAIL-HO-WP-0005-T12
status: todo status: done
priority: medium priority: medium
needs_human: true needs_human: false
state_hub_task_id: "a63147b0-31d5-4705-89ea-40c10faf779f" state_hub_task_id: "a63147b0-31d5-4705-89ea-40c10faf779f"
``` ```
Retire legacy Gitea only after a stabilization period and explicit approval. Retire legacy Gitea only after a stabilization period and explicit approval.
**Prep (2026-07-09):** dependency scan complete — State Hub **0 Gitea remotes**, **Done (2026-07-09):** Operator chose **Option A** — keep coulombcore `gitea`
workstation **0 `gitea-remote` origins**; coulombcore `gitea` Helm still running Helm as read-only fallback (no Helm teardown). **30-day** rollback window from
as read-only fallback. Checklist: `docs/forgejo-gitea-retirement-checklist.md`. cutover (2026-07-08 → **2026-08-07**); no Gitea repo deletes before window end.
Operator must choose: **Option A** keep fallback (recommended until 90-day Revisit Option B (Helm retirement) after **2026-08-07**.
rollback window) or **Option B** retire Helm release.
Minimum scope: Evidence:
- Confirm no active remotes, webhooks, packages, or dashboards depend on Gitea. - Dependency scan: State Hub **0 Gitea remotes**; workstation **0 `gitea-remote`
- Preserve final Gitea backup. origins** (2026-07-09).
- Update runbooks and dashboards from Gitea to Forgejo. - Gitea org **79/79 archived**; package push disabled (T11).
- Remove or archive Gitea Helm release according to the rollback decision. - Runbooks updated: `docs/deploy-stack.md`, `docs/forgejo-cutover-rollback.md`.
- Close stale State Hub references to `railiance-bootstrap` if confirmed as - Checklist: `docs/forgejo-gitea-retirement-checklist.md`.
an alias rather than a real repo. - Canon: `the-custodian/docs/forgejo-production-decisions.md` § T12.
Follow-up (non-blocking): final Gitea volume snapshot before 2026-08-07;
`railiance-bootstrap` hub alias; stale OCI/npm refs in `railiance-apps` /
`activity-core`.
**Done when:** Forgejo is the only active source forge and package base, with **Done when:** Forgejo is the only active source forge and package base, with
legacy Gitea either archived or intentionally retained as documented fallback. legacy Gitea either archived or intentionally retained as documented fallback.
**Met** — Gitea retained intentionally per Option A.
## Phasing and Dependencies ## Phasing and Dependencies
@ -623,10 +632,10 @@ T05+T08 ──► T10 migration ladder ──► T11 production cutover ──
T03 isolated probe: CANCELLED (superseded by T05 + in-production pilots) T03 isolated probe: CANCELLED (superseded by T05 + in-production pilots)
``` ```
**Current focus (2026-07-09):** T01/T05/T06/T07/T08/T10/T11 **done**; T04/T09 **Current focus (2026-07-09):** T01/T02/T05T08/T10T12 **done**; T04/T09 await
await 7-day backup gate (**4/7**, ETA **2026-07-12**). T12 prep complete — 7-day backup gate (**4/7**, ETA **2026-07-12**). T12 **Option A** — Gitea kept as
operator decision pending (retire vs keep fallback). `state-hub` stabilization read-only fallback; **30-day** rollback window ends **2026-08-07**. Workplan
window closed 2026-07-09. closes when T04/T09 gate passes.
**Absorbed by `CUST-WP-0054-T04`:** forge + CI on railiance01; workstation **Absorbed by `CUST-WP-0054-T04`:** forge + CI on railiance01; workstation
build retirement; staged repo promotion before State Hub primary move (T05). build retirement; staged repo promotion before State Hub primary move (T05).