10 KiB
Executable File
updated, title, created, type, namespace, tags, related
| updated | title | created | type | namespace | tags | related | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-09-20 | Watchtower — Kraken | 2026-09-20 | tech | family |
|
|
Watchtower на Kraken (RPi5 / OMV / arm64)
Создано: 2026-09-20. Статус: ✅ ЗАВЕРШЕНО — версия 1.22.2 (форк nickfedor), label проставлены на 7 контейнеров, проверено прогоном
scanned=7 failed=0. Связанные: family/how-to/arr-stack-kraken, personal/tech/watchtower-docker-updates (реюзабельная теория), personal/tech/jellyfin-db-schema-mismatch, personal/tech/docker-data-root-mount-race
✅ РЕШЕНИЕ (2026-09-20): какие контейнеры обновляются автоматом
Решение Alex: «вариант 1 + jellyfin, portainer, transmission». Итого 7 контейнеров размечены label com.centurylinklabs.watchtower.enable=true:
| Контейнер | Где label | Примечание |
|---|---|---|
radarr |
docker/radarr/docker-compose.yml |
|
sonarr |
docker/sonarr/docker-compose.yml |
|
prowlarr |
docker/prowlarr/docker-compose.yml |
|
flaresolverr |
docker/prowlarr/docker-compose.yml |
тот же файл |
jellyfin |
docker/jellyfin/docker-compose.yml |
⚠️ тег latest — см. ниже |
portainer |
docker/portainer/docker-compose.yml |
данные в /data, пересоздание безопасно |
transmission |
docker/transmission/docker-compose.yml |
244 торрента в ./ (config), пересоздание данные не задело |
НЕ размечены (сознательно):
watchtower— сам себя (иначе зацикливание)hermes-kraken— агент Hermesxray-reverse-bridge— VPN-мостrclone,cloudflared
Проверка после простановки:
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
nickfedor/watchtower:1.22.2 --run-once --monitor-only --label-enable
# → Update session completed failed=0 scanned=7 updated=0 ← ровно 7, не 13
Про Jellyfin и тег (решение Alex)
Алекс явно потребовал: «пусть ставит до всех публичных релизов» → стоит image: jellyfin/jellyfin:latest, Watchtower поставит в т.ч. мажор 13.
Моя рекомендация была пинить 12 (после инцидента jellyfin-db-schema-mismatch, где контейнер остался на старом образе при уже мигрированной БД и отдавал 503). Алекс выбрал latest — риск принят осознанно. Если Jellyfin однажды отдаст 503 после автообновления — смотреть personal/tech/jellyfin-db-schema-mismatch, бэкап БД: /home/kraken/backups/jellyfin-label-20260920-190935/.
⚠️ Важное следствие --cleanup: старые образы удаляются, откатиться на предыдущую версию после автообновления будет некуда.
Что было сломано (2026-09-20)
Watchtower стоял на containrrr/watchtower без единого флага и не обновил ни один контейнер за ~2.5 месяца.
Четыре независимые причины:
| # | Причина | Как выглядело в логе |
|---|---|---|
| 1 | Не задан --interval |
Scheduling first run: ... in 23 hours 59 minutes — каждый рестарт контейнера сбрасывал таймер, а рестарты были |
| 2 | DOCKER_API_VERSION=1.40 (старый API) |
Unable to update container "/prowlarr": no available image info |
| 3 | Образ containrrr/watchtower мёртв |
last push 2023-11-11 (проверено через Docker Hub API) |
| 4 | Нет label на целевых контейнерах | Scanned=12 Updated=0 |
Итог до фикса: Session done Failed=0 Scanned=12 Updated=0, а единственная попытка обновления упала с no available image info.
Фикс (ВЫПОЛНЕН 2026-09-20)
containrrr/watchtower → nickfedor/watchtower:1.22.2 (активный форк; у containrrr последний push 2023-11-11).
D=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/docker/watchtower
sudo cp $D/docker-compose.yml /home/kraken/arr-fix-backup-20260920/watchtower-compose.bak
cd $D && sudo docker compose pull watchtower && sudo docker compose up -d watchtower
Compose (docker/watchtower/docker-compose.yml):
services:
watchtower:
image: nickfedor/watchtower:1.22.2
container_name: watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 86400 --cleanup --label-enable
# DOCKER_API_VERSION=1.40 УДАЛЁН — именно он ломал обновление
Флаги:
--interval 86400— явные 24ч (без флага таймер сбрасывался каждым стартом)--cleanup— удалять старые образы (диск на 87%, иначе забьёт)--label-enable— обновлять ТОЛЬКО контейнеры с labelcom.centurylinklabs.watchtower.enable=true
Проверка (обязательна — «запущено» ≠ «работает»)
# 1) версия и API
sudo docker logs --tail 20 watchtower
# → Watchtower 1.22.2 using Docker API v1.54 (был v1.40)
# → Next scheduled run: ... in 23 hours 59 minutes ← таймер виДЕН
# 2) РЕАЛЬНЫЙ прогон без изменений — БЕЗ label (сравнение)
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
nickfedor/watchtower:1.22.2 --run-once --monitor-only
# → Update session completed failed=0 scanned=13 updated=0
# → "Found new image" container=transmission ← баг no-available-image-info ВЫЛЕЧЕН
# 3) С label (актуальный режим) → должно быть ровно 7
sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
nickfedor/watchtower:1.22.2 --run-once --monitor-only --label-enable
# → Update session completed failed=0 scanned=7 updated=0
⚠️ КРИТИЧНО: Watchtower и Jellyfin — история и принятое решение
Watchtower уже один раз сломал Jellyfin (см. personal/tech/jellyfin-db-schema-mismatch): контейнер остался на старом образе 10.11.8 при уже мигрированной до 12.1 БД → no such column: p.Permission_Permissions_Guid → 503.
Разбор инцидента показывает: сама миграция БД прошла нормально, упало из-за рассинхрона «старый сервер + новая схема». То есть мажорный апдейт сам по себе БД не ломает.
Решение Alex (2026-09-20): тег latest, обновляемся до всех публичных релизов, включая мажор 13. Риск принят осознанно. Бэкап БД перед пересозданием: /home/kraken/backups/jellyfin-label-20260920-190935/ (24 МБ).
Если Jellyfin отдаёт 503 после автообновления — это тот же класс проблемы: смотреть personal/tech/jellyfin-db-schema-mismatch, проверить docker exec jellyfin /jellyfin/jellyfin --version против версии в __EFMigrationsHistory.
⚠️ Следствие --cleanup: старые образы удаляются, откат на предыдущую версию после автообновления невозможен. Если нужен откат — только полный restore БД из бэкапа.
Диагностика Watchtower
sudo docker ps --format "{{.Names}}\t{{.Image}}\t{{.Status}}" | grep watchtower
sudo docker logs --tail 40 watchtower
# кто помечен для автообновления:
for c in $(sudo docker ps --format "{{.Names}}"); do
echo "$c -> $(sudo docker inspect $c -f '{{index .Config.Labels "com.centurylinklabs.watchtower.enable"}}')"
done
Грабли:
Unable to update container: no available image info— старыйDOCKER_API_VERSION, либо несовместимость containrrr-версии с новым dockerd.- Рестарт контейнера сбрасывает таймер — без
--intervalэто делает Watchtower бесполезным. --run-onceнельзя запускать без--monitor-only, если не хочешь реальных обновлений.- Watchtower пишет в stdout (
docker logs), в отличие от Jellyfin.
Бэкап
/home/kraken/arr-fix-backup-20260920/watchtower-compose.bak + остальные бэкапы в той же папке:
radarr-config-preupgrade.tar.gz(58M),sonarr-config-preupgrade.tar.gz(20M),prowlarr-config-preupgrade.tar.gz(3.9M)prowlarr.db.bak,watchtower-compose.bak,networks.txt, 4×<container>-inspect.json, 3× compose-файла
Что дальше (открытые пункты)
| # | Пункт | Статус |
|---|---|---|
| 1 | Allowed Hosts is not configured warning в Radarr/Sonarr/Prowlarr — ограничить, какие hostname могут обращаться |
⏳ отдельная задача |
| 2 | Home Assistant на Kraken — Exited (128) ~2 месяца, не поднимался (см. family/how-to/kraken-access) |
⏳ отдельная задача |
✅ Закрыто 2026-09-20: label проставлены, решение по Jellyfin принято (latest), первый прогон с label прошёл (scanned=7 failed=0).
Теория (реюзабельно)
Общие причины «Watchtower не обновляет» без привязки к Kraken — personal/tech/watchtower-docker-updates.