Files
Keybard-Vagabond-Demo/build/postgresql-postgis/Migration_Plan.md

185 lines
6.7 KiB
Markdown

# PostgreSQL 18 + PostGIS 3.6 for CloudNativePG (ARM64 Source Build)
## Overview
Upgrade from PostgreSQL 16 to PostgreSQL 18 with PostGIS 3.6 for ARM64 CloudNativePG deployment.
**Why build from source?**
- The official `postgis/postgis:18-3.6` image only supports AMD64, not ARM64
- `imresamu/postgis` hasn't released PG18 ARM64 images yet
- Building from source ensures ARM64 compatibility for your cluster
**Current Setup:**
- Image: `registry.keyboardvagabond.com/library/cnpg-postgis:16.6-3.4-v2`
- Base: `imresamu/postgis:16-3.4`
- PostgreSQL: 16.6
- PostGIS: 3.4
**Target Setup:**
- Image: `registry.keyboardvagabond.com/library/cnpg-postgis:18-3.6`
- Base: `postgres:18-bookworm` (official, ARM64 supported)
- PostgreSQL: 18.1
- PostGIS: 3.6.1 (compiled from source)
- GEOS: 3.13.0
- PROJ: 9.4.1
- GDAL: 3.10.1
## Extensions Included
| Extension | Description | Status |
|-----------|-------------|--------|
| postgis | Core GIS functionality | ✓ Compiled |
| postgis_topology | Topology support | ✓ Compiled |
| postgis_raster | Raster support | ✓ Compiled |
| fuzzystrmatch | Fuzzy string matching | ✓ Compiled |
| postgis_tiger_geocoder | US Census TIGER geocoder | ✓ Compiled |
## Build Architecture
```
┌─────────────────────────────────────────────────────────────────┐
│ Stage 1: Builder │
│ - Base: postgres:18-bookworm (ARM64) │
│ - Compile GEOS 3.13.0 │
│ - Compile PROJ 9.5.1 │
│ - Compile GDAL 3.10.1 │
│ - Compile PostGIS 3.6.1 │
├─────────────────────────────────────────────────────────────────┤
│ Stage 2: CNPG Tools │
│ - ghcr.io/cloudnative-pg/postgresql:18 │
│ - Extract barman-cloud tools for backup/restore │
├─────────────────────────────────────────────────────────────────┤
│ Stage 3: Final Image (minimal) │
│ - Base: postgres:18-bookworm (ARM64) │
│ - Copy compiled libs from Stage 1 │
│ - Copy barman tools from Stage 2 │
│ - Fix postgres UID to 26 (CNPG requirement) │
│ - Runtime dependencies only │
└─────────────────────────────────────────────────────────────────┘
```
## ⚠️ Important: PG18 Data Directory Change
PostgreSQL 18 changed the default data directory path:
| Version | Data Directory |
|---------|----------------|
| PG 13-17 | `/var/lib/postgresql/data` |
| PG 18+ | `/var/lib/postgresql` |
This affects volume mounts in docker-compose and may require CNPG configuration changes.
## Migration Steps
### Phase 1: Build and Test Locally
1. **Build the image (takes 15-30 minutes):**
```bash
cd build/postgresql-postgis
chmod +x build.sh initdb-postgis.sh update-postgis.sh
./build.sh
```
2. **Test with docker-compose:**
```bash
docker-compose -f docker-compose.test.yaml up -d
docker-compose -f docker-compose.test.yaml exec postgres psql -U postgres
# In psql, verify:
SELECT postgis_full_version();
SELECT ST_AsText(ST_Point(0, 0));
\dx -- list extensions
# Cleanup
docker-compose -f docker-compose.test.yaml down -v
```
3. **Interactive testing:**
```bash
docker run -it --rm -e POSTGRES_PASSWORD=test cnpg-postgis:18-3.6 bash
```
### Phase 2: Push to Registry
```bash
docker push registry.keyboardvagabond.com/library/cnpg-postgis:18-3.6
```
### Phase 3: CNPG Upgrade
**Option A: In-place upgrade (for testing)**
1. Update `manifests/infrastructure/postgresql/cluster-shared.yaml`:
```yaml
spec:
imageName: registry.keyboardvagabond.com/library/cnpg-postgis:18-3.6
```
2. CNPG will handle the rolling upgrade automatically.
**Option B: Create new cluster and migrate (safer for production)**
1. Create a new cluster with PG18 image
2. Use pg_dump/pg_restore or CNPG backup/restore
3. Switch applications to new cluster
4. Decommission old cluster
## CNPG Operator Compatibility
- Current operator: `>=0.20.0` (Helm chart)
- PostgreSQL 18 support: Requires CNPG operator 1.24+
- Check current version:
```bash
kubectl get deployment -n postgresql-system -l app.kubernetes.io/name=cloudnative-pg \
-o jsonpath='{.items[0].spec.template.spec.containers[0].image}'
```
If upgrade needed, update `manifests/infrastructure/postgresql/operator.yaml`:
```yaml
spec:
chart:
spec:
version: ">=0.23.0" # or specific version with PG18 support
```
## Rollback Plan
If issues occur:
1. Change imageName back to `registry.keyboardvagabond.com/library/cnpg-postgis:16.6-3.4-v2`
2. CNPG will roll back to previous version
3. Restore from backup if data issues
## Verification Checklist
- [ ] Image builds successfully on M1 Mac (~15-30 min)
- [ ] postgres user has UID 26
- [ ] GEOS, PROJ, GDAL compiled correctly
- [ ] PostGIS extensions install correctly
- [ ] barman-cloud tools are present
- [ ] Local docker-compose test passes
- [ ] Spatial queries work (`ST_Point`, `ST_AsText`, etc.)
- [ ] Image pushed to Harbor registry
- [ ] CNPG operator compatible with PG18
- [ ] Test cluster upgrade in staging (if available)
- [ ] Production cluster upgrade successful
- [ ] All fediverse apps functioning correctly
## Build Dependencies (compiled from source)
| Library | Version | Purpose |
|---------|---------|---------|
| GEOS | 3.13.0 | Geometry operations |
| PROJ | 9.4.1 | Coordinate transformations |
| GDAL | 3.10.1 | Raster/vector data access |
| PostGIS | 3.6.1 | PostgreSQL spatial extension |
## References
- [PostgreSQL 18 Release Notes](https://www.postgresql.org/docs/18/release-18.html)
- [PostGIS 3.6 Release Notes](https://postgis.net/documentation/getting_started/)
- [docker-postgis GitHub](https://github.com/postgis/docker-postgis)
- [CloudNativePG Documentation](https://cloudnative-pg.io/documentation/)
- [GEOS Downloads](https://download.osgeo.org/geos/)
- [PROJ Downloads](https://download.osgeo.org/proj/)
- [GDAL Downloads](https://github.com/OSGeo/gdal/releases)