Действия

UPS. Руководство администратора

Материал из Флора AI

Общее описание

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

Термины и определения

Universal Proxy Server (UPS) – сервис управления ядром с проксированием запросов.


Системные требования

Для нормальной работы сервиса требуется 4 Гб оперативной памяти, 1 CPU >= 2.20 GHz и 40 Гб дискового пространства.


Установка/обновление UPS

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

Для UPS необходимо устанавливать выделенное окружение.

  • Установка/обновление UPS осуществляется скриптом chmod +x ./ups-<версия>-<релиз>.sh && ./ups-<версия>-<релиз>.sh -i с правами администратора. Список всех ключей инсталлятора можно посмотреть, запустив инсталлятор ./ups-<версия>-<релиз>.sh без ключей.
  • Загрузить последнюю версию продукта curl -s "https://repo.connect2ai.net/api/ups/new" --user '[user]:[pass]' 2>&1 | bash или в интерактивном режиме bash -c "$(curl -s https://repo.connect2ai.net/api/ups --user '[user]:[pass]' 2>&1)".
  • Обновить UPS /opt/ups/inupdate в интерактивном режиме. Или запустить с ключом:
    • /opt/ups/inupdate -b – обновить до последней beta версии;
    • /opt/ups/inupdate -r – обновить до последней release версии;
    • /opt/ups/inupdate -n – обновить до последней версии (неважно beta или release).
  • Проверить актуальную версию продукта curl -s "https://repo.connect2ai.net/api/ups/version.
  • Посмотреть лог изменений curl -s "https://repo.connect2ai.net/api/ups/changelog" --user '[user]:[pass]'.
  • Полное описание всех команд API репозитория можно найти по ссылке https://repo.connect2ai.net/api. [user]:[pass] – это тот же логин и пароль, что и от Nextcloud.
  • В папке с продуктом можно добавить 2 файла конфигурации (допускается один общий файл на все продукты в папке с окружением /opt/pve/):
    • echo -n "[user]:[pass]" > /opt/ups/.userapi (это файл авторизации в API, нужен для обновления)
    • echo -n "http://example.com:3128 [user] [password]" > /opt/ups/.proxy (это файл конфигурации proxy, необходим для обновления при отсутствующем прямом подключении к интернету).

При обновлении следующий список файлов и папок сохраняется: .userapi, .proxy, logs, nnets, config.json, cache, pretrained, pve, data. Сервис не требует остановки и возвращается в актуальное состояние после обновления.

Не забудьте запустить сервис и включить в автозапуск в системе:

sudo systemctl enable ups.service && sudo systemctl start ups.service

Удостоверьтесь, что сервис стартовал:

systemctl status ups.service

Разрешите доступ к порту 6182 на нужном интерфейсе по протоколу TCP.

UPS может работать в составе кластера из двух и более серверов с UPS. Для этого необходимо создать кластер pacemaker/corosync с 2 ресурсами — ресурс systemd UPS и shared IP, и обеспечить их одновременную работу на одной ноде кластера. Синхронизацию изменений обеспечит сервис UPS с помощью lsyncd, для этого есть блок «cluster» в конфигурационном файле. Серверы кластера для этого должны иметь возможность соединения по SSH по ключу.


Внутренняя база данных

В каталоге /opt/ups/data/db находятся папки служебной базы данных. Папки созданы по разделам администрирования UPS. Каждый файл любой папки описывает один объект администрирования, например один из файлов из каталога "/opt/ups/data/db/roles".

{
 "id": "ee1b3b1edb8c4376486189d6540f5635",
 "name": "Только просмотр",
 "rights": [
   "SERVICE:smc",
   "SERVICE:see",
   "GET:/spr/audio",
   "GET:/spr/queue",
   "GET:/spr/waveform",
   "SERVICE:spr",
   "GET:/sbs/speakers",
   "SERVICE:sbs",
   "GET:/tts/dictionary/get",
   "SERVICE:tts",
   "GET:/qas/doc",
   "GET:/qas/list",
   "SERVICE:qas",
   "GET:/auth/datasets",
   "GET:/auth/roles",
   "GET:/auth/user/get",
   "GET:/auth/user/list",
   "SERVICE:auth",
   "GET:/model/errors",
   "GET:/model/handler",
   "GET:/model/log",
   "GET:/corpus/get",
   "GET:/corpus/list",
   "GET:/transcription/audio",
   "GET:/transcription/get",
   "GET:/transcription/list",
   "GET:/transcription/waveform",
   "GET:/server/get/addresses",
   "GET:/server/get/models",
   "GET:/lang/wallpaper"
 ]

}

