Compare commits
7 Commits
58bc9a47cc
...
b693ed1364
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b693ed1364 | ||
|
|
dd27bdebb5 | ||
|
|
fcc60226ca | ||
|
|
fb2a3585d4 | ||
|
|
2ed5314537 | ||
|
|
85ed35923c | ||
|
|
f3c74de015 |
@@ -1,46 +1,39 @@
|
||||
#!/bin/bash
|
||||
# ============================================
|
||||
# Script de sauvegarde Nextcloud
|
||||
# ============================================
|
||||
# Ce script crée une sauvegarde complète de:
|
||||
# - Données utilisateur
|
||||
# - Données utilisateur
|
||||
# scripts/backup.sh - Backup complet Nextcloud
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
if [ -f .env ]; then
|
||||
set -a
|
||||
source .env
|
||||
set +a
|
||||
else
|
||||
echo -e "${RED}Erreur: Fichier .env non trouvé${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Variables
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
MAINTENANCE_ENABLED=false
|
||||
|
||||
# Variables globales
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Charger .env en premier
|
||||
if [ ! -f .env ]; then
|
||||
echo "ERROR: Fichier .env introuvable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
# shellcheck disable=SC1091
|
||||
source .env
|
||||
set +a
|
||||
|
||||
# Configuration
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
LOCK_FILE="/tmp/nextcloud_backup.lock"
|
||||
|
||||
LOG_DIR="${LOG_DESTINATION:-./logs}"
|
||||
LOG_DIR="./logs"
|
||||
LOG_FILE="$LOG_DIR/backup_$(date +%Y%m%d_%H%M%S).log"
|
||||
|
||||
BACKUP_DIR="${BACKUP_DESTINATION:-./backups}"
|
||||
BACKUP_RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
|
||||
BACKUP_NAME="nextcloud_backup_$DATE"
|
||||
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
|
||||
MAINTENANCE_ENABLED=false
|
||||
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# Charger les fonctions communes (log avec couleurs)
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
if [ -z "${MYSQL_DATABASE:-}" ] || [ -z "${MYSQL_USER:-}" ] || [ -z "${MYSQL_PASSWORD:-}" ]; then
|
||||
@@ -97,13 +90,50 @@ log "INFO" "Log file: $LOG_FILE"
|
||||
|
||||
# Vérifier l'espace disque disponible
|
||||
log "INFO" "Vérification de l'espace disque..."
|
||||
REQUIRED_SPACE=$(du -sb ./data ./db 2>/dev/null | awk '{sum+=$1} END {print int(sum*1.2)}' || echo "0")
|
||||
AVAILABLE_SPACE=$(df -B1 "$BACKUP_DIR" | awk 'NR==2 {print $4}')
|
||||
|
||||
log "INFO" "Espace requis (estimé): $(numfmt --to=iec-i --suffix=B "$REQUIRED_SPACE" 2>/dev/null || echo "$REQUIRED_SPACE bytes")"
|
||||
# Calculer l'espace requis (taille data + db avec 20% de marge)
|
||||
# Calculer depuis le container avec les mêmes exclusions que le backup
|
||||
log "INFO" "Calcul de la taille réelle (avec exclusions)..."
|
||||
DATA_SIZE=$(docker-compose exec -T nextcloud du -sb \
|
||||
--exclude='appdata_*/preview' \
|
||||
--exclude='*/cache' \
|
||||
--exclude='*/thumbnails' \
|
||||
/var/www/html/data 2>/dev/null | awk '{print $1}' || echo "0")
|
||||
|
||||
# Note: On n'inclut pas la DB car mysqldump est beaucoup plus petit que les fichiers MySQL bruts
|
||||
# Typiquement: fichiers MySQL = 650MB → dump SQL = 500KB (compression ~99%)
|
||||
# On ajoute juste 10MB fixe pour DB + config + apps (généralement < 1MB au final)
|
||||
DB_ESTIMATE=10485760 # 10MB
|
||||
|
||||
# Additionner avec 20% de marge
|
||||
REQUIRED_SPACE=$(echo "$DATA_SIZE + $DB_ESTIMATE" | awk '{total=$1+$3; print int(total*1.2)}')
|
||||
|
||||
if [ -z "$REQUIRED_SPACE" ] || [ "$REQUIRED_SPACE" = "0" ]; then
|
||||
log "WARN" "Impossible de calculer l'espace requis, estimation à 500MB"
|
||||
REQUIRED_SPACE=500000000 # 500MB par défaut (plus réaliste que 2GB)
|
||||
fi
|
||||
|
||||
# Obtenir l'espace disponible (enlever les espaces/newlines)
|
||||
AVAILABLE_SPACE=$(df -B1 "$BACKUP_DIR" | awk 'NR==2 {print $4}' | tr -d '[:space:]')
|
||||
if [ -z "$AVAILABLE_SPACE" ]; then
|
||||
log "ERROR" "Impossible de déterminer l'espace disque disponible"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Calculer estimation avec compression
|
||||
# Note: Nextcloud a beaucoup de fichiers déjà compressés (images, PDFs)
|
||||
# donc la compression gzip est peu efficace (~30% au lieu de 90%)
|
||||
if [ "$REQUIRED_SPACE" -gt 0 ] 2>/dev/null; then
|
||||
ESTIMATED_COMPRESSED=$((REQUIRED_SPACE * 7 / 10)) # 70% de la taille (30% de compression)
|
||||
log "INFO" "Espace requis (non compressé + 20%): $(numfmt --to=iec-i --suffix=B "$REQUIRED_SPACE" 2>/dev/null || echo "$REQUIRED_SPACE bytes")"
|
||||
log "INFO" "Espace estimé après compression: $(numfmt --to=iec-i --suffix=B "$ESTIMATED_COMPRESSED" 2>/dev/null || echo "$ESTIMATED_COMPRESSED bytes")"
|
||||
else
|
||||
log "INFO" "Espace requis: Impossible à calculer (utilisation du fallback)"
|
||||
fi
|
||||
log "INFO" "Espace disponible: $(numfmt --to=iec-i --suffix=B "$AVAILABLE_SPACE" 2>/dev/null || echo "$AVAILABLE_SPACE bytes")"
|
||||
|
||||
if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then
|
||||
# Comparaison sécurisée avec validation
|
||||
if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ] 2>/dev/null; then
|
||||
log "ERROR" "Espace disque insuffisant"
|
||||
exit 1
|
||||
fi
|
||||
@@ -203,7 +233,6 @@ log "INFO" "Génération du checksum SHA256..."
|
||||
if cd "$BACKUP_DIR" && sha256sum "$BACKUP_NAME.tar.gz" >"$BACKUP_NAME.tar.gz.sha256"; then
|
||||
cd "$PROJECT_ROOT"
|
||||
CHECKSUM=$(cut -d' ' -f1 "$BACKUP_DIR/$BACKUP_NAME.tar.gz.sha256")
|
||||
log "INFO" "Checksum: $CHECKSUM"
|
||||
else
|
||||
cd "$PROJECT_ROOT"
|
||||
log "WARN" "Impossible de générer le checksum"
|
||||
|
||||
@@ -8,11 +8,9 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Couleurs pour l'output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
# Charger les couleurs depuis common.sh
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
# Compteurs
|
||||
CHECKS_PASSED=0
|
||||
@@ -154,10 +152,18 @@ echo ""
|
||||
|
||||
# 6. Vérifier Redis
|
||||
echo "▶ Cache Redis:"
|
||||
if docker-compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
||||
check_ok "Redis répond"
|
||||
if [ -n "${REDIS_HOST_PASSWORD:-}" ]; then
|
||||
if docker-compose exec -T redis redis-cli -a "$REDIS_HOST_PASSWORD" ping 2>/dev/null | grep -q "PONG"; then
|
||||
check_ok "Redis répond (avec authentification)"
|
||||
else
|
||||
check_fail "Redis ne répond pas ou mot de passe incorrect"
|
||||
fi
|
||||
else
|
||||
check_fail "Redis ne répond pas"
|
||||
if docker-compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
||||
check_ok "Redis répond (sans authentification)"
|
||||
else
|
||||
check_fail "Redis ne répond pas"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
@@ -8,21 +8,15 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Configuration des logs
|
||||
LOG_DIR="./logs"
|
||||
LOG_FILE="$LOG_DIR/recover_$(date +%Y%m%d_%H%M%S).log"
|
||||
|
||||
# Créer le dossier de logs
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# Fonction de logging
|
||||
log() {
|
||||
local level="$1"
|
||||
shift
|
||||
local message="$*"
|
||||
local timestamp
|
||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
||||
}
|
||||
# Charger les fonctions communes (log avec couleurs)
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
log "INFO" "=== Script de récupération Nextcloud ==="
|
||||
log "INFO" "Log file: $LOG_FILE"
|
||||
|
||||
@@ -8,39 +8,33 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
LOG_DIR="./logs"
|
||||
LOG_FILE="$LOG_DIR/restore_$(date +%Y%m%d_%H%M%S).log"
|
||||
TEMP_DIR=""
|
||||
|
||||
# Créer le dossier de logs
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# Fonction de logging
|
||||
log() {
|
||||
local level="$1"
|
||||
shift
|
||||
local message="$*"
|
||||
local timestamp
|
||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Charger les variables d'environnement
|
||||
# Charger .env en premier
|
||||
if [ ! -f .env ]; then
|
||||
log "ERROR" "Fichier .env introuvable"
|
||||
echo "ERROR: Fichier .env introuvable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Charger .env de manière sécurisée
|
||||
set -a
|
||||
# shellcheck disable=SC1091
|
||||
source .env
|
||||
set +a
|
||||
|
||||
# Configuration des logs
|
||||
LOG_DIR="./logs"
|
||||
LOG_FILE="$LOG_DIR/restore_$(date +%Y%m%d_%H%M%S).log"
|
||||
TEMP_DIR=""
|
||||
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# Charger les fonctions communes (log avec couleurs)
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
# 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}"
|
||||
if [ -z "${MYSQL_USER:-}" ] || [ -z "${MYSQL_PASSWORD:-}" ] || [ -z "${MYSQL_DATABASE:-}" ]; then
|
||||
log "ERROR" "Variables MySQL non définies dans .env"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier les arguments
|
||||
if [ -z "${1:-}" ]; then
|
||||
|
||||
@@ -8,23 +8,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Configuration des logs
|
||||
LOG_DIR="./logs"
|
||||
LOG_FILE="$LOG_DIR/update_$(date +%Y%m%d_%H%M%S).log"
|
||||
MAINTENANCE_ENABLED=false
|
||||
COMPOSE_BACKUP=""
|
||||
|
||||
# Créer le dossier de logs
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# Fonction de logging
|
||||
log() {
|
||||
local level="$1"
|
||||
shift
|
||||
local message="$*"
|
||||
local timestamp
|
||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
||||
}
|
||||
# Charger les fonctions communes (log avec couleurs)
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
|
||||
# Fonction de nettoyage en cas d'erreur
|
||||
cleanup() {
|
||||
|
||||
Reference in New Issue
Block a user