#!/bin/bash # scripts/recover.sh - Script de récupération après erreur set -euo pipefail # Variables globales SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Configuration des logs LOG_DIR="./logs" LOG_FILE="$PROJECT_ROOT/logs/recover_$(date +%Y%m%d_%H%M%S).log" mkdir -p "$LOG_DIR" # Charger les fonctions communes (log avec couleurs) # shellcheck disable=SC1091 source "$SCRIPT_DIR/common.sh" log "INFO" "=== Script de récupération Nextcloud ===" log "INFO" "Log file: $LOG_FILE" # 1. Arrêter tous les conteneurs log "INFO" "Arrêt de tous les conteneurs..." if docker-compose down --remove-orphans 2>>"$LOG_FILE"; then log "INFO" "Conteneurs arrêtés" else log "WARN" "Erreur lors de l'arrêt normal, tentative de force..." docker-compose kill 2>>"$LOG_FILE" || true docker-compose rm -f 2>>"$LOG_FILE" || true fi # 2. Nettoyer les conteneurs orphelins log "INFO" "Nettoyage des conteneurs orphelins..." docker container prune -f 2>>"$LOG_FILE" || log "WARN" "Impossible de nettoyer les conteneurs" # 3. Redémarrer les services log "INFO" "Redémarrage des services..." if ! docker-compose up -d 2>>"$LOG_FILE"; then log "ERROR" "Erreur lors du redémarrage" log "ERROR" "Vérifiez les logs: docker-compose logs" exit 1 fi # 4. Attendre que Nextcloud soit prêt log "INFO" "Attente du démarrage de Nextcloud (max 2 minutes)..." for i in {1..120}; do if docker-compose exec -T nextcloud curl -f http://localhost/status.php >/dev/null 2>&1; then log "INFO" "Nextcloud prêt (${i}s)" break fi if [ "$i" -eq 120 ]; then log "ERROR" "Timeout: Nextcloud n'est pas prêt après 2 minutes" log "ERROR" "Logs des conteneurs:" docker-compose logs --tail=50 nextcloud 2>&1 | tee -a "$LOG_FILE" exit 1 fi sleep 1 done # 5. Désactiver le mode maintenance log "INFO" "Désactivation du mode maintenance..." if docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off 2>>"$LOG_FILE"; then log "INFO" "Mode maintenance désactivé" else log "WARN" "Impossible de désactiver le mode maintenance" fi # 6. Vérifier le statut log "INFO" "Statut final:" docker-compose exec -T -u www-data nextcloud php occ status 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Impossible d'obtenir le statut" # 7. Suggérer les prochaines étapes log "INFO" "=== Récupération terminée ===" echo "" echo "Prochaines étapes:" echo " 1. Vérifiez que tout fonctionne: make health" echo " 2. Consultez les logs si nécessaire: make logs" # Lister les backups disponibles BACKUP_DIR="${BACKUP_DESTINATION:-./backups}" if [ -d "$BACKUP_DIR" ]; then LATEST_BACKUP=$(find "$BACKUP_DIR" -name "nextcloud_backup_*.tar.gz" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-) if [ -n "$LATEST_BACKUP" ]; then echo " 3. Si problème persiste, restaurez le backup le plus récent:" echo " make restore \"$LATEST_BACKUP\"" log "INFO" "Backup le plus récent: $LATEST_BACKUP" else echo " 3. Aucun backup disponible dans $BACKUP_DIR" fi else echo " 3. Dossier de backup introuvable: $BACKUP_DIR" fi log "SUCCESS" "Script de récupération terminé"