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

Дополнительная информация#

В данном разделе приводится следующая дополнительная информация:

Визуализация монтиторинга и логов с помощью Grafana#

Визуализация мониторинга выполняется за счет сервиса LUNA Dashboards, который содержит в себе платформу для визуализации данных мониторинга Grafana с настроенными дашбордами LUNA PLATFORM.

При необходимости можно отдельно установить настроенные дашборды для Grafana. См. дополнительную информацию в разделе "LUNA Dashboards" в руководстве администратора.

Вместе с Grafana можно использовать систему агрегации логов Grafana Loki, позволяющую гибко работать с логами LUNA PLATFORM. Для доставки логов LUNA PLATFORM в Grafana Loki используется агент Promtail (дополнительную информацию см. в разделе "Grafana Loki" в руководстве администратора).

LUNA Dashboards#

Примечание. Для работы с Grafana необходимо использовать InfluxDB версии 2.

Запуск контейнера LUNA Dashboards#

Используйте команду docker run со следующими параметрами для запуска LUNA Dashboards:

docker run \
--restart=always \
--detach=true \
--network=host \
--name=grafana \
-v /etc/localtime:/etc/localtime:ro \
dockerhub.visionlabs.ru/luna/luna-dashboards:v.0.1.1

Для использования веб-интерфейса Grafana нужно перейти по адресу "http://IP_ADDRESS:3000", при условии, что контейнеры LUNA Dashboards и InfluxDB были запущены.

Grafana Loki#

Примечание. Для запуска Grafana Loki требуется наличие запущенного сервиса LUNA Dashboards.

Запуск контейнера Grafana Loki#

Используйте команду docker run со следующими параметрами для запуска Grafana Loki:

docker run \
--name=loki \
--restart=always \
--detach=true \
--network=host \
-v /etc/localtime:/etc/localtime:ro \
dockerhub.visionlabs.ru/luna/loki:2.7.1

Запуск контейнера Promtail#

Используйте команду docker run со следующими параметрами для запуска Promtail:

docker run \
-v /var/lib/luna/current/example-docker/logging/promtail.yml:/etc/promtail/luna.yml \
-v /var/lib/docker/containers:/var/lib/docker/containers \
-v /etc/localtime:/etc/localtime:ro \
--name=promtail \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/promtail:2.7.1 \
-config.file=/etc/promtail/luna.yml -client.url=http://127.0.0.1:3100/loki/api/v1/push -client.external-labels=job=containerlogs,pipeline_id=,job_id=,version=

-v /var/lib/luna/current/example-docker/logging/promtail.yml:/etc/promtail/luna.yml — монтирование конфигурационного файла в контейнер Promtail

-config.file=/etc/promtail/luna.yml — флаг с адресом конфигурационного файла

-client.url=http://127.0.0.1:3100/loki/api/v1/push — флаг с адресом развернутой Grafana Loki

-client.external-labels=job=containerlogs,pipeline_id=,job_id=,version= — статические метки для добавления ко всем логам, отправляемым в Grafana Loki

Команды Docker#

Показать контейнеры#

Чтобы показать список запущенных Docker-контейнеров, используйте команду:

docker ps

Чтобы показать все имеющиеся Docker-контейнеры, используйте команду:

docker ps -a 

Копировать файлы в контейнер#

Можно переносить файлы в контейнер. Используйте команду docker cp для копирования файла в контейнер.

docker cp <file_location> <container_name>:<folder_inside_container>

Вход в контейнер#

Можно входить в отдельные контейнеры с помощью следующей команды:

docker exec -it <container_name> bash

Для выхода из контейнера используйте следующую команду:

exit

Имена образов#

Можно увидеть все имена образов с помощью команды

docker images

Удаление образа#

Если требуется удаление образа:

  • запустите команду docker images
  • найдите требуемый образ, например dockerhub.visionlabs.ru/luna/luna-image-store
  • скопируйте соответствующий ID образа из IMAGE ID, например, "61860d036d8c"
  • укажите его в команде удаления:
docker rmi -f 61860d036d8c

Удалите все существующие образы:

docker rmi -f $(docker images -q)

Остановка контейнера#

Контейнер можно остановить с помощью следующей команды:

docker stop <container_name>

Остановить все контейнеры:

docker stop $(docker ps -a -q)

Удаление контейнера#

Если необходимо удалить контейнер:

  • запустите команду "docker ps"
  • остановите контейнер (см. Остановка контейнера)
  • найдите требуемый образ, например: dockerhub.visionlabs.ru/luna/luna-image-store
  • скопируйте соответствующий ID контейнера из столбца CONTAINER ID, например, "23f555be8f3a"
  • укажите его в команде удаления:
docker container rm -f 23f555be8f3a

Удалить все контейнеры:

docker container rm -f $(docker container ls -aq)

