Версия ПО 1.27
Рекомендуемые характеристики сервера
Система Eltex SC строится по клиент-серверной архитектуре. Серверную часть рекомендуется устанавливать на многопроцессорный компьютер под управлением OS Ubuntu 20.
Производительность сервера зависит от числа пользователей, которые будут зарегистрированы на платформе.
Минимальные системные требования сервера*:
- число аппаратных серверов — 1;
- процессор — i5 3,0 ГГц;
- оперативная память — 8 ГБ;
- место на диске — 1000 ГБ;
- производительность дискового массива (чтение/запись) — 2000 IOPS.
Минимально необходимая конфигурация для запуска ядра платформы с микросервисами.
Установка платформы Eltex SC
В инструкции описан процесс установки платформы Eltex SC версии 1.27 на операционную систему Ubuntu 20.04. Информацию по установке более ранних версий платформы Eltex SC (1.26 и ниже) можно найти по ссылке: Архив 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.27.tar.gz
После распаковки архива все пакеты и зависимости будут развернуты в директории на текущем сервере.
Файлы конфигурации и плейбуки (скрипты/конфигурации) Ansible будут расположены в директории /etc/ansible-iot-1.27
5. Отредактируйте файл /etc/ansible-iot-1.27/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.27/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 # Email владельца домена. Необходим для подтверждения валидности домена при получении сертификата Let's Encrypt. email: test@email.com # Параметры сервера отправки email (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 # Порты платформы для подключения zway-контроллеров. ctlGate: port: 8070 tcpPort: 8069 sslPort: 8072
# Порты API платформы. api: port: 8071 sslPort: 8073 # Уровень сложности капчи: 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 allowSocialNetworks: false # Параметры для работы с видеосерверами video: # Параметры Flussonic. flussonic: url: "" apiKey: "" operatorId: "" adminLogin: "" # Параметры видеосервера eltex eltex_server: url: "" # Если параметр true, то это подразумевает, что вместо flussonic сервера в flussonic.url указан адрес до # видеосервера eltex. На версию 1.28 планируется разделение этих типов камер и этот параметр будет удален. hls_player: false # Параметры клиентских регистраций (через соцсети). clientRegistrations: google: clientId: "GoogleClientIdChangeMe" clientSecret: "GoogleClientSecretChangeMe"
# Параметры навыка Яндекс для интеграции с Умным домом (Алисой). Отображается в карточке навыка. 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.27 # Имя репозитория docker registry, содержащего docker-образы для развертывания. registry: hub.eltex-co.ru # Список сервисов для перезапуска (при запуске плейбуков restart_*.yml). # Можно оставить пустым, а при запуске передавать параметром командной строки. services: # Нужно ли выполнять подготовку дистрибутива к установке. Этот шаг полезен при "чистой" установке # на только что созданный сервер. Если ранее уже была выполнена установка компонентов IoT через ansible, # то такая подготовка не требуется и этот шаг можно пропустить для экономии времени. withDistroPreparingStep: true # Суффикс, добавляемый к имени каждого контейнера (помогает избежать конфликты имен контейнеров). containerNameSuffix: "" # Суффикс, добавляемый к имени создаваемой сети docker (помогает избежать конфликты имен сетей docker). networkNameSuffix: "" # Параметры мониторинга использования дискового пространства. Должны соответствовать требованию: # warnThreshold > criticalThreshold > 0, иначе мониторинг дискового пространства будет отключен. diskUsage: # Порог дискового пространства (в %), при достижении которого все логгеры микросервисов переводятся в режим WARN # (отображаются сообщения с тегами WARN и ERROR). Количество бэкапов баз уменьшается пропорционально приближению к # порогу criticalThreshold. warnThreshold: 20 # Порог дискового пространства (в %), при достижении которого все логгеры микросервисов переводятся в режим ERROR # (отображаются только сообщения с тегом ERROR). Бэкапы баз не выполняются. criticalThreshold: 10
# Параметры сервисов 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: enable: true port: map: 8088 export: false caseSensitive: true allowedSizes: - "312x45" - "270x40" instance: "captcha:8088" proportion: 100
zscaptcha: enable: false port: map: 8089 export: false caseSensitive: true instance: "zs-captcha:8089" proportion: 0 core: # Развертывание окружения без платформы, полезно для разработки core. enable: true web: # Развертывание окружения без WEB, полезно для разработки web. enable: true zwayproxy: enable: false port: map: 8070 export: true sslPort: map: 8072 export: true rabbit: port: map: 5672 export: false queue: # Идентификатор очереди для отправки сообщений из прокси в платформу. platform: platform exchange: # Идентификатор топик-коллектора. proxy: zway-proxy-topic-exchange # Количество консьюмеров на стороне платформы platformConsumers: # Данный параметр не может быть больше чем maxCount. count: 1 # Максимальное количество одновременных консьюмеров очереди. maxCount: 1 # Количество консьюмеров на стороне zwayProxy service proxyConsumers: # Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount. count: 1 # Максимальное количество одновременных консьюмеров очереди. maxCount: 1
# Параметры сервисов 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.27 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.27 | /entrypoint.sh /ent… | 2 minutes ago | Up 2 minutes | iot-olapservice-db-backup | |
36c21b863cc9 | hub.eltex-co.ru/iot-double-web:1.27 | /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.27 | 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.27 | 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.27-602 | /usr/sbin/ngw_start… | 2 minutes ago | Up 2 minutes | iot-ngw-sc | |
228d41c96cba | hub.eltex-co.ru/iot-olapservice:1.27 | java -cp @/app/jib-… | 2 minutes ago | Up 2 minutes | iot-olapservice | |
e8e2899f2c8d | hub.eltex-co.ru/iot-captcha:1.27 | java -jar LibreCapt… | 2 minutes ago | Up 2 minutes | 8888/tcp | iot-captcha |
57c02941cc4f | hub.eltex-co.ru/iot-mongo5:1.27 | /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.27 | docker-entrypoint.s… | 2 minutes ago | Up 2 minutes | 3306/tcp, 33060/tcp | iot-iot-mysql |
9009dd4cd675 | hub.eltex-co.ru/iot-olapservice:1.27 | 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.27 | /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.27/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.27.tar.gz
После распаковки архива все пакеты и зависимости будут развернуты в директории на текущем сервере. Файлы конфигурации и плейбуки (скрипты/конфигурации) Ansible будут расположены в директории /etc/ansible-iot-1.27.
5. Отредактируйте файл /etc/ansible-iot-1.27/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.27/vars/default.yml и /etc/ansible-iot-1.27/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.27 sudo ansible-playbook install_iot.yml
Платформа будет доступна по адресу: http://[Адрес вашего сервера Eltex SC]
Адрес сервера был ранее указан в переменной server_name файла конфигурации /etc/ansible-iot-1.27/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.27/templates располагаются конфигурации для ядра: /etc/ansible-iot-1.27/templates/iot/default-for-docker.yml.j2 и веб-сервера: /etc/ansible-iot-1.27/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.27/vars/default.yml . При запуске платформы параметры, заданные в файле конфигурации /etc/ansible-iot-1.27/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 zwayproxy: enabled: {{ 'true' if iotServices.zwayproxy.enable else 'false' }} manager: replicaCheckPeriodSeconds: 5 replicaDeadPeriodSeconds: 15 connectAliveWaitPeriodSeconds: 15 rabbit: queue: # Идентификатор очереди для отправки сообщений из прокси в платформу. platform: {{ iotServices.zwayproxy.rabbit.queue.platform }} exchange: # Идентификатор топик-коллектора. proxy: {{ iotServices.zwayproxy.rabbit.exchange.proxy }} consumers: # Количество одновременных консьюмеров очереди. Данный параметр не может быть больше чем maxCount. count: {{ iotServices.zwayproxy.rabbit.platformConsumers.count }} # Максимальное количество одновременных консьюмеров очереди. maxCount: {{ iotServices.zwayproxy.rabbit.platformConsumers.maxCount }} captcha: # Список инстансов капчи (Libre CAPTCHA, Zero Storage Captcha) instances: {{ captcha_instances | join(', ') }} proportions: {{ captcha_proportions | join(', ') }} level: "{{ core.captchaLevel }}"
# параметры для формирования ссылок к 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' }} allowSocialNetworks: {{ 'true' if core.selfRegistration.allowSocialNetworks 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 diskUsage: warnThreshold: {{ diskUsage.warnThreshold }} criticalThreshold: {{ diskUsage.criticalThreshold }} loginInfo: # Время жизни разлогиненых записей loginInfo в днях, с даты выхода из учетной записи ttl: 180 # Максимально допустимый интервал времени (в днях) отсутствия активности со стороны пользователя # по истечении которого неактивные loginInfo (и привязанные к ним авторизации) автоматически разлогиниваются activityTimeLimit: 180 user: # Максимально допустимый интервал времени (в днях) отсутствия активности со стороны пользователя # перед его деактивацией allowedInactivePeriod: 180 push: firebase: enabled: true apns: enabled: true 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: security: oauth2: client: registration: google: client-id: "{{ core.clientRegistrations.google.clientId }}" client-secret: "{{ core.clientRegistrations.google.clientSecret }}" 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: zwayproxy-rabbitmq port: 5672
#Адрес локально развернутого сервера, временное решение для стыковки с 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 }}" ivideon: #указан ip куда ivideon будет посылать события, для развертывания следует изменить ip_for_catch_event: "" eltex_server: url: "{{ core.video.eltex_server.url }}" hls_player: "{{ core.video.eltex_server.hls_player }}" #Абсолютный путь до сертификата 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 zway: logStringsLimit: 50
oauth2: clientParameters: web-client: type: WEB password: password clientAuthenticationMethod: client_secret_basic authorizationGrantTypes: - authorization_code - password - refresh_token {% if web.httpsPort != 443 %} redirectUri: "https://{{ web.serverName }}:{{ web.httpsPort }}/ng/login" {% else %} redirectUri: "https://{{ web.serverName }}/ng/login" {% endif %} allowAdminLogin: true allowRevokeAll: true android-client: type: ANDROID password: password clientAuthenticationMethod: client_secret_basic authorizationGrantTypes: - authorization_code - password - refresh_token redirectUri: "https://eltex.iot.app/authorization" allowRevokeAll: true 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 {{ 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://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: "{{ coreInternal.logbackConfig }}" 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
entitiesLimit: support: # Максимальное количество открытых за последние 30 дней тикетов у одного пользователя maxNumberOfOpenTickets: 30 # Максимальное количество сообщений допустимое для обычного пользователя в чате конкретного тикета maxNumberOfMessagesPerDay: 1000 # Количество дней, через которое закрытый тикет будет удален. Используется время последнего обновления тикета. numberOfDaysForTicketExpired: 365 fileLimits: support: # Максимально допустимое количество и суммарный размер файлов (Мегабайт) логов прикладываемых с UI к тикету maxNumberOfUiLogFilesLinkToTicket: 2 maxSizeOfUiLogFilesLinkToTicket: 10 # Максимально допустимое количество и суммарный размер файлов (Мегабайт) приложенных пользователем к тикету maxNumberOfAttachedFilesLinkToTicket: 15 maxSizeOfAttachedFilesLinkToTicket: 15 # Максимально допустимое количество и суммарный размер файлов (Мегабайт) приложенных пользователем к сообщению maxNumberOfAttachedFilesLinkToMessage: 1 maxSizeOfAttachedFilesLinkToMessage: 10 # Максимальный размер файлов (Мегабайт) приложенных в чате. Наиболее старые файлы будут удалены в ходе ротации. maxSizeForFilesAttachedToChat: 20 # Количество дней после которого будут удалены все приложенные к сообщениям чата файлы. # Используется время последнего обновления тикета. numberOfDaysForExpiredAttachmentsInChat: 7
Порты, используемые платформой по умолчанию:
- 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.27-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.27/templates/default-for-docker.yml.j2
Настройки доступны в файле /etc/ansible-iot-1.27/vars/service_parametrs.yml
Параметр caseSensitive отвечает за чувствительность к регистру.
Настройки уровня сложности представлены тремя возможными значениями и доступны в файле /etc/ansible-iot-1.27/vars/default.yml
Уровень сложности | Описание |
---|---|
easy | Низкий уровень сложности. Обычно представляет из себя легкочитаемый текст. |
medium | Средний уровень сложности. Обычно представляет из себя слегка искаженный текст. |
hard | Высокий уровень сложности. Обычно представляет собой сильно искаженный текст. |