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
+15 -11
View File
@@ -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).
---
@@ -10,9 +14,9 @@ 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
├── 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
@@ -23,12 +27,12 @@ gitea-scripts/
```mermaid
flowchart TB
subgraph Config["⚙️ Configuration"]
CONF["gitea-scripts.conf<br/>Configuration unifiée"]
CONF["docker-scripts.conf<br/>DOCKER_APP_NAME + HOSTNAME"]
end
subgraph Core["🛠️ Scripts core"]
BACKUP["gitea-backup.sh<br/>💾 Backup quotidien"]
UPDATE["gitea-auto-update.sh<br/>🔄 Mise à jour auto"]
BACKUP["docker-backup.sh<br/>💾 Backup quotidien"]
UPDATE["docker-auto-update.sh<br/>🔄 Mise à jour auto"]
RESTORE["restore.sh<br/>♻️ 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"]
+30 -41
View File
@@ -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)"
View File
+33 -23
View File
@@ -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) <<<}"
+39 -37
View File
@@ -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 <<</p" | while read -r line; do
echo "$current_cron" | sed -n "/$CRON_MARKER/,/>>> END ${DOCKER_APP_NAME^^} SCRIPTS <</p" | while read -r line; do
# Ignorer les marqueurs et les commentaires
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "$line" ]] && continue
@@ -135,7 +137,7 @@ show_status() {
echo " 🕐 $schedule → $cmd"
done
else
warn "Aucun cron Gitea installé"
warn "Aucun cron installé"
fi
echo ""
@@ -158,10 +160,10 @@ show_status() {
fi
# Vérifier le fichier de config
if [[ -f "$SCRIPTS_DIR/gitea-scripts.conf" ]]; then
ok "Config : $SCRIPTS_DIR/gitea-scripts.conf"
if [[ -f "$SCRIPTS_DIR/docker-scripts.conf" ]]; then
ok "Config : $SCRIPTS_DIR/docker-scripts.conf"
else
warn "Config : $SCRIPTS_DIR/gitea-scripts.conf (absent)"
warn "Config : $SCRIPTS_DIR/docker-scripts.conf (absent)"
fi
echo ""
@@ -195,7 +197,7 @@ show_status() {
do_install() {
echo ""
echo "════════════════════════════════════════════════════════"
echo "🔧 INSTALLATION DES CRONS GITEA"
echo "🔧 INSTALLATION DES CRONS"
echo "════════════════════════════════════════════════════════"
echo ""
info "Utilisateur : $CRON_USER"
@@ -209,7 +211,7 @@ do_install() {
echo ""
err "Prérequis manquants. Placez les scripts dans $SCRIPTS_DIR/"
echo ""
echo " git clone https://git.dracodev.net/Outils/gitea-scripts.git $SCRIPTS_DIR"
echo " git clone https://git.dracodev.net/Outils/docker-scripts.git $SCRIPTS_DIR"
echo ""
exit 1
}
@@ -222,13 +224,13 @@ do_install() {
if [[ ! -d "$LOG_DIR" ]]; then
mkdir -p "$LOG_DIR" 2>/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 <<</d")
new_cron=$(echo "$current_cron" | sed "/$CRON_MARKER/,/>>> END ${DOCKER_APP_NAME^^} SCRIPTS <</d")
# Supprimer les lignes vides en trop
new_cron=$(echo "$new_cron" | sed '/^$/N;/^\n$/d')
@@ -325,10 +327,10 @@ do_uninstall() {
if [[ -z "${new_cron// }" ]]; then
# Crontab complètement vide après suppression
crontab -r 2>/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
+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"
+26 -25
View File
@@ -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 <dossier_backup>"
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