feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles
- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD) * DEV: Clés TEST Pierre (mode test) * REC: Clés TEST Client (mode test) * PROD: Clés LIVE Client (mode live) - Ajout de la gestion des bases de données immeubles/bâtiments * Configuration buildings_database pour DEV/REC/PROD * Service BuildingService pour enrichissement des adresses - Optimisations pages et améliorations ergonomie - Mises à jour des dépendances Composer - Nettoyage des fichiers obsolètes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -24,11 +24,6 @@ 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"
|
||||
@@ -152,22 +147,15 @@ 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
|
||||
# Configuration du cache local (partagé web + iOS/Android)
|
||||
echo_info "📦 Configuration du cache local pour builds web et mobile..."
|
||||
export PUB_CACHE="$PWD/.pub-cache-local"
|
||||
export GRADLE_USER_HOME="$PWD/.gradle-local"
|
||||
mkdir -p "$PUB_CACHE" "$GRADLE_USER_HOME"
|
||||
|
||||
# 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
|
||||
echo_info " Cache Pub: $PUB_CACHE"
|
||||
echo_info " Cache Gradle: $GRADLE_USER_HOME"
|
||||
echo_info " → Packages patchés seront prêts pour transfert iOS/Android"
|
||||
|
||||
# Charger les variables d'environnement
|
||||
if [ ! -f .env-deploy-dev ]; then
|
||||
@@ -195,29 +183,38 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
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"
|
||||
|
||||
# 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"
|
||||
# Génération automatique du fichier AppInfoService (remplace package_info_plus)
|
||||
echo_info "Auto-generating app_info_service.dart with version $VERSION+$BUILD_NUMBER..."
|
||||
cat > lib/core/services/app_info_service.dart <<EOF
|
||||
// ⚠️ AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
|
||||
// This file is automatically generated by deploy-app.sh script
|
||||
// Last update: $(date '+%Y-%m-%d %H:%M:%S')
|
||||
// Source: ../VERSION file
|
||||
//
|
||||
// GEOSECTOR App Version Service
|
||||
// Provides application version and build information without external dependencies
|
||||
|
||||
# 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/"
|
||||
class AppInfoService {
|
||||
// Version number (format: x.x.x)
|
||||
static const String version = '$VERSION';
|
||||
|
||||
# Se déplacer dans le projet ramdisk
|
||||
cd "$RAMDISK_PROJECT"
|
||||
echo_info "📍 Compilation depuis: $RAMDISK_PROJECT"
|
||||
fi
|
||||
// Build number (version without dots: xxx)
|
||||
static const String buildNumber = '$BUILD_NUMBER';
|
||||
|
||||
// Full version string (format: vx.x.x+xxx)
|
||||
static String get fullVersion => 'v\$version+\$buildNumber';
|
||||
|
||||
// Application name
|
||||
static const String appName = 'GeoSector';
|
||||
|
||||
// Package name
|
||||
static const String packageName = 'fr.geosector.app3';
|
||||
}
|
||||
EOF
|
||||
echo_info "✓ app_info_service.dart updated successfully"
|
||||
|
||||
# Mode de compilation en RELEASE (production)
|
||||
echo_info "🏁 Mode RELEASE - Compilation optimisée pour production"
|
||||
@@ -227,10 +224,14 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
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"
|
||||
|
||||
# Patch nfc_manager 3.3.0 (AndroidManifest namespace)
|
||||
echo_info "Applying nfc_manager 3.3.0 patch..."
|
||||
./fastlane/scripts/commun/fix-nfc-manager.sh || echo_error "nfc_manager patch failed"
|
||||
|
||||
echo_info "Cleaning generated files..."
|
||||
dart run build_runner clean || echo_error "Build runner clean failed"
|
||||
@@ -250,17 +251,6 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
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"
|
||||
|
||||
@@ -268,17 +258,6 @@ if [ "$SOURCE_TYPE" = "local_build" ]; then
|
||||
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"
|
||||
|
||||
elif [ "$SOURCE_TYPE" = "local_container" ]; then
|
||||
@@ -314,8 +293,36 @@ elif [ "$SOURCE_TYPE" = "remote_container" ]; then
|
||||
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"
|
||||
# Télécharger l'archive vers la machine locale
|
||||
if [[ "$TARGET_ENV" == "pra" ]]; then
|
||||
# Pour PROD: télécharger directement vers /data/backup/geosector/
|
||||
BACKUP_TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
|
||||
BACKUP_FILE="${BACKUP_DIR}/app-to-pra-${BACKUP_TIMESTAMP}.tar.gz"
|
||||
|
||||
echo_info "Downloading archive to backup directory..."
|
||||
mkdir -p "${BACKUP_DIR}" || echo_warning "Could not create backup directory ${BACKUP_DIR}"
|
||||
scp ${SOURCE_HOST}:/tmp/${ARCHIVE_NAME} ${BACKUP_FILE} || echo_error "Failed to download archive from IN3"
|
||||
|
||||
# Nettoyer sur IN3
|
||||
ssh ${SOURCE_HOST} "rm -f /tmp/${ARCHIVE_NAME}"
|
||||
|
||||
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-to-pra-*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f && {
|
||||
REMAINING_BACKUPS=$(ls "${BACKUP_DIR}"/app-to-pra-*.tar.gz 2>/dev/null | wc -l)
|
||||
echo_info "Kept ${REMAINING_BACKUPS} backup(s)"
|
||||
}
|
||||
|
||||
# Utiliser le backup comme archive de travail
|
||||
TEMP_ARCHIVE="${BACKUP_FILE}"
|
||||
else
|
||||
# Pour RCA: copier vers /tmp comme avant
|
||||
scp ${SOURCE_HOST}:/tmp/${ARCHIVE_NAME} ${TEMP_ARCHIVE} || echo_error "Failed to copy archive from IN3"
|
||||
create_local_backup "${TEMP_ARCHIVE}" "to-rca"
|
||||
fi
|
||||
else
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${SOURCE_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
@@ -330,11 +337,6 @@ elif [ "$SOURCE_TYPE" = "remote_container" ]; then
|
||||
|
||||
# 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
|
||||
@@ -388,6 +390,16 @@ else
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${APP_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
|
||||
# Nettoyage automatique des anciens backups (garder les 2 derniers)
|
||||
echo_info "Cleaning old remote backups (keeping last 2)..."
|
||||
ssh ${DEST_HOST} "
|
||||
incus exec ${DEST_CONTAINER} -- bash -c '
|
||||
cd /var/www/geosector/ &&
|
||||
ls -dt app_backup_* 2>/dev/null | tail -n +3 | xargs -r rm -rf &&
|
||||
echo \"Remote backups: \$(ls -d app_backup_* 2>/dev/null | wc -l) kept\"
|
||||
'
|
||||
" || echo_warning "Could not clean old remote backups"
|
||||
else
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${DEST_HOST} "
|
||||
incus project switch ${INCUS_PROJECT} &&
|
||||
@@ -395,6 +407,16 @@ else
|
||||
incus exec ${DEST_CONTAINER} -- cp -r ${APP_PATH} ${REMOTE_BACKUP_DIR} &&
|
||||
echo 'Backup created: ${REMOTE_BACKUP_DIR}'
|
||||
" || echo_warning "No existing installation to backup"
|
||||
|
||||
# Nettoyage automatique des anciens backups (garder les 2 derniers)
|
||||
echo_info "Cleaning old remote backups (keeping last 2)..."
|
||||
ssh -i ${HOST_KEY} -p ${HOST_PORT} ${HOST_USER}@${DEST_HOST} "
|
||||
incus exec ${DEST_CONTAINER} -- bash -c '
|
||||
cd /var/www/geosector/ &&
|
||||
ls -dt app_backup_* 2>/dev/null | tail -n +3 | xargs -r rm -rf &&
|
||||
echo \"Remote backups: \$(ls -d app_backup_* 2>/dev/null | wc -l) kept\"
|
||||
'
|
||||
" || echo_warning "Could not clean old remote backups"
|
||||
fi
|
||||
|
||||
# Transférer l'archive vers le serveur de destination
|
||||
@@ -415,14 +437,18 @@ 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 transferts entre containers distants (RCA: dva-geo vers rca-geo sur IN3)
|
||||
# Pour transferts entre containers distants
|
||||
if [[ "$SOURCE_HOST" == "IN3" && "$DEST_HOST" == "IN3" ]]; then
|
||||
# Cas spécial : source et destination sur le même serveur IN3
|
||||
# Cas spécial : source et destination sur le même serveur IN3 (RCA)
|
||||
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 [[ "$TARGET_ENV" == "pra" ]]; then
|
||||
# Pour PROD: upload depuis le PC local (backup) vers IN4
|
||||
echo_info "Uploading from local backup to IN4..."
|
||||
scp -i ${HOST_KEY} -P ${HOST_PORT} ${TEMP_ARCHIVE} ${HOST_USER}@${DEST_HOST}:/tmp/${ARCHIVE_NAME} || echo_error "Failed to upload archive to IN4"
|
||||
elif [[ "$SOURCE_HOST" == "IN3" ]]; then
|
||||
# Source sur IN3, destination ailleurs
|
||||
# Source sur IN3, destination ailleurs (cas théorique)
|
||||
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"
|
||||
@@ -492,7 +518,11 @@ else
|
||||
fi
|
||||
|
||||
# Nettoyage local
|
||||
rm -f "${TEMP_ARCHIVE}"
|
||||
# Pour PROD, on conserve l'archive dans /data/backup/geosector/
|
||||
# Pour DEV et RCA, on supprime le fichier temporaire
|
||||
if [[ "$TARGET_ENV" != "pra" ]]; then
|
||||
rm -f "${TEMP_ARCHIVE}"
|
||||
fi
|
||||
|
||||
# =====================================
|
||||
# Résumé final
|
||||
|
||||
Reference in New Issue
Block a user