Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Версия ПО 1.26

Рекомендуемые характеристики сервера

Система Eltex SC строится по клиент-серверной архитектуре. Серверную часть рекомендуется устанавливать на многопроцессорный компьютер под управлением OS Ubuntu 20.

Производительность сервера зависит от числа пользователей, которые будут зарегистрированы на платформе.

Минимальные системные требования сервера*:

  • число аппаратных серверов — 1;
  • процессор — i5 3,0 ГГц;
  • оперативная память — 8 ГБ;
  • место на диске — 1000 ГБ;
  • производительность дискового массива (чтение/запись) — 2000 IOPS.

Минимально необходимая конфигурация для запуска ядра платформы с микросервисами.

Установка платформы Eltex SC

В инструкции описан процесс установки платформы Eltex SC версии 1.26 на операционную систему Ubuntu 20.04. Информацию по установке более ранних версий платформы Eltex SC (1.25 и ниже) можно найти по ссылке: Архив Eltex SC.


С версии 1.19.4 установка через deb-пакеты не осуществляется.

С версии 1.25 сервис eltex-notification-gw(ngw) не требует дополнительной настройки через файл notification.properties.j2. Все настройки вынесены в файл vars/default.yml

Установка Eltex SC на сервер, не отвечающий минимальным системным требованиям, может привести к неработоспособности платформы или увеличить время обработки запросов!

Перед развертыванием платформы необходимо установить систему Ansible и необходимые для ее работы компоненты. Ansible рекомендуется устанавливать из официального репозитория проекта.

Ansible — система управления конфигурациями, написанная на языке программирования Python с использованием декларативного языка разметки для описания конфигураций. Система используется для автоматизации настройки и развертывания программного обеспечения, в частности для ПО Eltex SC.


Для установки платформы выполните следующие шаги:

1. Установите Ansible на сервер Ubuntu 20.04. 

Пример установки через консоль:

Установка Ansible
apt update
apt install --install-recommends linux-generic-hwe-20.04-edge
apt install software-properties-common
add-apt-repository --yes --update ppa:ansible/ansible
apt install ansible


Более подробная информация по установке Ansible доступна по ссылке.


2. Выполните проверку версии (должна быть не ниже v2.9):

Проверка версии Ansible
ansible --version


3. После установки Ansible добавьте необходимые для ее работы коллекции.

Пример добавления коллекций:

Установка
ansible-galaxy collection install community.general
ansible-galaxy collection install community.crypto
ansible-galaxy collection install community.docker


4. Подготовьте конфигурацию.

Для получения файлов конфигурации обратитесь с запросом в Коммерческий отдел ЭЛТЕКС.
Файлы конфигурации будут направлены вам в виде архива tar.gz, который необходимо распаковать в директорию /etc с правами root.

Пример распаковки архива:

Распаковка архива с конфигурацией
tar -C /etc -xvf ansible-iot-1.26.tar.gz


После распаковки архива все пакеты и зависимости будут развернуты в директории на текущем сервере.

Файлы конфигурации и плейбуки (скрипты/конфигурации) Ansible будут расположены в директории /etc/ansible-iot-1.26


5. Отредактируйте файл /etc/ansible-iot-1.26/inventory

Откройте файл в любом доступном текстовом редакторе, например nano. Укажите пароль пользователя root в переменной ansible_sudo_pass:

Далее в примере для пользователя root используется пароль rootpasswd

При установке задайте свой пароль.

Пример задания пароля:

Содержимое файла inventory
[iot]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd
[elk]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd
[monitoring]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd


6. Далее необходимо настроить параметры доступа к платформе Eltex SC.

Для базовой установки достаточно отредактировать файл конфигурации /etc/ansible-iot-1.26/vars/default.yml 

Откройте файл в любом доступном текстовом редакторе, например nano. Укажите корректный IP-адрес или доменное имя для доступа к платформе в переменной server_name:  

Содержимое конфигурационного файла vars/default.yml
---
# Параметры установки платформы
iot:
  # Имя (IP-адрес) сервера, на котором будет производиться развертывание платформы IoT
  # Возможно использование 'localhost', если все манипуляции производятся локально
  #  ВАЖНО!!! В 'serverName' нужно прописывать то имя (IP-адрес), по которому будет доступна платформа
  # Если указать 'localhost', то платформа будет доступна только через 'localhost'
  serverName: "my.test.server"
  # Содержит путь до директории, в которую будет произведена установка
  installDir: /storage/iot

# Параметры установки сервисов логирования (Elasticsearch + Logstash + Kibana)
elk:
  # Нужно ли добавлять в платформу appender, отправляющий логи в logstash
  # В нем нет необходимости, если ELK не развернут или не настроен; это лишь спровоцирует сообщения
  # об ошибках отправки в логах платформы
  enable: false
  # Имя (IP-адрес) сервера, на котором будет развернут ELK
  # По умолчанию совпадает с 'iot.serverName', что предполагает установку рядом с платформой (на том же хосте)
  # В таком случае хосты в инвентаре в группах [iot] и [monitoring] должны совпадать
  serverName: "{{ iot.serverName }}"
  # Директория для установки системы логирования
  installDir: /storage/elk

# Параметры установки сервисов мониторинга (Prometheus + Grafana)
monitoring:
  # Имя (IP-адрес) сервера, на котором будет развернуты сервисы мониторинга (Prometheus + Grafana)
  # По умолчанию совпадает с 'iot.serverName', что предполагает установку рядом с платформой (на том же хосте)
  # В таком случае хосты в инвентаре в группах [iot] и [elk] должны совпадать
  serverName: "{{ iot.serverName }}"
  # Директория для установки системы мониторинга
  installDir: /storage/monitoring
