Когда начал использовать 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
Теперь сделаем скрипт исполняемым:
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 сам обновит контейнер.
Уведомление с превью сайта
Я усложнил скрипт, чтобы в сообщении был не просто текст, а картинка с превью сайта. Это частный случай, который может пригодиться тогда, когда у вас сайт из одной страницы и вы хотите сразу видеть, как он выглядит после обновления.
Для создания превью из ссылки на страницу я написал отдельный сервис 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 помочь с изменением кода под них.