#!/bin/bash # Vérification des arguments if [ $# -ne 1 ]; then echo "Usage: $0 " echo " rec : Livrer de DVA (dva-geo) vers RECETTE (rca-geo)" echo " prod : Livrer de RECETTE (rca-geo) vers PRODUCTION (pra-geo)" echo "" echo "Examples:" echo " $0 rec # DVA → RECETTE" echo " $0 prod # RECETTE → PRODUCTION" exit 1 fi HOST_IP="195.154.80.116" HOST_USER=root HOST_KEY=/Users/pierre/.ssh/id_rsa_mbpi HOST_PORT=22 # Mapping des environnements ENVIRONMENT=$1 case $ENVIRONMENT in "rec") SOURCE_CONTAINER="dva-geo" DEST_CONTAINER="rca-geo" ENV_NAME="RECETTE" ;; "prod") SOURCE_CONTAINER="rca-geo" DEST_CONTAINER="pra-geo" ENV_NAME="PRODUCTION" ;; *) echo "❌ Environnement '$ENVIRONMENT' non reconnu" echo "Utilisez 'rec' pour RECETTE ou 'prod' pour PRODUCTION" exit 1 ;; esac API_PATH="/var/www/geosector/api" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_DIR="${API_PATH}_backup_${TIMESTAMP}" PROJECT="default" echo "🔄 Livraison vers $ENV_NAME : $SOURCE_CONTAINER → $DEST_CONTAINER (projet: $PROJECT)" # Vérifier si les containers existent echo "🔍 Vérification des containers..." ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus info $SOURCE_CONTAINER --project $PROJECT" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "❌ Erreur: Le container source $SOURCE_CONTAINER n'existe pas ou n'est pas accessible dans le projet $PROJECT" exit 1 fi ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus info $DEST_CONTAINER --project $PROJECT" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "❌ Erreur: Le container destination $DEST_CONTAINER n'existe pas ou n'est pas accessible dans le projet $PROJECT" exit 1 fi # Créer une sauvegarde du dossier de destination avant de le remplacer echo "📦 Création d'une sauvegarde sur $DEST_CONTAINER..." # Vérifier si le dossier API existe ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- test -d $API_PATH" if [ $? -eq 0 ]; then # Le dossier existe, créer une sauvegarde ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- cp -r $API_PATH $BACKUP_DIR" echo "✅ Sauvegarde créée dans $BACKUP_DIR" else echo "⚠️ Le dossier API n'existe pas sur la destination" fi # Copier le dossier API entre les containers echo "📋 Copie des fichiers en cours..." # Nettoyage sélectif : supprimer seulement le code, pas les données (logs et uploads) echo "🧹 Nettoyage sélectif (préservation de logs et uploads)..." ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH -mindepth 1 -maxdepth 1 ! -name 'uploads' ! -name 'logs' -exec rm -rf {} \;" # Copier directement du container source vers le container destination (en excluant logs et uploads) echo "📤 Transfert du code (hors logs et uploads)..." ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $SOURCE_CONTAINER --project $PROJECT -- tar -cf - -C $API_PATH --exclude='uploads' --exclude='logs' . | incus exec $DEST_CONTAINER --project $PROJECT -- tar -xf - -C $API_PATH" if [ $? -ne 0 ]; then echo "❌ Erreur lors du transfert entre containers" echo "⚠️ Tentative de restauration de la sauvegarde..." # Vérifier si la sauvegarde existe ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- test -d $BACKUP_DIR" if [ $? -eq 0 ]; then # La sauvegarde existe, la restaurer ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- rm -rf $API_PATH" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- cp -r $BACKUP_DIR $API_PATH" echo "✅ Restauration réussie" else echo "❌ Échec de la restauration" fi exit 1 fi echo "✅ Code transféré avec succès (logs et uploads préservés)" # Changer le propriétaire et les permissions des fichiers echo "👤 Application des droits et permissions pour tous les fichiers..." # Définir le propriétaire pour tous les fichiers ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chown -R nginx:nginx $API_PATH" # Appliquer les permissions de base pour les dossiers (755) ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH -type d -exec chmod 755 {} \;" # Appliquer les permissions pour les fichiers (644) ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH -type f -exec chmod 644 {} \;" # Appliquer des permissions spécifiques pour le dossier logs (pour permettre à PHP-FPM de l'utilisateur nobody d'y écrire) ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- test -d $API_PATH/logs" if [ $? -eq 0 ]; then # Changer le groupe du dossier logs à nobody (utilisateur PHP-FPM) ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chown -R nginx:nobody $API_PATH/logs" # Appliquer les permissions 775 pour le dossier ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chmod -R 775 $API_PATH/logs" # Appliquer les permissions 664 pour les fichiers ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH/logs -type f -exec chmod 664 {} \;" echo "✅ Droits spécifiques appliqués au dossier logs (nginx:nobody avec permissions 775/664)" else echo "⚠️ Le dossier logs n'existe pas" fi # Vérifier et corriger les permissions du dossier uploads s'il existe ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- test -d $API_PATH/uploads" if [ $? -eq 0 ]; then # S'assurer que uploads a les bonnes permissions ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chown -R nginx:nobody $API_PATH/uploads" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chmod -R 775 $API_PATH/uploads" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH/uploads -type f -exec chmod 664 {} \;" echo "✅ Droits vérifiés pour le dossier uploads (nginx:nginx avec permissions 775)" else # Créer le dossier uploads s'il n'existe pas ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- mkdir -p $API_PATH/uploads" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chown -R nginx:nobody $API_PATH/uploads" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- chmod -R 775 $API_PATH/uploads" ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- find $API_PATH/uploads -type f -exec chmod 664 {} \;" echo "✅ Dossier uploads créé avec les bonnes permissions (nginx:nginx avec permissions 775/664)" fi echo "✅ Propriétaire et permissions appliqués avec succès" # Vérifier la copie echo "✅ Vérification de la copie..." ssh -i $HOST_KEY -p $HOST_PORT $HOST_USER@$HOST_IP "incus exec $DEST_CONTAINER --project $PROJECT -- test -d $API_PATH" if [ $? -eq 0 ]; then echo "✅ Copie réussie" else echo "❌ Erreur: Le dossier API n'a pas été copié correctement" fi echo "✅ Livraison vers $ENV_NAME terminée avec succès!" echo "📤 Source: $SOURCE_CONTAINER → Destination: $DEST_CONTAINER" echo "📁 Sauvegarde créée: $BACKUP_DIR sur $DEST_CONTAINER" echo "🔒 Données préservées: logs/ et uploads/ intouchés" echo "👤 Permissions: nginx:nginx (755/644) + logs (nginx:nobody 775/664)"