Установка
Система Пульт разворачивается в докер-контейнерах при помощи плагина docker compose. В качестве СУБД используется Clickhouse (v. 23.6.2.18 и более) и PostgreSQL (v. 13-16). Для скачивания docker-образов компонентов Пульта необходимо воспользоваться учетной записью в репозитории Лаборатории Числитель.
После установки, web-интерфейс будет доступен просто по http://ip , где ip – адрес машины, на которой разворачивается Пульт/
Данные для авторизации в веб-интерфейсе Пульта по умолчанию: Логин: Admin / Пароль: zabbix
Установка PostgreSQL
Произвести установку и инициализацию инстанса PostgreSQL на выделенном сервере согласно официальной документации в соответствии с выбранной ОС. На данный момент Пульт поддерживает работу с версиями PostgreSQL 13-16.
Произведите настройку PostgreSQL:
#задать пароль пользователю postgres
sudo passwd postgres;
#от пользователя postgres создать новую роль pult и БД pult
su - postgres;
createuser --pwprompt pult;
createdb -O pult -E Unicode -T template0 pult;
Отредактируйте файл pg_hba.conf, разрешив принимать соединения от сервера Пульта, добавив в файл запись ниже:
host pult pult 0.0.0.0/0 md5
Отредактируйте конфигурационный файл postgresql.conf:
listen_addresses = '*'
Перезапустите соответствующую службу Postgres
Установка Clickhouse
Произвести установку сервера Clickhouse на выделенном сервере согласно официальной документации в соответствии с выбранной ОС.
Произвести конфигурацию сервера Clickhouse:
sudo nano /etc/clickhouse-server/config.d/listen_host.xml
<clickhouse>
<logger>
<level>information</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<size>10M</size>
<count>7</count>
</logger>
<display_name>clickhouse</display_name>
<listen_host>0.0.0.0</listen_host>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<interserver_http_port>9009</interserver_http_port>
</clickhouse>
Произвести настройку пользователей в Clickhouse. Для этого создать конфигурационный файл со следующим содержимым, указав в теге
sudo nano /etc/clickhouse-server/users.d/pult.xml
<clickhouse>
<users>
<default>
<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>
</default>
<!-- Создание нового пользователя pult в качестве администратора БД -->
<pult>
<password>changeme</password>
<grants>
<query>GRANT admin</query>
</grants>
</pult>
</users>
<!-- Создание роли admin -->
<roles>
<admin>
<grants>
<query>GRANT ALL ON pult.* WITH GRANT OPTION;</query>
</grants>
</admin>
</roles>
<!-- Настройка стандартного профиля default для корректного форматирования данных в JSON (необходимо для интеграции с Grafana) -->
<profiles>
<default>
<input_format_json_try_infer_numbers_from_strings>1</input_format_json_try_infer_numbers_from_strings>
<output_format_json_quote_64bit_floats>1</output_format_json_quote_64bit_floats>
</default>
</profiles>
</clickhouse>
Перезапустить службу Clickhouse
sudo systemctl restart clickhouse-server
Создать БД pult в Clickhouse через консоль с помощью клиента clickhouse-client, указав пользователя и заданный пароль для подключения к Clickhouse:
clickhouse-client --user pult --password changeme --multiquery "CREATE DATABASE IF NOT EXISTS pult; \
CREATE TABLE IF NOT EXISTS pult.history (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), value Float64) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH; \
CREATE TABLE IF NOT EXISTS pult.history_str (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), value String) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH; \
CREATE TABLE IF NOT EXISTS pult.history_uint (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), value UInt64) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH; \
CREATE TABLE IF NOT EXISTS pult.history_text (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), value String) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH; \
CREATE TABLE IF NOT EXISTS pult.history_log (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), timestamp UInt64 CODEC(Delta, LZ4), logeventid UInt64, source String, severity UInt8, value String) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH; \
CREATE MATERIALIZED VIEW IF NOT EXISTS pult.trends (itemid UInt64, clock DateTime('Europe/Moscow'), num AggregateFunction(count), value_min AggregateFunction(min, Float64), value_avg AggregateFunction(avg, Float64), value_max AggregateFunction(max, Float64)) ENGINE = AggregatingMergeTree PARTITION BY toYYYYMM(clock) ORDER BY (itemid, toStartOfHour(toDateTime(clock), 'Europe/Moscow')) SETTINGS index_granularity = 8192 AS SELECT itemid, toStartOfHour(toDateTime(clock), 'Europe/Moscow') AS clock, countState(*) AS num, minState(value) AS value_min, avgState(value) AS value_avg, maxState(value) AS value_max FROM pult.history GROUP BY itemid, clock; \
CREATE MATERIALIZED VIEW IF NOT EXISTS pult.trends_uint (itemid UInt64, clock DateTime('Europe/Moscow'), num AggregateFunction(count), value_min AggregateFunction(min, UInt64), value_avg AggregateFunction(avg, UInt64), value_max AggregateFunction(max, UInt64)) ENGINE = AggregatingMergeTree PARTITION BY toYYYYMM(clock) ORDER BY (itemid, toStartOfInterval(toDateTime(clock, 'Europe/Moscow'), toIntervalHour(1))) TTL toStartOfInterval(toDateTime(clock, 'Europe/Moscow'), toIntervalHour(1)) + toIntervalMonth(12) SETTINGS index_granularity = 8192 AS SELECT itemid, toStartOfInterval(toDateTime(clock, 'Europe/Moscow'), toIntervalHour(1)) AS clock, countState(*) AS num, minState(value) AS value_min, avgState(value) AS value_avg, maxState(value) AS value_max FROM pult.history_uint GROUP BY itemid, clock; \
CREATE TABLE IF NOT EXISTS pult.history_bin (itemid UInt64, clock UInt64 CODEC(Delta, LZ4), ns UInt64 CODEC(T64, LZ4), value String) ENGINE = MergeTree() PARTITION BY toYYYYMM(CAST(clock as date)) ORDER BY (itemid, clock) TTL (CAST(clock as date)) + INTERVAL 6 MONTH;"
Установка Docker
Произвести установку Docker и Docker-compose на выделенном сервере согласно официльной документации в соответствии с выбранной ОС.
Далее добавить администратора в группу docker
sudo usermod -aG docker $USER;
newgrp docker;
После успешной установки необходимо запустить сервис контейнеризации docker и добавить его в автозагрузку:
sudo systemctl enable docker --now;
Установка сервера Пульта
Создать директорию /opt/pult и перейти в нее:
sudo mkdir -p /opt/pult;
cd /opt/pult;
Создать docker-compose.yml файл со следующим содержимым:
services:
pult-server:
image: registry.pult.chislitellab.ru:8123/full/server-pgsql-ol9:7.0.6
container_name: pult-server
restart: always
environment:
ZBX_HISTORY_CLICKHOUSE_STORAGE_URL: "http://${CLICKHOUSE_HOST}:${CLICKHOUSE_PORT}/?database=${CLICKHOUSE_DB}&user=${CLICKHOUSE_USER}&password=${CLICKHOUSE_PASSWORD}"
ZBX_HISTORY_CLICKHOUSE_STORAGE_TYPES: ${ZBX_HISTORY_CLICKHOUSE_TYPES}
ZBX_HISTORY_CLICKHOUSE_CHUNK_SIZE: 10000
ZBX_HISTORY_CLICKHOUSE_FLUSH_TIMEOUT: 30
ZBX_HISTORY_CLICKHOUSE_NS_DISABLE: 1
ZBX_CACHESIZE: 2048M
ZBX_VALUECACHESIZE: 1024M
ZBX_TRENDCACHESIZE: 1024M
ZBX_ENABLE_SNMP_TRAPS: true
ZBX_HISTORYCACHESIZE: 256M
ZBX_HISTORYINDEXCACHESIZE: 128M
ZBX_TIMEOUT: 30
DB_SERVER_HOST: ${POSTGRES_HOST}
DB_SERVER_PORT: ${POSTGRES_SERVER_PORT}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
network_mode: host
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
pult-web:
image: registry.pult.chislitellab.ru:8123/full/web-nginx-pgsql-ol9:7.0.6
container_name: pult-web
restart: always
depends_on:
- "pult-server"
user: root
environment:
ZBX_SERVER_HOST: "${ZBX_SERVER_HOST}"
ZBX_HISTORY_CLICKHOUSE_URL: "http://${CLICKHOUSE_HOST}:${CLICKHOUSE_PORT}/?database=${CLICKHOUSE_DB}&user=${CLICKHOUSE_USER}&password=${CLICKHOUSE_PASSWORD}"
ZBX_HISTORY_CLICKHOUSE_TYPES: ${ZBX_HISTORY_CLICKHOUSE_TYPES}
DB_SERVER_HOST: ${POSTGRES_HOST}
DB_SERVER_PORT: ${POSTGRES_SERVER_PORT}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
network_mode: host
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
report-server:
restart: always
container_name: pult-report-server
image: registry.pult.chislitellab.ru:8123/report-server:2.0.0
depends_on:
- "pult-server"
- "pult-web"
volumes:
- ./reports/generated_reports:/app/generated_reports
- ./reports/config.yaml:/app/config.yaml
ports:
- 8088:8080
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
Создать директорию для модуля отчетов:
sudo mkdir -p /opt/pult/reports/generated_reports
Создать файл с конфигурацией модуля отчетов, внеся соответствующие изменения (ip-адреса для подключения, пароли):
Модуль отчетов
sudo nano /opt/pult/reports/config.yaml
#Настройка подключения к конфигурационной БД
database:
type: 'postgresql'
username: 'pult'
password: 'changeme'
port: 5432
ip: '<IP-адрес сервера Postgres>'
name: 'pult'
#Настройка подключения к API Пульта
pult:
username: 'Admin'
password: 'zabbix'
api_url: 'http://<IP-адерс сервера Пульт>/'
#Количество потоков программы
application:
threads_count: 10
#Настройка пути для скачивания отчетов
web_server:
active: false
ip: ''
port: 8080
report_link: 'http://<IP-адерс сервера Пульта>/generated_reports/'
#Настройка housekeeper для сформированных отчетов (сколько времени хранятся сформированные отчеты)
housekeeper:
active: True
timeout: 3600
older_report_hour: 72
Создать файл с переменными окружения /opt/pult/.env и задать переменным значения:
sudo nano /opt/pult/.env
⚠ Если пароль для пользователя в Clickhouse содержит спец.символы, в файле с переменными окружения необходимо задать его в кодировке URL (пример: пароль p@ssw_ord в кодировке URL будет иметь вид p%40ssw_ord). Для кодировки пароля в URL можно воспользоваться специальными веб-сервисами, например www.urlencoder.org.
#Адрес сервера Clickhouse
CLICKHOUSE_HOST=<IP-адрес сервера Clickhouse>
#наименование БД в Clickhouse
CLICKHOUSE_DB=pult
#Администратор БД pult в Clickhouse
CLICKHOUSE_USER=pult
#Пароль пользователя pult в Clickhouse
CLICKHOUSE_PASSWORD=changeme
#Порт на котором слушает Clickhouse
CLICKHOUSE_PORT=8123
#Типы данных которые должны храниться в Clickhouse
ZBX_HISTORY_CLICKHOUSE_TYPES="dbl,uint,str,text,log"
#Адрес сервера PostgreSQL
POSTGRES_HOST=<IP-адрес сервера PostgreSQL>
#Порт PostgreSQL
POSTGRES_SERVER_PORT=5432
#Роль PostgreSQL
POSTGRES_USER=pult
#Пароль для выбранной роли PostgreSQL
POSTGRES_PASSWORD=changeme
#Наименование БД в PostgreSQL
POSTGRES_DB=pult
#Адрес сервера Пульта
ZBX_SERVER_HOST=<IP-адрес сервера Пульт>
Авторизоваться в docker-репозитарии Лаборатории Числитель:
docker login registry.pult.chislitellab.ru:8123
Загрузить образы docker-контейнеров Пульта
docker compose pull
Запустить docker-контейнеры Пульта:
docker compose up -d pult-server pult-web
docker compose up -d report-server
Активация пользовательских отчетов в веб-интерфейсе Пульта
Для активации пользовательских отчетов следует в web-интерфейсе перейти в раздел «Администрирование» → «Общие» → «Модули»

Далее ввести в поле Имя (1) название модуля "Предзаготовленные отчеты", нажать кнопку Применить (2) и сменить состояние кликнув на него (3).
В случае если указанный модуль будет не найден, попробовать нажать на кнопку "Сканировать директорию" (4).

Состояние модуля станет "Активировано"

В web-интерфейсе в разделе "Отчеты" появится подраздел "Пользовательские отчеты".
