feat: Début des évolutions interfaces mobiles v3.2.4
- Préparation de la nouvelle branche pour les évolutions - Mise à jour de la version vers 3.2.4 - Intégration des modifications en cours 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,203 +1,378 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de déploiement de Geosector Web
|
||||
# Script de déploiement unifié pour GEOSECTOR Web (Svelte)
|
||||
# Version: 4.0 (Janvier 2025)
|
||||
# Auteur: Pierre (avec l'aide de Claude)
|
||||
#
|
||||
# Usage:
|
||||
# ./deploy-web.sh # Déploiement local DEV (build → container geo)
|
||||
# ./deploy-web.sh rca # Livraison RECETTE (container geo → rca-geo)
|
||||
# ./deploy-web.sh pra # Livraison PRODUCTION (rca-geo → pra-geo)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
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
|
||||
# =====================================
|
||||
# Configuration générale
|
||||
# =====================================
|
||||
|
||||
# Paramètre optionnel pour l'environnement cible
|
||||
TARGET_ENV=${1:-dev}
|
||||
|
||||
# Configuration SSH
|
||||
HOST_KEY="/home/pierre/.ssh/id_rsa_mbpi"
|
||||
HOST_PORT="22"
|
||||
HOST_USER="root"
|
||||
|
||||
# Configuration des serveurs
|
||||
RCA_HOST="195.154.80.116" # Serveur de recette
|
||||
PRA_HOST="51.159.7.190" # Serveur de production
|
||||
|
||||
# Configuration Incus
|
||||
INCUS_PROJECT="default"
|
||||
WEB_PATH="/var/www/geosector/web"
|
||||
FINAL_OWNER="nginx"
|
||||
FINAL_GROUP="nginx"
|
||||
|
||||
# Configuration de sauvegarde
|
||||
BACKUP_DIR="/data/backup/geosector"
|
||||
|
||||
# Couleurs pour les messages
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# =====================================
|
||||
# Fonctions utilitaires
|
||||
# =====================================
|
||||
|
||||
echo_step() {
|
||||
echo -e "${GREEN}==>${NC} $1"
|
||||
}
|
||||
|
||||
echo_info() {
|
||||
echo -e "${BLUE}Info:${NC} $1"
|
||||
}
|
||||
|
||||
echo_warning() {
|
||||
echo -e "${YELLOW}Warning:${NC} $1"
|
||||
}
|
||||
|
||||
echo_error() {
|
||||
echo -e "${RED}Error:${NC} $1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Fonction pour créer une sauvegarde locale
|
||||
create_local_backup() {
|
||||
local archive_file=$1
|
||||
local backup_type=$2
|
||||
|
||||
echo_info "Creating backup in ${BACKUP_DIR}..."
|
||||
|
||||
if [ ! -d "${BACKUP_DIR}" ]; then
|
||||
mkdir -p "${BACKUP_DIR}" || echo_warning "Could not create backup directory ${BACKUP_DIR}"
|
||||
fi
|
||||
|
||||
if [ -d "${BACKUP_DIR}" ]; then
|
||||
BACKUP_FILE="${BACKUP_DIR}/web-${backup_type}-$(date +%Y%m%d-%H%M%S).tar.gz"
|
||||
cp "${archive_file}" "${BACKUP_FILE}" && {
|
||||
echo_info "Backup saved to: ${BACKUP_FILE}"
|
||||
echo_info "Backup size: $(du -h "${BACKUP_FILE}" | cut -f1)"
|
||||
|
||||
# Nettoyer les anciens backups (garder les 10 derniers)
|
||||
echo_info "Cleaning old backups (keeping last 10)..."
|
||||
ls -t "${BACKUP_DIR}"/web-${backup_type}-*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f && {
|
||||
REMAINING_BACKUPS=$(ls "${BACKUP_DIR}"/web-${backup_type}-*.tar.gz 2>/dev/null | wc -l)
|
||||
echo_info "Kept ${REMAINING_BACKUPS} backup(s)"
|
||||
}
|
||||
} || echo_warning "Failed to create backup in ${BACKUP_DIR}"
|
||||
fi
|
||||
}
|
||||
|
||||
# =====================================
|
||||
# Détermination de la configuration selon l'environnement
|
||||
# =====================================
|
||||
|
||||
case $TARGET_ENV in
|
||||
"dev")
|
||||
echo_step "Configuring for LOCAL DEV deployment"
|
||||
SOURCE_TYPE="local_build"
|
||||
DEST_CONTAINER="geo"
|
||||
DEST_HOST="local"
|
||||
ENV_NAME="DEVELOPMENT"
|
||||
;;
|
||||
"rca")
|
||||
echo_step "Configuring for RECETTE delivery"
|
||||
SOURCE_TYPE="local_container"
|
||||
SOURCE_CONTAINER="geo"
|
||||
DEST_CONTAINER="rca-geo"
|
||||
DEST_HOST="${RCA_HOST}"
|
||||
ENV_NAME="RECETTE"
|
||||
;;
|
||||
"pra")
|
||||
echo_step "Configuring for PRODUCTION delivery"
|
||||
SOURCE_TYPE="remote_container"
|
||||
SOURCE_HOST="${RCA_HOST}"
|
||||
SOURCE_CONTAINER="rca-geo"
|
||||
DEST_CONTAINER="pra-geo"
|
||||
DEST_HOST="${PRA_HOST}"
|
||||
ENV_NAME="PRODUCTION"
|
||||
;;
|
||||
*)
|
||||
echo_error "Unknown environment: $TARGET_ENV. Use 'dev', 'rca' or 'pra'"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo_info "Deployment flow: ${ENV_NAME}"
|
||||
|
||||
# =====================================
|
||||
# Création de l'archive selon la source
|
||||
# =====================================
|
||||
|
||||
TIMESTAMP=$(date +%s)
|
||||
ARCHIVE_NAME="web-deploy-${TIMESTAMP}.tar.gz"
|
||||
TEMP_ARCHIVE="/tmp/${ARCHIVE_NAME}"
|
||||
|
||||
if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
# DEV: Build Svelte et créer une archive
|
||||
echo_step "Building Svelte app for DEV..."
|
||||
|
||||
# Variables du projet
|
||||
BUILD_DIR="dist"
|
||||
SERVER_DIR="server"
|
||||
LOCAL_DEPLOY_DIR="deploy"
|
||||
|
||||
# Installer les dépendances si nécessaire
|
||||
if [ ! -d "node_modules" ] || [ ! -f "package-lock.json" ]; then
|
||||
echo_info "Installing dependencies..."
|
||||
npm install || echo_error "npm install failed"
|
||||
fi
|
||||
|
||||
# Build du frontend principal
|
||||
echo_info "Building frontend..."
|
||||
npm run build || echo_error "Build failed"
|
||||
|
||||
# Vérifier que le build a réussi
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo_error "Build directory not found"
|
||||
fi
|
||||
|
||||
# Préparer le package de déploiement
|
||||
echo_info "Preparing deployment package..."
|
||||
rm -rf $LOCAL_DEPLOY_DIR
|
||||
mkdir -p $LOCAL_DEPLOY_DIR
|
||||
|
||||
# Copier les fichiers frontend
|
||||
cp -r $BUILD_DIR/* $LOCAL_DEPLOY_DIR/
|
||||
|
||||
# Préparer le dossier serveur si nécessaire
|
||||
if [ -d "$SERVER_DIR" ]; then
|
||||
echo_info "Preparing server files..."
|
||||
mkdir -p $LOCAL_DEPLOY_DIR/server
|
||||
cp -r $SERVER_DIR/package.json $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo_warning "package.json not found"
|
||||
cp -r $SERVER_DIR/server.js $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo_warning "server.js not found"
|
||||
cp -r $SERVER_DIR/.env $LOCAL_DEPLOY_DIR/server/ 2>/dev/null || echo_warning ".env not found"
|
||||
mkdir -p $LOCAL_DEPLOY_DIR/server/logs
|
||||
fi
|
||||
|
||||
# Créer l'archive
|
||||
echo_info "Creating archive..."
|
||||
COPYFILE_DISABLE=1 tar --exclude=".*" -czf "${TEMP_ARCHIVE}" -C $LOCAL_DEPLOY_DIR . || echo_error "Failed to create archive"
|
||||
|
||||
create_local_backup "${TEMP_ARCHIVE}" "dev"
|
||||
|
||||
# Nettoyer
|
||||
rm -rf $LOCAL_DEPLOY_DIR
|
||||
|
||||
elif [ "$SOURCE_TYPE" = "local_container" ]; then
|
||||
# RCA: Créer une archive depuis le container local
|
||||
echo_step "Creating archive from local container ${SOURCE_CONTAINER}..."
|
||||
|
||||
echo_info "Switching to Incus project ${INCUS_PROJECT}..."
|
||||
incus project switch ${INCUS_PROJECT} || echo_error "Failed to switch project"
|
||||
|
||||
# Créer l'archive directement depuis le container local
|
||||
incus exec ${SOURCE_CONTAINER} -- tar -czf /tmp/${ARCHIVE_NAME} -C ${WEB_PATH} . || echo_error "Failed to create archive from container"
|
||||
|
||||
# Récupérer l'archive depuis le container
|
||||
incus file pull ${SOURCE_CONTAINER}/tmp/${ARCHIVE_NAME} ${TEMP_ARCHIVE} || echo_error "Failed to pull archive from container"
|
||||
incus exec ${SOURCE_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME}
|
||||
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-rca"
|
||||
|
||||
elif [ "$SOURCE_TYPE" = "remote_container" ]; then
|
||||
# PRA: Créer une archive depuis un container distant
|
||||
echo_step "Creating archive from remote container ${SOURCE_CONTAINER} on ${SOURCE_HOST}..."
|
||||
|
||||
# Créer l'archive sur le serveur source
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus exec ${SOURCE_CONTAINER} -- tar -czf /tmp/${ARCHIVE_NAME} -C ${WEB_PATH} .
|
||||
" || echo_error "Failed to create archive on remote"
|
||||
|
||||
# Extraire l'archive du container vers l'hôte
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "
|
||||
incus file pull ${SOURCE_CONTAINER}/tmp/${ARCHIVE_NAME} /tmp/${ARCHIVE_NAME} &&
|
||||
incus exec ${SOURCE_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Failed to extract archive from remote container"
|
||||
|
||||
# Copier l'archive vers la machine locale pour backup
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST}:/tmp/${ARCHIVE_NAME} ${TEMP_ARCHIVE} || echo_error "Failed to copy archive locally"
|
||||
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-pra"
|
||||
fi
|
||||
|
||||
# Charger les variables depuis .env.deploy
|
||||
echo "Chargement des paramètres de déploiement..."
|
||||
source "$ENV_FILE"
|
||||
ARCHIVE_SIZE=$(du -h "${TEMP_ARCHIVE}" | cut -f1)
|
||||
echo_info "Archive size: ${ARCHIVE_SIZE}"
|
||||
|
||||
# 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
|
||||
# =====================================
|
||||
# Déploiement selon la destination
|
||||
# =====================================
|
||||
|
||||
# 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é."
|
||||
if [ "$DEST_HOST" = "local" ]; then
|
||||
# Déploiement sur container local (DEV)
|
||||
echo_step "Deploying to local container ${DEST_CONTAINER}..."
|
||||
|
||||
echo_info "Switching to Incus project ${INCUS_PROJECT}..."
|
||||
incus project switch ${INCUS_PROJECT} || echo_error "Failed to switch to project ${INCUS_PROJECT}"
|
||||
|
||||
echo_info "Pushing archive to container..."
|
||||
incus file push "${TEMP_ARCHIVE}" ${DEST_CONTAINER}/tmp/${ARCHIVE_NAME} || echo_error "Failed to push archive to container"
|
||||
|
||||
echo_info "Preparing deployment directory..."
|
||||
incus exec ${DEST_CONTAINER} -- mkdir -p ${WEB_PATH} || echo_error "Failed to create deployment directory"
|
||||
incus exec ${DEST_CONTAINER} -- rm -rf ${WEB_PATH}/* || echo_warning "Could not clean deployment directory"
|
||||
|
||||
echo_info "Extracting archive..."
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${WEB_PATH}/ || echo_error "Failed to extract archive"
|
||||
|
||||
echo_info "Setting permissions..."
|
||||
incus exec ${DEST_CONTAINER} -- chown -R ${FINAL_OWNER}:${FINAL_GROUP} ${WEB_PATH}
|
||||
incus exec ${DEST_CONTAINER} -- find ${WEB_PATH} -type d -exec chmod 755 {} \;
|
||||
incus exec ${DEST_CONTAINER} -- find ${WEB_PATH} -type f -exec chmod 644 {} \;
|
||||
|
||||
# Permissions spéciales pour les dossiers server
|
||||
incus exec ${DEST_CONTAINER} -- sh -c "
|
||||
if [ -f ${WEB_PATH}/server/server.js ]; then
|
||||
chmod +x ${WEB_PATH}/server/server.js
|
||||
fi
|
||||
if [ -d ${WEB_PATH}/server/logs ]; then
|
||||
chmod 775 ${WEB_PATH}/server/logs
|
||||
fi
|
||||
" || true
|
||||
|
||||
# Installer les dépendances du serveur si présent
|
||||
echo_info "Installing server dependencies if needed..."
|
||||
incus exec ${DEST_CONTAINER} -- sh -c "
|
||||
if [ -d ${WEB_PATH}/server ] && [ -f ${WEB_PATH}/server/package.json ]; then
|
||||
cd ${WEB_PATH}/server && npm install --production
|
||||
fi
|
||||
" || echo_warning "Server dependencies installation skipped"
|
||||
|
||||
echo_info "Cleaning up..."
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME}
|
||||
|
||||
else
|
||||
echo "ℹ️ Aucun service principal n'a été configuré (le site est statique)."
|
||||
# Déploiement sur container distant (RCA ou PRA)
|
||||
echo_step "Deploying to remote container ${DEST_CONTAINER} on ${DEST_HOST}..."
|
||||
|
||||
# Créer une sauvegarde sur le serveur de destination
|
||||
BACKUP_TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
REMOTE_BACKUP_DIR="${WEB_PATH}_backup_${BACKUP_TIMESTAMP}"
|
||||
|
||||
echo_info "Creating backup on destination..."
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${DEST_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus exec ${DEST_CONTAINER} -- test -d ${WEB_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${WEB_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
|
||||
# Transférer l'archive vers le serveur de destination
|
||||
echo_info "Transferring archive to ${DEST_HOST}..."
|
||||
|
||||
if [ "$SOURCE_TYPE" = "local_container" ]; then
|
||||
# Pour RCA: copier depuis local vers distant
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} ${TEMP_ARCHIVE} ${HOST_USER}@${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to copy archive to destination"
|
||||
else
|
||||
# Pour PRA: copier de serveur à serveur
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} /tmp/${ARCHIVE_NAME} ${HOST_USER}@${DEST_HOST}:/tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Failed to transfer archive between servers"
|
||||
|
||||
# Nettoyer sur le serveur source
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "rm -f /tmp/${ARCHIVE_NAME}"
|
||||
fi
|
||||
|
||||
# Déployer sur le container de destination
|
||||
echo_info "Extracting on destination container..."
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${DEST_HOST} "
|
||||
set -euo pipefail
|
||||
|
||||
# Pousser l'archive dans le container
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus file push /tmp/${ARCHIVE_NAME} ${DEST_CONTAINER}/tmp/${ARCHIVE_NAME} &&
|
||||
|
||||
# Nettoyer et recréer le dossier
|
||||
incus exec ${DEST_CONTAINER} -- rm -rf ${WEB_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- mkdir -p ${WEB_PATH} &&
|
||||
|
||||
# Extraire l'archive
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${WEB_PATH}/ &&
|
||||
|
||||
# Permissions
|
||||
incus exec ${DEST_CONTAINER} -- chown -R ${FINAL_OWNER}:${FINAL_GROUP} ${WEB_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${WEB_PATH} -type d -exec chmod 755 {} \; &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${WEB_PATH} -type f -exec chmod 644 {} \; &&
|
||||
|
||||
# Permissions spéciales pour server
|
||||
incus exec ${DEST_CONTAINER} -- sh -c '
|
||||
if [ -f ${WEB_PATH}/server/server.js ]; then
|
||||
chmod +x ${WEB_PATH}/server/server.js
|
||||
fi
|
||||
if [ -d ${WEB_PATH}/server/logs ]; then
|
||||
chmod 775 ${WEB_PATH}/server/logs
|
||||
fi
|
||||
' || true &&
|
||||
|
||||
# Installer les dépendances du serveur si présent
|
||||
incus exec ${DEST_CONTAINER} -- sh -c '
|
||||
if [ -d ${WEB_PATH}/server ] && [ -f ${WEB_PATH}/server/package.json ]; then
|
||||
cd ${WEB_PATH}/server && npm install --production
|
||||
fi
|
||||
' || echo 'Server dependencies skipped' &&
|
||||
|
||||
# Nettoyage
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME} &&
|
||||
rm -f /tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Deployment failed on destination"
|
||||
|
||||
echo_info "Remote backup saved: ${REMOTE_BACKUP_DIR} on ${DEST_CONTAINER}"
|
||||
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 "==================================================="
|
||||
# Nettoyage local
|
||||
rm -f "${TEMP_ARCHIVE}"
|
||||
|
||||
# =====================================
|
||||
# Résumé final
|
||||
# =====================================
|
||||
|
||||
echo_step "Deployment completed successfully!"
|
||||
echo_info "Environment: ${ENV_NAME}"
|
||||
|
||||
if [ "$TARGET_ENV" = "dev" ]; then
|
||||
echo_info "Built and deployed Svelte web app to container ${DEST_CONTAINER}"
|
||||
elif [ "$TARGET_ENV" = "rca" ]; then
|
||||
echo_info "Delivered from ${SOURCE_CONTAINER} (local) to ${DEST_CONTAINER} on ${DEST_HOST}"
|
||||
elif [ "$TARGET_ENV" = "pra" ]; then
|
||||
echo_info "Delivered from ${SOURCE_CONTAINER} on ${SOURCE_HOST} to ${DEST_CONTAINER} on ${DEST_HOST}"
|
||||
fi
|
||||
|
||||
echo_info "Deployment completed at: $(date)"
|
||||
|
||||
# Journaliser le déploiement
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - Web app deployed to ${ENV_NAME} (${DEST_CONTAINER})" >> ~/.geo_deploy_history
|
||||
Reference in New Issue
Block a user