Проверка логов сервисов#

Чтобы показать логи сервиса, используйте команду:

docker logs <container_name>

Описание параметров запуска#

При запуске Docker-контейнера для какого-либо из сервисов LUNA PLATFORM необходимо задать дополнительные параметры, требуемые для работы этого сервиса.

Параметры, требуемые для конкретного контейнера, описаны в разделе, посвященном запуску этого контейнера.

Все параметры, приведенные в примере запуска сервиса, необходимы для корректного запуска и работы сервиса.

Параметры запуска сервисов#

Пример команды запуска контейнеров сервисов LP:

docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=<Port_of_the_launched_service> \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<service>:/srv/logs/ \
--name=<service_container_name> \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/<service-name>:<version>

Следующие параметры используются при запуске контейнеров сервисов LP:

  • docker run — команда для запуска выбранного образа в качестве нового контейнера.

  • dockerhub.visionlabs.ru/luna/<service-name>:<version> — позволяет задать образ, требуемый для запуска контейнера.

Ссылки для загрузки требуемых образов контейнера доступны в описании запуска соответствующего контейнера.

  • --network=host — указывает, что отсутствует симуляция сети и используется серверная сеть. При необходимости изменить порт для сторонних контейнеров следует заменить эту строку на -p 5440:5432. Здесь первый порт 5440 — это локальный порт, а 5432 — это порт, используемый в контейнере. Пример приведен для PostgreSQL.

  • --env= — задает переменные окружения, требуемые для запуска контейнера (см. раздел "Аргументы сервисов").

  • --name=<service_container_name> — задает имя запускаемого контейнера. Имя должно быть уникальным. Если уже существует контейнер с таким же именем, произойдет ошибка.

  • --restart=always — определяет политику перезагрузки. Daemon всегда перезагружает контейнер вне зависимости от кода завершения.

  • --detach=true — позволяет запустить контейнер в фоновом режиме.

  • -v — позволяет загружать содержимое серверной папки в объем контейнера. Таким образом содержимое синхронизируется. Загружаются следующие общие данные:

  • /etc/localtime:/etc/localtime:ro — задает текущий часовой пояс, используемый системой контейнера.

  • /tmp/logs/<service>:/srv/logs/ — позволяет копировать папку с записями (логами) сервиса на сервер в директорию /tmp/logs/<service>. Директорию для хранения логов можно изменить при желании.

Аргументы сервисов#

Каждый сервис в LUNA PLATFORM имеет свои собственные аргументы запуска. Эти аргументы можно передать через:

  • задание флага для скрипта запуска (run.py) соответствующего сервиса
  • установку отдельных переменных окружения (--env) в командной строке Docker

Например, с использованием флага --help можно получить список всех доступных аргументов. Пример передачи аргумента для сервиса API может выглядеть следующим образом:

docker run --rm dockerhub.visionlabs.ru/luna/luna-api:v.6.40.0 python3 /srv/luna_api/run.py --help

Список основных аргументов:

Флаг в строке запуска

Переменная окружения

Описание

--port

PORT

Порт, на котором сервис будет ожидать подключений.

--workers

WORKER_COUNT

Количество "рабочих процессов" для сервиса.

--log_suffix

LOG_SUFFIX

Суффикс, добавляемый к именам файлов логов (при включенном параметре записи логов в файл).

--config-reload

RELOAD_CONFIG

Включение автоматической перезагрузки конфигураций. См. раздел "Автоматическая перезагрузка конфигураций" в руководстве администратора LUNA PLATFORM 5.

--pulling-time

RELOAD_CONFIG_INTERVAL

Период проверки конфигураций (по умолчанию 10 секунд). См. раздел "Автоматическая перезагрузка конфигураций" в руководстве администратора LUNA PLATFORM 5.

--luna-config

CONFIGURATOR_HOST, CONFIGURATOR_PORT

Адрес сервиса Configurator для загрузки настроек. Для --luna-config передается в формате http://localhost:5070/1. Для переменных окружения хост и порт задаются явно. Если аргумент не задан, то будет использован конфигурационный файл по умолчанию.

--config

Нет

Путь до конфигурационного файла с настройками сервиса.

--<config_name>

Нет

Тег указанной настройки в Configurator. При задании данной настройки будет использовано значение тегированной настройки. Пример: --LUNA_MONITORING TAG_1. |

Примечание. Необходимо заранее присвоить тег соответствующим настройкам в Configurator.

Примечание. Работает только с флагом --luna-config.

--tls_cert

Нет

Путь к SSL-сертификату для запуска сервиса с использованием протокола HTTPS.

--tls_key

Нет

Путь к SSL-закрытому ключу для запуска сервиса с использованием протокола HTTPS.

--tls_key_pass

Нет

Пароль для SSL-закрытого ключа для запуска сервиса с использованием протокола HTTPS.