Содержимое конфигурационного файла vars/default.yml
# Параметры MongoDB
mongodb:
  # Версия MongoDB. На старой аппаратной платформе, не поддерживающей оптимизацию, выставить значение `4`
  version: 5
  external:
    # Если выставлен в true, будет использоваться внешняя MongoDB
    # ВАЖНО!!! MongoDB должна быть настроена, а параметры подключения нужно указать в 'addr' и 'port'
    enable: false
    # Адрес внешней MongoDB
    addr: "{{ iot.serverName }}"
    # Порт внешней MongoDB
    port: 27017

# Параметры WEB
web:
  # Имя (IP-адрес) сервера, на котором будет развернут WEB
  # По умолчанию совпадает с 'iot.serverName', что предполагает установку рядом с платформой (на том же хосте)
  serverName: "{{ iot.serverName }}"
  # Порт HTTP, по которому будет осуществляться доступ в WEB
  httpPort: 80
  # Порт HTTPS, по которому будет осуществляться доступ в WEB
  httpsPort: 443
  # Автоматически перенаправлять запросы по порту HTTP на порт HTTPS
  redirectHttpToHttps: false
  certbot:
    # Использовать ли certbot для получения сертификатов Let's Encrypt
    enable: false
    # E-mail владельца домена. Необходим для подтверждения валидности домена при получении сертификата Let's Encrypt
    email: test@email.com

# Параметры сервера отправки e-mail (NGW)
mail:
  smtp:
    submitter: test@email.com
    password: "password"
    senderPrefix: "Сервер Eltex-SC"
    auth: "true"
    host: email.com
    port: 587

# Параметры платформы IoT core
core:
  # Уровень отладки внутри IoT Core
  logLevel: INFO

  # Порты платформы для подключения контроллеров Z-Way
  ctlGate:
    port: 8070
    tcpPort: 8069
    sslPort: 8072
Содержимое конфигурационного файла vars/default.yml
  # Порты API платформы
  api:
    port: 8071
    sslPort: 8073

  # Уровень сложности для CAPTCHA: easy, medium, hard
  captchaLevel: "easy"

  server:
    # Нужно ли использовать HTTPS при формировании ссылок к WEB ('true' по умолчанию, при этом будет использован порт,
    # указанный в 'web.httpsPort'). Если поставить в 'false', будет использован HTTP и порт, указанный в 'web.httpPort'
    useHttpsForUi: true
    # Нужно ли использовать HTTPS при формировании ссылок к ресурсам самой платформы (например, прошивки)
    useHttpsForApi: false
    # Нужно ли использовать HTTPS при формировании ссылок на фото с камер наблюдения
    useHttpsForCameraLinks: true
    # Нужно ли использовать 'web.serverName' вместо 'iot.serverName' и 'web.httpPort'/'web.httpsPort'
    # вместо 'core.api.port'/'core.api.sslPort' при формировании ссылок к API
    useUiProxyForApi: false

  # Параметры для управления доступностью саморегистрации
  selfRegistration:
    allow: true
    allowDemo: true

  # Параметры для работы с видеосерверами
  video:
    # Параметры Flussonic
    flussonic:
      url: ""
      apiKey: ""
      operatorId: ""
      adminLogin: ""
    # Параметры видеосервера eltex
    eltex_server:
      url: ""

  # Параметры навыка Яндекс для интеграции с Умным домом (Алисой). Отображаются в карточке навыка
  yandexSkill:
    # Параметры для Basic Authentication
    clientId: "YandexClientIdChangeMe"
    password: "PasswordChangeMe"
    # ID навыка, который необходимо указывать при отправке уведомлений
    skillId: ""
    # OAuth-токен, который необходимо указывать при отправке уведомлений
    oauthToken: ""
Содержимое конфигурационного файла vars/default.yml
  # Параметры проекта умного дома Сбера для интеграции с Салютом. Отображаются в карточке проекта
  sberSkill:
    # Параметры для Basic Authentication
    clientId: "SberClientIdChangeMe"
    password: "PasswordChangeMe"
    # Bearer-токен, который необходимо указывать при отправке уведомлений
    bearerToken: ""

  # Параметры проекта умного дома Mail.ru для интеграции с Марусей. Отображаются в карточке проекта/приложения
  marusyaSkill:
    # Параметры для Basic Authentication
    clientId: "MarusyaClientIdChangeMe"
    password: "PasswordChangeMe"
    # App ID, который был назначен приложению VK при создании
    appId: "MarusyaAppIdChangeMe"
    # OAuth-токен, который необходимо указывать при отправке уведомлений
    oauthToken: ""



Для функций самостоятельной регистрации, регистрации демонстрационных учетных записей, а также для процедуры восстановления пароля может потребоваться активация почтовых оповещений через e-mail. Для этого потребуется указать:

mail:

smtp:

submitter — учетная запись e-mail;

password — пароль от учетной записи e-mail;

auth — проверка подлинности smtp (включена по умолчанию);

senderPrefix — имя отправителя;

host — адрес smtp-сервера;

port — smtp-порт сервера.


Также в vars/service_parameters.yml задаются дополнительные параметры:

Содержимое конфигурационного файла /vars/service_parameters.yml
---
# Версия контейнеров
release: 1.26

# Имя репозитория docker registry, содержащего docker-образы для развертывания
registry: hub.eltex-co.ru

# Список сервисов для перезапуска (при запуске плейбуков restart_*.yml)
# Можно оставить пустым, а при запуске передавать параметром командной строки
Содержимое конфигурационного файла /vars/service_parameters.yml
services:

