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.yamlWOODPECKER_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.
**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)
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Stage 2 of 3. Points
woodpecker-serverat thewp-pgCNPG 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:repos.active→t/f), sequences reset tomax(id)+1.appsis Flux-suspended).This PR
Just makes git match that live state:
server.yamlWOODPECKER_DATABASE_DRIVER=postgres+ a lib/pq keyword DSN from thewp-pg-appsecret. Must merge before Fluxappsis resumed, or Flux would revert woodpecker to sqlite.Deliberately deferred to stage 3 (PR 3)
The sqlite
volumeClaimTemplates+/var/lib/woodpeckermount 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