Как настроить уведомления об обновлении контейнеров с Watchtower

21 июля 2025 г.

Когда начал использовать Watchtower, я захотел получать уведомления о том, что мой сайт успешно обновлен.

В настройках меток для Watchtower есть возможность указать команды, которые будут выполнены в определенный момент процесса обновления:

  • выполняется перед проверкой обновлений для каждого контейнера;
  • выполняется перед остановкой контейнера, когда начинается процесс обновления;
  • выполняется после перезапуска обновленного контейнера;
  • выполняется после каждого цикла обновления для каждого контейнера.

Я использую , чтобы отправить уведомление в Telegram о том, что контейнер обновлен. Для этого нужно указать команду, которая будет выполнена после обновления. Эта команда будет выполнена внутри контейнера, с которым идет работа, поэтому нужно убедиться, что контейнер имеет нужный скрипт и может выполнить команды из него.

Подготовка скрипта для уведомлений

Расскажу на примере моего сервиса с сайтом.

  • guryn.ru
    • docker-compose.yml
    • .env
    • scripts
      • on-run-notify.sh

В папке лежит файл , который содержит код для отправки уведомления в Telegram:

#!/bin/sh

message="🚀 guryn.ru is deployed"

wget --quiet \
     --header="Content-Type: application/x-www-form-urlencoded" \
     --post-data="parse_mode=Markdown&message=$message" \
     https://notify.bot.codex.so/u/AAAABBBBCCCC

В качестве сервиса для отправки уведомлений я использую @codex_bot и его приложение Notify. Он позволяет отправлять сообщения в Telegram через HTTP-запросы.

Добавьте бота в любой чат и напишите ему команду. Он в ответ пришлет вам ссылку, которую нужно вставить в скрипт.

/notify_start@codex_bot
Codex Bot

/notify_start@codex_bot

12:00

Use this webhook for sending notifications to the chat:

https://notify.bot.codex.so/u/AAABBCCC

Make a POST request with text in «message» param.

👍1
12:00

Теперь сделаем скрипт исполняемым:

chmod +x scripts/on-run-notify.sh

И добавим его в контейнер с сайтом. В файле добавьте в папку со скриптами, а также укажите вторую метку для Watchtower:

services:
  web:
    labels:
      # traefik labels
      # ...
      - com.centurylinklabs.watchtower.enable=true
      - com.centurylinklabs.watchtower.lifecycle.post-update=/scripts/on-run-notify.sh
    image: ghcr.io/talyguryn/guryn.ru:latest
    restart: unless-stopped
    volumes:
      - ./scripts:/scripts
    env_file:
      - .env

Перезапустите контейнер, чтобы применить изменения:

docker compose down
docker compose up -d

И вручную проверьте, что скрипт работает:

docker compose exec -ti web /scripts/on-run-notify.sh

Если вы получили сообщение в Telegram, то все должно работать правильно и вы получите уведомление, когда Watchtower сам обновит контейнер.

Codex Bot

⁠🚀 guryn.ru is deployed

🔥1
13:00

Уведомление с превью сайта

Я усложнил скрипт, чтобы в сообщении был не просто текст, а картинка с превью сайта. Это частный случай, который может пригодиться тогда, когда у вас сайт из одной страницы и вы хотите сразу видеть, как он выглядит после обновления.

Codex Bot

⁠🚀 guryn.ru is deployed

Cover
13:00

Для создания превью из ссылки на страницу я написал отдельный сервис Skim. Не рекомендую использовать его в продакшене до официального релиза, потому что адрес еще может поменяться. Следите за обновлениями в репозитории и на моем сайте.

Улучшенная версия скрипта выглядит так:

#!/bin/sh

sleep 5

# Generate current timestamp
timestamp=$(date +%s)

# Create the link with the timestamp
generated_link="https://skim.fotofot.ru/?format=png&url=https://guryn.ru&t=$timestamp"

# Create the message with Markdown link
message="[⁠]($generated_link)🚀 guryn.ru is deployed"

# URL-encode the message
encoded_message=$(node -e "console.log(encodeURIComponent(process.argv[1]))" "$message")

wget --quiet \
     --header="Content-Type: application/x-www-form-urlencoded" \
     --post-data="parse_mode=Markdown&message=$encoded_message" \
     https://notify.bot.codex.so/u/AAAABBBBCCCC

Добавил ожидание в 5 секунд, чтобы дать время контейнеру полностью запуститься и отобразить страницу сайта по запросу.

Мы формируем ссылку на будущее изображение с превью сайта, добавляем к ней текущий таймстамп, чтобы избежать кэширования, и отправляем сообщение в Telegram с этой ссылкой.

В тексте сообщения используется Markdown для форматирования, чтобы превью отображалось в виде картинки. А в тексте ссылки на картинку используется символ нулевой длины Word Joiner, чтобы Telegram добавил невидимую ссылку и подгрузил обложку для нее.

Остается корректно закодировать сообщение, чтобы поместить его в ссылку с запросом. У меня контейнер с сайтом уже имеет Node.js, поэтому я использую его функции. Если у вас нет Node.js в контейнере, то можно использовать другие инструменты, например или — попросите ChatGPT помочь с изменением кода под них.

Показать заметки по похожей теме
Подпишитесь на мой Бусти, чтобы комментировать записи и получать уведомления о новых заметках.Подписаться на Бусти