feat(woodpecker): cut server over to wp-pg postgres (#295, #324) #356

Merged
k.renner merged 1 commits from claude-bot/woodpecker-pg-cutover into master 2026-07-22 14:02:19 +00:00
Member

Stage 2 of 3. Points woodpecker-server at the wp-pg CNPG Postgres cluster (stood up in #355), replacing sqlite-on-PVC.

Status: data already migrated + verified (live, Flux suspended)

The one-time sqlite→postgres migration is done and verified per seed/woodpecker/MIGRATION.md:

  • pgloader schema-first / data-only load: 2,061,733 rows, 0 errors.
  • Row-count parity: all 18 tables match the sqlite source (repos 4, users 2, secrets 37, crons 6, pipelines 2121, steps 7521, workflows 2414, log_entries 2,026,981, …).
  • Booleans verified (repos.active → t/f), sequences reset to max(id)+1.
  • woodpecker-server v3.13.0 is running on postgres now, healthy, no DB errors (applied live while apps is Flux-suspended).

This PR

Just makes git match that live state: server.yaml WOODPECKER_DATABASE_DRIVER=postgres + a lib/pq keyword DSN from the wp-pg-app secret. Must merge before Flux apps is resumed, or Flux would revert woodpecker to sqlite.

Deliberately deferred to stage 3 (PR 3)

The sqlite volumeClaimTemplates + /var/lib/woodpecker mount are kept — rollback is just reverting these env vars. Stage 3 drops the PVC and converts StatefulSet→Deployment after a short soak, which is what finally resolves #295/#324 (no PVC to snapshot). Image stays v3.13.0.

🤖 Generated with Claude Code

**Stage 2 of 3.** Points `woodpecker-server` at the `wp-pg` CNPG Postgres cluster (stood up in #355), replacing sqlite-on-PVC. ## Status: data already migrated + verified (live, Flux suspended) The one-time sqlite→postgres migration is **done and verified** per `seed/woodpecker/MIGRATION.md`: - pgloader schema-first / data-only load: **2,061,733 rows, 0 errors**. - **Row-count parity: all 18 tables match** the sqlite source (repos 4, users 2, secrets 37, crons 6, pipelines 2121, steps 7521, workflows 2414, log_entries 2,026,981, …). - Booleans verified (`repos.active` → `t/f`), sequences reset to `max(id)+1`. - woodpecker-server v3.13.0 is **running on postgres now, healthy, no DB errors** (applied live while `apps` is Flux-suspended). ## This PR Just makes git match that live state: `server.yaml` `WOODPECKER_DATABASE_DRIVER=postgres` + a lib/pq keyword DSN from the `wp-pg-app` secret. **Must merge before Flux `apps` is resumed**, or Flux would revert woodpecker to sqlite. ## Deliberately deferred to stage 3 (PR 3) The sqlite `volumeClaimTemplates` + `/var/lib/woodpecker` mount are **kept** — rollback is just reverting these env vars. Stage 3 drops the PVC and converts StatefulSet→Deployment after a short soak, which is what finally **resolves #295/#324** (no PVC to snapshot). Image stays **v3.13.0**. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-bot added 1 commit 2026-07-22 13:57:30 +00:00
Stage 2/3 of the sqlite->CNPG migration. Points woodpecker-server at the
wp-pg Postgres cluster (creds from the CNPG-generated wp-pg-app secret via a
lib/pq keyword DSN). The sqlite data was migrated one-time via pgloader
(schema-first/data-only, per seed/woodpecker/MIGRATION.md); parity verified
(all 18 tables match, booleans correct, sequences reset).

The sqlite PVC + volumeMount are intentionally KEPT for now (rollback = revert
these env vars) — they're dropped in stage 3 (StatefulSet->Deployment) after a
soak. Image stays v3.13.0 (no version bump during the migration).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
k.renner merged commit 4fbd437e78 into master 2026-07-22 14:02:19 +00:00
Sign in to join this conversation.