#!/bin/bash # Script de déploiement de Geosector Web cd /home/pierre/dev/geosector/web # Vérifier si .env.deploy existe ENV_FILE=".env-deploy-geosector-dev" if [ ! -f "$ENV_FILE" ]; then echo "Erreur: Fichier $ENV_FILE introuvable!" echo "Veuillez créer ce fichier avec vos informations de connexion." exit 1 fi # Charger les variables depuis .env.deploy echo "Chargement des paramètres de déploiement..." source "$ENV_FILE" # Vérifier que les variables nécessaires sont définies if [ -z "$HOST_SSH_HOST" ] || [ -z "$HOST_SSH_USER" ] || [ -z "$CT_NAME" ] || [ -z "$CT_PROJECT_NAME" ]; then echo "Erreur: Variables HOST_SSH_HOST, HOST_SSH_USER, CT_NAME et CT_PROJECT_NAME requises dans $ENV_FILE" exit 1 fi # Variables pour les alertes (optionnelles) ALERT_EMAIL=${ALERT_EMAIL:-""} DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL:-""} # Utiliser les valeurs par défaut si non définies HOST_SSH_PORT=${HOST_SSH_PORT:-22} SERVER_PORT=${SERVER_PORT:-3000} ADMIN_PORT=${ADMIN_PORT:-3001} DOMAIN_NAME=${DOMAIN_NAME:-$CT_IP} DEPLOY_DIR=${DEPLOY_DIR:-/var/www} APP_NAME=${APP_NAME:-d6soft} SUB_DIR=${SUB_DIR:-web} # Afficher les paramètres echo "=== Paramètres de déploiement ===" echo "Serveur hôte: $HOST_SSH_USER@$HOST_SSH_HOST:$HOST_SSH_PORT" echo "Projet Incus: $CT_PROJECT_NAME" echo "Conteneur: $CT_NAME" echo "Domaine: $DOMAIN_NAME" echo "Répertoire de déploiement: $DEPLOY_DIR/$APP_NAME/$SUB_DIR" echo "Déploiement du module d'administration: $([ "$DEPLOY_ADMIN" = true ] && echo "Oui" || echo "Non")" echo "Installation des dépendances: $([ "$INSTALL_DEPENDENCIES" = true ] && echo "Oui" || echo "Non")" echo "==================================" # Variables du projet BUILD_DIR="dist" SERVER_DIR="server" LOCAL_DEPLOY_DIR="deploy" DEPLOY_PACKAGE="$APP_NAME-deploy.tar.gz" # 0. Nettoyer et réinstaller les dépendances si nécessaire if [ ! -d "node_modules" ] || [ ! -f "package-lock.json" ]; then echo "=== Installation des dépendances ===" npm install fi # 1. Build du frontend principal echo "=== Construction du frontend principal ===" npm run build # Vérifier si le build a réussi BUILD_EXIT_CODE=$? if [ $BUILD_EXIT_CODE -ne 0 ] || [ ! -d "$BUILD_DIR" ]; then echo "==============================================" echo "ERREUR CRITIQUE: Le build a échoué avec le code $BUILD_EXIT_CODE" echo "==============================================" # Envoyer des alertes si configurées if [ ! -z "$ALERT_EMAIL" ]; then echo "Envoi d'une alerte par email à $ALERT_EMAIL..." echo "Erreur de build pour $APP_NAME sur $HOST_SSH_HOST" | mail -s "[ALERTE] Échec de déploiement $APP_NAME" $ALERT_EMAIL fi if [ ! -z "$DISCORD_WEBHOOK_URL" ]; then echo "Envoi d'une alerte Discord..." curl -H "Content-Type: application/json" \ -d '{"content":"⚠️ **ALERTE: Échec de déploiement** ⚠️\nLe build de **'"$APP_NAME"'** a échoué avec le code '$BUILD_EXIT_CODE'.\nServeur: '"$HOST_SSH_HOST"'\nDate: '"$(date)"'"}' \ $DISCORD_WEBHOOK_URL fi echo "Le déploiement a été interrompu en raison d'erreurs dans le build." exit 1 fi # 3. Préparation du package de déploiement echo "=== Préparation du package de déploiement ===" # Nettoyer et préparer les dossiers de déploiement rm -rf $LOCAL_DEPLOY_DIR mkdir -p $LOCAL_DEPLOY_DIR # Copier les fichiers frontend (build Svelte) cp -r $BUILD_DIR/* $LOCAL_DEPLOY_DIR/ # Préparer le dossier serveur principal si nécessaire if [ -d "$SERVER_DIR" ]; then echo "Préparation du serveur principal..." mkdir -p $LOCAL_DEPLOY_DIR/server cp -r $SERVER_DIR/package.json $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo "Warning: package.json du serveur principal non trouvé" cp -r $SERVER_DIR/server.js $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo "Warning: server.js du serveur principal non trouvé" cp -r $SERVER_DIR/.env $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo "Warning: .env du serveur principal non trouvé" mkdir -p $LOCAL_DEPLOY_DIR/server/logs fi # Créer un fichier tar.gz pour l'envoi echo "Création du package de déploiement..." COPYFILE_DISABLE=1 tar --exclude=".*" -czf $DEPLOY_PACKAGE $LOCAL_DEPLOY_DIR # Vérifier que le package a bien été créé if [ ! -f "$DEPLOY_PACKAGE" ]; then echo "ERREUR: Le fichier $DEPLOY_PACKAGE n'a pas été créé." exit 1 fi echo "Taille du package: $(du -h $DEPLOY_PACKAGE | cut -f1)" # Définir les options SSH SSH_OPTS="-p $HOST_SSH_PORT" SCP_OPTS="-P $HOST_SSH_PORT" if [ ! -z "$HOST_SSH_KEY" ]; then SSH_OPTS="$SSH_OPTS -i \"$HOST_SSH_KEY\"" SCP_OPTS="$SCP_OPTS -i \"$HOST_SSH_KEY\"" fi # 4. Copier le package sur le serveur hôte echo "=== Copie des fichiers vers le serveur hôte ===" eval "scp $SCP_OPTS $DEPLOY_PACKAGE $HOST_SSH_USER@$HOST_SSH_HOST:~/" # 5. Exécuter les commandes sur l'hôte et le conteneur echo "=== Déploiement sur le conteneur $CT_NAME ===" # Vérifier que le fichier est bien arrivé eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"if [ ! -f '$DEPLOY_PACKAGE' ]; then echo 'ERREUR: Fichier non transféré'; exit 1; fi\"" # Déplacer le fichier vers /tmp echo "Déplacement du package vers /tmp..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"cp $DEPLOY_PACKAGE /tmp/\"" # Sélectionner le projet Incus echo "Sélection du projet Incus $CT_PROJECT_NAME..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus project switch $CT_PROJECT_NAME\"" # Transférer le package vers le conteneur echo "Transfert du package vers le conteneur..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus file push /tmp/$DEPLOY_PACKAGE $CT_NAME/$DEPLOY_DIR/\"" # Créer le répertoire de déploiement dans le conteneur echo "Création du répertoire de déploiement dans le conteneur..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- mkdir -p $DEPLOY_DIR/$APP_NAME/$SUB_DIR\"" # Extraire le package echo "Extraction du package..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- tar -xzf $DEPLOY_DIR/$DEPLOY_PACKAGE -C $DEPLOY_DIR/$APP_NAME/$SUB_DIR --strip-components=1\"" # Installer les dépendances du serveur principal (si présent) echo "Installation des dépendances du serveur principal (si présent)..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- sh -c 'if [ -d $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server ] && [ -f $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server/package.json ]; then cd $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server && npm install --production; else echo \"Dossier serveur ou package.json non trouvé, cette étape est ignorée\"; fi'\"" # Nettoyer les fichiers macOS echo "Nettoyage des fichiers macOS..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- sh -c 'find $DEPLOY_DIR/$APP_NAME/$SUB_DIR -name \"._*\" -type f -delete 2>/dev/null || true'\"" # Configurer les permissions echo "Configuration des permissions..." # Vérifier si l'utilisateur et le groupe www-data existent, sinon les créer eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- sh -c 'getent group www-data > /dev/null || addgroup -S www-data; getent passwd www-data > /dev/null || adduser -S -D -H -h /var/www -s /sbin/nologin -G www-data -g www-data www-data'\"" # Appliquer les permissions sur tous les fichiers eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- sh -c 'chown -R www-data:www-data $DEPLOY_DIR/$APP_NAME/$SUB_DIR && \ find $DEPLOY_DIR/$APP_NAME/$SUB_DIR -type d -exec chmod 755 {} \\; && \ find $DEPLOY_DIR/$APP_NAME/$SUB_DIR -type f -exec chmod 644 {} \\; && \ if [ -f $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server/server.js ]; then chmod +x $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server/server.js; fi && \ if [ -f $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/backend/server.js ]; then chmod +x $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/backend/server.js; fi && \ if [ -d $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server/logs ]; then chmod 775 $DEPLOY_DIR/$APP_NAME/$SUB_DIR/server/logs; fi && \ if [ -d $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/backend/logs ]; then chmod 775 $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/backend/logs; fi && \ if [ -d $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/db ]; then chmod 775 $DEPLOY_DIR/$APP_NAME/$SUB_DIR/mda/db; fi'\"" # Nettoyer les fichiers temporaires echo "Nettoyage des fichiers temporaires..." eval "ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST \"sudo incus exec $CT_NAME -- rm -f $DEPLOY_DIR/$DEPLOY_PACKAGE && rm -f /tmp/$DEPLOY_PACKAGE && rm -f $DEPLOY_PACKAGE\"" echo "===================================================" echo "Déploiement terminé avec succès !" echo "===================================================" echo "Votre site $APP_NAME est maintenant déployé dans le conteneur $CT_NAME." echo "Chemin de déploiement: $DEPLOY_DIR/$APP_NAME/$SUB_DIR" # Afficher le statut du déploiement if [ -d "$SERVER_DIR" ]; then echo "✅ Le service du site principal a été configuré et démarré." else echo "ℹ️ Aucun service principal n'a été configuré (le site est statique)." fi echo "" echo "Pour configurer nginx sur le serveur, connectez-vous et exécutez :" echo "ssh $HOST_SSH_USER@$HOST_SSH_HOST" echo "sudo incus exec $CT_NAME bash" echo "echo "rc-service nginx restart" echo "==================================================="