# Нужно ли выполнять подготовку дистрибутива к установке. Этот шаг полезен при "чистой" установке
# на только что созданный сервер. Если ранее уже была выполнена установка компонентов IoT через Ansible,
# то такая подготовка не требуется и этот шаг можно пропустить для экономии времени
withDistroPreparingStep: true

# Суффикс, добавляемый к имени каждого контейнера (помогает избежать конфликтов имен контейнеров)
containerNameSuffix: ""

# Суффикс, добавляемый к имени создаваемой сети docker (помогает избежать конфликтов имен сетей docker)
networkNameSuffix: ""

# Параметры сервисов IoT (для docker-compose), сгруппированные по именам
# 'enable' — должен ли присутствовать сервис в docker-compose.yml
# 'port.map' — номер порта сервиса в сети хоста
# 'port.export' — нужно ли выполнять маппинг порта из контейнера в сеть хоста
# 'db.name' — имя БД, используемой сервисом (связкой сервисов)
iotServices:
  db:
    port:
      map: 27017
      export: false
  broker:
    enable: true
    external:
      port:
        map: 8883
    internal:
      port:
        map: 8083
        export: false
    db:
      name: iot-broker
  olapservice:
    enable: true
    port:
      map: 8023
      export: false
    db:
      name: iotcore
      port:
        map: 8123
        export: false
Содержимое конфигурационного файла /vars/service_parameters.yml
   ngw:
    port:
      map: 8040
      export: false
    db:
      name: notification-gw
      user: javauser
      password: javapassword
      port:
        map: 3306
        export: false
  captcha:
    port:
      map: 8088
      export: false
    caseSensitive: true
    allowedSizes:
      - "312x45"
      - "270x40"
  zscaptcha:
    port:
      map: 8089
      export: false
    caseSensitive: true
  core:
    # Развертывание окружения без платформы, полезно для разработки core
    enable: true
  web:
    # Развертывание окружения без WEB, полезно для разработки web
    enable: true

# Параметры сервисов ELK (для docker-compose), сгруппированные по именам
# 'port.map' — номер порта сервиса в сети хоста
# 'port.export' — нужно ли выполнять маппинг порта из контейнера в сеть хоста
elkServices:
  elasticsearch:
    rest:
      port:
        map: 9200
    nodes:
      port:
        map: 9300
  logstash:
    port:
      map: 5001
    api:
      port:
        map: 9600
  kibana:
    port:
      map: 5601
Содержимое конфигурационного файла /vars/service_parameters.yml
# Параметры сервисов мониторинга (для docker-compose), сгруппированные по именам
# 'port.map' — номер порта сервиса в сети хоста
# 'port.export' — нужно ли выполнять маппинг порта из контейнера в сеть хоста
monitoringServices:
  prometheus:
    port:
      map: 9090
  grafana:
    port:
      map: 3000
  nginxExporter:
    enable: true
    port:
      map: 9113

coreInternal:
  # Нужно ли создавать тестовые учетные записи на платформе
  testdata:
    enable: false
  # Нужно ли включать swagger (описание API платформы)
  swagger:
    enable: false
  # Нужно ли платформе пытаться подключиться к MQTT Broker
  mqttbroker:
    enable: true
  # Нужно ли платформе пытаться подключиться к OlapService
  olapservice:
    enable: true
  # Имена БД в MongoDB, используемые платформой
  core:
    db:
      name: iot-core
  fs:
    db:
      name: iot-fs
  licenses:
    db:
      name: iot-licenses
  events:
    db:
      name: iot-events
  mjollnir:
    # URL для Mjollnir
    url: "http://smart.eltex-co.ru:8078/api/v1"


7. После этого можно запустить установку:

Установка
cd /etc/ansible-iot-1.26
ansible-playbook install_iot.yml


Если ранее использовалась версия платформы Eltex SC c подключением внешней БД MongoDB, необходимо удалить запись о репозитории mongodb.org из APT (например, /etc/apt/sources.list.d/mongodb-org-4.4.list).

8. Выполните проверку статуса контейнеров:

Проверка статуса контейнеров
docker ps
Вывод команды docker ps
CONTAINER IDIMAGE COMMANDCREATEDSTATUSPORTSNAMES
25c08d17a4aehub.eltex-co.ru/iot-clickhouse-backup:1.26/entrypoint.sh /ent…2 minutes agoUp 2 minutes
iot-olapservice-db-backup
36c21b863cc9hub.eltex-co.ru/iot-double-web:1.26/docker-entrypoint.…2 minutes agoUp 2 minutes0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp iot-double-web
01fe2697e5ffhub.eltex-co.ru/iot-core:1.26java -Dspring.profi…2 minutes agoUp 2 minutes.0.0.0:8069-8073->8069-8073/tcp, :::8069-8073->8069-8073/tcpiot-core
07d1f93831bdhub.eltex-co.ru/iot-mqttbroker-mongo:1.26java -cp @/app/jib-…2 minutes agoUp 2 minutes0.0.0.0:8883->8883/tcp, :::8883->8883/tcp iot-mqtt-broker
d1c736dc27d0hub.eltex-co.ru/eltex-ngw:1.26-602/usr/sbin/ngw_start…2 minutes agoUp 2 minutes
iot-ngw-sc
228d41c96cbahub.eltex-co.ru/iot-olapservice:1.26java -cp @/app/jib-…2 minutes agoUp 2 minutes
iot-olapservice
e8e2899f2c8dhub.eltex-co.ru/iot-captcha:1.26java -jar LibreCapt…2 minutes agoUp 2 minutes8888/tcpiot-captcha
57c02941cc4fhub.eltex-co.ru/iot-mongo5:1.26/entrypoint.sh2 minutes agoUp 2 minutes0.0.0.0:27017->27017/tcp, :::27017->27017/tcp

