Files
transcriber/openspec/changes/archive/2026-08-12-pocketbase-storage/proposal.md
T
av 01cc31d45f хранилище, файлы записей и очередь переведены на встроенную PocketBase
- записи, метаданные и файлы съехались под один каталог данных; появилась
  панель владельца, а gin, goqu, goose и требование CGO ушли
- захват задачи стал одним запросом с RETURNING; заведены число попыток,
  состояние dead и нарастающая пауза вместо признака is_error
- имя файла в хранилище задаёт сервис и в журнал не идёт: вместе с
  идентификатором записи оно собирало бы ссылку на скачивание
2026-08-12 08:31:59 +03:00

4.8 KiB

Why

Записи, их метаданные и сами файлы лежат порознь, и владелец сервиса не видит их ничем, кроме консоли на сервере: чтобы посмотреть задачу или послушать запись, он идёт руками в базу и в каталог на диске. Заодно принятая запись держится на захвате из двух шагов подряд, между которыми задачу может перехватить соседний воркер, а задача, падающая на каждой попытке, падает вечно и никем не считается.

What Changes

  • Записи, их метаданные и файлы съезжаются в одно хранилище, и владелец получает панель, где видит задачу строкой, правит её и слушает саму запись.
  • BREAKING Раскладка файлов на диске меняется: плоского каталога с именами по идентификатору не остаётся, файл ложится в раскладку хранилища. Момент перехода назначает человек.
  • BREAKING Прежние данные не переносятся. Сервис начинает с чистого каталога и заводит свою схему сам.
  • Файл перестаёт отдаваться чтением с диска и отдаётся ссылкой, которую хранилище строит по записи.
  • Захват задачи воркером становится одним неделимым шагом: две задачи одному состоянию больше не достаются.
  • У задачи появляется число попыток. Задача, исчерпавшая их, переходит в состояние «мертва»: из выборки исчезает, но остаётся видна владельцу и возвращается в работу снятием состояния.
  • Пауза перед повтором нарастает с номером попытки.
  • Сборка перестаёт требовать CGO.
  • Появляется секрет, которого не было: пароль владельца от панели. В конфигурации он не лежит.

Capabilities

New Capabilities

  • storage: где живут запись, её метаданные и её файл; как файл попадает в хранилище и как отдаётся обратно; что владелец видит и правит в панели; с каким состоянием сервис поднимается на чистом каталоге.

Modified Capabilities

  • pipeline: захват задачи становится неделимым; появляются число попыток, нарастающая пауза и состояние «мертва» вместо признака ошибки, исключающего задачу навсегда; описывается срок протухания захвата.
  • intake: принятая запись уезжает в хранилище, а не в плоский каталог; требование «имя отправителя в хранилище не попадает» остаётся в силе и в новой раскладке.

Impact

  • Хранилище задач и файлов целиком: прежний слой запросов, построитель запросов и механизм миграций уходят вместе с каталогом migrations/.
  • Договор между ядром и хранилищем: интерфейсы репозиториев задач и файлов.
  • Состав полей задачи: прибавляется число попыток, признак ошибки уступает место состоянию в перечне состояний.
  • Ключи конфигурации: путь к базе и путь к каталогу файлов заменяются одним каталогом данных.
  • Приём по HTTP и приём из Telegram — в части того, куда кладётся принятая запись.
  • Сборка образа: набор зависимостей меняется, требование CGO уходит.
  • Документы: схема хранилища, инварианты и запреты с путями, модель угроз в части того, из чего строятся пути.