Files
transcriber/tasks/items/pocketbase-storage.md
T
av d2c85af80a tasks: целевая картина пересобрана — три цели, тринадцать задач, сдвинутые границы
- паспорт: сервис объявлен архивом с бессрочным хранением записей и текстов,
  машинная вычитка расшифровки внутри границ, приложение — основной вход;
  добавлены две границы: не файловое хранилище общего назначения и не биллинг;
- заведены цели upload-reliability, user-settings, usage-stats и тринадцать
  задач; очередь пересобрана — сперва починки, затем разведки о хранилище,
  затем доступ и владелец, и только потом экраны;
- архитектура: четыре новых открытых вопроса — приём большого файла, учёт
  расхода, срок хранения, потолок шести часов.
2026-08-11 10:05:22 +03:00

3.6 KiB

🧹 Перевести хранилище на встроенный PocketBase

  • Тип: chore
  • Категория: Очередь
  • Зачем: Из трёх доводов за перевод остался один: учётные записи ушли к Authelia, страницу статистики рисует само приложение, а панель администратора не проверена.

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

Из трёх доводов 2026-08-11 осталось полтора: учётные записи заводит Authelia по OIDC, страницу статистики рисует само приложение. Довод про панель администратора проверяет разведка pocketbase-admin-fit, и её ответ решает, берётся эта задача или уходит в REJECTED.md.

Данные не переносим — база заводится с чистого листа, и это решение принято сознательно.

Затрагивает

  • таблицы files и transcribe_jobs, каталог migrations/ и весь механизм goose;
  • internal/adapter/repo/sqlite целиком, включая захват задачи через FindAndAcquire;
  • internal/contract, интерфейсы FileRepository и TranscriptJobRepository;
  • ключ конфигурации [database] path и раскладка каталога data/;
  • сборка образа: PocketBase тянет свой набор зависимостей, а mattn/go-sqlite3 с его требованием CGO может уйти;
  • docs/database.md — схема, представление данных и таблица настроек.

Критерии приёмки

  • Сервис поднимается на чистом каталоге данных, накатывает свою схему сам и принимает запись обоими входами. Оракул — запуск на пустом data/ и прогон записи из Telegram и через POST /api/audio до состояния done.
  • Захват задачи воркером не выдаёт одну запись двум вызывающим. Оракул — тест на трёх параллельных вызовах захвата по одному состоянию: ровно один получает запись.
  • Задача, брошенная на середине, достаётся снова по истечении срока захвата. Оракул — тест с проставленным задним числом acquire_time.
  • docs/database.md описывает новую схему, а старые упоминания goose и goqu из документов канона убраны. Оракул — task gate, шаг docs.py check.

Рамки

Данные прежней базы не переносим и не пытаемся сохранить; выкладку не запускаем; смена формата хранения на сервере необратима, и момент перехода назначает человек.