From 9432cee44e95ee7b002b6b4ec0f44db9f5baf72f Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 20 Sep 2026 19:14:40 +0600 Subject: [PATCH] [2026-09-20] eagle: family/how-to/arr-stack-kraken.md family/how-to/kraken-watchtower.md personal/tech/watchtower-docker-updates.md --- family/how-to/arr-stack-kraken.md | 14 +++++ family/how-to/kraken-watchtower.md | 66 ++++++++++++++++++---- personal/tech/watchtower-docker-updates.md | 6 +- 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/family/how-to/arr-stack-kraken.md b/family/how-to/arr-stack-kraken.md index 1ba2b412..900097dd 100644 --- a/family/how-to/arr-stack-kraken.md +++ b/family/how-to/arr-stack-kraken.md @@ -423,6 +423,20 @@ sudo docker inspect -f '{{index .Config.Labels "com.docker.compose.projec Автообновлением занимается Watchtower — **проверить его конфиг перед тем, как ждать обновлений**: [[family/how-to/kraken-watchtower]], теория — [[personal/tech/watchtower-docker-updates]]. +## Автообновление (Watchtower) — 2026-09-20 + +Все сервисы стека (`radarr`, `sonarr`, `prowlarr`, `flaresolverr`, `transmission`) **плюс `jellyfin` и `portainer`** размечены label `com.centurylinklabs.watchtower.enable=true` → обновляются автоматически (7 контейнеров, проверено `scanned=7`). Полный разбор и список того, что НЕ обновляется: [[family/how-to/kraken-watchtower]]. + +Актуальные версии на 2026-09-20: + +| Сервис | Версия | +|---|---| +| Radarr | 6.4.4.10685 | +| Sonarr | 4.0.20.3014 | +| Prowlarr | 2.6.5.5623 | +| FlareSolverr | 3.5.2 | +| Watchtower | 1.22.2 (nickfedor) | + ## Notes - See [[arr-stack-taiga]] for Taiga (secondary) arr stack diff --git a/family/how-to/kraken-watchtower.md b/family/how-to/kraken-watchtower.md index 51cecaf8..c79deb3b 100644 --- a/family/how-to/kraken-watchtower.md +++ b/family/how-to/kraken-watchtower.md @@ -18,10 +18,45 @@ related: --- # Watchtower на Kraken (RPi5 / OMV / arm64) -> **Создано:** 2026-09-20. **Статус:** ✅ работает, версия 1.22.2 (форк nickfedor). -> ⏳ **Открытый пункт:** `--label-enable` включён, но label НЕТ ни у одного контейнера → **сейчас Watchtower не обновит ничего**. Ждёт решения Alex: вариант 1 (повесить label на radarr/sonarr/prowlarr/flaresolverr) или вариант 2 (убрать `--label-enable`, обновлять все 12). +> **Создано:** 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` — агент Hermes +- `xray-reverse-bridge` — VPN-мост +- `rclone`, `cloudflared` + +Проверка после простановки: +```bash +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 месяца**. @@ -73,20 +108,29 @@ 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) РЕАЛЬНЫЙ прогон без изменений +# 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 ``` -## ⚠️ КРИТИЧНО: `--label-enable` и Jellyfin +## ⚠️ КРИТИЧНО: Watchtower и Jellyfin — история и принятое решение -**Watchtower уже один раз сломал Jellyfin** (см. [[personal/tech/jellyfin-db-schema-mismatch]]): переключил мажорную версию 10.11.8 → 12.1, БД мигрировала вперёд, сервер перестал стартовать с `no such column: p.Permission_Permissions_Guid`, Jellyfin отдавал 503. +**Watchtower уже один раз сломал Jellyfin** (см. [[personal/tech/jellyfin-db-schema-mismatch]]): контейнер остался на старом образе 10.11.8 при уже мигрированной до 12.1 БД → `no such column: p.Permission_Permissions_Guid` → 503. -Поэтому **Jellyfin нельзя давать в автообновление без пина тега**. Если ставить ему label — сначала заменить `image: jellyfin/jellyfin` (без тега = latest) на пиновый, например `jellyfin/jellyfin:12.1`. +Разбор инцидента показывает: **сама миграция БД прошла нормально**, упало из-за рассинхрона «старый сервер + новая схема». То есть мажорный апдейт сам по себе БД не ломает. -Правило: `latest` + автомажор = риск сломать БД (EF Core не умеет даунгрейд схемы). Для сервисов с миграциями БД пинить мажорную версию. +**Решение 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 @@ -115,10 +159,10 @@ done | # | Пункт | Статус | |---|---|---| -| 1 | Решить вариант 1 / вариант 2 для `--label-enable` и проставить label | ⏳ ждёт Alex | -| 2 | `Allowed Hosts is not configured` warning в Radarr/Sonarr/Prowlarr — ограничить, какие hostname могут обращаться | ⏳ отдельная задача | -| 3 | Найдены новые образы при прогоне: `portainer`, `cloudflared`, `transmission` — обновить при необходимости | ℹ️ не делалось (transmission без label, portainer/cloudflared — свои тонкости) | -| 4 | Home Assistant на Kraken — `Exited (128)` ~2 месяца, не поднимался (см. [[family/how-to/kraken-access]]) | ⏳ отдельная задача | +| 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`). ## Теория (реюзабельно) diff --git a/personal/tech/watchtower-docker-updates.md b/personal/tech/watchtower-docker-updates.md index b9786943..fd655004 100644 --- a/personal/tech/watchtower-docker-updates.md +++ b/personal/tech/watchtower-docker-updates.md @@ -108,7 +108,11 @@ level=info msg="Update session completed" failed=0 scanned=N skipped=0 updated=0 - Jellyfin на Kraken: `latest` уехал 10.11.8 → 12.1, БД мигрировала вперёд, откатить схему нельзя → сервер отдавал **503**, `no such column: ...`. Детали: [[personal/tech/jellyfin-db-schema-mismatch]]. -**Правило:** сервисам с БД и миграциями — пиновый тег (`image: jellyfin/jellyfin:12.1`), НЕ `latest` + watchtower. Либо не давать им label, либо сначала пин. +**Правило (общее):** сервисам с forward-only миграциями БД безопаснее пиновый тег (`image: jellyfin/jellyfin:12.1`), а не `latest` + автообновление. + +⚠️ **Но это рекомендация, не аксиома — на Kraken решено иначе.** Alex 2026-09-20 явно выбрал `latest` для Jellyfin: «пусть ставит до всех публичных релизов», т.е. включая мажор 13. Риск принят осознанно, бэкап БД делается перед пересозданием. См. [[family/how-to/kraken-watchtower]] § «Про Jellyfin и тег». + +Отдельно важный нюанс: **упал не мажорный апдейт как таковой**, а рассинхрон «контейнер на старом образе + уже мигрированная БД». Сама миграция прошла нормально. То есть мажорный апдейт БД не ломает — ломает откат сервера назад без отката схемы. ## Питфоллы диагностики