Files
jellybit/docs/adr/ADR-2026-06-13-go-single-binary.md
T

3.9 KiB

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

  • Дата: 2026-06-13

Контекст

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.