#!/bin/bash # Script de déploiement optimisé de Cleo # Version: 2.1 - Supporte déploiement DEV et PROD # Usage: ./deploy-cleo.sh [pra] # Sans argument : Déploie depuis local vers IN3/dva-front (DEV) # Avec 'pra' : Déploie depuis IN3/dva-front vers IN4/pra-front (PROD) cd /home/pierre/dev/cleo # Détecter le mode de déploiement DEPLOY_MODE=${1:-dev} if [ "$DEPLOY_MODE" = "pra" ]; then # Configuration PROD : IN3/dva-front → IN4/pra-front SOURCE_HOST=11.1.2.1 SOURCE_SSH_USER=root SOURCE_SSH_PORT=22 SOURCE_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi SOURCE_CT_PROJECT=default SOURCE_CT_NAME=dva-front SOURCE_DEPLOY_DIR=/var/www/cleo TARGET_HOST=11.1.2.14 TARGET_SSH_USER=root TARGET_SSH_PORT=22 TARGET_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi TARGET_CT_PROJECT=default TARGET_CT_NAME=pra-front TARGET_DEPLOY_DIR=/var/www/cleo APP_NAME=cleo SKIP_ENV=true else # Configuration DEV : local → IN3/dva-front HOST_SSH_HOST=195.154.80.116 HOST_SSH_USER=root HOST_SSH_PORT=22 HOST_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi CT_PROJECT_NAME=default CT_NAME=dva-front CT_IP=13.23.33.42 DEPLOY_DIR=/var/www APP_NAME=cleo SKIP_ENV=false fi # Propriétaire et groupe pour les fichiers et dossiers de destination OWNER=nobody GROUP=nginx # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Définir les options SSH SSH_OPTS="-p $HOST_SSH_PORT" if [ ! -z "$HOST_SSH_KEY" ]; then SSH_OPTS="$SSH_OPTS -i $HOST_SSH_KEY" fi # Afficher les paramètres echo -e "${GREEN}=== Déploiement optimisé CLEO ===${NC}" if [ "$DEPLOY_MODE" = "pra" ]; then echo "Mode: PRODUCTION (DEV → PROD)" echo "Source: $SOURCE_CT_NAME ($SOURCE_DEPLOY_DIR)" echo "Destination: $TARGET_CT_NAME ($TARGET_DEPLOY_DIR)" echo "Note: Le fichier .env ne sera PAS écrasé" else echo "Mode: DÉVELOPPEMENT (Local → DEV)" echo "Serveur hôte: $HOST_SSH_USER@$HOST_SSH_HOST:$HOST_SSH_PORT" echo "Conteneur: $CT_NAME" echo "Déploiement: $DEPLOY_DIR/$APP_NAME" fi echo "==================================" if [ "$DEPLOY_MODE" = "pra" ]; then # ===== MODE PROD: Déploiement IN3/dva-front → IN4/pra-front ===== echo -e "${YELLOW}1. Création de l'archive depuis IN3/dva-front...${NC}" # Définir les options SSH pour source et target SOURCE_SSH_OPTS="-p $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY" TARGET_SSH_OPTS="-p $TARGET_SSH_PORT -i $TARGET_SSH_KEY" # Définir les options SCP (port avec -P majuscule) SOURCE_SCP_OPTS="-P $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY" TARGET_SCP_OPTS="-P $TARGET_SSH_PORT -i $TARGET_SSH_KEY" # Script sur IN3 pour créer l'archive SOURCE_SCRIPT=" set -e incus project switch $SOURCE_CT_PROJECT echo 'Création de l archive depuis dva-front...' incus exec $SOURCE_CT_NAME -- sh -c ' cd $SOURCE_DEPLOY_DIR && \ tar -czf /tmp/cleo-prod.tar.gz \ --exclude=\".git\" \ --exclude=\"log/*.log\" \ --exclude=\"pub/files/upload/*\" \ --exclude=\"docs\" \ --exclude=\"migration\" \ --exclude=\".claude\" \ --exclude=\".vscode\" \ --exclude=\"vendor\" \ --exclude=\"backup_*\" \ --exclude=\"*.tar.gz\" \ --exclude=\".env\" \ --exclude=\".env.swp\" \ . ' incus file pull $SOURCE_CT_NAME/tmp/cleo-prod.tar.gz /tmp/ incus exec $SOURCE_CT_NAME -- rm -f /tmp/cleo-prod.tar.gz " ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "$SOURCE_SCRIPT" if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors de la création de l'archive${NC}" exit 1 fi echo -e "${GREEN}✓ Archive créée sur IN3${NC}" # Transférer l'archive de IN3 vers IN4 echo -e "${YELLOW}2. Transfert de l'archive IN3 → IN4...${NC}" scp $SOURCE_SCP_OPTS $SOURCE_SSH_USER@$SOURCE_HOST:/tmp/cleo-prod.tar.gz /tmp/ scp $TARGET_SCP_OPTS /tmp/cleo-prod.tar.gz $TARGET_SSH_USER@$TARGET_HOST:/tmp/ if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors du transfert de l'archive${NC}" rm -f /tmp/cleo-prod.tar.gz exit 1 fi echo -e "${GREEN}✓ Archive transférée vers IN4${NC}" # Déployer sur IN4/pra-front echo -e "${YELLOW}3. Déploiement dans IN4/pra-front...${NC}" TARGET_SCRIPT=" set -e incus project switch $TARGET_CT_PROJECT echo 'Transfert de l archive dans pra-front...' incus file push /tmp/cleo-prod.tar.gz $TARGET_CT_NAME/tmp/ echo 'Déploiement dans pra-front (backup .env)...' incus exec $TARGET_CT_NAME -- sh -c ' cp $TARGET_DEPLOY_DIR/.env /tmp/.env.backup && \ cd $TARGET_DEPLOY_DIR && \ tar -xzf /tmp/cleo-prod.tar.gz && \ mv /tmp/.env.backup $TARGET_DEPLOY_DIR/.env && \ rm -f /tmp/cleo-prod.tar.gz ' echo 'Configuration des permissions...' incus exec $TARGET_CT_NAME -- sh -c ' chown -R $OWNER:$GROUP $TARGET_DEPLOY_DIR && \ find $TARGET_DEPLOY_DIR -type d -exec chmod 755 {} \; && \ find $TARGET_DEPLOY_DIR -type f -exec chmod 644 {} \; && \ mkdir -p $TARGET_DEPLOY_DIR/log && \ chmod 775 $TARGET_DEPLOY_DIR/log && \ touch $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \ chmod 664 $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \ chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/log/*.log && \ chmod 640 $TARGET_DEPLOY_DIR/.env && \ if [ -d $TARGET_DEPLOY_DIR/pub/files/upload ]; then chmod 775 $TARGET_DEPLOY_DIR/pub/files/upload && \ chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/pub/files/upload fi ' rm -f /tmp/cleo-prod.tar.gz echo 'Déploiement PROD terminé!' " ssh $TARGET_SSH_OPTS $TARGET_SSH_USER@$TARGET_HOST "$TARGET_SCRIPT" if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors du déploiement PROD${NC}" rm -f /tmp/cleo-prod.tar.gz ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz" exit 1 fi # Nettoyer les archives locales et distantes echo -e "${YELLOW}4. Nettoyage...${NC}" rm -f /tmp/cleo-prod.tar.gz ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz" echo -e "${GREEN}✓ Nettoyage terminé${NC}" else # ===== MODE DEV: Déploiement local → IN3/dva-front ===== # 1. Créer l'archive tar.gz localement echo -e "${YELLOW}1. Création de l'archive...${NC}" tar -czf /tmp/cleo.tar.gz \ --exclude='.git' \ --exclude='log/*.log' \ --exclude='pub/files/upload/*' \ --exclude='docs' \ --exclude='migration' \ --exclude='.claude' \ --exclude='.vscode' \ --exclude='vendor' \ --exclude='backup_*' \ --exclude='*.tar.gz' \ --exclude='.env' \ --exclude='.env.swp' \ . if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors de la création de l'archive${NC}" exit 1 fi ARCHIVE_SIZE=$(du -h /tmp/cleo.tar.gz | cut -f1) echo -e "${GREEN}✓ Archive créée: /tmp/cleo.tar.gz ($ARCHIVE_SIZE)${NC}" # 2. Copier l'archive vers IN3 echo -e "${YELLOW}2. Transfert de l'archive vers IN3...${NC}" scp -P $HOST_SSH_PORT -i $HOST_SSH_KEY /tmp/cleo.tar.gz $HOST_SSH_USER@$HOST_SSH_HOST:/tmp/ if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors du transfert de l'archive${NC}" rm -f /tmp/cleo.tar.gz exit 1 fi echo -e "${GREEN}✓ Archive transférée sur IN3${NC}" # 3. Nettoyer l'ancien répertoire /tmp/cleo sur IN3 s'il existe echo -e "${YELLOW}3. Nettoyage des anciens fichiers temporaires sur IN3...${NC}" ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -rf /tmp/cleo 2>/dev/null || true" echo -e "${GREEN}✓ Nettoyage effectué${NC}" # 4. Transférer et extraire dans le conteneur echo -e "${YELLOW}4. Déploiement dans le conteneur $CT_NAME...${NC}" # Script à exécuter sur IN3 REMOTE_SCRIPT=" set -e # Sélectionner le projet Incus incus project switch $CT_PROJECT_NAME # Transférer l'archive dans le conteneur echo 'Transfert de l archive dans le conteneur...' incus file push /tmp/cleo.tar.gz $CT_NAME/tmp/ # Créer le répertoire de destination et extraire echo 'Extraction de l archive...' incus exec $CT_NAME -- sh -c ' mkdir -p $DEPLOY_DIR/$APP_NAME && \ cd $DEPLOY_DIR/$APP_NAME && \ tar -xzf /tmp/cleo.tar.gz && \ rm -f /tmp/cleo.tar.gz ' # Configurer les permissions echo 'Configuration des permissions...' incus exec $CT_NAME -- sh -c ' chown -R $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME && \ find $DEPLOY_DIR/$APP_NAME -type d -exec chmod 755 {} \; && \ find $DEPLOY_DIR/$APP_NAME -type f -exec chmod 644 {} \; && \ mkdir -p $DEPLOY_DIR/$APP_NAME/log && \ chmod 775 $DEPLOY_DIR/$APP_NAME/log && \ touch $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \ chmod 664 $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \ chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/log/*.log && \ chmod 640 $DEPLOY_DIR/$APP_NAME/.env && \ rm -f $DEPLOY_DIR/$APP_NAME/.env.swp && \ if [ -d $DEPLOY_DIR/$APP_NAME/pub/files/upload ]; then chmod 775 $DEPLOY_DIR/$APP_NAME/pub/files/upload && \ chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/pub/files/upload fi ' # Nettoyer l'archive sur IN3 rm -f /tmp/cleo.tar.gz echo 'Déploiement terminé avec succès!' " # Exécuter le script sur IN3 ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "$REMOTE_SCRIPT" if [ $? -ne 0 ]; then echo -e "${RED}Erreur lors du déploiement${NC}" # Nettoyer l'archive locale et distante rm -f /tmp/cleo.tar.gz ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -f /tmp/cleo.tar.gz 2>/dev/null || true" exit 1 fi # 5. Nettoyer l'archive locale echo -e "${YELLOW}5. Nettoyage local...${NC}" rm -f /tmp/cleo.tar.gz echo -e "${GREEN}✓ Archive locale supprimée${NC}" fi echo "" echo -e "${GREEN}===================================================${NC}" echo -e "${GREEN} Déploiement terminé avec succès ! ${NC}" echo -e "${GREEN}===================================================${NC}" if [ "$DEPLOY_MODE" = "pra" ]; then echo "Site: https://cleo.unikoffice.com" echo "Environnement: PRODUCTION (pra-front)" else echo "Site: http://dcleo.unikoffice.com" echo "Environnement: DÉVELOPPEMENT (dva-front)" echo "Chemin: $DEPLOY_DIR/$APP_NAME sur $CT_NAME" fi echo ""