docs: устранены расхождения документов между собой и с кодом
- README разгружен: контракт HTTP API, таблицы БД, состояния задач и белый список отданы нормативным источникам ссылками - в `architecture.md` и `review.md` числа и механика захвата задачи заменены ссылками на `database.md`, а описание конвейера ревью — на прогон от 2026-08-11 - в `CLAUDE.md` и `security.md` поправлены границы домена, оценка объёма записи и адрес очереди задач
This commit is contained in:
@@ -43,16 +43,10 @@
|
||||
|
||||
### Белый список Telegram
|
||||
|
||||
Бот отвечает только тем, кто перечислен в `[server] users_while_list`. В
|
||||
`config.dist.toml` этого ключа нет — добавьте его сами:
|
||||
|
||||
```toml
|
||||
[server]
|
||||
users_while_list = ["@username"]
|
||||
```
|
||||
|
||||
Значения сверяются со строкой автора сообщения из Telegram (`@username` либо имя
|
||||
с фамилией), а не с числовым id.
|
||||
Бот отвечает только тем, кто перечислен в конфиге. Кого и по какому признаку он
|
||||
пускает — [docs/security.md](docs/security.md), «Что разграничивает доступ»;
|
||||
известные прорехи образца конфига, включая недостающий ключ белого списка, —
|
||||
[docs/conventions/config.md](docs/conventions/config.md).
|
||||
|
||||
## Деплой
|
||||
|
||||
@@ -66,76 +60,22 @@ inv pl -- transcriber
|
||||
локально и едет на сервер через `docker save`/`load`, реестр не участвует.
|
||||
Локально образ можно собрать и руками — `task image` даст `transcriber:dev`.
|
||||
|
||||
## API Endpoints
|
||||
## HTTP API
|
||||
|
||||
### POST /api/audio
|
||||
Четыре маршрута: `POST /api/audio` — приём записи, `GET /api/status/:id` —
|
||||
готовность задачи, `GET /metrics` — метрики Prometheus с префиксом
|
||||
`transcriber_`, `GET /health` — проверка живости.
|
||||
|
||||
Загружает аудиофайл и создает задачу на расшифровку. Отвечает `201 Created`.
|
||||
|
||||
**Параметры:**
|
||||
- `audio` (form-data) - аудиофайл для расшифровки
|
||||
|
||||
**Пример запроса:**
|
||||
```bash
|
||||
curl -X POST \
|
||||
http://localhost:8080/api/audio \
|
||||
-F "audio=@/path/to/your/audio.mp3"
|
||||
```
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"job_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||
"status": "created"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/status/:id
|
||||
|
||||
Получает статус задачи расшифровки по ID. Поле `transcription_text` появляется,
|
||||
когда задача перешла в `done`.
|
||||
|
||||
**Пример запроса:**
|
||||
```bash
|
||||
curl http://localhost:8080/api/status/550e8400-e29b-41d4-a716-446655440000
|
||||
```
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"job_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||
"status": "done",
|
||||
"created_at": "2024-01-01T12:00:00Z",
|
||||
"transcription_text": "расшифрованный текст"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /metrics
|
||||
|
||||
Метрики Prometheus с префиксом `transcriber_`.
|
||||
|
||||
### GET /health
|
||||
|
||||
Проверка работоспособности сервиса.
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"message": "Transcriber service is running"
|
||||
}
|
||||
```
|
||||
Контракт приёма и опроса нормативен и живёт в
|
||||
[openspec/specs/intake/spec.md](openspec/specs/intake/spec.md): поля запроса и
|
||||
ответа, коды и условия. Менять его — необратимое действие
|
||||
([CLAUDE.md](CLAUDE.md), «Работа»), и второго описания у него быть не должно.
|
||||
|
||||
## Состояния задач
|
||||
|
||||
- `created` - задача создана, файл сохранён, ждёт конвертации
|
||||
- `converted` - файл сконвертирован в ogg, ждёт отправки на распознавание
|
||||
- `transcribe` - распознавание запущено в Yandex SpeechKit, ждём результата
|
||||
- `done` - задача завершена успешно
|
||||
- `failed` - задача завершена с ошибкой
|
||||
|
||||
Задачи двигают три фоновых воркера: `conversion_worker`, `transcribe_worker` и
|
||||
`check_worker`. Каждый опрашивает базу раз в секунду и делает один шаг.
|
||||
Перечень состояний, переходы между ними и число воркеров —
|
||||
[docs/database.md](docs/database.md), разделы «Таблицы» и «Представление
|
||||
данных»; как сложен конвейер целиком — [docs/architecture.md](docs/architecture.md).
|
||||
|
||||
## Структура проекта
|
||||
|
||||
@@ -166,25 +106,9 @@ transcriber/
|
||||
|
||||
## База данных
|
||||
|
||||
### Таблица `files`
|
||||
- `id` (TEXT) - UUID файла
|
||||
- `storage` (TEXT) - где лежит файл: `local` или `s3`
|
||||
- `file_name` (TEXT) - имя файла в хранилище
|
||||
- `size` (INTEGER) - размер файла в байтах
|
||||
- `created_at` (DATETIME) - время создания
|
||||
|
||||
### Таблица `transcribe_jobs`
|
||||
- `id` (TEXT) - UUID задачи
|
||||
- `state` (TEXT) - состояние задачи
|
||||
- `source` (TEXT) - откуда пришла задача: `api`, `telegram` или `unknown`
|
||||
- `file_id` (TEXT) - ссылка на текущий файл задачи
|
||||
- `delay_time` (DATETIME) - не брать задачу раньше этого времени
|
||||
- `acquisition_id`, `acquire_time` - захват задачи воркером
|
||||
- `recognition_op_id` (TEXT) - ID операции распознавания в Yandex Cloud
|
||||
- `transcription_text` (TEXT) - результат распознавания
|
||||
- `is_error` (BOOLEAN), `error_text` (TEXT) - признак и текст ошибки
|
||||
- `tg_chat_id`, `tg_reply_message_id` - куда отправить результат в Telegram
|
||||
- `created_at`, `updated_at` (DATETIME) - времена создания и обновления
|
||||
Две таблицы, `files` и `transcribe_jobs`. Колонки, ключи, правило времени и
|
||||
идентификаторов, а также механика захвата задачи воркером —
|
||||
[docs/database.md](docs/database.md).
|
||||
|
||||
## Разработка
|
||||
|
||||
@@ -204,12 +128,11 @@ goose -dir migrations sqlite3 data/transcriber.db up
|
||||
goose -dir migrations sqlite3 data/transcriber.db down
|
||||
```
|
||||
|
||||
Проверки перед коммитом:
|
||||
Проверки перед коммитом — одной командой:
|
||||
|
||||
```bash
|
||||
go build ./...
|
||||
go vet ./...
|
||||
gofmt -l .
|
||||
go test ./...
|
||||
golangci-lint run
|
||||
task gate
|
||||
```
|
||||
|
||||
Что она гоняет, чем краснеет и какой отказ считается объявленным долгом —
|
||||
[CLAUDE.md](CLAUDE.md), раздел «Гейт».
|
||||
|
||||
Reference in New Issue
Block a user