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:
@@ -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"]
|
||||
|
||||
@@ -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)"
|
||||
Executable → Regular
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user