108 lines
3.4 KiB
Bash
Executable File
108 lines
3.4 KiB
Bash
Executable File
#!/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..."
|
|
|
|
# Mémoriser les IDs des anciennes images avant le build
|
|
OLD_BACKEND_IMG=$(docker inspect --format='{{.Image}}' crowdlending-backend 2>/dev/null || true)
|
|
OLD_FRONTEND_IMG=$(docker inspect --format='{{.Image}}' crowdlending-frontend 2>/dev/null || true)
|
|
|
|
docker compose build --no-cache
|
|
docker compose up -d
|
|
|
|
# Purger les anciennes images devenues dangling
|
|
echo ""
|
|
echo "🧹 Purge des anciennes images..."
|
|
for OLD_IMG in "$OLD_BACKEND_IMG" "$OLD_FRONTEND_IMG"; do
|
|
if [ -n "$OLD_IMG" ]; then
|
|
# Supprimer uniquement si l'image n'est plus utilisée par aucun container
|
|
if ! docker ps -aq --filter "ancestor=$OLD_IMG" | grep -q .; then
|
|
docker rmi "$OLD_IMG" 2>/dev/null && echo " ✓ Supprimée : $OLD_IMG" || echo " ⚠ Impossible de supprimer : $OLD_IMG"
|
|
else
|
|
echo " ⚠ Image encore utilisée, ignorée : $OLD_IMG"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# 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"
|