Compare commits
7 Commits
58bc9a47cc
...
b693ed1364
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b693ed1364 | ||
|
|
dd27bdebb5 | ||
|
|
fcc60226ca | ||
|
|
fb2a3585d4 | ||
|
|
2ed5314537 | ||
|
|
85ed35923c | ||
|
|
f3c74de015 |
@@ -1,46 +1,39 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ============================================
|
# scripts/backup.sh - Backup complet Nextcloud
|
||||||
# Script de sauvegarde Nextcloud
|
|
||||||
# ============================================
|
|
||||||
# Ce script crée une sauvegarde complète de:
|
|
||||||
# - Données utilisateur
|
|
||||||
# - Données utilisateur
|
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
RED='\033[0;31m'
|
# Variables globales
|
||||||
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
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
cd "$PROJECT_ROOT"
|
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"
|
LOCK_FILE="/tmp/nextcloud_backup.lock"
|
||||||
|
LOG_DIR="./logs"
|
||||||
LOG_DIR="${LOG_DESTINATION:-./logs}"
|
|
||||||
LOG_FILE="$LOG_DIR/backup_$(date +%Y%m%d_%H%M%S).log"
|
LOG_FILE="$LOG_DIR/backup_$(date +%Y%m%d_%H%M%S).log"
|
||||||
|
|
||||||
BACKUP_DIR="${BACKUP_DESTINATION:-./backups}"
|
BACKUP_DIR="${BACKUP_DESTINATION:-./backups}"
|
||||||
BACKUP_RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
|
BACKUP_RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
|
||||||
BACKUP_NAME="nextcloud_backup_$DATE"
|
BACKUP_NAME="nextcloud_backup_$DATE"
|
||||||
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
|
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"
|
source "$SCRIPT_DIR/common.sh"
|
||||||
|
|
||||||
if [ -z "${MYSQL_DATABASE:-}" ] || [ -z "${MYSQL_USER:-}" ] || [ -z "${MYSQL_PASSWORD:-}" ]; then
|
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
|
# Vérifier l'espace disque disponible
|
||||||
log "INFO" "Vérification de l'espace disque..."
|
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")"
|
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"
|
log "ERROR" "Espace disque insuffisant"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
if cd "$BACKUP_DIR" && sha256sum "$BACKUP_NAME.tar.gz" >"$BACKUP_NAME.tar.gz.sha256"; then
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
CHECKSUM=$(cut -d' ' -f1 "$BACKUP_DIR/$BACKUP_NAME.tar.gz.sha256")
|
CHECKSUM=$(cut -d' ' -f1 "$BACKUP_DIR/$BACKUP_NAME.tar.gz.sha256")
|
||||||
log "INFO" "Checksum: $CHECKSUM"
|
|
||||||
else
|
else
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
log "WARN" "Impossible de générer le checksum"
|
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)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
# Couleurs pour l'output
|
# Charger les couleurs depuis common.sh
|
||||||
RED='\033[0;31m'
|
# shellcheck disable=SC1091
|
||||||
GREEN='\033[0;32m'
|
source "$SCRIPT_DIR/common.sh"
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Compteurs
|
# Compteurs
|
||||||
CHECKS_PASSED=0
|
CHECKS_PASSED=0
|
||||||
@@ -154,11 +152,19 @@ echo ""
|
|||||||
|
|
||||||
# 6. Vérifier Redis
|
# 6. Vérifier Redis
|
||||||
echo "▶ Cache Redis:"
|
echo "▶ Cache Redis:"
|
||||||
|
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
|
||||||
if docker-compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
if docker-compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
||||||
check_ok "Redis répond"
|
check_ok "Redis répond (sans authentification)"
|
||||||
else
|
else
|
||||||
check_fail "Redis ne répond pas"
|
check_fail "Redis ne répond pas"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|||||||
@@ -8,21 +8,15 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
# Configuration des logs
|
||||||
LOG_DIR="./logs"
|
LOG_DIR="./logs"
|
||||||
LOG_FILE="$LOG_DIR/recover_$(date +%Y%m%d_%H%M%S).log"
|
LOG_FILE="$LOG_DIR/recover_$(date +%Y%m%d_%H%M%S).log"
|
||||||
|
|
||||||
# Créer le dossier de logs
|
|
||||||
mkdir -p "$LOG_DIR"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
# Fonction de logging
|
# Charger les fonctions communes (log avec couleurs)
|
||||||
log() {
|
# shellcheck disable=SC1091
|
||||||
local level="$1"
|
source "$SCRIPT_DIR/common.sh"
|
||||||
shift
|
|
||||||
local message="$*"
|
|
||||||
local timestamp
|
|
||||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
||||||
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
|
||||||
}
|
|
||||||
|
|
||||||
log "INFO" "=== Script de récupération Nextcloud ==="
|
log "INFO" "=== Script de récupération Nextcloud ==="
|
||||||
log "INFO" "Log file: $LOG_FILE"
|
log "INFO" "Log file: $LOG_FILE"
|
||||||
|
|||||||
@@ -8,39 +8,33 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
LOG_DIR="./logs"
|
# Charger .env en premier
|
||||||
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
|
|
||||||
if [ ! -f .env ]; then
|
if [ ! -f .env ]; then
|
||||||
log "ERROR" "Fichier .env introuvable"
|
echo "ERROR: Fichier .env introuvable"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Charger .env de manière sécurisée
|
|
||||||
set -a
|
set -a
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
source .env
|
source .env
|
||||||
set +a
|
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
|
# Vérifier les variables requises
|
||||||
: "${MYSQL_USER:?Variable MYSQL_USER non définie}"
|
if [ -z "${MYSQL_USER:-}" ] || [ -z "${MYSQL_PASSWORD:-}" ] || [ -z "${MYSQL_DATABASE:-}" ]; then
|
||||||
: "${MYSQL_PASSWORD:?Variable MYSQL_PASSWORD non définie}"
|
log "ERROR" "Variables MySQL non définies dans .env"
|
||||||
: "${MYSQL_DATABASE:?Variable MYSQL_DATABASE non définie}"
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Vérifier les arguments
|
# Vérifier les arguments
|
||||||
if [ -z "${1:-}" ]; then
|
if [ -z "${1:-}" ]; then
|
||||||
|
|||||||
@@ -8,23 +8,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
# Configuration des logs
|
||||||
LOG_DIR="./logs"
|
LOG_DIR="./logs"
|
||||||
LOG_FILE="$LOG_DIR/update_$(date +%Y%m%d_%H%M%S).log"
|
LOG_FILE="$LOG_DIR/update_$(date +%Y%m%d_%H%M%S).log"
|
||||||
MAINTENANCE_ENABLED=false
|
MAINTENANCE_ENABLED=false
|
||||||
COMPOSE_BACKUP=""
|
COMPOSE_BACKUP=""
|
||||||
|
|
||||||
# Créer le dossier de logs
|
|
||||||
mkdir -p "$LOG_DIR"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
# Fonction de logging
|
# Charger les fonctions communes (log avec couleurs)
|
||||||
log() {
|
# shellcheck disable=SC1091
|
||||||
local level="$1"
|
source "$SCRIPT_DIR/common.sh"
|
||||||
shift
|
|
||||||
local message="$*"
|
|
||||||
local timestamp
|
|
||||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
||||||
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fonction de nettoyage en cas d'erreur
|
# Fonction de nettoyage en cas d'erreur
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
|||||||
Reference in New Issue
Block a user