UPS. Руководство администратора: различия между версиями
Материал из Флора AI
| (не показаны 34 промежуточные версии 4 участников) | |||
| Строка 2: | Строка 2: | ||
===== '''Общее описание''' ===== | ===== '''Общее описание''' ===== | ||
Сервис предназначен для управления базовыми сервисами ядра, а также в качестве прокси-сервера доступа к сервисам с функцией балансировки нагрузки. | Сервис предназначен для управления базовыми сервисами ядра, а также в качестве прокси-сервера доступа к сервисам с функцией балансировки нагрузки. | ||
===== '''Термины и определения''' ===== | ===== '''Термины и определения''' ===== | ||
Universal Proxy Server (UPS) – | Universal Proxy Server (UPS) – сервис управления ядром с проксированием запросов. | ||
===== '''Системные требования''' ===== | ===== '''Системные требования''' ===== | ||
Для нормальной работы сервиса требуется | Для нормальной работы сервиса требуется 4 Гб оперативной памяти, 1 CPU >= 2.20 GHz и 40 Гб дискового пространства. | ||
===== '''Установка/обновление UPS''' ===== | |||
[https://cloud.connect2ai.net/index.php/apps/files/?dir=/ups&fileid=482 Дистрибутив] распространяется в виде установочных пакетов для окружения и сервиса. Загрузите установочные пакеты на сервер и выполните команды для вашей системы в каталоге с пакетом. | |||
Для UPS необходимо [[PVE. Установка сервисного пакета окружения|устанавливать выделенное окружение]]. | |||
[ | |||
* Установка/обновление 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, необходим для обновления при отсутствующем прямом подключении к интернету). | |||
При обновлении следующий список файлов и папок сохраняется: .userapi, .proxy, logs, nnets, config.json, cache, pretrained, pve, data. Сервис не требует остановки и возвращается в актуальное состояние после обновления. | |||
Не забудьте запустить сервис и включить в автозапуск в системе: | Не забудьте запустить сервис и включить в автозапуск в системе: | ||
| Строка 27: | Строка 38: | ||
<code>systemctl status ups.service</code> | <code>systemctl status ups.service</code> | ||
Разрешите доступ к порту 6182 на нужном интерфейсе по протоколу | Разрешите доступ к порту 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> | |||
===== '''Конфигурирование параметров сервиса''' ===== | ===== '''Конфигурирование параметров сервиса''' ===== | ||
Настройка параметров сервиса | Настройка параметров сервиса ups производится в файле /opt/ups/params.json | ||
Описание параметров приведено в таблице | Описание параметров приведено в таблице | ||
| Строка 42: | Строка 196: | ||
|logs.path | |logs.path | ||
|logs/ | |logs/ | ||
| | |Директория для хранения логов. Примеры абсолютного пути: "/var/log/ups/" | ||
|- | |- | ||
|logs.backups | |logs.backups | ||
|10 | |10 | ||
|Количество файлов ротации | |Количество файлов ротации. | ||
|- | |- | ||
|logs.maxSize | |logs.maxSize | ||
|5242880 | |5242880 | ||
|Максимальный размер файла в байтах, триггер для ротации | |Максимальный размер файла в байтах, триггер для ротации. | ||
|} | |- | ||
|auth.accessLifeTime | |||
|1800 | |||
|Время жизни access token. | |||
|- | |||
|auth.refreshLifeTime | |||
|86400 | |||
|Время жизни refresh token. | |||
|- | |||
|servers.{service}.trainer | |||
|<nowiki>http://127.0.0.1:PORT</nowiki> | |||
|Ссылка на сервер для обучения моделей сервисов. Возможные варианты значения service (с портами по умолчанию) следующие: smc (6181), see (6184), spr (6183), qas (6187), res (6156), ses (6190). | |||
|- | |||
|servers.{service}.cluster | |||
|<nowiki>[http://127.0.0.1:PORT]</nowiki> | |||
|Список ссылок на рабочие серверы сервисов. Возможные варианты значения 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 | |||
|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 | |||
|"<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 | |||
|[ | |||
"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''' ===== | ||
Для удаления выполните команду: <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, необходим для обновления при отсутствующем прямом подключении к интернету).
- echo -n
При обновлении следующий список файлов и папок сохраняется: .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. Команда деинсталлирует сервис и удалит рабочий каталог, включая все установленные модели.