#!/bin/bash # Script de sauvegarde Gitea vers partage Samba via rsync # Auteur: Johnny + Claude # Date: $(date +%Y-%m-%d) set -euo pipefail # ============================================================================= # CONFIGURATION # ============================================================================= # Configuration Gitea GITEA_HOME="/var/lib/gitea" GITEA_DATA_DIR="/var/lib/gitea/data" GITEA_CONFIG_DIR="/etc/gitea" GITEA_REPOS_DIR="/var/lib/gitea/data/gitea-repositories" GITEA_USER="git" # Configuration du partage Samba SAMBA_SERVER="192.168.77.230" SAMBA_SHARE="/srv/samba/partage/Backups" SAMBA_USER="root" #backup_user MDP: B@ckup*2025! # Configuration SSH SSH_KEY_PATH="$HOME/.ssh/gitea" SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR" # Configuration de sauvegarde BACKUP_BASE_DIR="/tmp/gitea_backup_$(date +%Y%m%d_%H%M%S)" REMOTE_BACKUP_DIR="gitea_backups" LOG_FILE="/var/log/gitea_backup.log" RETENTION_DAYS=30 # ============================================================================= # FONCTIONS UTILITAIRES # ============================================================================= log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } error_exit() { log "ERREUR: $1" exit 1 } check_root() { if [[ $EUID -ne 0 ]]; then error_exit "Ce script doit être exécuté en tant que root" fi } # ============================================================================= # INSTALLATION DES DÉPENDANCES # ============================================================================= install_dependencies() { log "Vérification et installation des dépendances..." # Détecter la distribution if [[ -f /etc/debian_version ]]; then DISTRO="debian" PKG_MANAGER="apt-get" PACKAGES="rsync samba-client cifs-utils openssh-client" elif [[ -f /etc/redhat-release ]]; then DISTRO="redhat" PKG_MANAGER="yum" PACKAGES="rsync cifs-utils openssh-clients" else error_exit "Distribution non supportée" fi log "Distribution détectée: $DISTRO" # Mise à jour du cache des paquets if [[ "$DISTRO" == "debian" ]]; then apt-get update -qq fi # Installation des paquets manquants for package in $PACKAGES; do if [[ "$DISTRO" == "debian" ]]; then if ! dpkg -l | grep -q "^ii $package "; then log "Installation de $package..." apt-get install -y -qq "$package" else log "$package est déjà installé" fi elif [[ "$DISTRO" == "redhat" ]]; then if ! rpm -q "$package" >/dev/null 2>&1; then log "Installation de $package..." yum install -y "$package" else log "$package est déjà installé" fi fi done } # ============================================================================= # GESTION DES CERTIFICATS SSH # ============================================================================= setup_ssh_key() { log "Configuration de la clé SSH ED25519..." if [[ ! -f "$SSH_KEY_PATH" ]]; then log "Création de la clé SSH ED25519..." ssh-keygen -t ed25519 -f "$SSH_KEY_PATH" -N "" -C "gitea-backup-$(hostname)" chmod 600 "$SSH_KEY_PATH" chmod 644 "${SSH_KEY_PATH}.pub" log "Clé SSH créée: $SSH_KEY_PATH" log "Clé publique: ${SSH_KEY_PATH}.pub" echo log "IMPORTANT: Vous devez copier cette clé publique sur le serveur distant:" log "==========================================" cat "${SSH_KEY_PATH}.pub" log "==========================================" echo log "Commande pour copier la clé sur le serveur distant:" log "ssh-copy-id -i $SSH_KEY_PATH ${SAMBA_USER}@${SAMBA_SERVER}" echo read -p "Appuyez sur Entrée une fois la clé configurée sur le serveur distant..." else log "Clé SSH existante trouvée: $SSH_KEY_PATH" fi } test_ssh_connection() { log "Test de la connexion SSH..." if ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" "echo 'Connexion SSH réussie'" 2>/dev/null; then log "Connexion SSH: OK" else error_exit "Impossible de se connecter via SSH. Vérifiez la configuration de la clé." fi } # ============================================================================= # FONCTIONS DE SAUVEGARDE # ============================================================================= stop_gitea() { log "Arrêt de Gitea..." if systemctl is-active --quiet gitea; then systemctl stop gitea log "Gitea arrêté" return 0 else log "Gitea n'était pas en cours d'exécution" return 1 fi } start_gitea() { log "Redémarrage de Gitea..." systemctl start gitea if systemctl is-active --quiet gitea; then log "Gitea redémarré avec succès" else error_exit "Échec du redémarrage de Gitea" fi } create_backup() { log "Création du répertoire de sauvegarde temporaire: $BACKUP_BASE_DIR" mkdir -p "$BACKUP_BASE_DIR" # Sauvegarde des données Gitea if [[ -d "$GITEA_DATA_DIR" ]]; then log "Sauvegarde des données Gitea..." rsync -av --progress "$GITEA_DATA_DIR/" "$BACKUP_BASE_DIR/data/" fi # Sauvegarde de la configuration if [[ -d "$GITEA_CONFIG_DIR" ]]; then log "Sauvegarde de la configuration Gitea..." rsync -av --progress "$GITEA_CONFIG_DIR/" "$BACKUP_BASE_DIR/config/" fi # Sauvegarde des dépôts (si différent du répertoire data) if [[ -d "$GITEA_REPOS_DIR" && "$GITEA_REPOS_DIR" != "$GITEA_DATA_DIR"* ]]; then log "Sauvegarde des dépôts Gitea..." rsync -av --progress "$GITEA_REPOS_DIR/" "$BACKUP_BASE_DIR/repositories/" fi # Création d'un fichier d'information sur la sauvegarde cat > "$BACKUP_BASE_DIR/backup_info.txt" << EOF Sauvegarde Gitea ================ Date: $(date) Serveur: $(hostname) Version script: 1.0 Répertoires sauvegardés: - Données: $GITEA_DATA_DIR - Configuration: $GITEA_CONFIG_DIR - Dépôts: $GITEA_REPOS_DIR EOF log "Sauvegarde locale créée dans: $BACKUP_BASE_DIR" } sync_to_remote() { log "Synchronisation vers le serveur distant..." # Création du répertoire distant si nécessaire ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" \ "mkdir -p ${SAMBA_SHARE}/${REMOTE_BACKUP_DIR}/$(date +%Y/%m)" # Synchronisation des fichiers REMOTE_PATH="${SAMBA_USER}@${SAMBA_SERVER}:${SAMBA_SHARE}/${REMOTE_BACKUP_DIR}/$(date +%Y/%m)/gitea_backup_$(date +%Y%m%d_%H%M%S)/" log "Envoi vers: $REMOTE_PATH" rsync -avz --progress --delete \ -e "ssh -i $SSH_KEY_PATH $SSH_OPTIONS" \ "$BACKUP_BASE_DIR/" \ "$REMOTE_PATH" log "Synchronisation terminée" } cleanup_local() { log "Nettoyage des fichiers temporaires..." if [[ -d "$BACKUP_BASE_DIR" ]]; then rm -rf "$BACKUP_BASE_DIR" log "Répertoire temporaire supprimé: $BACKUP_BASE_DIR" fi } cleanup_remote() { log "Nettoyage des anciennes sauvegardes (plus de $RETENTION_DAYS jours)..." ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" \ "find ${SAMBA_SHARE}/${REMOTE_BACKUP_DIR} -type d -name 'gitea_backup_*' -mtime +${RETENTION_DAYS} -exec rm -rf {} + 2>/dev/null || true" log "Nettoyage des anciennes sauvegardes terminé" } # ============================================================================= # FONCTION PRINCIPALE # ============================================================================= main() { log "=== DÉBUT DE LA SAUVEGARDE GITEA ===" # Vérifications préliminaires check_root # Installation des dépendances install_dependencies # Configuration SSH setup_ssh_key test_ssh_connection # Variables pour suivre l'état de Gitea GITEA_WAS_RUNNING=false # Gestion des erreurs avec nettoyage trap 'cleanup_local; if [[ "$GITEA_WAS_RUNNING" == "true" ]]; then start_gitea; fi' EXIT ERR # Arrêt de Gitea pour une sauvegarde cohérente if stop_gitea; then GITEA_WAS_RUNNING=true fi # Création de la sauvegarde locale create_backup # Redémarrage de Gitea dès que possible if [[ "$GITEA_WAS_RUNNING" == "true" ]]; then start_gitea GITEA_WAS_RUNNING=false fi # Synchronisation vers le serveur distant sync_to_remote # Nettoyage cleanup_remote cleanup_local log "=== SAUVEGARDE GITEA TERMINÉE AVEC SUCCÈS ===" } # ============================================================================= # POINT D'ENTRÉE # ============================================================================= # Création du fichier de log si nécessaire mkdir -p "$(dirname "$LOG_FILE")" touch "$LOG_FILE" # Lancement du script principal main "$@"