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

# Порты сервисов по умолчанию

Название сервиса | Порт
--- | ---
LUNA PLATFORM API | 5000
LUNA PLATFORM Admin | 5010
LUNA PLATFORM Image Store | 5020
LUNA PLATFORM Faces | 5030
LUNA PLATFORM Events | 5040
LUNA PLATFORM Tasks | 5050
LUNA PLATFORM Tasks Worker | 5051
LUNA PLATFORM Configurator | 5070
LUNA PLATFORM Sender | 5080
LUNA PLATFORM Handlers | 5090
LUNA PLATFORM Python Matcher | 5100
LUNA PLATFORM Licenses | 5120
LUNA PLATFORM Accounts | 5170
LUNA PLATFORM Lambda | 5210
LUNA PLATFORM Remote SDK | 5220
LUNA PLATFORM Video Manager | 5230
LUNA PLATFORM Video Agent | 5240
LUNA PLATFORM Streams Retranslator | 5250
LUNA PLATFORM Builder | 5290
Oracle DB | 1521
PostgreSQL | 5432
Redis DB | 6379
InfluxDB | 8086
Grafana | 3000

# Названия сервисов в Configurator

Таблица ниже включает в себя названия сервисов в сервисе Configurator. Данные параметры используются для конфигурации сервисов.

Сервис | Название сервиса в Configurator
--- | ---
API | luna-api
Licenses | luna-licenses
Faces | luna-faces
Image Store | luna-image-store
Accounts | luna-accounts
Tasks | luna-tasks
Events | luna-events
Sender | luna-sender
Admin | luna-admin
Remote SDK | luna-remote-sdk
Handlers | luna-handlers
Lambda | luna-lambda
Python Matcher | luna-python-matcher
Video Agent | luna-video-agent
Video Manager | luna-video-manager
Streams Retranslator | luna-streams-retranslator

Настройки для сервиса Configurator устанавливаются в его конфигурационном файле.

# Введение

В данном документе приводятся примеры шагов для подготовки окружения с помощью утилиты Storages и последующего запуска контейнеров LUNA PLATFORM.

Рекомендуется ознакомиться с руководством по утилите Storages перед развертыванием LUNA PLATFORM.

> Данный документ включает в себя пример развертывания LUNA PLATFORM. LUNA PLATFORM разворачивается в минимальной рабочей конфигурации для использования в демонстрационных целях. Данная конфигурация не является достаточной для реальной эксплуатации системы в продуктивном контуре.

Считается, что установка выполняется на сервере с Almalinux 9.5, где LP не была установлена.

Администратор должен вручную сконфигурировать Firewall и SELinux на сервере. Их конфигурация не описывается в данном документе.

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

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

- "Подготовка к запуску" — действия по распаковке архивов, подготовке директорий, настройке лицензии и пр. Некоторые действия могут быть опциональными.
- "Запуск сторонних сервисов" — запуск СУБД PostgreSQL и БД Redis, Influx, ClickHouse
- "Подготовка окружения" — подготовка окружения (создание баз данных, бакетов и пр.)
- "Запуск сервисов" — запуск контейнеров с сервисами LUNA PLATFORM

В разделе "Дополнительная информация" приводится полезная информация по описанию параметров запуска сервисов, командах Docker, включении Grafana для визуализации мониторинга и пр.

Для использования LUNA PLATFORM в Docker-контейнерах требуется сетевая лицензия. Лицензия предоставляется компанией VisionLabs по запросу отдельно от поставки. Лицензионный ключ создается с помощью отпечатка системы. Этот отпечаток создается на базе информации об аппаратных характеристиках сервера. Таким образом, полученный лицензионный ключ будет работать только на том же сервере, с которого был получен отпечаток системы. LUNA PLATFORM можно активировать с помощью одной из двух утилит — HASP или Guardant. В разделе "Активация лицензии" приведены полезные ссылки на инструкции по активации лицензионного ключа для каждого способа.

Данный документ не включает руководство по использованию Docker. Пожалуйста, обратитесь к документации Docker для более подробной информации:

https://docs.docker.com

> Для коммерческого использования LP рекомендуется оркестрация сервисов. Их использование не описано в данном документе.

> Все описываемые команды необходимо исполнять в оболочке Bash (когда команды запускаются напрямую на сервере) или в программе для работы с сетевыми протоколами (в случае удаленного подключения к серверу), например, Putty.

# Подготовка к запуску

Убедитесь в том, что вы являетесь root-пользователем перед тем, как начать установку!

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

1． Распаковать дистрибутив LUNA PLATFORM

2． Создать символическую ссылку

3． Изменить группу и владельца для директорий

4． Настроить SELinux и Firewall

5． Активировать лицензию

6． Авторизироваться в registry VisonLabs

7． Выполнить установку Docker

8． Выбрать способ записи логов

9． Настроить вычисления с помощью GPU, если планируется использовать GPU

## Распаковка дистрибутива

Дистрибутив представляет собой архив luna_v.5.139.0, где v.5.139.0 это числовой идентификатор, обозначающий версию LUNA PLATFORM.

Архив включает в себя конфигурационные файлы, требуемые для установки и использования. Он не включает в себя Docker образы сервисов, их требуется скачать из Интернета отдельно.

Переместите дистрибутив в директорию на вашем сервере перед установкой. Например, переместите файлы в директорию `/root/`. В ней не должно быть никакого другого дистрибутива или файлов лицензии кроме целевых.

Создайте директорию для распаковки файла дистрибутива

    mkdir -p /var/lib/luna

Переместите дистрибутив в созданную директорию

    mv /root/luna_v.5.139.0.zip /var/lib/luna

Установите приложение для распаковки архива при необходимости

    dnf install -y unzip

Откройте папку с дистрибутивом

    cd /var/lib/luna

Распакуйте файлы

    unzip luna_v.5.139.0.zip

## Создание символической ссылки

Создайте символическую ссылку. Она показывает, что актуальная версия файла дистрибутива используется для запуска LUNA PLATFORM.

    ln -s luna_v.5.139.0 current

## Изменение группы и владельца для директорий

Сервисы LP запускаются внутри контейнеров пользователем "luna". Таким образом, требуется установить разрешения для данного пользователя на работу с примонтированными директориями.

Откройте директорию LP "example-docker":

    cd /var/lib/luna/current/example-docker/

Создайте директорию для хранения настроек:

    mkdir luna_configurator/used_dumps

