Приведены инструкции по установке на ОС Debian/Ubuntu с JDK версии 11 или выше.
Платформа в качестве оперативного хранилища использует реляционную СУБД PostgreSQL 14.
Настройка сервера (минимально необходимые):
/etc/sysctl.conf
# отключить подкачку
vm.swappiness = 0
# увеличить дескрипторы
fs.file-max = 655350
выполните
sysctl -p
В файле /etc/security/limits.conf
# Core dump size
* - core unlimited
# Open files
* - nofile 655350
# Processes
* - nproc 8192
Создаем лист с репозитраерием:
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
Импортировать ключ репозитория:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
и обновить список пакетов:
apt-get update
Установить postgresql:
apt-get install postgresql-14
Установить расширение PostGIS:
apt update
apt install postgresql-14-postgis-3
Конифгураця Postgres расположена в /etc/postgresql/14/main/postgresql.conf
офф док.
# шифрование пароля MD5, совместимое с semnext
password_encryption = md5
# прослушивание интерфейсов, без IpV6 желательно прописывать так: listen_addresses = '0.0.0.0'
listen_addresses = '0.0.0.0'
# максимальное количество подключений, должно быть на 3 подключения больше чем используемые приложениями максимумы пулов (в конфигах приложений), не должно быть слишком большим
max_connections = 200
# буферы, примерно 1/3 доступной оперативной памяти сервера (для сервера где только БД)
shared_buffers = 2048MB
# буферы сортировки и проч
temp_buffers = 16MB
# память процесса
work_mem = 8MB
# память обслуживания (256 это минимум, для серверов с достаточно большими объемами (более 8гиг) желательно выделить 512MB или 1024MB)
maintenance_work_mem = 256MB
# потоки отправки для репликации (если репликации нет - крайне желательно отключить)
max_wal_senders = 0
# уровень журналов предварительной записи, влияние на IO крайне значительное, чем меньше тем лучше
wal_level = minimal
# размеры журналов увеличить, особенно актуально на сервере гда измерения сохраняются в постгрес а не в кассандру (переключение журнала сложная и затратная процедура, переключения должны быть реже)
max_wal_size = 1GB
min_wal_size = 80MB
Настройки доступа храняться в /etc/postgresql/14/main/pg_hba.conf
. Необходимо разрешить доступ к БД с сервера приложений и хранилища MongoDB, добавив следующие строчки:
host all all IP-сервера приложений/маска md5
host all all IP-хранилища Моngo DB/маска md5
Создаем выделенный том для БД. Например, диск /dev/sdb1
c каталогом '/pgstore'
, для этого:
mkdir /pgstore
/etc/fstab
UUID=4b2a649f-9668-4637-9d2c-c1d5eaf4fad1 /pgstore ext4 errors=remount-ro 0 1
Выполнить
mount /pgstore
изменить владельца каталога:
sudo chown -R postgres:postgres /pgstore
Перейти под пользователя postgres:
sudo su - postgres
Удаляем кластер базы данных, который был создан по умолчанию при установке, и останавливаем postgresql:
pg_dropcluster --stop 14(версия кластера) main(имя кластера, получить можно pg_lsclusters)
sudo systemctl stop postgresql@14-main
logout
Создаем новый кластер и запускаем службу СУБД:
sudo su - postgres
pg_createcluster -d /pgstore/14 --locale ru_RU.UTF-8 --start 14 main
logout
sudo systemctl daemon-reload
sudo systemctl start postgresql@14-main
Создаем БД semdb
Пользователем postgres выполнить psql -U postgres -h
и там уже:
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;
Подключиться к БД SEMDB и включить в ней расширение:
psql -U postgres -h localhost semdb
semdb> create extension postgis;
semdb> select postgis_version();
Актуальные способы установки доступны по ссылке.
Добавляем репозиторий
echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
Добавляем ключи
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
Обновляем список пакетов
sudo apt update
Устанавливаем БД Cassandra
sudo apt-get install cassandra
После установки БД необходимо изменить способ доступа к БД. В директории /etc/cassandra отредактировать файл cassandra.yaml
Изменить
authenticator: AllowAllAuthenticator
На
authenticator: PasswordAuthenticator
По умолчанию при инсталляции системы создается пользователь cassandra
с паролем cassandra
. Для доступа в консоль администрирования БД введите
cqlsh -u cassandra -p cassandra
После входа и авторизации в консоли администрирования мы можем создать пользователя
CREATE USER worker WITH PASSWORD 'worker';
В случае если планируется использовать более 1 экземпляра БД, их необходимо объединить в кластер БД.
В файле cassandra.yaml
необходимо внести следующие изменения:
isten_address: IP-адрес где установлена БД
rpc_address: IP-адрес где установлена БД
seeds: Указать перечисление IP-адресов которые должны входить в кластер.
Примечание: На каждом сервере необходимо настраивать seeds
следующим образом: Сначала указываем IP:порт текущего сервера, далее перечисление других серверов которые должны входить в кластер.
Пример:
- seeds: "2.2.2.2:7000(IP-адрес конфигурируемого сервера),1.1.1.1:7000(перечисление остальных IP-адресов),4.4.4.4:7000,3.3.3.3:7000"
В завершении настроек для кластера необходимо создать пространство ключей
CREATE KEYSPACE sem WITH REPLICATION = {'class':'NetworkTopologyStrategy', 'datacenter1' : N};
В случае если в кластере будет находится всего один сервер то N - 1, если же в кластере будет 2 и более серверов то N - 2
Обновляем список пакетов репозиториев
sudo apt update
Устанавливаем redis-server
sudo apt install -y redis-server
Проверьте подключение к базе. По умолчанию для доступа к базе пароль не требуется:
redis-cli
127.0.0.1:6379> PING
Добавьте сервис в список приложений, запускаемых автоматически:
sudo systemctl enable redis-server
Создаем служебных пользователей artemis
sudo groupadd artemis && \
sudo useradd -s /bin/false -g artemis -d /opt/artemis artemis
Переходим в директорию /opt и скачиваем Artemis 2.16.0
wget https://archive.apache.org/dist/activemq/activemq-artemis/2.16.0/apache-artemis-2.16.0-bin.tar.gz
Разархивируем скачанных архив и создадим на него символьную ссылку
sudo tar -xvzf apache-artemis-2.16.0-bin.tar.gz
sudo ln -s /opt/apache-artemis-2.16.0 ./artemis
Изменяем права доступа для разархивированной папки
sudo chown -RH artemis:artemis /opt/artemis
sudo chmod o+x /opt/artemis/bin/
Переходим в директорию /var/lib и в ней выполняем
sudo /opt/artemis/bin/artemis create artemis-broker
Во время создания брокера необходимо будет задать имя пользователя и пароль для доступа к брокеру.
После установки брокера по умолчанию доступ к web-консоли будет только на localhost:8161
, для того чтобы получить удаленный доступ к консоли необходимо будет отредактировать файлы bootstrap.xml
и jolokia-access.xml
которые находятся по пути /var/lib/test-broker/etc/
В файле boostrap.xml
замените в тегах :
<web bind="http://localhost:8161" path="web">
На
<web bind="http://0.0.0.0:8161" path="web">
Далее в файле jolokia-access.xml
замените следующую строку:
<allow-origin>*://localhost*</allow-origin>
На
<allow-origin>*://*</allow-origin>
Также необходимо создать файл broker.xml
в директории /var/lib/test-broker/etc/ который содержит в себе информацию о очередях.
Пример настроенного файла доступен по ссылке.
После завершения настроек необходимо создать службу SystemD для управления приложением. По пути /etc/systemd/system создаем файл artemis.service
и добавляем туда следующий код:
[Unit]
Description=Apache ActiveMQ Artemis
After=network.target
[Service]
Type=forking
User=artemis
Group=artemis
ExecStart=/var/lib/artemis-broker/bin/artemis-service start
ExecStop=/var/lib/artemis-brokerr/bin/artemis-service stop
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
После создания сервиса обновите список сервисов:
sudo systemctl daemon-reload
Перед установкой потребуется создать служебного пользователя для сервера приложений
sudo groupadd -r wildfly sudo useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
Переходим в директорию /opt и скачиваем WildFly
wget https://download.jboss.org/wildfly/20.0.1.Final/wildfly-20.0.1.Final.tar.gz
Разархивируем сервер приложений
tar xf /opt/wildfly-20.0.1.Final.tar.gz -C /opt/
Создаем символьную ссылку на директорию
ln -s /opt/wildfly-20.0.1.Final /opt/wildfly
Изменяем владельца директории
chown -RH wildfly:widlfly /opt/wildfly
Создаем каталог, в котором будет храниться файл конфигурации WildFly
mkdir -p /etc/wildfly
Копируем файл конфигурации в созданный каталог
cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly/
Редактируем файл конфигурации
WILDFLY_CONFIG=standalone-full.xml
WILDFLY_MODE=standalone
WILDFLY_BIND=0.0.0.0
Этот файл позволяет указать режим WildFly и адрес привязки. По умолчанию WildFly будет работать в автономном режиме и будет прослушивать все интерфейсы. Вы можете редактировать файл в соответствии с вашими потребностями.
Затем копируем launch.sh
скрипт WildFly в /opt/wildfly/bin/ каталог
cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin/
Скрипты внутри bin
каталога должны иметь флаг исполняемого файла
sh -c 'chmod +x /opt/wildfly/bin/*.sh'
Копируем файл модуля systemd
с именем в /etc/systemd/system/ каталог
cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system/
После создания сервиса обновите список сервисов
sudo systemctl daemon-reload
На примере 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)...
## Value: File
listener.ssl.external.keyfile = /etc/emqx/certs/server.key
...
listener.ssl.external.certfile = /etc/emqx/certs/server.pem
listener.ssl.external.cacertfile = /etc/emqx/certs/root.pem
Модуль concord выполняет авторизацию клиентов MQTT при подключении к брокеру MQTT.
Ниже приведена инструкция его установки
concord.jar
, application.yml
mkdir /opt/concord
cp concord.jar /opt/concord
cp application.yml /opt/concord
cd /etc/init.d
chmod +x /opt/concord/concord.jar
ln -s /opt/concord/concord.jar concord
systemctl daemon-reload
service concord start
service concord status
service concord stop
application.yml
. Прежде всего следует настроить способ логирования (для докеров принято логировать в консоль, для standalone установок в файлы):spring:
# профили логирования, console - вывод в консоль, file - вывод в файл
profiles:
active: console
Порт HTTP сервера на котором работает конкорд можно поменять при необходимости:
# порт http сервера
server:
port: 8741
Так же следует внести в настройки доступы пользователей. Пользователи с признаком администратора (admin: true) имеют возможность подписываться и публиковать сообщения во все без исключения топики.
Пользователи с признаком (init: true) являются специальными пользователями и имеют доступ к общим топикам инициализации контроллера для возможности его начальной инициализации.
Обычные пользователи имеют возможность публикации и подписки в суб-топики, начинающиеся с топиков их имени. Например пользователь user1 сможет подписаться на любые топики начинающиеся с /user1/ (например /user1/#).
Так же всем пользователям доступна подписка на системные топики функционирования брокера $SYS/broker/.
В файле application.yml приведены примеры, которые показывают все необходимые настройки, требуется сделать по аналогии.
Для того, что бы задействовать авторизацию с помощью 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
доступен по ссылке.
В зависимости от 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
Установка модуля осуществляется путем копированием файла lorain.war
в директорию /opt/wildfly/standalone/deployments
Модуль конфигурируется в файле semnext.xml
который находится в директории /opt/wildfly/standalone/configuration
<lorain>
<uri>http://localhost:8080/lorain/api</uri>
<token description="Токен сервера LORIAN">111111</token>
</lorain>
Создать директорию /opt/nbiot-gate и поместить в нее nbiot-gate.jar
, application.yml
mkdir /opt/nbiot-gate
cp nbiot-gate.jar /opt/nbiot-gate
cp application.yml /opt/nbiot-gate
Создать символьную ссылку в директории /etc/init.d
cd /etc/init.d
chmod +x /opt/nbiot-gate/nbiot-gate.jar
ln -s /opt/nbiot-gate/nbiot-gate.jar nbiot-gate
Перечитать список сервисов linux
systemctl daemon-reload
Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service nbiot-gate start
service nbiot-gate status
service nbiot-gate stop
Настройки содержатся в файле application.yml
который должен располагаться в директории запуска (т.е. рядом с nbiot-gate.jar
).
Прежде всего следует настроить способ логирования (для докеров принято логировать в консоль, для standalone установок в файлы):
spring:
# профили логирования, console - вывод в консоль, file - вывод в файл
profiles:
active: console
Параметры подключения к БД - нужно задать url, пользователя и пароль
spring:
datasource:
# подключение к БД (урл, пользователь, пароль)
url: jdbc:postgresql://127.0.0.1:5432/semdb?currentSchema=sem
username: postgres
password: admin
Параметры подключения к JMS брокеру Artemis - нужно задать url, пользователя и пароль
artemis:
url: tcp://localhost:61616
user: artemis
password: artemis
Параметры подключения к MQTT брокеру - нужно задать url, пользователя и пароль
mqtt:
url: tcp://localhost:1883
user: admin
password: user
Сервис запускается один раз и создает в БД таблицы, связи и т.д
Запускается как java-приложение: java -jar migrator.jar
Логи формируются в директории logs, с ротацией.
Настройки содержатся в файле application.yml
который должен располагаться в директории запуска migrator.jar
Основные настройки - это параметры подключения к БД postgres:
spring:
datasource:
url: jdbc:postgresql://192.168.1.13:5432/semdb?currentSchema=sem
username: postgres
password: postgres
И настройки подключения к Cassandra, задать имя датацентра, ноды и учетные данные для подключения:
# хранилище sem-next
store:
# тип хранилища (POSTGRES, CASSANDRA)
type: CASSANDRA
# настройки, специфичные для хранилища CASSANDRA
cassandra:
# Ноды кассандры для подключения, одна или более. Формат host1:port1,host2:port2,.... Пример 192.168.0.14:9042.
nodes: 192.168.0.14:9042
# Имя датацентра кассандры (см nodetool status)
datacenter: datacenter1
# имя пользователя для авторизованного доступа
username: cassandra
# пароль пользователя для авторизованного доступа
password: cassandra
В случае если Cassandra не используется следует выбрать тип хранилища POSTGRES:
# хранилище sem-next
store:
# тип хранилища (POSTGRES, CASSANDRA)
type: POSTGRES
Установка модулей осуществляется путем копированием файла sem-restservices.war
и periodic.war
в директорию /opt/wildfly/standalone/deployments
Создать директорию /opt/sem-engine и поместить в нее sem-engine.jar
, application.yml
mkdir /opt/sem-engine
cp sem-engine.jar /opt/sem-engine
cp application.yml /opt/sem-engine
Создать символьную ссылку в директории /etc/init.d
cd /etc/init.d
chmod +x /opt/sem-engine/sem-engine.jar
ln -s /opt/sem-engine/sem-engine.jar sem-engine
Перечитать списко сервисов linux
systemctl daemon-reload
Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service sem-engine start
service sem-engine status
service sem-engine stop
Для установки лимитов памяти нужно создать в директории sem-engine файл конфигурации sem-engine.conf
и задать в нем нужные лимиты:
JAVA_OPTS="-Xms512m -Xmx1024m"
Создать директорию /opt/sem-handler и поместить в нее sem-handler.jar
, application.yml
mkdir /opt/sem-handler
cp sem-handler.jar /opt/sem-handler
cp application.yml /opt/sem-handler
cd sem-handler.conf /opt/sem-handler
Создать символьную ссылку в директории /etc/init.d
cd /etc/init.d
chmod +x /opt/sem-handler/sem-handler.jar
ln -s /opt/sem-handler/sem-handler.jar sem-handler
Перечитать списко сервисов linux
systemctl daemon-reload
Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service sem-handler start
service sem-handler status
service sem-handler stop
Для установки лимитов памяти нужно создать в директории sem-handler.jar файл конфигурации sem-handler.conf и задать в нем нужные лимиты:
JAVA_OPTS="-Xms512m -Xmx1024m"
Создать директорию /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 sem-notifier.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
Выполняется путем изменения файла broker.xml apache artemis
<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>