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