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