Перечень аргументов может отличаться в зависимости от сервиса.

Также доступна возможность переопределить настройки сервисов при их старте с помощью переменных окружения.

Для переопределения настроек используется префикс VL_SETTINGS. Примеры:

  • --env=VL_SETTINGS.LUNA_MONITORING.SEND_DATA_FOR_MONITORING=0. Использование переменной окружения из данного примера установит значение настройки "SEND_DATA_FOR_MONITORING" для секции "LUNA_MONITORING" равным "0".
  • --env=VL_SETTINGS.OTHER.STORAGE_TIME=LOCAL. Для несоставных настроек (настроек, которые расположены в секции "OTHER" в конфигурационном файле) необходимо указать префикс "OTHER". Использование переменной окружения из данного примера установит значение настройки "STORAGE_TIME" (если сервис использует данную настройку) на значение "LOCAL".

Передача флагов с использованием переменной окружения

Флаги, для которых явно не выделена переменная окружения, можно передать с помощью переменной окружения EXTEND_CMD.

Например, можно передать тег настроек следующим способом:

--env=EXTEND_CMD="--LUNA_MONITORING=TAG_1 --LUNA_EVENTS_DB=TAG_2"

Параметры создания баз данных#

Пример команды запуска контейнеров для миграции баз данных или их создания:

docker run \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<service>:/srv/logs/ \
--rm \
--network=host \
dockerhub.visionlabs.ru/luna/<service-name>:<version> \
python3 ./base_scripts/db_create.py --luna-config http://localhost:5070/1

Следующие параметры используются при запуске контейнеров для миграции баз данных или их создания:

--rm — этот параметр указывает, удаляется ли контейнер после завершения обработки всех заданных скриптов.

python3 ./base_scripts/db_create.py — этот параметр содержит версию Python и скрипт db_create.py, запускаемый в контейнере. Этот скрипт используется для создания структуры базы данных.

--luna-config http://localhost:5070/1 — этот параметр указывает, откуда запущенный скрипт должен получать конфигурации. По умолчанию конфигурации запрашиваются сервисами от сервиса Configurator.

Способы изменения настроек сервисов#

Существует три основных способа изменения настроек, хранящихся в базе данных сервиса Configurator:

  • с помощью пользовательского интерфейса сервиса Configurator,
  • с помощью запросов API сервиса Configurator,
  • с помощью файла с настройками.

Настройки можно изменить после запуска сервиса Configurator.

Настройки самого сервиса Configurator хранятся в файле "luna_configurator_postgres.conf", который загружается в контейнер сервиса Configurator в процессе его запуска.

Интерфейс сервиса Configurator

Можно войти в пользовательский интерфейс сервиса Configurator и изменить требуемую настройку. По умолчанию используется следующий адрес на локальном хосте: <Configurator_server_address>:5070.

API сервиса Configurator

Для обновления настроек можно использовать API сервиса Configurator.

См. спецификацию OpenAPI сервиса Configurator.

Файл сброса

Можно получить файл сброса со всеми настройками сервисов LP. Используйте одну из следующих команд:

wget -O /var/lib/luna/settings_dump.json 127.0.0.1:5070/1/dump

или

curl 127.0.0.1:5070/1/dump > /var/lib/luna/settings_dump.json

Необходимо задать корректный адрес и порт сервиса Configurator.

Необходимо удалить из файла раздел "limitations". В противном случае будет невозможно применить обновление файла сброса.

    "limitations":[
      ...
    ],

Отредактируйте параметры в разделе "settings".

    "settings":[
      ...
    ],

Скопируйте файл с настройками в контейнер сервиса Configurator.

docker cp /var/lib/luna/settings_dump.json luna-configurator:/srv/

Используйте полученный файл:

docker exec luna-configurator python3 ./base_scripts/db_create.py --dump-file /srv/settings_dump.json

Запись логов на сервер#

Чтобы включить сохранение логов на сервер, необходимо:

  • создать директории для логов на сервере;
  • активировать запись логов и задать расположение хранения логов внутри контейнеров сервисов LP;
  • настроить синхронизацию директорий логов в контейнере с логами на сервере с помощью аргумента volume при старте каждого контейнера.

Создание директории логов#

Ниже приведены примеры команд для создания директорий для хранения логов и присвоения им прав для всех сервисов LUNA PLATFORM.