описывает роль и ее параметры. В каждом файле обязательно есть уникальный id и хотя бы один параметр. В примере 2 параметра "name" и "rights".


Авторизация в UPS

UPS предполагает доступ по паролю к разделам интерфейса и информации от сервисов. Доступ осуществляется при помощи токена доступа. Токен запрашивается запросом, в котором передаются логин и пароль, а в ответ приходит токен авторизации и токен обновления авторизации.

Пример запроса:

curl -X POST "http://127.0.0.1:6182/auth/access?username=admin&password=password" -H "accept: application/json"

Пример ответа:

{

 "x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMCIsImNyZWF0ZWQiOjE3MTQ2NTk5MDIuOTk5MzQzNiwidHlwZSI6ImFjY2VzcyJ9.wrTRX2de5jhVFKRQ_Xt0fNXxHWN_yLiqZ6S_inix0Jg",
 "x-refresh-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMCIsImNyZWF0ZWQiOjE3MTQ2NTk5MDIuOTk5NTk1NCwidHlwZSI6InJlZnJlc2gifQ.Y3DNfIpfqJffjrPaT4TQiiF22Huvx62rmB-b9Az6UAc"

}

Пример запроса с участием токена:

curl -X GET "http://127.0.0.1:6182/auth/version" -H "accept: application/json" -H "x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMCIsImNyZWF0ZWQiOjE3MTQ2NTk5MDIuOTk5MzQzNiwidHlwZSI6ImFjY2VzcyJ9.wrTRX2de5jhVFKRQ_Xt0fNXxHWN_yLiqZ6S_inix0Jg"

В случае если UPS работает в закрытом контуре и авторизация не требуется, методы API, которые используются, нужно добавить в раздел «nopassword» конфигурационного файла (см. ниже).


Установка модулей для UPS

Есть возможность создать любой модуль, который будет эмулировать любой API-интерфейс любого стороннего сервиса через UPS. Для примера создан интерфейс Яндекс. Установка модулей возможна прямым копированием файлов модуля в директорию /opt/ups/modules/<название модуля>.

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

curl -X GET "http://АДРЕС_СЕРВЕРА:6182/tts/synthesize/yandex_tts_emulator?rate=100&pitch=100&volume=0" --H "accept: application/json" --data-urlencode "text=текст для синтеза" --output out.wav

out.wav должен содержать синтезированный голос озвучивший текст из запроса.

Данный пример запроса говорит о том, что написан интерфейс Яндекса по синтезу. Соответственно, обращение к нему идет как к Яндексу и ответ как от Яндекса.

Пример структуры файла модуля (/opt/ups/modules/[имя модуля]/handler.py):

import uuid, io, json

from app.modules import modulesns

from flask import send_file

from flask_restplus import Resource, reqparse

from app.ups import tools

config = json.load(open('/opt/ups/modules/yandex_tts_emulator/config.json'))

parser = reqparse.RequestParser()

parser.add_argument('voice',required=True)

parser.add_argument('text',required=True)

