diff --git a/README.md b/README.md index f969e05..1577838 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ -# Scripts Gitea — Auto-Update, Backup, Restore & Déploiement Cron +# Docker Scripts — Auto-Update, Backup, Restore & Déploiement Cron -Solution complète pour la maintenance automatisée de Gitea Docker : -backup, mise à jour, restauration et déploiement. +Solution complète et générique pour la maintenance automatisée d'applications +Docker (Gitea, ou toute autre app MySQL + volumes) : backup, mise à jour, +restauration et déploiement. + +> **🔄 Réutilisable** : changez `DOCKER_APP_NAME=monapp` pour adapter à +> n'importe quelle stack Docker (MySQL + volumes). --- @@ -9,13 +13,13 @@ backup, mise à jour, restauration et déploiement. ``` gitea-scripts/ -├── setup.sh ← 🚀 Installateur tout-en-un -├── gitea-scripts.conf ← ⚙️ Configuration unifiée -├── gitea-backup.sh ← 💾 Backup complet (DB + volumes + config) -├── gitea-auto-update.sh ← 🔄 Mise à jour automatique -├── restore.sh ← ♻️ Restauration standalone -├── install_cron.sh ← 🕐 Gestion des crons -└── docker-compose.yml ← 🐳 Stack Docker de référence +├── setup.sh ← 🚀 Installateur tout-en-un +├── docker-scripts.conf ← ⚙️ Configuration unifiée (DOCKER_APP_NAME) +├── docker-backup.sh ← 💾 Backup complet (DB + volumes + config) +├── docker-auto-update.sh ← 🔄 Mise à jour automatique +├── restore.sh ← ♻️ Restauration standalone +├── install_cron.sh ← 🕐 Gestion des crons +└── docker-compose.yml ← 🐳 Stack Docker de référence ``` ### Architecture @@ -23,12 +27,12 @@ gitea-scripts/ ```mermaid flowchart TB subgraph Config["⚙️ Configuration"] - CONF["gitea-scripts.conf
Configuration unifiée"] + CONF["docker-scripts.conf
DOCKER_APP_NAME + HOSTNAME"] end subgraph Core["🛠️ Scripts core"] - BACKUP["gitea-backup.sh
💾 Backup quotidien"] - UPDATE["gitea-auto-update.sh
🔄 Mise à jour auto"] + BACKUP["docker-backup.sh
💾 Backup quotidien"] + UPDATE["docker-auto-update.sh
🔄 Mise à jour auto"] RESTORE["restore.sh
♻️ Restauration"] end @@ -69,13 +73,13 @@ flowchart TB flowchart LR subgraph Daily["📅 Quotidien (cron)"] direction TB - A["🕐 2h00"] --> B["gitea-backup.sh"] + A["🕐 2h00"] --> B["docker-backup.sh"] B --> C["💾 Backup DB + volumes"] C --> D["📝 Génère restore.sh"] C --> E["☁️ Sync distante"] C --> F["🧹 Nettoie vieux backups"] - G["🕐 4h00"] --> H["gitea-auto-update.sh"] + G["🕐 4h00"] --> H["docker-auto-update.sh"] H --> I{"Nouvelle image ?"} I -->|"Non"| J["✅ Rien à faire"] I -->|"Oui"| K["💾 Backup DB rapide"] diff --git a/gitea-auto-update.sh b/docker-auto-update.sh similarity index 81% rename from gitea-auto-update.sh rename to docker-auto-update.sh index 043cc45..ebc65fc 100644 --- a/gitea-auto-update.sh +++ b/docker-auto-update.sh @@ -1,44 +1,43 @@ #!/bin/bash # ============================================================================= -# gitea-auto-update.sh — Vérifie et applique les mises à jour Gitea Docker +# docker-auto-update.sh — Vérifie et applique les mises à jour d'une app Docker # ============================================================================= # À placer dans /usr/local/bin/ ou ~/scripts/ -# Cron recommandé : 0 4 * * * /usr/local/bin/gitea-auto-update.sh +# Cron recommandé : 0 4 * * * /usr/local/bin/docker-auto-update.sh # -# Paramètres configurables : voir gitea-scripts.conf +# Paramètres configurables : voir docker-scripts.conf +# Utilisation avec autre app : DOCKER_APP_NAME=monapp bash docker-auto-update.sh # ============================================================================= set -euo pipefail -<<<<<<< HEAD # ─── Charger la configuration commune ───────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/gitea-scripts.conf}" +CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/docker-scripts.conf}" if [[ -f "$CONFIG_FILE" ]]; then # shellcheck source=/dev/null source "$CONFIG_FILE" fi +# ─── Nom de l'application (défaut si pas dans la config) ───────────────────── +DOCKER_APP_NAME="${DOCKER_APP_NAME:-gitea}" + # ─── Configuration locale (après chargement conf, permet surcharge env) ────── -# Chemins et conteneurs -======= -# ─── Configuration (modifiable) ───────────────────────────────────────────── ->>>>>>> 63e7debb52659e8424039f6ef7c6f6fb7d29144e -COMPOSE_DIR="${COMPOSE_DIR:-$HOME/dev/git/outils/docker/gitea}" +COMPOSE_DIR="${COMPOSE_DIR:-$HOME/dev/git/outils/$DOCKER_APP_NAME}" COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" -APP_SERVICE="${APP_SERVICE:-gitea_server}" -APP_CONTAINER="${APP_CONTAINER:-gitea_server}" -DB_CONTAINER="${DB_CONTAINER:-gitea_db}" +APP_SERVICE="${APP_SERVICE:-${DOCKER_APP_NAME}_server}" +APP_CONTAINER="${APP_CONTAINER:-${DOCKER_APP_NAME}_server}" +DB_CONTAINER="${DB_CONTAINER:-${DOCKER_APP_NAME}_db}" IMAGE_NAME="${IMAGE_NAME:-gitea/gitea}" IMAGE_TAG="${IMAGE_TAG:-latest}" # Base de données -DB_NAME="${DB_NAME:-gitea}" +DB_NAME="${DB_NAME:-$DOCKER_APP_NAME}" DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-gitea}" # Logs -LOG_FILE="${LOG_FILE:-/var/log/gitea-update.log}" +LOG_FILE="${LOG_FILE:-/var/log/${DOCKER_APP_NAME}-update.log}" LOG_DIR="$(dirname "$LOG_FILE")" # Notifications @@ -51,13 +50,10 @@ NTPY_TOPIC="${NTPY_TOPIC:-}" # Santé HEALTH_CHECK_URL="${HEALTH_CHECK_URL:-http://localhost:3000}" HEALTH_CHECK_TIMEOUT="${HEALTH_CHECK_TIMEOUT:-30}" -DB_CONTAINER="${DB_CONTAINER:-gitea_db}" -DB_NAME="${DB_NAME:-gitea}" -DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-gitea}" # Lock file LOCK_DIR="${LOCK_DIR:-/tmp}" -LOCK_FILE="${LOCK_DIR}/gitea-auto-update.lock" +LOCK_FILE="${LOCK_DIR}/${DOCKER_APP_NAME}-auto-update.lock" # ─── Prérequis : s'assurer que le dossier de log existe ────────────────────── mkdir -p "$LOG_DIR" 2>/dev/null || true @@ -81,7 +77,7 @@ notify() { ;; ntfy) if [[ -n "$NTPY_TOPIC" ]]; then - curl -s -H "Title: Gitea Update" -d "$msg" "https://ntfy.sh/$NTPY_TOPIC" > /dev/null 2>&1 || true + curl -s -H "Title: ${DOCKER_APP_NAME^} Update" -d "$msg" "https://ntfy.sh/$NTPY_TOPIC" > /dev/null 2>&1 || true fi ;; esac @@ -134,7 +130,7 @@ get_image_digest() { acquire_lock log "════════════════════════════════════════════════════════" -log "🔄 Début vérification mise à jour Gitea" +log "🔄 Début vérification mise à jour ${DOCKER_APP_NAME^}" # ─── Pré-vérifications ────────────────────────────────────────────────────── cd "$COMPOSE_DIR" || { log "❌ Répertoire $COMPOSE_DIR introuvable"; exit 1; } @@ -197,27 +193,20 @@ else fi # Backup rapide DB avant mise à jour -BACKUP_PRE_DIR="${BACKUP_PRE_DIR:-/tmp/gitea-pre-update-$(date +%Y%m%d-%H%M%S)}" +BACKUP_PRE_DIR="${BACKUP_PRE_DIR:-/tmp/${DOCKER_APP_NAME}-pre-update-$(date +%Y%m%d-%H%M%S)}" mkdir -p "$BACKUP_PRE_DIR" -<<<<<<< HEAD log "💾 Backup DB pré-update vers $BACKUP_PRE_DIR" if docker ps --format '{{.Names}}' | grep -q "^${DB_CONTAINER}$"; then docker exec "$DB_CONTAINER" mysqldump \ -u root -p"$DB_ROOT_PASSWORD" \ --single-transaction \ - "$DB_NAME" > "$BACKUP_PRE_DIR/gitea_db.sql" 2>/dev/null || { + "$DB_NAME" > "$BACKUP_PRE_DIR/${DOCKER_APP_NAME}_db.sql" 2>/dev/null || { log "⚠️ Backup pré-update DB échoué, on continue quand même" } else log "⚠️ Conteneur $DB_CONTAINER non trouvé — pas de backup pré-update" fi -======= -log "💾 Backup pré-update vers $BACKUP_PRE_DIR" -docker exec "$DB_CONTAINER" mysqldump -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" > "$BACKUP_PRE_DIR/gitea_db.sql" 2>/dev/null || { - log "⚠️ Backup pré-update DB échoué, on continue quand même" -} ->>>>>>> 63e7debb52659e8424039f6ef7c6f6fb7d29144e # Recréer le conteneur avec la nouvelle image log "🚀 Redémarrage du conteneur avec la nouvelle image..." @@ -235,7 +224,7 @@ UP_OUTPUT=$($DOCKER_COMPOSE -f "$COMPOSE_FILE" up -d "$APP_SERVICE" 2>&1) || { log "⚠️ Rollback impossible (pas d'image sauvegardée)" $DOCKER_COMPOSE -f "$COMPOSE_FILE" up -d "$APP_SERVICE" 2>&1 || true fi - notify "❌ GITEA UPDATE FAILED sur $(hostname) — rollback effectué" + notify "❌ ${DOCKER_APP_NAME^^} UPDATE FAILED sur $(hostname) — rollback effectué" exit 1 } @@ -250,35 +239,35 @@ HEALTH_OK=false for i in $(seq 1 "$HEALTH_CHECK_TIMEOUT"); do STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_CHECK_URL" 2>/dev/null || echo "000") if [[ "$STATUS" == "200" || "$STATUS" == "302" || "$STATUS" == "303" ]]; then - log "✅ Gitea répond (HTTP $STATUS) après ${i}s" + log "✅ ${DOCKER_APP_NAME^} répond (HTTP $STATUS) après ${i}s" HEALTH_OK=true break fi if [[ $i -eq "$HEALTH_CHECK_TIMEOUT" ]]; then - log "❌ Gitea ne répond pas après ${HEALTH_CHECK_TIMEOUT}s" - notify "⚠️ GITEA UPDATE : service lent à démarrer sur $(hostname) — vérifier" + log "❌ ${DOCKER_APP_NAME^} ne répond pas après ${HEALTH_CHECK_TIMEOUT}s" + notify "⚠️ ${DOCKER_APP_NAME^^} UPDATE : service lent à démarrer sur $(hostname) — vérifier" exit 1 fi sleep 1 done # ─── Rapport final ────────────────────────────────────────────────────────── -GITEA_VERSION=$(curl -s "$HEALTH_CHECK_URL/api/v1/version" 2>/dev/null | grep -oE '"version":"[^"]+"' | cut -d'"' -f4 || echo "inconnue") +APP_VERSION=$(curl -s "$HEALTH_CHECK_URL/api/v1/version" 2>/dev/null | grep -oE '"version":"[^"]+"' | cut -d'"' -f4 || echo "inconnue") log "✅ Mise à jour réussie !" -log "📋 Nouvelle version : $GITEA_VERSION" +log "📋 Nouvelle version : $APP_VERSION" log "📋 Ancien digest : ${OLD_DIGEST:-N/A}" log "📋 Nouveau digest : ${NEW_DIGEST:-N/A}" log "═══ Fin ───────────────────────────────────────────" -notify "✅ Gitea mis à jour vers $GITEA_VERSION sur $(hostname)" +notify "✅ ${DOCKER_APP_NAME^} mis à jour vers $APP_VERSION sur $(hostname)" -# ─── Nettoyage ciblé : seulement les vieilles images Gitea ────────────────── -log "🧹 Nettoyage des anciennes images Gitea..." -# Trouver toutes les images gitea/gitea sauf la dernière utilisée +# ─── Nettoyage ciblé : seulement les vieilles images de l'app ─────────────── +log "🧹 Nettoyage des anciennes images ${DOCKER_APP_NAME^}..." +# Trouver toutes les images de l'app sauf la dernière utilisée CURRENT_IMAGE_ID=$(docker image inspect "$FULL_IMAGE" --format '{{.ID}}' 2>/dev/null || echo "") if [[ -n "$CURRENT_IMAGE_ID" ]]; then - # Lister les images Gitea non taggées ou anciennes + # Lister les images de l'app non taggées ou anciennes docker images "$IMAGE_NAME" --format '{{.ID}} {{.Tag}}' 2>/dev/null | while read -r img_id img_tag; do if [[ "$img_id" != "$CURRENT_IMAGE_ID" ]] && [[ "$img_tag" != "$IMAGE_TAG" ]]; then log " 🗑️ Suppression ancienne image : $img_id ($img_tag)" diff --git a/gitea-backup.sh b/docker-backup.sh old mode 100755 new mode 100644 similarity index 100% rename from gitea-backup.sh rename to docker-backup.sh diff --git a/gitea-scripts.conf b/docker-scripts.conf similarity index 54% rename from gitea-scripts.conf rename to docker-scripts.conf index 1faa861..b66cb70 100644 --- a/gitea-scripts.conf +++ b/docker-scripts.conf @@ -1,47 +1,57 @@ # ============================================================================= -# gitea-scripts.conf — Configuration unifiée pour tous les scripts Gitea +# docker-scripts.conf — Configuration unifiée pour scripts Docker génériques # ============================================================================= -# Ce fichier est sourcé par tous les scripts (auto-update, backup, install_cron). +# Ce fichier est sourcé par tous les scripts (backup, auto-update, install_cron). # Les valeurs peuvent être surchargées par des variables d'environnement. +# +# Pour réutiliser avec une autre app Docker, changer DOCKER_APP_NAME : +# DOCKER_APP_NAME=monapp bash docker-backup.sh # ============================================================================= -# ─── Chemins ────────────────────────────────────────────────────────────────── +# ─── Identité ───────────────────────────────────────────────────────────────── +# Hôte : automatiquement détecté, surchargeable +HOSTNAME="${HOSTNAME:-$(hostname)}" + +# Nom de l'application Docker (définit tous les dérivés) +DOCKER_APP_NAME="${DOCKER_APP_NAME:-gitea}" + +# ─── Chemins (dérivés de DOCKER_APP_NAME et HOSTNAME) ───────────────────────── SCRIPTS_DIR="${SCRIPTS_DIR:-$HOME/scripts}" -COMPOSE_DIR="${COMPOSE_DIR:-$HOME/dev/git/outils/docker/gitea}" +COMPOSE_DIR="${COMPOSE_DIR:-$HOME/dev/git/outils/$DOCKER_APP_NAME}" COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" -BACKUP_DIR="${BACKUP_DIR:-/NFS/BACKUP/DOCKER/dev-prod/gitea}" +BACKUP_DIR="${BACKUP_DIR:-/NFS/BACKUP/DOCKER/$HOSTNAME/$DOCKER_APP_NAME}" LOCK_DIR="${LOCK_DIR:-/tmp}" -# ─── Conteneurs ─────────────────────────────────────────────────────────────── -APP_SERVICE="${APP_SERVICE:-gitea_server}" -APP_CONTAINER="${APP_CONTAINER:-gitea_server}" -DB_SERVICE="${DB_SERVICE:-gitea_db}" -DB_CONTAINER="${DB_CONTAINER:-gitea_db}" +# ─── Conteneurs (dérivés de DOCKER_APP_NAME) ────────────────────────────────── +APP_SERVICE="${APP_SERVICE:-${DOCKER_APP_NAME}_server}" +APP_CONTAINER="${APP_CONTAINER:-${DOCKER_APP_NAME}_server}" +DB_SERVICE="${DB_SERVICE:-${DOCKER_APP_NAME}_db}" +DB_CONTAINER="${DB_CONTAINER:-${DOCKER_APP_NAME}_db}" # ─── Image Docker ───────────────────────────────────────────────────────────── IMAGE_NAME="${IMAGE_NAME:-gitea/gitea}" IMAGE_TAG="${IMAGE_TAG:-latest}" -# ─── Base de données ───────────────────────────────────────────────────────── -DB_NAME="${DB_NAME:-gitea}" -DB_USER="${DB_USER:-gitea}" +# ─── Base de données (dérivés de DOCKER_APP_NAME) ───────────────────────────── +DB_NAME="${DB_NAME:-$DOCKER_APP_NAME}" +DB_USER="${DB_USER:-$DOCKER_APP_NAME}" DB_PASSWORD="${DB_PASSWORD:-chab30}" DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-gitea}" -# ─── Volumes Docker (chemins HÔTE) ──────────────────────────────────────────── -VOLUME_DATA="${VOLUME_DATA:-/DOCKER_CONFIG/gitea/data}" -VOLUME_MYSQL="${VOLUME_MYSQL:-/DOCKER_CONFIG/gitea/mysql}" +# ─── Volumes Docker - chemins HÔTE (dérivés de DOCKER_APP_NAME) ─────────────── +VOLUME_DATA="${VOLUME_DATA:-/DOCKER_CONFIG/$DOCKER_APP_NAME/data}" +VOLUME_MYSQL="${VOLUME_MYSQL:-/DOCKER_CONFIG/$DOCKER_APP_NAME/mysql}" # ─── URLs ───────────────────────────────────────────────────────────────────── HEALTH_CHECK_URL="${HEALTH_CHECK_URL:-http://localhost:3000}" HEALTH_CHECK_TIMEOUT="${HEALTH_CHECK_TIMEOUT:-30}" -# ─── Logs ───────────────────────────────────────────────────────────────────── +# ─── Logs (dérivés de DOCKER_APP_NAME) ──────────────────────────────────────── LOG_DIR="${LOG_DIR:-/var/log}" -UPDATE_LOG="${UPDATE_LOG:-$LOG_DIR/gitea-update.log}" -BACKUP_LOG="${BACKUP_LOG:-$LOG_DIR/gitea-backup.log}" -BACKUP_CRON_LOG="${BACKUP_CRON_LOG:-$LOG_DIR/gitea-backup-cron.log}" -UPDATE_CRON_LOG="${UPDATE_CRON_LOG:-$LOG_DIR/gitea-update-cron.log}" +UPDATE_LOG="${UPDATE_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-update.log}" +BACKUP_LOG="${BACKUP_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-backup.log}" +BACKUP_CRON_LOG="${BACKUP_CRON_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-backup-cron.log}" +UPDATE_CRON_LOG="${UPDATE_CRON_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-update-cron.log}" LOG_RETENTION_DAYS="${LOG_RETENTION_DAYS:-90}" # ─── Rétention backups ──────────────────────────────────────────────────────── @@ -69,7 +79,7 @@ REMOTE_BACKUP_USER="${REMOTE_BACKUP_USER:-}" REMOTE_BACKUP_PATH="${REMOTE_BACKUP_PATH:-}" REMOTE_BACKUP_SSH_KEY="${REMOTE_BACKUP_SSH_KEY:-$HOME/.ssh/id_rsa}" -# ─── Cron ───────────────────────────────────────────────────────────────────── +# ─── Cron (dérivés de DOCKER_APP_NAME) ──────────────────────────────────────── CRON_BACKUP_SCHEDULE="${CRON_BACKUP_SCHEDULE:-0 2 * * *}" CRON_UPDATE_SCHEDULE="${CRON_UPDATE_SCHEDULE:-0 4 * * *}" -CRON_MARKER="${CRON_MARKER:-# >>> GITEA SCRIPTS (managed by install_cron.sh) <<<}" +CRON_MARKER="${CRON_MARKER:-# >>> ${DOCKER_APP_NAME^^} SCRIPTS (managed by install_cron.sh) <<<}" diff --git a/install_cron.sh b/install_cron.sh index 97d1c41..69cfb57 100755 --- a/install_cron.sh +++ b/install_cron.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============================================================================= -# install_cron.sh — Installe les scripts Gitea dans la crontab +# install_cron.sh — Installe les scripts Docker dans la crontab # ============================================================================= # Usage : # bash install_cron.sh → Installation interactive @@ -9,30 +9,32 @@ # bash install_cron.sh --status → Vérifie si les crons sont actifs # bash install_cron.sh --dry-run → Affiche ce qui serait installé # -# Paramètres configurables : voir gitea-scripts.conf +# Paramètres configurables : voir docker-scripts.conf # ============================================================================= set -euo pipefail # ─── Charger la configuration commune ───────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/gitea-scripts.conf}" +CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/docker-scripts.conf}" if [[ -f "$CONFIG_FILE" ]]; then # shellcheck source=/dev/null source "$CONFIG_FILE" fi +DOCKER_APP_NAME="${DOCKER_APP_NAME:-gitea}" + # ─── Configuration locale ──────────────────────────────────────────────────── SCRIPTS_DIR="${SCRIPTS_DIR:-$HOME/scripts}" CRON_BACKUP_SCHEDULE="${CRON_BACKUP_SCHEDULE:-0 2 * * *}" CRON_UPDATE_SCHEDULE="${CRON_UPDATE_SCHEDULE:-0 4 * * *}" -BACKUP_SCRIPT="${BACKUP_SCRIPT:-gitea-backup.sh}" -UPDATE_SCRIPT="${UPDATE_SCRIPT:-gitea-auto-update.sh}" +BACKUP_SCRIPT="${BACKUP_SCRIPT:-docker-backup.sh}" +UPDATE_SCRIPT="${UPDATE_SCRIPT:-docker-auto-update.sh}" LOG_DIR="${LOG_DIR:-/var/log}" -BACKUP_LOG="${BACKUP_LOG:-$LOG_DIR/gitea-backup-cron.log}" -UPDATE_LOG="${UPDATE_LOG:-$LOG_DIR/gitea-update-cron.log}" -CRON_MARKER="${CRON_MARKER:-# >>> GITEA SCRIPTS (managed by install_cron.sh) <<<}" +BACKUP_LOG="${BACKUP_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-backup-cron.log}" +UPDATE_LOG="${UPDATE_LOG:-$LOG_DIR/${DOCKER_APP_NAME}-update-cron.log}" +CRON_MARKER="${CRON_MARKER:-# >>> ${DOCKER_APP_NAME^^} SCRIPTS (managed by install_cron.sh) <<<}" # Détection de l'utilisateur CRON_USER="${CRON_USER:-$USER}" @@ -54,7 +56,7 @@ Options : --force Installation sans confirmation --dry-run Affiche ce qui serait installé sans rien faire --uninstall Retire les scripts du cron - --status Vérifie l'état des crons Gitea + --status Vérifie l'état des crons --help Ce message Configuration (variables d'environnement) : @@ -85,8 +87,8 @@ check_prerequisites() { fi # Vérifier aussi la présence du fichier de config (optionnel mais recommandé) - if [[ ! -f "$SCRIPTS_DIR/gitea-scripts.conf" ]]; then - warn "Fichier de configuration introuvable : $SCRIPTS_DIR/gitea-scripts.conf" + if [[ ! -f "$SCRIPTS_DIR/docker-scripts.conf" ]]; then + warn "Fichier de configuration introuvable : $SCRIPTS_DIR/docker-scripts.conf" info "Les scripts utiliseront leurs valeurs par défaut" fi @@ -98,11 +100,11 @@ build_cron_block() { cat << CRON_BLOCK $CRON_MARKER -# Backup quotidien Gitea (DB + volumes) +# Backup quotidien (DB + volumes) $CRON_BACKUP_SCHEDULE $SCRIPTS_DIR/$BACKUP_SCRIPT >> $BACKUP_LOG 2>&1 -# Vérification mise à jour Gitea Docker +# Vérification mise à jour Docker $CRON_UPDATE_SCHEDULE $SCRIPTS_DIR/$UPDATE_SCRIPT >> $UPDATE_LOG 2>&1 -# >>> END GITEA SCRIPTS <<< +# >>> END ${DOCKER_APP_NAME^^} SCRIPTS <<< CRON_BLOCK } @@ -110,7 +112,7 @@ CRON_BLOCK show_status() { echo "" echo "════════════════════════════════════════════════════════" - echo "📊 ÉTAT DES CRONS GITEA" + echo "📊 ÉTAT DES CRONS" echo "════════════════════════════════════════════════════════" echo "" @@ -119,12 +121,12 @@ show_status() { # Vérifier présence du marqueur if echo "$current_cron" | grep -qF "$CRON_MARKER"; then - ok "Bloc Gitea trouvé dans la crontab de $CRON_USER" + ok "Bloc de scripts trouvé dans la crontab de $CRON_USER" echo "" echo "Entrées actives :" # Extraire toutes les lignes entre les marqueurs - echo "$current_cron" | sed -n "/$CRON_MARKER/,/>>> END GITEA SCRIPTS <<>> END ${DOCKER_APP_NAME^^} SCRIPTS </dev/null || { warn "Impossible de créer $LOG_DIR — les logs iront dans \$HOME" - BACKUP_LOG="$HOME/gitea-backup-cron.log" - UPDATE_LOG="$HOME/gitea-update-cron.log" + BACKUP_LOG="$HOME/${DOCKER_APP_NAME}-backup-cron.log" + UPDATE_LOG="$HOME/${DOCKER_APP_NAME}-update-cron.log" } elif [[ ! -w "$LOG_DIR" ]]; then warn "Pas de droit d'écriture sur $LOG_DIR — les logs iront dans \$HOME" - BACKUP_LOG="$HOME/gitea-backup-cron.log" - UPDATE_LOG="$HOME/gitea-update-cron.log" + BACKUP_LOG="$HOME/${DOCKER_APP_NAME}-backup-cron.log" + UPDATE_LOG="$HOME/${DOCKER_APP_NAME}-update-cron.log" fi # Lire la crontab actuelle @@ -237,7 +239,7 @@ do_install() { # Vérifier si déjà installé if echo "$current_cron" | grep -qF "$CRON_MARKER"; then - warn "Les crons Gitea sont déjà installés" + warn "Les crons sont déjà installés" info "Utilisez --uninstall pour les retirer d'abord, ou --force pour réinstaller" show_status exit 0 @@ -260,8 +262,8 @@ do_install() { echo "📋 RÉSUMÉ" echo "────────────────────────────────────────────────────────" echo "" - echo " 🕐 $CRON_BACKUP_SCHEDULE → Backup Gitea" - echo " 🕐 $CRON_UPDATE_SCHEDULE → Vérification màj Gitea" + echo " 🕐 $CRON_BACKUP_SCHEDULE → Backup" + echo " 🕐 $CRON_UPDATE_SCHEDULE → Vérification màj" echo "" echo " 📊 Logs :" echo " Backup : $BACKUP_LOG" @@ -303,7 +305,7 @@ do_dry_run() { do_uninstall() { echo "" echo "════════════════════════════════════════════════════════" - echo "🗑️ DÉSINSTALLATION DES CRONS GITEA" + echo "🗑️ DÉSINSTALLATION DES CRONS" echo "════════════════════════════════════════════════════════" echo "" @@ -311,13 +313,13 @@ do_uninstall() { current_cron=$(crontab -l 2>/dev/null || echo "") if ! echo "$current_cron" | grep -qF "$CRON_MARKER"; then - warn "Aucun cron Gitea trouvé — rien à désinstaller" + warn "Aucun cron trouvé — rien à désinstaller" exit 0 fi # Retirer le bloc entre les marqueurs local new_cron - new_cron=$(echo "$current_cron" | sed "/$CRON_MARKER/,/>>> END GITEA SCRIPTS <<>> END ${DOCKER_APP_NAME^^} SCRIPTS </dev/null || true - ok "Crontab vidée et crons Gitea retirés" + ok "Crontab vidée et crons retirés" else echo "$new_cron" | crontab - - ok "Crons Gitea retirés de la crontab de $CRON_USER" + ok "Crons retirés de la crontab de $CRON_USER" fi echo "" @@ -375,8 +377,8 @@ if [[ "$FORCE" != "true" ]]; then echo "" echo "Ce script va ajouter les entrées suivantes à la crontab de $CRON_USER :" echo "" - echo " $CRON_BACKUP_SCHEDULE → Backup Gitea" - echo " $CRON_UPDATE_SCHEDULE → Vérification màj Gitea" + echo " $CRON_BACKUP_SCHEDULE → Backup" + echo " $CRON_UPDATE_SCHEDULE → Vérification màj" echo "" read -p "Continuer ? [O/n] " -r REPLY if [[ ! "$REPLY" =~ ^[OoYy]?$ ]]; then diff --git a/restore.sh b/restore.sh index 8013473..af2af45 100644 --- a/restore.sh +++ b/restore.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============================================================================= -# restore.sh — Restauration Gitea depuis un backup +# restore.sh — Restauration d'application Docker depuis un backup # ============================================================================= # Usage : # bash restore.sh → Restauration interactive @@ -8,12 +8,23 @@ # bash restore.sh --dry-run → Vérification sans exécuter # # Exemples : -# bash restore.sh /NFS/BACKUP/DOCKER/dev-prod/gitea/gitea-backup-20260626-020000 -# bash restore.sh /NFS/BACKUP/DOCKER/dev-prod/gitea/gitea-backup-20260626-020000 --dry-run +# bash restore.sh /NFS/BACKUP/DOCKER/\$HOSTNAME/\${DOCKER_APP_NAME}/\${DOCKER_APP_NAME}-backup-20260626-020000 +# bash restore.sh /NFS/BACKUP/DOCKER/\$HOSTNAME/\${DOCKER_APP_NAME}/\${DOCKER_APP_NAME}-backup-20260626-020000 --dry-run # ============================================================================= set -euo pipefail +# ─── Charger la configuration commune ───────────────────────────────────────── +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/docker-scripts.conf}" + +if [[ -f "$CONFIG_FILE" ]]; then + # shellcheck source=/dev/null + source "$CONFIG_FILE" +fi + +DOCKER_APP_NAME="${DOCKER_APP_NAME:-gitea}" + # ─── Couleurs ─────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' ok() { echo -e " ${GREEN}✅${NC} $1"; } @@ -27,7 +38,7 @@ usage() { Usage: $0 [OPTIONS] Arguments : - chemin_backup Dossier du backup à restaurer (ex: gitea-backup-YYYYMMDD-HHMMSS) + chemin_backup Dossier du backup à restaurer (ex: ${DOCKER_APP_NAME}-backup-YYYYMMDD-HHMMSS) Options : --force Ne pas demander confirmation @@ -35,11 +46,11 @@ Options : --help Cette aide Variables d'environnement : - TARGET_COMPOSE_DIR Dossier docker-compose cible (défaut: ~/dev/git/outils/docker/gitea) - TARGET_VOLUME_DATA Volume data cible (défaut: /DOCKER_CONFIG/gitea/data) - TARGET_VOLUME_MYSQL Volume MySQL cible (défaut: /DOCKER_CONFIG/gitea/mysql) - DB_ROOT_PASSWORD Mot de passe root MySQL (défaut: gitea) - DB_NAME Nom base de données (défaut: gitea) + TARGET_COMPOSE_DIR Dossier docker-compose cible (défaut: ~/dev/git/outils/docker/\${DOCKER_APP_NAME}) + TARGET_VOLUME_DATA Volume data cible (défaut: /DOCKER_CONFIG/\${DOCKER_APP_NAME}/data) + TARGET_VOLUME_MYSQL Volume MySQL cible (défaut: /DOCKER_CONFIG/\${DOCKER_APP_NAME}/mysql) + DB_ROOT_PASSWORD Mot de passe root MySQL (défaut: \${DOCKER_APP_NAME}) + DB_NAME Nom base de données (défaut: \${DOCKER_APP_NAME}) EOF exit 0 } @@ -77,7 +88,7 @@ list_backups() { echo "Backups disponibles :" echo "─────────────────────" local count=0 - for d in "$dir"/gitea-backup-*; do + for d in "$dir"/${DOCKER_APP_NAME}-backup-*; do if [[ -d "$d" ]]; then count=$((count + 1)) local info_file="$d/backup-info.txt" @@ -128,7 +139,7 @@ done if [[ -z "$BACKUP_PATH" ]]; then # Chercher dans les emplacements courants FOUND=false - for search_dir in "/NFS/BACKUP/DOCKER/dev-prod/gitea" "$HOME/backups/gitea" "."; do + for search_dir in "/NFS/BACKUP/DOCKER/$HOSTNAME/$DOCKER_APP_NAME" "$HOME/backups/$DOCKER_APP_NAME" "."; do if [[ -d "$search_dir" ]]; then list_backups "$search_dir" && FOUND=true && break fi @@ -149,7 +160,7 @@ if [[ ! -d "$BACKUP_PATH" ]]; then err "Dossier de backup introuvable : $BACKUP_PATH" echo "" echo "Recherche de backups dans les emplacements standards..." - for search_dir in "/NFS/BACKUP/DOCKER/dev-prod/gitea" "$HOME/backups/gitea" "."; do + for search_dir in "/NFS/BACKUP/DOCKER/$HOSTNAME/$DOCKER_APP_NAME" "$HOME/backups/$DOCKER_APP_NAME" "."; do if [[ -d "$search_dir" ]]; then list_backups "$search_dir" break @@ -160,15 +171,15 @@ fi # Vérifier les fichiers requis MISSING_FILES=() -for required_file in "gitea-mysql.tar.gz" "gitea-data.tar.gz" "docker-compose.yml"; do +for required_file in "${DOCKER_APP_NAME}-mysql.tar.gz" "${DOCKER_APP_NAME}-data.tar.gz" "docker-compose.yml"; do if [[ ! -f "$BACKUP_PATH/$required_file" ]]; then MISSING_FILES+=("$required_file") fi done # Vérifier le dump SQL (compressé ou non) -if [[ ! -f "$BACKUP_PATH/gitea-db.sql.gz" ]] && [[ ! -f "$BACKUP_PATH/gitea-db.sql" ]]; then - MISSING_FILES+=("gitea-db.sql ou gitea-db.sql.gz") +if [[ ! -f "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql.gz" ]] && [[ ! -f "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql" ]]; then + MISSING_FILES+=("${DOCKER_APP_NAME}-db.sql ou ${DOCKER_APP_NAME}-db.sql.gz") fi if [[ ${#MISSING_FILES[@]} -gt 0 ]]; then @@ -177,27 +188,27 @@ if [[ ${#MISSING_FILES[@]} -gt 0 ]]; then err " - $f" done echo "" - warn "Ce dossier ne semble pas être un backup Gitea valide." + warn "Ce dossier ne semble pas être un backup valide pour ${DOCKER_APP_NAME}." exit 1 fi echo "" echo "════════════════════════════════════════════════════════" -echo "🔄 RESTAURATION GITEA" +echo "🔄 RESTAURATION" echo "════════════════════════════════════════════════════════" echo "" # ─── Configuration cible ──────────────────────────────────────────────────── -TARGET_COMPOSE_DIR="${TARGET_COMPOSE_DIR:-$HOME/dev/git/outils/docker/gitea}" -TARGET_VOLUME_DATA="${TARGET_VOLUME_DATA:-/DOCKER_CONFIG/gitea/data}" -TARGET_VOLUME_MYSQL="${TARGET_VOLUME_MYSQL:-/DOCKER_CONFIG/gitea/mysql}" -DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-gitea}" -DB_NAME="${DB_NAME:-gitea}" -DB_USER="${DB_USER:-gitea}" +TARGET_COMPOSE_DIR="${TARGET_COMPOSE_DIR:-$HOME/dev/git/outils/docker/$DOCKER_APP_NAME}" +TARGET_VOLUME_DATA="${TARGET_VOLUME_DATA:-/DOCKER_CONFIG/$DOCKER_APP_NAME/data}" +TARGET_VOLUME_MYSQL="${TARGET_VOLUME_MYSQL:-/DOCKER_CONFIG/$DOCKER_APP_NAME/mysql}" +DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-$DOCKER_APP_NAME}" +DB_NAME="${DB_NAME:-$DOCKER_APP_NAME}" +DB_USER="${DB_USER:-$DOCKER_APP_NAME}" # ─── Afficher les infos du backup ──────────────────────────────────────────── BACKUP_NAME=$(basename "$BACKUP_PATH") -BACKUP_DATE=${BACKUP_NAME#gitea-backup-} +BACKUP_DATE=${BACKUP_NAME#${DOCKER_APP_NAME}-backup-} if [[ -f "$BACKUP_PATH/backup-info.txt" ]]; then info "Informations du backup :" @@ -230,7 +241,7 @@ if [[ "$DRY_RUN" == "true" ]]; then echo "" echo "Actions qui seraient exécutées :" echo "" - echo " 1. Arrêter les conteneurs Gitea existants" + echo " 1. Arrêter les conteneurs ${DOCKER_APP_NAME} existants" echo " cd $TARGET_COMPOSE_DIR && $DOCKER_COMPOSE down" echo "" echo " 2. Créer les répertoires cibles" @@ -238,26 +249,26 @@ if [[ "$DRY_RUN" == "true" ]]; then echo "" echo " 3. Restaurer le volume MySQL" echo " rm -rf ${TARGET_VOLUME_MYSQL}/*" - echo " tar -xzf $BACKUP_PATH/gitea-mysql.tar.gz -C $(dirname "$TARGET_VOLUME_MYSQL")" + echo " tar -xzf $BACKUP_PATH/${DOCKER_APP_NAME}-mysql.tar.gz -C $(dirname "$TARGET_VOLUME_MYSQL")" echo "" - echo " 4. Restaurer le volume Gitea" + echo " 4. Restaurer le volume ${DOCKER_APP_NAME}" echo " rm -rf ${TARGET_VOLUME_DATA}/*" - echo " tar -xzf $BACKUP_PATH/gitea-data.tar.gz -C $(dirname "$TARGET_VOLUME_DATA")" + echo " tar -xzf $BACKUP_PATH/${DOCKER_APP_NAME}-data.tar.gz -C $(dirname "$TARGET_VOLUME_DATA")" echo "" echo " 5. Copier docker-compose.yml" echo " cp $BACKUP_PATH/docker-compose.yml $TARGET_COMPOSE_DIR/" echo "" if [[ -f "$BACKUP_PATH/app.ini" ]]; then echo " 6. Restaurer app.ini" - echo " mkdir -p ${TARGET_VOLUME_DATA}/gitea/conf" - echo " cp $BACKUP_PATH/app.ini ${TARGET_VOLUME_DATA}/gitea/conf/" + echo " mkdir -p ${TARGET_VOLUME_DATA}/${DOCKER_APP_NAME}/conf" + echo " cp $BACKUP_PATH/app.ini ${TARGET_VOLUME_DATA}/${DOCKER_APP_NAME}/conf/" echo "" fi echo " 7. Démarrer les conteneurs" echo " cd $TARGET_COMPOSE_DIR && $DOCKER_COMPOSE up -d" echo "" echo " 8. Restaurer la base de données" - echo " docker exec -i gitea_db mysql -u root -p$DB_ROOT_PASSWORD $DB_NAME < dump" + echo " docker exec -i ${DOCKER_APP_NAME}_db mysql -u root -p$DB_ROOT_PASSWORD $DB_NAME < dump" echo "" echo " 9. Redémarrer" echo " $DOCKER_COMPOSE restart" @@ -267,7 +278,7 @@ fi # ─── Confirmation ─────────────────────────────────────────────────────────── if [[ "$FORCE" != "true" ]]; then - echo "⚠️ ATTENTION : Cette opération va ÉCRASER l'installation Gitea existante !" + echo "⚠️ ATTENTION : Cette opération va ÉCRASER l'installation ${DOCKER_APP_NAME} existante !" echo " Toute donnée non sauvegardée sera PERDUE." echo "" echo " Les conteneurs seront arrêtés et les volumes remplacés." @@ -301,20 +312,20 @@ ok "Répertoires créés" # ─── Étape 3 : Restaurer volume MySQL ─────────────────────────────────────── echo "📦 Étape 3/7 : Restauration volume MySQL..." rm -rf "${TARGET_VOLUME_MYSQL:?}"/* -if ! tar -xzf "$BACKUP_PATH/gitea-mysql.tar.gz" -C "$(dirname "$TARGET_VOLUME_MYSQL")"; then +if ! tar -xzf "$BACKUP_PATH/${DOCKER_APP_NAME}-mysql.tar.gz" -C "$(dirname "$TARGET_VOLUME_MYSQL")"; then err "Échec de l'extraction du volume MySQL" exit 1 fi ok "Volume MySQL restauré" -# ─── Étape 4 : Restaurer volume Gitea ─────────────────────────────────────── -echo "📦 Étape 4/7 : Restauration volume Gitea..." +# ─── Étape 4 : Restaurer volume ${DOCKER_APP_NAME} ─────────────────────────── +echo "📦 Étape 4/7 : Restauration volume ${DOCKER_APP_NAME}..." rm -rf "${TARGET_VOLUME_DATA:?}"/* -if ! tar -xzf "$BACKUP_PATH/gitea-data.tar.gz" -C "$(dirname "$TARGET_VOLUME_DATA")"; then - err "Échec de l'extraction du volume Gitea" +if ! tar -xzf "$BACKUP_PATH/${DOCKER_APP_NAME}-data.tar.gz" -C "$(dirname "$TARGET_VOLUME_DATA")"; then + err "Échec de l'extraction du volume ${DOCKER_APP_NAME}" exit 1 fi -ok "Volume Gitea restauré" +ok "Volume ${DOCKER_APP_NAME} restauré" # ─── Étape 5 : Copier docker-compose ──────────────────────────────────────── echo "📦 Étape 5/7 : Copie docker-compose et configuration..." @@ -322,8 +333,8 @@ cp "$BACKUP_PATH/docker-compose.yml" "$TARGET_COMPOSE_DIR/" ok "docker-compose.yml copié" if [[ -f "$BACKUP_PATH/app.ini" ]]; then - mkdir -p "${TARGET_VOLUME_DATA}/gitea/conf" - cp "$BACKUP_PATH/app.ini" "${TARGET_VOLUME_DATA}/gitea/conf/app.ini" + mkdir -p "${TARGET_VOLUME_DATA}/${DOCKER_APP_NAME}/conf" + cp "$BACKUP_PATH/app.ini" "${TARGET_VOLUME_DATA}/${DOCKER_APP_NAME}/conf/app.ini" ok "app.ini restauré" fi @@ -342,7 +353,7 @@ echo " ⏳ Attente démarrage MySQL..." MYSQL_READY=false sleep 10 for i in $(seq 1 30); do - if docker exec gitea_db mysqladmin ping -u root -p"$DB_ROOT_PASSWORD" --silent 2>/dev/null; then + if docker exec ${DOCKER_APP_NAME}_db mysqladmin ping -u root -p"$DB_ROOT_PASSWORD" --silent 2>/dev/null; then echo " ✅ MySQL prêt après $((10 + i))s" MYSQL_READY=true break @@ -358,16 +369,16 @@ fi echo "📦 Étape 7/7 : Restauration base de données..." # Créer la base de données si elle n'existe pas -docker exec gitea_db mysql -u root -p"$DB_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" 2>/dev/null || true +docker exec ${DOCKER_APP_NAME}_db mysql -u root -p"$DB_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" 2>/dev/null || true # Restaurer le dump -if [[ -f "$BACKUP_PATH/gitea-db.sql.gz" ]]; then - gunzip -c "$BACKUP_PATH/gitea-db.sql.gz" | docker exec -i gitea_db mysql -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" 2>&1 || { +if [[ -f "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql.gz" ]]; then + gunzip -c "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql.gz" | docker exec -i ${DOCKER_APP_NAME}_db mysql -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" 2>&1 || { err "Échec de la restauration du dump SQL (compressé)" exit 1 } -elif [[ -f "$BACKUP_PATH/gitea-db.sql" ]]; then - docker exec -i gitea_db mysql -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" < "$BACKUP_PATH/gitea-db.sql" 2>&1 || { +elif [[ -f "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql" ]]; then + docker exec -i ${DOCKER_APP_NAME}_db mysql -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" < "$BACKUP_PATH/${DOCKER_APP_NAME}-db.sql" 2>&1 || { err "Échec de la restauration du dump SQL" exit 1 } @@ -381,15 +392,15 @@ $DOCKER_COMPOSE restart 2>&1 || true # ─── Vérification santé ───────────────────────────────────────────────────── echo "" -echo "🏥 Vérification que Gitea répond..." +echo "🏥 Vérification que ${DOCKER_APP_NAME} répond..." for i in $(seq 1 30); do STATUS=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:3000" 2>/dev/null || echo "000") if [[ "$STATUS" == "200" || "$STATUS" == "302" || "$STATUS" == "303" ]]; then - ok "Gitea répond (HTTP $STATUS) après ${i}s" + ok "${DOCKER_APP_NAME} répond (HTTP $STATUS) après ${i}s" break fi if [[ $i -eq 30 ]]; then - warn "Gitea ne répond pas encore — vérifiez les logs" + warn "${DOCKER_APP_NAME} ne répond pas encore — vérifiez les logs" fi sleep 1 done @@ -405,7 +416,7 @@ echo "" echo " Durée : ${DURATION}s" echo " Backup : $BACKUP_NAME" echo " Cible : $TARGET_COMPOSE_DIR" -echo " Gitea : http://localhost:3000" +echo " ${DOCKER_APP_NAME} : http://localhost:3000" echo "" echo " Logs : $DOCKER_COMPOSE logs -f" echo " Status : $DOCKER_COMPOSE ps" diff --git a/setup.sh b/setup.sh index e421a05..f0a8fc8 100644 --- a/setup.sh +++ b/setup.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============================================================================= -# setup.sh — Installation complète des scripts Gitea +# setup.sh — Installation complète des scripts Docker # ============================================================================= # Usage : # bash setup.sh → Installation interactive complète @@ -29,9 +29,10 @@ info() { echo -e " ${CYAN}📋${NC} $1"; } step() { echo -e "\n${BLUE}════════════════════════════════════════════════════════${NC}"; echo -e "${BLUE}🔧 $1${NC}"; echo -e "${BLUE}════════════════════════════════════════════════════════${NC}"; } # ─── Configuration ────────────────────────────────────────────────────────── -GIT_REPO="${GIT_REPO:-https://git.dracodev.net/Outils/gitea-scripts.git}" +GIT_REPO="${GIT_REPO:-https://git.dracodev.net/Outils/docker-scripts.git}" SCRIPTS_DIR="${SCRIPTS_DIR:-$HOME/scripts}" BRANCH="${BRANCH:-main}" +DOCKER_APP_NAME="${DOCKER_APP_NAME:-gitea}" # ─── Usage ────────────────────────────────────────────────────────────────── usage() { @@ -142,7 +143,7 @@ install_scripts() { # Vérifier que les scripts principaux existent local scripts_ok=true - for script in "gitea-backup.sh" "gitea-auto-update.sh" "install_cron.sh" "restore.sh" "gitea-scripts.conf"; do + for script in "docker-backup.sh" "docker-auto-update.sh" "install_cron.sh" "restore.sh" "docker-scripts.conf"; do if [[ -f "$SCRIPTS_DIR/$script" ]]; then ok "$script présent" else @@ -162,7 +163,7 @@ install_scripts() { make_executable() { step "Étape 3/6 : Permissions des scripts" - for script in "gitea-backup.sh" "gitea-auto-update.sh" "install_cron.sh" "restore.sh" "setup.sh"; do + for script in "docker-backup.sh" "docker-auto-update.sh" "install_cron.sh" "restore.sh" "setup.sh"; do if [[ -f "$SCRIPTS_DIR/$script" ]]; then chmod +x "$SCRIPTS_DIR/$script" ok "$script → exécutable" @@ -177,8 +178,8 @@ setup_logs() { step "Étape 4/6 : Configuration des logs" # Charger la config pour connaître LOG_DIR - if [[ -f "$SCRIPTS_DIR/gitea-scripts.conf" ]]; then - source "$SCRIPTS_DIR/gitea-scripts.conf" + if [[ -f "$SCRIPTS_DIR/docker-scripts.conf" ]]; then + source "$SCRIPTS_DIR/docker-scripts.conf" fi LOG_DIR="${LOG_DIR:-/var/log}" @@ -196,7 +197,7 @@ setup_logs() { fi # Créer les fichiers de log s'ils n'existent pas - touch "$HOME/gitea-backup-cron.log" "$HOME/gitea-update-cron.log" 2>/dev/null || true + touch "$HOME/${DOCKER_APP_NAME}-backup-cron.log" "$HOME/${DOCKER_APP_NAME}-update-cron.log" 2>/dev/null || true return 0 } @@ -205,7 +206,7 @@ setup_logs() { setup_logrotate() { step "Étape 5/6 : Rotation des logs" - local logrotate_conf="/etc/logrotate.d/gitea-scripts" + local logrotate_conf="/etc/logrotate.d/docker-scripts" local need_sudo=false if [[ -f "$logrotate_conf" ]]; then @@ -217,10 +218,10 @@ setup_logrotate() { need_sudo=true fi - local log_files="$HOME/gitea-backup-cron.log $HOME/gitea-update-cron.log /var/log/gitea-backup.log /var/log/gitea-update.log" + local log_files="$HOME/${DOCKER_APP_NAME}-backup-cron.log $HOME/${DOCKER_APP_NAME}-update-cron.log /var/log/${DOCKER_APP_NAME}-backup.log /var/log/${DOCKER_APP_NAME}-update.log" cat << LOGROTATE -# Rotation des logs Gitea scripts +# Rotation des logs Docker scripts $log_files { weekly rotate 12 @@ -240,7 +241,7 @@ LOGROTATE echo "" echo " sudo tee $logrotate_conf << 'EOF'" cat << LOGROTATE -# Rotation des logs Gitea scripts +# Rotation des logs Docker scripts $log_files { weekly rotate 12 @@ -258,7 +259,7 @@ LOGROTATE read -p "Exécuter cette commande maintenant ? [O/n] " -r REPLY if [[ "$REPLY" =~ ^[OoYy]?$ ]]; then sudo tee "$logrotate_conf" > /dev/null << LOGROTATE_EOF -# Rotation des logs Gitea scripts +# Rotation des logs Docker scripts $log_files { weekly rotate 12 @@ -276,7 +277,7 @@ LOGROTATE_EOF fi else cat > "$logrotate_conf" << LOGROTATE_EOF -# Rotation des logs Gitea scripts +# Rotation des logs Docker scripts $log_files { weekly rotate 12 @@ -314,7 +315,7 @@ setup_cron() { # ─── Mise à jour (git pull) ───────────────────────────────────────────────── do_update() { - step "Mise à jour des scripts Gitea" + step "Mise à jour des scripts Docker" if [[ ! -d "$SCRIPTS_DIR/.git" ]]; then err "$SCRIPTS_DIR n'est pas un dépôt Git — impossible de mettre à jour" @@ -364,7 +365,7 @@ done echo "" echo "╔══════════════════════════════════════════════════════╗" -echo "║ 🛠️ GITEA SCRIPTS — INSTALLATEUR ║" +echo "║ 🛠️ SCRIPTS DOCKER — INSTALLATEUR ║" echo "╚══════════════════════════════════════════════════════╝" echo "" info "Dossier scripts : $SCRIPTS_DIR" @@ -395,7 +396,7 @@ fi # ─── Confirmation interactive ─────────────────────────────────────────────── if [[ "$FORCE" != "true" ]]; then - echo "Ce script va installer complètement les scripts de maintenance Gitea :" + echo "Ce script va installer complètement les scripts de maintenance Docker :" echo "" echo " 1. Vérifier les prérequis système" echo " 2. Cloner/MàJ les scripts depuis Git" @@ -433,22 +434,22 @@ echo "" echo "📋 Commandes utiles :" echo "" echo " 🔍 Vérifier l'état : bash $SCRIPTS_DIR/install_cron.sh --status" -echo " 💾 Backup manuel : bash $SCRIPTS_DIR/gitea-backup.sh" +echo " 💾 Backup manuel : bash $SCRIPTS_DIR/docker-backup.sh" echo " 🔄 Restaurer : bash $SCRIPTS_DIR/restore.sh " echo " ⬆️ Mise à jour : bash $SCRIPTS_DIR/setup.sh --update" echo " 🗑️ Désinstaller : bash $SCRIPTS_DIR/install_cron.sh --uninstall" echo "" -echo "⚙️ Configuration : $SCRIPTS_DIR/gitea-scripts.conf" +echo "⚙️ Configuration : $SCRIPTS_DIR/docker-scripts.conf" echo "" echo "📊 Logs :" -echo " Backup : ${LOG_DIR:-/var/log}/gitea-backup.log" -echo " Update : ${LOG_DIR:-/var/log}/gitea-update.log" -echo " Cron backup : $HOME/gitea-backup-cron.log" -echo " Cron update : $HOME/gitea-update-cron.log" +echo " Backup : ${LOG_DIR:-/var/log}/${DOCKER_APP_NAME}-backup.log" +echo " Update : ${LOG_DIR:-/var/log}/${DOCKER_APP_NAME}-update.log" +echo " Cron backup : $HOME/${DOCKER_APP_NAME}-backup-cron.log" +echo " Cron update : $HOME/${DOCKER_APP_NAME}-update-cron.log" echo "" echo "🕐 Tâches cron :" -echo " Backup : $(grep "$SCRIPTS_DIR/gitea-backup.sh" <(crontab -l 2>/dev/null) | awk '{print $1" "$2" "$3" "$4" "$5}')" -echo " Update : $(grep "$SCRIPTS_DIR/gitea-auto-update.sh" <(crontab -l 2>/dev/null) | awk '{print $1" "$2" "$3" "$4" "$5}')" +echo " Backup : $(grep "$SCRIPTS_DIR/docker-backup.sh" <(crontab -l 2>/dev/null) | awk '{print $1" "$2" "$3" "$4" "$5}')" +echo " Update : $(grep "$SCRIPTS_DIR/docker-auto-update.sh" <(crontab -l 2>/dev/null) | awk '{print $1" "$2" "$3" "$4" "$5}')" echo "" # Proposer un premier backup @@ -456,7 +457,7 @@ if [[ "$FORCE" != "true" ]]; then read -p "💾 Lancer un premier backup maintenant ? [O/n] " -r REPLY if [[ "$REPLY" =~ ^[OoYy]?$ ]]; then echo "" - bash "$SCRIPTS_DIR/gitea-backup.sh" + bash "$SCRIPTS_DIR/docker-backup.sh" fi fi