mkdir -p /tmp/logs/configurator /tmp/logs/image-store /tmp/logs/accounts /tmp/logs/faces /tmp/logs/licenses /tmp/logs/events /tmp/logs/python-matcher /tmp/logs/handlers /tmp/logs/remote-sdk /tmp/logs/tasks /tmp/logs/tasks-worker /tmp/logs/sender /tmp/logs/api /tmp/logs/admin /tmp/logs/backport3 /tmp/logs/backport4 /tmp/logs/luna-video-agent /tmp/logs/luna-video-manager
chown -R 1001:0 /tmp/logs/configurator /tmp/logs/image-store /tmp/logs/accounts /tmp/logs/faces /tmp/logs/licenses /tmp/logs/events /tmp/logs/python-matcher /tmp/logs/handlers /tmp/logs/remote-sdk /tmp/logs/tasks /tmp/logs/tasks-worker /tmp/logs/sender /tmp/logs/api /tmp/logs/admin /tmp/logs/backport3 /tmp/logs/backport4 /tmp/logs/luna-video-agent /tmp/logs/luna-video-manager

Если необходимо использовать сервис Python Matcher Proxy, то нужно дополнительно создать директорию /tmp/logs/python-matcher-proxy и установить ей разрешения.

Активация записи логов#

Активация записи логов сервисов LP#

Для активации записи логов в файл необходимо задать настройки log_to_file и folder_with_logs в секции <SERVICE_NAME>_LOGGER настроек каждого сервиса.

Автоматический способ (перед/после запуска Configurator)

Для обновления настроек ведения логов можно использовать файл настроек logging.json, предоставленный в комплекте поставки.

Выполните следующую команду после запуска сервиса Configurator:

docker cp /var/lib/luna/current/extras/conf/logging.json luna-configurator:/srv/luna_configurator/used_dumps/logging.json

Обновите настройки записи логов с помощью скопированного файла.

docker exec -it luna-configurator python3 ./base_scripts/db_create.py --dump-file /srv/luna_configurator/used_dumps/logging.json

Ручной способ (после запуска Configurator)

Перейдите в интерфейс сервиса Configurator (127.0.0.1:5070) и задайте путь расположения логов в контейнере в параметре folder_with_logs для всех сервисов, чьи логи необходимо сохранить. Например, можно использовать путь /srv/logs.

Установите параметр log_to_file как true чтобы активировать запись логов в файл.

Активация записи логов сервиса Configurator (перед/после запуска Configurator)#

Настроек сервиса Configurator нет в пользовательском интерфейсе Configurator, они расположены в следующем файле:

/var/lib/luna/current/example-docker/luna_configurator/configs/luna_configurator_postgres.conf

Следует изменить параметры логирования в этом файле перед запуском сервиса Configurator или перезапустить его после внесения изменений.

Задайте путь расположения логов в контейнере в параметре FOLDER_WITH_LOGS = ./ файла. Например, FOLDER_WITH_LOGS = /srv/logs.

Установите параметр log_to_file как true чтобы активировать запись логов в файл.

Монтирование директорий с логами при старте сервисов#

Директория с логами монтируется с помощью следующего аргумента при старте контейнера:

-v <server_logs_folder>:<container_logs_folder> \

где <server_logs_folder> директория, созданная на этапе создания директории логов, а <container_logs_folder> директория, созданная на этапе активации записи логов.

Пример команды запуска сервиса API с монтированием директории с логами:

docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=5000 \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
--name=luna-api \
--restart=always \
--detach=true \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/api:/srv/logs \
--network=host \
dockerhub.visionlabs.ru/luna/luna-api:v.6.40.0

Примеры команд запуска контейнеров в данной документации содержат эти аргументы.

Настройка ротации логов Docker#

Чтобы ограничить размер логов, генерируемых Docker, можно настроить автоматическую ротацию логов. Для этого необходимо добавить в файл /etc/docker/daemon.json следующие данные:

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "5"
    }
}

Это позволит Docker хранить до 5 файлов логов на контейнер, при этом каждый файл будет ограничен 100 Мб.

После изменения файла необходимо перезапустить Docker:

systemctl reload docker

Вышеописанные изменения являются значениями по умолчанию для любого вновь созданного контейнера, они не применяются к уже созданным контейнерам.

Задание пользовательских настроек InfluxDB#

Для InfluxDB OSS 2 доступны следующие настройки:

"send_data_for_monitoring": 1,
"use_ssl": 0,
"flushing_period": 1,
"host": "127.0.0.1",
"port": 8086,
"organization": "<ORGANIZATION_NAME>",
"token": "<TOKEN>",
"bucket": "<BUCKET_NAME>",
"version": <DB_VERSION>

Можно обновить настройки InfluxDB для сервисов LP в сервисе Configurator, выполнив следующие действия:

  • откройте следующий файл:
vi /var/lib/luna/current/extras/conf/influx2.json
  • задайте необходимые данные;
  • сохраните изменения;
  • скопируйте файл в контейнер InfluxDB:
docker cp /var/lib/luna/current/extras/conf/influx2.json luna-configurator:/srv/
  • обновите настройки в сервисе Configurator.
docker exec -it luna-configurator python3 ./base_scripts/db_create.py --dump-file /srv/influx2.json

