Качество, безопасность и приёмка
Проверка качества звонков и транскрипции, безопасность production, регламент эксплуатации, чек-листы приёмки и справочник переменных окружения.
Финальный блок серверной части: как проверить качество звонков и транскрипции, обеспечить безопасность production, выстроить регламент эксплуатации и принять установку по чек-листам. В конце — справочник переменных окружения и финальная проверка всей установки.
Проверка качества звонков
Матрица
| Caller | Callee | Сеть |
|---|---|---|
| Chrome desktop | Android | Wi-Fi/LTE |
| Chrome desktop | iPhone PWA | Wi-Fi/LTE |
| Android | Android | LTE/LTE |
| iPhone PWA | Android | Wi-Fi/LTE |
| Safari desktop | Chrome | разные сети |
Сценарий
Для каждой пары:
- Audio call.
- Accept/reject.
- Mute/unmute.
- Video on/off.
- Camera flip.
- Background/foreground.
- Network switch.
- End.
- Повторный звонок сразу после окончания.
Что записать при ошибке
- точное время;
- caller handle и callee handle;
- callId;
- устройства, ОС и версия;
- сети;
- кто кого слышал;
- было ли видео;
- текст ошибки.
Серверные журналы
Ищите:
[CALL] INVITE
[CALL] ACCEPT
[CALL] REJECT
[CALL] END
[CALL] delete room failed
WebRTC stats
Собирайте: ICE state, selected candidate, relay/direct, RTT, jitter, packets lost, bitrate, frames dropped, audio level и codec.
Проверка транскрипции
Worker
curl -fsS http://127.0.0.1:8001/health
journalctl -u whisper-worker -n 200 --no-pager
Очередь
Backend обрабатывает один job за раз. Живые chunks имеют практический приоритет относительно финальной диаризации через механизм preemption.
Тест
Используйте запись 2–3 минуты с двумя спикерами, без музыки и одновременной речи, на русском языке, с одинаковым расстоянием до микрофона.
Проверьте текст, длительность, timestamps, число спикеров, сохранение аудио и итоговый status.
Плохой текст
Проверьте input codec, ffmpeg, sample rate, громкость, шум, ASR model, language, filter и CPU throttling.
Плохое разделение
Проверьте segmentation model, embedding model, thresholds, overlapping speech, короткие реплики и акустику.
Важно. Не подбирайте threshold по одной записи. Используйте набор разных совещаний.
Зависание
Проверьте worker PID, memory, native crash, diarization_status, attempts, file path и свободное место.
Безопасность production
Обязательное
- уникальные JWT secrets;
- HTTPS;
- закрытые internal ports;
- firewall;
- service users;
- строгие права;
- backup;
- обновления;
- log review;
- secret rotation.
Не хранить в Git
.env
runtime/env
data/app.db*
data/uploads/
data/audio/
data/vapid.json
data/fcm-service-account.json
mobile/android/app/google-services.json
Android keystore
ASR models
JWT
Типы: session, conference join, transcript upload, transcript audio, stream token, LiveKit token.
Каждый token должен проверять kind, subject, TTL и принадлежность к объекту.
Internal endpoints
- LiveKit webhook проверяет подпись;
- MediaMTX auth проверяет token/shared secret;
- Whisper слушает localhost;
- LiveKit admin API не публикуется напрямую.
Файлы
- случайные storage names;
- защита от path traversal;
- безопасный Content-Type;
- авторизация preview/download;
- ограничение размера;
- retention.
Регистрация
Если сервис предназначен только для компании, публичная регистрация должна быть ограничена до внешнего запуска.
Регламент эксплуатации
Каждый день
- health;
- disk;
- ошибки backend;
- ошибки worker;
- transcript queue;
- push;
- активные конференции;
- backup.
Каждую неделю
- полный smoke test;
- Android call test;
- iPhone PWA call test;
- Office preview;
- restore sample;
- dependency alerts;
- failed diarization.
Каждый месяц
- восстановление backup;
- ротация старых logs;
- capacity review;
- TURN test;
- TLS expiry;
- access review;
- Android release check;
- модели PrimeResume.
Перед релизом
- ветка актуальна;
- diff просмотрен;
- нет секретов;
- все тесты прошли;
- есть backup;
- есть rollback;
- проверены миграции;
- проверен PWA cache;
- проверен Android update;
- проверены calls.
Чек-листы приемки
Аккаунт
- регистрация;
- login;
- sliding session;
- avatar;
- email verify;
- password reset;
- phone.
Чаты
- DM;
- group;
- typing;
- unread;
- mute;
- pin;
- block;
- edit/delete;
- attachments;
- drag-and-drop.
Звонки
- incoming push;
- accept;
- reject;
- timeout;
- repeat call;
- microphone;
- camera;
- camera flip;
- audio output;
- end.
Конференции
- instant;
- scheduled;
- invites;
- prejoin;
- guest;
- owner transfer;
- lock;
- kick;
- mute all;
- screen share;
- empty auto-end;
- duration end.
PrimeResume
- conference recording;
- live chunks;
- transcript;
- diarization;
- summary;
- recap;
- PDF;
- audio playback;
- search;
- retention.
Диктофон
- start/stop;
- background processing;
- несколько записей подряд;
- recovery IndexedDB;
- import phone audio;
- upload progress;
- history;
- speakers.
Платформы
- desktop web;
- Android app;
- Android PWA;
- iPhone PWA;
- tablet;
- narrow mobile layout.
Справочник переменных окружения
Runtime
| Переменная | Назначение |
|---|---|
APP_ROOT_DIR | Корень |
APP_PUBLIC_DIR | Frontend |
APP_DATA_DIR | Данные |
APP_RUNTIME_DIR | Runtime configs |
APP_HOST | Bind host |
PORT | HTTP port |
Файлы
| Переменная | Назначение |
|---|---|
CHAT_FILE_MAX_BYTES | Максимальный файл |
CHAT_TEXT_PREVIEW_BYTES | Text preview |
CHAT_OFFICE_PREVIEW_MAX_BYTES | Office preview |
OFFICE_PREVIEW_TIMEOUT_MS | LibreOffice timeout |
LIBREOFFICE_BIN | LibreOffice path |
Security
| Переменная | Назначение |
|---|---|
APP_JWT_SECRET | Session/conference JWT |
STREAM_JWT_SECRET | Media stream JWT |
SESSION_TTL_SECONDS | Session TTL |
AUDIO_TOKEN_TTL_SEC | Audio URL token TTL |
LiveKit/TURN
| Переменная | Назначение |
|---|---|
LIVEKIT_API_KEY | API key |
LIVEKIT_API_SECRET | API secret |
LIVEKIT_PUBLIC_URL | Client URL |
LIVEKIT_API_URL | Internal RoomService |
TURN_HOST | TURN |
TURN_TLS_HOST | TURN TLS |
TURN_SHARED_SECRET | TURN auth |
TURN_CREDENTIAL_TTL | Credential TTL |
Integrations
| Переменная | Назначение |
|---|---|
FCM_SERVICE_ACCOUNT | Firebase credential |
DEEPSEEK_API_KEY | LLM key |
DEEPSEEK_MODEL | LLM model |
DEEPSEEK_BASE_URL | LLM URL |
SMTP_HOST | SMTP |
SMTP_PORT | SMTP port |
SMTP_USER | SMTP user |
SMTP_PASS | SMTP password |
SMTP_SECURE | TLS mode |
SMTP_FROM | Sender |
APP_BASE_URL | Public application URL |
SMS_RU_API_ID | SMS.ru |
ASR
| Переменная | Назначение |
|---|---|
WHISPER_WORKER_URL | Worker URL |
ASR_ENGINE | faster-whisper/sherpa |
WHISPER_MODEL | Whisper model |
WHISPER_DEVICE | CPU/CUDA |
WHISPER_COMPUTE | Compute type |
ASR_NUM_THREADS | CPU threads |
SHERPA_MODEL_DIR | GigaAM |
DIARIZATION_SEGMENTATION_MODEL | Segmentation ONNX |
DIARIZATION_EMBEDDING_MODEL | Embedding ONNX |
DIARIZATION_CLUSTER_THRESHOLD | Cluster threshold |
DIARIZATION_SPEAKER_MATCH_THRESHOLD | Speaker match |
ASR_WINDOW_SECONDS | ASR window |
ASR_WINDOW_OVERLAP_SECONDS | ASR overlap |
DIARIZATION_WINDOW_SECONDS | Diarization window |
DIARIZATION_WINDOW_OVERLAP_SECONDS | Diarization overlap |
DIARIZATION_MIN_SPEAKER_TURN_SECONDS | Min speaker turn |
ASR_AUDIO_FILTER | ffmpeg filters |
FFMPEG_BIN | ffmpeg path |
Финальная проверка
PrimeMeet можно считать настроенным, если:
- Пользователь устанавливает клиент и входит.
- Разрешения работают предсказуемо.
- Сообщения доставляются без перезагрузки интерфейса.
- Файлы загружаются, открываются и скачиваются.
- Звонок проходит между разными сетями.
- Конференция имеет владельца и корректно завершается.
- Календарь и карточки отражают живое состояние.
- Android и iPhone получают уведомления в поддерживаемых режимах.
- Диктофон продолжает фоновые задачи и принимает аудио с телефона.
- PrimeResume создает текст и разделяет спикеров.
- Backup восстанавливается.
- Обновление имеет проверенный rollback.
Важно. Если любой пункт не выполнен, не маскируйте проблему повторным перезапуском. Зафиксируйте время, пользователя, устройство, request/call/conference ID, соберите логи нужного компонента и устраните первопричину.