Версия ПО 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.
Пример установки через консоль:
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 --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
При установке задайте свой пароль.
Пример задания пароля:
[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:
--- # Параметры установки платформы 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
# Параметры 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
# Порты 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: ""
# Параметры проекта умного дома Сбера для интеграции с Салютом. Отображаются в карточке проекта 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 задаются дополнительные параметры:
--- # Версия контейнеров release: 1.26 # Имя репозитория docker registry, содержащего docker-образы для развертывания registry: hub.eltex-co.ru # Список сервисов для перезапуска (при запуске плейбуков restart_*.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
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
# Параметры сервисов мониторинга (для 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 ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
25c08d17a4ae | hub.eltex-co.ru/iot-clickhouse-backup:1.26 | /entrypoint.sh /ent… | 2 minutes ago | Up 2 minutes | iot-olapservice-db-backup | |
36c21b863cc9 | hub.eltex-co.ru/iot-double-web:1.26 | /docker-entrypoint.… | 2 minutes ago | Up 2 minutes | 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp | iot-double-web |
01fe2697e5ff | hub.eltex-co.ru/iot-core:1.26 | java -Dspring.profi… | 2 minutes ago | Up 2 minutes | .0.0.0:8069-8073->8069-8073/tcp, :::8069-8073->8069-8073/tcp | iot-core |
07d1f93831bd | hub.eltex-co.ru/iot-mqttbroker-mongo:1.26 | java -cp @/app/jib-… | 2 minutes ago | Up 2 minutes | 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp | iot-mqtt-broker |
d1c736dc27d0 | hub.eltex-co.ru/eltex-ngw:1.26-602 | /usr/sbin/ngw_start… | 2 minutes ago | Up 2 minutes | iot-ngw-sc | |
228d41c96cba | hub.eltex-co.ru/iot-olapservice:1.26 | java -cp @/app/jib-… | 2 minutes ago | Up 2 minutes | iot-olapservice | |
e8e2899f2c8d | hub.eltex-co.ru/iot-captcha:1.26 | java -jar LibreCapt… | 2 minutes ago | Up 2 minutes | 8888/tcp | iot-captcha |
57c02941cc4f | hub.eltex-co.ru/iot-mongo5:1.26 | /entrypoint.sh | 2 minutes ago | Up 2 minutes | 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp | iot-mongo |
7c3d8d5c4137 | hub.eltex-co.ru/iot-mysql:1.26 | docker-entrypoint.s… | 2 minutes ago | Up 2 minutes | 3306/tcp, 33060/tcp | iot-iot-mysql |
9009dd4cd675 | hub.eltex-co.ru/iot-olapservice:1.26 | java -cp @/app/jib-… | 2 minutes ago | Up 2 minutes | 0.0.0.0:8023->8023/tcp, :::8023->8023/tcp | iot-olapservice |
6c61b34c3a41 | hub.eltex-co.ru/iot-clickhouse-server:1.26 | /entrypoint.sh | 2 minutes ago | Up 2 minutes | 9000/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
При установке задайте свой пароль.
[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'.
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
Проверить занятость физического места на диске
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
Способ определения типа сертификата
# 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 | Высокий уровень сложности. Обычно представляет собой сильно искаженный текст. |