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 лучше удалить, или надо устанавливать переменную окружения

JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

OpenResty

Приложение frontend angular лежит в папке /home/openresty/Workspace/arm-analytics-spb

Пересборка проекта angular

  1. Скачать исходный код приложения:
cd /data/openresty/work/
git clone http://gitlab.gkomega.ru/omegabi/omegabi-v02.git
  1. Установить компоненты сборки:
npm install -g @angular/cli
cd /data/openresty/work/omegabi-v02
npm install

После окончания установки:

npm-install-s1

npm-install-s2

  1. Далее все действия будем производить в корневой папке проекта: /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"
                }
              ]
            },
  1. Добавить папку проекта 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”

  1. Создаем файл переменных окружения 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

  1. Запускаем сборку angular-проекта:
   $ export NODE_OPTIONS="--max-old-space-size=4096"
   ng build -c bio6-gkomega-ru

После успешной сборки увидим такую картинку:

angular-proj-build

Обновление ядра angular

ng update @angular/core@11.2.14
или
ng update --force @angular/core@11.2.14

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

Импортируем БД из дампа:

$ psql -d analytics < analytics.sql

Проверим настройки 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

$ grep bio6 /etc/hosts
127.0.1.1       bio6

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 строку:

AS_JAVA="/usr/lib/jvm/java-11-openjdk-amd64"

Сервис 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:

asadmin> create-jdbc-resource --connectionpoolid analytics jdbc/analytics

Развернуть предоставленное приложение:

$ ./bin/asadmin deploy --force --name arm –contextroot arm analytics-spb-api-web-1.0-SNAPSHOT.war

Проверка пула

Далее, создаем запускаем домен и проверяем пул и приложения.

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

Смену пароля администратора можно сделать так:

~/payara-5.201/bin/asadmin change-admin-password

На запрос о вводе текущего пароля надо ввести “пустой” пароль (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

При подключении будет такая картинка:

payara-dash

Deploy backend from sources

Забираем исходный код:

cd /data/payara/work
git clone http://gitlab.gkomega.ru/omegabi/omegabi-api

Смотрим список профилей:

cd omegabi-api/OmegaBI-api-web
mvn help:all-profiles

При сборке возникла ошибка:

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

mvn clean install -P stage

После сборки в каталоге target появится артефакт - war-файл.

Деплой war-приложения:

/data/payara/glassfish/bin/asadmin deploy --force --name arm --contextroot arm target/OmegaBI-api-web-1.0-SNAPSHOT.war

Если приложение уже было, то его можно убрать такой командой:

/data/payara/glassfish/bin/asadmin undeploy arm

Проверить список установленных приложений:

su -c "/data/payara/bin/asadmin list-applications" payara

Создание пула

Команда создания пула:

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

cd /opt; wget https://apache-mirror.rbc.ru/pub/apache/nifi/1.12.1/nifi-1.12.1-bin.tar.gz

Раcпаковываем и запускаем.

/opt/nifi/bin/nifi.sh start

Проверим статус:

root@bi-setup-test:/opt# /opt/nifi/bin/nifi.sh status
nifi.sh: JAVA_HOME not set; results may vary
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

listeners=PLAINTEXT://localhost:9092

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

keycloak-management-console

Здесь можно управлять пользователями. В основном боевом варианте (sitcenter.gkomega.ru) это не настроено.

Реальная панель keylock доступна по URL:

https://biu5.gkomega.ru/auth/admin

keycloak-dash

Здесь надо проверить и поправить все ссылки на вкладке “Клиенты”.

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:

Command[zk] failed, see logfile for more details: /data/druid/var/sv/zk.log

Решается удалением каталога метаданных /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