Правки после ревью документации

This commit is contained in:
2026-06-13 21:47:30 +03:00
parent 547940ea59
commit 34bd2a5b5f
10 changed files with 419 additions and 162 deletions
+39
View File
@@ -0,0 +1,39 @@
# Docker как единица деплоя, образ собирается на сервере
- Дата: 2026-06-13
## Контекст
jellybit — статический Go-бинарь (см.
[ADR-2026-06-13-go-single-binary](ADR-2026-06-13-go-single-binary.md)). На
сервере umbar qBittorrent и (в планах) Jellyfin работают в docker. Нужно
выбрать, как запускать jellybit и как доставлять его на сервер.
## Рассмотренные варианты
- **Нативный systemd-юнит** — ближе всего к «просто скопировать бинарь»,
но это отдельная среда вне docker; разнобой со смежными приложениями
(сети, монтирования, политики рестарта).
- **Docker, образ собран и запушен из CI/реестра** — каноничнее, но в
домашней лаборатории это лишний реестр и пайплайн.
- **Docker, образ собирается на сервере из готового бинаря** — на сервер
кладутся бинарь + `Dockerfile`, `docker build` выполняется на месте.
## Решение
jellybit запускаем в **docker** — в одной среде с qBittorrent/Jellyfin
(единый способ управления, сети, монтирований). Образ **собираем на
сервере** из доставленного бинаря и `Dockerfile` (копирует бинарь в
`distroless/static`). Go-тулчейн и реестр на сервере не нужны. `Dockerfile`
(упаковка) живёт в jellybit; оркестрация (доставка, build, compose с
`network_mode: host`, `user 1000:1000`, mount `/srv` и data-тома) — в
umbar.
## Последствия
- `+` Одна среда со смежными сервисами; единые сети/монтирования/политики.
- `+` Доставка остаётся дешёвой: бинарь + `Dockerfile`, без реестра.
- `+` Образ версионируется (тег по сборке) — есть откат.
- `-` Шаг `docker build` на сервере (на Intel N150 дёшево).
- `-` Лёгкое отступление от «просто скопировать бинарь» — оправдано
единообразием среды с qBittorrent/Jellyfin.
+42
View File
@@ -0,0 +1,42 @@
# Хардлинки вместо копирования и симлинков
- Дата: 2026-06-13
## Контекст
jellybit раскладывает скачанные qBittorrent'ом файлы в библиотеку
Jellyfin. Два требования тянут в разные стороны: раздача должна
продолжаться (источник неприкосновенен), а место на диске — не
дублироваться. qBittorrent пишет в `/srv/downloads`, Jellyfin читает
`/srv/media` — обе ветки на одной ФС.
## Рассмотренные варианты
- **Хардлинк** — второе имя того же inode в `/srv/media`. Плюсы: ноль
доп. места, раздача цела, файл «настоящий» для Jellyfin. Минусы: только
в пределах одной ФС; нельзя линковать каталоги (только файлы).
- **Копирование** (поведение radarr/sonarr по умолчанию) — дублирует
десятки ГБ на каждый релиз; для домашнего сервера дорого и медленно.
- **Симлинк** — место экономит, но ломается при перемещении источника,
Jellyfin/плееры иногда плохо дружат с символическими ссылками, а
удаление раздачи рвёт библиотеку.
- **Перемещение** — убивает раздачу (сид, ratio) и нарушает «источник
неприкосновенен».
## Решение
Раскладываем **хардлинками**. На одной ФС (`/srv`) это бесплатно по месту,
раздача продолжается, файл неотличим от обычного. Линкуем только файлы,
целевые каталоги создаём `mkdir`. Жёсткий инвариант: jellybit никогда не
перемещает и не удаляет исходные файлы; undo удаляет только свои ссылки
под `/srv/media`.
## Последствия
- `+` Ноль дублирования, мгновенно, раздача цела.
- `+` Простая и безопасная модель операций: только add-link и
remove-own-link.
- `-` Требуется одна ФС — внутри docker обеспечивается монтированием
общего родителя `/srv` (иначе `link(2)` даёт `EXDEV`).
- `-` Каталоги хардлинковать нельзя — раскладка пофайловая, целевые папки
создаём сами (0755, владелец 1000:1000).
+2
View File
@@ -56,4 +56,6 @@
| Дата | Запись | Статус |
| ---------- | ---------------------------------------------------------------- | ------ |
| 2026-06-13 | [Docker как единица деплоя](ADR-2026-06-13-docker-deploy.md) | — |
| 2026-06-13 | [Хардлинки вместо копирования и симлинков](ADR-2026-06-13-hardlinks.md) | — |
| 2026-06-13 | [Go и доставка одним бинарём](ADR-2026-06-13-go-single-binary.md) | — |