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,106 +1,353 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de déploiement unifié pour GEOSECTOR Flutter App
|
||||
# Version: 4.0 (Janvier 2025)
|
||||
# Auteur: Pierre (avec l'aide de Claude)
|
||||
#
|
||||
# Usage:
|
||||
# ./deploy-app.sh # Déploiement local DEV (build → container geo)
|
||||
# ./deploy-app.sh rca # Livraison RECETTE (container geo → rca-geo)
|
||||
# ./deploy-app.sh pra # Livraison PRODUCTION (rca-geo → pra-geo)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
cd /home/pierre/dev/geosector/app
|
||||
|
||||
# Charger les variables d'environnement
|
||||
if [ ! -f .env-deploy-dev ]; then
|
||||
echo "❌ Fichier .env-deploy-dev manquant"
|
||||
exit 1
|
||||
fi
|
||||
source .env-deploy-dev
|
||||
# =====================================
|
||||
# Configuration générale
|
||||
# =====================================
|
||||
|
||||
# Fonction pour gérer les erreurs
|
||||
error_exit() {
|
||||
echo "❌ $1"
|
||||
# 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"
|
||||
APP_PATH="/var/www/geosector/app"
|
||||
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
|
||||
}
|
||||
|
||||
# Mise à jour de la version depuis ../VERSION
|
||||
echo "📝 Gestion de la version..."
|
||||
if [ -f ../VERSION ]; then
|
||||
VERSION=$(cat ../VERSION | tr -d '\n\r' | tr -d ' ')
|
||||
echo " Version trouvée dans ../VERSION: $VERSION"
|
||||
else
|
||||
echo "⚠️ Fichier ../VERSION non trouvé"
|
||||
# Fonction pour créer une sauvegarde locale
|
||||
create_local_backup() {
|
||||
local archive_file=$1
|
||||
local backup_type=$2
|
||||
|
||||
# Demander la version à l'utilisateur
|
||||
while true; do
|
||||
read -p "📌 Veuillez entrer le numéro de version (format x.x.x) : " VERSION
|
||||
|
||||
# Validation du format de version
|
||||
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}/app-${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}"/app-${backup_type}-*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f && {
|
||||
REMAINING_BACKUPS=$(ls "${BACKUP_DIR}"/app-${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="app-deploy-${TIMESTAMP}.tar.gz"
|
||||
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..."
|
||||
|
||||
# Charger les variables d'environnement
|
||||
if [ ! -f .env-deploy-dev ]; then
|
||||
echo_error "Missing .env-deploy-dev file"
|
||||
fi
|
||||
source .env-deploy-dev
|
||||
|
||||
# Mise à jour de la version
|
||||
echo_info "Managing version..."
|
||||
if [ -f ../VERSION ]; then
|
||||
VERSION=$(cat ../VERSION | tr -d '\n\r' | tr -d ' ')
|
||||
echo_info "Version found: $VERSION"
|
||||
else
|
||||
echo_warning "VERSION file not found"
|
||||
read -p "Enter version number (x.x.x format): " VERSION
|
||||
if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
# Créer le fichier VERSION
|
||||
echo "$VERSION" > ../VERSION
|
||||
echo "✅ Fichier ../VERSION créé avec la version $VERSION"
|
||||
break
|
||||
echo_info "VERSION file created with $VERSION"
|
||||
else
|
||||
echo "❌ Format invalide. Veuillez utiliser le format x.x.x (ex: 3.1.5)"
|
||||
echo_error "Invalid version format"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Génération du build number et mise à jour du pubspec.yaml
|
||||
BUILD_NUMBER=$(echo $VERSION | tr -d '.')
|
||||
FULL_VERSION="${VERSION}+${BUILD_NUMBER}"
|
||||
echo_info "Full version: $FULL_VERSION"
|
||||
|
||||
sed -i "s/^version: .*/version: $FULL_VERSION/" pubspec.yaml || echo_error "Failed to update pubspec.yaml"
|
||||
|
||||
# Nettoyage
|
||||
echo_info "Cleaning previous builds..."
|
||||
rm -rf .dart_tool build .packages pubspec.lock 2>/dev/null || true
|
||||
flutter clean || echo_warning "Flutter clean partially failed"
|
||||
|
||||
# Build
|
||||
echo_info "Getting dependencies..."
|
||||
flutter pub get || echo_error "Flutter pub get failed"
|
||||
|
||||
echo_info "Cleaning generated files..."
|
||||
dart run build_runner clean || echo_error "Build runner clean failed"
|
||||
|
||||
echo_info "Generating code files..."
|
||||
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"
|
||||
|
||||
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"
|
||||
|
||||
create_local_backup "${TEMP_ARCHIVE}" "dev"
|
||||
|
||||
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 ${APP_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 ${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"
|
||||
fi
|
||||
|
||||
# Génération du build number et mise à jour du pubspec.yaml
|
||||
BUILD_NUMBER=$(echo $VERSION | tr -d '.')
|
||||
FULL_VERSION="${VERSION}+${BUILD_NUMBER}"
|
||||
ARCHIVE_SIZE=$(du -h "${TEMP_ARCHIVE}" | cut -f1)
|
||||
echo_info "Archive size: ${ARCHIVE_SIZE}"
|
||||
|
||||
echo " Version complète: $FULL_VERSION"
|
||||
# =====================================
|
||||
# Déploiement selon la destination
|
||||
# =====================================
|
||||
|
||||
# Mise à jour du pubspec.yaml
|
||||
sed -i "s/^version: .*/version: $FULL_VERSION/" pubspec.yaml || error_exit "Impossible de mettre à jour la version dans pubspec.yaml"
|
||||
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 ${APP_PATH} || echo_error "Failed to create deployment directory"
|
||||
incus exec ${DEST_CONTAINER} -- rm -rf ${APP_PATH}/* || echo_warning "Could not clean deployment directory"
|
||||
|
||||
echo_info "Extracting archive..."
|
||||
incus exec ${DEST_CONTAINER} -- tar -xzf /tmp/${ARCHIVE_NAME} -C ${APP_PATH}/ || echo_error "Failed to extract archive"
|
||||
|
||||
echo_info "Setting 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 {} \;
|
||||
|
||||
echo_info "Cleaning up..."
|
||||
incus exec ${DEST_CONTAINER} -- rm -f /tmp/${ARCHIVE_NAME}
|
||||
|
||||
else
|
||||
# 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="${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"
|
||||
|
||||
# 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 ${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"
|
||||
|
||||
echo_info "Remote backup saved: ${REMOTE_BACKUP_DIR} on ${DEST_CONTAINER}"
|
||||
fi
|
||||
|
||||
echo "✅ Version mise à jour dans pubspec.yaml"
|
||||
echo ""
|
||||
# Nettoyage local
|
||||
rm -f "${TEMP_ARCHIVE}"
|
||||
|
||||
# Nettoyage manuel des dossiers problématiques sur les montages réseau
|
||||
echo "🧹 Manual cleanup of network drive..."
|
||||
rm -rf .dart_tool build 2>/dev/null || true
|
||||
rm -rf .packages pubspec.lock 2>/dev/null || true
|
||||
# =====================================
|
||||
# Résumé final
|
||||
# =====================================
|
||||
|
||||
# Construction de l'application Flutter
|
||||
echo "🧹 Cleaning previous builds..."
|
||||
flutter clean || echo "⚠️ Flutter clean partially failed (continuing...)"
|
||||
echo_step "Deployment completed successfully!"
|
||||
echo_info "Environment: ${ENV_NAME}"
|
||||
|
||||
# Construction de l'application Flutter
|
||||
echo "🧹 Cleaning previous builds..."
|
||||
flutter clean || error_exit "Flutter clean failed"
|
||||
if [ "$TARGET_ENV" = "dev" ]; then
|
||||
echo_info "Built and deployed Flutter app to container ${DEST_CONTAINER}"
|
||||
echo_info "Version: ${FULL_VERSION}"
|
||||
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 "📦 Getting dependencies..."
|
||||
flutter pub get || error_exit "Flutter pub get failed"
|
||||
echo_info "Deployment completed at: $(date '+%H:%M:%S')"
|
||||
|
||||
# Nettoyage et génération du code
|
||||
echo "🗑️ Cleaning generated files..."
|
||||
dart run build_runner clean || error_exit "Build runner clean failed"
|
||||
|
||||
echo "🔨 Generating code files..."
|
||||
dart run build_runner build --delete-conflicting-outputs || error_exit "Code generation failed"
|
||||
|
||||
# Construction de l'application Flutter
|
||||
echo "🏗️ Building Flutter web application..."
|
||||
flutter build web --release || error_exit "Flutter build failed"
|
||||
|
||||
echo "🖼️ Fixing web assets structure..."
|
||||
./copy-web-images.sh || error_exit "Failed to fix web assets"
|
||||
|
||||
echo "✅ Build completed successfully!"
|
||||
|
||||
# Préparation de la commande SSH pour le host
|
||||
SSH_HOST_CMD="ssh -i $HOST_SSH_KEY -p $HOST_SSH_PORT $HOST_SSH_USER@$HOST_SSH_HOST"
|
||||
|
||||
# Préparation du chemin temporaire sur le host
|
||||
TEMP_DIR="/tmp/geosector-deploy-$(date +%s)"
|
||||
|
||||
echo "📤 Copie des fichiers vers le host temporairement..."
|
||||
rsync -rltz --delete \
|
||||
-e "ssh -i $HOST_SSH_KEY -p $HOST_SSH_PORT" \
|
||||
$FLUTTER_BUILD_DIR/ \
|
||||
$HOST_SSH_USER@$HOST_SSH_HOST:$TEMP_DIR/ || error_exit "Transfert vers le host échoué"
|
||||
|
||||
echo "🔄 Transfert des fichiers du host vers le container..."
|
||||
$SSH_HOST_CMD "sudo incus project switch $INCUS_PROJECT && sudo incus file push -r $TEMP_DIR/* $INCUS_CONTAINER$DEPLOY_TARGET_DIR/" || error_exit "Transfert vers le container échoué"
|
||||
|
||||
echo "🧹 Nettoyage du répertoire temporaire sur le host..."
|
||||
$SSH_HOST_CMD "rm -rf $TEMP_DIR"
|
||||
|
||||
echo "🔒 Configuration des permissions dans le container..."
|
||||
$SSH_HOST_CMD "sudo incus project switch $INCUS_PROJECT && sudo incus exec $INCUS_CONTAINER -- chown -R www-data:www-data $DEPLOY_TARGET_DIR" || error_exit "Configuration des permissions échouée"
|
||||
|
||||
echo "✅ Déploiement terminé avec succès à $(date '+%H:%M:%S') !"
|
||||
# Journaliser le déploiement
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - Flutter app deployed to ${ENV_NAME} (${DEST_CONTAINER})" >> ~/.geo_deploy_history
|
||||
Reference in New Issue
Block a user