OmegaBI analytics deploy
Задача: собрать работающую систему OmegaBI на одной ВМ.
В эталонном варианте сервисы были распределены следующим образом:
front (10.0.4.138): openresty, keycloak, druid, payara, kafka
back (10.0.4.212): postgresql, couchdb, nifi
Выбираем URL проекта: https://bio6.gkomega.ru, регистрируем поддомен и создаем SSL-сертификат.
В том случае, если наша ВМ не имеет прямого внешнего IP-адреса в сети интернет, необходимо создать запись virtualhost на корневом nginx.
Содержимое /etc/nginx/sites-enabled/bio6.gkomega.ru.conf
server {
server_name bio6.gkomega.ru;
location / {
proxy_pass http://10.33.8.28;
include proxy_params;
}
listen 443 ssl;
include /etc/nginx/ssl/gkomega_wc.conf;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = bio6.gkomega.ru) {
return 301 https://$host$request_uri;
}
listen 80;
server_name bio6.gkomega.ru;
return 404;
}
Java
Apache Druid официально поддерживает только Java 8. Поэтому надо ставить эту версию.
Все другие версии java лучше удалить, или надо устанавливать переменную окружения
OpenResty
Приложение frontend angular лежит в папке /home/openresty/Workspace/arm-analytics-spb
Пересборка проекта angular
- Скачать исходный код приложения:
- Установить компоненты сборки:
После окончания установки:
- Далее все действия будем производить в корневой папке проекта: /data/openresty/work/omegabi-v02 Добавить в файл описания конфигураций angular.json секцию с параметрами нового проекта:
"bio6-gkomega-ru": {
"budgets": [
{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.bio6-gkomega-ru.ts"
}
],
"assets": [
{
"glob": "favicon.ico",
"input": "src/assets/conf/bio6-gkomega-ru/",
"output": "/"
},
{
"input": "src/assets/",
"output": "/assets/",
"glob": "**/*",
"ignore": [
"conf/*.json",
"**/*.*~"
]
},
{
"input": "src/assets/conf/bio6-gkomega-ru/",
"output": "/assets/",
"glob": "keycloak.json"
}
]
},
- Добавить папку проекта bio6-gkomega-ru в подкаталог src/assets/conf и исправляем параметр auth-server-url на выбранный нами домен в файле src/assets/conf/bio6-gkomega-ru/keycloak.json
cat src/assets/conf/bio6-gkomega-ru/keycloak.json
{
"realm": "analytics",
"auth-server-url": "https://bio6.gkomega.ru/auth/",
"ssl-required": "none",
"resource": "app-analytics",
"public-client": true,
"verify-token-audience": true,
"use-resource-role-mappings": true,
"confidential-port": 0
}
Если запрос идет через внешний прокси по HTTPS, то “ssl-required”: “external”
- Создаем файл переменных окружения src/environments/environment.bio6-gkomega-ru.ts
import { version } from '../../package.json';
export const environment = {
title: 'OmegaBI',
production: true,
version: version,
host: 'https://bio6.gkomega.ru',
base: 'https://bio6.gkomega.ru',
api: 'https://bio6.gkomega.ru/arm/api',
druid: {
broker: 'https://bio6.gkomega.ru/druid/v2',
coordinator: 'https://bio6.gkomega.ru/druid/coordinator/v1',
indexer: 'https://bio6.gkomega.ru/druid/indexer/v1'
},
cdb: {
api: "https://bio6.gkomega.ru/cdb",
cred: "YWRtaW46YWRtaW4="
},
thetaSketchSize: 262144,
restrictedColumns: [],
defaults: {
"pivot-report": {
"статистика сайта ГИСП": {
"columns": ["Год", "Месяц"],
"rows": ["Тип ссылки"]
}
},
"PLOTTING-TR-4": {
"title": "Круговая диаграмма с детализацией",
"dataSource": "Проект ПФХД",
"dimensions": ["Этап "],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort",
"drillLevel1": "Распорядитель",
"drillLevel2": "Типология",
"drillLevel3": "Учреждение",
"allowCrossFilter": false,
},
"PLOTTING-BAR": {
"title": "Столбчатая диаграмма с детализацией",
"dataSource": "Проект ПФХД",
"dimensions": ["Этап "],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort",
"drillLevel1": "Распорядитель",
"drillLevel2": "Типология",
"drillLevel3": "Учреждение",
"drillLevel4": ""
},
"plotting-hierarchy": {
"title": "Иерархия",
"dataSource": "Проект ПФХД",
"dimensions": ["Распорядитель", "Типология", "Учреждение"],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort",
"drillLevel1": "Распорядитель",
"drillLevel2": "Типология",
"drillLevel3": "Учреждение"
},
"plotting-heatmap": {
"title": "Тепловая карта",
"dataSource": "Проект ПФХД",
"dimensions": ["Учреждение", "Этап "],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort",
"drillLevel1": "Группа должности",
"drillLevel2": "",
"drillLevel3": "",
},
"Voting": {
"title": "Опросник",
"dataSource": "Структура базового норматива затрат",
"dimensions": ["НаименованиеГосУслуги"],
"metrics": ["Доля", "Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort"
},
"Radar": {
"title": "Радар",
"dataSource": "Структура базового норматива затрат",
"dimensions": ["Распорядитель", "ТипПоказателя"],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Do not sort",
"groupBy": "ТипПоказателя",
"sliderBy": "Распорядитель",
"scale": "linear",
"percentView": false,
"showCenterSumm": false,
"isPercentView": false,
"allowCrossFilter": false,
"showAxisLabels": true,
},
"PLOTTING-TR-8": {
"title": "Датчик",
"dataSource": "Принято Уволено от ДИТ",
"dimensions": [],
"reportType": "Over a period",
"metrics": ["Уволено"]
},
"PLOTTING-TR-9": {
"title": "Линейная диаграмма с детализацией",
"dataSource": "Проект ПФХД",
"dimensions": ["Этап "],
"metrics": ["Сумма"],
"reportType": "Over a period",
"sortType": "Metric",
"drillLevel1": "Учреждение",
"drillLevel2": "НаименованиеВидаРасходов",
"drillLevel3": "НаименованиеОСГУ",
"drillLevel4": ""
}
},
kc: {
"realm": 'analytics',
"clientId": 'app-analytics',
"url": 'https://bio6.gkomega.ru/auth'
}
};
В этом файле надо проверить, чтобы везде были правильные ссылки: https://bio6.gkomega.ru
- Запускаем сборку angular-проекта:
После успешной сборки увидим такую картинку:
Обновление ядра angular
PostgreSQL
Устанавливаем и настраиваем СУБД PostgreSQL.
$ sudo apt-get install language-pack-ru
$ sudo locale-gen ru_RU.UTF-8
$ sudo localectl set-locale LANG=ru_RU.UTF-8
$ sudo apt install postgresql
$ sudo -u postgres
$ createdb analytics -E UTF8 -l en_US.UTF-8 -T template
$ sudo -u postgres psql
postgres=# CREATE USER analytics WITH PASSWORD '123456';
postgres=# GRANT ALL PRIVILEGES ON DATABASE analytics TO analytics;
postgres=# \q
$ psql -d analytics < analytics-210226.sql
$ echo -e "host\tanalytics\tanalytics\t10.33.8.52/24\tmd5" >> /etc/postgresql/9.5/main/pg_hba.conf
$ echo -e "listen_addresses = '*'" >> /etc/postgresql/9.5/main/postgresql.conf
$ exit
$ sudo systemctl restart postgresql
Импортируем БД из дампа:
Проверим настройки OLAP куба:
analytics=# select * from olap_properties;
id | code | name | prop_value
------+---------------+-------------------------+--------------------------------------------------
8551 | broker | Брокер | http://omegabi.gkomega.ru/druid/v2
8301 | indexer | Индексатор | http://omegabi.gkomega.ru/druid/indexer/v1
8302 | coordinator | Координатор | http://omegabi.gkomega.ru/druid/coordinator/v1
8552 | historical | Исторический узел | http://omegabi.gkomega.ru/druid/historical/v1
8553 | middleManager | Менеджер среднего звена | http://omegabi.gkomega.ru/druid/middleManager/v1
(5 rows)
Необходимо поменять на URL (endpoint) текущего хоста:
update olap_properties set prop_value = 'http://bio6/druid/v2' where id = 8551;
update olap_properties set prop_value = 'http://bio6/druid/indexer/v1' where id = 8301;
update olap_properties set prop_value = 'http://bio6/druid/coordinator/v1' where id = 8302;
update olap_properties set prop_value = 'http://bio6/druid/historical/v1' where id = 8552;
update olap_properties set prop_value = 'http://bio6/druid/middleManager/v1' where id = 8553;
###
update olap_properties set prop_value = 'https://newomegabi.gkomega.ru/druid/v2' where id = 8551;
update olap_properties set prop_value = 'https://newomegabi.gkomega.ru/druid/indexer/v1' where id = 8301;
update olap_properties set prop_value = 'https://newomegabi.gkomega.ru/druid/coordinator/v1' where id = 8302;
update olap_properties set prop_value = 'https://newomegabi.gkomega.ru/druid/historical/v1' where id = 8552;
update olap_properties set prop_value = 'https://newomegabi.gkomega.ru/druid/middleManager/v1' where id = 8553;
После этих обновлений запросы в OLAP-куб пойдут по локальной сети на “местный” druid, а не в “обход” через интернет.
Чтобы это работало, необходимо убедиться, что есть соответстующая запись в файле /etc/hosts
Payara
Скачиваем (для пример 5.20)
wget https://search.maven.org/remotecontent?filepath=fish/payara/distributions/payara/5.2020.2/payara-5.2020.2.zip -O payara-520.zip
Сервис payara 5.20 нормально заработал у меня только на java 11.
Чтобы задать версию java, надо добавить в файл /data/payara/glassfish/config/asenv.conf строку:
Сервис Payara
Создаем файл сервиса /lib/systemd/system/payara.service
[Unit]
Description=Payara Server
After=network.target remote-fs.target
[Service]
User=payara
WorkingDirectory=/data/payara/glassfish
Environment=DOMAIN=domain1
#Environment=DOMAIN=production
#Environment=JAVA_PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin
#Environment=PATH=/data/payara/glassfish/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/lib/jvm/java-8-openjdk-amd64/db/bin:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin
Environment=PATH=/data/payara/glassfish/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin:/usr/lib/jvm/java-11-openjdk-amd64/db/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin
#Environment=PATH=/data/payara/glassfish/bin:/data/payara/bin
Type=oneshot
RemainAfterExit=yes
ExecStart=/data/payara/glassfish/bin/asadmin start-domain $DOMAIN
ExecReload=/data/payara/glassfish/bin/asadmin restart-domain $DOMAIN
ExecStop=/data/payara/glassfish/bin/asadmin stop-domain $DOMAIN
TimeoutStartSec=300
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
Создание пула
Скачать и добавить драйвер jdbc для postgres
$ wget https://jdbc.postgresql.org/download/postgresql-42.2.14.jar && cp postgresql-42.2.14.jar payara-5.2020.2/glassfish/domain/domain1/lib
Создать пул соединений jdbc:
asadmin> create-jdbc-connection-pool –datasourceclassname org.postgresql.xa.PGXADataSource –restype javax.sql.XADataSource –property serverName=host:portNumber=5432:databaseName=analytics:user=analytics:password=**** analytics
Создать ресурс JDBC:
Развернуть предоставленное приложение:
Проверка пула
Далее, создаем запускаем домен и проверяем пул и приложения.
su - payara
cd ~/bin
./asadmin stop-domain
./asadmin start-domain
./asadmin ping-connection-pool analytics
./asadmin list-applications
./asadmin list-jvm-options
Запускается, как java приложение через Glassfish на порту tcp6 4848
Можно войти в ПУ payara: http://10.33.8.52:4848
Смену пароля администратора можно сделать так:
На запрос о вводе текущего пароля надо ввести “пустой” пароль (enter).
Установил пароль: 123456
Далее, надо разрешить удаленные подключения к ПУ Payara:
~/payara-5.201/bin/asadmin --port 4848 enable-secure-admin
~/payara-5.201/bin/asadmin stop-domain
~/payara-5.201/bin/asadmin start-domain
При подключении будет такая картинка:
Deploy backend from sources
Забираем исходный код:
Смотрим список профилей:
При сборке возникла ошибка:
Non-resolvable parent POM for ru.spb.analytics:OmegaBI-api-web:1.0-SNAPSHOT: Could not find artifact ru.spb.analytics:OmegaBI-api:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 4, column 13
В этом источнике обсуждается проблема:
https://stackoverflow.com/questions/7612309/maven-non-resolvable-parent-pom
Похоже, что артефакт забирается из частного репозитория, analytics.spb.ru
Установка профиля stage
После сборки в каталоге target появится артефакт - war-файл.
Деплой war-приложения:
/data/payara/glassfish/bin/asadmin deploy --force --name arm --contextroot arm target/OmegaBI-api-web-1.0-SNAPSHOT.war
Если приложение уже было, то его можно убрать такой командой:
Проверить список установленных приложений:
Создание пула
Команда создания пула:
bin/asdamin create-jdbc-connection-pool --datasourceclassname org.postgresql.xa.PGXADataSource --restype javax.sql.XADataSource --property serverName=localhost:portNumber=5432:databaseName=analytics:user=analytics:password=123456 analytics
Couchdb
sudo apt-get install -y apt-transport-https gnupg ca-certificates
echo "deb https://apache.bintray.com/couchdb-deb xenial main" | sudo tee -a /etc/apt/sources.list.d/couchdb.list
sudo apt update
sudo apt install -y couchdb
На вопрос о пароле пользователя admin, вводим “admin”
Список БД можно посмотреть так:
$ curl -u admin:admin localhost:5984/_all_dbs | jq
"_replicator",
"_users",
"grid",
"panels",
"ref-depts",
"ref-grades",
"ref-oiv-groups",
"ref-oivs",
"ref-ov-struc",
"ref-position-families",
"ref-positions"
## Вариант 2.
$ ls -1 /var/lib/couchdb/shards/00000000-7fffffff/*.couch | awk '{ FS="/"; $0=$0; print $7}'
Выгружаем данные из всех баз:
$ for DBC in _replicator _users grid panels ref-depts ref-grades ref-oiv-groupd ref-oivs ref-ov-struc ref-position-families ref-positions; do curl -u admin:admin localhost:5984/$DBC/_all_docs?include_docs=true | jq '{"docs": [.rows[].doc]}' | jq 'del(.docs[]._rev)' > $DBC.json; done
Создаем базы на целевом хосте:
$ for DBC in _replicator _users grid panels ref-depts ref-grades ref-oiv-groupd ref-oivs ref-ov-struc ref-position-families ref-positions; do curl -X PUT -u admin:admin localhost:5984/$DBC; done
Загружаем данные:
for DBC in _replicator _users grid panels ref-depts ref-grades ref-oiv-groupd ref-oivs ref-ov-struc ref-position-families ref-positions; do curl -d @$DBC.json -H "Content-Type: application/json" -u admin:admin -X POST http://localhost:5984/$DBC/_bulk_docs; done
Для одной таблицы:
for DBC in panels; do curl -d @$DBC.json -H "Content-Type: application/json" -u admin:admin -X POST http://localhost:5984/$DBC/_bulk_docs; done
Чтобы работало взаимодействие с БД необходимо поменять bind listener:
$ sed -e 's/127.0.0.1/0.0.0.0/' /opt/couchdb/etc/default.d/10-bind-address.ini
$ systemctl restart couchdb
NiFi
Раcпаковываем и запускаем.
Проверим статус:
Java home:
NiFi home: /opt/nifi
Bootstrap Config File: /opt/nifi/conf/bootstrap.conf
2021-02-02 10:06:43,383 INFO [main] org.apache.nifi.bootstrap.Command Apache NiFi is currently running, listening to Bootstrap on port 45349, PID=14601
Kafka
Keycloak
Работает не сервере приложений WildFly
Добавить пользователя:
$ /home/keycloak/keycloak-11.0.0/bin# ./add-user-keycloak.sh -r master -u admin -p 123456
$ systemctl restart keycloak
$ /home/keycloak/keycloak-11.0.0/bin/add-user.sh
Поставил пароль: 123456 (хотя не рекомендуют такой простой)
To represent the user add the following to the server-identities definition
Лог-файл тут: /home/keycloak/outdated-keycloak-9.0.3/standalone/log
Заходим через ssh-туннель в http://127.0.0.1:9990
Здесь можно управлять пользователями. В основном боевом варианте (sitcenter.gkomega.ru) это не настроено.
Реальная панель keylock доступна по URL:
https://biu5.gkomega.ru/auth/admin
Здесь надо проверить и поправить все ссылки на вкладке “Клиенты”.
Druid
Ошибка 1:
WARN [Coordinator-Exec--0] org.apache.druid.server.coordinator.rules.LoadRule - No available [_default_tier] servers or node capacity to assign segment
Сервис supervisor в демо-варианте можно остановить - он нужен для взаимодействия с kafka.
Ошибка 2:
Решается удалением каталога метаданных /data/druid/var/zk/version-2
Guides
Logs guide
Лог-файлы по сервисам:
Service | Sign | Logfile |
---|---|---|
payara | /home/payara/payara-5.201/glassfish/domains/domain1/logs/server.log | |
kafka | ||
druid | /home/druid/apache-druid-0.19.0/var/druid/derby.log /home/druid/apache-druid-0.19.0/var/druid/indexing-logs/*.log |
|
keycloak | /home/keycloak/keycloak-11.0.0/standalone/log/{server.log,audit.log} | |
postgresql | /var/ | |
couchdb | /opt/couchdb/var/log/couchdb.log | |
openresty | ||
nifi | /home/nifi/nifi-1.11.4/logs/nifi-bootstrap.log; /home/nifi/nifi-1.11.4/logs/nifi-user.log |
Ports map
Service | Port | Bind address | Tcp | App | Parent | Comment |
---|---|---|---|---|---|---|
couchdb | 4369 | 0.0.0.0 | v4 | erlang | epmd | |
couchdb | 4369 | v6 | erlang | epmd | ||
couchdb | 5984 | 0.0.0.0 | v4 | beam.smp | ||
couchdb | random | 0.0.0.0 | v4 | beam.smp | 42xxx-46xxx | |
druid | 1527 | 127.0.0.1 | v6 | coordinator | java | |
druid | 2181 | v6 | zookeeper | java | ||
druid | 8081 | v6 | coordinator | java | ||
druid | 8082 | v6 | broker | java | ||
druid | 8083 | v6 | historical | java | ||
druid | 8091 | v6 | middleManager | java | ||
druid | 8888 | v6 | router | java | ||
kafka | 9092 | 127.0.0.1 | v6 | java | ||
kafka | random | v6 | java | 32xxx-38xxx | ||
keycloak | 8087 | 127.0.0.1 | v4 | java | ||
keycloak | 8443 | 127.0.0.1 | v4 | java | ||
keycloak | 9990 | 127.0.0.1 | v4 | java | ||
keycloak | random | 0.0.0.0 | v4 | java | 36xxx-41xxx | |
nifi | 9494 | 0.0.0.0 | v4 | java | ||
nifi | 32814 | 127.0.0.1 | v6 | java | ||
nifi | random | 127.0.0.1 | v4 | java | 39xxx-44xxx | |
openresty | 80 | 0.0.0.0 | v4 | nginx | ||
openresty | 80 | v6 | nginx | |||
payara | 3700 | v6 | java | |||
payara | 4848 | v6 | java | |||
payara | 4900 | 10.33.8.28 | v6 | java | ||
payara | 7676 | v6 | java | |||
payara | 8080 | v6 | java | |||
payara | 8181 | v6 | glassfish | java | ||
payara | 8686 | v6 | java | |||
postgresql | 5432 | 127.0.0.1 | v4 | postgres | ||
postgresql | 5432 | 1 | v6 | postgres |
Credentials
- hr/1
- трудозатраты/трудозатраты
- da/1
- demo
- demo_edu