#!/bin/bash # Hook Borgmatic - Dump MySQL Seafile dockerisé avant backup set -e # Arrêter en cas d'erreur BACKUP_DIR="/opt/seafile/backups/mysql" DATE=$(date +%Y%m%d-%H%M) SEAFILE_CONTAINER="seafile" # Nom de votre conteneur Seafile MYSQL_CONTAINER="seafile-mysql" # Ou le nom de votre conteneur MySQL # Log pour debug systemd exec 1> >(logger -t seafile-backup -p user.info) exec 2> >(logger -t seafile-backup -p user.error) echo "[$(date)] Démarrage dump MySQL Seafile..." echo "Contexte: USER=$USER, PWD=$PWD, HOME=$HOME" # Créer le répertoire de backup mkdir -p "$BACKUP_DIR" echo "✓ Répertoire de backup: $BACKUP_DIR" # Charger les identifiants depuis .env if [ -f /etc/borgmatic/.env ]; then source /etc/borgmatic/.env echo "✓ Variables chargées depuis /etc/borgmatic/.env" else echo "⚠️ /etc/borgmatic/.env non trouvé" fi # Utilisateur MySQL (par défaut root, configurable via .env) MYSQL_USER="${SEAFILE_MYSQL_USER:-root}" # Vérifier que le mot de passe est défini if [ -z "$SEAFILE_DB_PASSWORD" ]; then echo "❌ SEAFILE_DB_PASSWORD n'est pas défini dans /etc/borgmatic/.env" exit 1 fi echo "✓ Utilisateur MySQL: $MYSQL_USER" echo "✓ Mot de passe MySQL défini" # Vérifier l'accès à Docker echo "Test accès Docker..." if ! docker info >/dev/null 2>&1; then echo "❌ Impossible d'accéder à Docker (socket /var/run/docker.sock)" exit 1 fi echo "✓ Docker accessible" # Vérifier que le conteneur existe et tourne echo "Recherche du conteneur $MYSQL_CONTAINER..." if ! docker ps --format '{{.Names}}' | grep -q "^${MYSQL_CONTAINER}$"; then echo "❌ Conteneur $MYSQL_CONTAINER non trouvé ou arrêté" echo "Conteneurs disponibles:" docker ps --format " - {{.Names}}" exit 1 fi echo "✓ Conteneur $MYSQL_CONTAINER trouvé" # Dump unique avec toutes les bases DUMP_FILE="$BACKUP_DIR/seafile-all-$DATE.sql" echo "→ Lancement du dump MySQL vers: $DUMP_FILE" echo "→ Commande: docker exec $MYSQL_CONTAINER mysqldump -u $MYSQL_USER ..." # Utiliser une approche sans redirection 2>&1 qui peut bloquer set +e # Désactiver temporairement set -e pour capturer le code de sortie timeout 300 docker exec "$MYSQL_CONTAINER" mysqldump \ -u "$MYSQL_USER" -p"${SEAFILE_DB_PASSWORD}" \ --single-transaction --quick --databases \ ccnet_db seafile_db seahub_db > "$DUMP_FILE" 2>&1 DUMP_EXIT_CODE=$? set -e echo "→ Code de sortie mysqldump: $DUMP_EXIT_CODE" if [ $DUMP_EXIT_CODE -eq 0 ] && [ -f "$DUMP_FILE" ] && [ -s "$DUMP_FILE" ]; then SIZE=$(du -h "$DUMP_FILE" | cut -f1) echo "✓ Dump créé: seafile-all-$DATE.sql ($SIZE)" else echo "❌ Échec du dump (code sortie: $DUMP_EXIT_CODE)" [ -f "$DUMP_FILE" ] && echo "Taille fichier: $(stat -f %z "$DUMP_FILE" 2>/dev/null || stat -c %s "$DUMP_FILE") bytes" exit 1 fi # Nettoyer les anciens dumps (garder 7 jours) DELETED=$(find "$BACKUP_DIR" -name "*.sql" -mtime +7 -delete -print | wc -l) if [ "$DELETED" -gt 0 ]; then echo "🗑️ $DELETED ancien(s) dump(s) supprimé(s)" fi echo "[$(date)] ✅ Dump MySQL Seafile terminé avec succès" exit 0