diff --git a/backups_gitea.sh b/backups_gitea.sh new file mode 100644 index 0000000..3694601 --- /dev/null +++ b/backups_gitea.sh @@ -0,0 +1,296 @@ +#!/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 "$@"