Также можно вручную обновить настройки в пользовательском интерфейсе сервиса Configurator.

Настройки сервиса Configurator задаются отдельно.

  • откройте файл с настройками Configurator:
vi /var/lib/luna/current/example-docker/luna_configurator/configs/luna_configurator_postgres.conf
  • задайте необходимые данные;
  • сохраните изменения;
  • перезапустите Configurator:
docker restart luna-configurator

Использование Python Matcher с Python Matcher Proxy#

Как было сказано ранее, вместе с сервисом Python Matcher можно дополнительно использовать сервис Python Matcher Proxy, который будет перенаправлять запросы сравнения либо сервису Python Matcher, либо плагинам сравнения. Использование плагинов может значительно ускорить выполнение запросов на сравнение. Например, с помощью плагинов возможно организовать хранение необходимых для выполнения операций сравнения данных и дополнительных полей объектов в отдельном хранилище, что позволит ускорить доступ к данным по сравнению с использованием стандартной БД LUNA PLATFORM.

Для использования сервиса Python Matcher с Python Matcher Proxy необходимо дополнительно запустить соответствующий контейнер, а затем выставить определенную настройку в сервисе Configurator. Выполняйте нижеперечисленные действия только если собираетесь использовать плагины сравнения.

См. описание и использование плагинов сравнения в руководстве администратора.

Запуск контейнера Python Matcher Proxy#

Используйте следующую команду для запуска сервиса:

docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=5110 \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
--env=SERVICE_TYPE="proxy" \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/python-matcher-proxy:/srv/logs \
--name=luna-python-matcher-proxy \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/luna-python-matcher:v.1.12.0

После запуска контейнера необходимо выставить следующее значение в сервисе Configurator.

ADDITIONAL_SERVICES_USAGE = "luna_matcher_proxy":true

Масштабирование системы#

Все сервисы LP линейно масштабируемы и могут располагаться на нескольких серверах.

Можно запустить дополнительные контейнеры с сервисами LP для повышения производительности и отказоустойчивости. Количество сервисов и характеристики серверов зависят от решаемой задачи.

Для повышения производительности можно либо увеличить производительность одного сервера, либо увеличить количество используемых серверов, распределив наиболее ресурсозатратные компоненты системы.

Для распределения запросов среди запущенных экземпляров сервисов используются балансировщики. Этот подход обеспечивает требуемую скорость обработки и требуемый уровень отказоустойчивости для конкретных задач клиента. В случае отказа узла система не остановится: запросы перераспределятся на другой узел.

На рисунке ниже показано, как два экземпляра сервиса Faces балансируются посредством Nginx. Nginx получает запросы на порту 5030 и направляет их экземплярам Faces. Сервисы Faces запущены на портах 5031 и 5032.

Балансирование сервиса Faces
Балансирование сервиса Faces

Крайне рекомендуется регулярно создавать резервные копии баз данных на отдельном сервере независимо от уровня отказоустойчивости системы. Это защитит от потери данных в непредвиденных случаях.

Очереди сообщений, базы данных и балансировщики, используемые LUNA PLATFORM — это продукты сторонних разработчиков. Их необходимо конфигурировать в соответствии с рекомендациями их поставщиков.

Сервисы Remote SDK и Python Matcher выполняют наиболее ресурсозатратные операции.

Сервис Remote SDK выполняет математическое преобразование изображений и извлечение биометрических шаблонов. Эти операции требуют значительных вычислительных мощностей. Для вычислений можно использовать как CPU, так и GPU.

Использование GPU предпочтительно, т.к. обработка запросов происходит эффективнее. Однако, поддерживаются не все типы видеокарт.

Сервис Python Matcher выполняет сравнение по спискам. Сравнение требует ресурсов CPU, однако также следует выделить максимально возможный объем оперативной памяти под каждый экземпляр Python Matcher. RAM используется для хранения биометрических шаблонов, полученных из базы данных. Таким образом, сервису Python Matcher не требуется запрашивать каждый БШ из базы данных.

При распределении экземпляров на нескольких серверах следует учитывать производительность каждого сервера. Например, если крупная задача выполняется несколькими экземплярами Python Matcher, а один из них находится на сервере с низкой производительностью, выполнение всей задачи в целом может замедлиться.

Обратите внимание, что для каждого экземпляра сервиса можно задать количество "рабочих процессов". Чем больше количество "рабочих процессов", тем больше ресурсов и памяти потребляется экземпляром сервиса. См. подробную информацию в разделе "Рабочие процессы" в руководстве администратора LUNA PLATFORM.

Nginx#

Nginx требуется при использовании нескольких экземпляров сервисов LUNA PLATFORM.

Конфигурация Nginx#

