197 lines
8.9 KiB
Bash
Executable File
197 lines
8.9 KiB
Bash
Executable File
#!/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 "===================================================" |