iot-mongo

7c3d8d5c4137hub.eltex-co.ru/iot-mysql:1.26docker-entrypoint.s…2 minutes agoUp 2 minutes3306/tcp, 33060/tcp

iot-iot-mysql

9009dd4cd675hub.eltex-co.ru/iot-olapservice:1.26java -cp @/app/jib-…2 minutes agoUp 2 minutes0.0.0.0:8023->8023/tcp, :::8023->8023/tcpiot-olapservice
6c61b34c3a41hub.eltex-co.ru/iot-clickhouse-server:1.26 /entrypoint.sh2 minutes agoUp 2 minutes9000/tcp, 0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 9009/tcp iot-olapservice-db


Платформа будет доступна по адресу: http://[Адрес вашего сервера Eltex SC]

Адрес сервера был ранее указан в переменной server_name файла конфигурации /etc/ansible-iot-1.26/vars/default.yml 


Порты доступа к API платформы можно изменить только в случае редактирования соответствующих настроек в файле конфигурации.

9. Добавьте файл лицензий.

Подробное описание процесса добавления файла лицензий доступно в документации Интерфейс администратора в разделе Лицензии.

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

Установка платформы Eltex SC с внешней БД MongoDB

В случае развертывания внешней БД MongoDB, т.е. при установке платформы Eltex SC с внешним процессом/службой mongodb:

Доступ к репозиториям mongodb.org может быть ограничен. В случае проблем с установкой пакетов необходимо использовать зеркало репозитория или вручную установить deb-пакеты (например, доступные в публичном репозитории).


1. Установите необходимые зависимости и сервис MongoDB (например версии 4.4):

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y software-properties-common gnupg build-essential net-tools dkms
wget https://www.mongodb.org/static/pgp/server-4.4.asc
sudo apt-key add server-4.4.asc
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo service mongod start
sudo service mongod status


2. В файле /etc/mongod.conf в секции net укажите:

port: 27017
bindIp: 0.0.0.0


И перезапустите сервис mongod:

sudo service mongod restart
sudo service mongod status


3. Установите Ansible на сервер:

sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
sudo ansible-galaxy collection install community.general
sudo ansible-galaxy collection install community.crypto
sudo ansible-galaxy collection install community.docker

4. Подготовьте конфигурацию:

Распаковка архива с конфигурацией
tar -C /etc -xvf ansible-iot-1.26.tar.gz


После распаковки архива все пакеты и зависимости будут развернуты в директории на текущем сервере. Файлы конфигурации и плейбуки (скрипты/конфигурации) Ansible будут расположены в директории /etc/ansible-iot-1.26.


5. Отредактируйте файл /etc/ansible-iot-1.26/inventory.

Откройте файл в любом доступном текстовом редакторе, например nano. Укажите пароль от root в переменной ansible_sudo_pass:

Далее в примере для пользователя root используется пароль rootpasswd

При установке задайте свой пароль.

Содержимое файла inventory
[iot]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd
[elk]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd
[monitoring]
localhost   ansible_connection=local    ansible_sudo_pass=rootpasswd


6. Настройте параметры доступа к платформе, в том числе параметры для работы с внешним сервисом БД. Для этого отредактируйте файлы конфигурации /etc/ansible-iot-1.26/vars/default.yml и /etc/ansible-iot-1.26/vars/service_parameters.yml.

Откройте файл default.yml в любом доступном текстовом редакторе, например nano. Укажите корректный IP-адрес или доменное имя в переменной server_name. 

Для параметра enable установите значение true, настройте параметры подключения в 'addr' и 'port'.

Содержимое конфигурационного файла vars/default.yml
mongodb:
  # Версия MongoDB. На старой аппаратной платформе, не поддерживающей оптимизацию, выставить значение `4`
  version: 5
  external:
    # Если выставлен в true, будет использоваться внешняя MongoDB
    # ВАЖНО!!! MongoDB должна быть настроена, а параметры подключения нужно указать в 'addr' и 'port'
    enable: false
    # Адрес внешней MongoDB
    addr: "{{ iot.serverName }}"
    # Порт внешней MongoDB
    port: 27017


8. После этого можно запустить установку:

cd /etc/ansible-iot-1.26
sudo ansible-playbook install_iot.yml

Платформа будет доступна по адресу: http://[Адрес вашего сервера Eltex SC]

Адрес сервера был ранее указан в переменной server_name файла конфигурации /etc/ansible-iot-1.26/vars/default.yml 


9. Добавьте файл лицензий.

Подробное описание процесса добавления файла лицензий доступно в документации Интерфейс администратора в разделе Лицензии.

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

Работа с контейнерами

В процессе обслуживания можно осуществлять перезапуск контейнеров:

Перезапуск контейнеров
ansible-playbook restart_iot.yml --extra-vars '{"services":["web", "core", "broker", "olapservice"]}'


В квадратных скобках нужно перечислить сервисы, которые необходимо перезапустить (в примере это "web", "core", "broker", "olapservice"). Если не указать параметр "services" через --extra-vars, то будут перезапущены все сервисы.
Аналогичным образом можно остановить часть контейнеров:

Остановка контейнеров
ansible-playbook stop_iot.yml --extra-vars '{"services":["web", "core", "broker", "olapservice"]}'


Или обновить все контейнеры из репозитория:

Обновление контейнеров
ansible-playbook update_iot.yml


Применение новой или измененной конфигурации:

Обновление контейнеров
ansible-playbook install_iot.yml

Расположение конфигурационных файлов

В /etc/ansible-iot-1.26/templates располагаются конфигурации для ядра: /etc/ansible-iot-1.26/templates/iot/default-for-docker.yml.j2 и веб-сервера: /etc/ansible-iot-1.26/templates/iot/web/base_config

