#!/bin/bash # ============================================ # Script de sauvegarde Gitea # ============================================ # Ce script crée une sauvegarde complète de: # - Base de données PostgreSQL # - Dépôts Git # - Configuration Gitea # - Données utilisateur set -e # Arrêter en cas d'erreur # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Charger les variables d'environnement if [ -f .env ]; then source .env else echo -e "${RED}Erreur: Fichier .env non trouvé${NC}" exit 1 fi # Variables BACKUP_DIR="./backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_NAME="gitea_backup_${TIMESTAMP}" TEMP_DIR="${BACKUP_DIR}/${BACKUP_NAME}" RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-7} # Vérifier que les variables nécessaires sont définies if [ -z "$POSTGRES_DATABASE" ] || [ -z "$POSTGRES_USER" ] || [ -z "$POSTGRES_PASSWORD" ]; then echo -e "${RED}Erreur: Variables PostgreSQL non définies dans .env${NC}" exit 1 fi # Fonction de nettoyage en cas d'erreur cleanup() { if [ -d "$TEMP_DIR" ]; then echo -e "${YELLOW}Nettoyage des fichiers temporaires...${NC}" rm -rf "$TEMP_DIR" fi } # Piège pour nettoyer en cas d'erreur trap cleanup EXIT echo -e "${GREEN}=== Début de la sauvegarde Gitea ===${NC}" echo "Timestamp: $TIMESTAMP" # Créer les répertoires si nécessaire mkdir -p "$BACKUP_DIR" mkdir -p "$TEMP_DIR" # Vérifier que les conteneurs sont en cours d'exécution if ! docker compose ps | grep -q "gitea.*running"; then echo -e "${RED}Erreur: Le conteneur Gitea n'est pas en cours d'exécution${NC}" exit 1 fi echo -e "${YELLOW}[1/4] Sauvegarde de la base de données PostgreSQL...${NC}" # Exporter la base de données export PGPASSWORD="$POSTGRES_PASSWORD" docker compose exec -T db pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DATABASE" \ --format=custom \ --compress=9 \ --no-owner \ --no-acl \ > "${TEMP_DIR}/database.dump" if [ ! -s "${TEMP_DIR}/database.dump" ]; then echo -e "${RED}Erreur: Le dump de la base de données est vide${NC}" exit 1 fi echo -e "${GREEN}✓ Base de données sauvegardée${NC}" echo -e "${YELLOW}[2/4] Sauvegarde des dépôts Git et données...${NC}" # Créer une archive des dépôts et données docker compose exec -T gitea tar czf - \ -C /data \ --exclude='./log' \ --exclude='./cache' \ --exclude='./tmp' \ --exclude='./sessions' \ . > "${TEMP_DIR}/gitea_data.tar.gz" if [ ! -s "${TEMP_DIR}/gitea_data.tar.gz" ]; then echo -e "${RED}Erreur: L'archive des données est vide${NC}" exit 1 fi echo -e "${GREEN}✓ Dépôts et données sauvegardés${NC}" echo -e "${YELLOW}[3/4] Création de l'archive finale...${NC}" # Créer l'archive finale cd "$BACKUP_DIR" tar czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}/" if [ ! -s "${BACKUP_NAME}.tar.gz" ]; then echo -e "${RED}Erreur: L'archive finale est vide${NC}" exit 1 fi # Supprimer le répertoire temporaire rm -rf "${BACKUP_NAME}" cd - > /dev/null BACKUP_SIZE=$(du -h "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" | cut -f1) echo -e "${GREEN}✓ Archive créée: ${BACKUP_NAME}.tar.gz (${BACKUP_SIZE})${NC}" echo -e "${YELLOW}[4/4] Nettoyage des anciennes sauvegardes (>$RETENTION_DAYS jours)...${NC}" # Supprimer les sauvegardes plus anciennes que RETENTION_DAYS find "$BACKUP_DIR" -name "gitea_backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete REMAINING_BACKUPS=$(find "$BACKUP_DIR" -name "gitea_backup_*.tar.gz" -type f | wc -l) echo -e "${GREEN}✓ Sauvegardes restantes: $REMAINING_BACKUPS${NC}" echo -e "${GREEN}=== Sauvegarde terminée avec succès ===${NC}" echo "Fichier: ${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" echo "Taille: $BACKUP_SIZE"