watchtower_run_once.sh(файл создан)
| @@ -0,0 +1,144 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | # ============================================================ | |
| 4 | + | # Script : watchtower_run_once.sh | |
| 5 | + | # Description : Watchtower en exécution unique avec logs + SMTP + COULEURS | |
| 6 | + | # Auteur : Erreur32 (optimisé) | |
| 7 | + | # ============================================================ | |
| 8 | + | ||
| 9 | + | # Force terminal colors | |
| 10 | + | export TERM=xterm-256color | |
| 11 | + | ||
| 12 | + | # ========== COULEURS ANSI ========== | |
| 13 | + | RED='\033[0;31m' | |
| 14 | + | GREEN='\033[0;32m' | |
| 15 | + | YELLOW='\033[1;33m' | |
| 16 | + | BLUE='\033[0;34m' | |
| 17 | + | CYAN='\033[0;36m' | |
| 18 | + | BOLD='\033[1m' | |
| 19 | + | NC='\033[0m' # No Color | |
| 20 | + | ||
| 21 | + | # Helper functions pour logs colorés | |
| 22 | + | log_both() { | |
| 23 | + | local COLOR="$1" | |
| 24 | + | local MSG="$2" | |
| 25 | + | # Terminal avec couleur | |
| 26 | + | echo -e "${COLOR}${MSG}${NC}" | |
| 27 | + | # Fichier sans couleur | |
| 28 | + | echo -e "${MSG}" | sed 's/\x1b\[[0-9;]*m//g' >> "$LOG_FILE" | |
| 29 | + | } | |
| 30 | + | ||
| 31 | + | log_divider() { | |
| 32 | + | echo -e "${CYAN}${BOLD}────────────────────────────────────────────${NC}" | tee -a "$LOG_FILE" | |
| 33 | + | } | |
| 34 | + | ||
| 35 | + | # --------VARIABLES CONFIG-------- | |
| 36 | + | SMTP_USER="myoueb" | |
| 37 | + | SMTP_DOMAIN="echosystem.fr" | |
| 38 | + | SMTP_PASS="vIVC2ouz36SwgWfWSoAO32" | |
| 39 | + | SMTP_SERVER="ssl0.ovh.net" | |
| 40 | + | SMTP_PORT="587" | |
| 41 | + | SMTP_FROM="${SMTP_USER}@${SMTP_DOMAIN}" | |
| 42 | + | SMTP_TO="${SMTP_USER}@${SMTP_DOMAIN}" | |
| 43 | + | SMTP_STARTTLS="yes" | |
| 44 | + | ||
| 45 | + | WATCHTOWER_HOSTNAME="watchtower.MYOUEB.local" | |
| 46 | + | ||
| 47 | + | LOG_PATH="/home/docker/watchtower/log" | |
| 48 | + | DOCKER_IMAGE="nickfedor/watchtower:latest" | |
| 49 | + | API_VERSION="1.44" | |
| 50 | + | ||
| 51 | + | mkdir -p "$LOG_PATH" | |
| 52 | + | ||
| 53 | + | # --------FONCTION PRINCIPALE-------- | |
| 54 | + | function watchtower_cron() { | |
| 55 | + | ||
| 56 | + | # Fichier de log horodaté | |
| 57 | + | LOG_FILE="${LOG_PATH}/cron-$(date '+%Y-%m-%d-%Hh%M').txt" | |
| 58 | + | ||
| 59 | + | # Header coloré | |
| 60 | + | log_both "${BOLD}${CYAN}" "╔════════════════════════════════════════════╗" | |
| 61 | + | log_both "${BOLD}${CYAN}" "║ Watchtower Run Once ║" | |
| 62 | + | log_both "${BOLD}${CYAN}" "╚════════════════════════════════════════════╝" | |
| 63 | + | ||
| 64 | + | log_both "" "Date : $(date)" | |
| 65 | + | log_both "${CYAN}" "Log : $LOG_FILE" | |
| 66 | + | log_divider | |
| 67 | + | ||
| 68 | + | # Mise à jour de l'image | |
| 69 | + | echo "[*] Pulling latest Watchtower image..." | tee -a "$LOG_FILE" | |
| 70 | + | docker pull "$DOCKER_IMAGE" >/dev/null 2>&1 | |
| 71 | + | echo "✅ Done" | tee -a "$LOG_FILE" | |
| 72 | + | log_divider | |
| 73 | + | ||
| 74 | + | log_both "${BLUE}" "[*] Running Watchtower scan..." | |
| 75 | + | echo " (Using --label-enable to respect labels)" | tee -a "$LOG_FILE" | |
| 76 | + | echo " (Containers with label com.centurylinklabs.watchtower.enable=false will be excluded)" | tee -a "$LOG_FILE" | |
| 77 | + | ||
| 78 | + | # Exécution Watchtower avec --label-enable | |
| 79 | + | docker run --rm \ | |
| 80 | + | -v /var/run/docker.sock:/var/run/docker.sock \ | |
| 81 | + | --hostname "${WATCHTOWER_HOSTNAME}" \ | |
| 82 | + | "$DOCKER_IMAGE" \ | |
| 83 | + | --api-version="$API_VERSION" \ | |
| 84 | + | --run-once \ | |
| 85 | + | --label-enable \ | |
| 86 | + | --notification-url="smtp://${SMTP_USER}%40${SMTP_DOMAIN}:${SMTP_PASS}@${SMTP_SERVER}:${SMTP_PORT}/?from=${SMTP_FROM}&to=${SMTP_TO}&starttls=${SMTP_STARTTLS}" \ | |
| 87 | + | --notifications-level=debug \ | |
| 88 | + | 2>&1 | tee -a "$LOG_FILE" | |
| 89 | + | ||
| 90 | + | log_divider | |
| 91 | + | ||
| 92 | + | # Analyse des résultats | |
| 93 | + | RESULT=$(grep -Eo "Failed=[0-9]+|Scanned=[0-9]+|Updated=[0-9]+" "$LOG_FILE") | |
| 94 | + | FAILED=$(echo "$RESULT" | grep "Failed=" | cut -d= -f2) | |
| 95 | + | SCANNED=$(echo "$RESULT" | grep "Scanned=" | cut -d= -f2) | |
| 96 | + | UPDATED=$(echo "$RESULT" | grep "Updated=" | cut -d= -f2) | |
| 97 | + | ||
| 98 | + | # Sécurisation valeurs vides | |
| 99 | + | FAILED=${FAILED:-0} | |
| 100 | + | SCANNED=${SCANNED:-0} | |
| 101 | + | UPDATED=${UPDATED:-0} | |
| 102 | + | ||
| 103 | + | # Affichage résumé coloré | |
| 104 | + | log_both "${BOLD}${CYAN}" "RÉSUMÉ" | |
| 105 | + | log_both "${WHITE}" " Scannés : ${BOLD}$SCANNED${NC}${WHITE}" | |
| 106 | + | ||
| 107 | + | if [[ "$UPDATED" -gt 0 ]]; then | |
| 108 | + | log_both "${BOLD}${GREEN}" " ✅ Mis à jour : ${BOLD}$UPDATED${NC}${GREEN}" | |
| 109 | + | STATUS="SUCCESS" | |
| 110 | + | else | |
| 111 | + | log_both "${YELLOW}" " ℹ️ Mis à jour : ${BOLD}$UPDATED${NC}${YELLOW}" | |
| 112 | + | STATUS="NO_UPDATES" | |
| 113 | + | fi | |
| 114 | + | ||
| 115 | + | if [[ "$FAILED" -eq 0 ]]; then | |
| 116 | + | log_both "${GREEN}" " ❌ Échoués : ${BOLD}0${NC}${GREEN}" | |
| 117 | + | else | |
| 118 | + | log_both "${RED}" " ❌ Échoués : ${BOLD}$FAILED${NC}${RED}" | |
| 119 | + | STATUS="ERROR" | |
| 120 | + | fi | |
| 121 | + | ||
| 122 | + | log_divider | |
| 123 | + | ||
| 124 | + | # Nettoyage : uniquement si mise à jour | |
| 125 | + | if [[ "$UPDATED" -gt 0 ]]; then | |
| 126 | + | echo "[*] Cleaning up unused images..." | tee -a "$LOG_FILE" | |
| 127 | + | docker image prune -af >/dev/null 2>&1 | |
| 128 | + | docker volume prune -f >/dev/null 2>&1 | |
| 129 | + | log_both "${GREEN}" "✅ Cleanup done" | |
| 130 | + | echo "Nettoyage effectué (car mises à jour détectées)." >> "$LOG_FILE" | |
| 131 | + | else | |
| 132 | + | log_both "${YELLOW}" "⊘ No cleanup (no updates)" | |
| 133 | + | echo "Pas de nettoyage (aucune mise à jour)." >> "$LOG_FILE" | |
| 134 | + | fi | |
| 135 | + | ||
| 136 | + | log_divider | |
| 137 | + | log_both "${BOLD}${GREEN}" "✨ Status final : $STATUS" | |
| 138 | + | echo "---------------------------" >> "$LOG_FILE" | |
| 139 | + | echo "Status final : $STATUS" >> "$LOG_FILE" | |
| 140 | + | echo "Fin à : $(date)" >> "$LOG_FILE" | |
| 141 | + | log_both "${CYAN}" "Log saved --> $LOG_FILE" | |
| 142 | + | } | |
| 143 | + | ||
| 144 | + | watchtower_cron | |
Новее
Позже