adsb-1090/migrate_to_postgis.sh

91 lines
3.7 KiB
Bash
Executable File

#!/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 "============================================================"