Files
geo/web/deploy-web.sh

197 lines
8.9 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Script de déploiement de Geosector Web
cd /Users/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"
# 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 "==================================================="