Обновление Docker-контейнеров автоматически: Watchtower vs Diun

обновление docker контейнеров автоматически
Быстрый ответ
Watchtower (официальный) заархивирован в декабре 2025 и не работает с Docker 29+. Варианта два:

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 Уведомления об обновлениях Активная разработка Работает

Как работает автообновление: схема

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Watchtower / Diun"] --> B["docker.sock"]
    B --> C["Список запущенных контейнеров"]
    C --> D["Запрос к реестру Docker Hub"]
    D --> E{"Новый дайджест?"}
    E -->|"Нет"| F["Ничего не делать"]
    E -->|"Да"| G{"Режим работы"}
    G -->|"Watchtower"| H["Pull нового образа"]
    G -->|"Diun"| I["Отправить уведомление"]
    H --> J["Перезапуск контейнера"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
    style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style I fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#475569
    style J fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Вариант 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.

Как получить Telegram Bot Token и Chat ID
Создай бота через @BotFather — получишь токен вида 123456789:AAFabc… Потом напиши боту любое сообщение и открой: https://api.telegram.org/bot{TOKEN}/getUpdates — там найдёшь 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:

Исправление: замени образ в compose-файле
Найди строку с containrrr/watchtower и замени на nickfedor/watchtower. Больше ничего менять не нужно — конфиг совместим полностью.

# Останови старый контейнер
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 — правильный подход для параноиков:

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
    A["Diun"] --> B["Socket Proxy"]
    B --> C["docker.sock"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
    style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

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, обновляешь когда готов.

Не заработало?
Пиши в комментарии — покажи вывод docker logs watchtower и версию Docker (docker version). Разберёмся.
Андрей Анатольевич
Author: Андрей Анатольевич

Руководитель ИТ / Кризис-менеджер 25 лет в IT: от инженера в МегаФоне до руководителя отдела. Знаю, как выглядит бардак: нестабильные сети, устаревшая инфраструктура, конфликты в команде, раздутые сроки. Помогаю бизнесу выходить из кризиса: навожу порядок в легаси, стабилизирую то, что разваливается, выстраиваю прогнозируемые процессы. Не раз возвращал к жизни ИТ-структуры — знаю цену хаосу. 📍 Ищу проект для полной реорганизации / стабилизации. 📬 Telegram: @over_dude ✉️ mail@it-apteka.com

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх