Security (CRITICAL): - Add .env.example with strong password generation instructions - Fix path traversal validation in restore.sh (now detects all .. patterns) - Secure .env loading with set -a/set +a in all scripts - Add logs/ to .gitignore to prevent credential leaks Backup & Restore (IMPORTANT): - Add file locking system to prevent concurrent backups - Add disk space verification before backup operations - Generate SHA256 checksums for all backups - Verify checksums before restoration - Create safety database backup before restore - Implement comprehensive logging to ./logs/ directory - Fix BACKUP_RETENTION_DAYS inconsistency - Replace dangerous find -delete with safe iteration Update & Recovery: - Backup docker-compose.yml before updates with auto-rollback - Add version display before/after updates - Increase timeouts to 120s for slow containers - Dynamic backup suggestion in recover.sh Compatibility: - Add Docker Compose v2 support with v1 fallback in all scripts - Standardized log() function across all scripts New Features: - Add check-health.sh: comprehensive system health monitoring - Add SECURITY.md: complete security documentation - Update Makefile with check-health and recover commands - Centralized logging with timestamps and levels 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
104 lines
3.2 KiB
Bash
Executable File
104 lines
3.2 KiB
Bash
Executable File
#!/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"
|
|
|
|
LOG_DIR="./logs"
|
|
LOG_FILE="$LOG_DIR/recover_$(date +%Y%m%d_%H%M%S).log"
|
|
|
|
# Créer le dossier de logs
|
|
mkdir -p "$LOG_DIR"
|
|
|
|
# Fonction de logging
|
|
log() {
|
|
local level="$1"
|
|
shift
|
|
local message="$*"
|
|
local timestamp
|
|
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
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é"
|