91 lines
3.7 KiB
Bash
Executable File
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 "============================================================"
|