Установите для пользователя с UID 1001 и группой 0 разрешения на работу с примонтированными директориями.

    chown -R 1001:0 luna_configurator/used_dumps

Откройте корневую директорию LP:

    cd /var/lib/luna/

Создайте директорию для хранения бакетов Image Store:

    mkdir image_store

Установите для пользователя с UID 1001 и группой 0 разрешения на работу с примонтированными директориями.

    chown -R 1001:0 image_store

## SELinux и Firewall

SELinux и Firewall необходимо настроить так, чтобы они не блокировали сервисы LUNA PLATFORM.

> Конфигурация SELinux и Firewall не описываются в данном руководстве.

Если SELinux и Firewall не настроены, дальнейшая установка невозможна.

## Активация лицензии

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

- выполнить действия из руководства по активации лицензии
- задать настройки лицензирования HASP или Guardant

### Действия из руководства по активации лицензии

1． Перейдите в руководство по активации лицензии и выполните все необходимые шаги.

2． Вернитесь на эту страницу, чтобы продолжить процедуру установки после успешной активации.

Важно: Активация лицензии является обязательным шагом. Без его выполнения лицензия работать не будет.

### Способы задания настроек лицензии HASP

Для HASP-ключа нужно задать IP-адрес сервера лицензирования. Его можно задать одним из двух способов:

- в дамп-файле "platform_settings.json" (см. ниже). Содержимое стандартных настроек будет перезаписано содержимым этого файла на этапе запуска сервиса Configurator.
- в настройках сервиса Licenses в пользовательском интерфейсе Configurator (см. раздел "Задание настроек лицензии HASP").

Выберите наиболее удобный способ и выполните действия, описанные в соответствующих разделах.

#### Задание настроек лицензии HASP с помощью дамп-файла

Откройте файл "platform_settings.json":

    vi /var/lib/luna/current/extras/conf/platform_settings.json

Задайте IP-адрес сервера с вашим ключом HASP в поле "server_address":

    {
        "value": {
            "vendor": "hasp",
            "server_address": "127.0.0.1"
        },
        "description":"License vendor config",
        "name":"LICENSE_VENDOR",
        "tags":[]
    },

Сохраните файл.

> Обратите внимание, что если лицензия активируется с помощью ключа HASP, то должно быть указано два параметра "vendor" и "server_address". Если вы хотите изменить защиту HASP на Guardant, то необходимо добавить поле "license_id".

### Способы задания настроек лицензии Guardant

Для Guardant-ключа нужно задать IP-адрес сервера лицензирования и идентификатор лицензии. Настройки можно задать одним из двух способов:

- в дамп-файле "platform_settings.json" (см. ниже). Содержимое стандартных настроек будет перезаписано содержимым этого файла на этапе запуска сервиса Configurator.
- в настройках сервиса Licenses в пользовательском интерфейсе Configurator (см. раздел "Задание настроек лицензии с помощью Configurator").

Выберите наиболее удобный способ и выполните действия, описанные в соответствующих разделах.

#### Задание настроек лицензии Guardant помощью дамп-файла

Откройте файл "platform_settings.json":

    vi /var/lib/luna/current/extras/conf/platform_settings.json

Задайте следующие данные:

- IP-адрес сервера с вашим ключом Guardant в поле "server_address"
- идентификатор лицензии в формате `0x<your_license_id>`, полученный в разделе "Сохранение идентификатора лицензии" в руководстве по активацию лицензии, в поле "license_id":

    {
        "value": {
            "vendor": "guardant",
            "server_address": "127.0.0.1",
            "license_id": "0x92683BEA"
        },
        "description":"License vendor config",
        "name":"LICENSE_VENDOR",
        "tags":[]
    },

Сохраните файл.

> Обратите внимание, что если лицензия активируется с помощью ключа Guardant, то должно быть указано три параметра "vendor", "server_address" и "license_id". Если вы хотите изменить защиту Guardant на HASP, то необходимо удалить поле "license_id".

## Авторизация в registry

При запуске контейнеров необходимо указать ссылку на образ, необходимый для запуска контейнера. Этот образ загружается из VisionLabs registry. Перед этим необходима авторизация.

> Логин и пароль можно запросить у представителя VisionLabs.

Введите логин .

    docker login dockerhub.visionlabs.ru --username <username>

После выполнения команды будет запрошен ввод пароля. Введите пароль.

> В команде `docker login` можно вводить логин и пароль одновременно, однако это не гарантирует безопасность, т.к. пароль можно будет увидеть в истории команд.

## Установка Docker

Установка Docker описана в официальной документации.

Примечание. При тестировании данной инструкции использовался Docker версии 25.0.3. Не гарантируется работа с более высокими версиями Docker.

Команды для быстрой установки приведены ниже.

> Проверьте официальную документацию на наличие обновлений при возникновении каких-либо проблем с установкой.

Установите зависимости:

    dnf install -y dnf-utils device-mapper-persistent-data lvm2

Добавьте репозиторий:

    dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Установите Docker:

    dnf -y install docker-ce docker-ce-cli containerd.io

Запустите Docker:

    systemctl start docker

    systemctl enable docker

Проверьте статус Docker:

    systemctl status docker

## Выбор способа записи логов

В LUNA PLATFORM существует два способа вывода логов:

- стандартный вывод логов (stdout);
- вывод логов в файл.

Настройки вывода логов задаются в настройках каждого сервиса в секции `<SERVICE_NAME>_LOGGER`.

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

> Для более подробной информации о системе логирования LUNA PLATFORM см. раздел "Логирование информации" в руководстве администратора.

### Запись логов в stdout

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

Рекомендуется настроить ротацию логов Docker для ограничения их размеров (см. раздел "Настройка ротации логов Docker").

### Запись логов в файл

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

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

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

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

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

См. инструкцию по включению записи логов в файлы в разделе "Запись логов на сервер".

## Вычисления с помощью GPU

Для основных вычислений, выполняемых сервисом Remote SDK, можно использовать GPU.

Пропустите данный раздел, если не собираетесь использовать GPU для вычислений.

Для использования GPU с Docker-контейнерами необходимо установить NVIDIA Container Toolkit. Пример установки приведен ниже.

    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | tee /etc/yum.repos.d/nvidia-docker.repo

    dnf install -y nvidia-container-toolkit

    systemctl restart docker

