All checks were successful
Auto Tag / tag (push) Successful in 6s
Aligns the repo with the version that was running in prod. Adds INVENTORY/SIRH/LESSTIME_DOCS_DIR variables, zips each upload directory next to the DB dumps, keeps the 3 most recent zips, and splits the Discord summary into BDD/Documents sections.
102 lines
3.1 KiB
Bash
Executable File
102 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")"
|
|
|
|
# Charger les variables d'environnement
|
|
source .env
|
|
|
|
BACKUP_DIR="./backups"
|
|
DATABASES=("sirh_prod" "inventory_prod" "lesstime_prod" "starseed_prod")
|
|
INVENTORY_DOCS_DIR="/var/www/inventory/storage"
|
|
SIRH_DOCS_DIR="/var/www/sirh/uploads"
|
|
LESSTIME_DOCS_DIR="/var/www/lesstime/uploads"
|
|
DATE=$(date +%Y-%m-%d_%H%M%S)
|
|
LOG_FILE="${BACKUP_DIR}/backup.log"
|
|
WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}"
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }
|
|
|
|
discord() {
|
|
local color="$1" title="$2" msg="$3"
|
|
[[ -z "$WEBHOOK_URL" ]] && return 0
|
|
curl -fsS -H "Content-Type: application/json" -d "{
|
|
\"embeds\": [{
|
|
\"title\": \"${title}\",
|
|
\"description\": \"${msg}\",
|
|
\"color\": ${color}
|
|
}]
|
|
}" "$WEBHOOK_URL" >/dev/null 2>&1 || true
|
|
}
|
|
|
|
fail() {
|
|
log "ERROR: $1"
|
|
discord 16711680 "Backup - ECHEC" "$1"
|
|
exit 1
|
|
}
|
|
|
|
# Verifications
|
|
command -v docker &>/dev/null || fail "docker n'est pas installe"
|
|
|
|
# Supprimer les anciens backups (on ne garde que le dernier)
|
|
rm -f "${BACKUP_DIR}"/*.sql
|
|
# Garder les 3 derniers zips de documents, supprimer les plus anciens
|
|
for PREFIX in inventory_docs sirh_docs lesstime_docs; do
|
|
ls -t "${BACKUP_DIR}"/${PREFIX}-*.zip 2>/dev/null | tail -n +4 | xargs -r rm -f || true
|
|
done
|
|
|
|
log "Debut backup PostgreSQL"
|
|
|
|
DB_DETAILS=""
|
|
DOC_DETAILS=""
|
|
ERRORS=0
|
|
|
|
for DB in "${DATABASES[@]}"; do
|
|
log "Dumping ${DB}..."
|
|
if docker compose exec -T postgres pg_dump -U admin "$DB" > "${BACKUP_DIR}/${DB}-${DATE}.sql" 2>/dev/null; then
|
|
SIZE=$(du -h "${BACKUP_DIR}/${DB}-${DATE}.sql" | cut -f1)
|
|
log "${DB} sauvegarde (${SIZE})"
|
|
DB_DETAILS="${DB_DETAILS}\\n- **${DB}** : ${SIZE}"
|
|
else
|
|
log "ERREUR sur ${DB}"
|
|
DB_DETAILS="${DB_DETAILS}\\n- **${DB}** : ERREUR"
|
|
((ERRORS++))
|
|
fi
|
|
done
|
|
|
|
# Backup des documents (Inventory, SIRH, LessTime)
|
|
declare -A DOC_DIRS=(
|
|
["inventory_docs"]="$INVENTORY_DOCS_DIR"
|
|
["sirh_docs"]="$SIRH_DOCS_DIR"
|
|
["lesstime_docs"]="$LESSTIME_DOCS_DIR"
|
|
)
|
|
|
|
for NAME in "${!DOC_DIRS[@]}"; do
|
|
DIR="${DOC_DIRS[$NAME]}"
|
|
if [[ -d "$DIR" ]]; then
|
|
log "Zipping ${NAME}..."
|
|
ZIP_FILE="${BACKUP_DIR}/${NAME}-${DATE}.zip"
|
|
if zip -rq "$ZIP_FILE" "$DIR" 2>/dev/null; then
|
|
SIZE=$(du -h "$ZIP_FILE" | cut -f1)
|
|
log "${NAME} sauvegarde (${SIZE})"
|
|
DOC_DETAILS="${DOC_DETAILS}\\n- **${NAME}** : ${SIZE}"
|
|
else
|
|
log "ERREUR sur ${NAME}"
|
|
DOC_DETAILS="${DOC_DETAILS}\\n- **${NAME}** : ERREUR"
|
|
((ERRORS++))
|
|
fi
|
|
else
|
|
log "WARN: Dossier ${NAME} introuvable ($DIR)"
|
|
DOC_DETAILS="${DOC_DETAILS}\\n- **${NAME}** : dossier introuvable"
|
|
fi
|
|
done
|
|
|
|
if [[ $ERRORS -gt 0 ]]; then
|
|
fail "Backup termine avec ${ERRORS} erreur(s) :\\n\\n**BDD :**${DB_DETAILS}\\n\\n**Documents :**${DOC_DETAILS}"
|
|
fi
|
|
|
|
log "Backup termine avec succes"
|
|
discord 65280 "Backup - OK" "Backup **${DATE}**\\n\\n**BDD :**${DB_DETAILS}\\n\\n**Documents (3 derniers conserves) :**${DOC_DETAILS}"
|