Files
agence66-nextcloud-docker/scripts/backup.sh
BeauTroll 701513ce15 Standardize error message prefixes in backup.sh
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>
2025-12-17 18:16:21 +01:00

126 lines
3.9 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"