Проверьте работу NVIDIA Container toolkit, запустив базовый контейнер CUDA (он не входит в дистрибутив LP, его необходимо загрузить из Интернета):

    docker run --rm --gpus all nvcr.io/nvidia/cuda:12.4.0-base-ubi8 nvidia-smi

См. документацию NVIDIA для дополнительной информации.

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

> GPU-ускорение разработано для приложений с высокой нагрузкой, где количество запросов в секунду достигает тысяч. Нецелесообразно использовать ускорение GPU в сценариях с небольшой нагрузкой, когда задержка начала обработки имеет значение.

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

В данном разделе описывается запуск баз данных в Docker-контейнерах. Они должны быть запущены перед подготовкой окружения и сервисами LP.

## InfluxDB

Для мониторинга сервисов LUNA PLATFORM по умолчанию используется база данных InfluxDB 2.0.8-alpine. Ниже приведена команда для запуска контейнера InfluxDB.

Примечание. В качестве альтернативы можно использовать БД ClickHouse, инструкция по запуску которой см. в разделе "Использование ClickHouse в качестве альтернативы InfluxDB". Информацию о выборе БД для мониторинга см. в разделе "Мониторинг" руководства администратора.

> При необходимости можно настроить визуализацию данных мониторинга с помощью сервиса LUNA Dashboards, включающего настроенную систему визуализации данных Grafana. Также можно запустить инструмент для расширенной работы с логами Grafana Loki. См. инструкцию по запуску LUNA Dashboards и Grafana Loki в разделе "Визуализация мониторинга и логов с помощью Grafana".

Примечание. При необходимости можно использовать внешнюю БД InfluxDB 2.0.8-alpine. В таком случае можно пропустить команду ниже, однако вам придется задать пользовательские настройки для каждого сервиса LUNA PLATFORM.

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

    docker run \
    -e DOCKER_INFLUXDB_INIT_MODE=setup \
    -e DOCKER_INFLUXDB_INIT_BUCKET=default \
    -e DOCKER_INFLUXDB_INIT_USERNAME=luna \
    -e DOCKER_INFLUXDB_INIT_PASSWORD=password \
    -e DOCKER_INFLUXDB_INIT_ORG=luna \
    -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=kofqt4Pfqjn6o0RBtMDQqVoJLgHoxxDUmmhiAZ7JS6VmEnrqZXQhxDhad8AX9tmiJH6CjM7Y1U8p5eSEocGzIA== \
    -v /etc/localtime:/etc/localtime:ro \
    -v /var/lib/luna/influx:/var/lib/influxdb2 \
    --restart=always \
    --detach=true \
    --network=host \
    --name influxdb \
    dockerhub.visionlabs.ru/luna/influxdb:2.0.8-alpine

> В команде выше создается стандартный бакет. Бакет для хранения данных мониторинга LUNA PLATFORM будет создан на этапе подготовки окружения с помощью утилиты Storages.

## PostgreSQL

Примечание. При необходимости можно использовать внешнюю СУБД PostgreSQL. В таком случае можно пропустить команду ниже и выполнить действия из раздела "Конфигурация внешней PostgreSQL".

Используйте следующую команду для запуска PostgreSQL.

    docker run \
    --env=POSTGRES_USER=luna \
    --env=POSTGRES_PASSWORD=luna \
    --shm-size=1g \
    -v /var/lib/luna/postgresql/data/:/var/lib/postgresql/data/ \
    -v /etc/localtime:/etc/localtime:ro \
    --name=postgres \
    --restart=always \
    --detach=true \
    --network=host \
    --health-cmd="pg_isready -U luna -d postgres" \
    dockerhub.visionlabs.ru/luna/postgis-vlmatch:16.1

`-v /var/lib/luna/current/example-docker/postgresql/data/:/var/lib/postgresql/data/` — эта команда позволяет монтировать директорию "data" в контейнер PostgreSQL. Директория на сервере и директория в контейнере будут синхронизированы. Данные PostgreSQL из контейнера будут сохраняться в эту директорию.

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

> Все базы данных для сервисов LP следует создавать вручную, если используется уже установленный PostgreSQL.

## Redis

Примечание. Если у вас уже установлен Redis, пропустите этот шаг.

Примечание. При запуске Redis по умолчанию задан пароль `lunapass`. Крайне рекомендуется сменить пароль для повышения безопасности. Обратите внимание, что пароль должен быть указан в соответствующей настройке сервиса, например, в параметре "password" группы "LUNA_ATTRIBUTES_DB" сервиса Events. По умолчанию в дамп-файле уже прописан пароль `lunapass`.

Используйте следующую команду для запуска Redis.

    docker run \
    -v /etc/localtime:/etc/localtime:ro \
    --name=redis \
    --restart=always \
    --detach=true \
    --network=host \
    dockerhub.visionlabs.ru/luna/redis:7.2 \
    redis-server --requirepass lunapass

# Подготовка окружения

Окружение готовится с помощью сервиса Storages. С помощью команды ниже будет выполнено:

- Создание бакетов в InfluxDB для работы мониторинга
- Создание бакетов для сервиса Image Store
- Подготовка БД Influx для сбора агрегированной статистики сервисом Admin
- Создание баз данных, добавление функций VLMatch, создание сценариев миграции для СУБД PostgreSQL
- Загрузка базовых настроек в БД Configurator

## Выбор сервисов

Примечание. Выполняйте настройки из данного раздела только если требуется запустить сервисы, не включенные в стандартную конфигурацию LUNA PLATFORM.

Подготовку окружения можно выполнить как для каждого сервиса отдельно, так и для всех сервисов сразу. В данной документации окружение готовится с аргументом `all_entities`, означающим, что будут подготовлены все сущности для набора сервисов, определенных в конфигурации Storages.

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

Таким образом, выбор сервисов для подготовки окружения и дальшейшего запуска состоит из двух этапов:

- выбор сервисов в настройке "ADDITIONAL_SERVICE_USAGE" в конфигурационном файле Storages для того, чтобы утилита Storages могла подготовить все необходимые сущности для будущих сервисов
- выбор сервисов в настройке "ADDITIONAL_SERVICE_USAGE" в настройках LUNA PLATFORM чтобы сообщить системе какие сервисы надо использовать. Загрузить настройку можно либо с помощью дамп-файла, либо в настройках Configurator после его непосредственного запуска.

> В данной документации в качестве загрузки настроек используется дамп-файл.

