- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD) * DEV: Clés TEST Pierre (mode test) * REC: Clés TEST Client (mode test) * PROD: Clés LIVE Client (mode live) - Ajout de la gestion des bases de données immeubles/bâtiments * Configuration buildings_database pour DEV/REC/PROD * Service BuildingService pour enrichissement des adresses - Optimisations pages et améliorations ergonomie - Mises à jour des dépendances Composer - Nettoyage des fichiers obsolètes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
249 lines
7.5 KiB
Bash
249 lines
7.5 KiB
Bash
#!/bin/bash
|
|
#
|
|
# sync_geosector.sh - Synchronise les backups geosector depuis PM7 vers maria3 (IN3) et maria4 (IN4)
|
|
#
|
|
# Ce script :
|
|
# 1. Trouve le dernier backup chiffré de geosector sur PM7
|
|
# 2. Le déchiffre et décompresse localement
|
|
# 3. Le transfère et l'importe dans IN3/maria3/geosector
|
|
# 4. Le transfère et l'importe dans IN4/maria4/geosector
|
|
#
|
|
# Installation: /var/pierre/bat/sync_geosector.sh
|
|
# Usage: ./sync_geosector.sh [--force] [--date YYYYMMDD_HH]
|
|
#
|
|
|
|
set -uo pipefail
|
|
# Note: Removed -e to allow script to continue on sync errors
|
|
# Errors are handled explicitly with ERROR_COUNT
|
|
|
|
# Configuration
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONFIG_FILE="$SCRIPT_DIR/d6back.yaml"
|
|
BACKUP_DIR="/var/pierre/back/IN3/nx4/sql"
|
|
ENC_KEY_FILE="/home/pierre/.key_enc"
|
|
SSH_KEY="/home/pierre/.ssh/backup_key"
|
|
TEMP_DIR="/tmp/geosector_sync"
|
|
LOG_FILE="/var/pierre/bat/logs/sync_geosector.log"
|
|
RECAP_FILE="/tmp/sync_geosector_recap_$$.txt"
|
|
|
|
# Load email config from d6back.yaml
|
|
if [[ -f "$CONFIG_FILE" ]]; then
|
|
EMAIL_TO=$(yq '.global.email_to // "support@unikoffice.com"' "$CONFIG_FILE" | tr -d '"')
|
|
BACKUP_SERVER=$(yq '.global.backup_server // "BACKUP"' "$CONFIG_FILE" | tr -d '"')
|
|
else
|
|
EMAIL_TO="support@unikoffice.com"
|
|
BACKUP_SERVER="BACKUP"
|
|
fi
|
|
|
|
# Serveurs cibles
|
|
IN3_HOST="195.154.80.116"
|
|
IN3_USER="pierre"
|
|
IN3_CONTAINER="maria3"
|
|
|
|
IN4_HOST="51.159.7.190"
|
|
IN4_USER="pierre"
|
|
IN4_CONTAINER="maria4"
|
|
|
|
# Credentials MariaDB
|
|
DB_USER="root"
|
|
IN3_DB_PASS="MyAlpLocal,90b" # maria3
|
|
IN4_DB_PASS="MyAlpLocal,90b" # maria4
|
|
DB_NAME="geosector"
|
|
|
|
# Fonctions utilitaires
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
error() {
|
|
log "ERROR: $*"
|
|
exit 1
|
|
}
|
|
|
|
cleanup() {
|
|
if [[ -d "$TEMP_DIR" ]]; then
|
|
log "Nettoyage de $TEMP_DIR"
|
|
rm -rf "$TEMP_DIR"
|
|
fi
|
|
rm -f "$RECAP_FILE"
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
# Lecture de la clé de chiffrement
|
|
if [[ ! -f "$ENC_KEY_FILE" ]]; then
|
|
error "Clé de chiffrement non trouvée: $ENC_KEY_FILE"
|
|
fi
|
|
ENC_KEY=$(cat "$ENC_KEY_FILE")
|
|
|
|
# Parsing des arguments
|
|
FORCE=0
|
|
SPECIFIC_DATE=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--force)
|
|
FORCE=1
|
|
shift
|
|
;;
|
|
--date)
|
|
SPECIFIC_DATE="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Usage: $0 [--force] [--date YYYYMMDD_HH]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Trouver le fichier backup
|
|
if [[ -n "$SPECIFIC_DATE" ]]; then
|
|
BACKUP_FILE="$BACKUP_DIR/geosector_${SPECIFIC_DATE}.sql.gz.enc"
|
|
if [[ ! -f "$BACKUP_FILE" ]]; then
|
|
error "Backup non trouvé: $BACKUP_FILE"
|
|
fi
|
|
else
|
|
# Chercher le plus récent
|
|
BACKUP_FILE=$(find "$BACKUP_DIR" -name "geosector_*.sql.gz.enc" -type f -printf '%T@ %p\n' | sort -rn | head -1 | cut -d' ' -f2-)
|
|
if [[ -z "$BACKUP_FILE" ]]; then
|
|
error "Aucun backup geosector trouvé dans $BACKUP_DIR"
|
|
fi
|
|
fi
|
|
|
|
BACKUP_BASENAME=$(basename "$BACKUP_FILE")
|
|
log "Backup sélectionné: $BACKUP_BASENAME"
|
|
|
|
# Initialiser le fichier récapitulatif
|
|
echo "SYNC GEOSECTOR REPORT - $(hostname) - $(date '+%d.%m.%Y %H')h" > "$RECAP_FILE"
|
|
echo "========================================" >> "$RECAP_FILE"
|
|
echo "" >> "$RECAP_FILE"
|
|
echo "Backup source: $BACKUP_BASENAME" >> "$RECAP_FILE"
|
|
echo "" >> "$RECAP_FILE"
|
|
|
|
# Créer le répertoire temporaire
|
|
mkdir -p "$TEMP_DIR"
|
|
DECRYPTED_FILE="$TEMP_DIR/geosector.sql"
|
|
|
|
# Étape 1: Déchiffrer et décompresser
|
|
log "Déchiffrement et décompression du backup..."
|
|
if ! openssl enc -aes-256-cbc -d -pass pass:"$ENC_KEY" -pbkdf2 -in "$BACKUP_FILE" | gunzip > "$DECRYPTED_FILE"; then
|
|
error "Échec du déchiffrement/décompression"
|
|
fi
|
|
|
|
FILE_SIZE=$(du -h "$DECRYPTED_FILE" | cut -f1)
|
|
log "Fichier SQL déchiffré: $FILE_SIZE"
|
|
|
|
echo "Decrypted SQL size: $FILE_SIZE" >> "$RECAP_FILE"
|
|
echo "" >> "$RECAP_FILE"
|
|
|
|
# Compteur d'erreurs
|
|
ERROR_COUNT=0
|
|
|
|
# Fonction pour synchroniser vers un serveur
|
|
sync_to_server() {
|
|
local HOST=$1
|
|
local USER=$2
|
|
local CONTAINER=$3
|
|
local DB_PASS=$4
|
|
local SERVER_NAME=$5
|
|
|
|
log "=== Synchronisation vers $SERVER_NAME ($HOST) ==="
|
|
echo "TARGET: $SERVER_NAME ($HOST/$CONTAINER)" >> "$RECAP_FILE"
|
|
|
|
# Test de connexion SSH
|
|
if ! ssh -i "$SSH_KEY" -o ConnectTimeout=10 "$USER@$HOST" "echo 'SSH OK'" &>/dev/null; then
|
|
log "ERROR: Impossible de se connecter à $HOST via SSH"
|
|
echo " ✗ SSH connection FAILED" >> "$RECAP_FILE"
|
|
((ERROR_COUNT++))
|
|
return 1
|
|
fi
|
|
|
|
# Import dans MariaDB
|
|
log "Import dans $SERVER_NAME/$CONTAINER/geosector..."
|
|
|
|
# Drop et recréer la base sur le serveur distant
|
|
if ! ssh -i "$SSH_KEY" "$USER@$HOST" "incus exec $CONTAINER --project default -- mariadb -u root -p'$DB_PASS' -e 'DROP DATABASE IF EXISTS $DB_NAME; CREATE DATABASE $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'"; then
|
|
log "ERROR: Échec de la création de la base sur $SERVER_NAME"
|
|
echo " ✗ Database creation FAILED" >> "$RECAP_FILE"
|
|
((ERROR_COUNT++))
|
|
return 1
|
|
fi
|
|
|
|
# Filtrer et importer le SQL (enlever CREATE DATABASE et USE avec timestamp)
|
|
log "Filtrage et import du SQL..."
|
|
if ! sed -e '/^CREATE DATABASE.*geosector_[0-9]/d' \
|
|
-e '/^USE.*geosector_[0-9]/d' \
|
|
"$DECRYPTED_FILE" | \
|
|
ssh -i "$SSH_KEY" "$USER@$HOST" "incus exec $CONTAINER --project default -- mariadb -u root -p'$DB_PASS' $DB_NAME"; then
|
|
log "ERROR: Échec de l'import sur $SERVER_NAME"
|
|
echo " ✗ SQL import FAILED" >> "$RECAP_FILE"
|
|
((ERROR_COUNT++))
|
|
return 1
|
|
fi
|
|
|
|
log "$SERVER_NAME: Import réussi"
|
|
echo " ✓ Import SUCCESS" >> "$RECAP_FILE"
|
|
echo "" >> "$RECAP_FILE"
|
|
}
|
|
|
|
# Synchronisation vers IN3/maria3
|
|
sync_to_server "$IN3_HOST" "$IN3_USER" "$IN3_CONTAINER" "$IN3_DB_PASS" "IN3/maria3"
|
|
|
|
# Synchronisation vers IN4/maria4
|
|
sync_to_server "$IN4_HOST" "$IN4_USER" "$IN4_CONTAINER" "$IN4_DB_PASS" "IN4/maria4"
|
|
|
|
# Finaliser le récapitulatif
|
|
echo "========================================" >> "$RECAP_FILE"
|
|
echo "COMPLETED: $(date '+%d.%m.%Y %H:%M')" >> "$RECAP_FILE"
|
|
|
|
# Préparer le sujet email avec date
|
|
DATE_SUBJECT=$(date '+%d.%m.%Y %H')
|
|
|
|
# Envoyer l'email récapitulatif
|
|
if [[ $ERROR_COUNT -gt 0 ]]; then
|
|
log "Total errors: $ERROR_COUNT"
|
|
|
|
# Ajouter les erreurs au récap
|
|
echo "" >> "$RECAP_FILE"
|
|
echo "ERRORS DETECTED: $ERROR_COUNT" >> "$RECAP_FILE"
|
|
echo "----------------------------" >> "$RECAP_FILE"
|
|
grep -i "ERROR" "$LOG_FILE" | tail -20 >> "$RECAP_FILE"
|
|
|
|
# Envoyer email avec ERROR dans le sujet
|
|
log "Sending ERROR email to $EMAIL_TO (Errors found: $ERROR_COUNT)"
|
|
if command -v msmtp &> /dev/null; then
|
|
{
|
|
echo "To: $EMAIL_TO"
|
|
echo "Subject: Sync${BACKUP_SERVER} ERROR $DATE_SUBJECT"
|
|
echo ""
|
|
cat "$RECAP_FILE"
|
|
} | msmtp "$EMAIL_TO"
|
|
log "ERROR email sent successfully to $EMAIL_TO"
|
|
else
|
|
log "WARNING: msmtp not found - ERROR email NOT sent"
|
|
fi
|
|
|
|
log "=== Synchronisation terminée avec des erreurs ==="
|
|
exit 1
|
|
else
|
|
log "=== Synchronisation terminée avec succès ==="
|
|
log "Les bases geosector sur maria3 et maria4 sont à jour avec le backup $BACKUP_BASENAME"
|
|
|
|
# Envoyer email de succès
|
|
log "Sending SUCCESS recap email to $EMAIL_TO"
|
|
if command -v msmtp &> /dev/null; then
|
|
{
|
|
echo "To: $EMAIL_TO"
|
|
echo "Subject: Sync${BACKUP_SERVER} $DATE_SUBJECT"
|
|
echo ""
|
|
cat "$RECAP_FILE"
|
|
} | msmtp "$EMAIL_TO"
|
|
log "SUCCESS recap email sent successfully to $EMAIL_TO"
|
|
else
|
|
log "WARNING: msmtp not found - SUCCESS recap email NOT sent"
|
|
fi
|
|
|
|
exit 0
|
|
fi
|