Директория хранения журналов работы платформы: /storage/iot/core/var/log/eltex-sc/server.log

Файлы журналов разбиваются на части по размеру. Каждая часть сохраняется в файл с именем: server-YYYY-MM-DD.NN.log, где YYYY-MM-DD — дата, а NN — номер части.

При изменении конфигурации необходимо перезапустить install_iot.yml:

ansible-playbook install_iot.yml

Некоторые конфигурационные параметры дублируют файл конфигурации /etc/ansible-iot-1.26/vars/default.yml . При запуске платформы параметры, заданные в файле конфигурации /etc/ansible-iot-1.26/vars/default.yml, имеют наивысший приоритет по отношению к другим файлам конфигурации, а также ведут к их перезаписи.


Содержимое конфигурационного файла default-for-docker.yml.j2:

#  тестовые данные окружения: дом, контроллер, устройства, правила
testData:
  environment: {{ 'true' if coreInternal.testdata.enable else 'false' }}

fileStorage:
  path: "/var/lib/eltex-sc/files"

controllerGateTCP:
  port: {{ core.ctlGate.tcpPort }}

controllerGate:
  port: {{ core.ctlGate.port }}

controllerGateSecurity:
  port: {{ core.ctlGate.sslPort }}
  key: "/etc/ssl/private/eltex-sc-ctl-gate.key"
  crt: "/etc/ssl/certs/eltex-sc-ctl-gate.crt"

api:
  port: {{ core.api.port }}
  sslPort: {{ core.api.sslPort }}

ui:
  serverName: "{{ web.serverName }}"
{% if web.httpPort != 80 or web.httpsPort != 443 %}
  # Порты UI нужны для формирования на платформе ссылок, которые пользователь сможет открыть через UI
  # Могут отсутствовать. В таком случае port/sslPort не будет указываться при составлении URL для UI (WEB)
{% if web.httpPort != 80 %}
  port: {{ web.httpPort }}
{% endif %}
{% if web.httpsPort != 443 %}
  sslPort: {{ web.httpsPort }}
{% endif %}
{% endif %}
mqttBroker:
  enabled: {{ 'true' if coreInternal.mqttbroker.enable else 'false' }}
  # Хост MQTT-брокера, используется платформой
  host: "broker"
  # Порт MQTT-брокера, используется платформой для связи по протоколу MQTT
  port: 8883
  # Порт, на котором у брокера поднимается REST API, используется платформой
  apiPort: 8083
  # Внешний URL, по которому доступен MQTT-брокер, передаётся MQTT-клиентам
  remoteAccessURL: "{{ iot.serverName }}:{{ iotServices.broker.external.port.map }}"
  # Таймаут в секундах, по достижении которого выставляется статус "Offline" MQTT-устройствам
  offlineTimeoutSec: 300

olapservice:
  enabled: {{ 'true' if coreInternal.olapservice.enable else 'false' }}
  host: "olapservice"
  port: 8023

captcha:
  # Список инстансов CAPTCHA (Libre CAPTCHA, Zero Storage Captcha)
  instances: captcha:8088, zs-captcha:8089
  proportions: 30, 70
  level: "{{ core.captchaLevel }}"

resilience4j:
  # Автоматический выключатель, который срабатывает при большом количестве неудачных вызовов
  # и перенаправляет логику в альтернативный способ обработки вызова
  circuitbreaker:
    configs:
      default:
        # Процент ошибок, при котором запрос будет перенаправляться в резервные методы
        failureRateThreshold: 50
        # Процент медленных запросов, при котором запрос будет перенаправляться в резервные методы
        slowCallRateThreshold: 50
        # Время, по истечении которого запрос будет считаться медленным
        slowCallDurationThreshold: 5s
        # Количество вызовов, разрешённых в полуоткрытом состоянии
        permittedNumberOfCallsInHalfOpenState: 5
        # Тип скользящего окна, которое используется для результатов вызовов в закрытом состоянии (COUNT_BASED/TIME_BASED)
        slidingWindowType: COUNT_BASED
        # Размер скользящего окна
        slidingWindowSize: 100
        # Автоматический переход от открытого состояния в полуоткрытое
        automaticTransitionFromOpenToHalfOpenEnabled: true
        # Время, по истечении которого состояние circuitbreaker переходит из открытого состояния в полуоткрытое
        waitDurationInOpenState: 5s


        # Минимальное количество вызовов для расчёта ошибок и медленных вызовов
        minimumNumberOfCalls: 20
    instances:
      eventlog:
        baseConfig: default
      flussonic:
        baseConfig: default
        slowCallDurationThreshold: 3s
        waitDurationInOpenState: 20s
      ivideon:
        baseConfig: default
        slowCallDurationThreshold: 3s
        waitDurationInOpenState: 20s
  # Ограничитель вызова метода по времени
  timelimiter:
    configs:
      default:
        # Время, через которое вызов прерывается
        timeoutDuration: 10s
    instances:
      eventlog:
        baseConfig: default
      flussonic:
        baseConfig: default
        timeoutDuration: 3s
      ivideon:
        baseConfig: default
        timeoutDuration: 3s
  # Ограничитель по количеству одновременных вызовов метода
  bulkhead:
    configs:
      default:
        # Максимальное количество параллельных вызовов, разрешённых bulkhead
        maxConcurrentCalls: 20
    instances:
      eventlog:
        baseConfig: default
      flussonic:
        baseConfig: default
        maxConcurrentCalls: 10
      ivideon:
        baseConfig: default
        maxConcurrentCalls: 10
  # Повтор. Отмеченный метод вызывается несколько раз: либо до успеха, либо до максимального количества попыток
  retry:
    configs:
      default:
        # Максимальное количество попыток (включая первый запрос)
        maxAttempts: 2
        # Время ожидания между попытками (мс)
        waitDuration: 500
    instances:
      eventlog:
        baseConfig: default
      flussonic:
        baseConfig: default
      ivideon:
        baseConfig: default
  # Ограничитель скорости. Останавливает большое количество вызовов метода в определённый промежуток времени
  ratelimiter:
    configs:
      default:
        # Время, в течение которого поток ждёт разрешения на вызов (с)
        timeoutDuration: 25ms
        # Период обновления лимита (нс)
        limitRefreshPeriod: 1000
        # Количество разрешений, доступных в одном периоде
        limitForPeriod: 10
    instances:
      eventlog:
        baseConfig: default
      flussonic:
        baseConfig: default
      ivideon:
        baseConfig: default