@modulesns.route("/speech/v1/tts:synthesize"

class YandexEmulator(Resource): # имя класса можно указать свое

   def post(self): # обязательный метод post класса

       args = parser.parse_args()

       voice = args['voice']

       voice = config['voices'].get(voice,None)

       if not voice:

           modulesns.abort(405, message = "Wrong voice", error = 1)

       reply = tools.getData(servicetype="tts",method="GET",data={'text':args['text']},url="/tts/synthesize/"+voice)

       if type(reply) is dict:

           return reply

# возвращаемым значение метода post должен быть правильный результат, в данном примере синтезированный аудиофайл

       return send_file(

           io.BytesIO(reply),

           attachment_filename=str(uuid.uuid4())+'.wav',

           as_attachment=True,

           mimetype='audio/wav'

       )


Пример структуры файла конфигурации (/opt/ups/modules/[имя модуля]/config.json):

{

   "voices": {

       "alena": "Alya_8kHz"

   }

}

Конфигурирование параметров сервиса

Настройка параметров сервиса ups производится в файле /opt/ups/params.json

Описание параметров приведено в таблице

Параметр По умолчанию Назначение
logs.path logs/ Директория для хранения логов. Примеры абсолютного пути: "/var/log/ups/"
logs.backups 10 Количество файлов ротации.
logs.maxSize 5242880 Максимальный размер файла в байтах, триггер для ротации.
auth.accessLifeTime 1800 Время жизни access token.
auth.refreshLifeTime 86400 Время жизни refresh token.
servers.{service}.trainer http://127.0.0.1:PORT Ссылка на сервер для обучения моделей сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), qas (6187), res (6156), ses (6190).
servers.{service}.cluster [http://127.0.0.1:PORT] Список ссылок на рабочие серверы сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), qas (6187), tts (6186), sbs (6185), ses (6190).
servers.res.cluster "https://0.0.0.0:6157 Ссылка на сервис kibana, подключенный через раверс-прокси на nginx (входит в состав res).
servers.{service}.timers.connect 0.5 Лимит времени на подключение к сервису, сек.
servers.{service}.timers.read 300 Лимит времени на получение данных от сервиса, сек.
servers.{service}.timers.failed 600 Длительность паузы обращений к сервису при сбое, сек.
servers.{service}.timers.install 60 Лимит времени на установку модели на сервис.
servers.{service}.timers.info 3 Лимит времени на получение информации о модели.
servers.ses.websockets "127.0.0.1:6191" Все адреса, в том числе и с SSL (wss), по которым доступен websocket-сервер ses.
servers.res.cluster "http://192.168.20.246:5601" http адрес Kibana с отчетами. Для доступа к отчетам по http адресу UPS, и для проксирования на порт 5602 кибаны для ssl UPS
servers.res.auth.username

servers.res.auth.password

"reports"

"reports"

Логин и пароль пользователя kibana с правами доступа на просмотр рабочих столов с отчетами
cluster.logfile logs/sync.log Расположение лога синхронизации для работы в кластере.
cluster.statusFile logs/sync.status Файл для периодической записи отчёта о состоянии синхронизации.
cluster.nodes [ ] Перечень нод кластера UPS, на которые будет отправляться содержимое папки «data».
userlog [ "POST:", "DELETE:" ] Типы действий пользователей, которые будут логироваться.
nouserlog [

        "POST:/auth/userlog",

        "POST:/ses/ask", 

"POST/auth/user/password",

        "POST/spr/stt",

        "POST/sbs/analyze",

        "POST/sbs/search",

        "POST/sbs/verify",

        "POST/tts/normalize",

        "POST/tts/revoice",

        "POST/tts/synthesize",

        "POST/qas/summarize"

    ]

Исключения из правила логирования действий пользователей.
nopassword [

"GET:/auth/refresh",

"GET:/auth/rights",

"POST:/auth/access",

"GET:/lang/",

"GET:/tts/synthesize",

"POST:/sbs/embedding",

"GET:/smc/classify",

"GET:/auth/version",

"GET:/smc/compress",

"GET:/smc/emotion",

"GET:/see/entities",

"POST:/sbs/analyze",

"POST:/sbs/verify",

"POST:/sbs/search",

"POST:/spr/stt",

"GET:/spr/result",

"GET:/auth/user/info",

"GET:/model/info",

"POST:/auth/user/password"

]

Список методов, которые не требуют авторизации.


Сбор данных об ошибках

Логи сервиса по умолчанию находятся в файле /opt/ups/logs/log.txt


Удаление UPS

Для удаления выполните команду: /opt/ups/uninstall. Команда деинсталлирует сервис и удалит рабочий каталог, включая все установленные модели.