improve scripts security

This commit is contained in:
BeauTroll
2025-12-15 11:14:16 +01:00
parent dc15b4665d
commit 517e337a25
4 changed files with 272 additions and 49 deletions

View File

@@ -1,14 +1,51 @@
#!/bin/bash
# scripts/backup.sh - Backup complet Nextcloud
set -e
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
# 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"
@@ -17,18 +54,25 @@ mkdir -p "$BACKUP_PATH"
# 1. Activer le mode maintenance
echo "⏸️ Activation du mode maintenance..."
docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --on
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..."
docker-compose exec -T db mysqldump \
-u"$MYSQL_USER" \
-p"$MYSQL_PASSWORD" \
"$MYSQL_DATABASE" \
# 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"
--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..."
@@ -59,17 +103,26 @@ fi
# 6. Désactiver le mode maintenance
echo "▶️ Désactivation du mode maintenance..."
docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off
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..."
cd "$BACKUP_DIR"
tar -czf "$BACKUP_NAME.tar.gz" "$BACKUP_NAME/"
rm -rf "$BACKUP_NAME"
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
echo "🧹 Nettoyage des backups > ${BACKUP_RETENTION_DAYS:-30} jours..."
find "$BACKUP_DIR" -name "nextcloud_backup_*.tar.gz" -mtime +${BACKUP_RETENTION_DAYS:-30} -delete
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"