Перейти к содержанию

Эксплуатация

Страница для тех, кто отвечает за работу сервера. Сначала куда смотреть, когда что-то не так, затем таблица «симптом, причина, действие», затем резервные копии, пределы нагрузки и смена секретов.

Куда смотреть

  1. Плашка «Требует внимания» в углу страницы владельца. Молчит, пока всё в порядке. Показывает по одному: «Расшифровка недоступна», «Не удалась проверка новых звонков», «Осталось шагов настройки: N», «Автоматический режим выключен». Нажатие ведёт в «Система» или «Автоматика».
  2. «Настройки → Система», карточка «Состояние»: «Расшифровка работает» или «Сервис расшифровки не отвечает», счётчики «В очереди», «В обработке», «С ошибкой» и ссылки «Очередь и ошибки» и «Нагрузка по дням».
  3. Страница очереди (ссылка «Очередь и ошибки», адрес /queue): «В очереди», «В обработке», «Готово сегодня», «С ошибкой», «Самое долгое ожидание», что расшифровывается сейчас с прогрессом и скоростью, список ошибок и карточки семи фоновых очередей («Фоновые очереди»). В здоровой системе ожидание падает, а задания с ошибкой не застревают.
  4. GET /readyz на домене API: поля database, redis и asr показывают, какая зависимость не отвечает.
  5. Журналы сервисов в Coolify (вкладка Logs у tgt-api, tgt-asr, tgt-migrate, tgt-dashboard).
  6. «Настройки → Люди → Показать журнал действий»: кто и когда менял настройки, права, правила.

Фоновых очередей семь: «Расшифровка», «Звонки Битрикс24», «Выгрузка Битрикс24», «Чтение CRM», «Проверка звонков», «Колбэки» и «Обслуживание». «Обслуживание» срабатывает каждые 15 секунд: возвращает в очередь забытые записи, запускает забор и проверку новых звонков по расписанию, возобновляет прерванные выгрузки и чтения CRM, строит недельные отчёты, догоняет проверки звонков. Пока оно стоит, ничего не теряется: следующий проход догонит.

Типичные сбои

Симптом Причина Что делать
Плашка «Расшифровка недоступна», в /readyz asr равно down tgt-asr запускается (после развёртывания загрузка языковой модели занимает несколько минут, при первом запуске скачивание ещё дольше), остановился или упёрся в лимит памяти Откройте журнал tgt-asr: Downloading kenlm.bin значит скачивание, T-one loaded значит готов. Дождитесь готовности. Проверьте ASR_MEMORY_LIMIT и свободное место
После простоя распознавателя записи в статусе «Ошибка» Платформа пробует расшифровать запись пять раз с паузами 30 секунд, 1, 2 и 4 минуты (около 8 минут в сумме), после чего запись получает ошибку После восстановления нажмите «Повторить все с ошибкой» на странице очереди
Записи долго «В очереди», а «В обработке» 0 Очередь «Расшифровка» приостановлена (карточка «Приостановлена», уведомление «Обработка приостановлена»), либо остановлен процесс очередей (API_RUN_MODE=api), либо не отвечает распознаватель Нажмите «Возобновить» в карточке очереди; проверьте API_RUN_MODE и плашку «Расшифровка недоступна»
Запись с ошибкой «Файла записи уже нет в хранилище, повтор не поможет» Файла нет в хранилище или хранилище не ответило в момент расшифровки: любой отказ при чтении файла получает этот код Проверьте бакет, ключи и STORAGE_KIND. Если хранилище живо, нажмите «Повторить» на странице каждой записи: общая кнопка такие записи пропускает
«Формат не поддерживается или файл повреждён, повтор не поможет» Файл не аудио или испорчен Проверьте источник файла; ошибка возникает сразу
«Запись длиннее, чем принимает сервис, повтор не поможет» Запись длиннее трёх часов Разрежьте запись во внешней системе
Не отвечает Redis (redis равно down) или данные Redis потеряны Неверный REDIS_URL, сеть, Redis остановлен или очищен Исправьте подключение. После потери данных перезапустите tgt-api: при старте он заново регистрирует расписание «Обслуживания», и забытые записи вернутся в очередь сами
database равно down, панель отвечает ошибками PostgreSQL остановлен или недоступен по сети Проверьте ресурс PostgreSQL в Coolify, затем журнал tgt-api
S3 недоступен Провайдер, ключи, DNS или сеть Загрузка файлов отвечает ошибкой, воспроизведение не работает, расшифровка получает ошибку «Файла записи уже нет...» (см. выше), забор показывает «Ошибка забора» с сообщением. Исправьте доступ и повторите записи по одной
Битрикс24 не отвечает Портал, вебхук или сеть См. таблицу в Подключение Битрикс24. Уже сохранённое продолжает работать
Чтение CRM завершилось ошибкой Портал не отвечал дольше нескольких попыток. При включённом ночном обновлении платформа запускает чтение снова, пока портал не ответит В «Настройки → Автоматика → Дополнительно → Данные из CRM» посмотрите «Последнее чтение», затем «Обновить сейчас». Новое чтение берёт только то, что появилось после последних завершённых шагов
«Последний расчёт не удался» на странице «Связь с продажами» Расчёт связи завершился ошибкой; причина названа в журнале tgt-api Нажмите «Пересчитать» (руководитель или владелец). Расчёт запускается и сам примерно раз в сутки
Проверка звонков не идёт На странице «Проверка звонков» стоит причина: нулевой дневной бюджет, не включён отдел, модель недоступна, закончились деньги, неверный ключ Исправьте названную причину. Остановки модели снимаются сами: 15 минут при нулевом балансе, 30 при неверном ключе, 2 при ограничении частоты, 5 при пяти недоступностях подряд
«Сервер API недоступен», «Нет связи с сервером» Идёт развёртывание или tgt-api перезапускается Подождите; проверьте /healthz и журнал tgt-api
Вход отвечает 429 Больше 10 неудачных входов за 5 минут с одного адреса Подождите время из заголовка Retry-After. Счётчик хранится в памяти tgt-api, перезапуск его обнуляет
no space left on device Диск заполнен См. Развёртывание: очистка Docker. Не включайте Delete Unused Volumes

