#!/usr/bin/env bash # ============================================================================= # deploy.sh — Mise à jour de crowdlending-app en production # # Usage : ./deploy.sh [--no-backup] # --no-backup Saute la sauvegarde de la base (déconseillé) # # À exécuter sur le CT Proxmox dans /opt/crowdlending-app # ============================================================================= set -euo pipefail APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKUP_DIR="$APP_DIR/backups" DATE=$(date +%Y%m%d_%H%M%S) DO_BACKUP=true # --- Arguments --- for arg in "$@"; do case $arg in --no-backup) DO_BACKUP=false ;; esac done echo "" echo "=========================================" echo " Déploiement crowdlending-app — $DATE" echo "=========================================" cd "$APP_DIR" # 1. Vérifications préalables if [ ! -f ".env" ]; then echo "❌ Fichier .env manquant. Copier .env.example et remplir les valeurs." exit 1 fi # 2. Sauvegarde de la base SQLite avant toute modification if [ "$DO_BACKUP" = true ]; then echo "" echo "📦 Sauvegarde de la base de données..." mkdir -p "$BACKUP_DIR" # Trouver le fichier .db dans le volume Docker DB_CONTAINER="crowdlending-backend" if docker ps --format '{{.Names}}' | grep -q "$DB_CONTAINER"; then docker cp "$DB_CONTAINER":/app/data/crowdlending.db "$BACKUP_DIR/crowdlending_$DATE.db" 2>/dev/null \ && echo " ✓ Sauvegarde : backups/crowdlending_$DATE.db" \ || echo " ⚠ Impossible de copier la base (container arrêté ?), on continue." else echo " ⚠ Container arrêté, pas de sauvegarde." fi # Garder seulement les 10 dernières sauvegardes ls -t "$BACKUP_DIR"/crowdlending_*.db 2>/dev/null | tail -n +11 | xargs -r rm -- fi # 3. Récupération du code echo "" echo "⬇ Récupération du code (git pull)..." git pull origin main # 4. Reconstruction et redémarrage echo "" echo "🔨 Build et redémarrage des containers..." docker compose build --no-cache docker compose up -d # 5. Attente que le backend soit healthy echo "" echo "⏳ Attente démarrage du backend..." MAX_WAIT=60 WAITED=0 until docker inspect --format='{{.State.Health.Status}}' crowdlending-backend 2>/dev/null | grep -q "healthy"; do if [ $WAITED -ge $MAX_WAIT ]; then echo "❌ Le backend ne répond pas après ${MAX_WAIT}s. Vérifier les logs :" echo " docker compose logs backend --tail=50" exit 1 fi sleep 3 WAITED=$((WAITED + 3)) echo " ... ($WAITED s)" done echo "" echo "✅ Déploiement terminé avec succès !" echo " Frontend : http://$(hostname -I | awk '{print $1}'):8080" echo " Logs : docker compose logs -f"