# параметры для формирования ссылок к UI(WEB) и API
server:
  # Доменное имя сервера, на котором развернута платформа
  name: "{{ iot.serverName }}"
  # Использовать схему https:// при формировании ссылок к UI
  useHttpsForUi: {{ 'true' if core.server.useHttpsForUi else 'false' }}
  # Использовать схему https:// при формировании ссылок к API
  useHttpsForApi: {{ 'true' if core.server.useHttpsForApi else 'false' }}
  # Использовать схему https:// при формировании ссылок на фото с камер
  useHttpsForCameraLinks:  {{ 'true' if core.server.useHttpsForCameraLinks else 'false' }}
  # Использовать ui.serverName вместо server.name и ui.port/ui.sslPort вместо api.port/api.sslPort
  # при формировании ссылок к API
  useUiProxyForApi: {{ 'true' if core.server.useUiProxyForApi else 'false' }}
  oauth2:
    # Время жизни access-токена в секундах. Должно быть не менее 5 с
    # Также нужно учесть, что authorization server добавляет запас времени 60 секунд до того, как токен будет считаться
    # просроченным. Итоговое время жизни токена: accessTokenTimeToLive + 60
    accessTokenTimeToLive: 3600


  # Конфигурация jetty
  jetty:
    # Время простоя соединения
    connection-idle-timeout: 120000ms
    max-http-form-post-size: 200000B
    # Конфигурация потоков
    threads:
      acceptors: -1
      selectors: -1
      # Время простоя потока
      idle-timeout: 120000ms
      # Минимальное количество потоков
      min: 32
      # Максимальное количество потоков
      max: 256
      # Максимальный размер очереди задач для потоков
      max-queue-capacity: 32768

selfRegistration:
  allow: {{ 'true' if core.selfRegistration.allow else 'false' }}
  allowDemo: {{ 'true' if core.selfRegistration.allowDemo else 'false' }}

electricMeterScheduler:
  cron: "0 0/30 * * * ?"

electricMeterArchiveScheduler:
  cron: "0 0 17 * * ?"

batch:
  maxPoolSize: 2
  corePoolSize: 1

services:
  ngw:
    host: "ngw-sc"
    port: 8040
  alarmService:
    enabled: false
  loginInfo:
    # Время жизни разлогиненных записей loginInfo в днях, с даты выхода из учетной записи
    ttl: 180
    # Максимально допустимый интервал времени (в днях) отсутствия активности со стороны пользователя,
    # по истечении которого неактивные loginInfo (и привязанные к ним авторизации) автоматически разлогиниваются
    activityTimeLimit: 180
  user:
    # Максимально допустимый интервал времени (в днях) отсутствия активности со стороны пользователя
    # перед его деактивацией
    allowedInactivePeriod: 180
  push:
    firebase:
      enabled: true
    apns:
      enabled: true


dictionary:
  notificationPath: "dictionary/notificationDict.yml"
  automationPath: "dictionary/automationDict.yml"
  guardPath: "dictionary/guardDict.yml"
  inputKeysPath: "dictionary/inputKeysDict.yml"
  deprecatedKeysPath: "dictionary/deprecatedKeysDict.yml"
  substitutionKeysPath: "dictionary/substitutionKeys.yml"

languageInterface:
  language: "ru"

# Hazelcast instance configuration -> Move it to separate microservice -> Use hz-client here
hazelcast:
  instanceName: "iot-core-hz-instance{{ containerNameSuffix }}"
  clusterName: "iot-core{{ containerNameSuffix }}"
  network:
    port: "5705"
#    member: "127.0.0.1:5701"

mjollnir:
  sync-period: "0 0 23 1/1 * ?"
  login: "platform"
  password: "platform"
  url: "{{ coreInternal.mjollnir.url }}"

# Основная база данных iot-core
iot-core:
  host: "{{ mongodb_addr }}"
  port: {{ mongodb_port }}
  user: ""
  password: ""
  database: "{{ coreInternal.core.db.name }}"

# База данных файлового хранилища iot-fs
file-storage:
  host: "{{ mongodb_addr }}"
  port: {{ mongodb_port }}
  user: ""
  password: ""
  database: "{{ coreInternal.fs.db.name }}"

# База лицензионных файлов
license-storage:
  host: "{{ mongodb_addr }}"
  port: {{ mongodb_port }}
  user: ""
  password: ""
  database: "{{ coreInternal.licenses.db.name }}"

# База данных журнала событий eventlog
eventlog:
  host: "{{ mongodb_addr }}"
  port: {{ mongodb_port }}
  user: ""
  password: ""
  database: "{{ coreInternal.events.db.name }}"


monitoring-system:
  countAttempt: 3
  delayAttempt: 0

spring:
  kafka:
    enabled: false
    producer:
      bootstrap-servers: "localhost:9092"
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

