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
 







