#!/bin/bash # ============================================================================ # Bascule postgres:16-alpine -> postgis/postgis:16-3.4 # Stack WordPress + ADS-B, Linux-25 # Site personnel : indisponibilité tolérée, on fait ça en une seule fenêtre. # ============================================================================ set -euo pipefail COMPOSE_DIR="/root/wordpress" BACKUP_DIR="/backup/postgres_migration_$(date +%Y%m%d_%H%M%S)" echo "==> 1. Sauvegarde de précaution AVANT toute modification" mkdir -p "$BACKUP_DIR" # Dump logique complet (indépendant du format binaire, donc restaurable # même si jamais l'image change quelque chose de fondamental) docker exec wordpress-postgres pg_dump -U pgz_admin -d wpz_postgres -F c \ -f /tmp/wpz_postgres_pre_postgis.dump docker cp wordpress-postgres:/tmp/wpz_postgres_pre_postgis.dump \ "$BACKUP_DIR/wpz_postgres_pre_postgis.dump" echo " Dump sauvegardé : $BACKUP_DIR/wpz_postgres_pre_postgis.dump" ls -lh "$BACKUP_DIR/wpz_postgres_pre_postgis.dump" echo "==> 2. Sauvegarde du docker-compose.yml actuel" cp "$COMPOSE_DIR/docker-compose.yml" "$BACKUP_DIR/docker-compose.yml.bak" echo "==> 3. Édition de l'image dans docker-compose.yml" sed -i 's|image: postgres:16-alpine|image: postgis/postgis:16-3.5|' \ "$COMPOSE_DIR/docker-compose.yml" grep -A1 "container_name: wordpress-postgres" "$COMPOSE_DIR/docker-compose.yml" || true grep "postgis/postgis" "$COMPOSE_DIR/docker-compose.yml" echo "==> 4. Pull de la nouvelle image" cd "$COMPOSE_DIR" docker compose pull postgres echo "==> 5. Arrêt propre des conteneurs dépendants (ADS-B) avant bascule" echo " (évite des erreurs de connexion pendant le redémarrage PG)" cd /data/adsb docker compose stop adsb2pg webapp echo "==> 6. Recreate du conteneur postgres avec la nouvelle image" cd "$COMPOSE_DIR" docker compose up -d postgres echo "==> 7. Attente du démarrage (healthcheck implicite via pg_isready)" for i in $(seq 1 30); do if docker exec wordpress-postgres pg_isready -U pgz_admin -d wpz_postgres > /dev/null 2>&1; then echo " PostgreSQL prêt après ${i}s" break fi sleep 1 done echo "==> 8. Vérification : les données existantes sont toujours là" docker exec wordpress-postgres psql -U pgz_admin -d wpz_postgres -c \ "SELECT count(*) AS partitions FROM pg_inherits WHERE inhparent = 'adsb.positions'::regclass;" docker exec wordpress-postgres psql -U pgz_admin -d wpz_postgres -c \ "SELECT count(*) AS receivers FROM adsb.receivers;" echo "==> 9. Activation de PostGIS" docker exec wordpress-postgres psql -U pgz_admin -d wpz_postgres -c \ "CREATE EXTENSION IF NOT EXISTS postgis;" docker exec wordpress-postgres psql -U pgz_admin -d wpz_postgres -c \ "SELECT postgis_full_version();" echo "==> 10. Redémarrage des conteneurs ADS-B" cd /data/adsb docker compose start adsb2pg webapp sleep 5 docker compose ps echo "==> 11. Vérification finale -- adsb2pg insère toujours correctement" sleep 10 docker exec wordpress-postgres psql -U pgz_admin -d wpz_postgres -c \ "SELECT max(ts) AS derniere_insertion, count(*) AS lignes_30min FROM adsb.positions WHERE ts >= NOW() - INTERVAL '5 minutes';" echo "" echo "============================================================" echo "Migration terminée. En cas de problème, restauration :" echo " cp $BACKUP_DIR/docker-compose.yml.bak $COMPOSE_DIR/docker-compose.yml" echo " cd $COMPOSE_DIR && docker compose up -d postgres" echo " (puis restaurer le dump si nécessaire :" echo " docker exec -i wordpress-postgres pg_restore -U pgz_admin -d wpz_postgres --clean" echo " < $BACKUP_DIR/wpz_postgres_pre_postgis.dump)" echo "============================================================"