#!/bin/bash # scripts/backup.sh - Backup complet Nextcloud set -euo pipefail # Charger les variables d'environnement if [ ! -f .env ]; then echo "❌ Erreur: Fichier .env introuvable" exit 1 fi # shellcheck disable=SC1091 source .env # Vérifier les variables requises : "${MYSQL_USER:?Variable MYSQL_USER non définie}" : "${MYSQL_PASSWORD:?Variable MYSQL_PASSWORD non définie}" : "${MYSQL_DATABASE:?Variable MYSQL_DATABASE non définie}" BACKUP_DIR="${BACKUP_DESTINATION:-./backups}" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_NAME="nextcloud_backup_$DATE" BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME" MAINTENANCE_ENABLED=false BACKUP_RETENTION_DAYS=7 # Fonction de nettoyage en cas d'erreur cleanup() { local exit_code=$? if [ "$exit_code" -ne 0 ]; then echo "❌ Erreur détectée (code: $exit_code), nettoyage..." fi # Désactiver le mode maintenance si activé if [ "$MAINTENANCE_ENABLED" = true ]; then echo "▶️ Désactivation du mode maintenance..." docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off || true fi # Nettoyer le backup partiel if [ -d "$BACKUP_PATH" ]; then echo "🧹 Nettoyage du backup partiel..." rm -rf "${BACKUP_PATH:?}" fi exit "$exit_code" } trap cleanup EXIT INT TERM echo "🔧 Démarrage du backup: $BACKUP_NAME" # Créer le dossier de backup mkdir -p "$BACKUP_PATH" # 1. Activer le mode maintenance echo "⏸️ Activation du mode maintenance..." if docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --on; then MAINTENANCE_ENABLED=true else echo "❌ Impossible d'activer le mode maintenance" exit 1 fi # 2. Backup de la base de données echo "💾 Backup de la base de données..." # Utiliser des variables d'environnement pour éviter le mot de passe dans la ligne de commande if ! docker-compose exec -T db sh -c "MYSQL_PWD=\"\$MYSQL_PASSWORD\" mysqldump \ -u\"\$MYSQL_USER\" \ \"\$MYSQL_DATABASE\" \ --single-transaction \ --quick \ --lock-tables=false" >"$BACKUP_PATH/database.sql"; then echo "❌ Erreur lors du backup de la base de données" exit 1 fi # 3. Backup des fichiers de config echo "⚙️ Backup de la configuration..." docker-compose exec -T -u www-data nextcloud tar -czf - -C /var/www/html/config . > "$BACKUP_PATH/config.tar.gz" # 4. Backup des données utilisateurs (peut être volumineux) echo "📁 Backup des données utilisateurs..." # Utiliser tar avec compression et exclusions depuis le container docker-compose exec -T -u www-data nextcloud tar -czf - \ -C /var/www/html/data \ --exclude='appdata_*/preview' \ --exclude='*/cache' \ --exclude='*/thumbnails' \ . > "$BACKUP_PATH/data.tar.gz" # 5. Backup des apps personnalisées echo "📦 Backup des apps personnalisées..." if docker-compose exec -T nextcloud [ -d /var/www/html/custom_apps ]; then docker-compose exec -T -u www-data nextcloud tar -czf - \ -C /var/www/html/custom_apps . > "$BACKUP_PATH/apps.tar.gz" else echo "ℹ️ Pas d'apps personnalisées à sauvegarder" fi # 6. Désactiver le mode maintenance echo "▶️ Désactivation du mode maintenance..." if docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off; then MAINTENANCE_ENABLED=false else echo "⚠️ Attention: Impossible de désactiver le mode maintenance" fi # 7. Créer une archive complète echo "🗜️ Compression finale..." if ! tar -czf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" -C "$BACKUP_DIR" "$BACKUP_NAME/"; then echo "❌ Erreur lors de la compression" exit 1 fi # Supprimer le dossier temporaire après compression réussie rm -rf "${BACKUP_PATH:?}" # 8. Nettoyer les vieux backups RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-30}" echo "🧹 Nettoyage des backups > $RETENTION_DAYS jours..." find "$BACKUP_DIR" -name "nextcloud_backup_*.tar.gz" -type f -mtime +"$RETENTION_DAYS" -delete echo "✅ Backup terminé: $BACKUP_DIR/$BACKUP_NAME.tar.gz" du -h "$BACKUP_DIR/$BACKUP_NAME.tar.gz"