В результате, чтобы выбрать сервисы, нужно заполнить два файла:

- конфигурационный файл Storages
- дамп-файл

Можно включить или выключить подготовку окружения для следующих сервисов:

- Faces
- Events
- Image Store
- Tasks
- Sender
- Handlers
- Remote SDK
- Python Matcher
- Python Matcher Proxy (отключен по умолчанию)
- Lambda (отключен по умолчанию)
- Video Manager (отключен по умолчанию)
- Video Agent (отключен по умолчанию)
- Streams Retranslator (отключен по умолчанию)

> Работа с сервисом Lambda возможна только при разворачивании сервисов LUNA PLATFORM в Kubernetes. См. подробную информацию в руководстве по разворачиванию LP в Kubernetes.

Важно! Отключение подготовки окружения для основных сервисов имеет определенные последствия. См. подробную информацию в разделе "Отключаемые сервисы" руководства администратора.

## Настройка конфигурационного файла Storages

Примечание. Пропустите данный раздел, если нужно запустить LUNA PLATFORM в стандартной конфигурации.

При подготовке окружения используется конфигурационный файл сервиса Storages, содержащий:

- список сервисов для которых будет подготовлено окружение
- настройки подключения к базам данных
- настройки подключения к бакетам
- настройки подключения к S3
- настройки мониторинга
- другие

Этот файл должен быть примонтирован к контейнеру сервиса Storages и указан в аргументе `--config`.

В качестве примера монтируется файл `storages_config.conf`, содержащий стандартные настройки для разворачивания LUNA PLATFORM в минимальной базовой конфигурации.

Отредактируйте конфигурационный файл Storages для задания пользовательских настроек:

    vi /var/lib/luna/current/extras/conf/storages_config.conf

## Настройка дамп-файла

Примечание. Пропустите данный раздел, если нужно запустить LUNA PLATFORM в стандартной конфигурации.

Отредактируйте дамп-файл для задания пользовательских настроек:

    vi /var/lib/luna/current/extras/conf/platform_settings.json

## Команда подготовки окружения

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

    docker run \
    --rm \
    --network=host \
    -v /var/lib/luna/current/extras/conf/storages_config.conf:/srv/storages_config.conf \
    -v /var/lib/luna/image_store/:/srv/local_storage/ \
    -v /var/lib/luna/current/extras/conf/platform_settings.json:/srv/platform_settings.json \
    dockerhub.visionlabs.ru/luna/storages:v.0.145.0 \
    bash -c "luna_prepare prepare all_entities \
        --platform_version=v.5.139.0 \
        --profile=common \
        --config=/srv/storages_config.conf \
        --monitoring-ttl=30 \
        --local-buckets=/srv/local_storage \
        --dump-file=/srv/platform_settings.json"

Здесь:

- `-v /var/lib/luna/current/extras/conf/storages_config.conf:/srv/storages_config.conf` — команда монтирования конфигурационного файла Storages
- `-v /var/lib/luna/image_store/:/srv/local_storage/` — команда монтирования директории с бакетами Image Store
- `-v /var/lib/luna/current/extras/conf/platform_settings.json:/srv/platform_settings.json` — команда монтирования дамп-файла `platform_settings.json`
- `luna_prepare prepare all_entities` — команда "prepare" для подготовки всех сущностей
- `--platform_version` — именованный аргумент, содержащий версию LUNA PLATFORM
- `--profile` — именованный аргумент, содержащий профиль (ссылка на список сервисов) `backports`, означающий, что будет подготовлено окружение для всех сервисов
- `--config=/srv/storages_config.conf` — именованный аргумент, содержащий адрес конфигурационного файла для использования сервисом Storages
- `--monitoring-ttl=30` — именованный аргумент, который позволяет настроить политику хранения для неагрегированных данных мониторинга. Он задает максимальный срок в днях, в течение которого данные будут храниться в системе мониторинга перед автоматическим удалением.
- `--local-buckets=/srv/local_storage` — именованный аргумент, содержащий директорию, в которой должны быть созданы бакеты Image Store
- `--dump-file=/srv/platform_settings.json` — именованный аргумент, содержащий адрес дамп-файла внутри контейнера

# Запуск сервисов

В данном разделе приведены примеры команд запуска сервисов LUNA PLATFORM.

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

- Базы данных, балансировщики, HASP сервис и прочие сторонние сервисы
- Configurator
- Image Store
- Accounts
- Licenses
- Faces
- Events
- Python Matcher
- Python Matcher Proxy. Сервис отключен по умолчанию.
- Remote SDK
- Handlers
- Tasks
- Sender
- Streams Retranslator
- Сервисы видеоаналитики
- API
- Admin

Рекомендуется запускать контейнеры один за другим и ожидать отображения статуса контейнера "up" (команда `docker ps`).

Некоторые из этих сервисов не являются обязательными к запуску и можно отключить их использование. Рекомендуется использовать сервисы Events, Tasks, Sender и Admin по умолчанию. См. раздел "Выбор сервисов" для более подробной информации.

При запуске каждого сервиса используются определенные параметры, например, `--detach`, `--network` и др. См. раздел "Описание параметров запуска" для получения более подробной информации о всех параметрах запуска сервисов LUNA PLATFORM и баз данных.

См. раздел "Команды Docker" для получения более подробной информации о работе с контейнерами.

## Configurator

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

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

    docker run \
    --env=PORT=5070 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /var/lib/luna/current/example-docker/luna_configurator/configs/luna_configurator_postgres.conf:/srv/luna_configurator/configs/config.conf \
    -v /tmp/logs/configurator:/srv/logs \
    --name=luna-configurator \
    --restart=always \
    --detach=true \
    --network=host \
    dockerhub.visionlabs.ru/luna/luna-configurator:v.2.4.33

> На данном этапе можно активировать запись логов в файл, если необходимо сохранять их на сервере (см. раздел "Запись логов на сервер").

## Image Store

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

Примечание. Если вы не собираетесь использовать сервис Image Store, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

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

    docker run \
    --env=CONFIGURATOR_HOST=127.0.0.1 \
    --env=CONFIGURATOR_PORT=5070 \
    --env=PORT=5020 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    -v /var/lib/luna/image_store/:/srv/local_storage/ \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/logs/image-store:/srv/logs \
    --name=luna-image-store \
    --restart=always \
    --detach=true \
    --network=host \
    dockerhub.visionlabs.ru/luna/luna-image-store:v.3.22.0

