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