#Адрес локально развернутого сервера, временное решение для стыковки с Android. ApiKey также локальный
video:
  flussonic:
    url: "{{ core.video.flussonic.url }}"
    apiKey: "{{ core.video.flussonic.apiKey }}"
    operator_id: "{{ core.video.flussonic.operatorId }}"
    admin_login: "{{ core.video.flussonic.adminLogin }}"
    fake_camera_url: "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4"
  ivideon:
    #указан IP, куда ivideon будет посылать события. Для развертывания следует изменить
    ip_for_catch_event: ""
  eltex_server:
      url: "{{ core.video.eltex_server.url }}"

#Абсолютный путь до сертификата SSL
ssl:
  key: "/etc/ssl/private/eltex-sc-api.key"
  crt: "/etc/ssl/certs/eltex-sc-api.crt"

proxy:
  enabled: false
  host: ""
  port: 8050

billing:
  cron: "0 0 0 * * ?"
  ftp:
    host: "127.0.0.1"
    port: 21
    login: "user"
    password: "password"
    workdir: "test"

notifications:
  duplicate_delay_sec: 0
  antispam_time_sec: 0
  delay_push_time_millisec: 250

guard:
  deviceRequestDelay: 15000


#Включение и отключение swagger. При вводе корректного key открываются скрытые пункты в swagger
springdoc:
  swagger-ui:
    enabled: {{ 'true' if coreInternal.swagger.enable else 'false' }}
    key: ""

controller:
  delay_answer_from_control_millisec: 12000
  number_of_ping_threads: 1

oauth2:
  clientParameters:
    {{ core.yandexSkill.clientId }}:
      type: YANDEX
      password: "{{ core.yandexSkill.password }}"
      clientAuthenticationMethod: client_secret_post
      authorizationGrantTypes:
        - authorization_code
        - refresh_token
      redirectUri: "https://social.yandex.net/broker/redirect"
      additionalAccount: YandexAccount
    {{ core.sberSkill.clientId }}:
      type: SBER
      password: "{{ core.sberSkill.password }}"
      clientAuthenticationMethod: client_secret_post
      authorizationGrantTypes:
        - authorization_code
        - refresh_token
      redirectUri: "https://gateway.iot.sberdevices.ru/gateway/v1/binder/backward"
      additionalAccount: SberAccount
    {{ core.marusyaSkill.clientId }}:
      type: MARUSYA
      password: "{{ core.marusyaSkill.password }}"
      clientAuthenticationMethod: client_secret_post
      authorizationGrantTypes:
        - authorization_code
        - refresh_token
      redirectUri: "https://vc.go.mail.ru/smarthouse/{{ core.marusyaSkill.appId }}/callback"
      additionalAccount: MarusyaAccount

# параметры навыка Яндекс для интеграции с Умным домом (Алисой)
# https://yandex.ru/dev/dialogs/smart-home/doc/concepts/about.html
yandex-skill:
  # Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
  client-id: "{{ core.yandexSkill.clientId }}"
  # Ссылка на API сервиса уведомлений Яндекса
  callback-uri: "https://dialogs.yandex.net/api/v1/skills"
  # ID навыка, который необходимо указывать при отправке уведомлений (отображается в карточке навыка)
  skill-id: "{{ core.yandexSkill.skillId }}"
  # OAuth-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку навыка)
  oauth-token: "{{ core.yandexSkill.oauthToken }}"
# параметры проекта умного дома Сбера для интеграции с Салютом
# https://developers.sber.ru/docs/ru/smarthome/overview
sber-skill:
  # Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
  client-id: "{{ core.sberSkill.clientId }}"
  # Ссылка на API сервиса уведомлений Сбера
  callback-uri: "https://partners.iot.sberdevices.ru"
  # Bearer-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку проекта)
  bearer-token: "{{ core.sberSkill.bearerToken }}"

# параметры проекта умного дома Mail.ru для интеграции с Марусей
# https://help.mail.ru/marusia/smart_home
marusya-skill:
  # Настройки клиента необходимо указать в секции oauth2.clientParameters под указанным client-id
  client-id: "{{ core.marusyaSkill.clientId }}"
  # Ссылка на API сервиса уведомлений Маруси
  callback-uri: "https://vc.go.mail.ru/smarthouse/events/yandex"
  # ID приложения, который необходимо указывать при отправке уведомлений (отображается в карточке приложения)
  app-id: "{{ core.marusyaSkill.appId }}"
  # OAuth-токен, который необходимо указывать при отправке уведомлений (необходимо получить через карточку приложения)
  oauth-token: "{{ core.marusyaSkill.oauthToken }}"

scriptengine:
  # Предельное количество выполнений скрипта за период времени executionNumberLimit
  # Если запуск скрипта происходят чаще, чем scriptTimeLimit раз в интервал времени scriptTimeLimit (мс),
  # то скрипт останавливается
  frequentScript:
    executionNumberLimit: 60
    scriptTimeLimit: 60000
  # Предельное количество выполнений скриптов одного дома за период времени executionNumberLimit
  # Если запуск скриптов происходят чаще, чем scriptTimeLimit раз в интервал времени scriptTimeLimit (мс),
  # то все скрипты дома останавливаются
  frequentScriptsInHouse:
    executionNumberLimit: 120
    scriptTimeLimit: 120000

