Renommage generique : scripts Gitea - Docker avec DOCKER_APP_NAME

- Scripts renommes: gitea-backup.sh - docker-backup.sh,
  gitea-auto-update.sh - docker-auto-update.sh,
  gitea-scripts.conf - docker-scripts.conf
- HOSTNAME dynamique via hostname, utilise dans BACKUP_DIR
- DOCKER_APP_NAME comme variable maitresse derivant conteneurs,
  volumes, logs, chemins de backup
- Configuration unifiee reutilisable pour toute app Docker
- README, install_cron.sh, setup.sh, restore.sh mis a jour
This commit is contained in:
2026-06-26 13:49:19 -04:00
parent 5311abbd13
commit 286d2403ad
7 changed files with 208 additions and 191 deletions
+61 -50
View File
@@ -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 <chemin_backup> → Restauration interactive
@@ -8,12 +8,23 @@
# bash restore.sh <chemin_backup> --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 <chemin_backup> [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"