Разметка
Разметка передаёт в SmartCPD фактический результат вызова и используется для оценки качества и дальнейшего обучения детекции. Назначение разметки, способы сопоставления с вызовом и связь с контрольными группами описаны в разделе «Разметка результатов вызовов» руководства по эксплуатации.
Источники разметки должны быть доверенными и идентифицируемыми. Источником может быть агент, IVR-система, определяющая в том числе факт вступления человека в диалог, или иная внешняя система.
Опциональное поле source позволяет однозначно определить источник, проставивший разметку. Это необходимо для контроля качества данных и возможного исключения ложной или недостоверной разметки на этапе обучения системы детекции. Значение source не обязано быть человекочитаемым: достаточно стабильного уникального идентификатора конкретного источника.
Архитектурная роль и поток данных#
Разметка является внешним фактическим результатом, но технически обрабатывается в общем контуре CDR. В SmartCPD 6.0 отдельного сервиса markup-api нет: Markup API, сопоставление с вызовом и хранение разметки реализованы в cdr-collector.
CDR остается источником основной выборки вызовов в разделе «Статистика». Разметка присоединяется к соответствующему CDR как обогащение и используется для фильтрации, поиска расхождений и анализа качества. Наличие разметки не создает отдельный вызов и не заменяет факты, сохраненные в CDR.
Общий поток обработки:
- Внешняя система, портал или Markup uploader передает запись в tenant-scoped Markup API.
cdr-collectorпроверяет формат, tenant context и права доступа.- Запись сопоставляется ровно с одним существующим CDR того же клиента.
- После сопоставления
cdr-collectorсохраняет разметку со внутренней связью поsip_trace_id. - Несопоставленные, неоднозначные и повторные записи возвращаются отправителю с кодом причины и не сохраняются как самостоятельные данные.
Внешнему источнику не требуется получать или передавать sip_trace_id. Архитектурное место контура и взаимодействие компонентов описаны в разделе «Контур разметки» документа «Архитектура».
Сопоставление с вызовом и ограничения загрузки#
Разметка сопоставляется с вызовом непосредственно во время загрузки. Каждая запись должна соответствовать ровно одному вызову в CDR того же клиента.
Для одного вызова принимается одна запись разметки. Если разметка для найденного вызова уже сохранена, новая запись отклоняется с кодом duplicate.
Для всех способов сопоставления поиск выполняется только среди вызовов за последние 10 дней относительно момента загрузки. Границы этого интервала рассчитываются по времени сервера CDR Collector и не зависят от переданного клиентом ts. Если ts старше 10 дней, запись отклоняется до поиска вызова с кодом too_old.
Способ сопоставления задаётся полем call_id_type:
call_id_type | Как выполняется сопоставление |
|---|---|
sip | Значение call_id сопоставляется с Call-ID из SIP INVITE среди вызовов за последние 10 дней |
custom | Значение call_id сопоставляется с идентификатором из отдельного SIP-заголовка, сохранённым в CDR как custom_call_id, среди вызовов за последние 10 дней |
time_phone | Значение phone_number сопоставляется с номером вызываемой стороны dst, а ts — со временем начала вызова. Допустимое отклонение времени начала вызова составляет ±30 секунд; поиск также ограничен последними 10 днями |
Предпочтительно использовать sip или custom: идентификатор позволяет надёжнее связать данные контакт-центра с конкретным вызовом SmartCPD. time_phone предназначен для интеграций, в которых общий идентификатор вызова передать невозможно.
Если подходящий вызов не найден, запись отклоняется с кодом not_found. Если условиям соответствуют несколько вызовов, запись отклоняется с кодом ambiguous.
Результаты разметки#
Поле result содержит нормализованный фактический результат вызова. Поддерживаются следующие значения:
result | Что означает | Использование |
|---|---|---|
human | На вызов ответил человек | Обучение и адаптация детекции, оценка ошибок второго типа, статистика |
robot | На вызов ответил робот или голосовой помощник | Обучение и адаптация детекции, оценка ошибок первого типа, статистика |
ivr | На линии определён автоответчик или IVR | Статистика |
silence | В рамках анализа зафиксирована тишина | Статистика |
remote_release | Вызов завершён удалённой стороной во время обработки | Статистика |
mav | Специальный статистический результат MAV | Статистика |
Интеграция разметки должна передавать фактические результаты human и robot: они необходимы для обучения детекции и оценки ошибок первого и второго типа. Остальные результаты сохраняются для статистического анализа и не заменяют обратную связь human и robot.
Необязательное поле original_result содержит исходный бизнес-результат вызова из системы — источника разметки. Оно может использоваться для выявления потенциально недостоверных данных. Например, если исходный результат подразумевает разговор с человеком, а в поле result передано значение robot, такое расхождение является основанием дополнительно проверить достоверность разметки.
Способы загрузки#
API#
Для интеграции внешней системы с SmartCPD разметку можно передавать в формате JSON через Markup API. Методы, авторизация, ограничения запросов и форматы ответов описаны в разделе «Markup API» документа External API.
Состав и правила заполнения полей приведены в справочнике полей.
CSV#
CSV-файл можно загрузить в разделе «Статистика» портала. Актуальный пример файла доступен там же по кнопке Скачать шаблон.
Состав и правила заполнения столбцов приведены в справочнике полей. Требования к запросу и формат CSV-ответа с отклонёнными или необработанными строками описаны в разделе «Загрузка CSV» документа External API.
Контейнер Markup uploader#
Для регулярного получения разметки из системы заказчика используется cdr-collector-markup-uploader. Он читает новые строки из подготовленного представления или таблицы в PostgreSQL или Oracle и передаёт их в Markup API.
Требования к источнику данных и правила последовательного чтения описаны в разделе «Markup uploader».
Markup uploader#
cdr-collector-markup-uploader — контейнер для автоматической загрузки разметки из базы данных в SmartCPD. Он последовательно читает новые строки из заранее подготовленного и определённым образом структурированного представления или таблицы, а затем пакетами передаёт их в Markup API.
Контейнер можно развернуть:
- в составе стека SmartCPD;
- отдельно от стека, в инфраструктуре заказчика.
Отдельное размещение подходит, в частности, для интеграции с облачной установкой SmartCPD: uploader получает данные непосредственно из базы данных заказчика и передаёт их в SmartCPD через публичный сетевой интерфейс.
Для одной установки SmartCPD можно запустить несколько независимых экземпляров uploader. Это необходимо, если разметка поступает из нескольких баз данных, представлений или таблиц либо для источников используются разные способы сопоставления с вызовом. Например, один экземпляр может загружать разметку по SIP Call-ID, другой — по идентификатору из отдельного SIP-заголовка, а третий — по времени и номеру телефона.
Несколько экземпляров могут параллельно обслуживать разные тенанты облачной установки или собирать разметку из нескольких источников для одного тенанта. Каждый экземпляр настраивается и хранит состояние чтения независимо от остальных.
Потребление ресурсов#
Значения приведены для одного экземпляра контейнера cdr-collector-markup-uploader:
- RAM: ориентировочно
60 MB. - CPU: потребление незначительно; выделение отдельного vCPU не требуется.
Требования к базе данных и источнику#
Uploader поддерживает:
- PostgreSQL версии 14 и выше;
- Oracle Database 12c и выше.
Для подключения к Oracle используется формат Easy Connect вида host:port/service_name. Подключение через локальную конфигурацию TNS не поддерживается.
Источником разметки может быть представление или таблица. Имя источника задаётся при настройке экземпляра uploader; при необходимости его можно указать вместе со схемой, например integration.scpd_markup.
Тип сопоставления применяется ко всем строкам источника и задаётся в настройках экземпляра uploader; отдельный столбец call_id_type в источнике не требуется.
| Столбец | PostgreSQL | Oracle | Обязательность | Назначение |
|---|---|---|---|---|
call_id | text | varchar2 | Обязателен для экземпляров с типом sip или custom; для time_phone может отсутствовать | SIP Call-ID либо идентификатор вызова из системы заказчика, передаваемый в отдельном SIP-заголовке |
phone_number | text | varchar2 | Обязателен для экземпляров с типом time_phone; для sip и custom может отсутствовать | Номер телефона, используемый вместе с ts для поиска вызова |
ts | timestamp with time zone | timestamp with time zone | Обязателен; значение не должно быть NULL | Время начала вызова и ключ последовательной выборки записей |
result | text | varchar2 | Обязателен; значение не должно быть NULL | Фактический результат вызова; допустимые значения приведены в разделе «Результаты разметки» |
original_result | text | varchar2 | Столбец обязателен; значение может быть NULL | Исходный бизнес-результат вызова из системы заказчика |
source | text | varchar2 | Столбец может отсутствовать; значение может быть NULL | Источник разметки |
Для строковых значений действуют те же ограничения и допустимые значения, что и для API. Источник может содержать дополнительные столбцы: uploader их не обрабатывает.
При запуске uploader проверяет в метаданных источника наличие всех обязательных столбцов и опционального столбца source. Если обязательного столбца нет или метаданные прочитать невозможно, uploader завершает работу с ошибкой. Если отсутствует только source, разметка загружается без источника. Пользователю БД необходим доступ к метаданным источника.
Последовательная выборка по ts#
Поле ts используется не только для сопоставления разметки с вызовом, но и как курсор последовательного чтения источника данных. Uploader считает значения ts монотонно возрастающими: после обработки строки следующая выборка начинается со значений, которые больше последнего сохранённого ts.
При каждом запуске цикла выбираются строки из интервала:
ts > last_processed_ts AND ts <= now - delayПараметр DELAY_LAG задаёт задержку между текущим временем и верхней границей выборки. По умолчанию она составляет 30 секунд. Такая задержка позволяет компенсировать допустимые колебания времени появления новых строк: uploader не приближается к текущему времени ближе заданного интервала и даёт источнику завершить формирование записей.
Строки читаются по возрастанию ts, а после успешной обработки сохраняется максимальный обработанный ts. Строка, которая появилась позднее со значением ts, меньшим либо равным сохранённому курсору, выбрана не будет. Поэтому DELAY_LAG необходимо устанавливать не меньше максимальной ожидаемой задержки появления строки, а уже доступные строки не должны изменять ts.
То же ограничение относится к позднему изменению result, original_result или source в уже обработанной строке: uploader не перечитывает пройденный диапазон.
Запрос с фильтрацией и сортировкой по ts должен выполняться эффективно; обычно для этого требуется соответствующий индекс в исходных таблицах.
Хранение состояния и проблемных записей#
Для штатной эксплуатации uploader необходим постоянный (persistent) каталог, заданный переменной DATA_DIR. В нём сохраняется файл last.processed.json с позицией последней обработанной записи. После перезапуска или пересоздания контейнер продолжает чтение с сохранённой позиции.
Если persistent-каталог отсутствует или его содержимое потеряно, uploader не может восстановить предыдущую позицию и начинает чтение с глубины, заданной параметром INIT_LOOKBACK. Для каждого экземпляра uploader необходимо использовать отдельный каталог.
Каталог DATA_DIR можно разместить:
- в именованном Docker volume;
- в отдельном каталоге хоста через bind mount;
- в общем persistent-хранилище, доступном ноде размещения контейнера.
При включённом параметре SAVE_REJECTED uploader создаёт внутри DATA_DIR подкаталог rejected и сохраняет в нём отклонённые и необработанные записи. Вместе с исходными данными сохраняются статус и причина обработки, что позволяет проанализировать проблемные записи и при необходимости исправить источник данных или настройки интеграции.
Установка в стек SmartCPD#
Этот вариант предназначен для установки uploader в том же окружении, где развёрнут контур SmartCPD. Контейнер запускается как сервис Docker Swarm в составе стека: он автоматически запускается вместе со стеком, а Docker Swarm управляет его перезапуском и размещением. Логи сервиса попадают во встроенный контур observability SmartCPD.
Параметры самого контура берутся из общей конфигурации SmartCPD. К ним относятся имя стека, версия образа, каталог общих данных, URL Markup API, настройки proxy и доверенного сертификата, а также runtime-параметры, включая UID и GID пользователя контейнера. При изменении этих параметров достаточно повторно сгенерировать и применить конфигурацию основного стека; повторно настраивать каждый экземпляр uploader не требуется.
Каталог для данных uploader создаётся node setup-скриптами в Shared data root. Если установка SmartCPD выполнена по штатной процедуре и сгенерированные node setup-скрипты применены, создавать каталог или настраивать права вручную не требуется.
Перед установкой необходимо:
- Развернуть SmartCPD и убедиться, что стек работает.
- Подготовить источник данных в соответствии с требованиями к базе данных и источнику.
- В портале SmartCPD создать API-ключ с привилегией
cdr.canEdit. Порядок создания и использования API-ключей описан в разделе «Авторизация» документа External API. - Подготовить параметры подключения и учётные данные пользователя БД, имеющего доступ на чтение строк и метаданных источника.
- Определить глубину первой выборки. Она не должна превышать 240 часов.
Настройка выполняется на manager-ноде Docker Swarm из каталога setup установленного SmartCPD:
./smartcpd-markup-uploader-setup.shСкрипт запрашивает:
- имя экземпляра uploader;
- тип, адрес, порт, имя сервиса или базы данных и часовой пояс БД;
- имя пользователя и пароль БД;
- имя представления или таблицы;
- способ сопоставления разметки;
- API-ключ SmartCPD;
- глубину первой выборки.
Имя экземпляра по умолчанию — default. Для каждого дополнительного источника или способа сопоставления скрипт нужно запустить повторно и указать новое уникальное имя.
Для каждого экземпляра рядом со скриптом создаётся файл:
smartcpd-markup-uploader-<instance>.envФайл содержит настройки экземпляра и ссылки на созданные Docker secrets. Пароли и API-токены непосредственно в нём не сохраняются.
После настройки экземпляров необходимо заново сгенерировать конфигурацию и применить стек:
./smartcpd-setup.sh generate
./smartcpd-setup.sh deployКоманда generate находит все файлы smartcpd-markup-uploader-*.env, формирует для них сервисы и добавляет их в итоговую конфигурацию стека.
Дополнительные параметры#
Дополнительные параметры контейнера, в том числе расширенные параметры подключения к БД, задаются для соответствующего сервиса через compose.override.yml. Общий механизм описан в разделе «Использование compose.override.yml» документа по установке.
Доступные переменные окружения перечислены в справочнике переменных Markup uploader.
Удаление экземпляра#
Чтобы удалить экземпляр uploader:
Удалить его файл конфигурации:
rm smartcpd-markup-uploader-<instance>.envУдалить соответствующий сервис Docker Swarm и убедиться, что он отсутствует:
docker service rm <stack_name>_markup-uploader-<instance> docker service ls --filter name=<stack_name>_markup-uploader-<instance>Обновить сгенерированную конфигурацию:
./smartcpd-setup.sh generate
После ручного удаления сервиса выполнять deploy не требуется. Команда generate удаляет экземпляр из итоговой конфигурации и предотвращает его повторное создание при следующем deployment стека.
Независимая установка#
Независимая установка применяется, когда uploader необходимо разместить вне окружения SmartCPD. Например:
- источник данных находится в отдельном сетевом контуре;
- заказчик использует облачную установку SmartCPD;
- база данных с разметкой доступна из инфраструктуры заказчика, но недоступна непосредственно из сети SmartCPD.
В этом варианте контейнер подключается к базе данных в локальном контуре источника и передаёт разметку в SmartCPD через публичную сеть. Для подключения к публичному интерфейсу SmartCPD необходимо использовать HTTPS. Шифрование и проверка TLS-сертификата выполняются в соответствии с конфигурацией публичного интерфейса SmartCPD.
Перед установкой необходимо:
- Подготовить источник данных в соответствии с требованиями к базе данных и источнику.
- В портале SmartCPD создать API-ключ с привилегией
cdr.canEdit. - Подготовить параметры подключения и учётные данные пользователя БД, имеющего доступ на чтение строк и метаданных источника.
- Определить способ сопоставления и глубину первой выборки. Глубина не должна превышать 240 часов.
В приведённом ниже примере указана версия образа для SmartCPD 6.0.0. Актуальная версия для устанавливаемого релиза указывается в Release Notes и в переменной CDR_COLLECTOR_MARKUP_UPLOADER_VERSION файла versions.env, входящего в поставку SmartCPD.
Создайте файл compose.yml:
services:
markup-uploader:
image: cr.repo.altuera.ru/smartcpd/prod/cdr-collector-markup-uploader:6.0.0
restart: unless-stopped
environment:
LOG_LEVEL: info
LOG_FORMAT: plain
DB_ENGINE: postgres
DB_TZ: Europe/Moscow
DB_HOST: db.example.com
DB_PORT: "5432"
DB_NAME: customer
DB_USER: smartcpd_markup
DB_PASSWORD: "change-me"
DB_VIEW_NAME: integration.scpd_markup
CALL_ID_TYPE: sip
INIT_LOOKBACK: 24h
MARKUP_API_URL: https://smartcpd.example.com/api/cdr
MARKUP_API_TOKEN: "change-me"
DATA_DIR: /data
SAVE_REJECTED: "true"
volumes:
- markup-uploader-data:/data
volumes:
markup-uploader-data:
# Чтобы использовать bind mount вместо Docker volume,
# создайте каталог на хосте и раскомментируйте параметры:
# driver: local
# driver_opts:
# type: none
# o: bind
# device: /opt/smartcpd/markup-uploader-dataЗамените в примере:
- параметры
DB_*— на параметры подключения к базе данных источника; DB_VIEW_NAME— на имя подготовленного представления или таблицы;CALL_ID_TYPE— на используемый способ сопоставления;INIT_LOOKBACK— на необходимую глубину первой выборки;MARKUP_API_URL— на публичный адрес SmartCPD с путём/api/cdr;MARKUP_API_TOKEN— на созданный в портале API-ключ.
Файл compose.yml содержит пароль БД и API-ключ в открытом виде. Ограничьте доступ к нему средствами файловой системы хоста.
Запустите контейнер:
docker compose up -dПо умолчанию Compose создаёт именованный Docker volume markup-uploader-data. Чтобы сразу хранить данные в заданном каталоге хоста, перед первым запуском создайте этот каталог и раскомментируйте driver и driver_opts в объявлении volume.
Для тонкой настройки добавьте необходимые переменные непосредственно в секцию environment файла compose.yml. Полный перечень приведён в справочнике переменных Markup uploader.
Обновление независимой установки#
Обновление независимо установленного uploader следует выполнять с учётом требований соответствующего релиза из Release Notes и общего документа «Обновление SmartCPD».
Как минимум необходимо изменить тег образа в compose.yml на актуальную версию из поставочного файла versions.env, а затем загрузить образ и пересоздать сервис:
docker compose pull
docker compose up -dPersistent volume с каталогом DATA_DIR при таком обновлении сохраняется и продолжает содержать текущую позицию чтения.
Справочники#
Поля API и CSV#
| Поле | JSON API | CSV | Формат и допустимые значения | Назначение |
|---|---|---|---|---|
call_id_type | Обязательное поле | Обязательный столбец и значение | sip, custom или time_phone | Способ сопоставления разметки с вызовом |
call_id | Обязателен для sip и custom; для time_phone может отсутствовать | Столбец обязателен; значение обязательно для sip и custom и может быть пустым для time_phone | Строка | SIP Call-ID или идентификатор вызова из системы заказчика, передаваемый в отдельном SIP-заголовке |
phone_number | Обязателен для time_phone; для sip и custom может отсутствовать | Столбец обязателен; значение обязательно для time_phone и может быть пустым для sip и custom | Строка | Номер телефона, используемый вместе с ts для поиска вызова |
ts | Обязательное поле | Обязательный столбец и значение | RFC 3339 с часовым поясом | Время начала вызова |
result | Обязательное поле | Обязательный столбец и значение | Значение из раздела «Результаты разметки» | Фактический результат вызова |
original_result | Необязательное поле | Необязательный столбец; значение может быть пустым | Строка | Исходный бизнес-результат вызова из системы заказчика |
source | Необязательное поле | Столбец обязателен; значение может быть пустым | Строка | Источник разметки, например система, группа операторов или процедура контроля качества |
Размер каждого строкового значения не должен превышать 4 KiB. Для JSON API дополнительные неизвестные поля не допускаются, а для CSV допустимы только перечисленные поля и служебные столбцы upload_status и reason.
Коды обработки#
При частично успешной загрузке JSON API возвращает записи в массивах rejected и unprocessed. В CSV для тех же состояний используется столбец upload_status:
upload_status | Что означает |
|---|---|
rejected | Запись обработана и отклонена по ожидаемой причине. Отклонение этой записи не останавливает обработку остальных записей |
unprocessed | Запись не была обработана. Обработка пакета остановилась на первой внутренней ошибке, поэтому первая проблемная и все следующие записи возвращаются как unprocessed |
Поле reason содержит код причины:
| Код | Статус | Что означает |
|---|---|---|
invalid | rejected | Обязательное значение отсутствует, поле имеет недопустимый формат или размер, результат разметки не поддерживается либо данные не соответствуют выбранному способу сопоставления |
too_old | rejected | Время ts старше допустимого возраста разметки. Принимаются записи не старше 10 дней |
not_found | rejected | В CDR не найден вызов, соответствующий переданным идентификаторам |
ambiguous | rejected | Условиям сопоставления соответствуют несколько вызовов, поэтому выбрать один вызов однозначно невозможно |
duplicate | rejected | Для найденного вызова разметка уже существует |
lookup_type_not_supported | rejected | Значение call_id_type не поддерживается |
internal_error | unprocessed | Обработка остановлена из-за внутренней ошибки; запись не была принята или отклонена по бизнес-правилу |
rejected является окончательным результатом обработки конкретной записи в рамках запроса. unprocessed не означает отклонение: после внутренней ошибки обработка пакета прекращается, а результат для оставшихся записей ещё не определён.
При автоматической загрузке из БД uploader останавливает текущий цикл, сохраняет позицию перед первой записью unprocessed и начинает следующую загрузку с неё. Отклонённые и необработанные записи сохраняются в каталоге rejected; поле status позволяет отличить окончательно отклонённые записи от необработанных. Вместе с исходными полями сохраняются index, status и reason.
Переменные окружения Markup uploader#
В таблицах перечислены переменные окружения контейнера cdr-collector-markup-uploader. Значения интервалов времени задаются в формате Go duration, например 30s, 15m или 24h.
Обработка разметки и хранение состояния#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
DB_VIEW_NAME | scpd_markup | Имя представления или таблицы с разметкой. Можно указать имя вместе со схемой |
CALL_ID_TYPE | sip | Способ сопоставления всех строк источника: sip, custom или time_phone |
CHUNK_SIZE | 1000 | Максимальное количество записей в одном пакете, отправляемом в Markup API |
DELAY_LAG | 30s | Задержка относительно текущего времени: uploader выбирает только строки с ts, не превышающим момент запуска обработки за вычетом этой задержки |
INIT_LOOKBACK | 24h | Глубина первой выборки при отсутствии сохранённой позиции чтения |
UPLOAD_INTERVAL | 15m | Интервал между циклами загрузки. Первый цикл выполняется сразу после запуска контейнера |
DATA_DIR | Не задан | Каталог persistent-хранилища, в котором сохраняются позиция последней обработанной записи и файлы с проблемными записями. Для штатной эксплуатации должен быть задан и сохранён между перезапусками контейнера |
SAVE_REJECTED | false | Сохранять отклонённые и необработанные записи в подкаталоге rejected каталога DATA_DIR |
Если DATA_DIR не задан или его содержимое не сохраняется, после перезапуска uploader теряет сохранённую позицию и снова начинает чтение на глубине INIT_LOOKBACK. Для каждого экземпляра uploader необходимо использовать отдельный persistent-каталог.
Markup API#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
MARKUP_API_URL | Нет | Обязательный базовый URL CDR Collector или шлюза, через который доступен Markup API, например https://smartcpd.example.com/api/cdr. Uploader добавляет к нему путь /v1/markup |
MARKUP_API_TOKEN | Нет | Обязательный API-токен. Передаётся в заголовке Authorization по схеме Bearer |
MARKUP_API_TOKEN_FILE | Не задан | Путь к файлу с API-токеном. Если переменная задана, entrypoint читает токен из файла и записывает его в MARKUP_API_TOKEN |
Для передачи токена достаточно одной из переменных MARKUP_API_TOKEN или MARKUP_API_TOKEN_FILE.
Подключение к базе данных#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
DB_URI | postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable | Базовый URI подключения. Остальные переменные DB_*, если заданы, заменяют соответствующие части URI |
DB_ENGINE | Определяется из DB_URI | Тип базы данных: postgres или oracle |
DB_TZ | UTC | Часовой пояс внешней исходной БД в формате IANA, например UTC или Europe/Moscow; это не SMARTCPD_DB_TZ, значение может отличаться от timezone платформы |
DB_HOST | Определяется из DB_URI | Имя или IP-адрес сервера PostgreSQL либо Oracle |
DB_PORT | Определяется из DB_URI | Порт базы данных |
DB_NAME | Определяется из DB_URI | Имя базы данных или сервиса |
DB_USER | Определяется из DB_URI | Имя пользователя БД |
DB_PASSWORD | Определяется из DB_URI | Пароль пользователя БД |
DB_PASSWORD_FILE | Не задан | Путь к файлу с паролем пользователя БД. Значение из файла имеет приоритет над DB_PASSWORD |
DB_PARAMS | Не заданы | Дополнительные параметры подключения в формате key=value; дополняют или заменяют query-параметры из DB_URI |
DB_QUERY_TIMEOUT | 5s | Максимальное время выполнения отдельного запроса к БД |
DB_CONN_MAX_OPEN | 20 | Максимальное количество открытых соединений с БД |
DB_CONN_MAX_IDLE | 2 | Максимальное количество неактивных соединений в пуле |
DB_CONN_MAX_IDLE_TIME | 2m | Максимальное время простоя соединения перед закрытием |
DB_CONN_MAX_LIFETIME | 30m | Максимальное время жизни соединения перед его заменой |
HTTP, TLS и proxy#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
HTTP_TIMEOUT | 30s | Максимальное время выполнения HTTP-запроса к Markup API |
HTTP_NO_PROXY | false | Полностью запретить HTTP-клиенту использовать proxy из переменных окружения |
HTTP_TLS_CA_CERT_FILES | Не заданы | Разделённый запятыми список PEM-файлов с дополнительными доверенными центрами сертификации |
HTTP_TLS_CERT_FILE | Не задан | PEM-файл клиентского TLS-сертификата |
HTTP_TLS_KEY_FILE | Не задан | PEM-файл закрытого ключа клиентского TLS-сертификата |
HTTP_TLS_INSECURE | false | Отключить проверку TLS-сертификата сервера. Не рекомендуется для рабочей эксплуатации |
HTTP_PROXY | Не задан | Proxy для HTTP-запросов, используемый стандартным транспортом Go |
HTTPS_PROXY | Не задан | Proxy для HTTPS-запросов, используемый стандартным транспортом Go |
NO_PROXY | Не задан | Список адресов, для которых proxy не используется |
Логирование#
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
LOG_LEVEL | info | Уровень логирования: trace, debug, info, warn, error, fatal или panic |
LOG_OUTPUT | stdout | Поток вывода логов: stdout или stderr |
LOG_FORMAT | plain | Формат логов: json, plain или pretty |