adsb-1090/apply_tuning.sh

98 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# Application du tuning postgresql.conf -- Stack ADS-B Linux-25
# Hardware : i7-7567U, 4 threads logiques, 16 Go RAM, SSD Samsung
# Conteneur : wordpress-postgres (postgis/postgis:16-3.5)
# Fichier de config : volume pg-conf-std, monté /etc/postgresql
# ============================================================================
set -euo pipefail
CONTAINER="wordpress-postgres"
CONF_PATH_IN_CONTAINER="/etc/postgresql/postgresql.conf"
BACKUP_DIR="/backup/postgres_tuning_$(date +%Y%m%d_%H%M%S)"
echo "==> 1. Sauvegarde du postgresql.conf actuel"
mkdir -p "$BACKUP_DIR"
docker cp "${CONTAINER}:${CONF_PATH_IN_CONTAINER}" "$BACKUP_DIR/postgresql.conf.bak"
echo " Sauvegardé : $BACKUP_DIR/postgresql.conf.bak"
echo "==> 2. Application des nouveaux paramètres"
# On utilise sed dans le conteneur pour modifier les lignes existantes,
# et on ajoute les nouvelles directives en fin de fichier (section CUSTOMIZED
# OPTIONS déjà présente, cohérent avec les ajouts précédents JCA 2026-06-29)
docker exec "$CONTAINER" bash -c "cat >> ${CONF_PATH_IN_CONTAINER} << 'EOF'
# ── Tuning mémoire/IO/planner (Claude, $(date +%Y-%m-%d)) ──
# Hardware : i7-7567U 4 threads logiques, 16 Go RAM, SSD Samsung
# Remplace les valeurs précédentes (shared_buffers=512MB, work_mem=256MB)
# par des valeurs adaptées à la RAM disponible et au risque d'OOM.
shared_buffers = 3200MB
effective_cache_size = 9GB
work_mem = 32MB
maintenance_work_mem = 512MB
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
random_page_cost = 1.1
effective_io_concurrency = 150
max_parallel_workers_per_gather = 2
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 2ms
EOF"
echo "==> 3. Vérification de la syntaxe (parse à blanc)"
# postgres --check-config n'existe pas nativement ; on vérifie via un restart
# contrôlé avec rollback possible si échec.
echo "==> 4. Redémarrage du conteneur (shared_buffers nécessite un restart complet)"
cd /root/wordpress
docker compose restart postgres
echo "==> 5. Attente du démarrage"
for i in $(seq 1 30); do
if docker exec "$CONTAINER" pg_isready -U pgz_admin -d wpz_postgres > /dev/null 2>&1; then
echo " PostgreSQL prêt après ${i}s"
break
fi
if [ "$i" -eq 30 ]; then
echo " ÉCHEC : PostgreSQL ne démarre pas avec la nouvelle config."
echo " Rollback automatique..."
docker cp "$BACKUP_DIR/postgresql.conf.bak" "${CONTAINER}:${CONF_PATH_IN_CONTAINER}"
docker compose restart postgres
echo " Rollback effectué. Vérifier les logs : docker logs ${CONTAINER} --tail 50"
exit 1
fi
sleep 1
done
echo "==> 6. Vérification des paramètres effectivement appliqués"
docker exec "$CONTAINER" psql -U pgz_admin -d wpz_postgres -c "
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'shared_buffers', 'effective_cache_size', 'work_mem', 'maintenance_work_mem',
'max_wal_size', 'min_wal_size', 'random_page_cost', 'effective_io_concurrency',
'max_parallel_workers_per_gather'
)
ORDER BY name;
"
echo "==> 7. Vérification que les données et services sont intacts"
docker exec "$CONTAINER" psql -U pgz_admin -d wpz_postgres -c \
"SELECT count(*) AS partitions FROM pg_inherits WHERE inhparent = 'adsb.positions'::regclass;"
echo ""
echo "Si adsb2pg/webapp tournaient déjà, ils n'ont pas besoin d'être redémarrés"
echo "(ils se reconnectent automatiquement à PostgreSQL). Vérification :"
docker exec "$CONTAINER" psql -U pgz_admin -d wpz_postgres -c \
"SELECT max(ts) AS derniere_insertion FROM adsb.positions WHERE ts >= NOW() - INTERVAL '5 minutes';"
echo ""
echo "============================================================"
echo "Sauvegarde de l'ancienne config : $BACKUP_DIR/postgresql.conf.bak"
echo "Rollback manuel si besoin plus tard :"
echo " docker cp $BACKUP_DIR/postgresql.conf.bak ${CONTAINER}:${CONF_PATH_IN_CONTAINER}"
echo " cd /root/wordpress && docker compose restart postgres"
echo "============================================================"