Конфигурационный файл Nginx включает в себя параметры для балансировки запросов в API, Faces, Image Store и Events.

Проверьте конфигурационный файл "/var/lib/luna/current/extras/conf/nginx.conf" перед запуском NGINX.

Nginx слушает запросы на указанных портах и отправляет запросы доступным экземплярам сервисов. В конфигурационном файле Nginx указаны следующие порты и серверы.

Имя сервиса Порт в Nginx Порты для запущенных сервисов
API 5000 5001-5004
Faces 5030 5031-5034
Image Store 5020 5021-5024
Events 5040 5041-5044

Запуск контейнера Nginx#

Примечание. Требуется сконфигурировать файл для использования с запущенными сервисами.

Используйте команду docker run со следующими параметрами для запуска контейнера Nginx:

docker run \
-v /etc/localtime:/etc/localtime:ro \
-v /var/lib/luna/current/extras/conf/nginx.conf:/etc/nginx/nginx.conf \
--name=nginx \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/nginx:1.17.4-alpine

-v /var/lib/luna/current/extras/conf/nginx.conf:/etc/nginx/nginx.conf — конфигурационный файл Nginx, используемый для запуска Nginx.

См. пример конфигурационного файла Nginx для запуска большего количества экземпляров сервисов здесь:

/var/lib/luna/current/extras/conf/nginx.conf

Запуск нескольких контейнеров#

Для запуска нескольких экземпляров одного и того же сервиса LP необходимо выполнить два шага.

  1. Запустить несколько контейнеров этого сервиса

Необходимо запустить требуемое количество сервисов, используя соответствующую команду для каждого сервиса.

Например, для сервиса API необходимо запустить следующую команду с обновленными параметрами.

docker run \
--env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=<port> \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/logs/<folder_name>:/srv/logs \
--name=<name> \
--restart=always \
--detach=true \
--network=host \
dockerhub.visionlabs.ru/luna/luna-api:v.6.40.0

При запуске нескольких схожих контейнеров должны различаться следующие параметры контейнеров:

--env=PORT=<port> — порты, указываемые для схожих контейнеров, должны быть разными. Необходимо задать доступный порт для экземпляра. Например, "5001", "5002". Порт "5000" будет задан для балансировщика Nginx.

/tmp/logs/<folder_name>:/srv/logs — папки для логов должны быть с разными именами, чтобы не смешивались записи разных экземпляров сервиса.

--name=<container_name> — запущенный контейнер должен иметь другое имя, т.к. нельзя запускать два контейнера с одним и тем же именем. Например, "api_1", "api_2".

--gpus device=0 — сервисы CORE обычно используют разные устройства GPU. Таким образом необходимо указывать разные номера устройств.

  1. Настройте балансировщик (например, Nginx) для маршрутизации запросов по сервисам.

Для каждого масштабированного сервиса LP необходимо задать порт, на котором Nginx будет слушать запросы сервисам и реальные порты каждого экземпляра сервиса, куда Nginx будет перенаправлять запросы.

Пример конфигурационного файла Nginx можно посмотреть здесь:

“/var/lib/luna/current/extras/conf/nginx.conf”.

Можно использовать другой балансировщик, но его использование не описано в данном документе.

Повышение производительности сервисов в Docker-контейнерах#

Следуйте этим шагам, если есть необходимость увеличить производительность LUNA PLATFORM в Docker-контейнерах.

Политики безопасности Docker накладывают ограничения на сетевое взаимодействие сервисов LP. При выполнении действий, приведенных ниже, и отключении этих политик новое сетевое соединение Docker-контейнеров будет устанавливаться приблизительно на 20% быстрее.

Изменение настроек может отрицательно сказаться на безопасности. Не изменяйте настройки, если плохо разбираетесь в работе Docker.

Перед выполнением приведенных ниже действий необходимо установить Docker. См. "Установка Docker".

1) Добавьте параметры --network=host --security-opt seccomp=unconfined к запуску каждого контейнера сервисов LP. Команды запуска описаны в разделе "Запуск сервисов"

Ниже приведен пример для сервиса Faces.

docker run --env=CONFIGURATOR_HOST=127.0.0.1 \
--env=CONFIGURATOR_PORT=5070 \
--env=PORT=5031 \
--env=WORKER_COUNT=1 \
--env=RELOAD_CONFIG=1 \
--env=RELOAD_CONFIG_INTERVAL=10 \
-v /etc/localtime:/etc/localtime:ro \
--name=luna-faces1 \
--restart=always \
--detach=true \
--network=host \
--security-opt seccomp=unconfined \
dockerhub.visionlabs.ru/luna/luna-faces:v.4.12.21

2) Добавьте "userland-proxy": false в конфигурацию Docker.

Создайте конфигурационный файл для Docker.

echo 'DOCKER_OPTS="--config-file=/etc/docker/daemon.json"' > /etc/default/docker

