Действия

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)
servers.{service}.cluster [http://127.0.0.1:PORT] Список ссылок на рабочие серверы сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), tts (6186), sbs (6185).
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 Лимит времени на получение информации о модели
cluster.logfile logs/sync.log Расположение лога синхронизации для работы в кластере
cluster.statusFile logs/sync.status Файл для периодической записи отчета о состоянии синхронизации
cluster.nodes [ ] Перечень нод кластера UPS на которые будет отправляться содержимое папки "data"
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. Команда деинсталлирует сервис и удалит рабочий каталог, включая все установленные модели.


Часто задаваемые вопросы
Вопрос Ответ