#!/bin/bash # ============================================ # Script de restauration Gitea # ============================================ # Ce script restaure une sauvegarde complète de Gitea # ATTENTION: Cette opération est destructive! 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 # Vérifier qu'un fichier de sauvegarde a été fourni if [ -z "$1" ]; then echo -e "${RED}Erreur: Aucun fichier de sauvegarde spécifié${NC}" echo "Usage: $0 " echo "Exemple: $0 backups/gitea_backup_20240101_120000.tar.gz" exit 1 fi BACKUP_FILE="$1" # Vérifier que le fichier existe if [ ! -f "$BACKUP_FILE" ]; then echo -e "${RED}Erreur: Le fichier $BACKUP_FILE n'existe pas${NC}" exit 1 fi # Vérifier que c'est bien un fichier gzip if ! file "$BACKUP_FILE" | grep -q "gzip compressed"; then echo -e "${RED}Erreur: Le fichier n'est pas une archive gzip valide${NC}" exit 1 fi # Validation du chemin (sécurité contre path traversal) BACKUP_FILE=$(realpath "$BACKUP_FILE") if [[ "$BACKUP_FILE" == *".."* ]]; then echo -e "${RED}Erreur: Chemin invalide (path traversal détecté)${NC}" exit 1 fi # Charger les variables d'environnement if [ -f .env ]; then source .env else echo -e "${RED}Erreur: Fichier .env non trouvé${NC}" exit 1 fi # 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 # Variables TEMP_DIR=$(mktemp -d) BACKUP_NAME=$(basename "$BACKUP_FILE" .tar.gz) # Fonction de nettoyage 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 ou d'interruption trap cleanup EXIT INT TERM echo -e "${RED}=== ATTENTION: Restauration de Gitea ===${NC}" echo "Fichier de sauvegarde: $BACKUP_FILE" echo -e "${RED}Cette opération va ÉCRASER toutes les données actuelles!${NC}" echo "" read -p "Êtes-vous sûr de vouloir continuer? (oui/non) " -r if [[ ! $REPLY =~ ^[Oo][Uu][Ii]$ ]]; then echo "Restauration annulée." exit 0 fi echo -e "${GREEN}=== Début de la restauration ===${NC}" echo -e "${YELLOW}[1/5] Extraction de l'archive...${NC}" tar xzf "$BACKUP_FILE" -C "$TEMP_DIR" # Trouver le répertoire de sauvegarde BACKUP_DIR=$(find "$TEMP_DIR" -maxdepth 1 -type d -name "gitea_backup_*" | head -n 1) if [ -z "$BACKUP_DIR" ]; then echo -e "${RED}Erreur: Structure de sauvegarde invalide${NC}" exit 1 fi # Vérifier que les fichiers nécessaires existent if [ ! -f "$BACKUP_DIR/database.dump" ] || [ ! -f "$BACKUP_DIR/gitea_data.tar.gz" ]; then echo -e "${RED}Erreur: Fichiers de sauvegarde manquants${NC}" exit 1 fi echo -e "${GREEN}✓ Archive extraite${NC}" echo -e "${YELLOW}[2/5] Arrêt des services...${NC}" docker compose down echo -e "${GREEN}✓ Services arrêtés${NC}" echo -e "${YELLOW}[3/5] Démarrage de la base de données...${NC}" docker compose up -d db echo "Attente du démarrage de PostgreSQL..." sleep 10 # Attendre que PostgreSQL soit prêt MAX_TRIES=30 COUNTER=0 until docker compose exec -T db pg_isready -U "$POSTGRES_USER" > /dev/null 2>&1; do COUNTER=$((COUNTER + 1)) if [ $COUNTER -gt $MAX_TRIES ]; then echo -e "${RED}Erreur: PostgreSQL ne démarre pas${NC}" exit 1 fi echo "En attente de PostgreSQL... ($COUNTER/$MAX_TRIES)" sleep 2 done echo -e "${GREEN}✓ PostgreSQL prêt${NC}" echo -e "${YELLOW}[4/5] Restauration de la base de données...${NC}" # Supprimer et recréer la base de données export PGPASSWORD="$POSTGRES_PASSWORD" docker compose exec -T db psql -U "$POSTGRES_USER" -d postgres -c "DROP DATABASE IF EXISTS $POSTGRES_DATABASE;" docker compose exec -T db psql -U "$POSTGRES_USER" -d postgres -c "CREATE DATABASE $POSTGRES_DATABASE OWNER $POSTGRES_USER;" # Restaurer le dump docker compose exec -T db pg_restore \ -U "$POSTGRES_USER" \ -d "$POSTGRES_DATABASE" \ --clean \ --if-exists \ --no-owner \ --no-acl \ < "$BACKUP_DIR/database.dump" echo -e "${GREEN}✓ Base de données restaurée${NC}" echo -e "${YELLOW}[5/5] Restauration des données Gitea...${NC}" # Démarrer Gitea docker compose up -d gitea redis # Attendre que Gitea soit prêt echo "Attente du démarrage de Gitea..." sleep 15 # Arrêter temporairement Gitea pour la restauration des fichiers docker compose stop gitea # Nettoyer les données existantes if [ -d "./data" ]; then echo "Suppression des anciennes données..." rm -rf ./data/* fi # Extraire les données depuis l'archive mkdir -p ./data tar xzf "$BACKUP_DIR/gitea_data.tar.gz" -C ./data echo -e "${GREEN}✓ Données restaurées${NC}" echo -e "${YELLOW}Redémarrage de tous les services...${NC}" docker compose up -d # Attendre que les services soient prêts sleep 10 MAX_TRIES=30 COUNTER=0 until docker compose ps | grep -q "gitea.*running"; do COUNTER=$((COUNTER + 1)) if [ $COUNTER -gt $MAX_TRIES ]; then echo -e "${YELLOW}Avertissement: Gitea met du temps à démarrer${NC}" break fi echo "En attente de Gitea... ($COUNTER/$MAX_TRIES)" sleep 2 done echo -e "${GREEN}=== Restauration terminée avec succès ===${NC}" echo "Gitea devrait être accessible sur: http://localhost:3000" echo "" echo "Vérifications recommandées:" echo " - Vérifier l'accès web" echo " - Tester l'authentification" echo " - Vérifier les dépôts" echo " - Consulter les logs: docker compose logs -f gitea"