`-v /var/lib/luna/image_store/:/srv/local_storage/` — данные из указанной директории добавляются в Docker-контейнер, когда он запущен. Все данные из указанной директории Docker-контейнера сохраняются в данную директорию.

> Если директория с бакетами LP уже создана, укажите ее вместо `/var/lib/luna/image_store/`.

## Accounts

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

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

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

## Licenses

Примечание. Для использования триальной лицензии необходимо запускать сервис Licenses на том же сервере, на котором она используется.

### Задание настроек лицензии с помощью Configurator

Выполните действия по заданию настроек для HASP-ключа или Guardant-ключа.

Примечание. Не выполняйте нижеописанные действия если вы уже указали настройки лицензии в разделах "Задание настроек лицензии HASP с помощью дамп-файла" или "Задание настроек лицензии Guardant с помощью дамп-файла".

#### Задание настроек лицензии HASP

Примечание. Выполняйте данные действия только если используется лицензия HASP. См. раздел "Задание настроек лицензии Guardant", если используется ключ Guardant.

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

- перейдите в интерфейс сервиса Configurator `http://<configurator_server_ip>:5070/`

- введите в поле "Setting name" значение "LICENSE_VENDOR" и нажмите "Apply Filters"

- задайте IP-адрес сервера с вашим ключом HASP в поле "server_address" в формате "127.0.0.1".

- нажмите "Save"

> Обратите внимание, что если лицензия активируется с помощью ключа HASP, то должно быть указано два параметра "vendor" и "server_address". Если вы хотите изменить защиту HASP на Guardant, то необходимо добавить поле "license_id".

#### Задание настроек лицензии Guardant

Примечание. Выполняйте данные действия только если используется ключ Guardant. См. раздел "Задание настроек лицензии HASP", если используется ключ HASP.

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

- перейдите в интерфейс сервиса Configurator `http://<configurator_server_ip>:5070/`

- введите в поле "Setting name" значение "LICENSE_VENDOR" и нажмите "Apply Filters"

- задайте IP-адрес сервера с вашим ключом Guardant в поле "server_address"

- задайте идентификатор лицензии в формате `0x<your_license_id>`, полученный в разделе "Сохранение идентификатора лицензии" руководства по активации лицензии, в поле "license_id"

- нажмите "Save"

> Обратите внимание, что если лицензия активируется с помощью ключа Guardant, то должно быть указано три параметра "vendor", "server_address" и "license_id". Если вы хотите изменить защиту Guardant на HASP, то необходимо удалить поле "license_id".

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

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

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

## Faces

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

Примечание. Если вы не собираетесь использовать сервис Faces, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

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

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

## Events

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

Примечание. Если вы не собираетесь использовать сервис Events, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

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

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

## Сервисы Python Matcher

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

> Необходимо использовать сервис Python Matcher Proxy только если собираетесь использовать плагины сравнения. Использование Python Matcher Proxy и запуск соответствующего docker-контейнера описаны в разделе "Использование Python Matcher c Python Matcher Proxy".

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

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

Сервис Python Matcher со сравнением посредством базы данных Faces включен по умолчанию при запуске.

Сервис Python Matcher со сравнением посредством Events также включен по умолчанию. Его можно отключить, для этого см. раздел "Выбор сервисов". Таким образом, сервис Events не будет использоваться для LUNA PLATFORM.

Python Matcher, который производит сравнение с помощью библиотеки сравнений, включается когда "CACHE_ENABLED" установлен как "true" в настройке "DESCRIPTORS_CACHE".

> Для сервисов Python Matcher и Python Matcher Proxy загружается одно изображение.

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

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

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

## Remote SDK

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

Примечание. Если вы не собираетесь использовать сервис Remote SDK, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

Вы можете запустить сервис Remote SDK, используя CPU (задано по умолчанию) или GPU.

> По умолчанию сервис Remote SDK запускается со всеми включенными эстиматорами и детекторами. При необходимости можно отключить использование некоторых эстиматоров или детекторов при запуске контейнера Remote SDK. Отключение ненужных эстиматоров позволяет экономить оперативную память или память GPU, поскольку при старте сервиса Remote SDK выполняется проверка возможности выполнения указанных оценок и загрузка нейронных сетей в память. При отключении эстиматора или детектора можно также удалить его нейронную сеть из контейнера Remote SDK. См. подробную информацию в разделе "Включение/отключение некоторых эстиматоров и детекторов" руководства администратора.

Запустите сервис Remote SDK, используя одну из следующих команд в соответствии с используемым процессором.

#### Запуск Remote SDK с использованием CPU

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

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

#### Запуск Remote SDK с использованием GPU

Сервис Remote SDK не использует GPU по умолчанию. Если вы собираетесь использовать GPU, то следует включить его использование для сервиса Remote SDK в сервисе Configurator.

Если необходимо использовать GPU сразу для всех эстиматоров и детекторов, то необходимо использовать параметр "global_device_class" в секции "LUNA_REMOTE_SDK_RUNTIME_SETTINGS". Все эстиматоры и детекторы будут использовать значение данного параметра, если в параметре "device_class" их собственных настроек выставлено значение "global" (по умолчанию).

Если необходимо использовать GPU для определенного эстиматора или детектора, то необходимо использовать параметр "device_class" в секциях вида "LUNA_REMOTE_SDK_estimator-or-detector-name_SETTINGS.runtime_settings".

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

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

    docker run \
    --env=CONFIGURATOR_HOST=127.0.0.1 \
    --env=CONFIGURATOR_PORT=5070 \
    --env=PORT=5220 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    --gpus device=0 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/logs/remote-sdk:/srv/logs \
    --network=host \
    --name=luna-remote-sdk \
    --restart=always \
    --detach=true \
    dockerhub.visionlabs.ru/luna/luna-remote-sdk:v.0.28.2

- `--gpus device=0` — параметр указывает используемое устройство GPU и позволяет использовать GPU. Один GPU используется для одного экземпляра Remote SDK. Использование множества GPU для одного экземпляра невозможно.

#### Запуск облегченной версии Remote SDK

Можно запустить облегченную версию сервиса Remote SDK, содержащую только конфигурационные файлы без нейронных сетей. Предполагается, что пользователь сам добавит в контейнер необходимые ему нейронные сети.