Создайте файл.

vi /etc/docker/daemon.json

Добавьте следующую опцию в открытый файл.

{
     "userland-proxy": false
}

Перезапустите Docker.

systemctl restart docker

Конфигурация внешней PostgreSQL#

В данном разделе описаны команды, необходимые для конфигурации внешней PostgreSQL для работы с LP. Внешней означает, что уже существует рабочая база данных и её необходимо использовать в LP.

Необходимо указать внешнюю базу данных и очередь сообщений в конфигурациях сервисов LP.

Пропустите этот раздел, если используете PostgreSQL из Docker-контейнера, поставляемого VisionLabs.

Пользователь базы данных и другие параметры могут различаться. Учитывайте это при выполнении команд.

В разделах ниже описано создание баз данных. Используйте скрипт "db_create.py" для создания структуры таблиц после создания самих таблиц. Запуск скрипта из контейнера описан для каждого сервиса в разделах выше. Например, см. раздел "Создание таблиц базы данных Faces".

Создание пользователя PostgreSQL#

Создайте пользователя базы данных.

runuser -u postgres -- psql -c 'create role luna;'

Присвойте пользователю пароль.

runuser -u postgres -- psql -c "ALTER USER luna WITH PASSWORD 'luna';"

Создание базы данных Configurator#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Configurator.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_configurator;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_configurator TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Accounts#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Accounts.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_accounts;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_accounts TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Handlers#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Handlers.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_handlers;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_handlers TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Backport 3#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Backport 3.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_backport3;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_backport3 TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Faces#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Faces.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_faces;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_faces TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Events#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Events.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_events;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_events TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Tasks#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Tasks.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_tasks;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_tasks TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Создание базы данных Video Manager#

Предполагается, что пользователь базы данных уже создан.

Создайте базу данных для сервиса Video Manager.

runuser -u postgres -- psql -c 'CREATE DATABASE luna_video_manager;'

Присвойте привилегии пользователю базы данных.

runuser -u postgres -- psql -c 'GRANT ALL PRIVILEGES ON DATABASE luna_video_manager TO luna;'

Разрешите пользователю авторизацию в базе данных.

runuser -u postgres -- psql -c 'ALTER ROLE luna WITH LOGIN;'

Компиляция VLMatch в PostgreSQL#

Примечание. В следующей инструкции описана установка для PostgreSQL 16.

Все файлы, требуемые для компиляции расширения, заданного пользователем (UDx), в VLMatch, можно найти в следующей директории:

/var/lib/luna/current/extras/VLMatch/postgres/

Для компиляции функции VLMatch UDx необходимо:

  • установить репозиторий RPM:
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
  • установить PostgreSQL:
dnf install postgresql16-server
  • установить окружение для разработки:
dnf install postgresql16-devel
  • установить пакет gcc:
dnf install gcc-c++
  • установить CMAKE. Необходима версия 3.5 или выше.

  • открыть скрипт make.sh в текстовом редакторе. Он включает в себя пути к используемой на данный момент версии PostgreSQL. Измените следующие значения (при необходимости):

SDK_HOME задает путь к домашней директории PostgreSQL. По умолчанию это /usr/pgsql-16/include/server;

LIB_ROOT задает путь к библиотечной корневой директории PostgreSQL. По умолчанию это /usr/pgsql-16/lib.

Откройте директорию скрипта make.sh и запустите его:

cd /var/lib/luna/current/extras/VLMatch/postgres/ 
chmod +x make.sh
./make.sh

Перенесите сгенерированный файл VLMatchSource.so в любое удобное место если PostgreSQL работает вне контейнера или в директорию /srv в контейнер PostgreSQL.

Путь до библиотеки указывается во время создания функции в БД (см. ниже).

Добавление функции VLMatch для БД Faces в PostgreSQL#

Сервис Faces требует добавления дополнительной функции VLMatch к используемой базе данных. LUNA PLATFORM не может выполнять вычисления по сравнению биометрических шаблонов без этой функции.

Библиотека VLMatch компилируется для конкретной версии базы данных.

Не используйте библиотеку, созданную для другой версии базы данных. Например, библиотеку, созданную для PostgreSQL версии 12 нельзя использовать для PostgreSQL версии 16.

В данном разделе описывается создание функции для PostgreSQL. Библиотека VLMatch должна быть скомпилирована и перенесена в PostgreSQL. См. раздел "Компиляция VLMatch для PostgreSQL".

Добавление функции VLMatch в базу данных Faces#

Функцию VLMatch необходимо применить в базу данных PostgreSQL.

Определите функцию в базе данных Faces:

sudo -u postgres -h 127.0.0.1 -- psql -d luna_faces -c "CREATE FUNCTION VLMatch(bytea, bytea, int) RETURNS float8 AS '/srv/VLMatchSource.so', 'VLMatch' LANGUAGE C PARALLEL SAFE;"

