Replace emoji-based prefixes with consistent [ERR], [WARN], and [*] prefixes for better parsing and logging compatibility. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
126 lines
3.9 KiB
Bash
Executable File
126 lines
3.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# scripts/backup.sh - Backup complet Nextcloud
|
||
|
||
set -euo pipefail
|
||
|
||
# Charger les variables d'environnement
|
||
if [ ! -f .env ]; then
|
||
echo "[ERR] 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 "[ERR] 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 "[ERR] 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 "[ERR] 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 "[WARN] 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 "[ERR] 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"
|