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:
+61
-50
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user