Запуск облегченной версии сервиса Remote SDK предназначен для продвинутых пользователей.

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

- запросить у VisionLabs требуемые нейронные сети
- поместить нейронные сети в папку с установленной LUNA PLATFORM
- присвоить соответствующие права для файлов нейронных сетей
- смонтировать файлы нейронных сетей в папку `/srv/fsdk/data` контейнера Remote SDK
- с помощью аргументов переменной "EXTEND_CMD" явно указать какие из нейронных сетей должны использоваться

> Обратите внимание, что с помощью флага "enable-all-estimators-by-default" для переменной "EXTEND_CMD" можно выключить по умолчанию использование всех нейронных сетей (эстиматоров), а затем с помощью специальных флагов явно указывать какие нейронные сети должны быть использованы. Если не указывать данный флаг или выставить значение "--enable-all-estimators-by-default=1", то сервис Remote SDK будет пытаться найти в контейнере все нейронные сети. Если какая-то из нейронных сетей не будет найдена, то сервис Remote SDK не запустится.

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

Аргумент | Описание
--- | ---
--enable-all-estimators-by-default | включить все эстиматоры по умолчанию
--enable-human-detector | одновременный детектор
--enable-face-detector | детектор лиц
--enable-body-detector | детектор тел
--enable-face-landmarks5-estimator | эстиматор 5 контрольных точек лица
--enable-face-landmarks68-estimator | эстиматор 68 контрольных точек лица
--enable-head-pose-estimator | эстиматор положения головы
--enable-liveness-estimator | эстиматор OneShotLiveness
--enable-fisheye-estimator | эстиматор бочообразной дисторсии (эффекта FishEye)
--enable-face-detection-background-estimator | эстиматор фона изображения
--enable-face-warp-estimator | эстиматор биометрического образца лица
--enable-body-warp-estimator | эстиматор биометрического образца тела
--enable-quality-estimator | эстиматор качества изображения
--enable-image-color-type-estimator | эстиматор типа цвета по лицу
--enable-face-natural-light-estimator | эстиматор естественности освещения
--enable-eyes-estimator | эстиматор глаз
--enable-gaze-estimator | эстиматор направления взгляда
--enable-mouth-attributes-estimator | эстиматор атрибутов рта
--enable-emotions-estimator | эстиматор эмоций
--enable-mask-estimator | эстиматор маски
--enable-glasses-estimator | эстиматор очков
--enable-eyebrow-expression-estimator | эстиматор бровей
--enable-red-eyes-estimator | эстиматор красных глаз
--enable-headwear-estimator | эстиматор головного убора
--enable-basic-attributes-estimator | эстиматор базовых атрибутов
--enable-face-descriptor-estimator | эстиматор извлечения биометрического шаблона лица
--enable-body-descriptor-estimator | эстиматор извлечения биометрического шаблона тела
--enable-body-attributes-estimator | эстиматор атрибутов тел
--enable-people-count-estimator | эстиматор количества людей
--enable-deepfake-estimator | эстиматор Deepfake

> См. подробную информацию включении и выключении определенных эстиматоров в разделе "Включение/отключение некоторых эстиматоров и детекторов" руководства администратора.

Ниже приведен пример команды для присвоения прав файлу нейронной сети:

    chown -R 1001:0 /var/lib/luna/current/<neural_network_name>.plan

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

    docker run \
    --env=CONFIGURATOR_HOST=127.0.0.1 \
    --env=CONFIGURATOR_PORT=5070 \
    --env=PORT=5220 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    --env=EXTEND_CMD="--enable-all-estimators-by-default=0 --enable-face-detector=1 --enable-face-descriptor-estimator=1" \
    -v /var/lib/luna/current/cnndescriptor_59.conf:/srv/fsdk/data/cnndescriptor_59.conf \
    -v /var/lib/luna/current/cnn59b_cpu-avx2.plan:/srv/fsdk/data/cnn59b_cpu-avx2.plan \
    -v /var/lib/luna/current/FaceDet_v3_a1_cpu-avx2.plan:/srv/fsdk/data/FaceDet_v3_a1_cpu-avx2.plan \
    -v /var/lib/luna/current/FaceDet_v3_redetect_v3_cpu-avx2.plan:/srv/fsdk/data/FaceDet_v3_redetect_v3_cpu-avx2.plan \
    -v /var/lib/luna/current/slnet_v3_cpu-avx2.plan:/srv/fsdk/data/slnet_v3_cpu-avx2.plan \
    -v /var/lib/luna/current/LNet_precise_v2_cpu-avx2.plan:/srv/fsdk/data/LNet_precise_v2_cpu-avx2.plan \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/logs/remote-sdk:/srv/logs \
    --network=host \
    --name=luna-remote-sdk \
    --restart=always \
    --detach=true \
    dockerhub.visionlabs.ru/luna/luna-remote-sdk:v.0.28.2

## Handlers

Примечание. Если вы не собираетесь использовать сервис Handlers, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

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

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

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

## Tasks

Примечание. Если вы не собираетесь использовать сервис Tasks, не запускайте контейнер Tasks и контейнер Tasks Worker. Отключите сервис Tasks, для этого см. раздел "Выбор сервисов".

### Запуск контейнеров Tasks и Tasks Worker

Образ сервиса Tasks включает в себя сервисы Tasks и Tasks Worker ("рабочие процессы сервиса Tasks"). Они оба должны быть запущены.

> Если необходимо использовать задачу Estimator с использованием сетевого диска, то необходимо предварительно смонтировать директорию с изображениями с сетевого диска в специальные директории контейнеров Tasks и Tasks Worker. См. подробную информацию в разделе "Задача Estimator" в руководстве администратора.

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

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

    docker run \
    --env=CONFIGURATOR_HOST=127.0.0.1 \
    --env=CONFIGURATOR_PORT=5070 \
    --env=PORT=5051 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    --env=SERVICE_TYPE="tasks_worker" \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/logs/tasks-worker:/srv/logs \
    --name=luna-tasks-worker \
    --restart=always \
    --detach=true \
    --network=host \
    dockerhub.visionlabs.ru/luna/luna-tasks:v.3.29.20

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

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

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

## Sender

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

Примечание. Если вы не собираетесь использовать сервис Sender, не запускайте этот контейнер и отключите использование сервиса. См. раздел "Выбор сервисов".

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

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

## Streams Retranslator

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

