1. Хочешь автообновление без рук — ставь nickfedor/watchtower, рабочий форк с поддержкой Docker API 1.44+.
2. Хочешь контроль и уведомления без автозамены образов — ставь Diun (crazy-max/diun), получай алерты в Telegram и обновляй сам.
3. Продакшн — не трогай ни то ни другое автоматически. Там нужен CI/CD.
4. Проверить что работает: docker logs watchtower —tail 20 и смотришь нет ли client version 1.25 is too old.
Диагноз: почему это вообще вопрос
Ты поднял 15 контейнеров на домашнем сервере и теперь каждую неделю вручную тянешь docker pull для каждого. Либо забил и не тянешь — и сидишь на образах полугодовой давности с дырами в безопасности, о которых уже написали на HackerNews.
Либо ты слышал про Watchtower, поставил его, и в какой-то момент увидел в логах вот это:
level=error msg="Error response from daemon: client version 1.25 is too old.
Minimum supported API version is 1.44, please upgrade your client to a newer version"
Watchtower работал годами. Потом Docker 29 вышел и поднял минимальную версию API. Официальный containrrr/watchtower два года не обновлялся — и в декабре 2025 репозиторий тихо заархивировали. Read-only. Done.
Хорошая новость: решения есть. Статья покажет два рабочих варианта с конкретными конфигами, объяснит когда что выбирать и закроет типичные ошибки.
Что тебе понадобится:
- Docker 25+ (проверь: docker version)
- Docker Compose v2
- 10 минут
- Telegram-бот для уведомлений (опционально, но удобно)
Что сломалось и почему: история Watchtower
Watchtower от containrrr был стандартом де-факто для homelab-обновлений. Простой, понятный, работал через монтирование docker.sock. Последний коммит — больше двух лет назад.
В ноябре 2025 Docker выпустил версию 29.0, которая подняла минимальную версию API до 1.44. Watchtower внутри использовал клиентскую библиотеку, хардкодящую API 1.25. Итог: контейнер стартует, падает в цикл, в логах только ошибка про версию API. 17 декабря 2025 containrrr/watchtower официально заархивирован.
Действующие варианта сейчас три:
| Инструмент | Что делает | Статус | Docker 29+ |
|---|---|---|---|
| containrrr/watchtower | Автообновление | Заархивирован | Не работает |
| nickfedor/watchtower | Автообновление | Активный форк | Работает |
| crazy-max/diun | Уведомления об обновлениях | Активная разработка | Работает |
Как работает автообновление: схема
Вариант 1: nickfedor/watchtower — автообновление с нуля
Форк от Nicholas Fedor — прямой преемник containrrr/watchtower. API-версия поднята, autonegotiation включён по умолчанию. Конфиг полностью совместим со старым Watchtower, меняешь только имя образа.
Системные требования
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| Docker Engine | 25.0 (API 1.44) | 27.0+ |
| Docker Compose | v2.0 | v2.20+ |
| ОС | Linux x86_64 | Ubuntu 22.04 / Debian 12 |
| RAM | 64 MB | 128 MB |
На момент публикации актуальна версия nickfedor/watchtower:1.12.3. Перед установкой проверь свежие релизы на Docker Hub.
Установка через Docker Compose
Создай файл docker-compose.yml. Это базовая конфигурация для homelab — обновляет все контейнеры раз в сутки и чистит старые образы.
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
Запусти:
docker compose up -d
Проверь что запустился нормально:
docker logs watchtower --tail 30
В логах должно быть что-то вроде:
time="..." level=info msg="Starting Watchtower and scheduling first run"
time="..." level=info msg="Running watchtower"
Если видишь client version 1.25 is too old — ты всё ещё используешь старый containrrr/watchtower. Замени образ.
Расширенный конфиг с уведомлениями в Telegram
Watchtower умеет слать уведомления через shoutrrr. Telegram — самый удобный вариант для большинства. Нужен токен бота и chat_id.
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID
- WATCHTOWER_NOTIFICATION_REPORT=true
Обновление только выбранных контейнеров
По умолчанию Watchtower обновляет всё что видит. Это не всегда нужно. Два способа ограничить область.
Способ первый — разрешить только помеченные контейнеры. В compose Watchtower добавь переменную:
- WATCHTOWER_LABEL_ENABLE=true
Потом у контейнеров которые хочешь обновлять добавь label:
services:
nginx:
image: nginx:latest
labels:
- "com.centurylinklabs.watchtower.enable=true"
Способ второй — явно исключи контейнеры которые трогать нельзя:
services:
postgres:
image: postgres:15
labels:
- "com.centurylinklabs.watchtower.enable=false"
БД особенно любят такое — накатил новый образ без проверки миграций и получил несовместимость. Базы данных из автообновления исключай всегда.
Запуск по расписанию через cron
Если нужно обновлять строго в определённое время — используй WATCHTOWER_SCHEDULE вместо POLL_INTERVAL. Синтаксис cron, но с секундами в начале.
# Каждое воскресенье в 03:00
- WATCHTOWER_SCHEDULE=0 0 3 * * 0
Вариант 2: Diun — контроль вместо автоматизации
Diun (Docker Image Update Notifier) от CrazyMax делает одно: смотрит на твои образы и сообщает когда вышло обновление. Сам ничего не трогает. Ты решаешь когда обновлять и обновлять ли вообще.
Это именно то что нужно если у тебя есть хоть один контейнер, которого нельзя перезапустить без подготовки. Или если ты хочешь читать changelog перед обновлением. Или если просто не доверяешь автоматике в 3 ночи.
Установка Diun через Docker Compose
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- LOG_JSON=false
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
Запусти и проверь:
docker compose up -d
docker logs diun --tail 30
Подключение уведомлений Telegram к Diun
Diun поддерживает Telegram, Discord, Slack, Matrix, Gotify, Pushover, email и ещё десяток каналов. Telegram — самый быстрый для настройки.
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_NOTIF_TELEGRAM_TOKEN=123456789:AAFabc...
- DIUN_NOTIF_TELEGRAM_CHATIDS=-100123456789
Протестируй уведомление не дожидаясь планового запуска:
docker exec diun diun notif test
В Telegram должно прийти тестовое сообщение от бота.
Мониторинг только выбранных контейнеров в Diun
Если WATCHBYDEFAULT=true — Diun следит за всем. Если хочешь только часть контейнеров — выключи флаг и добавляй labels вручную.
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=false
Потом у нужных контейнеров:
services:
nginx:
image: nginx:latest
labels:
- "diun.enable=true"
Diun умеет следить и за конкретными тегами. Если тебе важно знать когда вышел новый patch-релиз образа с тегом 1.24.x — настрой semver-фильтр через label diun.watch_repo=true.
Сравнение: что выбрать
| Критерий | nickfedor/watchtower | crazy-max/diun |
|---|---|---|
| Что делает | Обновляет и перезапускает контейнеры | Только уведомляет об обновлениях |
| Нужно ли руками нажимать | Нет | Да |
| Риск даунтайма | Есть (перезапуск контейнера) | Нулевой |
| Поддержка Docker 29+ | Да | Да |
| Уведомления Telegram | Да (через shoutrrr) | Да (нативно) |
| Для homelab без критичного | Идеально | Хорошо |
| Для prod или с БД | Нет | Да |
| Статус проекта | Активный форк (личный) | Активная разработка |
| Совместимость с containrrr | Полная (drop-in замена) | Разные инструменты |
Мой рецепт для homelab: Diun для слежения за всеми образами и уведомлений. Watchtower (nickfedor) — только для контейнеров без состояния, которые не жалко перезапустить в любой момент. БД, очереди, всё что хранит данные — только через Diun с ручным обновлением.
Проверка работы
Watchtower
Посмотреть логи и убедиться что нет ошибок API:
docker logs watchtower --tail 50 | grep -E "error|warn|info"
Принудительно запустить проверку прямо сейчас:
docker exec watchtower /watchtower --run-once
Проверить статус контейнера:
docker inspect watchtower | grep -E "Status|RestartCount"
RestartCount выше 2-3 — что-то не так, смотри полные логи.
Diun
Запустить принудительную проверку всех образов:
docker exec diun diun image list
Посмотреть историю обновлений:
docker exec diun diun image inspect --image nginx:latest
Проверить что все контейнеры в мониторинге:
docker logs diun 2>&1 | grep "Cron job"
Осложнения и их лечение
client version 1.25 is too old
Ты используешь containrrr/watchtower. Он заархивирован и не совместим с Docker 29+. Замени образ в docker-compose.yml:
# Останови старый контейнер
docker compose down
# Обнови образ в docker-compose.yml:
# image: containrrr/watchtower --> image: nickfedor/watchtower
# Подними заново
docker compose up -d
Watchtower обновил контейнер, приложение не работает
Образ обновился, но что-то сломалось. Вернись на предыдущий образ через тег. Сначала посмотри что сейчас запущено:
docker inspect имя_контейнера | grep Image
Потом в docker-compose.yml замени latest на конкретный тег предыдущей версии и пересоздай контейнер. Урок на будущее: не используй тег latest для критичных сервисов — пиши конкретную версию.
Diun не отправляет уведомления
Проверь токен и chat_id. Chat_id для группового чата начинается с минуса (-100…). Для личного чата — положительное число. Распространённая ошибка — скопировать chat_id без минуса.
Запусти тест:
docker exec diun diun notif test
Если ошибка «Forbidden» — бот не добавлен в чат или заблокирован.
Watchtower не видит приватный реестр
Для приватных реестров нужен docker login перед запуском. Смонтируй конфиг авторизации:
services:
watchtower:
image: nickfedor/watchtower:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json:ro
environment:
- DOCKER_CONFIG=/config.json
Diun следит за одним образом, игнорирует остальные
Скорее всего WATCHBYDEFAULT выключен и labels не проставлены. Либо включи WATCHBYDEFAULT=true, либо добавь label diun.enable=true ко всем нужным контейнерам.
Watchtower не чистит старые образы
Добавь переменную WATCHTOWER_CLEANUP=true. По умолчанию старые образы остаются и занимают место. Через неделю активной работы можешь обнаружить, что диск закончился. Капля никотина убивает лошадь, один latest без CLEANUP за месяц съедает 20 гигабайт.
Безопасность: docker.sock и что с ним делать
Оба инструмента монтируют /var/run/docker.sock. Это значит что у контейнера полный доступ к Docker-демону. Если контейнер скомпрометирован — у атакующего root на хосте. Это не паранойя, это факт архитектуры.
Минимальные меры:
- Не запускай Watchtower или Diun из чужих compose-файлов без проверки
- Ограничь сеть контейнера — ему не нужен выход наружу кроме Docker Hub
- Для Diun в режиме только-уведомлений доступ к сокету можно сделать read-only через Docker socket proxy (Tecnativa/docker-socket-proxy)
- Регулярно обновляй сам образ Watchtower или Diun
Схема с socket proxy для Diun — правильный подход для параноиков:
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
container_name: socket-proxy
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- IMAGES=1
- INFO=1
networks:
- socket-proxy
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
environment:
- TZ=Europe/Moscow
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_PROVIDERS_DOCKER_ENDPOINT=tcp://socket-proxy:2375
- DIUN_NOTIF_TELEGRAM_TOKEN=TOKEN
- DIUN_NOTIF_TELEGRAM_CHATIDS=CHAT_ID
networks:
- socket-proxy
networks:
socket-proxy:
driver: bridge
Резервное копирование и обновление самих инструментов
Watchtower nickfedor обновляет себя сам — он мониторит собственный образ в том числе. Diun нужно обновлять вручную или добавить Watchtower для мониторинга образа Diun. Да, это выглядит рекурсивно.
Что реально бэкапить:
- docker-compose.yml с переменными (или .env файл рядом)
- Папку diun-data/ — там база с историей образов
- Конфиг авторизации Docker если используешь приватные реестры
Минимальный backup скрипт:
#!/bin/bash
BACKUP_DIR="/backup/docker-tools"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
cp /opt/watchtower/docker-compose.yml "$BACKUP_DIR/watchtower-compose-$DATE.yml"
cp -r /opt/diun/diun-data "$BACKUP_DIR/diun-data-$DATE"
Альтернативы: что ещё есть
Если ни Watchtower ни Diun не подходят — вот короткий список:
- What’s Up Docker (WUD) — веб-интерфейс, мониторинг и уведомления, больше возможностей для фильтрации. Тяжелее Diun.
- Portainer — полноценный GUI для Docker. Есть мониторинг обновлений, но основная ценность не в этом.
- Renovate — если ты ведёшь docker-compose.yml в git, Renovate откроет PR с обновлёнными тегами образов. CI/CD рулит.
- Komodo — упоминается в русскоязычном сообществе как альтернатива Watchtower с более широкими возможностями управления.
Для продакшна правильный ответ — Kubernetes с FluxCD или ArgoCD. Там версионирование образов, rolling updates, автооткат. Но это уже другая история и другой уровень сложности.
FAQ
Почему watchtower docker не работает после обновления?
Скорее всего ты используешь официальный containrrr/watchtower, который заархивирован в декабре 2025 и не совместим с Docker 29+. Ошибка в логах: client version 1.25 is too old. Замени образ на nickfedor/watchtower — конфиг совместим полностью, менять кроме имени образа ничего не нужно.
Как проверить что watchtower работает правильно?
Запусти docker logs watchtower —tail 30 и убедись что нет строк с level=error. Должны быть строки Starting Watchtower и Running watchtower без ошибок. Принудительно запустить проверку: docker exec watchtower /watchtower —run-once.
Что делать если watchtower обновил контейнер и всё сломалось?
В docker-compose.yml замени тег latest на конкретную предыдущую версию образа, потом docker compose up -d —force-recreate. На будущее: не используй latest для сервисов с данными, пиши конкретный тег. И исключай БД из автообновления через label com.centurylinklabs.watchtower.enable=false.
Чем diun отличается от watchtower?
Diun только уведомляет о выходе нового образа — сам ничего не обновляет. Watchtower автоматически скачивает новый образ и перезапускает контейнер. Diun безопаснее для продакшна и сервисов с данными: ты решаешь когда и как обновлять. Watchtower удобнее для homelab где важнее автоматизация, а не контроль.
Как настроить docker update notifications в Telegram?
Для Diun: добавь переменные DIUN_NOTIF_TELEGRAM_TOKEN и DIUN_NOTIF_TELEGRAM_CHATIDS в docker-compose.yml. Для Watchtower (nickfedor): переменные WATCHTOWER_NOTIFICATIONS=shoutrrr и WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID. Протестируй командой docker exec diun diun notif test.
Можно ли использовать watchtower в продакшне?
Сам проект так не рекомендует: в документации написано «intended for homelabs, media centers, local dev environments». В продакшне автоматический перезапуск контейнеров без тестирования и согласования — это путь к инцидентам. Используй Diun для уведомлений, обновляй через CI/CD с rollback-планом.
Итог
containrrr/watchtower умер в декабре 2025. Не трогай его — он не совместим с текущими версиями Docker и обновлений не будет.
Для homelab без критичных данных: nickfedor/watchtower — drop-in замена, работает сразу, меняешь одну строку в compose-файле. Для всего остального, где важен контроль над тем что и когда обновляется: Diun с Telegram-уведомлениями. Ты видишь что вышло, читаешь changelog, обновляешь когда готов.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



Использую Watchtower с monitor-only режимом — присылает уведомления в Telegram когда выходит новая версия, но не обновляет автоматически.
Monitor-only с нотификациями — золотая середина. Получаешь информацию и сам решаешь когда обновлять. Для критичных сервисов типа БД это обязательный подход — автообновление может сломать что-то из-за изменений в схеме данных.
Перешёл с Watchtower на Diun потому что Watchtower обновлял сам себя и это приводило к странным ситуациям.
Справедливое замечание. Watchtower который обновляет себя — рекурсивная ситуация. Diun как чистый монитор без побочных эффектов логичнее для production. Для совсем некритичного homelab Watchtower с автообновлением удобен.
В какое время лучше настраивать автообновление контейнеров?
Зависит от критичности сервисов. Для домашнего — ночью удобнее. Для сервисов которыми пользуются люди — в то время когда ты онлайн и можешь отреагировать. Я обычно настраиваю на выходные утром — и дома, и могу посмотреть если что-то пойдёт не так.