хранилище, файлы записей и очередь переведены на встроенную PocketBase

- записи, метаданные и файлы съехались под один каталог данных; появилась
  панель владельца, а gin, goqu, goose и требование CGO ушли
- захват задачи стал одним запросом с RETURNING; заведены число попыток,
  состояние dead и нарастающая пауза вместо признака is_error
- имя файла в хранилище задаёт сервис и в журнал не идёт: вместе с
  идентификатором записи оно собирало бы ссылку на скачивание
This commit is contained in:
av
2026-08-12 08:31:59 +03:00
parent 09cedc4e61
commit 01cc31d45f
55 changed files with 5238 additions and 1235 deletions
+16 -27
View File
@@ -9,7 +9,7 @@
- Конвертация в ogg через ffmpeg
- Распознавание речи через Yandex SpeechKit
- Отслеживание статуса задач расшифровки
- SQLite для хранения метаданных, метрики Prometheus
- Встроенная PocketBase для метаданных, файлов и панели владельца; метрики Prometheus
## Технологии
@@ -17,9 +17,8 @@
- **Telegram**: go-telegram-bot-api
- **Распознавание**: Yandex SpeechKit + Yandex Object Storage (S3)
- **Конвертация**: ffmpeg
- **SQL Builder**: doug-martin/goqu
- **Миграции БД**: pressly/goose
- **База данных**: SQLite
- **Хранилище, файлы и панель**: встроенная PocketBase
- **База данных**: SQLite внутри PocketBase (через modernc.org/sqlite, CGO не нужен)
- **Метрики**: prometheus/client_golang
## Установка и запуск
@@ -97,36 +96,26 @@ transcriber/
│ ├── metaviewer/ffmpeg/ # Длительность аудио
│ ├── recognizer/yandex/ # SpeechKit + Object Storage
│ ├── telegram/ # Отправка сообщений
│ └── repo/sqlite/ # Репозитории
── migrations/ # Миграции goose, вшиты в бинарник через go:embed
── data/
── files/ # Директория для сохранения файлов
└── transcriber.db # SQLite база данных (создается автоматически)
│ └── repo/pocketbase/ # Репозитории, схема коллекций, правила панели
── data/ # Каталог данных: база и файлы записей вместе
── data.db # База хранилища (создаётся автоматически)
── storage/ # Файлы записей в раскладке хранилища
```
## База данных
## Хранилище
Две таблицы, `files` и `transcribe_jobs`. Колонки, ключи, правило времени и
Две коллекции, `files` и `transcribe_jobs`. Поля, ключи, правило времени и
идентификаторов, а также механика захвата задачи воркером —
[docs/database.md](docs/database.md).
[docs/database.md](docs/database.md). Панель владельца — по адресу `/_/` того же
порта; пароль от неё задаёт сам владелец по приглашению, которое сервис печатает
в журнал при первом запуске.
## Разработка
Миграции накатываются автоматически при старте сервиса — они вшиты в бинарник
через `//go:embed`. Достаточно положить новый файл в `migrations/`.
Создать файл миграции и накатить или откатить её вручную:
```bash
# Создание новой миграции
goose -dir migrations create migration_name sql
# Применение миграций
goose -dir migrations sqlite3 data/transcriber.db up
# Откат миграций
goose -dir migrations sqlite3 data/transcriber.db down
```
Схему двигают шаги миграций PocketBase на Go —
`internal/adapter/repo/pocketbase`. Непринятые шаги накатываются при подъёме
хранилища, прежде чем стартуют воркеры и сервер. Применённый шаг не
переписывается: изменение — только новым файлом шага.
Проверки перед коммитом — одной командой: