Files
homelab-infra/docs/superpowers/specs/2026-04-18-postgresql-cnpg-zfs-migration-design.md
T
panxiao81 88a02ababa
lint / yaml (push) Has been cancelled
lint / ansible (push) Has been cancelled
lint / terraform (push) Has been cancelled
Establish clean homelab infrastructure baseline
Reorganize the brownfield repository, remove retired and generated artifacts, harden ignore rules, and record the GitOps/IaC redesign.
2026-09-09 16:47:20 +00:00

78 lines
3.6 KiB
Markdown

# PostgreSQL Migration Design
## Goal
Move the current shared PostgreSQL deployment to CloudNativePG and back it with the existing OpenEBS ZFS storage layer.
The target state is a single PostgreSQL cluster managed by CloudNativePG, running one instance on the only worker node, with one shared database service for the apps that already use `shared-postgresql`.
## Current State
- PostgreSQL is currently deployed from chart values in `shared-postgresql/shared-postgresql-values.yaml`.
- Storage currently uses `local-path`.
- Apps such as Gitea and Casdoor point at the shared PostgreSQL service.
- There is an init SQL file for bootstrap data in `shared-postgresql/shared-postgresql-init.sql`.
## Target State
- CloudNativePG manages the PostgreSQL lifecycle.
- Storage comes from the OpenEBS-provided ZFS-backed `StorageClass`.
- The cluster runs with `instances: 1` because there is only one worker node.
- Existing app databases remain in the same PostgreSQL cluster.
- A compatibility Kubernetes `Service` preserves the existing shared database hostname or provides an equivalent stable alias.
## Non-Goals
- High availability across multiple nodes.
- Automatic failover.
- Database sharding or splitting apps into separate clusters.
- Changing application-level schemas unless required by migration.
## Approach
1. Provision or verify the OpenEBS ZFS `StorageClass` suitable for PostgreSQL PVCs.
2. Deploy CloudNativePG and create one cluster with a single instance.
3. Create the required role and database layout for the shared apps.
4. Migrate data from the current PostgreSQL instance with a logical dump and restore.
5. Cut over workloads to the new service.
6. Validate app logins, migrations, and basic read/write behavior.
## Migration Plan
### Phase 1: Storage
- Confirm the OpenEBS ZFS components are installed and healthy.
- Create a dedicated PostgreSQL `StorageClass` for CNPG.
- Use a single PVC for the primary instance.
### Phase 2: Database Deployment
- Install CloudNativePG.
- Create a `Cluster` manifest with one instance.
- Set resource requests and limits close to the current PostgreSQL footprint.
- Mount any required bootstrap SQL through CloudNativePG-supported init methods.
### Phase 3: Data Migration
- Quiesce writes on the current PostgreSQL instance.
- Take a logical backup of the existing databases and roles, including globals such as users and grants.
- Restore into the new CloudNativePG cluster.
- Recreate any app-specific users, grants, and schemas that are not captured automatically.
### Phase 4: Cutover
- Point app secrets or connection settings at the new CNPG service.
- Restart or roll the dependent workloads.
- Verify each app can connect and operate normally.
### Phase 5: Cleanup
- Keep the old deployment available until validation completes.
- Remove the old PostgreSQL deployment only after the new cluster is confirmed healthy.
## Risks
- OpenEBS ZFS must be healthy before PostgreSQL migration starts.
- Single-node deployment means node failure still causes downtime.
- Logical restore can miss permissions or extension details if the old instance has custom setup.
- Existing app passwords should be preserved or rotated carefully during cutover.
## Validation
- CNPG cluster reports healthy.
- PVC is bound on the ZFS-backed storage class.
- Existing apps can connect using the shared PostgreSQL service.
- Basic read/write checks succeed for each app database.
- Restarting the PostgreSQL pod does not lose data.
## Rollback
- If restore or validation fails, keep the current PostgreSQL deployment active and point apps back to the old service.
- Do not delete the old PVC or deployment until the new cluster passes validation.