- Создал(а) Уласко Виолетта Вадимовна мар. 03, 2026
Проверка конфигурации
Перед установкой платформы умного дома следует перепроверить, что в конфигурацию были внесены все требуемые изменения.
Для этого ниже приведены примеры всех полных файлов конфигурации, которые редактировались в рамках данного документа:
---
# Параметры установки платформы.
iot:
# Имя (IP-адрес) сервера, на котором будет производиться развертывание платформы IoT.
# ВАЖНО!!! В 'serverName' нужно прописывать то имя (IP-адрес), по которому будет доступны платформа.
serverName: "********.ru"
# Содержит путь до директории, в которую будет произведена установка.
installDir: /storage/iot
# Ссылка на политику конфиденциальности
privacyPolicyUrl: "https://********.ru/.well-known/privacy_policy"
# Ссылка на базу знаний
knowledgeBaseUrl: "https://********.ru/support/"
# Параметры MongoDB.
mongodb:
# Версия MongoDB. На старом железе, не поддерживающем оптимизацию, нужно выставить значение `4`.
version: 6
external:
# Если выставлен в true, будет использоваться внешняя MongoDB.
# ВАЖНО!!! MongoDB должна быть настроена, а параметры подключения нужно указать в 'uri'.
enable: false
# URI внешней MongoDB.
uri: "mongodb://****:****,****:****,****:****/?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority"
# Параметры WEB.
web:
# Порт HTTP, по которому будет осуществляться доступ в WEB.
httpPort: 80
# Порт HTTPS, по которому будет осуществляться доступ в WEB.
httpsPort: 443
# Автоматически перенаправлять запросы по порту HTTP на порт HTTPS
redirectHttpToHttps: true
# Нужно ли использовать HTTPS при формировании ссылок к WEB ('true' по умолчанию, при этом будет использован порт,
# указанный в 'iot.web.httpsPort'). Если поставить в 'false', будет использован HTTP и порт,
# указанный в 'iot.web.httpPort'.
useHttpsByDefault: true
nginx:
# Максимальное число соединений, которые одновременно может открыть рабочий процесс
worker_connections: 2048
# Ограничение скорости обработки запросов модулем Nginx Rate Limiting
rateLimit:
enable: true
certbot:
# Использовать ли certbot для получения сертификатов Let's Encrypt.
enable: false
# Email владельца домена. Необходим для подтверждения валидности домена при получении сертификата Let's Encrypt.
email: ****@****.com
fail2ban:
enable: true
# Параметры сервера отправки email.
mail:
smtp:
submitter: ****@****.com
password: "****"
senderPrefix: "Сервер Eltex-SC"
auth: "true"
host: ****.****.com
port: 587
# Протокол шифрования, используемый при подключении к серверу. Допустимые значения: none, starttls, ssl.
protection: starttls
push:
firebase:
enabled: false
apns:
enabled: false
hms:
enabled: false
# Параметры установки сервиса платежей для тарифов.
payment:
logLevel: INFO
# Параметры authorization server.
authorization:
# Уровень отладки внутри IoT Authorization Server.
logLevel: INFO
# Уровень сложности капчи: easy, medium, hard
captchaLevel: "easy"
# Параметры для управления доступностью саморегистрации.
selfRegistration:
allow: true
allowDemo: true
allowSocialNetworks: false
# Параметры клиентских регистраций (через соцсети).
clientRegistrations:
google:
enable: true
clientId: "GoogleClientIdChangeMe"
clientSecret: "GoogleClientSecretChangeMe"
microsoft:
enable: true
clientId: "MicrosoftClientIdChangeMe"
clientSecret: "MicrosoftClientSecretChangeMe"
apple:
enable: true
clientId: "AppleClientIdChangeMe"
keyId: "AppleKeyIdChangeMe"
teamId: "AppleTeamIdChangeMe"
yandex:
enable: true
clientId: "****"
clientSecret: "****"
vk:
enable: true
clientId: "****"
clientSecret: "****"
mailRu:
enable: true
clientId: "****"
clientSecret: "****"
skills:
# Параметры навыка Яндекс для интеграции с Умным домом (Алисой). Отображается в карточке навыка.
yandex:
enabled: false
# Параметры для Basic Authentication.
clientId: "****"
password: "****"
# Id навыка, который необходимо указывать при отправке уведомлений.
skillId: "****"
# OAuth-токен, который необходимо указывать при отправке уведомлений.
oauthToken: "****"
# Параметры проекта умного дома Сбера для интеграции с Салютом. Отображается в карточке проекта.
sber:
enabled: false
# Параметры для Basic Authentication.
clientId: "****"
password: "****"
# Bearer-токен, который необходимо указывать при отправке уведомлений.
bearerToken: "****"
# Параметры проекта умного дома Mail.ru для интеграции с Марусей. Отображается в карточке проекта/приложения.
marusya:
enabled: false
# Параметры для Basic Authentication.
clientId: "****"
password: "****"
# App ID, который был назначен приложению VK при создании.
appId: "****"
# OAuth-токен, который необходимо указывать при отправке уведомлений.
oauthToken: ""
# Параметры платформы IoT core.
core:
# Уровень отладки внутри IoT Core.
logLevel: INFO
# Порты платформы для подключения zway-контроллеров.
ctlGate:
port: 8070
tcpPort: 8069
sslPort: 8072
links:
# Нужно ли использовать HTTPS при формировании ссылок к ресурсам самой платформы (например, прошивки).
useHttpsForApi: false
# Нужно ли использовать HTTPS при формировании ссылок на фото с камер наблюдения.
useHttpsForCameraLinks: true
# Нужно ли использовать HTTPS при загрузке превью с камеры видеонаблюдения в систему.
useHttpsForCameraPreviewUpload: true
# Нужно ли использовать 'iot.web.httpPort'/'iot.web.httpsPort' при формировании ссылок к API.
useUiProxyForApi: true
# Параметры для работы с видеосерверами
video:
# Параметры Flussonic.
flussonic:
url: ""
apiKey: ""
operatorId: ""
adminLogin: ""
motion:
enabled: false
# Параметры видеосервера EVI
evi:
url: "https://******.********.ru:10000"
apiKey: "********"
operatorId: ""
adminLogin: "********"
# Настройки ИК-пульта.
irc:
# Время ожидания ИК команды от пользователя
recTimeout: 15s
# Таймаут записи команды (отсутствия фронтов)
cmdTimeout: 100ms
# Настройки охраны.
guard:
# Время, которое дается на включение FLIRS устройств (ждем подтверждение от контроллера),
# при постановке на охрану.
deviceRequestDelay: 15s
# Время, которое прибавляется ко времени задержки на очистку охранного кэша при постановке/снятия с охраны,
# на случай если охрана не завершила процесс постановки/снятия.
# Время задержки формируется как количество охранных устройств умноженное на deviceRequestDelay.
clearContextExtraCacheDelay: 1m
# Параметры установки сервисов логирования (Elasticsearch + Logstash + Kibana).
elk:
# Нужно ли добавлять в платформу appender, отправляющий логи в logstash.
# В нем нет необходимости, если ELK не развернут или не настроен; это лишь спровоцирует сообщения об ошибках отправки
# в логах платформы.
enable: false
# Имя (IP-адрес) сервера, на котором будет развернут ELK.
# По умолчанию совпадает с 'iot.serverName', что предполагает установку рядом с платформой (на том же хосте).
# В таком случае хосты в инвентаре в группах [iot] и [elk] должны совпадать.
serverName: "********.********.ru"
# Директория для установки системы логирования.
installDir: /storage/elk
slgate:
# Имя сервера, на котором будет развернут SLGATE.
# ВАЖНО!!! Нельзя использовать IP-адрес, т.к. такая схема не будет работать!
# По умолчанию совпадает с 'iot.serverName', что предполагает установку рядом с платформой (на том же хосте).
# В таком случае хосты в инвентаре в группах [iot] и [slgate] должны совпадать.
serverName: "{{ iot.serverName }}"
# Директория для установки SLGATE.
installDir: /storage/slgate
# Параметры установки сервера видеонаблюдения.
evi:
serverName: "{{ iot.serverName }}"
# Директория для установки системы мониторинга.
installDir: /storage/evi
---
# Экземпляр платформы с параметрами по умолчанию.
instance: "IoT-instance-default"
# Версия контейнеров.
release: "2.0.1"
# Имя репозитория docker registry, содержащего docker-образы для развертывания.
registry: hub.eltex-co.ru
# Список сервисов для перезапуска (при запуске плейбуков restart_*.yml).
# Можно оставить пустым, а при запуске передавать параметром командной строки.
services: [ ]
# Нужно ли выполнять подготовку дистрибутива к установке. Этот шаг полезен при "чистой" установке
# на только что созданный сервер. Если ранее уже была выполнена установка компонентов IoT через ansible,
# то такая подготовка не требуется и этот шаг можно пропустить для экономии времени.
withDistroPreparingStep: true
# Суффикс, добавляемый к имени каждого контейнера (помогает избежать конфликты имен контейнеров).
containerNameSuffix: ""
# Добавляет сеть docker "external" с параметром "external: true" к контейнерам.
# Позволяет пробрасывать порты из вне к контейнерам.
# Параметр сделан для сохранения обратной совместимости с прошлыми версиями при интеграции с сетью peeper #395336
# true по-умолчанию, если false - external уходит с контейнеров iot_base, кроме iot-web-mc
networkExternal: true
# Параметры сервисов IoT (для docker-compose), сгруппированные по именам.
# 'enable' - должен ли присутствовать сервис в docker-compose.yml.
# 'port.map' - номер порта сервиса в сети хоста.
# 'port.export' - нужно ли выполнять маппинг порта из контейнера в сеть хоста.
# 'db.name' - имя БД, используемой сервисом (связкой сервисов).
# Для большинства сервисов есть поля external и internal, например: iot.broker.external
# external - для взаимодействия с сервисом развернутым на сторонней машине не через ansible-playbook.
# internal - настройка внутренних подключений со стороны микросервисов при разворачивании через ansible-playbook.
iot:
swarm:
enabled: true
# Имя stack-а для запуска в docker-swarm.
stack: swarm_iot
# Параметры мониторинга использования дискового пространства. Должны соответствовать требованию:
# warnThreshold > criticalThreshold > 0, иначе мониторинг дискового пространства будет отключен.
diskUsage:
# Порог дискового пространства (в %), при достижении которого все логгеры микросервисов переводятся в режим WARN
# (отображаются сообщения с тегами WARN и ERROR). Количество бэкапов баз уменьшается пропорционально приближению к
# порогу criticalThreshold.
warnThreshold: 20
# Порог дискового пространства (в %), при достижении которого все логгеры микросервисов переводятся в режим ERROR
# (отображаются только сообщения с тегом ERROR). Бэкапы баз не выполняются.
criticalThreshold: 10
# использовать сервис Notification для отправки пушей, вместо старой логики
useNotification: true
mongodb:
replication:
label: has-mongodb
port:
map: 27017
export: false
broker:
logLevel: INFO
replication:
label: has-broker
metrics:
topicCounterEnabled: true
external:
# Будет ли развернут брокер на стороннем хосте.
enable: false
# Если установка брокера на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
# Внешний адрес стороннего хоста, по которому к брокеру будут подключаться платформа и устройства.
host: "external.broker.address"
port:
map: 8883
internal:
port:
map: 8083
export: false
db:
name: iot-broker
jconsole:
enable: false
port: 32002
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
hivemq:
rootFolder: /hivemq/
limits:
heap: 4G
clickhouse:
replication:
label: has-clickhouse
port:
map: 8123
export: false
db:
name: iotcore
olapservice:
logLevel: INFO
replication:
label: has-olap
replicaCount: 1
limits:
heap: 4G
external:
# Будет ли развернут olapservice И clickhouse на стороннем хосте.
# Если true, то отключает установку olapservice и clickhouse средствами Ansible.
enable: false
# Если установка olapservice на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
# Внешний адрес стороннего хоста, по которому платформа будет подключаться к olapservice'у.
# Параметр должен иметь схему ("http://" или "https://")
host: "external.olapservice.address"
port:
map: 8023
export: false
rabbit:
queue:
# Идентификатор очереди для отправки событий из core в olapservice.
save: olapservice-save-queue
exchange:
# Идентификатор топик-коллектора.
events: eventlog-exchange
routingKey:
# Ключ маршрутизации для сообщений сохранения событий в сервис хранения логов событий.
save: events.save
# Количество консьюмеров на стороне Olapservice.
olapservice:
# Данный параметр не может быть больше чем maxCount.
consumersCount: 1
# Максимальное количество одновременных консьюмеров очереди.
consumersMaxCount: 1
# Максимальное количество необработанных *пачек*, которые RabbitMQ доставляет одной реплике Olapservice до
# получения подтверждений.
# Документация: https://www.rabbitmq.com/docs/confirms#channel-qos-prefetch
prefetchCount: 50
# Ограничение на число *пачек*, обрабатываемых одновременно внутри одной реплики Olapservice.
# Количество пачек может быть ниже, если долго нет новых сообщений (см. batchReceiveTimeout).
# Фактическое количество сообщений зависит от core.batchSize:
# msgTotal <= core.batchSize * olapservice.batchSize
# Например, если olapservice.batchSize=10, а Core отправил 20 пачек средним размером по 80 сообщений,
# то обработано будет 10*80=800 сообщений единовременно.
batchSize: 10
# Максимальное время ожидания от момента поступления первого сообщения в пачку до начала её обработки
# в Olapservice.
batchReceiveTimeout: 100ms
core:
# Максимальное количество сообщений в одной пачке, которую Core отправляет в Olapservice через RabbitMQ.
# Фактический размер может быть меньше, если:
# - превышен размер пачки (см. параметр bufferLimit)
# - долго нет новых событий (см. параметр batchTimeout).
# Не рекомендуется превышать qos * число реплик Olapservice.
# Документация: https://docs.spring.io/spring-amqp/reference/amqp/sending-messages.html#template-batching
batchSize: 100
# Верхний предел суммарного размера пачки в байтах. При достижении этого размера накопление останавливается
# и текущая пачка отправляется.
# Расчёт основан на предположении ~1 КБ на сообщение при заданном prefetch (qos).
bufferLimit: 102400
# Максимальное время ожидания Core перед отправкой неполного батча, если в очередь не поступают новые сообщения.
# Таймер сбрасывается при добавлении каждого нового сообщения, поэтому высокая задержка нежелательна.
# Максимальное общее время задержки перед отправкой пачки в RabbitMQ = batchSize * batchTimeout.
batchTimeout: 10ms
captcha:
enable: true
replication:
label: has-captcha
port:
map: 8088
export: false
caseSensitive: true
allowedSizes:
- "312x45"
- "270x40"
instance: "captcha:8088"
proportion: 100
zscaptcha:
enable: false
replication:
label: has-captcha
port:
map: 8089
export: false
caseSensitive: true
instance: "zs-captcha:8089"
proportion: 0
authorization:
# Развертывание окружения без auth server, полезно для разработки auth server.
enable: true
replication:
label: has-authorization
limits:
heap: 4G
external:
host: "external.authorization.address"
port:
map: 8091
export: false
ssl:
map: 8093
export: false
db:
name: iot-authorization-server
jconsole:
enable: false
port: 32003
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
email:
blacklist:
# "0 * * * * ?" раз в минуту
# "0 ${random.int[60]} ${random.int[1,5]} 1 * ?" раз в неделю
cron: "0 ${random.int[60]} ${random.int[1,5]} 1 * ?"
swagger:
enable: false
rabbit:
voiceAuthDataQueues:
toAuthServer:
name: platform-auth-queue
fromAuthServer:
name: auth-platform-queue
authReceiveAndReply:
name: auth-receive-and-reply
timeout: 30s
# Количество консьюмеров на стороне платформы
platformConsumers:
# Данный параметр не может быть больше чем maxCount.
count: 16
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 16
# Настройки сервиса уведомлений
notification:
# Количество консюмеров
сount: 1
#Максимальное количество консюмеров
maxCount: 5
#Наименования обменика
exchange: notification-exchange
#Ключ маршртута для уведомлений
envelopeRoutingKey: notification
#Ключ маршртута событий входа/выхода
userEventRoutingKey: userevent
guard:
logLevel: INFO
external:
# Будет ли развернут guard на стороннем хосте.
enable: false
# Если установка guard на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
replication:
replicaCount: 1
label: has-guard
limits:
heap: 4G
port:
map: 8101
export: false
ssl:
map: 8103
export: false
db:
name: iot-guard
jconsole:
enable: false
port: 32005
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
swagger:
enable: false
rabbit:
queue:
coreReceive: core-receive-from-guard-queue
coreReceiveAndReply: core-receive-from-guard-and-reply-queue
guardReceive: guard-receive-from-core-queue
guardReceiveAndReply: guard-receive-from-core-and-reply-queue
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: 1
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 1
replyTimeout: 30s
payment:
enable: true
# ApiKey используется для доступа к АПИ платежного сервиса.
apiKey: "CHANGE_ME"
replication:
label: has-payment
limits:
heap: 4G
port:
map: 9091
export: false
ssl:
map: 9093
# Если експорт false, то запросы будут проксироваться через Nginx. Для тестирования флаг можно включать.
# Если флаг true, то запросы должны ходить на прямую в payment service
export: false
internal:
# Максимальный временной период, через который будет повторятся запрос статуса платежа на платежный сервис.
orderCheckTimePeriodMax: "30m"
# Максимальное время, через которое сервис перестает опрашивать ордер.
orderCheckTimeTotal: "24h"
# Промежуток времени, через который повторяется отправка сообщения на платформу об успешной оплате,
# чтобы платформа создала подписку. Повторная отправка отменяется если платформа прислала сообщение о создании
# подписки или если количество попыток передать сообщение превысило параметр checkSubscriptionCreatedMaxAttempts
checkSubscriptionCreatedPeriodTime: "5m"
# Количество попыток передать платформе сообщение об успешной оплате.
checkSubscriptionCreatedMaxAttempts: 10
db:
name: iot-payment-server
jconsole:
enable: false
port: 32004
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
swagger:
enable: false
paySystem:
# Необходимо указать ендпоинт на стороне IoT-Core куда будут переадресовываться запросы с ЮКассы.
# МП приложения могут сами распозновать , что вебвью с ЮКассой закрыта, и кидать необходимый запрос на Iot-core
# и переходить на нужный экран. Веб так не умеет, поэтому создан этот параметр. Когда веб поддержит покупку
# тарифов, нужно будет уточнить на какую именно страницу нужно делать редирект.
redirectUrlAfterPay: "https://eltexhome.ru"
yooKassa:
url: "https://api.yookassa.ru/v3"
# Идентификатор магазина.
shopId: ""
secretKey: ""
# Cписок доступных IP адресов запросов от Юкассы. Взято из официально документации.
# https://yookassa.ru/developers/using-api/webhooks#ip
availableHosts:
- "185.71.76.0/27"
- "185.71.77.0/27"
- "77.75.153.0/25"
- "77.75.156.11"
- "77.75.156.35"
- "77.75.154.128/25"
- "2a02:5180::/32"
rabbit:
queue:
# Очередь для приема сообщений от платформы.
paymentReceive: "paymentReceive"
# Очередь для приема сообщений от платформы и синхронного ответа во временную очередь.
paymentReceiveAndReply: "paymentReceiveAndReply"
# Время ожидания синхронного ответа от PaymentServer на сообщение, отправленное в очередь
# paymentReceiveAndReply
paymentReceiveAndReplyQueueTimeOut: "30s"
# Очередь для отправки сообщений на платформу.
platformReceive: "platformReceive"
consumers:
# Количество одновременных консьюмеров в Iot-Core для очереди platformReceive.
# Данный параметр не может быть больше чем maxCount.
coreCount: 1
# Максимальное количество одновременных консьюмеров в Iot-Core для очереди platformReceive.
coreMaxCount: 1
# Количество одновременных консьюмеров в Iot-Pqyment-Server для очереди paymentReceiveAndReply.
paymentCount: 10
# Максимальное количество одновременных консьюмеров в Iot-Pqyment-Server для очереди paymentReceiveAndReply.
paymentMaxCount: 20
core:
external:
# Будет ли развернут core на стороннем хосте.
enable: false
# Если установка core на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
replication:
replicaCount: 1
label: has-core
limits:
heap: 4G
port:
map: 8071
export: false
ssl:
map: 8073
export: false
db:
name: iot-core
# Имена устаревших БД в MongoDB, используемые платформой.
deprecated:
fs:
name: iot-fs
licenses:
name: iot-licenses
events:
name: iot-events
jconsole:
enable: false
port: 32001
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
swagger:
enable: false
broker:
# Нужно ли платформе пытаться подключиться к MQTT Broker.
enable: true
useShareSubscriptions: false
threadPools:
main:
size: 16
olapservice:
# Нужно ли платформе пытаться подключиться к OlapService.
enable: true
mjollnir:
# URL для Mjollnir.
url: "http://smart.eltex-co.ru:8078/api/v1"
slgate:
instances:
- ********.********.ru:4443
ignoreServerCertCheck: false
video:
evi:
ignoreServerCertCheck: false
# Api-key для валидации ивентов со стороны EVI Cloud перед его обработкой
eventApiKey: "***"
# Параметры WebRTC, которые необходимы камере для формирования своих ICE-кандидатов.
webrtc:
# Параметры STUN-сервера.
stun:
# URL STUN-серверов.
urls:
- "stun:***.***.***.***:3478"
- "stun:***.***.***.***:3478"
# Параметры TURN-сервера.
turn:
# Параметры TURN:SFU
sfu:
# Принудительное включение
force: false
# Таймаут на ожидание ивента от EVI о начале webrtc-сессии между камерой и TURN:SFU
eventTimeout: 10s
# Параметры P2P
p2p:
# Таймаут на ожидание SDP-answer от камеры
sdpAnswerTimeout: 60s
# Время ожидания проверки камерой типа своего NAT
checkCameraNatTypeTimeout: 10s
# Время выполнения ping к host candidate клиента
pingHostCandidateTimeout: 10s
rabbit:
events:
queue:
name: platform-rpc-event-queue
notification:
exchange: notification-exchange
envelopeRoutingKey: notification
userEventRoutingKey: userEvent
count: 1
maxCount: 1
# Сервис управления голосом Cloud ASR https://intdocs.eltex.loc/pages/viewpage.action?pageId=125740527
voice:
# Адрес Cloud ASR, для подключения платформы.
host: "127.0.0.1"
port: 443
# Ключ по которому Cloud ASR будет отправлять запрос на генерацию новой пары токенов для колонки.
# TODO будет удален в рамках #397994
apiKey: "CHANGE_ME"
# Параметры клиентского сертификата, используемого для авторизованного подключения платформы к Cloud ASR.
clientKeyStoreParams:
# Включить передачу клиентского сертификата. Следует переводить в значение true для продуктовой среды.
enable: false
# Путь до файла с форматом PKCS12 (*.p12), содержащего клиентский сертификат.
path: "/etc/ssl/private/asr_client.p12"
# Пароль от клиентского сертификата (*.p12).
password: ""
# Игнорировать ошибки при проверке сертификата сервера (полезно при работе с самоподписанными сертификатами)
ignoreServerCertCheck: true
web:
# Развертывание окружения без WEB, полезно для разработки web.
enable: true
replication:
label: has-web
hazelcast:
clusterName: iot-core
instanceName: iot-core-hazelcast-instance
replication:
label: has-hazelcast
external:
port:
map: 5701
export: false
rabbitmq:
logLevel: info
replication:
label: has-rabbitmq
persistence:
enabled: true
admin:
user: guest
password: guest
port:
map: 15672
export: false
cluster:
# Кука безопасности, для взаимодействя нод в кластере
cookie: AHSUSTCTPUGYENLLYOLB
# Количество попыток формирования кластера
discoveryRetryLimit: 120
# Интервал повторной попытки формирования кластера (в секундах)
discoveryRetryInterval: 1
# Время ожидания восстановления консистентности базы mnesia (в секундах)
mnesiaTableLoadingRetryTimeout: 10
# Количество попыток восстановления консистентности базы mnesia
mnesiaTableLoadingRetryLimit: 10
# Метка для нод воркеров в кластере
label: rabbit-cluster-node
port:
map: 5672
export: false
zwayproxy:
logLevel: INFO
external:
enable: false
# Если установка zwayproxy на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
replication:
replicaCount: 2
label: has-zwayproxy
limits:
heap: 4G
port:
map: 8070
export: true
sslPort:
map: 8072
export: true
rabbit:
queue:
# Идентификатор очереди для отправки сообщений из прокси в платформу.
platform: zway-proxy-platform
exchange:
# Идентификатор топик-коллектора.
proxy: zway-proxy-topic-exchange
# Количество консьюмеров на стороне платформы
platformConsumers:
# Данный параметр не может быть больше чем maxCount.
count: 16
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 16
# Количество консьюмеров на стороне zwayProxy service
proxyConsumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: 1
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 1
wsproxy:
logLevel: INFO
maxConnections: 25000
external:
enable: false
# Если установка wsproxy на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
# Адрес хоста куда nginx будет проксировать запросы.
host: "1.2.3.4"
port: 8075
replication:
replicaCount: 2
label: has-wsproxy
limits:
heap: 4G
port:
map: 8075
export: true
rabbit:
queue:
# Идентификатор очереди для отправки сообщений из прокси в платформу.
platform: ws-proxy-platform
exchange:
# Идентификатор топик-коллектора.
proxy: ws-proxy-topic-exchange
# Количество консьюмеров на стороне платформы
platformConsumers:
# Данный параметр не может быть больше чем maxCount.
count: 16
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 16
# Количество консьюмеров на стороне wsProxy service
proxyConsumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: 16
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 16
# Параметры установки сервисов мониторинга (Prometheus + Grafana) - только для режима compose.
monitoring:
external:
# Будет ли развернут monitoring на стороннем хосте.
enable: true
# Нужно ли устанавливать monitoring на сторонний хост средствами ansible.
install: false
# Если установка monitoring на сторонний хост будет выполняться средствами ansible, то в какую директорию.
installDir: /storage/iot
mongodbExporter:
replication:
label: has-mongodb-exporter
enable: true
port:
map: 9216
export: false
nginxExporter:
replication:
label: has-nginx-exporter
enable: true
port:
map: 9113
export: false
prometheus:
port:
map: 9090
export: false
# Период опроса сервисов со стороны Prometheus в секундах. Небольшие значения (менее десятков секунд) значительно
# увеличат нагрузку на сеть.
# При изменении параметра рекомендуется поменять переменную grafana.scrapeInterval на значение не ниже указанного
# для Prometheus, чтобы не терять метрики.
scrapeInterval: 60
grafana:
port:
map: 3000
# Период опроса Prometheus со стороны Grafana в секундах.
scrapeInterval: 60
# Параметры установки сервисов Peeper (мониторинга).
# В swarm-режиме Peeper запускается также как платформа через docker-swarm на том же кластере(связанные хосты),
# но в другом стеке (совокупность сервисов и контейнеров из которых состоит приложение).
# Т.к ansible-playbook создает кластер, то было принято решение чтобы ansible-playbook и расставлял все лейблы на
# ноды, но при этом запуск Peeper осуществляется вручную, а не по ansible-playbook, потому что это стороннее
# программное обеспечение напрямую не относящееся к ELIS.
peeper:
agent:
replication:
label: has-peeper-agent
provision:
replication:
label: has-peeper-provision
telegraf:
replication:
label: has-peeper-telegraf
notification:
enable: true
logLevel: INFO
replication:
label: has-notification
limits:
heap: 4G
jconsole:
enable: false
port: 32002
# Необходимо указать адрес хоста, куда будет подключаться jconsole-клиент.
# При развертывании докера - здесь указывается адреса хоста, где работает докер.
host: "10.20.30.40"
port:
export: false
map: 9095
rabbit:
exchange: notification-exchange
envelopeRoutingKey: notification
userEventRoutingKey: userevent
retry:
maxAttempts: 3
backoff: 120000
vault:
uri: https://127.0.0.1:8200
token: RootToken
ssl:
useTrustStore: false
trustStore: file:///etc/vault.jks
trustStoreType: jks
trustStorePassword: vault0
rootPath: credentials
push:
fcm:
# Период между отправкой пушей, для достижения ограничения частоты отправки пушей.
delay: 250ms
minio:
port:
export: false
map: 9000
external:
enable: false
url: http://minio:9000
accessKey: minioadmin
secretKey: minioadmin
# Список предопределенных корзин, создаваемых до запуска экземпяра Minio
buckets:
- iot
- critical-iot
# Список корзин для бэкапа
backups:
- critical-iot
console:
port: 9001
replication:
label: has-minio
slgate:
db:
name: "activator"
user: "activator"
password: "activator"
port:
map: 5432
export: false
vpn:
port:
map: 1194
protocol: udp
maxClients: 1024
easyrsa:
req:
country: "RU"
province: "Novosibirsk"
city: "Novosibirsk"
organization: "Eltex"
organizationUnit: "EMS"
email: "eltex@eltex-co.ru"
activator:
port:
map: 8899
export: false
proxy:
scheme: "https://"
useClientCert: false
clientCertPassword: "************"
port:
map: 4443
# Параметры сервисов ELK (для docker-compose), сгруппированные по именам.
# 'port.map' - номер порта сервиса в сети хоста.
# 'port.export' - нужно ли выполнять маппинг порта из контейнера в сеть хоста.
elk:
elasticsearch:
rest:
port:
map: 9200
nodes:
port:
map: 9300
logstash:
port:
map: 5001
api:
port:
map: 9600
kibana:
port:
map: 5601
fluentBit:
port:
map: 24224
# Индексы, создаваемые в elasticsearch со стороны fluentBit для наших Java-микросервисов
javaTargets:
- core
- authorization
- notification
- payment
- zwayproxy
- wsproxy
- mqttbroker
- olapservice
# Параметры для сервисов видеонаблюдения EVI.
evi:
watcher:
sslPort:
map: 5085
export: true
port:
map: 5084
export: true
wsPort:
map: 5083
export: true
dbName: watcher
cloudControl:
port:
map: 10000
export: true
dbName: control
cloudRat:
port:
map: 19199
export: true
sslPort:
map: 10456
export: true
dbName: rat
db:
root: admin
rootPassword: admin
eviUser: eviuser
eviUserPassword: eviuser
port:
map: 5432
export: true
# Доменное имя сервера, на котором развернута платформа
name: "{{ iot.serverName }}"
# Дефолтный язык отображения событий и сообщений
language: "ru"
port: {{ iot.authorization.port.map }}
ssl:
port: {{ iot.authorization.port.ssl.map }}
key: "/etc/ssl/private/authorization-server.key"
crt: "/etc/ssl/certs/authorization-server.crt"
ui:
# Доменное имя сервера, на котором развернут UI (WEB)
name: "{{ iot.serverName }}"
# Порты UI нужны для формирования на платформе ссылок, которые пользователь сможет открыть через UI.
port: {{ iot.web.httpPort }}
ssl:
port: {{ iot.web.httpsPort }}
# Параметры для формирования ссылок к UI(WEB) и API
links:
# Использовать схему https:// при формировании ссылок к UI
useHttpsForUi: {{ 'true' if iot.web.useHttpsByDefault else 'false' }}
# Ссылка на политику конфиденциальности
privacyPolicyUrl: "{{ iot.privacyPolicyUrl }}"
# Конфигурация tomcat
tomcat:
# Время простоя соединения
connection-timeout: 2m
max-connections: 25000
max-http-form-post-size: 200000B
# Конфигурация потоков
threads:
# Минимальное количество потоков
min-spare: 32
# Максимальное количество потоков
max: 512
# Максимальный размер очереди задач для потоков
max-queue-capacity: 32768
services:
# Параметры внутренних сервисов (компонентов) платформы.
internal:
loginInfo:
# Время жизни разлогиненных записей loginInfo, с даты выхода из учетной записи
ttl: 180d
# Максимально допустимый интервал времени отсутствия активности со стороны пользователя
# по истечении которого неактивные loginInfo (и привязанные к ним авторизации) автоматически разлогиниваются
activityTimeLimit: 180d
user:
# Максимально допустимый интервал времени отсутствия активности со стороны пользователя
# перед его деактивацией
allowedInactivePeriod: 180d
selfRegistration:
allow: {{ 'true' if iot.authorization.selfRegistration.allow else 'false' }}
allowDemo: {{ 'true' if iot.authorization.selfRegistration.allowDemo else 'false' }}
email:
blacklist:
cron: "{{ iot.authorization.email.blacklist.cron }}"
voice:
# Время до окончания действия токена, за которое ASR должен начать запрашивать новый токен авторизации.
timeToStartRefreshToken: 10m
refreshTokenTimeToLive: 30d
# Параметры для подключения к внешним сервисам, а также параметры внутренних сервисов (компонентов) платформы,
# обеспечивающих работу с внешними сервисами.
external:
rabbitmq:
# Должен ли сервис использовать тип очередей Quorum. Если развернут кластер RabbitMq, то в нем возможны только
# очереди типа Quorum.
useQuorumQueues: {{ 'true' if iot.swarm.enabled else 'false' }}
captcha:
# Список инстансов капчи (Libre CAPTCHA, Zero Storage Captcha)
instances: {{ captcha_instances | join(', ') }}
proportions: {{ captcha_proportions | join(', ') }}
level: "{{ iot.authorization.captchaLevel }}"
hazelcast:
instanceName: "{{ iot.hazelcast.instanceName }}"
clusterName: "{{ iot.hazelcast.clusterName }}"
clientNetworking:
# Пример: "127.0.0.1:5701, 127.0.0.1:5702"
addresses: "hazelcast:5701"
rpc:
rabbit:
authReceiveAndReply:
name: {{ iot.authorization.rabbit.authReceiveAndReply.name }}
core:
voice:
rabbit:
fromPlatform:
name: {{ iot.authorization.rabbit.voiceAuthDataQueues.toAuthServer.name }}
toPlatform:
name: {{ iot.authorization.rabbit.voiceAuthDataQueues.fromAuthServer.name }}
events:
rabbit:
queue:
name: {{ iot.core.rabbit.events.queue.name }}
wsproxy:
manager:
replicaCheckPeriod: 5s
replicaDeadPeriod: 15s
connectAliveWaitPeriod: 15s
rabbit:
queue:
# Идентификатор очереди для отправки сообщений из прокси в платформу.
platform: {{ iot.wsproxy.rabbit.queue.platform }}
exchange:
# Идентификатор топик-коллектора.
proxy: {{ iot.wsproxy.rabbit.exchange.proxy }}
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.wsproxy.rabbit.platformConsumers.count }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.wsproxy.rabbit.platformConsumers.maxCount }}
notification:
rabbitmq:
exchange: {{ iot.authorization.rabbit.notification.exchange }}
envelopeRoutingKey: {{ iot.authorization.rabbit.notification.envelopeRoutingKey }}
userEventRoutingKey: {{ iot.authorization.rabbit.notification.userEventRoutingKey }}
db:
uri: "{{ mongodb_uri }}"
authorization:
database: "{{ iot.authorization.db.name }}"
# Используется для миграции, переносящей авторизационные сущности из БД core в БД authorization server
core:
database: "{{ iot.core.db.name }}"
spring:
security:
oauth2:
# Время жизни access-токена, должно быть не менее 5 сек.
# Также нужно учесть, что authorization server добавляет запас времени 60 секунд до того, как токен будет считаться
# просроченным. Т.о. итоговое время жизни токена: accessTokenTimeToLive + 60 сек.
accessTokenTimeToLive: 1h
registration-parameters:
apple:
keyId: "{{ iot.authorization.clientRegistrations.apple.keyId }}"
keyFile: "/etc/eltex-sc/apple-credentials/AuthKey_{keyId}.p8"
teamId: "{{ iot.authorization.clientRegistrations.apple.teamId }}"
yandex:
avatarUrl: "https://avatars.yandex.net/get-yapic/{avatarId}/islands-50"
client-parameters:
web-client:
type: WEB
password: password
clientAuthenticationMethod: client_secret_basic
authorizationGrantTypes:
- authorization_code
- password
- refresh_token
{% if iot.web.httpsPort != 443 %}
redirectUri: "https://{{ iot.serverName }}:{{ iot.web.httpsPort }}/ng/login"
{% else %}
redirectUri: "https://{{ iot.serverName }}/ng/login"
{% endif %}
allowAdminLogin: true
allowRevokeAll: true
integration: false
android-client:
type: ANDROID
password: password
clientAuthenticationMethod: client_secret_basic
authorizationGrantTypes:
- authorization_code
- password
- refresh_token
redirectUri: "https://eltex.iot.app/authorization"
allowRevokeAll: true
integration: false
ios-client:
type: IOS
password: password
clientAuthenticationMethod: client_secret_basic
authorizationGrantTypes:
- authorization_code
- password
- refresh_token
scopes:
- read
- write
- trust
redirectUri: "https://eltex.iot.app/authorization"
allowRevokeAll: true
integration: false
{% if iot.authorization.skills.yandex.enabled %}
{{ iot.authorization.skills.yandex.clientId }}:
type: YANDEX
password: "{{ iot.authorization.skills.yandex.password }}"
clientAuthenticationMethod: client_secret_post
authorizationGrantTypes:
- authorization_code
- refresh_token
redirectUri: "https://social.yandex.net/broker/redirect"
integration: true
{% endif %}
{% if iot.authorization.skills.sber.enabled %}
{{ iot.authorization.skills.sber.clientId }}:
type: SBER
password: "{{ iot.authorization.skills.sber.password }}"
clientAuthenticationMethod: client_secret_post
authorizationGrantTypes:
- authorization_code
- refresh_token
redirectUri: "https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward"
integration: true
{% endif %}
{% if iot.authorization.skills.marusya.enabled %}
{{ iot.authorization.skills.marusya.clientId }}:
type: MARUSYA
password: "{{ iot.authorization.skills.marusya.password }}"
clientAuthenticationMethod: client_secret_post
authorizationGrantTypes:
- authorization_code
- refresh_token
redirectUri: "https://vc.go.mail.ru/smarthouse/{{ iot.authorization.skills.marusya.appId }}/callback"
integration: true
{% endif %}
{% if iot.authorization.selfRegistration.allowSocialNetworks %}
client:
provider:
{% if iot.authorization.clientRegistrations.microsoft.enable %}
microsoft:
authorization-uri: "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?response_mode=form_post"
token-uri: "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
jwk-set-uri: "https://login.microsoftonline.com/consumers/discovery/v2.0/keys"
user-info-uri: "https://graph.microsoft.com/oidc/userinfo"
user-info-authentication-method: "header"
user-name-attribute: "sub"
{% endif %}
{% if iot.authorization.clientRegistrations.apple.enable %}
apple:
authorization-uri: "https://appleid.apple.com/auth/authorize?response_mode=form_post"
token-uri: "https://appleid.apple.com/auth/token"
jwk-set-uri: "https://appleid.apple.com/auth/keys"
issuer-uri: "https://appleid.apple.com"
user-info-uri: "not_provided"
user-name-attribute: "sub"
{% endif %}
{% if iot.authorization.clientRegistrations.yandex.enable %}
yandex:
authorization-uri: "https://oauth.yandex.ru/authorize"
token-uri: "https://oauth.yandex.ru/token"
user-info-uri: "https://login.yandex.ru/info"
user-info-authentication-method: "header"
user-name-attribute: "id"
{% endif %}
{% if iot.authorization.clientRegistrations.vk.enable %}
vk:
authorization-uri: "https://oauth.vk.ru/authorize"
token-uri: "https://oauth.vk.ru/access_token"
user-info-uri: "https://api.vk.ru/method/users.get?v=5.131&fields=bdate,photo_50"
user-info-authentication-method: "header"
user-name-attribute: "id"
{% endif %}
{% if iot.authorization.clientRegistrations.mailRu.enable %}
mail-ru:
authorization-uri: "https://oauth.mail.ru/login"
token-uri: "https://oauth.mail.ru/token"
user-info-uri: "https://oauth.mail.ru/userinfo"
user-info-authentication-method: "query"
user-name-attribute: "id"
{% endif %}
registration:
{% if iot.authorization.clientRegistrations.google.enable %}
google:
client-id: "{{ iot.authorization.clientRegistrations.google.clientId }}"
client-secret: "{{ iot.authorization.clientRegistrations.google.clientSecret }}"
{% endif %}
{% if iot.authorization.clientRegistrations.microsoft.enable %}
microsoft:
provider: microsoft
client-name: Microsoft
client-id: "{{ iot.authorization.clientRegistrations.microsoft.clientId }}"
client-secret: "{{ iot.authorization.clientRegistrations.microsoft.clientSecret }}"
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/v1/{action}/oauth2/code/{registrationId}"
scope:
- openid
- profile
- email
{% endif %}
{% if iot.authorization.clientRegistrations.apple.enable %}
apple:
provider: apple
client-name: Apple
client-id: "{{ iot.authorization.clientRegistrations.apple.clientId }}"
client-secret: "autogenerated"
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/v1/{action}/oauth2/code/{registrationId}"
scope:
- openid
- name
- email
{% endif %}
{% if iot.authorization.clientRegistrations.yandex.enable %}
yandex:
provider: yandex
client-name: Yandex
client-id: "{{ iot.authorization.clientRegistrations.yandex.clientId }}"
client-secret: "{{ iot.authorization.clientRegistrations.yandex.clientSecret }}"
client-authentication-method: client_secret_basic
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/v1/{action}/oauth2/code/{registrationId}"
scope:
- login:avatar
- login:birthday
- login:email
- login:info
- login:default_phone
{% endif %}
{% if iot.authorization.clientRegistrations.vk.enable %}
vk:
provider: vk
client-name: VK
client-id: "{{ iot.authorization.clientRegistrations.vk.clientId }}"
client-secret: "{{ iot.authorization.clientRegistrations.vk.clientSecret }}"
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/v1/{action}/oauth2/code/{registrationId}"
scope:
- email
- phone_number
{% endif %}
{% if iot.authorization.clientRegistrations.mailRu.enable %}
mail-ru:
provider: mail-ru
client-name: Mail.ru
client-id: "{{ iot.authorization.clientRegistrations.mailRu.clientId }}"
client-secret: "{{ iot.authorization.clientRegistrations.mailRu.clientSecret }}"
client-authentication-method: client_secret_basic
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/v1/{action}/oauth2/code/{registrationId}"
scope:
- userinfo
{% endif %}
{% endif %}
mail:
host: "{{ 'false' if iot.useNotification else iot.mail.smtp.host }}"
port: {{ iot.mail.smtp.port }}
username: "{{ iot.mail.smtp.submitter }}"
password: "{{ iot.mail.smtp.password }}"
properties:
mail:
from: "{{ iot.mail.smtp.submitter }}"
personal: "{{ iot.mail.smtp.senderPrefix }}"
smtp:
auth: true
{% if iot.mail.smtp.protection == "starttls" %}
starttls:
enable: true
required: true
{% elif iot.mail.smtp.protection == "ssl" %}
ssl:
enable: true
{% endif %}
rabbitmq:
host: rabbitmq
port: 5672
springdoc:
swagger-ui:
# Включение и отключение swagger.
enabled: {{ 'true' if iot.authorization.swagger.enable else 'false' }}
logging:
config: "{{ iot.logbackConfig }}"
logback:
dir: "/var/log/elis"
{% if elk.enable %}
logstash:
host: "{{ elk.serverName }}"
port: {{ elk.logstash.port.map }}
{% endif %}
level:
root: {{ iot.authorization.logLevel }}
org.springframework: WARN
org.springframework.cache: WARN
org.springframework.data: WARN
org.springframework.web: WARN
_org.springframework.web: WARN
org.springframework.security: WARN
org.springframework.security.oauth2: WARN
org.springdoc: WARN
org.mongodb: WARN
org.apache.http: WARN
org.thymeleaf: WARN
io.swagger: WARN
io.mongock: INFO
io.micrometer: WARN
com.hazelcast: WARN
server:
replication:
enabled: {{ 'true' if iot.swarm.enabled else 'false' }}
# Доменное имя сервера, на котором развернута платформа
name: "{{ iot.serverName }}"
# Дефолтный язык отображения событий и сообщений
language: "ru"
port: {{ iot.core.port.map }}
ssl:
port: {{ iot.core.port.ssl.map }}
key: "/etc/ssl/private/eltex-sc-api.key"
crt: "/etc/ssl/certs/eltex-sc-api.crt"
ui:
# Доменное имя сервера, на котором развернут UI (WEB)
name: "{{ iot.serverName }}"
# Порты UI нужны для формирования на платформе ссылок, которые пользователь сможет открыть через UI.
port: {{ iot.web.httpPort }}
ssl:
port: {{ iot.web.httpsPort }}
controllerGate:
port: {{ iot.core.ctlGate.port }}
tcp:
port: {{ iot.core.ctlGate.tcpPort }}
ssl:
port: {{ iot.core.ctlGate.sslPort }}
key: "/etc/ssl/private/eltex-sc-ctl-gate.key"
crt: "/etc/ssl/certs/eltex-sc-ctl-gate.crt"
# Параметры для формирования ссылок к UI(WEB) и API
links:
# Использовать схему https:// при формировании ссылок к UI
useHttpsForUi: {{ 'true' if iot.web.useHttpsByDefault else 'false' }}
# Использовать схему https:// при формировании ссылок к API
useHttpsForApi: {{ 'true' if iot.core.links.useHttpsForApi else 'false' }}
# Использовать схему https:// при формировании ссылок на фото с камер
useHttpsForCameraLinks: {{ 'true' if iot.core.links.useHttpsForCameraLinks else 'false' }}
# Использовать схему https:// при загрузке превью с камеры
useHttpsForCameraPreviewUpload: {{ 'true' if iot.core.links.useHttpsForCameraPreviewUpload else 'false' }}
# Использовать ui.name вместо server.name и ui.port/ui.ssl.port вместо port/ssl.port
# при формировании ссылок к API
useUiProxyForApi: {{ 'true' if iot.core.links.useUiProxyForApi else 'false' }}
# Ссылка на политику конфиденциальности
privacyPolicyUrl: "{{ iot.privacyPolicyUrl }}"
# Ссылка на базу знаний
knowledgeBaseUrl: "{{ iot.knowledgeBaseUrl }}"
# Конфигурация jetty
jetty:
# Время простоя соединения
connection-idle-timeout: 2m
max-http-form-post-size: 200000B
# Конфигурация потоков
threads:
acceptors: -1
selectors: -1
# Время простоя потока
idle-timeout: 2m
# Минимальное количество потоков
min: 32
# Максимальное количество потоков
max: 256
# Максимальный размер очереди задач для потоков
max-queue-capacity: 32768
services:
# Параметры внутренних сервисов (компонентов) платформы.
internal:
firmware:
batch:
maxPoolSize: 2
corePoolSize: 1
# Параметры ежедневной очистки БД от завершенных и отмененных планировщиков обновлений прошивки и связанных
# Batch-задач.
cleanup:
enabled: true
# Промежуток времени с момента начала задачи, после которого задача считается подлежащей удалению.
removeAfter: 180d
# Время ожидания обновления одного устройства
updateTimeOut:
mqttDevice: 10m
zwayDevice: 2h
mqttHubDevice: 10m
controller:
delayAnswerFromControl: 12s
numberOfPingThreads: 1
zway:
logStringsLimit: 50
# Таймаут, по достижении которого выставляется статус "DISCONNECTED" zway контроллеру
offlineTimeout: 5m
device:
# Время, которое мы ждем ответа об успешном удалении девайса, если ответа не поступило
# генерируем timeout сообщение.
removeTimeout: 30s
deviceRequests:
countAttempt: 3
diskUsage:
warnThreshold: {{ iot.diskUsage.warnThreshold }}
criticalThreshold: {{ iot.diskUsage.criticalThreshold }}
# Настройки охраны.
guard:
# Время, которое дается на включение FLIRS устройств (ждем подтверждение от контроллера),
# при постановке на охрану.
deviceRequestDelay: {{ iot.core.guard.deviceRequestDelay }}
# Время, которое прибавляется ко времени задержки на очистку охранного кэша при постановке/снятия с охраны,
# на случай если охрана не завершила процесс постановки/снятия.
# Время задержки формируется как количество охранных устройств умноженное на deviceRequestDelay.
clearContextExtraCacheDelay: {{ iot.core.guard.clearContextExtraCacheDelay }}
# Настройки ИК-пульта.
irc:
# Время ожидания ИК команды от пользователя
recTimeout: {{ iot.core.irc.recTimeout }}
# Таймаут записи команды (отсутствия фронтов)
cmdTimeout: {{ iot.core.irc.cmdTimeout }}
meterDevice:
enabled: false
meterInfo:
enabled: false
metrics:
refresh:
cron: "0 0 3 * * ?"
mqttZwayModule:
enabled: false
scriptEngine:
# Предельное количество выполнений скрипта за период времени scriptTimeLimit.
# Если запуски скрипта происходят чаще чем executionNumberLimit раз в интервал времени scriptTimeLimit,
# то скрипт останавливается.
frequentScript:
executionNumberLimit: 60
scriptTimeLimit: 1m
# Предельное количество выполнений скриптов одного дома за период времени scriptTimeLimit.
# Если запуски скриптов происходят чаще чем executionNumberLimit раз в интервал времени scriptTimeLimit,
# то все скрипты дома останавливаются.
frequentScriptsInHouse:
executionNumberLimit: 120
scriptTimeLimit: 2m
# Локальные сценарии, которые работают на хабе.
localScripts:
# Время, через которое в случае неуспеха статус синхронизации локальных скриптов с хабом перейдет
# в состояние FAILED
syncStatusFailedTimeLimit: 10m
sshDeviceModule:
enabled: false
support:
entityLimits:
# Максимальное количество открытых за последние 30 дней тикетов у одного пользователя
maxNumberOfOpenTickets: 30
# Максимальное количество сообщений допустимое для обычного пользователя в чате конкретного тикета
maxNumberOfMessagesPerDay: 1000
# Количество дней, через которое закрытый тикет будет удален. Используется время последнего обновления тикета.
numberOfDaysForTicketExpired: 365d
fileLimits:
# Максимально допустимое количество и суммарный размер файлов (Мегабайт) логов прикладываемых с UI к тикету
maxNumberOfUiLogFilesLinkToTicket: 2
maxSizeOfUiLogFilesLinkToTicket: 10
# Максимально допустимое количество и суммарный размер файлов (Мегабайт) приложенных пользователем к тикету
maxNumberOfAttachedFilesLinkToTicket: 15
maxSizeOfAttachedFilesLinkToTicket: 15
# Максимально допустимое количество и суммарный размер файлов (Мегабайт) приложенных пользователем к сообщению
maxNumberOfAttachedFilesLinkToMessage: 1
maxSizeOfAttachedFilesLinkToMessage: 10
# Максимальный размер файлов (Мегабайт) приложенных в чате. Наиболее старые файлы будут удалены в ходе ротации.
maxSizeForFilesAttachedToChat: 20
# Количество дней после которого будут удалены все приложенные к сообщениям чата файлы.
# Используется время последнего обновления тикета.
numberOfDaysForExpiredAttachmentsInChat: 7d
# мониторинг пропертей устройств - счетчик их использования. по умолчанию - выключен
monitoring:
propertyKind:
enabled: false
# параметры связанные с тарифами подписками и МОФ (Механизм Ограничения Функционала)
tariffication:
tariff:
eventCron: "0 0 0 * * ?"
subscription:
checkingCron: "0 0 2 * * ?"
orders:
# Максимальное одномоментное количество неоплаченных заказов.
maxConcurrentUnpaidOrders: 5
mof:
customRestrictions:
# Длительность блокировки для обработки списка новых кастомных ограничений по одному пользователю
handleRestrictionsLockTimeout: 1m
# параметры видеонаблюдения
video:
cameraMotion:
noMotionDuration: 1m
motionDetectionCooldown: 30s
cameraScreenshot:
waitTime: 5s
maxNumberPerCamera: 100
cameraPreview:
# Время в течении которого превью с камеры считается актуальным и не перезапрашивается
updateInterval: 1m
cameraLinecross:
# Продолжительность записи по событию пересечения линии
recordingDuration: 30s
# Гарантированная доставка запросов
guaranteedDelivery:
enabled: true
# Задержка между повторами попыток отправки
retryDelay: 5s
# Параметры для подключения к внешним сервисам, а также параметры внутренних сервисов (компонентов) платформы,
# обеспечивающих работу с внешними сервисами.
external:
rabbitmq:
# Нужно ли сохранять сообщения на диск
persistent: "{{ iot.rabbitmq.persistence.enabled or iot.swarm.enabled }}"
# Должен ли сервис использовать тип очередей Quorum. Если развернут кластер RabbitMq, то в нем возможны только
# очереди типа Quorum.
useQuorumQueues: {{ 'true' if iot.swarm.enabled else 'false' }}
hazelcast:
instanceName: "{{ iot.hazelcast.instanceName }}"
clusterName: "{{ iot.hazelcast.clusterName }}"
clientNetworking:
# Пример: "127.0.0.1:5701, 127.0.0.1:5702"
addresses: "hazelcast:5701"
helper:
# Максимально время удержания блокировки в секундах, для процесса
# добавления/обновления данных в мапе.
maxLockTime:
# В качестве ключа имя мапы в таком же виде, как и в HazelcastMapName.
EXAMPLE_KEY: 10
# Время в секундах, по истечению которого, сущность будет удалена из мапы.
ttl:
# В качестве ключа имя мапы в таком же виде, как и в HazelcastMapName.
EXAMPLE_KEY: 600
# Ограничение на частоту синхронизаций устройств в рамках одного хаба.
lock:
mqttHub:
devices:
syncRateLimit: 1h
mjollnir:
url: "{{ iot.core.mjollnir.url }}"
login: "platform"
password: "platform"
minio:
endpoint: "{{ iot.minio.external.url if iot.minio.external.enable else 'http://minio:9000' }}"
access-key: "{{ iot.minio.external.accessKey if iot.minio.external.enable else 'minioadmin' }}"
secret-key: "{{ iot.minio.external.secretKey if iot.minio.external.enable else 'minioadmin' }}"
bucket: iot
critical-bucket: critical-iot
mqttBroker:
enabled: {{ 'true' if iot.core.broker.enable else 'false' }}
# Хост MQTT брокера, используется платформой
host: "{{ iot.broker.external.host if iot.broker.external.enable else 'broker' }}"
# Порт MQTT брокера, используется платформой для связи по протоколу MQTT
port: 8883
# Порт на котором у брокера поднимается REST API, используется платформой
apiPort: 8083
# Внешний URL по которому доступен MQTT брокер, передаётся MQTT клиентам
remoteAccessURL: "{{ iot.broker.external.host if iot.broker.external.enable else iot.serverName }}:{{ iot.broker.external.port.map }}"
# Таймаут, по достижении которого выставляется статус "Offline" mqtt устройствам
offlineTimeout: 5m
{% if not iot.swarm.enabled and iot.core.broker.useShareSubscriptions %}
shareName: "iotcore"
{% endif %}
threadPools:
main:
size: {{ iot.core.broker.threadPools.main.size }}
# В каком режиме работать с брокером.
# true - реплицированный режим через rabbitmq.
# false - нереплицированный через mqtt5client.
replication:
enabled: false
rabbit:
exchange:
broker: "mqtt-broker-exchange"
queue:
platform: "mqtt-broker-platform-queue"
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.core.broker.threadPools.main.size }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.core.broker.threadPools.main.size }}
olapservice:
enabled: {{ 'true' if iot.core.olapservice.enable else 'false' }}
host: "{{ iot.olapservice.external.host if iot.olapservice.external.enable else 'http://olapservice' }}"
port: 8023
rabbit:
exchange: "{{ iot.olapservice.rabbit.exchange.events }}"
routingKey: "{{ iot.olapservice.rabbit.routingKey.save }}"
# Максимальное количество сообщений в пачке на отправку в Olapservice через RabbitMQ.
batchSize: "{{ iot.olapservice.rabbit.core.batchSize }}"
# Максимальный размер пачки в байтах. При превышении этого значения отправляется неполный пакет.
bufferLimit: "{{ iot.olapservice.rabbit.core.bufferLimit }}"
# Время, по истечении которого отправляется неполная пачка. Таймер сбрасывается, если новые сообщения
# добавляются в пачку.
timeout: "{{ iot.olapservice.rabbit.core.batchTimeout }}"
proxy:
enabled: false
host: ""
port: 8050
push:
disable: "{{ iot.useNotification }}"
firebase:
enabled: "{{ 'false' if iot.useNotification else iot.push.firebase.enabled }}"
# Период между отправкой пушей, для достижения ограничения частоты отправки пушей.
delayPushTime: 250ms
apns:
enabled: "{{ 'false' if iot.useNotification else iot.push.apns.enabled }}"
hms:
enabled: "{{ 'false' if iot.useNotification else iot.push.hms.enabled }}"
antispam:
# Если пользователь получил последнее пуш-уведомление такого же содержания в течении указанного времени,
# пуш не отправится.
duplicateDelay: 0
# Если пользователь получил последнее пуш-уведомление такого же типа в течении указанного времени,
# пуш не отправится.
antispamTime: 0
skills:
# Параметры навыка Яндекс для интеграции с Умным домом (Алисой)
# https://yandex.ru/dev/dialogs/smart-home/doc/concepts/about.html
yandex:
enabled: {{ "true" if iot.authorization.skills.yandex.enabled else "false" }}
{% if iot.authorization.skills.yandex.enabled %}
# Id навыка, который необходимо указывать при отправке уведомлений (отображается в карточке навыка)
id: "{{ iot.authorization.skills.yandex.skillId }}"
# Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
clientId: "{{ iot.authorization.skills.yandex.clientId }}"
# Ссылка на API сервиса уведомлений Яндекса
callbackUri: "https://dialogs.yandex.net/api/v1/skills"
# OAuth-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку навыка)
oauthToken: "{{ iot.authorization.skills.yandex.oauthToken }}"
{% endif %}
# Параметры проекта умного дома Сбера для интеграции с Салютом
# https://developers.sber.ru/docs/ru/smarthome/overview
sber:
enabled: {{ "true" if iot.authorization.skills.sber.enabled else "false" }}
{% if iot.authorization.skills.sber.enabled %}
# Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
clientId: "{{ iot.authorization.skills.sber.clientId }}"
# Ссылка на API сервиса уведомлений Сбера
callbackUri: "https://partners.iot.sberdevices.ru"
# Bearer-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку проекта)
bearerToken: "{{ iot.authorization.skills.sber.bearerToken }}"
{% endif %}
# Параметры проекта умного дома Mail.ru для интеграции с Марусей
# https://help.mail.ru/marusia/smart_home
marusya:
enabled: {{ "true" if iot.authorization.skills.marusya.enabled else "false" }}
{% if iot.authorization.skills.marusya.enabled %}
# Id приложения, который необходимо указывать при отправке уведомлений (отображается в карточке приложения)
id: "{{ iot.authorization.skills.marusya.appId }}"
# Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
clientId: "{{ iot.authorization.skills.marusya.clientId }}"
# Ссылка на API сервиса уведомлений Маруси
callbackUri: "https://vc.go.mail.ru/smarthouse/events/yandex"
# OAuth-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку приложения)
oauthToken: "{{ iot.authorization.skills.marusya.oauthToken }}"
{% endif %}
slgate:
# Список инстансов slgate, через запятую
instances: {{ iot.core.slgate.instances | join(', ') }}
# Параметры клиентского сертификата, используемого для авторизованного подключения к slgate
clientKeyStoreParams:
# Нужно ли использовать клиентский сертификат
enable: {{ 'true' if slgate.proxy.useClientCert else 'false' }}
# Путь до файла с форматом PKCS12, содержащего клиентский сертификат
path: "/etc/ssl/private/slgate_client.p12"
# Пароль от клиентского сертификата (.p12)
password: "{{ slgate.proxy.clientCertPassword }}"
# Максимальное количество попыток пересоздать конфиг туннеля через slgate при его невалидности.
attemptsToRecreateTunnelConfig: 3
# Игнорировать ошибки при проверке сертификата сервера (полезно при работе с самоподписанными сертификатами)
ignoreServerCertCheck: {{ 'true' if iot.core.slgate.ignoreServerCertCheck else 'false' }}
video:
flussonic:
# Адрес Flussonic'а
url: "{{ iot.core.video.flussonic.url }}"
# Ключ для авторизации запросов
apiKey: "{{ iot.core.video.flussonic.apiKey }}"
# Идентификатор платформы flussonic (30620).
operatorId: "{{ iot.core.video.flussonic.operatorId }}"
# Логин администратора в платформе flussonic watcher.
adminLogin: "{{ iot.core.video.flussonic.adminLogin }}"
motion:
enabled: {{ 'true' if iot.core.video.flussonic.motion.enabled else 'false' }}
evi:
# Адрес EVI Cloud
url: "{{ iot.core.video.evi.url }}"
# Ключ для авторизации запросов
apiKey: "{{ iot.core.video.evi.apiKey }}"
# Логин администратора в платформе EVI Cloud.
adminLogin: "{{ iot.core.video.evi.adminLogin }}"
# Запас по времени для motionDelay, гарантирующий обнаружение ключевого кадра в буфере.
motionDelayTimeReserve: 5s
# Игнорировать ошибки при проверке сертификата сервера (полезно при работе с самоподписанными сертификатами)
ignoreServerCertCheck: {{ 'true' if iot.core.video.evi.ignoreServerCertCheck else 'false' }}
# Api-key для валидации ивентов со стороны EVI Cloud перед его обработкой
eventApiKey: "{{ iot.core.video.evi.eventApiKey }}"
clipMaxDuration:
timeout: 180s
# Параметры WebRTC, которые необходимы камере для формирования своих ICE-кандидатов.
webrtc:
# Параметры STUN-сервера.
stun:
# URL STUN-серверов.
urls:
{% for stun_url in iot.core.video.webrtc.stun.urls %}
- "{{ stun_url }}"
{% endfor %}
# Параметры TURN-сервера.
turn:
# Параметры TURN:SFU
sfu:
# Принудительное включение
force: {{ 'true' if iot.core.video.webrtc.turn.sfu.force else 'false' }}
# Таймаут на ожидание ивента от EVI о начале webrtc-сессии между камерой и TURN:SFU
eventTimeout: {{ iot.core.video.webrtc.turn.sfu.eventTimeout }}
# Параметры P2P
p2p:
# Таймаут на ожидание SDP-answer от камеры
sdpAnswerTimeout: {{ iot.core.video.webrtc.p2p.sdpAnswerTimeout }}
# Время ожидания проверки камерой типа своего NAT
checkCameraNatTypeTimeout: {{ iot.core.video.webrtc.checkCameraNatTypeTimeout }}
# Время выполнения ping к host candidate клиента
pingHostCandidateTimeout: {{ iot.core.video.webrtc.pingHostCandidateTimeout }}
auth:
host: "{{ 'authorization' if iot.authorization.enable else iot.authorization.external.host }}"
port: {{ iot.authorization.port.map }}
rabbit:
eventQueue:
name: {{ iot.core.rabbit.events.queue.name }}
voiceAuthDataQueues:
# Очередь для отправки сообщений с платформы на сервер авторизации
toAuthServer:
name: {{ iot.authorization.rabbit.voiceAuthDataQueues.toAuthServer.name }}
# Очередь для отправки сообщений с сервера авторизации на платформу
fromAuthServer:
name: {{ iot.authorization.rabbit.voiceAuthDataQueues.fromAuthServer.name }}
authReceiveAndReply:
name: {{ iot.authorization.rabbit.authReceiveAndReply.name }}
timeout: {{ iot.authorization.rabbit.authReceiveAndReply.timeout }}
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.authorization.rabbit.platformConsumers.count }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.authorization.rabbit.platformConsumers.maxCount }}
guard:
rabbit:
queue:
coreReceive: {{ iot.guard.rabbit.queue.coreReceive }}
coreReceiveAndReply: {{ iot.guard.rabbit.queue.coreReceiveAndReply }}
guardReceive: {{ iot.guard.rabbit.queue.guardReceive }}
guardReceiveAndReply: {{ iot.guard.rabbit.queue.guardReceiveAndReply }}
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.guard.rabbit.consumers.count }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.guard.rabbit.consumers.maxCount }}
replyTimeout: {{ iot.guard.rabbit.replyTimeout }}
wsproxy:
rabbit:
exchange:
# Идентификатор топик-коллектора.
proxy: {{ iot.wsproxy.rabbit.exchange.proxy }}
zwayproxy:
manager:
replicaCheckPeriod: 5s
replicaDeadPeriod: 15s
connectAliveWaitPeriod: 15s
rabbit:
queue:
# Идентификатор очереди для отправки сообщений из прокси в платформу.
platform: {{ iot.zwayproxy.rabbit.queue.platform }}
exchange:
# Идентификатор топик-коллектора.
proxy: {{ iot.zwayproxy.rabbit.exchange.proxy }}
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.zwayproxy.rabbit.platformConsumers.count }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.zwayproxy.rabbit.platformConsumers.maxCount }}
notification:
rabbitmq:
exchange: {{ iot.core.rabbit.notification.exchange }}
envelopeRoutingKey: {{ iot.core.rabbit.notification.envelopeRoutingKey }}
userEventRoutingKey: {{ iot.core.rabbit.notification.userEventRoutingKey }}
consumersCount: {{ iot.core.rabbit.notification.count }}
maxConsumersCount: {{ iot.core.rabbit.notification.maxCount }}
payment:
enabled: {{ 'true' if iot.payment.enable else 'false' }}
rabbit:
queue:
# Идентификатор очереди для отправки сообщений из платформы в микросервис платежей, далее это сообщение
# обработает рандомно один из микросервисов платежей.
paymentReceive: "{{ iot.payment.rabbit.queue.paymentReceive }}"
# Идентификатор очереди для отправки сообщения и синхронного получения ответа от микросервиса платежей.
# Для ответа платформа автоматически создает автоудаляемую временную очередь.
paymentReceiveAndReply: "{{ iot.payment.rabbit.queue.paymentReceiveAndReply }}"
# Время ожидания синхронного ответа от PaymentServer на сообщение, отправленное в очередь
# paymentReceiveAndReply
paymentReceiveAndReplyQueueTimeOut: "{{ iot.payment.rabbit.queue.paymentReceiveAndReplyQueueTimeOut }}"
# Идентификатор очереди для получения сообщений от микросервиса платежей.
platformReceive: "{{ iot.payment.rabbit.queue.platformReceive }}"
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: {{ iot.payment.rabbit.consumers.coreCount }}
# Максимальное количество одновременных консьюмеров очереди.
maxCount: {{ iot.payment.rabbit.consumers.coreMaxCount }}
# Сервис управления голосом Cloud ASR https://intdocs.eltex.loc/pages/viewpage.action?pageId=125740527
voice:
# Адрес Cloud ASR, для подключения платформы.
host: {{ iot.core.voice.host }}
port: {{ iot.core.voice.port }}
# Ключ по которому Cloud ASR будет отправлять запрос на генерацию новой пары токенов для колонки.
# TODO будет удален в рамках #397994
apiKey: {{ iot.core.voice.apiKey }}
# Параметры клиентского сертификата, используемого для авторизованного подключения платформы к Cloud ASR.
clientKeyStoreParams:
# Включить передачу клиентского сертификата. Следует отключать только в тестовой среде,
# т.к. это является частью авторизации платформы в Cloud ASR.
enable: {{ iot.core.voice.clientKeyStoreParams.enable }}
# Путь до файла с форматом PKCS12 (*.p12), содержащего клиентский сертификат.
path: {{ iot.core.voice.clientKeyStoreParams.path }}
# Пароль от клиентского сертификата (*.p12).
password: {{ iot.core.voice.clientKeyStoreParams.password }}
# Игнорировать ошибки при проверке сертификата сервера (полезно при работе с самоподписанными сертификатами)
ignoreServerCertCheck: {{ 'true' if iot.core.voice.ignoreServerCertCheck else 'false' }}
awaiters:
mqttHub:
# Таймаут для mqtt команд, отправленных через controllers топики
controllers:
requestTimeout: 20s
# Таймаут для mqtt команд, отправленных через devices топики
devices:
# Время, которое мы ожидаем для ответа от хаба, чтобы узнать, добавлено ли это устройство.
requestTimeout: 20s
# Таймаут для mqtt команд, отправленных через ir топики
ir:
requestTimeout: 20s
healthcheck:
# Время ожидания ответа для healthcheck хаба.
requestTimeout: 5s
triggers:
rabbit:
oneTime:
# Идентификатор коллектора для отправки отложенных сообщений платформы самой себе.
exchange: platform-triggers-oneTime-exchange
# Идентификатор очереди для отправки отложенных сообщений платформы самой себе.
queue: platform-triggers-oneTime-queue
broadcast:
# Идентификатор коллектора для отправки отложенных сообщений платформы самой себе в broadcast-режиме.
exchange: platform-triggers-broadcast-exchange
# Идентификатор очереди для отправки отложенных сообщений платформы самой себе в broadcast-режиме.
queue: platform-triggers-broadcast-queue
consumers:
# Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount.
count: 1
# Максимальное количество одновременных консьюмеров очереди.
maxCount: 1
mqttDevices:
# Таймаут от создания MQTT устройства со статусом "VIRTUAL" до его перехода в статус "ONLINE",
# в конце хендшейка платформы с устройством через брокер. По истечении таймаута устройство будет удалено.
virtualStatusTimeout: 10m
# Таймаут от начала регистрации MQTT камеры на EVI Cloud до ее успешного добавления на EVI Cloud и платформу.
# При превышении таймаута камера будет удалена.
cameraInitializationOnEviTimeout: 10m
# Таймаут от отправки команды на MQTT-устройство с ожиданием синхронного ответа.
requestTimeout: 20s
localPlatform:
# Таймаут от отключения всех мобильных websocket сессий до переведения туннеля локальной платформы в sleep
mobileWebsocketOfflineTimeout: 10m
# Таймаут от создания окружения (дом, контроллер, параметры локальной платформы) для локальной платформы,
# до добавления устройства
initializationTimeout: 10m
mqttHub:
devices:
# Таймаут для девайсов, добавляющихся через MQTT Hub по протоколу MQTT-Link.
# После получения топика н создания устройства в статусе "INITIALIZING" запускается таймер.
# Если в течении заданного времени не придет mqtt топик для добавления девайса в статусе "ONLINE", то устройство
# удалится из БД.
# При успешном получении топика для добавления девайса, триггер отменяется.
initializingStatusTimeout: 10m
db:
uri: "{{ mongodb_uri }}"
# Основная база данных iot-core
core:
database: "{{ iot.core.db.name }}"
authorization:
database: "{{ iot.authorization.db.name }}"
#todo Удалить блок в #225317
file:
database: "{{ iot.core.db.deprecated.fs.name }}"
#todo Удалить блок в #225317
license:
database: "{{ iot.core.db.deprecated.licenses.name }}"
#todo Удалить блок в #225317
eventLog:
database: "{{ iot.core.db.deprecated.events.name }}"
spring:
mail:
host: "{{ 'false' if iot.useNotification else iot.mail.smtp.host }}"
port: {{ iot.mail.smtp.port }}
username: "{{ iot.mail.smtp.submitter }}"
password: "{{ iot.mail.smtp.password }}"
properties:
mail:
from: "{{ iot.mail.smtp.submitter }}"
personal: "{{ iot.mail.smtp.senderPrefix }}"
smtp:
auth: true
{% if iot.mail.smtp.protection == "starttls" %}
starttls:
enable: true
required: true
{% elif iot.mail.smtp.protection == "ssl" %}
ssl:
enable: true
{% endif %}
kafka:
enabled: false
producer:
bootstrap-servers: "localhost:9092"
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
rabbitmq:
host: rabbitmq
port: 5672
springdoc:
swagger-ui:
# Включение и отключение swagger.
enabled: {{ 'true' if iot.core.swagger.enable else 'false' }}
# При вводе корректного key - открываются скрытые пункты в swagger.
key: ""
logging:
config: "{{ iot.logbackConfig }}"
logback:
dir: "/var/log/eltex-sc"
{% if elk.enable %}
logstash:
host: "{{ elk.serverName }}"
port: {{ elk.logstash.port.map }}
{% endif %}
level:
root: {{ iot.core.logLevel }}
org.springframework: WARN
org.springframework.cache: WARN
org.springframework.data: WARN
org.springframework.web: WARN
_org.springframework.web: WARN
org.springframework.security: WARN
org.springframework.security.oauth2: WARN
org.springdoc: WARN
org.mongodb: WARN
org.eclipse.jetty: WARN
org.apache.http: WARN
org.hibernate: WARN
org.jboss: WARN
org.quartz.core.QuartzSchedulerThread: WARN
org.thymeleaf: WARN
io.swagger: WARN
io.github.resilience4j: WARN
io.netty: WARN
io.mongock: INFO
io.micrometer: WARN
com.hazelcast: WARN
com.hivemq: WARN
services:
# -------------------------------------------------------- Db --------------------------------------------------------
{% if not iot.mongodb.external.enable %}
mongodb:
image: "{{ docker_services_map.mongodb.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.mongodb.replication.label }} == yes
healthcheck:
test: ["CMD", "{{ mongosh }}", "--eval", "'db.runCommand(\"ping\").ok'", "--quiet"]
interval: 30s
timeout: 10s
retries: 5
start_period: 20s
environment:
- TZ={{ timezone.stdout }}
- DISK_USAGE_THRESHOLD_WARN={{ iot.diskUsage.warnThreshold }}
- DISK_USAGE_THRESHOLD_CRITICAL={{ iot.diskUsage.criticalThreshold }}
volumes:
- "{{ install_dir }}/mongodb/data/db:/data/db/"
- "{{ install_dir }}/mongodb/mongobackups:/var/backups/mongobackups"
- "{{ install_dir }}/mongodb/dictionaries:/var/dictionaries"
{% if iot.mongodb.port.export %}
ports:
- {{ iot.mongodb.port.map }}:27017
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.mongodb
{% endif %}
{% endif %}
# ------------------------------------------------------ Minio ------------------------------------------------------
{% if not iot.minio.external.enable %}
minio:
image: "{{ docker_services_map.minio.image }}"
{% set iot_minio_hostname = 'minio'~('{{.Task.Slot}}' if ( groups['minio'] | length ) > 1 else '') %}
hostname: {{ iot_minio_hostname }}
deploy:
replicas: {{ groups['minio'] | length }}
placement:
constraints:
- node.labels.{{ iot.minio.replication.label }} == yes
max_replicas_per_node: 1
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]
interval: 30s
timeout: 20s
retries: 3
command:
{% set iot_minio_ellipsis = ('{1...' ~ (groups['minio'] | length) ~ '}' if (groups['minio'] | length) > 1 else '') %}
- server
- -quiet
- --anonymous
- --json
{% if (groups['minio'] | length) > 1 %}
- http://minio{{ iot_minio_ellipsis }}:9000/data
{% else %}
- /data
{% endif %}
environment:
- TZ={{ timezone.stdout }}
- DISK_USAGE_THRESHOLD_WARN={{ iot.diskUsage.warnThreshold }}
- DISK_USAGE_THRESHOLD_CRITICAL={{ iot.diskUsage.criticalThreshold }}
- MINIO_PROMETHEUS_AUTH_TYPE=public
{% if iot.minio.root.user is defined %}
- MINIO_ROOT_USER={{ iot.minio.root.user }}
{% endif %}
{% if iot.minio.root.pass is defined %}
- MINIO_ROOT_PASSWORD={{ iot.minio.root.pass }}
{% endif %}
{% if iot.minio.console.port is defined %}
- MINIO_CONSOLE_ADDRESS=:{{ iot.minio.console.port }}
{% endif %}
{% if minio_predefined_buckets is defined %}
- PREDEFINED_BUCKETS={{ minio_predefined_buckets }}
{% endif %}
{% if minio_backup_buckets is defined %}
- BACKUP_BUCKETS={{ minio_backup_buckets }}
{% endif %}
{% if iot.minio.port.export or iot.minio.console.port is defined %}
ports:
{% if iot.minio.port.export %}
- {{ iot.minio.port.map }}:9000
{% endif %}
{% if iot.minio.console.port is defined %}
- {{ iot.minio.console.port }}:{{ iot.minio.console.port }}
{% endif %}
{% endif %}
volumes:
- "{{ minio_install_dir }}/data:/data"
- "{{ minio_install_dir }}/miniobackups:/var/backups/miniobackups"
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.minio
{% endif %}
{% endif %}
{% include "templates/iot/docker-swarm/include/rabbitmq.yml.j2" %}
# ----------------------------------------------------- Hazelcast ----------------------------------------------------
hazelcast:
image: "{{ docker_services_map.hazelcast.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.hazelcast.replication.label }} == yes
environment:
- HZ_CLUSTERNAME={{ iot.hazelcast.clusterName }}
- HZ_INSTANCENAME={{ iot.hazelcast.instanceName }}
{% if iot.hazelcast.external.port.export %}
ports:
- {{ iot.hazelcast.external.port.map }}:5701
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.hazelcast
{% endif %}
# -------------------------------------------------- Clickhouse --------------------------------------------------------
{% if not iot.olapservice.external.enable %}
clickhouse:
image: "{{ docker_services_map.clickhouse.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.clickhouse.replication.label }} == yes
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8123/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 20s
environment:
- TZ={{ timezone.stdout }}
- EVENT_LOG_DB_NAME={{ iot.clickhouse.db.name }}
- DISK_USAGE_THRESHOLD_WARN={{ iot.diskUsage.warnThreshold }}
- DISK_USAGE_THRESHOLD_CRITICAL={{ iot.diskUsage.criticalThreshold }}
volumes:
- "{{ install_dir }}/olapdb/conf/config.d/system_log_config.xml:/etc/clickhouse-server/config.d/system_log_config.xml"
- "{{ install_dir }}/olapdb/conf/users.d/:/etc/clickhouse-server/users.d/"
- "{{ install_dir }}/olapdb/data/:/var/lib/clickhouse/"
- "{{ install_dir }}/olapdb/clickhouse-backup/config/config.yml:/etc/clickhouse-backup/config.yml"
- "{{ install_dir }}/olapdb/clickhouse-backup/archives:/var/lib/clickhouse/archives"
- "{{ install_dir }}/olapdb/var/log/clickhouse-server:/var/log/clickhouse-server"
{% if iot.clickhouse.port.export %}
ports:
- {{ iot.clickhouse.port.map }}:8123
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.clickhouse
{% endif %}
{% endif %}
# ----------------------------------------------------- Captcha -----------------------------------------------------
{% if iot.captcha.enable %}
captcha:
image: "{{ docker_services_map.captcha.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.captcha.replication.label }} == yes
environment:
- TZ={{ timezone.stdout }}
volumes:
- "{{ install_dir }}/captcha/data:/lc-core/data"
{% if iot.captcha.port.export %}
ports:
- {{ iot.captcha.port.map }}:8088
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.captcha
{% endif %}
{% endif %}
# ----------------------------------------------------- ZS-Captcha -----------------------------------------------------
{% if iot.zscaptcha.enable %}
zs-captcha:
image: "{{ docker_services_map.zs-captcha.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.zscaptcha.replication.label }} == yes
environment:
- TZ={{ timezone.stdout }}
- CAPTCHA_CASE_SENSITIVE={{ 'true' if iot.zscaptcha.caseSensitive else 'false' }}
volumes:
- "{{ install_dir }}/captcha/data:/data"
{% if iot.zscaptcha.port.export %}
ports:
- {{ iot.zscaptcha.port.map }}:8089
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.zscaptcha
{% endif %}
{% endif %}
# ------------------------------------------------------ Broker ------------------------------------------------------
{% if not iot.broker.external.enable %}
broker:
image: "{{ docker_services_map.broker.image }}"
labels:
ru.eltex-co.image.title: iot-mqtt-broker
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: mqtt-broker
ru.eltex-co.metrics.path: /actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.broker.internal.port.map }}
deploy:
replicas: {{ groups['mqtt_broker'] | length }}
placement:
constraints:
- node.labels.{{ iot.broker.replication.label }} == yes
max_replicas_per_node: 1
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8083/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- JAVA_TOOL_OPTIONS=-Xms256m -Xmx{{ iot.broker.limits.heap }} {{ "" if not iot.broker.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.broker.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.broker.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.broker.jconsole.host }}
- TZ={{ timezone.stdout }}
- IOT_MQTTBROKER_API_PORT=8083
- IOT_MQTTBROKER_DISK_USAGE_THRESHOLD_WARN={{ iot.diskUsage.warnThreshold }}
- IOT_MQTTBROKER_DISK_USAGE_THRESHOLD_CRITICAL={{ iot.diskUsage.criticalThreshold }}
- IOT_MQTTBROKER_METRICS_TOPIC_COUNTER_ENABLED={{ iot.broker.metrics.topicCounterEnabled }}
- IOT_MQTT_BROKER_USE_RABBIT_MQ=false
- IOT_MQTT_BROKER_USE_QUORUM_QUEUES=true
- IOT_MQTT_BROKER_REPLICA_NAME={{ '{{' }}.Task.Slot{{ '}}' }}
- IOT_MQTT_BROKER_QUEUE_NAME=mqtt-broker-queue-{{ '{{' }}.Task.Slot{{ '}}' }}
- HIVEMQ_ROOT_FOLDER={{ iot.broker.hivemq.rootFolder }}
- SPRING_RABBITMQ_HOST=rabbitmq
- SPRING_DATA_MONGODB_URI={{ mongodb_uri }}
- SPRING_DATA_MONGODB_DATABASE={{ iot.broker.db.name }}
- HAZELCAST_INSTANCE_NAME={{ iot.hazelcast.instanceName }}
- HAZELCAST_CLUSTER_NAME={{ iot.hazelcast.clusterName }}
- HAZELCAST_HOST=hazelcast
- HAZELCAST_PORT=5701
- LOGGING_CONFIG={{ iot.logbackConfig }}
- LOGGING_LOGBACK_DIR=/var/log/broker
- LOGGING_LEVEL_ROOT={{ iot.broker.logLevel }}
- LOGGING_LEVEL_HIVEMQ={{ iot.broker.logLevel }}
ports:
- {{ iot.broker.external.port.map }}:8883
{% if iot.broker.internal.port.export %}
- {{ iot.broker.internal.port.map }}:8083
{% endif %}
{% if iot.broker.jconsole.enable %}
- "{{ iot.broker.jconsole.port }}:{{ iot.broker.jconsole.port }}"
{% endif %}
volumes:
- "{{ broker_install_dir }}/mqtt/hivemq/:/hivemq/"
- "{{ broker_install_dir }}/mqtt/var/log/broker:/var/log/broker"
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.mqttbroker
{% endif %}
{% endif %}
# --------------------------------------------------- OlapService ---------------------------------------------------
{% if not iot.olapservice.external.enable %}
olapservice:
image: "{{ docker_services_map.olapservice.image }}"
labels:
ru.eltex-co.image.title: iot-olapservice
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: olapservice
ru.eltex-co.metrics.path: /actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.olapservice.port.map }}
deploy:
replicas: {{ iot.olapservice.replication.replicaCount }}
placement:
constraints:
- node.labels.{{ iot.olapservice.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
- clickhouse:8123:60
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8023/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 20s
environment:
- TZ={{ timezone.stdout }}
- SERVER_PORT=8023
- SERVICES_DISKUSAGE_WARNTHRESHOLD={{ iot.diskUsage.warnThreshold }}
- SERVICES_DISKUSAGE_CRITICALTHRESHOLD={{ iot.diskUsage.criticalThreshold }}
- LOGGING_CONFIG={{ iot.logbackConfig }}
- LOGGING_LOGBACK_DIR=/var/log/olapservice
- LOGGING_LEVEL_ROOT={{ iot.olapservice.logLevel }}
- LOGGING_LEVEL_ORG_JOOQ={{ iot.olapservice.logLevel }}
- CLICKHOUSE_URL=jdbc:clickhouse://clickhouse:8123
- CLICKHOUSE_DBNAME={{ iot.clickhouse.db.name }}
- CLICKHOUSE_USERNAME=iot
- CLICKHOUSE_PASSWORD=0d3c27fc-0e5e-4bd5-ab10-5037631f4c42
- CLICKHOUSE_SSL=false
- CLICKHOUSE_COMPRESS=false
- CLICKHOUSE_CONNECTION_TIMEOUT=5000
- SPRING_RABBITMQ_HOST=rabbitmq
- SPRING_RABBITMQ_PORT=5672
- SPRING_RABBITMQ_USEQUORUMQUEUES=true
- SPRING_RABBITMQ_EXCHANGE={{ iot.olapservice.rabbit.exchange.events }}
- SPRING_RABBITMQ_ENVELOPEQUEUE={{ iot.olapservice.rabbit.queue.save }}
- SPRING_RABBITMQ_ROUTINGKEY={{ iot.olapservice.rabbit.routingKey.save }}
- SPRING_RABBITMQ_CONSUMERS_PREFETCHCOUNT={{ iot.olapservice.rabbit.olapservice.prefetchCount }}
- SPRING_RABBITMQ_CONSUMERS_BATCHSIZE={{ iot.olapservice.rabbit.olapservice.batchSize }}
- SPRING_RABBITMQ_CONSUMERS_BATCHRECEIVETIMEOUT={{ iot.olapservice.rabbit.olapservice.batchReceiveTimeout }}
- SPRING_RABBITMQ_CONSUMERS_COUNT={{ iot.olapservice.rabbit.olapservice.consumersCount }}
- SPRING_RABBITMQ_CONSUMERS_MAXCOUNT={{ iot.olapservice.rabbit.olapservice.consumersMaxCount }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.olapservice.limits.heap }}
{% if iot.olapservice.port.export %}
ports:
- {{ iot.olapservice.port.map }}:8023
{% endif %}
volumes:
- "{{ olapservice_install_dir }}/olapservice/var/log/olapservice:/var/log/olapservice"
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.olapservice
{% endif %}
{% endif %}
# ---------------------------------------------------- ZwayProxy ----------------------------------------------------
{% if not iot.zwayproxy.external.enable %}
zwayproxy:
image: "{{ docker_services_map.zwayproxy.image }}"
labels:
ru.eltex-co.image.title: iot-zwayproxy
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: zwayproxy
ru.eltex-co.metrics.path: /actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.zwayproxy.port.map }}
deploy:
replicas: {{ iot.zwayproxy.replication.replicaCount }}
placement:
constraints:
- node.labels.{{ iot.zwayproxy.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
- rabbitmq:5672:60
environment:
- spring.rabbitmq.host=rabbitmq
- zwayproxy.rabbit.useQuorumQueues=true
- zwayproxy.rabbit.queue.platform={{ iot.zwayproxy.rabbit.queue.platform }}
- zwayproxy.rabbit.queue.proxy=zway-proxy-{{ '{{' }}.Task.Slot{{ '}}' }}
- zwayproxy.rabbit.exchange.proxy={{ iot.zwayproxy.rabbit.exchange.proxy }}
- zwayproxy.rabbit.consumers.count={{ iot.zwayproxy.rabbit.proxyConsumers.count }}
- zwayproxy.rabbit.consumers.maxCount={{ iot.zwayproxy.rabbit.proxyConsumers.maxCount }}
- logging.level.root={{ iot.zwayproxy.logLevel }}
- logging.config={{ iot.logbackConfig }}
- logging.logback.dir=/var/log/elis/{{ '{{' }}.Task.Slot{{ '}}' }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.zwayproxy.limits.heap }}
volumes:
- "{{ zwayproxy_install_dir }}/zwayproxy/var/log/elis:/var/log/elis"
{% if iot.zwayproxy.port.export or iot.zwayproxy.sslPort.export %}
ports:
{% if iot.zwayproxy.port.export %}
- {{ iot.zwayproxy.port.map }}:8070
{% endif %}
{% if iot.zwayproxy.sslPort.export %}
- {{ iot.zwayproxy.sslPort.map }}:8072
{% endif %}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.zwayproxy
{% endif %}
{% endif %}
# ------------------------------------------------------ WSProxy ------------------------------------------------------
{% if not iot.wsproxy.external.enable %}
wsproxy:
image: "{{ docker_services_map.wsproxy.image }}"
labels:
ru.eltex-co.image.title: iot-wsproxy
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: wsproxy
ru.eltex-co.metrics.path: /api/v1/actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.wsproxy.port.map }}
deploy:
replicas: {{ iot.wsproxy.replication.replicaCount }}
placement:
constraints:
- node.labels.{{ iot.wsproxy.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
- rabbitmq:5672:60
environment:
- spring.rabbitmq.host=rabbitmq
- wsproxy.rabbit.useQuorumQueues=true
- wsproxy.rabbit.queue.platform={{ iot.wsproxy.rabbit.queue.platform }}
- wsproxy.rabbit.queue.proxy=ws-proxy-{{ '{{' }}.Task.Slot{{ '}}' }}
- wsproxy.rabbit.exchange.proxy={{ iot.wsproxy.rabbit.exchange.proxy }}
- wsproxy.rabbit.consumers.count={{ iot.wsproxy.rabbit.proxyConsumers.count }}
- wsproxy.rabbit.consumers.maxCount={{ iot.wsproxy.rabbit.proxyConsumers.maxCount }}
- logging.level.root={{ iot.wsproxy.logLevel }}
- logging.config={{ iot.logbackConfig }}
- logging.logback.dir=/var/log/elis/{{ '{{' }}.Task.Slot{{ '}}' }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.wsproxy.limits.heap }}
volumes:
- "{{ wsproxy_install_dir }}/wsproxy/var/log/elis:/var/log/elis"
{% if iot.wsproxy.port.export %}
ports:
- {{ iot.wsproxy.port.map }}:8075
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.wsproxy
{% endif %}
{% endif %}
# ------------------------------------------------ Authorization Server ----------------------------------------------
{% if iot.authorization.enable %}
authorization:
image: "{{ docker_services_map.authorization.image }}"
labels:
ru.eltex-co.image.title: iot-authorization-server
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: authorization-server
ru.eltex-co.metrics.path: /api/v1/actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.authorization.port.map }}
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.authorization.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
{% if iot.captcha.enable %}
- captcha:8088:60
{% endif %}
{% if iot.zscaptcha.enable %}
- zs-captcha:8089:60
{% endif %}
- hazelcast:5701:60
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:{{ iot.authorization.port.map }}/api/v1/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- TZ={{ timezone.stdout }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.authorization.limits.heap }} {{ "" if not iot.authorization.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.authorization.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.authorization.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.authorization.jconsole.host }}
volumes:
- "{{ install_dir }}/authorization/var/log/elis:/var/log/elis"
- "{{ install_dir }}/authorization/etc/elis:/etc/elis"
- "{{ install_dir }}/authorization/ssl/certs/authorization-server.crt:/etc/ssl/certs/authorization-server.crt"
- "{{ install_dir }}/authorization/ssl/private/authorization-server.key:/etc/ssl/private/authorization-server.key"
{% if iot.authorization.port.export or iot.authorization.port.ssl.export or iot.authorization.jconsole.enable %}
ports:
{% if iot.authorization.port.export %}
- {{ iot.authorization.port.map }}:{{ iot.authorization.port.map }}
{% endif %}
{% if iot.authorization.port.ssl.export %}
- {{ iot.authorization.port.ssl.map }}:{{ iot.authorization.port.ssl.map }}
{% endif %}
{% if iot.authorization.jconsole.enable %}
- {{ iot.authorization.jconsole.port }}:{{ iot.authorization.jconsole.port }}
{% endif %}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.authorization
{% endif %}
{% endif %}
# ------------------------------------------------------- Guard ------------------------------------------------------
{% if not iot.guard.external.enable %}
guard:
image: "{{ docker_services_map.guard.image }}"
labels:
ru.eltex-co.image.title: iot-guard
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: guard
ru.eltex-co.metrics.path: /api/v1/actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.guard.port.map }}
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.guard.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
- hazelcast:5701:60
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:{{ iot.guard.port.map }}/api/v1/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- TZ={{ timezone.stdout }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.guard.limits.heap }} {{ "" if not iot.guard.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.guard.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.guard.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.guard.jconsole.host }}
volumes:
- "{{ install_dir }}/guard/var/log/elis:/var/log/elis"
- "{{ install_dir }}/guard/etc/elis:/etc/elis"
- "{{ install_dir }}/guard/ssl/certs/guard.crt:/etc/ssl/certs/guard.crt"
- "{{ install_dir }}/guard/ssl/private/guard.key:/etc/ssl/private/guard.key"
{% if iot.guard.port.export or iot.guard.port.ssl.export or iot.guard.jconsole.enable %}
ports:
{% if iot.guard.port.export %}
- {{ iot.guard.port.map }}:{{ iot.guard.port.map }}
{% endif %}
{% if iot.guard.port.ssl.export %}
- {{ iot.guard.port.ssl.map }}:{{ iot.guard.port.ssl.map }}
{% endif %}
{% if iot.guard.jconsole.enable %}
- {{ iot.guard.jconsole.port }}:{{ iot.guard.jconsole.port }}
{% endif %}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.guard
{% endif %}
{% endif %}
{% if iot.payment.enable %}
# ------------------------------------------------------- Payment ------------------------------------------------------
payment:
image: "{{ docker_services_map.payment.image }}"
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.payment.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
- hazelcast:5701:60
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:{{ iot.payment.port.map }}/api/v1/common/ping" ]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- TZ={{ timezone.stdout }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.payment.limits.heap }} {{ "" if not iot.payment.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.payment.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.payment.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.payment.jconsole.host }}
volumes:
- "{{ install_dir }}/payment/etc/elis:/etc/elis"
- "{{ install_dir }}/payment/var/log/elis:/var/log/elis"
- "{{ install_dir }}/payment/ssl/certs/payment-server.crt:/etc/ssl/certs/payment-server.crt"
- "{{ install_dir }}/payment/ssl/private/payment-server.key:/etc/ssl/private/payment-server.key"
{% if iot.payment.port.export or iot.payment.port.ssl.export %}
ports:
{% if iot.payment.port.export %}
- {{ iot.payment.port.map }}:{{ iot.payment.port.map }}
{% endif %}
{% if iot.payment.port.ssl.export %}
- {{ iot.payment.port.ssl.map }}:{{ iot.payment.port.ssl.map }}
{% endif %}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.payment
{% endif %}
{% endif %}
{% if iot.notification.enable %}
# -------------------------------------------------- Notification ------------------------------------------------------
notification:
image: "{{ docker_services_map.notification.image }}"
labels:
ru.eltex-co.image.title: iot-notification
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: notification
ru.eltex-co.metrics.path: /actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.notification.port.map }}
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.notification.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
- hazelcast:5701:60
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:{{ iot.notification.port.map }}/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- TZ={{ timezone.stdout }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.notification.limits.heap }} {{ "" if not iot.notification.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.authorization.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.notification.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.notification.jconsole.host }}
- logging.logback.dir=/var/log/elis/{{ '{{' }}.Task.Slot{{ '}}' }}
volumes:
- "{{ install_dir }}/notification/var/log/elis:/var/log/elis"
- "{{ install_dir }}/notification/etc/elis:/etc/elis"
{% if iot.notification.vault.ssl.useTrustStore %}
- "{{ install_dir }}/notification/ssl/private/vault.jks:/etc/vault.jks"
{% endif %}
{% if iot.notification.port.export or iot.notification.jconsole.enable %}
ports:
{% if iot.notification.port.export %}
- {{ iot.notification.port.map }}:{{ iot.notification.port.map }}
{% endif %}
{% if iot.notification.jconsole.enable %}
- {{ iot.notification.jconsole.port }}:{{ iot.notification.jconsole.port }}
{% endif %}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.notification
{% endif %}
{% endif %}
{% if not iot.core.external.enable %}
# --------------------------------------------------------- Core -------------------------------------------------------
core:
image: "{{ docker_services_map.core.image }}"
labels:
ru.eltex-co.image.title: iot-core
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: core
ru.eltex-co.metrics.path: /api/v1/actuator/prometheus
ru.eltex-co.metrics.port: {{ iot.core.port.map }}
deploy:
replicas: {{ iot.core.replication.replicaCount }}
placement:
constraints:
- node.labels.{{ iot.core.replication.label }} == yes
entrypoint:
- /extras/app-starter.sh
{% if not iot.mongodb.external.enable %}
- mongodb:27017:60
{% endif %}
- rabbitmq:5672:60
{% if iot.authorization.enable %}
- authorization:{{ iot.authorization.port.ssl.map }}:60
{% endif %}
{% if not iot.broker.external.enable %}
- broker:8883:60
{% endif %}
{% if not iot.olapservice.external.enable %}
- olapservice:8023:60
{% endif %}
- hazelcast:5701:60
{% if not iot.minio.external.enable %}
- minio:9000:60
{% endif %}
{% if not iot.guard.external.enable %}
- guard:{{ iot.guard.port.map }}:60
{% endif %}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:{{ iot.core.port.map }}/api/v1/common/ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 3m
environment:
- TZ={{ timezone.stdout }}
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx{{ iot.core.limits.heap }} {{ "" if not iot.core.jconsole.enable else "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=" ~ iot.core.jconsole.port ~ " -Dcom.sun.management.jmxremote.rmi.port=" ~ iot.core.jconsole.port ~ " -Djava.rmi.server.hostname=" ~ iot.core.jconsole.host }}
- logging.logback.dir=/var/log/eltex-sc/{{ '{{' }}.Task.Slot{{ '}}' }}
volumes:
- "{{ core_install_dir }}/core/var/log/eltex-sc:/var/log/eltex-sc"
- "{{ core_install_dir }}/core/etc/eltex-sc:/etc/eltex-sc"
- "{{ core_install_dir }}/core/ssl/certs/eltex-sc-api.crt:/etc/ssl/certs/eltex-sc-api.crt"
- "{{ core_install_dir }}/core/ssl/private/eltex-sc-api.key:/etc/ssl/private/eltex-sc-api.key"
{% if slgate.proxy.useClientCert %}
- "{{ core_install_dir }}/core/ssl/private/slgate_client.p12:/etc/ssl/private/slgate_client.p12"
{% endif %}
{% if iot.core.voice.clientKeyStoreParams.enable %}
- "{{ core_install_dir }}/core/ssl/private/asr_client.p12:/etc/ssl/private/asr_client.p12"
{% endif %}
ports:
- {{ iot.core.ctlGate.tcpPort }}:{{ iot.core.ctlGate.tcpPort }}
- {{ iot.core.port.map }}:{{ iot.core.port.map }}
- {{ iot.core.port.ssl.map }}:{{ iot.core.port.ssl.map }}
{% if iot.core.jconsole.enable %}
- {{ iot.core.jconsole.port }}:{{ iot.core.jconsole.port }}
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.core
{% endif %}
{% endif %}
{% if iot.web.enable %}
# ---------------------------------------------------------- Web -------------------------------------------------------
web:
image: "{{ docker_services_map.web.image }}"
cap_add:
- NET_ADMIN
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.web.replication.label }} == yes
environment:
- ENABLE_CERTBOT={{ '1' if iot.web.certbot.enable else '0' }}
- ENABLE_FAIL2BAN={{ '1' if iot.web.fail2ban.enable else '0' }}
- SERVER_NAME={{ iot.serverName }}
- CERTBOT_EMAIL={{ iot.web.certbot.email }}
- HTTPS_PORT={{ iot.web.httpsPort }}
- TZ={{ timezone.stdout }}
volumes:
- "{{ install_dir }}/web/etc/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "{{ install_dir }}/web/etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf"
- "{{ install_dir }}/web/well-known:/usr/share/eltex-sc-web/www/.well-known"
{% if iot.web.certbot.enable %}
- "{{ install_dir }}/web/etc/letsencrypt:/etc/letsencrypt"
- "{{ install_dir }}/web/var/log/letsencrypt:/var/log/letsencrypt"
{% endif %}
- "{{ install_dir }}/web/ssl/certs/eltex-sc-web.crt:/etc/ssl/certs/eltex-sc-web.crt"
- "{{ install_dir }}/web/ssl/private/eltex-sc-web.key:/etc/ssl/private/eltex-sc-web.key"
{% include docker_compose_web_additional_volumes ignore missing %}
{% if iot.core.external.enable or not iot.authorization.enable or iot.guard.external.enable %}
extra_hosts:
{% if iot.core.external.enable %}
- core:host-gateway
{% endif %}
{% if not iot.authorization.enable %}
- authorization:host-gateway
{% endif %}
{% if iot.guard.external.enable %}
- guard:host-gateway
{% endif %}
{% endif %}
ports:
- {{ iot.web.httpPort }}:{{ iot.web.httpPort }}
- {{ iot.web.httpsPort }}:{{ iot.web.httpsPort }}
{% include docker_compose_web_additional_ports ignore missing %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.web
{% endif %}
{% endif %}
{% if iot.monitoring.mongodbExporter.enable %}
#-------------------------------------------------- Mongodb exporter ---------------------------------------------------
mongodbExporter:
image: "{{ docker_services_map.mongodbExporter.image }}"
labels:
ru.eltex-co.image.title: iot-mongodb-exporter
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: mongodb-exporter
ru.eltex-co.metrics.path: /metrics
ru.eltex-co.metrics.port: {{ iot.monitoring.mongodbExporter.port.map }}
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.monitoring.mongodbExporter.replication.label }} == yes
command:
- --no-mongodb.direct-connect
- --collect-all
- --discovering-mode
environment:
- MONGODB_URI={{ mongodb_uri }}
{% if iot.monitoring.mongodbExporter.port.export %}
ports:
- {{ iot.monitoring.mongodbExporter.port.map }}:9216
{% endif %}
{% if elk.enable %}
logging:
driver: "fluentd"
options:
fluentd-address: {{ elk.serverName }}:{{ elk.fluentBit.port.map }}
tag: iot.mongodbExporter
{% endif %}
{% endif %}
{% if iot.monitoring.nginxExporter.enable %}
#-------------------------------------------------- Nginx exporter -----------------------------------------------------
nginxExporter:
image: "{{ docker_services_map.nginxExporter.image }}"
labels:
ru.eltex-co.image.title: iot-nginx-exporter
ru.eltex-co.image.vendor: ELTEX
ru.eltex-co.metrics.job: nginx-exporter
ru.eltex-co.metrics.path: /metrics
ru.eltex-co.metrics.port: {{ iot.monitoring.nginxExporter.port.map }}
deploy:
replicas: 1
placement:
constraints:
- node.labels.{{ iot.monitoring.nginxExporter.replication.label }} == yes
environment:
- SCRAPE_URI=http://web:{{ iot.web.httpPort }}/nginx_status
- TELEMETRY_PATH=/metrics
- NGINX_RETRIES=10
{% if iot.monitoring.nginxExporter.port.export %}
ports:
- {{ iot.monitoring.nginxExporter.port.map }}:9113
{% endif %}
{% endif %}
# IoT server configuration
{% if iot.web.nginx.rateLimit.enable %}
limit_req_zone $binary_remote_addr zone=perip:10m rate=30r/m;
limit_req_zone $binary_remote_addr zone=api_perip:10m rate=60r/m;
{% endif %}
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:60m max_size=256m inactive=24h use_temp_path=off;
{% if iot.web.redirectHttpToHttps %}
server {
listen {{ iot.web.httpPort }};
server_name {{ iot.serverName }};
# use internal dnsmasq for resolving hostnames from /etc/hosts inside docker container
resolver 127.0.0.1 valid=10s;
location ~ ^/api/v1/(?:ctl/.+/zway/backup|files/download/.+) {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache STATIC;
proxy_cache_key "$request_method$host$request_uri";
proxy_ignore_headers Expires Cache-Control Set-Cookie Vary;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_valid 200 24h;
client_max_body_size 20M;
}
location / {
{% if iot.web.httpsPort != 443 %}
return 301 https://$host:{{ iot.web.httpsPort }}$request_uri;
{% else %}
return 301 https://$host$request_uri;
{% endif %}
}
}
{% endif %}
server {
{% if not iot.web.redirectHttpToHttps %}
listen {{ iot.web.httpPort }};
{% endif %}
listen {{ iot.web.httpsPort }} ssl;
{% include web_ssl_parameters %}
root /usr/share/eltex-sc-web/www/;
index index.html;
server_name {{ iot.serverName }};
# use internal dnsmasq for resolving hostnames from /etc/hosts inside docker container
resolver 127.0.0.1 valid=10s;
# use gzip compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript font/woff2;
location =/ {
rewrite ^(.+)$ /ko permanent;
}
location ~* "^/api/v1/files/download/\w{24}/(?:preview|\w{8}-\w{4}-\w{4}-\w{4}-\w{12}).jpg" {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 20M;
}
location /api/v1/actuator/prometheus {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 20M;
allow 172.16.0.0/12;
allow ***.***.***.***/24;
deny all;
}
location ~* ^/api/v1/files/download/.+ {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache STATIC;
proxy_cache_key "$request_method$host$request_uri";
proxy_ignore_headers Expires Cache-Control Set-Cookie Vary;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_valid 200 24h;
client_max_body_size 20M;
}
location /ko/ {
# kill browser cache for all html pages
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
try_files $uri $uri/ /ko/index.html;
}
location ~* (\.html|js/web-version\.js)$ {
# kill browser cache for all html pages
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
try_files $uri =404;
}
location ~ ^/(firebase-messaging-sw|js/firebase-app-compat|js/firebase-messaging-compat|js/ajv.min).js {
try_files /ko/$uri =404;
}
location /ko/js/conf.js {
set $apiAddress $scheme://$http_host;
set $apiAddressJs "localStorage.setItem('apiAddress', '$apiAddress/api/v1');";
set $wsAddressJs "localStorage.setItem('wsAddress', '$apiAddress/api/v1/stomp');";
default_type application/javascript;
return 200 "$apiAddressJs\n$wsAddressJs";
}
location /ng/assets/config.json {
set $apiAddress $scheme://$http_host;
set $api "\"api\": \"$apiAddress/api/v1\"";
set $ws "\"ws\": \"$apiAddress/api/v1/stomp\"";
set $apiEvi "\"api_evi\": \"$apiAddress/evi/vsaas/api/v2\"";
set $stunUrls "\"stunUrls\":[ \"{{ iot.core.video.webrtc.stun.urls | join('\\\", \\\"') }}\" ]";
default_type application/json;
return 200 "{ $api, $ws, $apiEvi, $stunUrls }";
}
location /ng/ {
# kill browser cache for all html pages
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
try_files $uri /ng/index.html;
}
location ~ ^/api/v1/(?:login|images|oauth2|captcha|emailChange|users/logins|user/deleteyourself|profiles|security/roles|password|registration) {
{% if iot.web.nginx.rateLimit.enable %}
limit_req zone=perip burst=20 nodelay;
{% endif %}
proxy_buffering off;
proxy_pass https://authorization-server:{{ iot.authorization.port.ssl.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 15M;
}
location /api/v1/sber {
proxy_buffering off;
proxy_pass https://core:{{ iot.core.port.ssl.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 15M;
}
# link websockets to ws-proxy
location /api/v1/stomp {
{% if not iot.wsproxy.external.enable %}
proxy_pass http://wsproxy:8075$request_uri;
{% else %}
proxy_pass http://{{ iot.wsproxy.external.host }}:{{ iot.wsproxy.external.port }}$request_uri;
{% endif %}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/v1/event_ws {
{% if not iot.wsproxy.external.enable %}
proxy_pass http://wsproxy:8075$request_uri;
{% else %}
proxy_pass http://{{ iot.wsproxy.external.host }}:{{ iot.wsproxy.external.port }}$request_uri;
{% endif %}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
{% if iot.core.video.evi.url != '' and iot.core.video.evi.apiKey != '' %}
#--------------------- Proxy auth for evi admin --------------------------------
location ~ ^/evi/(?<suffix>.*) {
auth_request /auth;
proxy_pass {{ iot.core.video.evi.url }}/$suffix?$args;
proxy_set_header X-Vsaas-Api-Key {{ iot.core.video.evi.apiKey }};
}
location = /auth {
if ($request_method = OPTIONS) {
return 200;
}
internal;
proxy_pass https://authorization-server:{{ iot.authorization.port.ssl.map }}/api/v1/authorization/verify?roleId=admin;
proxy_http_version 1.1;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
#-------------------------------------------------------------------------------
{% endif %}
# firmware files for rule upload
# TODO delete after http://red.eltex.loc/issues/352170
location /api/v1/firmware/rule/upload {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 256M;
}
# firmware files for direct upload
location /api/v1/files/upload {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 40M;
}
location /api {
{% if iot.web.nginx.rateLimit.enable %}
limit_req zone=api_perip burst=100 nodelay;
{% endif %}
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 20M;
}
location /stomp {
proxy_pass http://core:{{ iot.core.port.map }}$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location /.well-known/apple-app-site-association {
add_header Content-Type application/json;
default_type application/json;
try_files $uri /.well-known/apple-app-site-association.json;
}
location /.well-known/assetlinks.json {
add_header Content-Type application/json;
default_type application/json;
try_files $uri /.well-known/assetlinks.json;
}
location /nginx_status {
stub_status on;
access_log off;
allow 172.16.0.0/12;
allow ***.***.***.***/24;
deny all;
}
location /authorization-server/actuator/prometheus {
proxy_pass https://authorization-server:{{ iot.authorization.port.ssl.map }}/api/v1/actuator/prometheus;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 20M;
allow 172.16.0.0/12;
allow ***.***.***.***/24;
deny all;
}
location /broker/actuator/prometheus {
proxy_pass http://{{ iot.broker.external.host if iot.broker.external.enable else 'broker' }}:{{ iot.broker.internal.port.map }}/actuator/prometheus;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 20M;
allow 172.16.0.0/12;
allow ***.***.***.***/24;
deny all;
}
}
{% include web_additional_server_blocks ignore missing %}
Установка платформы
По завершении конфигурации платформы умного дома, необходимо произвести ее установку на сервер при помощи следующих команд:
cd /etc/ansible-iot/latest sudo ansible-playbook install_iot.yml
Пример вывода команд по установке платформы:
PLAY [Preparing a host for an MQTT-Broker] ************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/detect_logback_config.yml for localhost
TASK [Detect logback config for core] *****************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'logbackConfig', 'value': 'classpath:logback-prod.xml'})
TASK [Include external mongodb parameters] ************************************************************************************************************************************************************************
ok: [localhost]
TASK [Include registry hub.eltex-co.ru parameters] ****************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct ansible_become variable] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct install directory path for MQTT-Broker] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Check if need install MQTT-Broker] **************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone.yml for localhost
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone/systemd.yml for localhost
TASK [Get current timezone of host via systemd] *******************************************************************************************************************************************************************
changed: [localhost]
PLAY [Preparing a host for an OlapService] ************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/detect_logback_config.yml for localhost
TASK [Include registry hub.eltex-co.ru parameters] ****************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct ansible_become variable] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct install directory path for OlapService] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Check if need install OlapService] **************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone.yml for localhost
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone/systemd.yml for localhost
TASK [Get current timezone of host via systemd] *******************************************************************************************************************************************************************
changed: [localhost]
PLAY [Install IoT] ************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/detect_logback_config.yml for localhost
TASK [Include external mongodb parameters] ************************************************************************************************************************************************************************
ok: [localhost]
TASK [Include registry hub.eltex-co.ru parameters] ****************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct ansible_become variable] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Correct install directory path] *****************************************************************************************************************************************************************************
ok: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone.yml for localhost
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/get_timezone/systemd.yml for localhost
TASK [Get current timezone of host via systemd] *******************************************************************************************************************************************************************
changed: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/distros/Ubuntu.yml for localhost
TASK [Remove old versions of docker for Ubuntu 22.04] *************************************************************************************************************************************************************
ok: [localhost] => (item=docker-compose)
ok: [localhost] => (item=docker)
ok: [localhost] => (item=docker-engine)
ok: [localhost] => (item=docker.io)
ok: [localhost] => (item=containerd)
ok: [localhost] => (item=runc)
TASK [Install utils and components for Ubuntu 22.04] **************************************************************************************************************************************************************
ok: [localhost] => (item=ca-certificates)
ok: [localhost] => (item=curl)
ok: [localhost] => (item=gnupg)
ok: [localhost] => (item=lsb-release)
TASK [Get Ubuntu release codename] ********************************************************************************************************************************************************************************
changed: [localhost]
TASK [Add key for official docker repository to Ubuntu 22.04] *****************************************************************************************************************************************************
changed: [localhost]
TASK [Add official docker repository to Ubuntu 22.04] *************************************************************************************************************************************************************
changed: [localhost]
TASK [Install docker and components for Ubuntu 22.04] *************************************************************************************************************************************************************
ok: [localhost] => (item=docker-ce)
ok: [localhost] => (item=docker-ce-cli)
ok: [localhost] => (item=containerd.io)
ok: [localhost] => (item=docker-buildx-plugin)
ok: [localhost] => (item=docker-compose-plugin)
ok: [localhost] => (item=python3-cryptography)
ok: [localhost] => (item=python3-requests)
ok: [localhost] => (item=python3-docker)
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/enable_docker.yml for localhost
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/enable_docker/systemd.yml for localhost
TASK [Enable service docker via systemd] **************************************************************************************************************************************************************************
ok: [localhost]
TASK [Copy iot directory] *****************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Detect that need tear down all services] ********************************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/mongodb/data/db] ****************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/mongodb/mongobackups] ***********************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/mongodb/dictionaries] ***********************************************************************************************************************************************
changed: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/prepare_install_dir/broker.yml for localhost
TASK [Copy ./iot/mqtt/ directory to MQTT-Broker Host /storage/iot/mqtt/] ******************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/mqtt/hivemq/data] ***************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/mqtt/var/log/broker] ************************************************************************************************************************************************
changed: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/prepare_install_dir/olapservice.yml for localhost
TASK [Copy ./iot/olapdb/ directory to OlapService Host /storage/iot/olapdb/] **************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/olapdb/data] ********************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/olapdb/clickhouse-backup/archives] **********************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/olapdb/var/log/olapservice] *****************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/olapdb/var/log/clickhouse-server] ***********************************************************************************************************************************
changed: [localhost]
TASK [Append Libre Captcha parameters] ****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/captcha/data] *******************************************************************************************************************************************************
changed: [localhost]
TASK [Prepare captcha config.json] ********************************************************************************************************************************************************************************
changed: [localhost]
TASK [Remove captcha data] ****************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/wsproxy/var/log/elis] ***********************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/zwayproxy/var/log/elis] *********************************************************************************************************************************************
changed: [localhost]
TASK [Append Yandex skill] ****************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Append Sber skill] ******************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Append Marusya skill] ***************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/authorization/etc/elis] *********************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/authorization/var/lib/elis] *****************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/authorization/var/log/elis] *****************************************************************************************************************************************
changed: [localhost]
TASK [Generate api key for authorization server] ******************************************************************************************************************************************************************
ok: [localhost]
TASK [Prepare authorization-server.yml] ***************************************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/core/etc/eltex-sc] **************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/core/var/lib/eltex-sc] **********************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/core/var/log/eltex-sc] **********************************************************************************************************************************************
changed: [localhost]
TASK [Prepare core.yml] *******************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/web/etc/nginx] ******************************************************************************************************************************************************
changed: [localhost]
TASK [Prepare nginx.conf] *****************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/web/etc/nginx/conf.d] ***********************************************************************************************************************************************
changed: [localhost]
TASK [Prepare default.conf for web] *******************************************************************************************************************************************************************************
changed: [localhost]
TASK [Prepare docker-compose.yml] *********************************************************************************************************************************************************************************
changed: [localhost]
TASK [Remove old docker-compose.override.yml] *********************************************************************************************************************************************************************
ok: [localhost]
TASK [Prepare .env file for docker-compose] ***********************************************************************************************************************************************************************
changed: [localhost]
TASK [Check and create directory /storage/iot/web/etc/letsencrypt] ***********************************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate for authorization server] ***************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/generate_cert.yml for localhost
TASK [Check and create directory /storage/iot/ssl/private] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/certs] **********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/csr] ************************************************************************************************************************************************************
changed: [localhost]
TASK [Check that the authorization-server.key already exists] *****************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the authorization-server.crt already exists] *****************************************************************************************************************************************************
ok: [localhost]
TASK [Generate an OpenSSL private key authorization-server.key] ***************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate Signing Request with Subject information authorization-server.csr] **********************************************************************************************************
changed: [localhost]
TASK [Generate a Self Signed OpenSSL certificate authorization-server.crt] ****************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate for api] ********************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/generate_cert.yml for localhost
TASK [Check and create directory /storage/iot/ssl/private] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/certs] **********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/csr] ************************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-api.key already exists] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-api.crt already exists] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Generate an OpenSSL private key eltex-sc-api.key] ***********************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate Signing Request with Subject information eltex-sc-api.csr] ******************************************************************************************************************
changed: [localhost]
TASK [Generate a Self Signed OpenSSL certificate eltex-sc-api.crt] ************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate for zway controller] ********************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/generate_cert.yml for localhost
TASK [Check and create directory /storage/iot/ssl/private] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/certs] **********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/csr] ************************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-ctl-gate.key already exists] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-ctl-gate.crt already exists] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Generate an OpenSSL private key eltex-sc-ctl-gate.key] ******************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate Signing Request with Subject information eltex-sc-ctl-gate.csr] *************************************************************************************************************
changed: [localhost]
TASK [Generate a Self Signed OpenSSL certificate eltex-sc-ctl-gate.crt] *******************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate for web] ********************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/generate_cert.yml for localhost
TASK [Check and create directory /storage/iot/ssl/private] ********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/certs] **********************************************************************************************************************************************************
ok: [localhost]
TASK [Check and create directory /storage/iot/ssl/csr] ************************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-web.key already exists] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Check that the eltex-sc-web.crt already exists] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Generate an OpenSSL private key eltex-sc-web.key] ***********************************************************************************************************************************************************
changed: [localhost]
TASK [Generate an OpenSSL Certificate Signing Request with Subject information eltex-sc-web.csr] ******************************************************************************************************************
changed: [localhost]
TASK [Generate a Self Signed OpenSSL certificate eltex-sc-web.crt] ************************************************************************************************************************************************
changed: [localhost]
TASK [Create a iot network with options] **************************************************************************************************************************************************************************
changed: [localhost]
TASK [Tear down all services] *************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Install dictionaries to mongo] ******************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/dictionaries/install_dictionaries_for_external_mongodb.yml for localhost
TASK [Copy mongodb dictionaries] **********************************************************************************************************************************************************************************
changed: [localhost]
TASK [Install collections from dictionaries] **********************************************************************************************************************************************************************
changed: [localhost] => (item={'root': '/etc/ansible-iot/latest/dictionaries/', 'path': 'iot-core/irTemplate.bson', 'state': 'file', 'src': '/etc/ansible-iot/latest/dictionaries/iot-core/irTemplate.bson', 'uid': 0, 'gid': 0, 'owner': 'root', 'group': 'root', 'mode': '0664', 'size': 3342255, 'mtime': 1744352484.0, 'ctime': 1744778635.9637227})
TASK [Delete mongodb dictionaries] ********************************************************************************************************************************************************************************
changed: [localhost] => (item={'root': '/etc/ansible-iot/latest/dictionaries/', 'path': 'iot-core', 'state': 'directory', 'uid': 0, 'gid': 0, 'owner': 'root', 'group': 'root', 'mode': '0775', 'size': 4096, 'mtime': 1744352484.0, 'ctime': 1744778635.9637227})
TASK [Create and start services] **********************************************************************************************************************************************************************************
changed: [localhost]
TASK [include_tasks] **********************************************************************************************************************************************************************************************
included: /etc/ansible-iot/latest/include/docker_prune.yml for localhost
TASK [Prune unused images, containers and networks] ***************************************************************************************************************************************************************
changed: [localhost]
TASK [Prune unused volumes] ***************************************************************************************************************************************************************************************
changed: [localhost]
PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost : ok=125 changed=54 unreachable=0 failed=0 skipped=68 rescued=0 ignored=0
В выводе команды необходимо дождаться появления строки "PLAY RECAP" и убедиться, что параметры unreachable и failed на следующей строке равны нулю, что означает успешную установку платформы.
Если любой из этих параметров не равен нулю, то в процессе установки платформы произошла ошибка. В таком случае в выводе команды будет присутствовать задача, статус которой равен failed или unreachable. Изучение текста ошибки этой задачи поможет выявить причину проблемы и исправить её.
Проверка работоспособности
Обратите внимание, что платформа запущена в режиме docker-swarm
1. После успешной установки платформы, проверьте состояние контейнеров микросервисов платформы умного дома при помощи следующей команды:
sudo docker ps -a
Вывод данной команды должен иметь следующий вид:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae12df234c85 nexus.eltex.loc:9017/iot-web-mc:2.0.1 "/docker-entrypoint.…" 23 minutes ago Up 23 minutes 80/tcp swarm_iot_web.1.5jppy72lqxkn53ufumdui3drj iot-double-web 67d0d833c20e nexus.eltex.loc:9017/iot-core:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_core.1.vh2rpcf5uzvb3huv73suj43o2 0d2eeebbd9ff nexus.eltex.loc:9017/iot-captcha:2.0.1 "java -cp /app/resou…" 24 minutes ago Up 24 minutes swarm_iot_captcha.1.nspejakojoe3i9ai6puiqhcjz 0c685c0ac8cd nexus.eltex.loc:9017/iot-mqttbroker-mongo:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_broker.1.nnl6uzrwc6tpbycwjia05akga 9956e4fd2265 nexus.eltex.loc:9017/iot-zwayproxy:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes swarm_iot_zwayproxy.1.us7ud5x54avp42va5soywyugf e6e117258183 nexus.eltex.loc:9017/iot-rabbitmq:2.0.1 "docker-entrypoint.s…" 24 minutes ago Up 24 minutes (healthy) 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp swarm_iot_rabbitmq.1.jb3wd0xadc72wvdyqlvt8klbw 39c23f8e02c5 nexus.eltex.loc:9017/iot-guard:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_guard.1.z2ifopypjlcbitb7jk46tzwdr f3a26c16c5d7 nexus.eltex.loc:9017/iot-nginx-exporter:2.0.1 "/usr/bin/nginx-prom…" 24 minutes ago Up 24 minutes swarm_iot_nginxExporter.1.qni1shjrf5u2o89gxoltiv12o e2b97c0db652 nexus.eltex.loc:9017/iot-payment-server:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_payment.1.8tvr1gtzwkow8p8xvmvbq2m6e 334ab3745f48 nexus.eltex.loc:9017/iot-authorization-server:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_authorization.1.aq26lksi8xe977nmvoo1o3k6b 990534973f03 nexus.eltex.loc:9017/iot-notification:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes (healthy) swarm_iot_notification.1.kkjxv1qzl3acaudonp8n51yy4 c8600ac340b8 nexus.eltex.loc:9017/iot-mongo6:2.0.1 "/entrypoint.sh" 24 minutes ago Up 24 minutes (healthy) 27017/tcp swarm_iot_mongodb.1.ktyfdav1cg3z60b9tt31vbnfe 694fc8efba59 nexus.eltex.loc:9017/iot-hazelcast:2.0.1 "java --add-modules …" 24 minutes ago Up 24 minutes swarm_iot_hazelcast.1.t9f5hkx2qs208wcgjphcdg785 a8e946d55b8a nexus.eltex.loc:9017/iot-wsproxy:2.0.1 "/extras/app-starter…" 24 minutes ago Up 24 minutes swarm_iot_wsproxy.1.pf7e49kx8p824ftgsx1zcpzix 5ca0e19fd0a7 nexus.eltex.loc:9017/iot-mongodb-exporter:2.0.1 "/mongodb_exporter -…" 24 minutes ago Up 24 minutes 9216/tcp swarm_iot_mongodbExporter.1.v96vq0ojh1wbs7eair8qmbr3j 3887bc7e8622 nexus.eltex.loc:9017/iot-olapservice:2.0.1 "/extras/app-starter…" 4 minutes ago Up 4 minutes (healthy) swarm_iot_olapservice.1.8o91lhw19taqk03ywzto0jfjt 01376edc46f4 nexus.eltex.loc:9017/iot-minio:2.0.1 "/entrypoint.sh serv…" 4 minutes ago Up 4 minutes (healthy) swarm_iot_minio.1.oeqf9qp6q3nqf3jes93ghebd9 d7f04dd98bd9 nexus.eltex.loc:9017/iot-clickhouse-server:2.0.1 "/entrypoint.sh" 5 minutes ago Up 5 minutes (healthy) 8123/tcp, 9000/tcp, 9009/tcp swarm_iot_clickhouse.1.idq7yf43t0m2t3ozxyfajmgxc
Запуск всех контейнеров может занять от 2 до 10 минут, в зависимости от размера БД.
Необходимо убедиться, что все контейнеры имеют статус Up и не происходит их перезапуска (статус Restarting).
Если в строке статуса контейнера присутствует состояние здоровья (в скобках) то, также необходимо убедиться, что он равен healthy, либо health: starting.
В выводе команды должны присутствовать следующие контейнеры:
| Название контейнера | Ожидаемый статус |
|---|---|
iot-web-mc | Up |
iot-core | Up (healthy) |
iot-captcha | Up (healthy) |
iot-mqttbroker-mongo | Up |
iot-rabbitmq | Up |
iot-guard | Up (healthy) |
iot-nginx-exporter | Up |
iot-payment-server | Up |
iot-authorization-server | Up (healthy) |
iot-notification | Up (healthy) |
iot-mongo6 | Up (healthy) |
iot-hazelcast | Up |
iot-wsproxy | Up |
iot-mongodb-exporter | Up |
iot-olapservice | Up (healthy) |
iot-minio | Up (healthy) |
iot-clickhouse-server | Up (healthy) |
2. После успешного запуска всех контейнеров требуется проверить доступность API платформы умного дома при помощи следующей команды:
curl -w "\n" -k https://domain.name:port/api/v1/common/ping
где domain.name — доменное имя сервера платформы умного дома (файл vars/default.yml, параметр iot.serverName);
port — HTTPS-порт (файл vars/default.yml, параметр iot.web.httpsPort).
Вывод команды должен содержать одну строку со значением true, что означает доступность API платформы умного дома.
3. Проверьте доступность веб-интерфейса платформы умного дома по следующему адресу:
https://domain.name:port/
где domain.name — доменное имя сервера платформы умного дома (файл vars/default.yml, параметр iot.serverName);
port — HTTPS-порт (файл vars/default.yml, параметр iot.web.httpsPort).
4. Авторизуйтесь в веб-интерфейсе администратора платформы умного дома при помощи следующих учетных данных по умолчанию:
| Логин | admin |
|---|---|
| Пароль | Test18plat34Form |
В целях безопасности настоятельно рекомендуется сменить пароль учетной записи администратора.
- Нет меток