- паспорт: сервис объявлен архивом с бессрочным хранением записей и текстов, машинная вычитка расшифровки внутри границ, приложение — основной вход; добавлены две границы: не файловое хранилище общего назначения и не биллинг; - заведены цели upload-reliability, user-settings, usage-stats и тринадцать задач; очередь пересобрана — сперва починки, затем разведки о хранилище, затем доступ и владелец, и только потом экраны; - архитектура: четыре новых открытых вопроса — приём большого файла, учёт расхода, срок хранения, потолок шести часов.
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.
Рамки
Данные прежней базы не переносим и не пытаемся сохранить; выкладку не запускаем; смена формата хранения на сервере необратима, и момент перехода назначает человек.