Files
jellybit/docs/adr/ADR-2026-06-13-go-single-binary.md
T
av 66d39297c5 docs: проект переведён на канон документов версии 4
- каталог задач: PLAN.md → ROADMAP.md с каноническими секциями, все 44
  записи получили тип, заголовки приведены к форме своего типа
- расхождения, найденные судьями канона: исключения инварианта «источник
  неприкосновенен», инвариант про один активный infohash, UTC в logging.md,
  поведение из architecture.md заменено ссылками на спеки
- триггеры профиля ревью переписаны под умолчание standard
2026-08-06 13:32:06 +03:00

4.1 KiB

Go и доставка одним бинарём

  • Дата: 2026-06-13
  • Источник: архивного design.md нет — решение принято до перехода проекта на OpenSpec (первый архивный change — 2026-06-28); первичный материал — история git

Контекст

Jellybit — новый сервис, который будет жить на домашнем медиа-сервере umbar. Нужно выбрать язык и способ доставки. Силы и ограничения:

  • Это домашняя лаборатория, хочется максимально простой доставки: собрал здесь — скопировал готовый артефакт на сервер, без рантайма и лишних зависимостей на самой машине.
  • В umbar уже устоялось разделение: Python+uv используется вместе с Ansible (инфраструктура), а не для прикладных сервисов.
  • У автора уже есть несколько сервисов на Go — это знакомый и привычный стек именно под сервисы.
  • Сервису нужны: клиент qBittorrent, обращения к LLM, опц. клиенты TMDB/TVDB, разбор имён релизов.

Рассмотренные варианты

  • Go — один статический бинарь (CGO_ENABLED=0), копируется на сервер; минимальный docker-образ. Знакомый стек. Минус: нет хорошего аналога питоновского guessit для разбора имён релизов.
  • Python + uv — богатая экосистема распознавания (guessit), но тянет рантайм и зависимости на сервер; в проекте уже занят инфра-ролью при Ansible. Смешивать прикладной сервис с инфра-тулингом не хочется.
  • TypeScript / Node — экосистема есть, но рантайм на сервере и не основной стек автора для сервисов.

Решение

Пишем jellybit на Go, доставляем одним статическим бинарём: сборка в этом репозитории → готовый артефакт с нужной обвязкой копируется на umbar. На сервере не нужны ни рантайм, ни менеджер пакетов.

Причина: при домашней лаборатории решающее — простота доставки и знакомство со стеком, а не богатство библиотек распознавания. Слабость Go в разборе имён релизов закрываем дешёвым go-ptn плюс основной разбор всё равно делает LLM; при нехватке точности guessit можно завернуть лёгким сервисом-спутником рядом с бинарём (тоже один файл). Python остаётся за инфраструктурой (umbar, Ansible).

Последствия

  • + Доставка тривиальна: один файл, без рантайма и зависимостей на сервере; минимальный docker-образ.
  • + Стек знаком автору, переиспользуется опыт других Go-сервисов.
  • + Чёткая граница: Go — прикладные сервисы, Python+uv — инфра.
  • - Нет первоклассного guessit; точность пред-парса ниже. Митигация: go-ptn + LLM, при необходимости — guessit-спутник.
  • - Часть клиентов (например, TVDB v4) придётся писать руками — зрелых готовых библиотек меньше, чем в Python.