feat: Version 3.3.4 - Nouvelle architecture pages, optimisations widgets Flutter et API
- Mise à jour VERSION vers 3.3.4 - Optimisations et révisions architecture API (deploy-api.sh, scripts de migration) - Ajout documentation Stripe Tap to Pay complète - Migration vers polices Inter Variable pour Flutter - Optimisations build Android et nettoyage fichiers temporaires - Amélioration système de déploiement avec gestion backups - Ajout scripts CRON et migrations base de données 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,10 @@
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Timestamp de début pour mesurer le temps total
|
||||
START_TIME=$(($(date +%s%N)/1000000))
|
||||
echo "[$(date '+%H:%M:%S.%3N')] Début du script deploy-app.sh"
|
||||
|
||||
cd /home/pierre/dev/geosector/app
|
||||
|
||||
# =====================================
|
||||
@@ -20,13 +24,19 @@ cd /home/pierre/dev/geosector/app
|
||||
# Paramètre optionnel pour l'environnement cible
|
||||
TARGET_ENV=${1:-dev}
|
||||
|
||||
# Configuration Ramdisk pour build Flutter optimisé
|
||||
RAMDISK_BASE="/mnt/ramdisk"
|
||||
USE_RAMDISK=false
|
||||
RAMDISK_PROJECT="${RAMDISK_BASE}/flutter-build/geosector"
|
||||
|
||||
# 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
|
||||
IN3_HOST="IN3" # Serveur IN3 (via .ssh/config)
|
||||
RCA_HOST="195.154.80.116" # Serveur de recette (même que IN3)
|
||||
PRA_HOST="51.159.7.190" # Serveur de production
|
||||
|
||||
# Configuration Incus
|
||||
@@ -99,18 +109,19 @@ create_local_backup() {
|
||||
|
||||
case $TARGET_ENV in
|
||||
"dev")
|
||||
echo_step "Configuring for LOCAL DEV deployment"
|
||||
echo_step "Configuring for DEV deployment to IN3"
|
||||
SOURCE_TYPE="local_build"
|
||||
DEST_CONTAINER="geo"
|
||||
DEST_HOST="local"
|
||||
DEST_CONTAINER="dva-geo"
|
||||
DEST_HOST="${IN3_HOST}"
|
||||
ENV_NAME="DEVELOPMENT"
|
||||
;;
|
||||
"rca")
|
||||
echo_step "Configuring for RECETTE delivery"
|
||||
SOURCE_TYPE="local_container"
|
||||
SOURCE_CONTAINER="geo"
|
||||
echo_step "Configuring for RECETTE delivery (IN3 dva-geo to rca-geo)"
|
||||
SOURCE_TYPE="remote_container"
|
||||
SOURCE_HOST="${IN3_HOST}"
|
||||
SOURCE_CONTAINER="dva-geo"
|
||||
DEST_CONTAINER="rca-geo"
|
||||
DEST_HOST="${RCA_HOST}"
|
||||
DEST_HOST="${IN3_HOST}" # Même serveur IN3
|
||||
ENV_NAME="RECETTE"
|
||||
;;
|
||||
"pra")
|
||||
@@ -140,7 +151,24 @@ TEMP_ARCHIVE="/tmp/${ARCHIVE_NAME}"
|
||||
if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
# DEV: Build Flutter et créer une archive
|
||||
echo_step "Building Flutter app for DEV..."
|
||||
|
||||
|
||||
# Vérifier la disponibilité du ramdisk
|
||||
if [ -d "${RAMDISK_BASE}" ] && [ -w "${RAMDISK_BASE}" ]; then
|
||||
echo_info "✓ Ramdisk disponible ($(df -h ${RAMDISK_BASE} | awk 'NR==2 {print $4}') libre)"
|
||||
USE_RAMDISK=true
|
||||
|
||||
# Configurer les caches Flutter dans le ramdisk
|
||||
export PUB_CACHE="${RAMDISK_BASE}/.pub-cache"
|
||||
export GRADLE_USER_HOME="${RAMDISK_BASE}/.gradle"
|
||||
mkdir -p "$PUB_CACHE" "$GRADLE_USER_HOME" "${RAMDISK_BASE}/flutter-build"
|
||||
|
||||
echo_info "🚀 Compilation optimisée avec ramdisk activée"
|
||||
echo_info " Cache Pub: $PUB_CACHE"
|
||||
echo_info " Cache Gradle: $GRADLE_USER_HOME"
|
||||
else
|
||||
echo_warning "Ramdisk non disponible, compilation standard"
|
||||
fi
|
||||
|
||||
# Charger les variables d'environnement
|
||||
if [ ! -f .env-deploy-dev ]; then
|
||||
echo_error "Missing .env-deploy-dev file"
|
||||
@@ -170,6 +198,31 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
|
||||
sed -i "s/^version: .*/version: $FULL_VERSION/" pubspec.yaml || echo_error "Failed to update pubspec.yaml"
|
||||
|
||||
# Préparation du ramdisk si disponible
|
||||
if [ "$USE_RAMDISK" = true ]; then
|
||||
echo_info "📋 Copie du projet dans le ramdisk..."
|
||||
|
||||
# Nettoyer l'ancien build dans le ramdisk si existant
|
||||
[ -d "$RAMDISK_PROJECT" ] && rm -rf "$RAMDISK_PROJECT"
|
||||
|
||||
# Copier le projet dans le ramdisk (sans les artefacts de build)
|
||||
rsync -a --info=progress2 \
|
||||
--exclude='build/' \
|
||||
--exclude='.dart_tool/' \
|
||||
--exclude='.pub-cache/' \
|
||||
--exclude='*.apk' \
|
||||
--exclude='*.aab' \
|
||||
"$(pwd)/" "$RAMDISK_PROJECT/"
|
||||
|
||||
# Se déplacer dans le projet ramdisk
|
||||
cd "$RAMDISK_PROJECT"
|
||||
echo_info "📍 Compilation depuis: $RAMDISK_PROJECT"
|
||||
fi
|
||||
|
||||
# Mode de compilation en RELEASE (production)
|
||||
echo_info "🏁 Mode RELEASE - Compilation optimisée pour production"
|
||||
BUILD_FLAGS="--release"
|
||||
|
||||
# Nettoyage
|
||||
echo_info "Cleaning previous builds..."
|
||||
rm -rf .dart_tool build .packages pubspec.lock 2>/dev/null || true
|
||||
@@ -186,14 +239,45 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
dart run build_runner build --delete-conflicting-outputs || echo_error "Code generation failed"
|
||||
|
||||
echo_info "Building Flutter web application..."
|
||||
flutter build web --release || echo_error "Flutter build failed"
|
||||
|
||||
# Mesure du temps de compilation Flutter
|
||||
BUILD_START=$(($(date +%s%N)/1000000))
|
||||
echo_info "[$(date '+%H:%M:%S.%3N')] Début de la compilation Flutter (Mode: RELEASE)"
|
||||
|
||||
flutter build web $BUILD_FLAGS || echo_error "Flutter build failed"
|
||||
|
||||
BUILD_END=$(($(date +%s%N)/1000000))
|
||||
BUILD_TIME=$((BUILD_END - BUILD_START))
|
||||
echo_info "[$(date '+%H:%M:%S.%3N')] Fin de la compilation Flutter"
|
||||
echo_info "⏱️ Temps de compilation Flutter: ${BUILD_TIME} ms ($((BUILD_TIME/1000)) secondes)"
|
||||
|
||||
# Si on utilise le ramdisk, copier les artefacts vers le projet original
|
||||
if [ "$USE_RAMDISK" = true ]; then
|
||||
ORIGINAL_PROJECT="/home/pierre/dev/geosector/app"
|
||||
|
||||
echo_info "📦 Copie des artefacts de build vers le projet original..."
|
||||
rsync -a "$RAMDISK_PROJECT/build/" "$ORIGINAL_PROJECT/build/"
|
||||
|
||||
# Retourner au répertoire original pour les scripts suivants
|
||||
cd "$ORIGINAL_PROJECT"
|
||||
fi
|
||||
|
||||
echo_info "Fixing web assets structure..."
|
||||
./copy-web-images.sh || echo_error "Failed to fix web assets"
|
||||
|
||||
|
||||
# Créer l'archive depuis le build
|
||||
echo_info "Creating archive from build..."
|
||||
tar -czf "${TEMP_ARCHIVE}" -C ${FLUTTER_BUILD_DIR} . || echo_error "Failed to create archive"
|
||||
|
||||
# Afficher les statistiques du ramdisk si utilisé
|
||||
if [ "$USE_RAMDISK" = true ]; then
|
||||
echo_info "📊 Statistiques du ramdisk:"
|
||||
echo_info " Espace utilisé: $(du -sh ${RAMDISK_BASE} 2>/dev/null | cut -f1)"
|
||||
df -h ${RAMDISK_BASE}
|
||||
|
||||
# Optionnel: nettoyer le projet du ramdisk pour libérer la RAM
|
||||
echo_info "🧹 Nettoyage du ramdisk..."
|
||||
rm -rf "$RAMDISK_PROJECT"
|
||||
fi
|
||||
|
||||
create_local_backup "${TEMP_ARCHIVE}" "dev"
|
||||
|
||||
@@ -214,25 +298,45 @@ elif [ "$SOURCE_TYPE" = "local_container" ]; then
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-rca"
|
||||
|
||||
elif [ "$SOURCE_TYPE" = "remote_container" ]; then
|
||||
# PRA: Créer une archive depuis un container distant
|
||||
# RCA ou 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 ${APP_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"
|
||||
if [[ "$SOURCE_HOST" == "IN3" ]]; then
|
||||
ssh ${SOURCE_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus exec ${SOURCE_CONTAINER} -- tar -czf /tmp/${ARCHIVE_NAME} -C ${APP_PATH} .
|
||||
" || echo_error "Failed to create archive on IN3"
|
||||
|
||||
# Extraire l'archive du container vers l'hôte
|
||||
ssh ${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 IN3 container"
|
||||
|
||||
# Copier l'archive vers la machine locale pour backup
|
||||
scp ${SOURCE_HOST}:/tmp/${ARCHIVE_NAME} ${TEMP_ARCHIVE} || echo_error "Failed to copy archive from IN3"
|
||||
else
|
||||
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 ${APP_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"
|
||||
fi
|
||||
|
||||
if [[ "$SOURCE_HOST" == "IN3" && "$DEST_HOST" == "IN3" ]]; then
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-rca"
|
||||
else
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-pra"
|
||||
fi
|
||||
fi
|
||||
|
||||
ARCHIVE_SIZE=$(du -h "${TEMP_ARCHIVE}" | cut -f1)
|
||||
@@ -243,7 +347,7 @@ echo_info "Archive size: ${ARCHIVE_SIZE}"
|
||||
# =====================================
|
||||
|
||||
if [ "$DEST_HOST" = "local" ]; then
|
||||
# Déploiement sur container local (DEV)
|
||||
# Déploiement sur container local (ancien mode, non utilisé)
|
||||
echo_step "Deploying to local container ${DEST_CONTAINER}..."
|
||||
|
||||
echo_info "Switching to Incus project ${INCUS_PROJECT}..."
|
||||
@@ -268,62 +372,121 @@ if [ "$DEST_HOST" = "local" ]; then
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME}
|
||||
|
||||
else
|
||||
# Déploiement sur container distant (RCA ou PRA)
|
||||
# Déploiement sur container distant (DEV sur IN3, 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="${APP_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 ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${APP_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
# Utiliser ssh avec IN3 configuré ou ssh classique
|
||||
if [[ "$DEST_HOST" == "IN3" ]]; then
|
||||
ssh ${DEST_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus exec ${DEST_CONTAINER} -- test -d ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${APP_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
else
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${DEST_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
incus exec ${DEST_CONTAINER} -- test -d ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${APP_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
fi
|
||||
|
||||
# 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"
|
||||
|
||||
if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
# Pour DEV: copier depuis local vers IN3
|
||||
if [[ "$DEST_HOST" == "IN3" ]]; then
|
||||
scp ${TEMP_ARCHIVE} ${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to copy archive to IN3"
|
||||
else
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} ${TEMP_ARCHIVE} ${HOST_USER}@${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to copy archive to destination"
|
||||
fi
|
||||
elif [ "$SOURCE_TYPE" = "local_container" ]; then
|
||||
# Pour RCA depuis container local: copier depuis local vers distant
|
||||
if [[ "$DEST_HOST" == "IN3" ]]; then
|
||||
scp ${TEMP_ARCHIVE} ${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to copy archive to IN3"
|
||||
else
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} ${TEMP_ARCHIVE} ${HOST_USER}@${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to copy archive to destination"
|
||||
fi
|
||||
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}"
|
||||
# Pour transferts entre containers distants (RCA: dva-geo vers rca-geo sur IN3)
|
||||
if [[ "$SOURCE_HOST" == "IN3" && "$DEST_HOST" == "IN3" ]]; then
|
||||
# Cas spécial : source et destination sur le même serveur IN3
|
||||
echo_info "Transfer within IN3 (${SOURCE_CONTAINER} to ${DEST_CONTAINER})"
|
||||
# L'archive est déjà sur IN3, pas besoin de transfert réseau
|
||||
# Elle a été créée lors de l'étape "remote_container" plus haut
|
||||
elif [[ "$SOURCE_HOST" == "IN3" ]]; then
|
||||
# Source sur IN3, destination ailleurs
|
||||
ssh ${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 from IN3"
|
||||
ssh ${SOURCE_HOST} "rm -f /tmp/${ARCHIVE_NAME}"
|
||||
else
|
||||
# Transfert classique 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"
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "rm -f /tmp/${ARCHIVE_NAME}"
|
||||
fi
|
||||
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 ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- mkdir -p ${APP_PATH} &&
|
||||
|
||||
# Extraire l'archive
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${APP_PATH}/ &&
|
||||
|
||||
# Permissions
|
||||
incus exec ${DEST_CONTAINER} -- chown -R ${FINAL_OWNER}:${FINAL_GROUP} ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type d -exec chmod 755 {} \; &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type f -exec chmod 644 {} \; &&
|
||||
|
||||
# Nettoyage
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME} &&
|
||||
rm -f /tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Deployment failed on destination"
|
||||
if [[ "$DEST_HOST" == "IN3" ]]; then
|
||||
ssh ${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 ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- mkdir -p ${APP_PATH} &&
|
||||
|
||||
# Extraire l'archive
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${APP_PATH}/ &&
|
||||
|
||||
# Permissions
|
||||
incus exec ${DEST_CONTAINER} -- chown -R ${FINAL_OWNER}:${FINAL_GROUP} ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type d -exec chmod 755 {} \; &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type f -exec chmod 644 {} \; &&
|
||||
|
||||
# Nettoyage
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME} &&
|
||||
rm -f /tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Deployment failed on IN3"
|
||||
else
|
||||
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 ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- mkdir -p ${APP_PATH} &&
|
||||
|
||||
# Extraire l'archive
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${APP_PATH}/ &&
|
||||
|
||||
# Permissions
|
||||
incus exec ${DEST_CONTAINER} -- chown -R ${FINAL_OWNER}:${FINAL_GROUP} ${APP_PATH} &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type d -exec chmod 755 {} \; &&
|
||||
incus exec ${DEST_CONTAINER} -- find ${APP_PATH} -type f -exec chmod 644 {} \; &&
|
||||
|
||||
# Nettoyage
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME} &&
|
||||
rm -f /tmp/${ARCHIVE_NAME}
|
||||
" || echo_error "Deployment failed on destination"
|
||||
fi
|
||||
|
||||
echo_info "Remote backup saved: ${REMOTE_BACKUP_DIR} on ${DEST_CONTAINER}"
|
||||
fi
|
||||
@@ -349,5 +512,11 @@ fi
|
||||
|
||||
echo_info "Deployment completed at: $(date '+%H:%M:%S')"
|
||||
|
||||
# Calcul et affichage du temps total
|
||||
END_TIME=$(($(date +%s%N)/1000000))
|
||||
TOTAL_TIME=$((END_TIME - START_TIME))
|
||||
echo_info "[$(date '+%H:%M:%S.%3N')] Fin du script"
|
||||
echo_step "⏱️ TEMPS TOTAL D'EXÉCUTION: ${TOTAL_TIME} ms ($((TOTAL_TIME/1000)) secondes)"
|
||||
|
||||
# Journaliser le déploiement
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - Flutter app deployed to ${ENV_NAME} (${DEST_CONTAINER})" >> ~/.geo_deploy_history
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - Flutter app deployed to ${ENV_NAME} (${DEST_CONTAINER}) - Total: ${TOTAL_TIME}ms" >> ~/.geo_deploy_history
|
||||
Reference in New Issue
Block a user