Примечание. Обратите внимание, что сервис Streams Retranslator отключен по умолчанию. Чтобы запуск не приводил к ошибке, подготовьте окружение и пропишите его включение в соответствии с разделом "Выбор сервисов".

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

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

Обратите внимание, что сервис использует следующие порты:

- Порт 8554 — используется для обработки RTSP-потоков. Этот порт необходим, чтобы контейнер мог принимать видеопотоки RTSP от различных источников (камер, видеофайлов и т. д.).
- Порт 8888 — используется для отдачи HLS-потока для GUI. Этот порт необходим для того, чтобы предоставлять HLS-потоки клиентам, которые смогут отображать видео через HTTP.

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

Примечание. Обратите внимание, что порт для отдачи HLS-потока также можно заменить в настройке "EXTERNAL_LUNA_STREAMS_HLS_RETRANSMISSION_ADDRESS" для удобства.

## Сервисы видеоаналитики

Примечание. Обратите внимание, что видеосервисы Video Manager и Video Agent отключены по умолчанию. Чтобы запуск не приводил к ошибке, подготовьте окружение и пропишите их включение в соответствии с разделом "Выбор сервисов".

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

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

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

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

Вы можете запустить сервис Video Agent, используя CPU (задано по умолчанию) или GPU.

> По умолчанию сервис Video Agent запускается со всеми включенными эстиматорами и детекторами. При необходимости можно отключить использование некоторых эстиматоров или детекторов при запуске контейнера Video Agent. Отключение ненужных эстиматоров позволяет экономить оперативную память или память GPU, поскольку при старте сервиса Video Agent выполняется проверка возможности выполнения указанных оценок и загрузка нейронных сетей в память. При отключении эстиматора или детектора можно также удалить его нейронную сеть из контейнера Video Agent. См. подробную информацию в разделе "Включение/отключение некоторых эстиматоров и детекторов" руководства администратора.

Запустите сервис Video Agent, используя одну из следующих команд в соответствии с используемым процессором.

#### Запуск Video Agent с использованием CPU

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

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

#### Запуск Video Agent с использованием GPU

Сервис Video Agent не использует GPU по умолчанию. Если вы собираетесь использовать GPU, то следует включить его использование для сервиса Video Agent в сервисе Configurator.

Если необходимо использовать GPU сразу для всех эстиматоров и детекторов, то необходимо использовать параметр "global_device_class" в секции "LUNA_VIDEO_AGENT_RUNTIME_SETTINGS". Все эстиматоры и детекторы будут использовать значение данного параметра, если в параметре "device_class" их собственных настроек выставлено значение "global" (по умолчанию).

Если необходимо использовать GPU для определенного эстиматора или детектора, то необходимо использовать параметр "device_class" в секциях вида "LUNA_VIDEO_AGENT_estimator-or-detector-name_SETTINGS.runtime_settings".

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

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

    docker run \
    --env=CONFIGURATOR_HOST=127.0.0.1 \
    --env=CONFIGURATOR_PORT=5070 \
    --env=PORT=5240 \
    --env=WORKER_COUNT=1 \
    --env=RELOAD_CONFIG=1 \
    --env=RELOAD_CONFIG_INTERVAL=10 \
    --gpus device=0 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/logs/video-agent:/srv/logs \
    --name=luna-video-agent \
    --restart=always \
    --detach=true \
    --network=host \
    dockerhub.visionlabs.ru/luna/luna-video-agent:v.1.22.0

- `--gpus device=0` — параметр указывает используемое устройство GPU и позволяет использовать GPU. Один GPU используется для одного экземпляра Video Agent. Использование множества GPU для одного экземпляра невозможно.

## API

### Запуск контейнера 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.7.2.0

### Создание аккаунта

Аккаунт создается с помощью HTTP-запроса к ресурсу "create account".

> Аккаунт также можно создать с помощью сервиса Admin. Данный способ требует наличия существующих логина и пароль (или логина и пароля по умолчанию) и позволяет создать аккаунты типа "admin". См. подробную информацию в разделе "Сервис Admin" руководства администратора.

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

- login — электронный адрес
- password — пароль
- account_type — тип аккаунта ("user" или "advanced_user")

Создайте аккаунт, используя свои аутентификационные данные.

Пример CURL-запроса к ресурсу "create account":

    curl --location --request POST 'http://127.0.0.1:5000/6/accounts' \
    --header 'Content-Type: application/json' \
    --data '{
      "login": "user@mail.com",
      "password": "password",
      "account_type": "user",
      "description": "description"
    }'

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

> См. подробную информацию об аккаунтах в разделе "Аккаунты и типы авторизации" руководства администратора.

> Для работы с токенами необходимо наличие аккаунта.

### Создание расписания задачи GC

Перед началом работы с LUNA PLATFORM можно создать расписание для задачи Garbage collection.

Для этого следует выполнить запрос "create tasks schedule" к сервису API, указав необходимые правила для расписания.

Пример команды создания расписания для аккаунта из раздела "Создание аккаунта", приведен ниже.

В примере задается расписание для задачи Garbage collection для событий старше 30 дней с удалением БО и исходных изображений. Задача будет повторяться один раз в сутки в 05:30 утра.

    curl --location --request POST 'http://127.0.0.1:5000/6/tasks/schedules' \
    --header 'Authorization: Basic dXNlckBtYWlsLmNvbTpwYXNzd29yZA==' \
    --header 'Content-Type: application/json' \
    --data '{
        "task": {
            "task_type": 4,
            "content": {
                "target": "events",
                "filters": {
                    "create_time__lt": "now-30d"
                },
                "remove_samples": true,
                "remove_image_origins": true
            }
        },
        "trigger": {"cron": "30 5 * * *", "cron_timezone": "utc"},
        "behaviour": {"start_immediately": false, "create_stopped": false}
    }'

При необходимости можно создать расписание без его автоматической активации. Для этого нужно указать параметр "create_stopped": "true". В таком случае после создания расписания его необходимо активировать вручную с помощью параметра "action" = "start" запроса "patch tasks schedule".

См. подробную информацию в разделе "Запуск задач по расписанию" руководства администратора.

## Admin

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

Примечание. Если вы не собираетесь использовать сервис Admin, не запускайте этот контейнер.

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

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

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

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

