Ajouter backups_gitea.sh
This commit is contained in:
296
backups_gitea.sh
Normal file
296
backups_gitea.sh
Normal file
@@ -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 "$@"
|
||||||
Reference in New Issue
Block a user