logging:
  config: "classpath:logback-prod{{ '' if elk.enable else '-without-logstash' }}.xml"
  logback:
    dir: "/var/log/eltex-sc"
{% if elk.enable %}
  logstash:
    host: "{{ 'logstash' if iot.serverName == elk.serverName else elk.serverName }}"
    port: {{ 5000 if iot.serverName == elk.serverName else elkServices.logstash.port.map }}
{% endif %}
  level:
    root: {{ 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
    io.swagger: WARN
    io.github.resilience4j: WARN
    io.netty: WARN
    io.mongock: WARN
    io.micrometer: WARN
    com.hazelcast: WARN
    com.hivemq: WARN

Порты, используемые платформой по умолчанию:

  • 8069 — порт для подключения контроллеров Ethernet к платформе в режиме TCP-клиент;
  • 8070 — WS-порт для подключения контроллеров к платформе;
  • 8071 — HTTP-порт API-платформы;
  • 8072 — WSS-порт для подключения контроллеров к платформе;
  • 8073 — HTTPS-порт API-платформы;
  • 8883 — порт для подключения к MQTT-брокеру;
  • 8088 — порт для CAPTCHA.

По окончании установки и конфигурирования сервер Eltex SC будет готов к работе. Взаимодействие с платформой происходит через веб-интерфейсы пользователей и администратора, а также через мобильное приложение Eltex Home.

Во всех случаях для входа в платформу необходимо указать ее адрес и номер порта. В общем случае в адресную строку браузера вводится следующее: <Адрес сервера Eltex SC>.

Проверка работоспособности платформы

В данном разделе представлен чек-лист для проверки работоспособности платформы.

Проверить занятость ядер процессора и оперативной памяти

htop
Необходимо следить за MEM% и CPU% процессов mongo и eltex-sc.

Проверить занятость физического места на диске

df -h
Обратите внимание на использование диска всеми подразделами.

Проверить соединения контроллеров Z-Wave или датчиков Wi-Fi с платформой

netstat -na | grep 8070
netstat -na | grep 8883

Параметры, на которые следует обратить внимание:

  • Состояние соединений:
    • ESTABLISHED, LISTEN — норма;
    • LAST_ACK — связь с контроллером потеряна, рядом должно быть переоткрытое соединение с того же IP;
    • TIME_WAIT, CLOSE_WAIT — соединение зависло, неудачное закрытие;
  • 2-ая колонка — очередь принятых сервером пакетов;
  • 3-я колонка — очередь пакетов, отосланных на контроллеры;
  • 5-я колонка — IP-адреса контроллеров.

Необходимо следить, чтобы пакеты не копились в очереди на контроллер. Если такое происходит, значит веб-сокет этого контроллера недоступен, и нужно проверить событие и время события в лог-файлах платформы.

Проверить наличие ошибок в логе

Лог-файлы платформы по умолчанию находятся в /storage/iot/core/var/log/eltex-sc/server*. Они разбиваются на части по размеру. Чтобы проверить все журналы на наличие некоторого параметра за определенную дату (например за 15 января 2022 года) и записать результаты в файл, выполните команду:

grep <значение для поиска> server-2022-01-15* > <имя файла для вывода>

Если требуется, можно дописать следующие опции после значения для поиска:

  • -i — не чувствителен к регистру;
  • -n — номера строк;
  • -h — подавляет запись имени файла перед каждой строкой в результирующем файле;
  • -A — количество строк после совпадения;
  • -B — количество строк до совпадения.


Общий вид команды:

grep -i -n -A 5 -B 2 error server-2022-01-15* > errors.log


Ключевые слова для поиска:

  • ERROR;
  • ID или IP контроллера;
  • PONG — ключевое слово, которое записывается, если контроллер не отвечает.

Проверить доступность веб-интерфейса

Самый простой способ проверить доступность веб-интерфейса платформы — открыть его в браузере (по IP или доменному имени — в зависимости от настроек сети и сервера).

Можно проверить доступность API платформы. Для этого в адресной строке браузера к URL веб-интерфейса платформы допишите: 

<Адрес сервера Eltex SC>:<порт API>/api/v1/version

где порт API — вышеуказанный порт доступа к API по HTTP (по умолчанию 8071/8073). Платформа должна моментально вернуть данные об установленной версии платформы, версии API и текущем времени на сервере в формате JSON.


Пример вывода:

Ответ сервера на запрос
{
  "version" : "1.26-3477",
  "api" : "1.0",
  "currentTime" : "2022-07-25T09:24:12.544842Z[Etc/UTC]"
}

Переход с http на https


Ваш сертификат должен иметь формат PKCS#8.

Способ определения типа сертификата

# head -1 /tmp/eltex-sc-api.key 
-----BEGIN PRIVATE KEY-----

# head -1 /storage/iot/ssl/private/eltex-sc-api.key
-----BEGIN RSA PRIVATE KEY-----


  • BEGIN PRIVATE KEY — кодировка PKCS#8;
  • BEGIN RSA PRIVATE KEY — кодировка PKCS#1.

Если ваш сертификат имеет кодировку PKCS#1, необходимо конвертировать его в PKCS#8.

Пример конвертирования сертификата из PKCS#1 в PKCS#8, letsencrypt:

openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in путь_до_ключа -out имя_для_нового_ключа.

Настройка CAPTCHA

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

Список инстансов CAPTCHA доступен в файле /etc/ansible-iot-1.26/templates/default-for-docker.yml.j2

Настройки доступны в файле /etc/ansible-iot-1.26/vars/service_parametrs.yml

Параметр caseSensitive отвечает за чувствительность к регистру.

Настройки уровня сложности представлены тремя возможными значениями и доступны в файле /etc/ansible-iot-1.26/vars/default.yml

Уровень сложностиОписание
easyНизкий уровень сложности. Обычно представляет из себя легкочитаемый текст.
mediumСредний уровень сложности. Обычно представляет из себя слегка искаженный текст.
hardВысокий уровень сложности. Обычно представляет собой сильно искаженный текст.
  • Нет меток