- Использование ClickHouse в качестве альтернативы InfluxDB
- Визуализация монтиторинга и логов с помощью Grafana
- Полезные команды для работы с Docker
- Описание параметров запуска сервисов LUNA PLATFORM и создания баз данных
- Способы изменения настроек сервисов
- Действия по включению сохранения логов сервисов LP в файлы
- Настройка ротации логов Docker
- Задание пользовательских настроек InfluxDB
- Использование сервиса Python Matcher с сервисом Python Matcher Proxy
- Масштабирование системы
- Повышение производительности сервисов в Docker-контейнерах
- Ручное создание баз данных при использовании внешней СУБД PostgreSQL (в т.ч. создание функции VLMatch для БД Faces и Events)
- Компиляция библиотеки VLMatch для Oracle

## Использование ClickHouse в качестве альтернативы InfluxDB

Ниже приведена команда по запуску контейнера ClickHouse. Дополнительную информацию см. в разделе "Мониторинг" в руководстве администратора.

Примечание. При необходимости можно использовать внешнюю БД ClickHouse. В таком случае можно пропустить команду ниже, однако вам придется задать пользовательские настройки для каждого сервиса LUNA PLATFORM.

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

    docker run \
    -e CLICKHOUSE_USER=luna \
    -e CLICKHOUSE_PASSWORD=password \
    -v /var/lib/luna/clickhouse/data:/var/lib/clickhouse \
    -v /var/lib/luna/clickhouse/logs:/var/log/clickhouse-server \
    -v /var/lib/luna/current/extras/conf/clickhouse_config.xml:/etc/clickhouse-server/config.xml \
    --name=clickhouse \
    --network=host \
    --restart=always \
    --detach=true \
    --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1" \
    dockerhub.visionlabs.ru/luna/clickhouse-server:v.25.4.0

> Команда выше используется для запуска ClickHouse. База данных для хранения данных мониторинга LUNA PLATFORM будет создана на этапе подготовки окружения с помощью утилиты Storages.

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

1． Откройте конфигурационный файл Storages:

     vi /var/lib/luna/current/extras/conf/storages_config.conf

и задайте в секции `LUNA_MONITORING` необходимые настройки для ClickHouse. Пример:

    STORAGE_TYPE = clickhouse
    SEND_DATA_FOR_MONITORING = 1
    HOST = 127.0.0.1
    PORT = 9000
    HTTP_PORT = 8123
    DB_USER = luna
    DB_PASSWORD = password
    DB_NAME = luna_monitoring
    USE_SSL = 0
    FLUSHING_PERIOD = 1

2． Отредактируйте секцию "LUNA_MONITORING" в настройках LUNA PLATFORM, чтобы сообщить системе какую базу данных для мониторинга необходимо использовать во всех сервисах (кроме сервиса Configurator).

Загрузить настройку можно с помощью дамп-файла перед стартом LUNA PLATFORM:

    vi /var/lib/luna/current/extras/conf/platform_settings.json

> Поскольку настройки сервиса Configurator хранятся в его конфигурационном файле `config.conf`, для настройки мониторинга этого сервиса необходимо отредактировать данный файл перед запуском контейнера. См. раздел "Запуск контейнера Configurator".

## Визуализация монтиторинга и логов с помощью 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.7

Для использования веб-интерфейса 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.7.2.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`. Для переменных окружения хост и порт задаются явно. Если аргумент не задан, то будет использован конфигурационный файл по умолчанию.
Нет | `LUNA_SKIP_CHECK_CONNECTION` | Отключает проверку соединения с основными сервисами (Image Store, Faces и др.) при запуске сервиса. По умолчанию проверка включена. См. раздел "Проверки работоспособности сервисов (health checks)" в руководстве администратора LUNA PLATFORM 5. |
`--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"

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

Существует три основных способа изменения настроек, хранящихся в базе данных сервиса 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/

Используйте полученный файл с помощью команды Storages для загрузки дампа (`load_dump`) с аргументом `--dump-file`: `--dump-file=/srv/settings_dump.json`, где "settings_dump.json" - имя дамп-файла. См. подробную информацию в разделе "Команда load_dump" руководства по утилите Storages.

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

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

- создать директории для логов на сервере;
- активировать запись логов и задать расположение хранения логов внутри контейнеров сервисов 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/luna-video-agent /tmp/logs/luna-video-manager /tmp/logs/luna-streams-retranslator

    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/luna-video-agent /tmp/logs/luna-video-manager /tmp/logs/luna-streams-retranslator

Если необходимо использовать сервис 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

Обновите настройки записи логов с помощью скопированного файла с помощью команды Storages для загрузки дампа (`load_dump`) с аргументом `--dump-file`: `--dump-file=/srv/logging.json`, где "logging.json" - имя дамп-файла. См. подробную информацию в разделе "Команда load_dump" руководства по утилите Storages.

Ручной способ (после запуска 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.7.2.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 с помощью команды Storages для загрузки дампа (`load_dump`) с аргументом `--dump-file`: `--dump-file=/srv/influx2.json`, где "influx2.json" - имя дамп-файла. См. подробную информацию в разделе "Команда load_dump" руководства по утилите Storages.

> Также можно вручную обновить настройки в пользовательском интерфейсе сервиса 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.21.3

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

    ADDITIONAL_SERVICES_USAGE = "luna_matcher_proxy":true

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

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

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

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

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

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

Балансирование сервиса 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.7.2.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. Таким образом необходимо указывать разные номера устройств.

2． Настройте балансировщик (например, 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.16.33

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.

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

### Создание пользователя 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;'

### Создание базы данных 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;'

### Компиляция 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 для доступа к расширенному репозиторию.

    dnf -y install epel-release

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

    dnf -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 dnf install gcc g++

2． Поменяйте переменную `SDK_HOME` — oracle sdk root (по умолчанию `$ORACLE_HOME/bin`, проверьте, что переменная окружения `$ORACLE_HOME` задана) в makefile.

    vi /var/lib/luna/current/extras/VLMatch/oracle/make.sh

3． Откройте директорию и запустите файл "make.sh".

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

    chmod +x make.sh

    ./make.sh

4． Определите библиотеку и функцию внутри базы данных (из консоли базы данных):

    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);

5． Протестируйте функцию посредством вызова (из консоли базы данных):

    SELECT VLMatch(HEXTORAW('1234567890123456789012345678901234567890123456789012345678901234'), HEXTORAW('0123456789012345678901234567890123456789012345678901234567890123'), 32) FROM DUAL;

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

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

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