#!/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 ####################################### read -r -a SITES <<< "$APP_URLS" SCHEME="http" CONNECT_TIMEOUT="${CHECK_CONNECT_TIMEOUT}" MAX_TIME="${CHECK_MAX_TIME}" ####################################### # Logs ####################################### LOG_DIR="${APP_LOG_DIR}" mkdir -p "$LOG_DIR" LOG_FILE="${LOG_DIR}/app_health_$(date +'%Y-%m-%d').log" ####################################### # Discord ####################################### DISCORD_WEBHOOK_URL="${DISCORD_WEBHOOK_URL:-}" DISCORD_PING="${DISCORD_PING:-@here}" discord_ping() { local site="$1" local status="$2" local detail="$3" [[ -z "${DISCORD_WEBHOOK_URL:-}" ]] && return 0 local color icon ping_prefix="" if [[ "$status" == "OK" ]]; then color="🟢" icon="✅" else color="🔴" icon="❌" ping_prefix="${DISCORD_PING} " fi local msg="**${ping_prefix}CHECK APP ${ENV_NAME} $color**\n" msg+="Application: ${site}\n" msg+="Details: ${detail}" curl -fsS -H "Content-Type: application/json" \ -d "{\"content\":\"$msg\"}" \ "$DISCORD_WEBHOOK_URL" >/dev/null || true } ####################################### # Logging ####################################### log_line() { # 2026-03-04 14:12:33 | LEVEL | site | message printf "%s | %s | %s | %s\n" \ "$(date +'%Y-%m-%d %H:%M:%S')" "$1" "$2" "$3" | tee -a "$LOG_FILE" # Envoi Discord par application discord_ping "$2" "$1" "$3" } ####################################### # DNS ####################################### dns_ok() { getent hosts "$1" >/dev/null 2>&1 } ####################################### # Check application ####################################### check_site() { local host="$1" local url="${SCHEME}://${host}/" if ! dns_ok "$host"; then log_line "DOWN" "$host" "Résolution impossible (getent hosts)" return 1 fi local http_code curl_exit stderr stderr="$(mktemp)" http_code="$( curl -sS -o /dev/null \ -w '%{http_code}' \ --connect-timeout "$CONNECT_TIMEOUT" \ --max-time "$MAX_TIME" \ "$url" 2>"$stderr" )" curl_exit=$? if [ $curl_exit -ne 0 ]; then local err err="$(head -n 1 "$stderr" | tr -d '\r')" rm -f "$stderr" log_line "DOWN" "$host" "curl exit=$curl_exit : ${err:-"(aucun)"}" return 1 fi rm -f "$stderr" if [[ "$http_code" =~ ^[0-9]{3}$ ]]; then if [ "$http_code" -ge 200 ] && [ "$http_code" -le 399 ]; then log_line "OK" "$host" "HTTP $http_code" return 0 fi log_line "DOWN" "$host" "HTTP $http_code (erreur appli)" return 1 fi log_line "DOWN" "$host" "Code HTTP inattendu: $http_code" return 1 } ####################################### # Main ####################################### main() { local failures=0 for site in "${SITES[@]}"; do if ! check_site "$site"; then failures=$((failures + 1)) fi done if [ "$failures" -gt 0 ]; then exit 2 fi exit 0 } main "$@"