Внимание

Если распознаватель не работает дольше восьми минут, записи из очереди переходят в «Ошибка» (пять попыток). На странице очереди подсказка «Записи останутся в очереди» этого не учитывает: не ждите, а нажмите «Повторить все с ошибкой», когда распознаватель вернётся.

Повтор и отмена из интерфейса

Что Где Действие
Одна запись карточка звонка «Повторить» (для «Ошибка» и «Отменено»), «Отменить обработку» (для «В очереди» и «Обработка»), «Удалить» (только владелец)
Все записи с ошибкой страница очереди «Повторить все с ошибкой». Записи, которым повтор не поможет, пропускаются, и рядом написано, сколько их
Задание фоновой очереди «Фоновые очереди» → «Открыть» → вкладка «Ошибки» «Повторить», «Удалить», «Повторить все с ошибкой» (для «Звонки Битрикс24», «Выгрузка Битрикс24», «Чтение CRM», «Проверка звонков», «Колбэки»)
Очередь целиком карточка очереди «Приостановить» и «Возобновить» (кроме «Обслуживание»); идущие задания завершаются, новые ждут
Загрузка из Битрикс24 «Что загружали» «Отменить»: уже поставленные записи остаются и будут расшифрованы
Чтение CRM карточка «Данные из CRM» «Остановить»: прочитанное остаётся, остальное дочитается в следующий раз

Задания очереди «Расшифровка» по одному не правятся: ими управляют сами записи.

Резервные копии

Что Копировать Почему
PostgreSQL да, по расписанию Coolify Единственное хранилище, которое нельзя собрать заново: записи, расшифровки, люди и права, правила проверки и словари, разметка звонков руководителями, журнал
Звук да: бакет (включите версионирование) или том audio-data Звук не восстановить из базы
Копия CRM, результаты проверок, расчёты связи, недельные отчёты нет отдельно Их можно получить заново из портала и расшифровок; перепроверка моделью тратит токены дневного бюджета
Redis нет Хранит только работу в процессе и историю монитора очередей
Модели (asr-models) нет Скачиваются заново

Один раз восстановите свежую копию в пробную базу, чтобы знать, что она работает и сколько это занимает. После восстановления tgt-migrate приводит схему к версии работающего релиза.

Если потерян Redis, платформа сама заново поставит в очередь записи из базы. Но события Битрикс24, которые ещё ждали загрузки, и доставки колбэков, которые ещё ждали отправки, теряются: при включённом автоматическом режиме звонки найдёт следующая проверка новых звонков, а результат записи интеграция может забрать запросом GET /v1/recordings/{id}.

Пределы и нагрузка

Что Предел
Размер загружаемого файла MAX_UPLOAD_MB, по умолчанию 512 МБ
Длина записи для распознавания 3 часа
Тело JSON-запроса 1 МБ
Загрузка через панель должна уложиться в 5 минут (таймаут запроса Node.js); большие и медленные передачи отправляйте прямо на домен API ключом
Очередь расшифровки прямая загрузка файлов по числу не ограничена; источники (забор, автоматическая проверка, загрузка истории) не берут больше, чем «Максимум в очереди» (по умолчанию 50)
Автоматическая проверка новых звонков не берёт больше, чем помещается в очередь, и не больше 50 000 записей за раз
Запросы к порталу не чаще двух в секунду, паузы заложены в платформу
Ограничение частоты запросов к API нет, кроме ограничения неудачных входов
Одновременных расшифровок TRANSCRIPTION_CONCURRENCY, по умолчанию 2

Для планирования: по оценке разработчиков около 8000 звонков в месяц это около 160 часов звука, которые распознаватель обрабатывает меньше чем за час в сутки.

Смена секретов

Сначала замените переменную в Coolify и разверните заново, потом отзовите старое значение там, где оно выдано.

Секрет Что происходит Затем
SESSION_SECRET все выходят из системы ничего
ASR_API_KEY одна переменная питает распознаватель и API, они перезапускаются вместе ничего
Ключ API создайте новый и отдайте интеграции отзовите старый в «Настройки → Система → API-ключи»
BITRIX24_WEBHOOK_URL, BITRIX24_WRITE_WEBHOOK_URL выпустите новый вебхук с теми же правами удалите старый в портале
BITRIX24_EVENT_TOKEN события исходящего вебхука отклоняются, пока токены не совпадут поменяйте токен в портале и здесь одновременно
S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY сначала создайте второй ключ удалите старый у провайдера
CALLBACK_SIGNING_SECRET получатель должен проверять новым значением; доставки между сменами не пройдут проверку и повторятся поменяйте у получателей в тот же момент
ANALYSIS_API_KEY проверки моделью падают, пока ключ не верен отзовите старый
Пароль в DATABASE_URL или REDIS_URL API и очереди не подключатся, пока не обновлён адрес смените пароль в ресурсе и адрес в переменной сразу

См. также