Наиболее простым и удобным способом развертывания платформы является использование платформы Docker.
Linux
Установить Docker for Linux, следовать инструкции. Дополнительно установить пакет с docker-compose
Windows
Установить Docker Desktop, следовать инстукциям
Устанавливаются следующие модули:
.env
- файл с переменными окружения, в котором определены основные порты сервисов. Проверьте доступность этих портов на сервере./cert
- файл с сертификами для работы по TLS протоколу брокера MQTT и устройств (эмулятора).docker-compose.yaml
- манифест с запуском платформы.docker-compose -f docker-compose.yaml up -d
При запуске каталог с сертификатами certs и файл notifier-application.yaml будen автоматически примонтированы в качестве
volume к сервисам emqx и notifier.
Зайти в web-приложение по адресу htpp://localhost:8001/semux
,
порт 8001 - это порт переменной HTTP_PORT
задается в файле .env
.
(Логин и пароль админситратора передается в рамках партнерского соглашения)
Проверить наличие записи коллектора (Меню->Система->Сервер-коллектор). Если нет ни одной записи (зависит от версии докер-поставки), то выполнить следующие шаги:
$ docker-compose exec postgres bash
$ psql -U postgres semdb
INSERT INTO sem.collectorserver (serverid, ip, host, dn, port, comment)
VALUES (1, 'collector', 'Сервер по умолчанию', 'collector', 8883, 'Сервер сбора по умолчанию');
После этого консоль можно закрыть набрав exit; И из консоли контейнера тоже выйти можно
набрав exit.
PG_HOST
, PG_PORT
, PG_DB
задайте значения внешней БД.Докер контейнеры поставляются по умолчанию с лицензией POC (proof of concept), которая имеет ограниения на кол-во подключаемых устройств (до 10) и время работы.
Устанвка платформы в кластере kubernites предполагает использование выделенного сервера СУБД Postgers 11.x, в которой предварительно создается БД semdb
.
helm repo add inspark http://releases.inspark.ru/stable/ --username <> --password <>
(Логин и пароль к helm репозиторию передается в рамках партнерского соглашения).
helm repo update
example
)## 1. Секция GLOBAL Для задания исходных данных развертывания инстанса
# В global задаются параметры, которые используются во всех subcharts и charts .
# Значения, которые заданы в global заменяют default значения в charts
global:
environment:
## Настроки на подключение к Postgres (всегда обязательны)
pg_host: "<адрес БД>"
pg_db: "semdb"
pg_user: "postgres"
pg_pass: "postgres"
## Настройки подключения msghandler к MQTT
mqtt_host: "<адрес брокера MQTT>"
mqtt_user: "admin"
mqtt_password: "<пароль администратора MQTT>"
instance_name: "условное название инстанса (лат. буквы)"
ctrl_mqtt_login: "<login контроллера к брокеру MQTT>"
ctrl_mqtt_password: "<пароль контроллера к брокеру MQTT>"
## Настройки подключения к JMS серверау
jms_host: "<имя сервера artemis jms>"
jms_user: "<login host artemis jms>"
jms_password: "<password host artemis jms>"
## Настройки подключения к Redis серверу
redis_uri: "redis://<redis host>:<redis port>"
redis_host: "<redis host>"
## Настройки подключения к CASSANDRA и определения типа хранилища (по умолчанию Postgres)
store_type: "CASSANDRA"
store_nodes: "10.1.1.1:9042,10.1.1.2:9042,10.1.1.3:9042"
store_user: "cassandra"
store_datacenter: "datacenter1"
store_password: "cassandra"
## Настройки брокера loren
lorain_host: "<адрес брокера LORAWAN>"
lorain_token: "XXXXXX-a5eb-455d-a487-XXXXXXXXX"
## URL на магазин
wist_url: "<url магазина>"
## URL на сервс погоды
weather_host: "<адрес брокера-сервиса данных погоды>"
smtp_host: "<smtp host>"
smtp_user: "<user address for smtp host>"
smtp_password: "<password for login to smtp host>"
auth_session_timeout: 30
user_audit: false
ports:
pg_port: 5434
lorain_port: 8080
weather_port: 8085
smtp_port: 25
replicaQuote:
enabled: true
quoteClass: mini
## 2. Секция настройки сервисов
## Установить значимые настройки для subchart activemq
activemq:
persistence:
enabled: true
size: 4Gi
# existingClaim:
# storageClass: "-"
## Установить значимые настройки для subchart redis.
## Redis запусткается в режиме 1 узла
redis:
persistence:
enabled: true
size: 250Mi
# existingClaim:
# storageClass: "-"
# Настройки для subchart msghqndler манифеста
msghandler:
image:
repository: registry.infsys.ru/iss/msghandler
pullPolicy: IfNotPresent
tag: "latest"
# Настройка конфиг. файла прокси сервера, если нет сервера отчета и интеграций с Autodesk Forge - false
proxy:
config:
jasper: false
forge: false
## 3. Секция настройки парамтеров сервисов semnext
images:
webservices_repository: registry.infsys.ru/iss/semona-webservices
engine_repository: registry.infsys.ru/iss/semona-engine
periodic_repository: registry.infsys.ru/iss/semona-periodic
notifier_repository: registry.infsys.ru/iss/semona-notifier
semux_repository: registry.infsys.ru/iss/semux
pullPolicy: IfNotPresent
# tag задает метку для сборок semona-xxxx (все идут всегда с одним тегом)
tag: "latest"
# tag_semux задает метку только для контейнера semux
tag_semux: "latest"
## настройка для webservices тома /files
persistence:
enabled: true
## A manually managed Persistent Volume and Claim
## Requires persistence.enabled: true
## Для semona-webservices определен PVC nfs-files, который должен быть доступен для всех экз.
existingClaim: nfs-files
## The path the volume will be mounted at
path: /files
## If set to "-", storageClassName: "", which disables dynamic provisioning
# storageClass: "-"
accessModes:
- ReadWriteMany
size: 500Mi
## Persistent Volume selectors
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector
matchExpressions: {}
## 4. Секция параметров ingress
ingress:
enabled: true
certManager: true
hostname: demo.example.ru
annotations:
ingress.kubernetes.io/ssl-redirect: "true"
kubernetes.io/ingress.class: nginx
tls: true
## secrets:
## - name: example.local-tls
## key:
## certificate:
##
secretName: letsencrypt-secret
## 5. Настроить переменные приложения
## AD переменные
activedirectory:
enabled: false
url: ""
search_base: ""
## Вершина каталога от которой искать пользователей
user: ""
password: ""
suffix: ""
## Суффикс домена пользователя, не задавать если для входа будет использоваться полное
# имя входа (userPrincipalName ), в противном случаи задавать домен или его часть учетной записи пользователей.
# Например, для аутентификации пользователей из домена infsys.ru, чтобы пользователи вводили только имя входа, необходимо задать @infsys.ru.
# Например, для аутентификации пользователя в лесу Active Directiry из portal.cbr.ru и vip.cbr.ru, если searchBase задать dc=cbr,dc=ru
# и порт 3268, данный параметр необходимо задать .cbr.ru, тогда в качестве логина пользователя можно использовать часть userPrincipalName
# - semuser@portal, общая часть домена пользователя будет подставлена из параметра.
## включена ли отправка уведомлений
notify:
enabled: true
## тестовый режим отправки уведомлений. Пишутся в журнал.
enabled_test: false
## интеграционные настройки для AutoDesk Forge плагина
forge:
enabled: false
forge_id: "develop"
java_opt:
engine: "-Xms512m -Xmx2048m -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Addresses=true -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true"
periodic: "-Xms512m -Xmx2048m -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Addresses=true -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true"
webservices: "-Xms512m -Xmx1536m -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Addresses=true -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true"
log_level:
engine: "INFO"
periodic: "INFO"
webservices: "INFO"
## 6. подключить лицензию, если лицензия не указана , то используется POC лицензия с ограничениями на кол-во объектов и времени
license:
enabled: false
data: |
insert insparklicense
## 7. Секция параметров развертывания инстанса в K8
# лимиты по cpu установлены из расчета RAM 3Gb = 1vCPU
resources_engine:
limits:
cpu: 1000m
memory: 2560Mi
requests:
cpu: 300m
memory: 1536Mi
resources_periodic:
limits:
cpu: 500m
memory: 2560Mi
requests:
cpu: 100m
memory: 1536Mi
resources_semona:
limits:
cpu: 1000m
memory: 1792Mi
requests:
cpu: 300m
memory: 1536Mi
resources_notifier:
limits:
cpu: 500m
memory: 300Mi
requests:
cpu: 100m
memory: 100Mi
nodeSelector: {}
tolerations: []
affinity: {}
helm install <mqtt-brocker> inspark/collector -n example
при изменении параметров value.yaml - создайте собственный файл настроек.
NAMESPACE=example
# Имя подключенного репо helm-chart (10.2.2.55)
REPO=stable
TAG_HANDLER="3.8"
TAG_SEMONA="2.26"
TAG_SEMUX="2.12.0"
# Pre section, update repo
helm repo update
echo -e "ARTEMIS APACHE chart"
helm install jms -f env.yaml \
--set persistence.size=4Gi \
$REPO/activemq -n $NAMESPACE $DEBUG
echo -e "REDIS DB"
helm install dbmemory -f env.yaml \
--set persistence.size=250Mi \
$REPO/redis -n $NAMESPACE $DEBUG
sleep 1
echo -e "MSGHANDLER chart"
helm install handler -f env.yaml \
--set image.tag=$TAG_HANDLER \
$REPO/msghandler -n $NAMESPACE $DEBUG
echo -e "GRAPHITE chart"
helm install metric $REPO/graphite -n $NAMESPACE $DEBUG
echo -e "SEMONA chart"
helm install semona -f env.yaml \
--set images.tag=$TAG_SEMONA \
--set images.tag_semux=$TAG_SEMUX \
--set persistence.size=500Mi \
$REPO/semnext -n $NAMESPACE $DEBUG
Внимание! Лицензионные ограничения определены данными лицензии. В #6 helm манифеста необходимо указать данные лицензионного ключа. Если эти данные отсутствуют, то загружается POC лицензия. При нарушении лицензионных условий работа системы прерывается.
Для нагруженных инстансов возможна установка СУБД и брокера MQTT на отдельные сервера.
Ниже дана инструкция по устанвоке и настройке серверов Postgres и EMQX.
На примере emqttd-ubuntu16.04-v2.3.6_amd64.deb
Скачайте дистрибутив с официального сайта:
http://emqtt.io/downloads
Установите пакет emqttd:
dpkg -i emqttd-ubuntu16.04-v2.3.6_amd64.deb
Устанавливаем пакет «user-space access to Linux kernel SCTP - commandline tools»
apt-get install lksctp-tools
Запуск службы:
service emqttd start
Для подключения ключей TLS (обмен по порту 8883) выполните следующие настройки:
/etc/emqx/cert
скопировать ключи (server.key, server.pem, root.pem)## Path to the file containing the user's private PEM-encoded key.
##
## See: http://erlang.org/doc/man/ssl.html
##
## Value: File
listener.ssl.external.keyfile = /etc/emqx/certs/server.key
## Path to a file containing the user certificate.
##
## See: http://erlang.org/doc/man/ssl.html
##
## Value: File
listener.ssl.external.certfile = /etc/emqx/certs/server.pem
## Path to the file containing PEM-encoded CA certificates. The CA certificates
## are used during server authentication and when building the client certificate chain.
##
## Value: File
listener.ssl.external.cacertfile = /etc/emqx/certs/root.pem
Для того, что бы задействовать авторизацию с помощью concord необходимо правильно настроить emqttd.
Настройка авторизации через внешний http ресурс выполняется в файле:
/etc/emqttd/plugins/emq_auth_http.conf
Необходимо убедиться что верно настроены параметры указывающие на методы сервиса concord:
Далее необходимо всключить плагин emq_auth_http. Сделать это можно командой:
emqx_ctl plugins load emq_auth_http
Пример настройки файла emq_auth_http.conf
приведен ниже:
##--------------------------------------------------------------------
## HTTP Auth/ACL Plugin
##--------------------------------------------------------------------
##--------------------------------------------------------------------
## Authentication request.
##
## Variables:
## - %u: username
## - %c: clientid
## - %a: ipaddress
## - %P: password
## - %cn: common name of client TLS cert
## - %dn: subject of client TLS cert
##
## Value: URL
auth.http.auth_req = http://localhost:8081/concord/mqtt/auth
## Value: post | get | put
auth.http.auth_req.method = post
## Value: Params
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
##--------------------------------------------------------------------
## Superuser request.
##
## Variables:
## - %u: username
## - %c: clientid
## - %a: ipaddress
##
## Value: URL
auth.http.super_req = http://localhost:8081/concord/mqtt/super
## Value: post | get | put
auth.http.super_req.method = post
## Value: Params
auth.http.super_req.params = clientid=%c,username=%u
##--------------------------------------------------------------------
## ACL request.
##
## Variables:
## - %A: 1 | 2, 1 = sub, 2 = pub
## - %u: username
## - %c: clientid
## - %a: ipaddress
## - %t: topic
##
## Value: URL
auth.http.acl_req = http://localhost:8081/concord/mqtt/acl
## Value: post | get | put
auth.http.acl_req.method = get
## Value: Params
auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t
Платформа СУБД для оперативного хранилища использует реляционную СУБД. Платформа не предъявляет ограничений к типу СУБД. В текущей версии платформа использует СУБД PostgreSQL.
Создать файл PostgreSQL.list, добавить строку для репозитория в зависимости от версии ОС:
RELEASE=$(lsb_release -cs)
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/PostgreSQL.list
Проверить файл репозитория:
cat /etc/apt/sources.list.d/PostgreSQL.list
Например:
Для Ubuntu 16.04(xenial) должно быть:
deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
Для Ubuntu 18.04(bionic) должно быть:
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
Импортировать ключ репозитория:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
и обновить список пакетов:
apt-get update
Устанановить postgresql:
apt-get install postgresql-14
Проверить версию:\
psql --version
Рекомендуется версия PostgresSQL не ниже 11
Создаем выделенный том для БД. Например, диск /dev/sdb1
c каталогом '/pgstore'
, для этого:
mkdir /pgstore
/etc/fstab
UUID=4b2a649f-9668-4637-9d2c-c1d5eaf4fad1 /pgstore ext4 errors=remount-ro 0 1
mount /pgstore
Если в системе нету локали ru_RU.UTF-8, то
locale-gen ru_RU.UTF-8
При этом локаль должна быть установлена
dpkg-reconfigure locales
Включаем локаль в консоли
export LC_ALL=ru_RU.UTF-8
Перейти под пользователя postgres:
sudo su - postgres
Удаляем старый кластер базы данных, если он существует:
pg_dropcluster --stop 11(версия кластера) main(имя кластера, получить можно pg_lsclusters)
Остановить процесс postgresql и выйти из-под postgres:
sudo systemctl stop postgresql@11-main
logout
изменить владельца каталога:
sudo chown -R postgres:postgres /pgstore
Перейти под пользователя postgres:
sudo su - postgres
Создаем новый кластер
pg_createcluster -d /pgstore/11 --locale ru_RU.UTF-8 --start 11 main
Выйти из-под postgres и запустить службу СУБД:
logout
sudo systemctl daemon-reload
sudo systemctl start postgresql@11-main
В случае необходимости доступа к БД с серивос не локадльного размещения в файле /etc/postgresql/11/main/postgresql.conf
необходимо указать интерфейс(https://www.postgresql.org/docs/9.1/runtime-config-connection.html), на котором сервер БД будет слушать соединения, например на всех интерфейсах:
listen_addresses = '*'
Так же, в конфигурационном файле /etc/postgresql/11/main/pg_hba.conf
необходимо разрешить доступ к БД с сервера приложений и хранилища MongoDB, добавив следующие строчки:
host all all IP-сервера приложений/маска md5
host all all IP-хранилища Моngo DB/маска md5
Создать БД semdb
Пользователем postgres в psql выполнить:
CREATE DATABASE SEMDB WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8';
ALTER DATABASE SEMDB OWNER TO postgres;
В конфигурационном файле postgresql.conf для параметра max_prepared_transactions установить значение равным 200, значение по умолчанию для ПО InsparkIoT
max_prepared_transactions = 200 # zero disables the feature
В зависимости от MQTT сервера, название настроек может иметь другие названия. Ниже приведены названия параметров для EMQ. Установить размер пакета MQTT не меньше 2 Мб.
# Maximum MQTT packet size allowed. Value: Bytes Default: 64K
mqtt.max_packet_size = 2MB
Для того, что бы задействовать авторизацию с помощью concord необходимо настройть авторизацию через внешний http ресурс в файле: /etc/emqttd/plugins/emq_auth_http.conf
и убедиться в корректности указания параметров методов обращения к сервису concord:
auth.http.auth_req "http://<concord>:8080/concord/mqtt/auth"
auth.http.super_req "http://<concord>:8080/concord/mqtt/super"
auth.http.acl_req "http://<concord>:8080/concord/mqtt/acl"
где <concord>
адрес сервера с установленым приложением concord
Далее необходимо всключить плагин emq_auth_http командой:
# emqttd_ctl plugins load emq_auth_http
Создать директорию /opt/semona-notifier и поместить в нее sem-notifier.jar, application.yml, firebase.json
mkdir /opt/semona-notifier
cp sem-notifier /opt/semona-notifier
cp application.yml /opt/semona-notifier // основной файл настройки
cp firebase.json /opt/semona-notifier // для push уведомлений (необязательный)
Создать директорию для логов:
mkdir -p /var/log/semona-notifier
Настроить к ней путь в конфиге application.yml:
logging:
path: /var/log/semona-notifier
Создать символьную ссылку в директории /etc/init.d
cd /etc/init.d
chmod +x /opt/semona-notifier/sem-notifier.jar
ln -s /opt/semona-notifier/sem-notifier.jar notifier
Перечитать список сервисов linux
systemctl daemon-reload
Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service notifier start
service notifier status
service notifier stop
java -jar vault-2.jar
Настройки в файле application.yml следует настроить перед запуском.
spring:
# профили логирования, console - вывод в консоль, file - вывод в файл
profiles:
active: console
# подключение к БД для сохранения лога отправки NotifyLog
datasource:
url: jdbc:postgresql://12.12.12.12:5432/semtest?currentSchema=sem
driver-class-name: org.postgresql.Driver
username: postgres
password: postgres
hikari:
# размер пула конектов
maximum-pool-size: 30
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
jpa:
database: default
hibernate:
ddl-auto: validate
generate-ddl: false
show-sql: false
# уровни логирования модулей
## INFO, ERROR, TRACE
logging:
level:
root: INFO
notification-listener: INFO
expired-listener: INFO
notification-sender: INFO
emulator: INFO
# подключение к очередям JMS
artemis:
broker-url: tcp://12.12.12.12:61616
user: artemis
password: artemis
queue:
# настройки очереди получения уведомлений
# в artemis jms в файлк broker.xml должна быть настройка для уведомлений
notify:
# адрес очереди
destination: jms.queue.Notify
# количество потоков мин-макс
concurrency: 8-50
# настройки очереди получения просроченных уведомлений
expired:
# адрес очереди
destination: jms.queue.ExpiredNotifications
# количество потоков мин-макс
concurrency: 2-30
# эмулятор, предназначен для проверки работоспособности, в прод.среде должен быть выключен
emulator:
enabled: false
# настройки отправки сообщений
sender:
# режим тестовой отправки, используется для тестирования, вместо реальной отправки логирует сообщения в лог
test-mode: false
<address-setting>
....
<address-setting match="jms.queue.Notify">
<!-- через час сообщения устаревают и переносятся в очередь ExpiredNotifications -->
<expiry-address>jms.queue.ExpiredNotifications</expiry-address>
<expiry-delay>3600000</expiry-delay>
<!-- повторная отправка через: 20 sec, 30 sec, 45 sec, ..., 300 sec -->
<redelivery-delay>20000</redelivery-delay>
<redelivery-delay-multiplier>1.5</redelivery-delay-multiplier>
<max-redelivery-delay>300000</max-redelivery-delay>
<!-- 50 неудачных отправок достаточно будет -->
<max-delivery-attempts>50</max-delivery-attempts>
....
</address-setting>
<address>
....
<address name="jms.queue.Notify">
<anycast>
<queue name="jms.queue.Notify"/>
</anycast>
</address>
<address name="jms.queue.ExpiredNotifications">
<anycast>
<queue name="jms.queue.ExpiredNotifications"/>
</anycast>
....
</address>
~/semnext_update
;/tmp/
инстанс-сервера./artifacts/sem-next_env.sh
./artifacts/
├── artifacts \\Артифакты с обновлениями
│ ├── application.yml
│ ├── concord
│ │ └── target
│ │ └── concord.war
│ ├── concord.xml
│ ├── engine
│ │ └── target
│ │ └── engine.war
│ ├── firebase.json
│ ├── logback-spring.xml
│ ├── msghandler
│ │ └── target
│ │ └── msghandler.war
│ ├── msghandler.xml
│ ├── periodic
│ │ └── target
│ │ └── periodic.war
│ ├── sem-next_env.sh \\ Переменные окружения
│ ├── sem-next.xml
│ ├── sem-notifier
│ │ └── target
│ │ └── sem-notifier.jar
│ ├── semux
│ │ └── target
│ │ └── semux.war
│ ├── standalone-full.xml
│ ├── target
│ │ └── version
│ └── webservices
│ └── target
│ └── sem-restservices.war
├── java \\ Плей для установки Java
├── playbook.yml \\ Основной плейбук
├── requirements.yml
└── wildfly \\ Плей установки wildfly
├── modules \\ Дополнительные модули wildfly
├── playbook.yml
/tmp/wildfly-servlet-20.0.0.Final.tar.gz
~/semnext_update/wildfly/modules/
~/semnext_update/artifacts/
/etc/profile.d/sem-next_env.sh
../artifacts/sem-next_env.sh
ansible-playbook ~/semnext_update/playbook.yml
В папку %Wildfly%/standalone/configuration
необходимо положить лицензионный ключ. Если файл отсутствует, модули прервут свою работу.