Действия

UPS. Руководство администратора: различия между версиями

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

(установка)
 
(не показана 31 промежуточная версия 4 участников)
Строка 2: Строка 2:
===== '''Общее описание''' =====
===== '''Общее описание''' =====
Сервис предназначен для управления базовыми сервисами ядра, а также в качестве прокси-сервера доступа к сервисам с функцией балансировки нагрузки.
Сервис предназначен для управления базовыми сервисами ядра, а также в качестве прокси-сервера доступа к сервисам с функцией балансировки нагрузки.
===== '''Термины и определения''' =====
===== '''Термины и определения''' =====
Universal Proxy Server (UPS) – Сервис управления ядром с проксированием запросов.
Universal Proxy Server (UPS) – сервис управления ядром с проксированием запросов.




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




===== '''Установка/обновление сервиса''' =====
===== '''Установка/обновление UPS''' =====
[https://cloud.connect2ai.net/index.php/apps/files/?dir=/ups&fileid=482 Дистрибутив] распространяется в виде установочных пакетов для окружения и сервиса. Загрузите установочные пакеты на сервер и выполните команды для Вашей системы в каталоге с пакетом.
[https://cloud.connect2ai.net/index.php/apps/files/?dir=/ups&fileid=482 Дистрибутив] распространяется в виде установочных пакетов для окружения и сервиса. Загрузите установочные пакеты на сервер и выполните команды для вашей системы в каталоге с пакетом.


Для UPS необходимо [[PVE. Установка сервисного пакета окружения|устанавливать выделенное окружение]].
Для UPS необходимо [[PVE. Установка сервисного пакета окружения|устанавливать выделенное окружение]].


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


Загрузить последнюю версию пакета  <code>curl -s '<nowiki>https://cloud.connect2ai.net/ups/'</nowiki> --user 'user_nexcloud:pass_nexcloud' | bash</code>
При обновлении следующий список файлов и папок сохраняется: .userapi, .proxy, logs, nnets, config.json, cache, pretrained, pve, data. Сервис не требует остановки и возвращается в актуальное состояние после обновления.
 
Устновить/обновить пакет одной командой <code>curl -s '<nowiki>https://cloud.connect2ai.net/ups/?name=s'</nowiki> --user 'user_nexcloud:pass_nexcloud' | bash && chmod +x ./ups.sh && ./ups.sh -i</code>
 
Проверить актуальную версию пакета можно <code>curl -s '<nowiki>https://cloud.connect2ai.net/ups/?type=v'</nowiki></code>


Не забудьте запустить сервис и включить в автозапуск в системе:
Не забудьте запустить сервис и включить в автозапуск в системе:
Строка 33: Строка 38:
<code>systemctl status ups.service</code>
<code>systemctl status ups.service</code>


Разрешите доступ к порту 6182 на нужном интерфейсе по протоколу tcp.
Разрешите доступ к порту 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/<название модуля>.
 
Чтобы убедиться, что модуль доступен и работает, выполните запрос:
 
<code>curl -X GET "<nowiki>http://АДРЕС_СЕРВЕРА:6182/tts/synthesize/yandex_tts_emulator?rate=100&pitch=100&volume=0</nowiki>" --H "accept: application/json" --data-urlencode "text=текст для синтеза"  --output out.wav</code>
 
out.wav должен содержать синтезированный голос озвучивший текст из запроса.
 
Данный пример запроса говорит о том, что написан интерфейс Яндекса по синтезу. Соответственно, обращение к нему идет как к Яндексу и ответ как от Яндекса.
 
Пример структуры файла модуля (/opt/ups/modules/[имя модуля]/handler.py):
 
<code><small>import uuid, io, json</small></code>
 
<code><small>from app.modules import modulesns</small></code>
 
<code><small>from flask import send_file</small></code>
 
<code><small>from flask_restplus import Resource, reqparse</small></code>
 
<code><small>from app.ups import tools</small></code>
 
<code><small>config = json.load(open('/opt/ups/modules/yandex_tts_emulator/config.json'))</small></code>
 
<code><small>parser = reqparse.RequestParser()</small></code>
 
<code><small>parser.add_argument('voice',required=True)</small></code>
 
<code><small>parser.add_argument('text',required=True)</small></code>
 
<code><small>@modulesns.route("/speech/v1/tts:synthesize"</small></code>
 
<code><small>class YandexEmulator(Resource): # имя класса можно указать свое</small></code>
 
<code><small>   def post(self): # обязательный метод post класса</small></code>
 
<code><small>       args = parser.parse_args()</small></code>
 
<code><small>       voice = args['voice']</small></code>
 
<code><small>       voice = config['voices'].get(voice,None)</small></code>
 
<code><small>       if not voice:</small></code>
 
<code><small>           modulesns.abort(405, message = "Wrong voice", error = 1)</small></code>
 
<code><small>       reply = tools.getData(servicetype="tts",method="GET",data={'text':args['text']},url="/tts/synthesize/"+voice)</small></code>
 
<code><small>       if type(reply) is dict:</small></code>
 
<code><small>           return reply</small></code>
 
<code><small># возвращаемым значение метода post должен быть правильный результат, в данном примере синтезированный аудиофайл</small></code>
 
<code><small>       return send_file(</small></code>
 
<code><small>           io.BytesIO(reply),</small></code>
 
<code><small>           attachment_filename=str(uuid.uuid4())+'.wav',</small></code>
 
<code><small>           as_attachment=True,</small></code>
 
<code><small>           mimetype='audio/wav'</small></code>
 
<code><small>       )</small></code>
 
 
 
Пример структуры файла конфигурации (/opt/ups/modules/[имя модуля]/config.json):
 
<code><small>{</small></code>
 
<code><small>   "voices": {</small></code>
 
<code><small>       "alena": "Alya_8kHz"</small></code>
 
<code><small>   }</small></code>


<code><small>}</small></code>


===== '''Конфигурирование параметров сервиса''' =====
===== '''Конфигурирование параметров сервиса''' =====
Настройка параметров сервиса ыьс производится в файле /opt/ups/params.json
Настройка параметров сервиса ups производится в файле /opt/ups/params.json


Описание параметров приведено в таблице
Описание параметров приведено в таблице
Строка 52: Строка 200:
|logs.backups
|logs.backups
|10
|10
|Количество файлов ротации
|Количество файлов ротации.
|-
|-
|logs.maxSize
|logs.maxSize
|5242880
|5242880
|Максимальный размер файла в байтах, триггер для ротации
|Максимальный размер файла в байтах, триггер для ротации.
|-
|-
|auth.accessLifeTime
|auth.accessLifeTime
|1800
|1800
|Время жизни access token
|Время жизни access token.
|-
|-
|auth.refreshLifeTime
|auth.refreshLifeTime
|86400
|86400
|Время жизни refresh token
|Время жизни refresh token.
|-
|-
|servers.{service}.trainer
|servers.{service}.trainer
|<nowiki>http://127.0.0.1:PORT</nowiki>
|<nowiki>http://127.0.0.1:PORT</nowiki>
|Ссылка на сервер для обучения моделей сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183)
|Ссылка на сервер для обучения моделей сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), qas (6187), res (6156), ses (6190).
|-
|-
|servers.{service}.cluster
|servers.{service}.cluster
|<nowiki>[http://127.0.0.1:PORT]</nowiki>
|<nowiki>[http://127.0.0.1:PORT]</nowiki>
|Список ссылок на рабочие серверы сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), tts (6186), sbs (6185).
|Список ссылок на рабочие серверы сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), qas (6187), tts (6186), sbs (6185), ses (6190).
|-
|servers.res.cluster
|"<nowiki>https://0.0.0.0:6157</nowiki>
|Ссылка на сервис kibana, подключенный через раверс-прокси на nginx (входит в состав res).
|-
|-
|servers.{service}.timers.connect
|servers.{service}.timers.connect
Строка 88: Строка 240:
|servers.{service}.timers.install
|servers.{service}.timers.install
|60
|60
|Лимит времени на установку модели на сервис
|Лимит времени на установку модели на сервис.
|-
|-
|servers.{service}.timers.info
|servers.{service}.timers.info
|3
|3
|Лимит времени на получение информации о модели
|Лимит времени на получение информации о модели.
|-
|servers.ses.websockets
|"127.0.0.1:6191"
|Все адреса, в том числе и с SSL (wss), по которым доступен websocket-сервер ses.
|-
|servers.res.cluster
|"<nowiki>http://192.168.20.246:5601</nowiki>"
|[https://wiki.connect2ai.net/index.php/RES._%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B8_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_kibana_+_elasticsearch http адрес Kibana с отчетами.] Для доступа к отчетам по http адресу UPS, и для проксирования на порт 5602 кибаны для ssl UPS
|-
|servers.res.auth.username
servers.res.auth.password
|"reports"
"reports"
|Логин и пароль [https://wiki.connect2ai.net/index.php/RES._%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B8_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_kibana_+_elasticsearch пользователя 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
|nopassword
Строка 135: Строка 345:


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


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


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

Текущая версия от 09:53, 27 марта 2025

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

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

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

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. Команда деинсталлирует сервис и удалит рабочий каталог, включая все установленные модели.