Server healthy on postgres; Flux reconciled cleanly to it.
End-to-end test passed: a live pipeline (vsftpd#5) dispatched from postgres → agent built → result written back.
woodpecker-server is now genuinely stateless.
This PR
StatefulSet → Deployment (strategy: Recreate — never two servers on one DB during a roll).
Remove volumeClaimTemplates + the /var/lib/woodpecker mount.
Agent reaches the server via the standalone woodpecker Service (label selector), so a Deployment pod is reachable unchanged.
Why it fixes #295/#324
Until the PVC is gone, Velero's apps-daily keeps trying to CSI-snapshot that error-flagged ext4 and failing (structure needs cleaning). Removing it stops the failing backup entirely — no fragile sqlite to snapshot.
Cutover on merge (I'll drive it)
Flux prunes the StatefulSet (PVC retention is Retain, so the PVC survives the prune) and creates the Deployment. To avoid a brief two-servers overlap I'll scale the STS to 0 first, then reconcile, then delete the orphaned data-woodpecker-server-0 PVC and confirm woodpecker is healthy on the new Deployment. Rollback stops being trivial after the PVC delete — but the migration is fully verified.
**Stage 3 of 3 — the finale.** Removes the `data-woodpecker-server-0` PVC, which is what finally **closes #295 and #324**.
## Context
The migration is complete and verified (#355 stood up `wp-pg`; #356 cut the server over to postgres):
- pgloader load: 2,061,733 rows, 0 errors; all 18 tables parity-matched; booleans + sequences correct.
- Server healthy on postgres; Flux reconciled cleanly to it.
- **End-to-end test passed**: a live pipeline (`vsftpd` #5) dispatched from postgres → agent built → result written back.
woodpecker-server is now genuinely stateless.
## This PR
- `StatefulSet` → `Deployment` (`strategy: Recreate` — never two servers on one DB during a roll).
- Remove `volumeClaimTemplates` + the `/var/lib/woodpecker` mount.
- Agent reaches the server via the standalone `woodpecker` Service (label selector), so a Deployment pod is reachable unchanged.
## Why it fixes #295/#324
Until the PVC is gone, Velero's `apps-daily` keeps trying to CSI-snapshot that error-flagged ext4 and failing (`structure needs cleaning`). Removing it stops the failing backup entirely — no fragile sqlite to snapshot.
## Cutover on merge (I'll drive it)
Flux prunes the StatefulSet (PVC retention is `Retain`, so the PVC survives the prune) and creates the Deployment. To avoid a brief two-servers overlap I'll scale the STS to 0 first, then reconcile, then **delete the orphaned `data-woodpecker-server-0` PVC** and confirm woodpecker is healthy on the new Deployment. Rollback stops being trivial after the PVC delete — but the migration is fully verified.
Closes #295
Closes #324
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Stage 3/3, the finale of the sqlite->CNPG migration. woodpecker-server is now
stateless (DB in wp-pg Postgres, verified end-to-end incl. a live pipeline run),
so convert the StatefulSet to a Deployment and remove the volumeClaimTemplates +
/var/lib/woodpecker mount. strategy: Recreate keeps a single control-plane
instance (no two servers on one DB during a roll).
This deletes the last use of the data-woodpecker-server-0 PVC, whose ext4
CSI-snapshot backup failed permanently ("structure needs cleaning"). Once the
PVC itself is removed, Velero's apps-daily stops trying to snapshot it —
resolving #295 and #324. The agent reaches the server via the standalone
`woodpecker` Service (label selector), so a Deployment pod is reachable
unchanged.
Closes#295Closes#324
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 3 of 3 — the finale. Removes the
data-woodpecker-server-0PVC, which is what finally closes #295 and #324.Context
The migration is complete and verified (#355 stood up
wp-pg; #356 cut the server over to postgres):vsftpd#5) dispatched from postgres → agent built → result written back.woodpecker-server is now genuinely stateless.
This PR
StatefulSet→Deployment(strategy: Recreate— never two servers on one DB during a roll).volumeClaimTemplates+ the/var/lib/woodpeckermount.woodpeckerService (label selector), so a Deployment pod is reachable unchanged.Why it fixes #295/#324
Until the PVC is gone, Velero's
apps-dailykeeps trying to CSI-snapshot that error-flagged ext4 and failing (structure needs cleaning). Removing it stops the failing backup entirely — no fragile sqlite to snapshot.Cutover on merge (I'll drive it)
Flux prunes the StatefulSet (PVC retention is
Retain, so the PVC survives the prune) and creates the Deployment. To avoid a brief two-servers overlap I'll scale the STS to 0 first, then reconcile, then delete the orphaneddata-woodpecker-server-0PVC and confirm woodpecker is healthy on the new Deployment. Rollback stops being trivial after the PVC delete — but the migration is fully verified.Closes #295
Closes #324
🤖 Generated with Claude Code
Stage 3/3, the finale of the sqlite->CNPG migration. woodpecker-server is now stateless (DB in wp-pg Postgres, verified end-to-end incl. a live pipeline run), so convert the StatefulSet to a Deployment and remove the volumeClaimTemplates + /var/lib/woodpecker mount. strategy: Recreate keeps a single control-plane instance (no two servers on one DB during a roll). This deletes the last use of the data-woodpecker-server-0 PVC, whose ext4 CSI-snapshot backup failed permanently ("structure needs cleaning"). Once the PVC itself is removed, Velero's apps-daily stops trying to snapshot it — resolving #295 and #324. The agent reaches the server via the standalone `woodpecker` Service (label selector), so a Deployment pod is reachable unchanged. Closes #295 Closes #324 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>