From c2d1b716e0da48daf89c3af26842c5227d17f696 Mon Sep 17 00:00:00 2001 From: AkiNoKure Date: Mon, 9 Mar 2026 09:08:44 +0100 Subject: [PATCH 1/4] fix : correctifs multiples --- .gitignore | 48 ++- .../.env.exemple | 0 .../README.md | 0 .../backup-vaultwarden.sh | 0 CHANGELOG.md | 32 ++ .env.exemple => CheckStorage/.env.exemple | 0 CheckStorage/README.md | 8 +- .../{check_storage.sh => check-storage.sh} | 0 README.md | 36 ++ RecetteScripts/.env.exemple | 87 +++++ RecetteScripts/README.md | 121 ++++++ RecetteScripts/backup-bdd-recette.sh | 347 ++++++++++++++++++ .../check-statut-recette.sh | 72 +++- backup_pg.sh | 210 ----------- backup_vaultwarden/.gitignore | 3 - 15 files changed, 731 insertions(+), 233 deletions(-) rename {backup_vaultwarden => BackupVaultWarden}/.env.exemple (100%) rename {backup_vaultwarden => BackupVaultWarden}/README.md (100%) rename {backup_vaultwarden => BackupVaultWarden}/backup-vaultwarden.sh (100%) mode change 100755 => 100644 create mode 100644 CHANGELOG.md rename .env.exemple => CheckStorage/.env.exemple (100%) rename CheckStorage/{check_storage.sh => check-storage.sh} (100%) create mode 100644 RecetteScripts/.env.exemple create mode 100644 RecetteScripts/README.md create mode 100644 RecetteScripts/backup-bdd-recette.sh rename check_statut_recette.sh => RecetteScripts/check-statut-recette.sh (60%) mode change 100755 => 100644 delete mode 100755 backup_pg.sh delete mode 100644 backup_vaultwarden/.gitignore diff --git a/.gitignore b/.gitignore index afdbc42..a4f34b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,51 @@ -# Secrets / environment +######################################## +# Environment / secrets +######################################## + +# Fichiers .env réels (contiennent des secrets) .env .env.* !.env.example !.env.exemple +# Sous-dossiers +RecetteScripts/.env +CheckStorage/.env + +# Garder les fichiers exemple +!*.env.exemple +!*.env.example +!CheckStorage/.env.exemple +!RecetteScripts/.env.exemple + +######################################## +# Logs +######################################## + +*.log +logs/ +var/log/ +backup.log + +######################################## +# Temporary / system files +######################################## + +*.tmp +*.swp +*.swo +*~ + +######################################## +# IDE / Editors +######################################## -# IDE / editor .idea/ -.vscode/ \ No newline at end of file +.vscode/ +*.iml + +######################################## +# OS files +######################################## + +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/backup_vaultwarden/.env.exemple b/BackupVaultWarden/.env.exemple similarity index 100% rename from backup_vaultwarden/.env.exemple rename to BackupVaultWarden/.env.exemple diff --git a/backup_vaultwarden/README.md b/BackupVaultWarden/README.md similarity index 100% rename from backup_vaultwarden/README.md rename to BackupVaultWarden/README.md diff --git a/backup_vaultwarden/backup-vaultwarden.sh b/BackupVaultWarden/backup-vaultwarden.sh old mode 100755 new mode 100644 similarity index 100% rename from backup_vaultwarden/backup-vaultwarden.sh rename to BackupVaultWarden/backup-vaultwarden.sh diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fc83105 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +Liste des évolutions du projet Scripts Serveur + +## [0.0.0] +### Parameters +Ajouter dans le fichier /RecetteScripts/.env +SSH_TIMEOUT +BACKUP_LOG_DIR +APP_LOG_DIR +DISCORD_WEBHOOK_URL +DISCORD_PING +CHECK_CONNECT_TIMEOUT +CHECK_MAX_TIME +APP_URLS + +Ajouter dans le fichier /CheckStorage/.env +WEBHOOK_URL + +### Added +* [#361] Script dump BDD +* [#367] Avoir une notification discord quand les backup sont faites +* [#368] Script pour check que les applis ne sont pas hors-ligne +* first push +* Reorganisation des fichiers et dossiers +* [#372] Script de check si la machine a le stockage plein +* [#378] Script Backup BDD Vaultwarden +* [#381] Variabiliser tous les scripts +* [#] Fix Correctif +### Changed + +### Fixed diff --git a/.env.exemple b/CheckStorage/.env.exemple similarity index 100% rename from .env.exemple rename to CheckStorage/.env.exemple diff --git a/CheckStorage/README.md b/CheckStorage/README.md index dd5886b..a8190dd 100644 --- a/CheckStorage/README.md +++ b/CheckStorage/README.md @@ -22,11 +22,11 @@ La limite d'alerte est fixée à 70% d'utilisation, mais vous pouvez ajuster cet ## Utilisation du script 1. Donnez les permissions d'exécution au script : ```bash - chmod +x check_storage.sh + chmod +x check-storage.sh ``` 2. Exécutez le script pour vérifier l'espace de stockage : ```bash - ./check_storage.sh + ./check-storage.sh ``` ## Initialisé un cron pour exécuter le script régulièrement @@ -36,8 +36,8 @@ La limite d'alerte est fixée à 70% d'utilisation, mais vous pouvez ajuster cet ``` 2. Ajoutez la ligne suivante pour exécuter le script tous les jours à 7h50 du matin : ```bash - 50 7 * * * /chemin/vers/le/script/check_storage.sh + 50 7 * * * /chemin/vers/le/script/check-storage.sh ``` ## Avertissement -Assurez-vous de remplacer `/chemin/vers/le/script/check_storage.sh` par le chemin réel où se trouve le script sur votre système. \ No newline at end of file +Assurez-vous de remplacer `/chemin/vers/le/script/check-storage.sh` par le chemin réel où se trouve le script sur votre système. \ No newline at end of file diff --git a/CheckStorage/check_storage.sh b/CheckStorage/check-storage.sh similarity index 100% rename from CheckStorage/check_storage.sh rename to CheckStorage/check-storage.sh diff --git a/README.md b/README.md index b579fed..5e9853d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,40 @@ # Scripts Serveur MALIO +Ce dépôt sert au **versionnement des scripts utilisés dans l’infrastructure du projet Ferme**. + +L’objectif est de conserver un historique clair des scripts, suivre les évolutions et permettre leur amélioration progressive. + +## Contenu du dépôt + +Le dépôt peut contenir différents types de scripts utilisés pour l’exploitation technique : + +* scripts de **backup PostgreSQL** +* scripts de **monitoring des applications** +* scripts **d’automatisation système** +* scripts **d’administration ou de maintenance** + +## Objectif + +Ce dépôt permet de : + +* suivre les **modifications des scripts dans le temps** +* garder une **version stable et reproductible** +* faciliter la **maintenance et les corrections** +* centraliser les scripts utilisés sur les serveurs + +## Organisation + +Les évolutions importantes sont documentées dans le fichier : + +``` +CHANGELOG.md +``` + +Ce fichier décrit les nouvelles fonctionnalités, corrections et modifications apportées aux scripts. + +## Remarque + +Ce dépôt est dédié au **versionnement des scripts uniquement**. +Les configurations sensibles (mots de passe, clés, variables d’environnement) ne doivent pas être stockées directement dans le dépôt et doivent être placées dans des fichiers `.env` locaux. Ce projet contient des scripts pour la gestion et la maintenance des serveurs de MALIO. diff --git a/RecetteScripts/.env.exemple b/RecetteScripts/.env.exemple new file mode 100644 index 0000000..dcbcf70 --- /dev/null +++ b/RecetteScripts/.env.exemple @@ -0,0 +1,87 @@ +############################################# +# ENVIRONNEMENT +############################################# + +# Nom de l'environnement (ex: DEV / RECETTE / PROD) +ENV_NAME=RECETTE + + +############################################# +# POSTGRESQL +############################################# + +# Host PostgreSQL +PGHOST=localhost + +# Port PostgreSQL +PGPORT=5432 + +# Utilisateur utilisé pour les dumps +PGUSER=backup_user + +# Mot de passe PostgreSQL +PGPASSWORD=change_me_secure_password + +# Bases à sauvegarder (séparées par espace) +DBS="sirh inventory ferme" + + +############################################# +# SERVEUR DE STOCKAGE DES BACKUPS +############################################# + +# Utilisateur du serveur distant +BACKUP_REMOTE_USER=backup + +# Host ou IP du serveur distant +BACKUP_REMOTE_HOST=192.168.1.50 + +# Dossier distant pour stocker les backups +BACKUP_REMOTE_DIR=/home/backup/backups + + +############################################# +# SSH +############################################# + +# Clé SSH utilisée pour envoyer les dumps +SSH_KEY=/home/backup/.ssh/id_ed25519_backup + +# Timeout SSH (secondes) +SSH_TIMEOUT=10 + + +############################################# +# LOGS +############################################# + +# Dossier des logs backup +BACKUP_LOG_DIR=/var/log/pg_backup + +# Dossier logs monitoring apps +APP_LOG_DIR=/var/log/app_health + + +############################################# +# DISCORD +############################################# + +# Webhook Discord pour notifications +DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/xxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +# Ping en cas d'erreur +DISCORD_PING=@here + + +############################################# +# HEALTH CHECK APPS +############################################# + +# Timeout connexion HTTP +CHECK_CONNECT_TIMEOUT=3 + +# Timeout total curl +CHECK_MAX_TIME=8 + +# Applications à vérifier +APP_URLS="ferme.example.local sirh.example.local inventory.example.local" \ No newline at end of file diff --git a/RecetteScripts/README.md b/RecetteScripts/README.md new file mode 100644 index 0000000..8b96720 --- /dev/null +++ b/RecetteScripts/README.md @@ -0,0 +1,121 @@ +# Scripts Recette + +Ce dossier contient les scripts utilisés pour l’environnement **RECETTE** du projet **Ferme**. + +Les scripts permettent principalement : + +* la **sauvegarde automatique des bases de données PostgreSQL** +* la **vérification du statut des applications web** + +--- + +# Scripts disponibles + +## backup-bdd-recette.sh + +Script permettant de réaliser une **sauvegarde des bases de données PostgreSQL**. + +Fonctionnement : + +* export des bases PostgreSQL définies dans la configuration +* export des utilisateurs PostgreSQL +* création de dumps au format PostgreSQL (`pg_dump -Fc`) +* transfert des sauvegardes vers un serveur distant +* génération de logs locaux +* envoi de notifications Discord en cas de succès ou d’erreur + +--- + +## check-statut-recette.sh + +Script permettant de **vérifier la disponibilité des applications web**. + +Le script effectue les vérifications suivantes : + +* résolution DNS du site +* connexion HTTP au service +* vérification du code HTTP retourné + +Une application est considérée : + +* **OK** si le code HTTP est entre **200 et 399** +* **DOWN** si la résolution DNS échoue ou si une erreur HTTP est détectée + +Chaque vérification est enregistrée dans un **fichier de log** et une notification peut être envoyée sur **Discord**. + +--- + +# Installation + +1. Clonez le dépôt Git : + +```bash +git clone https://gitea.malio.fr/MALIO-DEV/Scripts-Serveur.git +``` + +2. Accédez au dossier des scripts : + +```bash +cd Scripts-Serveur/RecetteScripts +``` + +3. Copiez le fichier d’environnement : + +```bash +cp .env.example .env +``` + +4. Modifiez les variables du fichier `.env` selon votre configuration. + +--- + +# Utilisation + +Donnez les permissions d’exécution aux scripts : + +```bash +chmod +x backup-bdd-recette.sh +chmod +x check-statut-recette.sh +``` + +Exécution manuelle : + +```bash +./backup-bdd-recette.sh +./check-statut-recette.sh +``` + +--- + +# Exécution automatique avec Cron + +Ouvrez le crontab : + +```bash +crontab -e +``` + +Exemple de planification : + +Backup des bases tous les jours à 19h : + +```bash +0 19 * * * /chemin/vers/le/script/backup-bdd-recette.sh +``` + +Vérification des applications tous les jours à 19h : + +```bash +0 19 * * * /chemin/vers/le/script/check-statut-recette.sh +``` + +--- + +# Avertissement + +Assurez-vous que : + +* PostgreSQL est accessible depuis la machine exécutant le script +* la clé SSH pour le transfert des sauvegardes est configurée +* les variables du fichier `.env` sont correctement renseignées +* les commandes `curl`, `psql` et `pg_dump` sont installées sur le système diff --git a/RecetteScripts/backup-bdd-recette.sh b/RecetteScripts/backup-bdd-recette.sh new file mode 100644 index 0000000..cf27fee --- /dev/null +++ b/RecetteScripts/backup-bdd-recette.sh @@ -0,0 +1,347 @@ +#!/usr/bin/env bash +set -euo pipefail + +############################################################################### +# backup-bdd-recette.sh +# +# Ce script réalise une sauvegarde logique de plusieurs bases PostgreSQL +# définies dans le fichier .env, exporte également la liste des rôles/users, +# puis transfère l’ensemble vers une machine distante de stockage. +# +# Fonctionnement global : +# 1. charge la configuration depuis le fichier .env ; +# 2. prépare les chemins, logs et variables de connexion ; +# 3. empêche l’exécution simultanée grâce à un verrou ; +# 4. crée les dossiers de destination sur la machine distante ; +# 5. exporte les rôles PostgreSQL ; +# 6. dump chaque base au format personnalisé PostgreSQL ; +# 7. transfère chaque fichier vers le serveur distant ; +# 8. envoie un bilan sur Discord : +# - 1 message global si tout est OK ; +# - 1 message USERS si export/transfert des rôles en erreur ; +# - 1 message par base si dump ou transfert en erreur. +############################################################################### + +####################################### +# Chargement du .env +####################################### + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="${SCRIPT_DIR}/.env" + +if [[ ! -f "$ENV_FILE" ]]; then + echo "ERROR: fichier .env introuvable : $ENV_FILE" >&2 + exit 1 +fi + +set -a +# shellcheck disable=SC1090 +source "$ENV_FILE" +set +a + +####################################### +# Vérification des variables requises +####################################### + +: "${ENV_NAME:?Variable ENV_NAME manquante}" +: "${PGHOST:?Variable PGHOST manquante}" +: "${PGPORT:?Variable PGPORT manquante}" +: "${PGUSER:?Variable PGUSER manquante}" +: "${PGPASSWORD:?Variable PGPASSWORD manquante}" +: "${DBS:?Variable DBS manquante}" +: "${BACKUP_REMOTE_USER:?Variable BACKUP_REMOTE_USER manquante}" +: "${BACKUP_REMOTE_HOST:?Variable BACKUP_REMOTE_HOST manquante}" +: "${BACKUP_REMOTE_DIR:?Variable BACKUP_REMOTE_DIR manquante}" +: "${SSH_KEY:?Variable SSH_KEY manquante}" +: "${SSH_TIMEOUT:?Variable SSH_TIMEOUT manquante}" +: "${BACKUP_LOG_DIR:?Variable BACKUP_LOG_DIR manquante}" + +####################################### +# Configuration principale +####################################### + +# Conversion de la liste des bases en tableau Bash +read -r -a DBS_ARRAY <<< "$DBS" + +# Paramètres de connexion SSH vers la machine distante +IA_SSH="${BACKUP_REMOTE_USER}@${BACKUP_REMOTE_HOST}" +IA_BASE_DIR="${BACKUP_REMOTE_DIR}" + +# Clé SSH et options utilisées pour les connexions SSH/SCP +SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout="${SSH_TIMEOUT}") + +# Dossier de logs local +LOG_DIR="${BACKUP_LOG_DIR}" +mkdir -p "$LOG_DIR" + +# Timestamp unique pour identifier ce jeu de sauvegardes +TS="$(date +'%Y-%m-%d_%H-%M-%S')" +BACKUP_DIR_NAME="backup_${TS}" +LOG_FILE="${LOG_DIR}/${BACKUP_DIR_NAME}.log" + +# Dossier temporaire local où seront générés les dumps avant transfert +TMP_DIR="/tmp/pg_dump_${BACKUP_DIR_NAME}" +mkdir -p "$TMP_DIR" + +# Redirige stdout/stderr vers le fichier de log tout en gardant l'affichage console +exec > >(tee -a "$LOG_FILE") 2>&1 + +# Fonction de log horodaté +log() { echo "---- $(date +'%Y-%m-%d %H:%M:%S') ---- $*"; } + +# Rend le mot de passe PostgreSQL disponible à psql / pg_dump +export PGPASSWORD + +####################################### +# Configuration Discord +####################################### + +# URL du webhook Discord. +# Si elle est vide, aucune notification ne sera envoyée. +DISCORD_WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}" +DISCORD_PING="${DISCORD_PING:-@here}" + +# Envoie un message texte simple sur Discord via webhook +discord_send() { + local msg="$1" + [[ -z "${DISCORD_WEBHOOK_URL:-}" ]] && return + + curl -fsS -H "Content-Type: application/json" \ + -d "{\"content\":\"$msg\"}" \ + "$DISCORD_WEBHOOK_URL" >/dev/null || true +} + +####################################### +# Message global OK +####################################### + +# Envoie un message unique quand tout le process s’est bien déroulé +discord_msg_global_ok() { + local msg="**BACKUP BDD ${ENV_NAME} 🟢**\n" + msg+="Name: ${BACKUP_DIR_NAME}\n" + msg+="Dumps transfer: ✅\n" + msg+="Users transfer: ✅" + + discord_send "$msg" +} + +####################################### +# Message USERS +####################################### + +# Envoie un message de statut spécifique à l’export/transfert des rôles/users +# Paramètres : +# $1 = export_ok -> non vide si export OK +# $2 = transfer_ok -> non vide si transfert OK +# $3 = details -> détail textuel de l’erreur éventuelle +discord_msg_users() { + local export_ok="$1" + local transfer_ok="$2" + local details="$3" + + local export_disp transfer_disp + export_disp=$([[ -n "$export_ok" ]] && echo "✅" || echo "❌") + transfer_disp=$([[ -n "$transfer_ok" ]] && echo "✅" || echo "❌") + + local color ping + if [[ -n "$export_ok" && -n "$transfer_ok" ]]; then + color="🟢" + ping="" + else + color="🔴" + ping="${DISCORD_PING} " + fi + + local msg="**${ping}BACKUP BDD ${ENV_NAME} ${color}**\n" + msg+="Name: ${BACKUP_DIR_NAME}\n" + msg+="Users export: ${export_disp}\n" + msg+="Users transfer: ${transfer_disp}" + + [[ -n "$details" ]] && msg+="\nDetails: ${details}" + + discord_send "$msg" +} + +####################################### +# Message DB +####################################### + +# Envoie un message de statut spécifique à une base donnée +# Paramètres : +# $1 = db -> nom de la base +# $2 = dump_ok -> non vide si dump OK +# $3 = transfer_ok -> non vide si transfert OK +# $4 = details -> détail textuel de l’erreur éventuelle +discord_msg_db() { + local db="$1" + local dump_ok="$2" + local transfer_ok="$3" + local details="$4" + + local dump_disp transfer_disp + dump_disp=$([[ -n "$dump_ok" ]] && echo "✅" || echo "❌") + transfer_disp=$([[ -n "$transfer_ok" ]] && echo "✅" || echo "❌") + + local color ping + if [[ -n "$dump_ok" && -n "$transfer_ok" ]]; then + color="🟢" + ping="" + else + color="🔴" + ping="${DISCORD_PING} " + fi + + local msg="**${ping}BACKUP BDD ${ENV_NAME} ${color}**\n" + msg+="Name: ${BACKUP_DIR_NAME}\n" + msg+="Database: ${db}\n" + msg+="Dump: ${dump_disp}\n" + msg+="Transfer: ${transfer_disp}" + + [[ -n "$details" ]] && msg+="\nDetails: ${details}" + + discord_send "$msg" +} + +####################################### +# Variables de statut globales +####################################### + +DUMPS_OK=true +USERS_OK=true + +USERS_EXPORT_OK=true +USERS_TRANSFER_OK=true +USERS_DETAILS="" + +declare -A DB_DUMP_OK +declare -A DB_TRANSFER_OK +declare -A DB_DETAILS + +####################################### +# Verrou d’exécution +####################################### + +LOCK_DIR="/tmp/pg_multi_dump_stream.lock.d" + +if ! mkdir "$LOCK_DIR" 2>/dev/null; then + log "ERROR: Backup déjà en cours" + discord_msg_users "" "" "Lock already exists" + exit 1 +fi + +trap 'rm -rf "$LOCK_DIR"' EXIT + +####################################### +# Préparation du dossier distant +####################################### + +REMOTE_DIR="${IA_BASE_DIR}" + +log "Creating remote directories" + +if ! ssh "${SSH_OPTS[@]}" "$IA_SSH" "mkdir -p '${REMOTE_DIR}/ferme' '${REMOTE_DIR}/sirh' '${REMOTE_DIR}/inventory' '${REMOTE_DIR}/user'"; then + log "ERROR: remote mkdir failed" + discord_msg_users "" "" "Remote mkdir failed" + exit 1 +fi + +####################################### +# Export des rôles PostgreSQL +####################################### + +ROLES_FILE="${TMP_DIR}/user_${TS}.dump" + +set +e + +psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d postgres -Atq <<'SQL' > "$ROLES_FILE" +SELECT rolname FROM pg_roles WHERE rolname !~ '^pg_'; +SQL + +RET=$? + +if [[ $RET -ne 0 ]]; then + USERS_OK= + USERS_EXPORT_OK= + USERS_DETAILS="roles export failed" +fi + +scp "${SSH_OPTS[@]}" "$ROLES_FILE" "$IA_SSH:${REMOTE_DIR}/user/" +RET=$? + +if [[ $RET -ne 0 ]]; then + USERS_OK= + USERS_TRANSFER_OK= + USERS_DETAILS+=" roles transfer failed" +fi + +set -e + +####################################### +# Dump des bases +####################################### + +set +e + +for DB in "${DBS_ARRAY[@]}"; do + + FILE="${TMP_DIR}/${DB}_${TS}.dump" + + DB_DUMP_OK["$DB"]=true + DB_TRANSFER_OK["$DB"]=true + DB_DETAILS["$DB"]="OK" + + log "Dump $DB" + + pg_dump -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -Fc -d "$DB" -f "$FILE" + + RET=$? + + if [[ $RET -ne 0 ]]; then + DUMPS_OK= + DB_DUMP_OK["$DB"]= + DB_TRANSFER_OK["$DB"]= + DB_DETAILS["$DB"]="dump failed" + continue + fi + + scp "${SSH_OPTS[@]}" "$FILE" "$IA_SSH:${REMOTE_DIR}/${DB}/" + + RET=$? + + if [[ $RET -ne 0 ]]; then + DUMPS_OK= + DB_TRANSFER_OK["$DB"]= + DB_DETAILS["$DB"]="transfer failed" + fi + +done + +set -e + +####################################### +# Nettoyage local +####################################### + +rm -rf "$TMP_DIR" + +####################################### +# Bilan final Discord +####################################### + +MODE_KO= + +[[ -z "${DUMPS_OK:-}" ]] && MODE_KO=true +[[ -z "${USERS_OK:-}" ]] && MODE_KO=true + +if [[ -z "${MODE_KO:-}" ]]; then + discord_msg_global_ok + exit 0 +fi + +discord_msg_users "${USERS_EXPORT_OK:+true}" "${USERS_TRANSFER_OK:+true}" "$USERS_DETAILS" + +for DB in "${DBS_ARRAY[@]}"; do + discord_msg_db "$DB" "${DB_DUMP_OK[$DB]:+true}" "${DB_TRANSFER_OK[$DB]:+true}" "${DB_DETAILS[$DB]}" +done + +exit 2 \ No newline at end of file diff --git a/check_statut_recette.sh b/RecetteScripts/check-statut-recette.sh old mode 100755 new mode 100644 similarity index 60% rename from check_statut_recette.sh rename to RecetteScripts/check-statut-recette.sh index 0d1533b..d206891 --- a/check_statut_recette.sh +++ b/RecetteScripts/check-statut-recette.sh @@ -1,30 +1,72 @@ #!/usr/bin/env bash set -u +############################################################################### +# check-statut-recette.sh +# +# Ce script vérifie la disponibilité de plusieurs applications web définies +# dans le fichier .env. +# +# Fonctionnement global : +# 1. charge la configuration depuis le fichier .env ; +# 2. vérifie que le DNS du site est résolu ; +# 3. effectue une requête HTTP avec curl ; +# 4. analyse le code HTTP retourné ; +# 5. écrit le résultat dans un fichier de log local ; +# 6. envoie une notification Discord avec l’état du service. +############################################################################### + +####################################### +# Chargement du .env +####################################### + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="${SCRIPT_DIR}/.env" + +if [[ ! -f "$ENV_FILE" ]]; then + echo "ERROR: fichier .env introuvable : $ENV_FILE" >&2 + exit 1 +fi + +set -a +# shellcheck disable=SC1090 +source "$ENV_FILE" +set +a + +####################################### +# Vérification des variables requises +####################################### + +: "${ENV_NAME:?Variable ENV_NAME manquante}" +: "${APP_LOG_DIR:?Variable APP_LOG_DIR manquante}" +: "${CHECK_CONNECT_TIMEOUT:?Variable CHECK_CONNECT_TIMEOUT manquante}" +: "${CHECK_MAX_TIME:?Variable CHECK_MAX_TIME manquante}" +: "${APP_URLS:?Variable APP_URLS manquante}" + ####################################### # Sites à vérifier ####################################### -SITES=( - "ferme.malio-dev.fr" - "sirh.malio-dev.fr" - "inventory.malio-dev.fr" -) + +read -r -a SITES <<< "$APP_URLS" SCHEME="http" -CONNECT_TIMEOUT=3 -MAX_TIME=8 +CONNECT_TIMEOUT="${CHECK_CONNECT_TIMEOUT}" +MAX_TIME="${CHECK_MAX_TIME}" ####################################### # Logs ####################################### -LOG_DIR="/var/log/app_health" + +LOG_DIR="${APP_LOG_DIR}" mkdir -p "$LOG_DIR" LOG_FILE="${LOG_DIR}/app_health_$(date +'%Y-%m-%d').log" ####################################### # Discord ####################################### -DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/1478379245842600007/tSxi3G6PbCn89pOdeqK34LR7c-GhXfT-lSCPolwBywJXcpa3ihL8rN4QRwsTjF6SS3w0" + +DISCORD_WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}" +DISCORD_PING="${DISCORD_PING:-@here}" discord_ping() { local site="$1" @@ -33,17 +75,17 @@ discord_ping() { [[ -z "${DISCORD_WEBHOOK_URL:-}" ]] && return 0 - local color icon - + local color icon ping_prefix="" if [[ "$status" == "OK" ]]; then color="🟢" icon="✅" else color="🔴" icon="❌" + ping_prefix="${DISCORD_PING} " fi - local msg="**CHECK APP RECETTE $color**\n" + local msg="**${ping_prefix}CHECK APP ${ENV_NAME} $color**\n" msg+="Application: ${site}\n" msg+="Status: ${icon}\n" msg+="Details: ${detail}" @@ -56,6 +98,7 @@ discord_ping() { ####################################### # Logging ####################################### + log_line() { # 2026-03-04 14:12:33 | LEVEL | site | message printf "%s | %s | %s | %s\n" \ @@ -68,6 +111,7 @@ log_line() { ####################################### # DNS ####################################### + dns_ok() { getent hosts "$1" >/dev/null 2>&1 } @@ -75,6 +119,7 @@ dns_ok() { ####################################### # Check application ####################################### + check_site() { local host="$1" @@ -127,6 +172,7 @@ check_site() { ####################################### # Main ####################################### + main() { local failures=0 @@ -144,4 +190,4 @@ main() { exit 0 } -main "$@" +main "$@" \ No newline at end of file diff --git a/backup_pg.sh b/backup_pg.sh deleted file mode 100755 index 132c62d..0000000 --- a/backup_pg.sh +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -####################################### -# Configuration -####################################### -DBS=("sirh" "inventory" "ferme") - -PGHOST="localhost" -PGPORT="5432" -PGUSER="backup_liot" -PGPASSWORD="backup_liot" - -IA_SSH="malio-b@192.168.0.179" -IA_BASE_DIR="/home/malio-b/backups" - -SSH_KEY="/home/malio/.ssh/id_ed25519_backup" -SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10) - -LOG_DIR="/var/log/pg_backup" -mkdir -p "$LOG_DIR" - -TS="$(date +'%Y-%m-%d_%H-%M-%S')" -BACKUP_DIR_NAME="backup_${TS}" -LOG_FILE="${LOG_DIR}/${BACKUP_DIR_NAME}.log" - -TMP_DIR="/tmp/pg_dump_${BACKUP_DIR_NAME}" -mkdir -p "$TMP_DIR" - -exec > >(tee -a "$LOG_FILE") 2>&1 -log() { echo "---- $(date +'%Y-%m-%d %H:%M:%S') ---- $*"; } - -export PGPASSWORD - -####################################### -# Discord (Webhook) -####################################### -DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/1478503102888935506/YCtJM09QZiKNMiCe5u7vCQb52VcLjHAd9wwEsKNltlJVcy7sKvoMTOJkvEKOOrk-Wpkh" - -discord_ping() { - local details="${1:-}" - - [[ -z "${DISCORD_WEBHOOK_URL:-}" ]] && return 0 - - local color dumps_display users_display - if [[ -n "${DUMPS_OK:-}" && -n "${USERS_OK:-}" ]]; then - color="🟢" - else - color="🔴" - fi - - dumps_display=$([[ -n "${DUMPS_OK:-}" ]] && echo "✅" || echo "❌") - users_display=$([[ -n "${USERS_OK:-}" ]] && echo "✅" || echo "❌") - - local msg="**@here BACKUP BDD RECETTE ${color}**\n" - msg+="Name: ${BACKUP_DIR_NAME}\n" - msg+="Dumps transfer: ${dumps_display}\n" - msg+="Users transfer: ${users_display}\n" - [[ -n "$details" ]] && msg+="Details: $details" - - curl -fsS -H "Content-Type: application/json" \ - -d "{\"content\":\"$msg\"}" \ - "$DISCORD_WEBHOOK_URL" >/dev/null || true -} - -####################################### -# Statuts init -####################################### -DUMPS_OK=true -USERS_OK=true -DUMP_ERRORS="" -USER_ERRORS="" - -####################################### -# Lock (évite 2 backups en même temps) -####################################### -LOCK_DIR="/tmp/pg_multi_dump_stream.lock.d" -if ! mkdir "$LOCK_DIR" 2>/dev/null; then - log "ERROR: Backup déjà en cours (lock: $LOCK_DIR)" - DUMPS_OK= - USERS_OK= - discord_ping "Lock exists: $LOCK_DIR" - exit 1 -fi -trap 'rm -rf "$LOCK_DIR"' EXIT - -####################################### -# Remote dir -####################################### -REMOTE_DIR="${IA_BASE_DIR}/${BACKUP_DIR_NAME}" - -log "Starting backup process" -log "Remote directory: ${REMOTE_DIR}" - -log "Creating remote directory" -if ! ssh "${SSH_OPTS[@]}" "$IA_SSH" "mkdir -p '${REMOTE_DIR}'"; then - log "ERROR: Création dossier distant impossible: ${REMOTE_DIR}" - DUMPS_OK= - USERS_OK= - discord_ping "Remote mkdir KO: ${REMOTE_DIR}" - exit 1 -fi - -####################################### -# Export PostgreSQL roles (no passwords) -####################################### -ROLES_FILE="${TMP_DIR}/roles_${TS}.sql" -log "Exporting PostgreSQL roles" - -set +e -psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d postgres -Atq <<'SQL' > "$ROLES_FILE" -SELECT - format( - 'DO $$ BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = %L) THEN - CREATE ROLE %I; - END IF; - END $$;', - rolname, rolname - ) -FROM pg_roles -WHERE rolname !~ '^pg_' -ORDER BY rolname; - -SELECT - format( - 'ALTER ROLE %I WITH %s%s%s%s%s%s%s%s;', - rolname, - CASE WHEN rolsuper THEN 'SUPERUSER ' ELSE 'NOSUPERUSER ' END, - CASE WHEN rolinherit THEN 'INHERIT ' ELSE 'NOINHERIT ' END, - CASE WHEN rolcreaterole THEN 'CREATEROLE ' ELSE 'NOCREATEROLE ' END, - CASE WHEN rolcreatedb THEN 'CREATEDB ' ELSE 'NOCREATEDB ' END, - CASE WHEN rolcanlogin THEN 'LOGIN ' ELSE 'NOLOGIN ' END, - CASE WHEN rolreplication THEN 'REPLICATION ' ELSE 'NOREPLICATION ' END, - CASE WHEN rolbypassrls THEN 'BYPASSRLS ' ELSE 'NOBYPASSRLS ' END, - 'CONNECTION LIMIT ' || rolconnlimit - ) -FROM pg_roles -WHERE rolname !~ '^pg_' -ORDER BY rolname; -SQL -RET=$? -if [[ $RET -ne 0 ]]; then - USERS_OK= - USER_ERRORS+="roles_export " - log "ERROR: Users export failed" -else - log "Roles export completed: $ROLES_FILE" -fi -set -e - -log "Sending roles file to IA server" -set +e -scp "${SSH_OPTS[@]}" "$ROLES_FILE" "$IA_SSH:${REMOTE_DIR}/" -RET=$? -if [[ $RET -ne 0 ]]; then - USERS_OK= - USER_ERRORS+="roles_scp " - log "ERROR: Users transfer failed (roles file)" -else - log "Roles transfer completed" -fi -set -e - -####################################### -# Dump des bases + transfert (continue même si KO) -####################################### -set +e -for DB in "${DBS[@]}"; do - FILE="${TMP_DIR}/${DB}_${TS}.dump" - - log "Dumping database: $DB" - pg_dump -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -Fc --no-owner --no-acl -d "$DB" -f "$FILE" - RET=$? - if [[ $RET -ne 0 ]]; then - DUMPS_OK= - DUMP_ERRORS+="${DB} " - log "ERROR: Dump failed for $DB" - continue - fi - log "Dump completed: $FILE" - - log "Sending dump to IA server" - scp "${SSH_OPTS[@]}" "$FILE" "$IA_SSH:${REMOTE_DIR}/" - RET=$? - if [[ $RET -ne 0 ]]; then - DUMPS_OK= - DUMP_ERRORS+="${DB}(scp) " - log "ERROR: Transfer failed for $DB" - continue - fi - log "Transfer completed for $DB" -done -set -e - -####################################### -# Nettoyage -####################################### -log "Cleaning temporary files" -rm -rf "$TMP_DIR" - -####################################### -# Envoi message Discord (final) -####################################### -DETAILS="" -[[ -z "${DUMPS_OK:-}" ]] && DETAILS+="Dumps KO: ${DUMP_ERRORS} " -[[ -z "${USERS_OK:-}" ]] && DETAILS+="Users KO: ${USER_ERRORS} " -discord_ping "$DETAILS" - -log "Backup finished" diff --git a/backup_vaultwarden/.gitignore b/backup_vaultwarden/.gitignore deleted file mode 100644 index 8814d50..0000000 --- a/backup_vaultwarden/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.env - -backup.log -- 2.39.5 From 97eeffd9eab20322e77041cccc6b6db596d4876b Mon Sep 17 00:00:00 2001 From: AkiNoKure Date: Mon, 9 Mar 2026 10:49:29 +0100 Subject: [PATCH 2/4] fix : correctifs multiple --- .gitignore | 2 + BackupVaultWarden/.env.exemple | 31 ++++++++++- BackupVaultWarden/backup-vaultwarden.sh | 23 +++++++++ CHANGELOG.md | 2 +- CheckStorage/.env.exemple | 5 ++ CheckStorage/README.md | 6 +++ CheckStorage/check-storage.sh | 68 ++++++++++++++++++++++++- 7 files changed, 134 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a4f34b2..b4b4c53 100644 --- a/.gitignore +++ b/.gitignore @@ -10,12 +10,14 @@ # Sous-dossiers RecetteScripts/.env CheckStorage/.env +BackupVaultWarden/.env # Garder les fichiers exemple !*.env.exemple !*.env.example !CheckStorage/.env.exemple !RecetteScripts/.env.exemple +!BackupVaultWarden/.env.exemple ######################################## # Logs diff --git a/BackupVaultWarden/.env.exemple b/BackupVaultWarden/.env.exemple index 8a1e463..2641b01 100644 --- a/BackupVaultWarden/.env.exemple +++ b/BackupVaultWarden/.env.exemple @@ -1,6 +1,35 @@ +############################################# +# VAULTWARDEN BACKUP CONFIGURATION +############################################# + +# Répertoire contenant les données Vaultwarden DATA_DIR= + +############################################# +# BACKUP LOCAL +############################################# + +# Dossier local où seront stockées les archives LOCAL_BACKUP= + + +############################################# +# SERVEUR DE BACKUP DISTANT +############################################# + +# Utilisateur SSH du serveur distant REMOTE_USER= + +# Host ou IP du serveur distant REMOTE_HOST= + +# Répertoire distant de stockage des backups REMOTE_DIR= -SSH_KEY= + + +############################################# +# AUTHENTIFICATION SSH +############################################# + +# Chemin vers la clé privée SSH utilisée pour la connexion +SSH_KEY= \ No newline at end of file diff --git a/BackupVaultWarden/backup-vaultwarden.sh b/BackupVaultWarden/backup-vaultwarden.sh index 5f92a05..89226aa 100644 --- a/BackupVaultWarden/backup-vaultwarden.sh +++ b/BackupVaultWarden/backup-vaultwarden.sh @@ -1,5 +1,28 @@ #!/usr/bin/env bash set -euo pipefail +############################################################################### +# backup-vaultwarden.sh +# +# Ce script réalise une sauvegarde complète des données Vaultwarden +# en compressant le répertoire contenant les données, puis transfère +# l’archive vers un serveur distant de stockage via SSH. +# +# Fonctionnement global : +# 1. charge la configuration depuis le fichier .env ; +# 2. initialise les chemins du script et le fichier de log ; +# 3. vérifie la présence des variables obligatoires dans le .env ; +# 4. vérifie l’existence du dossier de données Vaultwarden ; +# 5. crée une archive compressée (.tar.gz) du dossier DATA_DIR ; +# 6. crée le dossier de destination sur le serveur distant ; +# 7. transfère l’archive vers le serveur distant via SCP ; +# 8. supprime l’archive locale après transfert ; +# 9. enregistre les opérations dans un fichier log ; +# 10. envoie une notification Discord indiquant le succès ou l’échec. +# +# Le script est conçu pour être exécuté automatiquement via cron +# et permet de conserver une copie distante des données Vaultwarden +# afin de garantir leur récupération en cas de perte locale. +############################################################################### ####################################### # Chemins fixes du script diff --git a/CHANGELOG.md b/CHANGELOG.md index fc83105..d241fa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ WEBHOOK_URL * [#372] Script de check si la machine a le stockage plein * [#378] Script Backup BDD Vaultwarden * [#381] Variabiliser tous les scripts -* [#] Fix Correctif +* [#384] Fix Correctif ### Changed ### Fixed diff --git a/CheckStorage/.env.exemple b/CheckStorage/.env.exemple index 541796c..756f1a5 100644 --- a/CheckStorage/.env.exemple +++ b/CheckStorage/.env.exemple @@ -1 +1,6 @@ +############################################# +# DISCORD +############################################# + +# Webhook Discord pour notifications WEBHOOK_URL= \ No newline at end of file diff --git a/CheckStorage/README.md b/CheckStorage/README.md index a8190dd..f554e02 100644 --- a/CheckStorage/README.md +++ b/CheckStorage/README.md @@ -20,6 +20,12 @@ La limite d'alerte est fixée à 70% d'utilisation, mais vous pouvez ajuster cet ``` ## Utilisation du script +0. Copiez le fichier d'environnement exemple et modifiez les variables selon votre configuration : + ```bash + cp .env.example .env + nano .env + ``` + 1. Donnez les permissions d'exécution au script : ```bash chmod +x check-storage.sh diff --git a/CheckStorage/check-storage.sh b/CheckStorage/check-storage.sh index 6a13800..213aa37 100644 --- a/CheckStorage/check-storage.sh +++ b/CheckStorage/check-storage.sh @@ -1,21 +1,87 @@ #!/bin/bash +############################################################################### +# disk-usage-check.sh +# +# Ce script vérifie l'utilisation du disque sur la partition racine "/". +# Si l'utilisation dépasse un seuil défini, une alerte est envoyée sur Discord +# via un webhook. +# +# Fonctionnement : +# 1. Définit une limite maximale d'utilisation du disque (limit). +# 2. Récupère l'URL du webhook Discord depuis le fichier .env. +# 3. Récupère les informations disque avec la commande df : +# - espace total +# - espace utilisé +# - espace disponible +# - pourcentage d'utilisation +# 4. Convertit les valeurs bytes en gigaoctets pour un affichage lisible. +# 5. Si l'utilisation dépasse la limite définie : +# - envoie un message d'alerte sur Discord. +# 6. Affiche dans la console les informations de stockage. +# +# Ce script est généralement exécuté via cron pour surveiller +# automatiquement l'espace disque d'un serveur. +############################################################################### + +############################################################################### +# CONFIGURATION +############################################################################### + +# Limite maximale d'utilisation du disque en pourcentage limit=70 + +# Récupération du webhook Discord depuis le fichier .env +# Le script cherche la ligne WEBHOOK_URL= et extrait la valeur WEBHOOK_URL=$(grep -E '^WEBHOOK_URL=' .env | cut -d '=' -f2-) +############################################################################### +# RÉCUPÉRATION DES INFORMATIONS DISQUE +############################################################################### + +# La commande df -B1 renvoie les informations disque en bytes +# awk récupère la ligne correspondant à la partition "/" +# puis extrait les informations read -r total_bytes used_bytes avail_bytes usage <<<"$(df -B1 / | awk 'NR==2 {gsub(/%/,"",$5); print $2, $3, $4, $5}')" + +# Calcul du pourcentage d'espace libre free=$((100 - usage)) + +############################################################################### +# CONVERSION EN GIGAOCTETS +############################################################################### + +# Conversion bytes → gigaoctets pour un affichage plus lisible used_gb=$(awk -v b="$used_bytes" 'BEGIN {printf "%.2f", b/1024/1024/1024}') total_gb=$(awk -v b="$total_bytes" 'BEGIN {printf "%.2f", b/1024/1024/1024}') avail_gb=$(awk -v b="$avail_bytes" 'BEGIN {printf "%.2f", b/1024/1024/1024}') + +############################################################################### +# VÉRIFICATION DU SEUIL D'UTILISATION +############################################################################### + +# Si l'utilisation dépasse la limite définie, +# une alerte est envoyée sur Discord if [ "$usage" -ge "$limit" ]; then + msgLimit="@here\n**CHECK STOCKAGE :red_circle:**\nLimite autorisé : ${limit}%\nUtilisation actuelle: ${usage}%\nEspace restant: ${free}%\nUtilise / total: ${used_gb} GB / ${total_gb} GB\nDisponible: ${avail_gb} GB\nHeure: $(date)" + curl -X POST \ -H "Accept: application/json" \ -H "Content-Type: application/json; charset=utf-8" \ -d "{\"content\":\"$msgLimit\"}" \ "$WEBHOOK_URL" -fi + +fi0 + +############################################################## +# ################ +# AFFICHAGE DES INFORMATIONS STOCKAGE +############################################################################### + +# Affichage des informations disque dans la console echo "Espace disponible : ${avail_gb} GB" echo "Espace utilise / espace total : ${used_gb} GB / ${total_gb} GB" + +# Nom de la machine exécutant le script echo "Name: ${HOSTNAME}" \ No newline at end of file -- 2.39.5 From c80a74adc557837f53388080f2782a59a7eb2358 Mon Sep 17 00:00:00 2001 From: AkiNoKure Date: Mon, 9 Mar 2026 11:03:28 +0100 Subject: [PATCH 3/4] fix : versionning --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d241fa7..634a2ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Liste des évolutions du projet Scripts Serveur -## [0.0.0] +## [0.0.1] ### Parameters Ajouter dans le fichier /RecetteScripts/.env SSH_TIMEOUT -- 2.39.5 From e81b953ac2bb7b227d92464353a3bff7ecab1f25 Mon Sep 17 00:00:00 2001 From: AkiNoKure Date: Mon, 9 Mar 2026 11:31:37 +0100 Subject: [PATCH 4/4] fix : discord message --- CHANGELOG.md | 8 ++ RecetteScripts/backup-bdd-recette.sh | 111 +++++++++++-------------- RecetteScripts/check-statut-recette.sh | 1 - 3 files changed, 58 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 634a2ee..15dc6d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,14 @@ APP_URLS Ajouter dans le fichier /CheckStorage/.env WEBHOOK_URL +Ajouter dans le fichier /BackupVaultWarden/.env +DATA_DIR +LOCAL_BACKUP +REMOTE_USER +REMOTE_HOST +REMOTE_DIR +SSH_KEY + ### Added * [#361] Script dump BDD * [#367] Avoir une notification discord quand les backup sont faites diff --git a/RecetteScripts/backup-bdd-recette.sh b/RecetteScripts/backup-bdd-recette.sh index cf27fee..7e31bd0 100644 --- a/RecetteScripts/backup-bdd-recette.sh +++ b/RecetteScripts/backup-bdd-recette.sh @@ -18,8 +18,11 @@ set -euo pipefail # 7. transfère chaque fichier vers le serveur distant ; # 8. envoie un bilan sur Discord : # - 1 message global si tout est OK ; -# - 1 message USERS si export/transfert des rôles en erreur ; -# - 1 message par base si dump ou transfert en erreur. +# - en cas d’erreur partielle : +# * USERS OK -> message simple ; +# * USERS KO -> message détaillé ; +# * DB OK -> message simple ; +# * DB KO -> message détaillé. ############################################################################### ####################################### @@ -60,48 +63,41 @@ set +a # Configuration principale ####################################### -# Conversion de la liste des bases en tableau Bash read -r -a DBS_ARRAY <<< "$DBS" -# Paramètres de connexion SSH vers la machine distante IA_SSH="${BACKUP_REMOTE_USER}@${BACKUP_REMOTE_HOST}" IA_BASE_DIR="${BACKUP_REMOTE_DIR}" -# Clé SSH et options utilisées pour les connexions SSH/SCP -SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout="${SSH_TIMEOUT}") +SSH_OPTS=( + -i "$SSH_KEY" + -o IdentitiesOnly=yes + -o BatchMode=yes + -o ConnectTimeout="${SSH_TIMEOUT}" +) -# Dossier de logs local LOG_DIR="${BACKUP_LOG_DIR}" mkdir -p "$LOG_DIR" -# Timestamp unique pour identifier ce jeu de sauvegardes TS="$(date +'%Y-%m-%d_%H-%M-%S')" BACKUP_DIR_NAME="backup_${TS}" LOG_FILE="${LOG_DIR}/${BACKUP_DIR_NAME}.log" -# Dossier temporaire local où seront générés les dumps avant transfert TMP_DIR="/tmp/pg_dump_${BACKUP_DIR_NAME}" mkdir -p "$TMP_DIR" -# Redirige stdout/stderr vers le fichier de log tout en gardant l'affichage console exec > >(tee -a "$LOG_FILE") 2>&1 -# Fonction de log horodaté log() { echo "---- $(date +'%Y-%m-%d %H:%M:%S') ---- $*"; } -# Rend le mot de passe PostgreSQL disponible à psql / pg_dump export PGPASSWORD ####################################### # Configuration Discord ####################################### -# URL du webhook Discord. -# Si elle est vide, aucune notification ne sera envoyée. DISCORD_WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}" DISCORD_PING="${DISCORD_PING:-@here}" -# Envoie un message texte simple sur Discord via webhook discord_send() { local msg="$1" [[ -z "${DISCORD_WEBHOOK_URL:-}" ]] && return @@ -115,7 +111,6 @@ discord_send() { # Message global OK ####################################### -# Envoie un message unique quand tout le process s’est bien déroulé discord_msg_global_ok() { local msg="**BACKUP BDD ${ENV_NAME} 🟢**\n" msg+="Name: ${BACKUP_DIR_NAME}\n" @@ -126,15 +121,17 @@ discord_msg_global_ok() { } ####################################### -# Message USERS +# Messages USERS ####################################### -# Envoie un message de statut spécifique à l’export/transfert des rôles/users -# Paramètres : -# $1 = export_ok -> non vide si export OK -# $2 = transfer_ok -> non vide si transfert OK -# $3 = details -> détail textuel de l’erreur éventuelle -discord_msg_users() { +discord_msg_users_ok_simple() { + local msg="**BACKUP BDD ${ENV_NAME} 🟢**\n" + msg+="Users backup validé" + + discord_send "$msg" +} + +discord_msg_users_error() { local export_ok="$1" local transfer_ok="$2" local details="$3" @@ -143,16 +140,7 @@ discord_msg_users() { export_disp=$([[ -n "$export_ok" ]] && echo "✅" || echo "❌") transfer_disp=$([[ -n "$transfer_ok" ]] && echo "✅" || echo "❌") - local color ping - if [[ -n "$export_ok" && -n "$transfer_ok" ]]; then - color="🟢" - ping="" - else - color="🔴" - ping="${DISCORD_PING} " - fi - - local msg="**${ping}BACKUP BDD ${ENV_NAME} ${color}**\n" + local msg="**${DISCORD_PING} BACKUP BDD ${ENV_NAME} 🔴**\n" msg+="Name: ${BACKUP_DIR_NAME}\n" msg+="Users export: ${export_disp}\n" msg+="Users transfer: ${transfer_disp}" @@ -163,16 +151,18 @@ discord_msg_users() { } ####################################### -# Message DB +# Messages DB ####################################### -# Envoie un message de statut spécifique à une base donnée -# Paramètres : -# $1 = db -> nom de la base -# $2 = dump_ok -> non vide si dump OK -# $3 = transfer_ok -> non vide si transfert OK -# $4 = details -> détail textuel de l’erreur éventuelle -discord_msg_db() { +discord_msg_db_ok_simple() { + local db="$1" + local msg="**BACKUP BDD ${ENV_NAME} 🟢**\n" + msg+="Backup validé : ${db}" + + discord_send "$msg" +} + +discord_msg_db_error() { local db="$1" local dump_ok="$2" local transfer_ok="$3" @@ -182,16 +172,7 @@ discord_msg_db() { dump_disp=$([[ -n "$dump_ok" ]] && echo "✅" || echo "❌") transfer_disp=$([[ -n "$transfer_ok" ]] && echo "✅" || echo "❌") - local color ping - if [[ -n "$dump_ok" && -n "$transfer_ok" ]]; then - color="🟢" - ping="" - else - color="🔴" - ping="${DISCORD_PING} " - fi - - local msg="**${ping}BACKUP BDD ${ENV_NAME} ${color}**\n" + local msg="**${DISCORD_PING} BACKUP BDD ${ENV_NAME} 🔴**\n" msg+="Name: ${BACKUP_DIR_NAME}\n" msg+="Database: ${db}\n" msg+="Dump: ${dump_disp}\n" @@ -225,7 +206,7 @@ LOCK_DIR="/tmp/pg_multi_dump_stream.lock.d" if ! mkdir "$LOCK_DIR" 2>/dev/null; then log "ERROR: Backup déjà en cours" - discord_msg_users "" "" "Lock already exists" + discord_msg_users_error "" "" "Lock already exists" exit 1 fi @@ -241,7 +222,7 @@ log "Creating remote directories" if ! ssh "${SSH_OPTS[@]}" "$IA_SSH" "mkdir -p '${REMOTE_DIR}/ferme' '${REMOTE_DIR}/sirh' '${REMOTE_DIR}/inventory' '${REMOTE_DIR}/user'"; then log "ERROR: remote mkdir failed" - discord_msg_users "" "" "Remote mkdir failed" + discord_msg_users_error "" "" "Remote mkdir failed" exit 1 fi @@ -271,7 +252,11 @@ RET=$? if [[ $RET -ne 0 ]]; then USERS_OK= USERS_TRANSFER_OK= - USERS_DETAILS+=" roles transfer failed" + if [[ -n "$USERS_DETAILS" ]]; then + USERS_DETAILS+=" | roles transfer failed" + else + USERS_DETAILS="roles transfer failed" + fi fi set -e @@ -283,17 +268,15 @@ set -e set +e for DB in "${DBS_ARRAY[@]}"; do - FILE="${TMP_DIR}/${DB}_${TS}.dump" DB_DUMP_OK["$DB"]=true DB_TRANSFER_OK["$DB"]=true - DB_DETAILS["$DB"]="OK" + DB_DETAILS["$DB"]="" log "Dump $DB" pg_dump -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -Fc -d "$DB" -f "$FILE" - RET=$? if [[ $RET -ne 0 ]]; then @@ -305,7 +288,6 @@ for DB in "${DBS_ARRAY[@]}"; do fi scp "${SSH_OPTS[@]}" "$FILE" "$IA_SSH:${REMOTE_DIR}/${DB}/" - RET=$? if [[ $RET -ne 0 ]]; then @@ -313,7 +295,6 @@ for DB in "${DBS_ARRAY[@]}"; do DB_TRANSFER_OK["$DB"]= DB_DETAILS["$DB"]="transfer failed" fi - done set -e @@ -338,10 +319,18 @@ if [[ -z "${MODE_KO:-}" ]]; then exit 0 fi -discord_msg_users "${USERS_EXPORT_OK:+true}" "${USERS_TRANSFER_OK:+true}" "$USERS_DETAILS" +if [[ -n "${USERS_EXPORT_OK:-}" && -n "${USERS_TRANSFER_OK:-}" ]]; then + discord_msg_users_ok_simple +else + discord_msg_users_error "${USERS_EXPORT_OK:+true}" "${USERS_TRANSFER_OK:+true}" "$USERS_DETAILS" +fi for DB in "${DBS_ARRAY[@]}"; do - discord_msg_db "$DB" "${DB_DUMP_OK[$DB]:+true}" "${DB_TRANSFER_OK[$DB]:+true}" "${DB_DETAILS[$DB]}" + if [[ -n "${DB_DUMP_OK[$DB]:-}" && -n "${DB_TRANSFER_OK[$DB]:-}" ]]; then + discord_msg_db_ok_simple "$DB" + else + discord_msg_db_error "$DB" "${DB_DUMP_OK[$DB]:+true}" "${DB_TRANSFER_OK[$DB]:+true}" "${DB_DETAILS[$DB]}" + fi done exit 2 \ No newline at end of file diff --git a/RecetteScripts/check-statut-recette.sh b/RecetteScripts/check-statut-recette.sh index d206891..2eae821 100644 --- a/RecetteScripts/check-statut-recette.sh +++ b/RecetteScripts/check-statut-recette.sh @@ -87,7 +87,6 @@ discord_ping() { local msg="**${ping_prefix}CHECK APP ${ENV_NAME} $color**\n" msg+="Application: ${site}\n" - msg+="Status: ${icon}\n" msg+="Details: ${detail}" curl -fsS -H "Content-Type: application/json" \ -- 2.39.5