Важно! Здесь /srv/VLMatchSource.so - полный путь до скомпилированной библиотеки. Необходимо заменить путь на актуальный.

Протестируйте функцию, отправив следующий запрос в базу данных сервиса:

sudo -u postgres -h 127.0.0.1 -- psql -d luna_faces -c "SELECT VLMatch('\x1234567890123456789012345678901234567890123456789012345678901234'::bytea, '\x0123456789012345678901234567890123456789012345678901234567890123'::bytea, 32);"

База данных должна вернуть результат "0.4765625".

Добавление функции VLMatch для БД Events в PostgreSQL#

Сервис Events требует добавления дополнительной функции VLMatch к используемой базе данных. LUNA PLATFORM не может выполнять вычисления по сравнению биометрических шаблонов без этой функции.

Библиотека VLMatch компилируется для конкретной версии базы данных.

Не используйте библиотеку, созданную для другой версии базы данных. Например, библиотеку, созданную для PostgreSQL версии 12 нельзя использовать для PostgreSQL версии 16.

В данном разделе описывается создание функции для PostgreSQL. Библиотека VLMatch должна быть скомпилирована и перенесена в PostgreSQL. См. раздел "Компиляция VLMatch для PostgreSQL".

Добавление функции VLMatch в базу данных Events#

Функцию VLMatch необходимо применить в базе данных PostgreSQL.

Определите функцию в базе данных Events.

sudo -u postgres -h 127.0.0.1 -- psql -d luna_events -c "CREATE FUNCTION VLMatch(bytea, bytea, int) RETURNS float8 AS 'VLMatchSource.so', 'VLMatch' LANGUAGE C PARALLEL SAFE;"

Протестируйте функцию.

sudo -u postgres -h 127.0.0.1 -- psql -d luna_events -c "SELECT VLMatch('\x1234567890123456789012345678901234567890123456789012345678901234'::bytea, '\x0123456789012345678901234567890123456789012345678901234567890123'::bytea, 32);"

База данных должна вернуть результат "0.4765625".

Установка PostGIS для БД Events#

Сервис Events требует PostGIS для работы с координатами.

В данной инструкции описывается установка PostGIS для СУБД PostgreSQL 16. Версия PostGIS зависит от версии PostgreSQL.

Установите epel-release для доступа к расширенному репозиторию.

yum -y install epel-release

Установите PostGIS.

yum -y install postgis34_16

Активируйте PostGIS в базe данных.

sudo -u postgres -h 127.0.0.1 -- psql -d luna_events -c "CREATE EXTENSION postgis;"; 

См. дополнительную информацию о PostGIS на сайте https://postgis.net/.

VLMatch для Oracle#

Примечание. В следующей инструкции описана установка для Oracle 21c.

Все файлы, требуемые для компиляции расширения, заданного пользователем (UDx), в VLMatch, можно найти в следующей директории:

/var/lib/luna/current/extras/VLMatch/oracle

Для компиляции функции VLMatch UDx необходимо:

sudo yum install gcc g++ 
  1. Поменяйте переменную SDK_HOME — oracle sdk root (по умолчанию $ORACLE_HOME/bin, проверьте, что переменная окружения $ORACLE_HOME задана) в makefile.
vi /var/lib/luna/current/extras/VLMatch/oracle/make.sh
  1. Откройте директорию и запустите файл "make.sh".
cd /var/lib/luna/current/extras/VLMatch/oracle
chmod +x make.sh
./make.sh
  1. Определите библиотеку и функцию внутри базы данных (из консоли базы данных):
CREATE OR REPLACE LIBRARY VLMatchSource AS '$ORACLE_HOME/bin/VLMatchSource.so';
CREATE OR REPLACE FUNCTION VLMatch(descriptorFst IN RAW, descriptorSnd IN RAW, length IN BINARY_INTEGER)
   RETURN BINARY_FLOAT 
AS
   LANGUAGE C
   LIBRARY VLMatchSource
   NAME "VLMatch"
   PARAMETERS (descriptorFst BY REFERENCE, descriptorSnd BY REFERENCE, length UNSIGNED SHORT, RETURN FLOAT);
  1. Протестируйте функцию посредством вызова (из консоли базы данных):
SELECT VLMatch(HEXTORAW('1234567890123456789012345678901234567890123456789012345678901234'), HEXTORAW('0123456789012345678901234567890123456789012345678901234567890123'), 32) FROM DUAL;

Результат должен быть равен "0.4765625".

Перенесите сгенерированный файл VLMatchSource.so в любое удобное место если Oracle работает вне контейнера или в директорию /srv в контейнер Oracle.

Путь до библиотеки указывается во время создания функции в БД (см. ниже).