#!/bin/bash # ============================================================ # Script : watchtower_run_once.sh # Description : Watchtower en exécution unique avec logs + SMTP + COULEURS # Auteur : Erreur32 (optimisé) # ============================================================ # Force terminal colors export TERM=xterm-256color # ========== COULEURS ANSI ========== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' # No Color # Helper functions pour logs colorés log_both() { local COLOR="$1" local MSG="$2" # Terminal avec couleur echo -e "${COLOR}${MSG}${NC}" # Fichier sans couleur echo -e "${MSG}" | sed 's/\x1b\[[0-9;]*m//g' >> "$LOG_FILE" } log_divider() { echo -e "${CYAN}${BOLD}────────────────────────────────────────────${NC}" | tee -a "$LOG_FILE" } # --------VARIABLES CONFIG-------- SMTP_USER="myoueb" SMTP_DOMAIN="echosystem.fr" SMTP_PASS="vIVC2ouz36SwgWfWSoAO32" SMTP_SERVER="ssl0.ovh.net" SMTP_PORT="587" SMTP_FROM="${SMTP_USER}@${SMTP_DOMAIN}" SMTP_TO="${SMTP_USER}@${SMTP_DOMAIN}" SMTP_STARTTLS="yes" WATCHTOWER_HOSTNAME="watchtower.MYOUEB.local" LOG_PATH="/home/docker/watchtower/log" DOCKER_IMAGE="nickfedor/watchtower:latest" API_VERSION="1.44" mkdir -p "$LOG_PATH" # --------FONCTION PRINCIPALE-------- function watchtower_cron() { # Fichier de log horodaté LOG_FILE="${LOG_PATH}/cron-$(date '+%Y-%m-%d-%Hh%M').txt" # Header coloré log_both "${BOLD}${CYAN}" "╔════════════════════════════════════════════╗" log_both "${BOLD}${CYAN}" "║ Watchtower Run Once ║" log_both "${BOLD}${CYAN}" "╚════════════════════════════════════════════╝" log_both "" "Date : $(date)" log_both "${CYAN}" "Log : $LOG_FILE" log_divider # Mise à jour de l'image echo "[*] Pulling latest Watchtower image..." | tee -a "$LOG_FILE" docker pull "$DOCKER_IMAGE" >/dev/null 2>&1 echo "✅ Done" | tee -a "$LOG_FILE" log_divider log_both "${BLUE}" "[*] Running Watchtower scan..." echo " (Using --label-enable to respect labels)" | tee -a "$LOG_FILE" echo " (Containers with label com.centurylinklabs.watchtower.enable=false will be excluded)" | tee -a "$LOG_FILE" # Exécution Watchtower avec --label-enable docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ --hostname "${WATCHTOWER_HOSTNAME}" \ "$DOCKER_IMAGE" \ --api-version="$API_VERSION" \ --run-once \ --label-enable \ --notification-url="smtp://${SMTP_USER}%40${SMTP_DOMAIN}:${SMTP_PASS}@${SMTP_SERVER}:${SMTP_PORT}/?from=${SMTP_FROM}&to=${SMTP_TO}&starttls=${SMTP_STARTTLS}" \ --notifications-level=debug \ 2>&1 | tee -a "$LOG_FILE" log_divider # Analyse des résultats RESULT=$(grep -Eo "Failed=[0-9]+|Scanned=[0-9]+|Updated=[0-9]+" "$LOG_FILE") FAILED=$(echo "$RESULT" | grep "Failed=" | cut -d= -f2) SCANNED=$(echo "$RESULT" | grep "Scanned=" | cut -d= -f2) UPDATED=$(echo "$RESULT" | grep "Updated=" | cut -d= -f2) # Sécurisation valeurs vides FAILED=${FAILED:-0} SCANNED=${SCANNED:-0} UPDATED=${UPDATED:-0} # Affichage résumé coloré log_both "${BOLD}${CYAN}" "RÉSUMÉ" log_both "${WHITE}" " Scannés : ${BOLD}$SCANNED${NC}${WHITE}" if [[ "$UPDATED" -gt 0 ]]; then log_both "${BOLD}${GREEN}" " ✅ Mis à jour : ${BOLD}$UPDATED${NC}${GREEN}" STATUS="SUCCESS" else log_both "${YELLOW}" " ℹ️ Mis à jour : ${BOLD}$UPDATED${NC}${YELLOW}" STATUS="NO_UPDATES" fi if [[ "$FAILED" -eq 0 ]]; then log_both "${GREEN}" " ❌ Échoués : ${BOLD}0${NC}${GREEN}" else log_both "${RED}" " ❌ Échoués : ${BOLD}$FAILED${NC}${RED}" STATUS="ERROR" fi log_divider # Nettoyage : uniquement si mise à jour if [[ "$UPDATED" -gt 0 ]]; then echo "[*] Cleaning up unused images..." | tee -a "$LOG_FILE" docker image prune -af >/dev/null 2>&1 docker volume prune -f >/dev/null 2>&1 log_both "${GREEN}" "✅ Cleanup done" echo "Nettoyage effectué (car mises à jour détectées)." >> "$LOG_FILE" else log_both "${YELLOW}" "⊘ No cleanup (no updates)" echo "Pas de nettoyage (aucune mise à jour)." >> "$LOG_FILE" fi log_divider log_both "${BOLD}${GREEN}" "✨ Status final : $STATUS" echo "---------------------------" >> "$LOG_FILE" echo "Status final : $STATUS" >> "$LOG_FILE" echo "Fin à : $(date)" >> "$LOG_FILE" log_both "${CYAN}" "Log saved --> $LOG_FILE" } watchtower_cron