Glaber Development System Setup (Debian)
This guide describes how to prepare a clean Debian host for Glaber development: install runtime services, build dependencies, initialize PostgreSQL and ClickHouse, build the server from source, and run the web UI.
Target OS: Debian 12 (Bookworm). Debian 11 (Bullseye) works with the same steps; adjust PostgreSQL/PHP package version numbers if needed.
Related docs: LIBRARIES_AND_DEPENDENCIES.md
Table of contents
- 1. Overview
- 2. Base system preparation
- 3. Runtime services and packages
- 3.1 Services to install
- 3.2 Web / PHP packages
- 3.3 Build / development packages
- 4. PostgreSQL installation and database initialization
- 4.1 Install PostgreSQL
- 4.2 Create user and database
- 4.3 Import Glaber schema and seed data
- 5. ClickHouse installation and initialization
- 5.1 Install ClickHouse server
- 5.2 Prevent system log tables from growing
- 5.3 Create Glaber history schema
- 6. Build Glaber server from source
- 6.1 Compile and install
- 6.2 System user and runtime directories
- 6.3 Server configuration
- 6.4 Run the server
- 7. Web UI — install and run
- 7.1 Build frontend assets
- 7.2 PHP configuration file
- 7.3 PHP-FPM pool
- 7.4 nginx site
- 7.5 Open the web UI
- 8. Start / stop checklist
- 9. Troubleshooting
- 10. References in this repository
1. Overview
| Component | Role | Dev default |
|---|---|---|
| PostgreSQL | Configuration database (hosts, items, triggers, users) | DB glaber, user glaber, password glaber |
| ClickHouse | History/metrics storage backend | DB glaber |
| nginx + PHP-FPM | Web UI (PHP) | Serves ui/ from the repository |
| Node.js + npm | UI frontend build (Vue, Vite, Tailwind) | Build-time only |
| Glaber server | Core daemon | Built from source in the repo |
Recommended minimum for development: 4 CPU, 8 GB RAM, 50 GB disk.
2. Base system preparation
Run as root or with sudo.
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get upgrade -y
apt-get install -y \
sudo \
curl \
wget \
git \
ca-certificates \
gnupg2 \
lsb-release \
apt-transport-https \
software-properties-common \
locales \
net-tools \
iputils-ping \
fping \
snmp-mibs-downloader \
dejavu-sans-fonts \
logrotate
# Locales used by Glaber
sed -i 's/^# \(en_US\.UTF-8\)/\1/' /etc/locale.gen
sed -i 's/^# \(ru_RU\.UTF-8\)/\1/' /etc/locale.gen
locale-gen
# Optional: create a human login account for development (not the glaber daemon user — see section 6.2)
# useradd -m -s /bin/bash glaber-dev && usermod -aG sudo glaber-dev
Clone the repository:
git clone https://gitlab.com/mikler/glaber.git
cd glaber
3. Runtime services and packages
3.1 Services to install
| Service | systemd unit | Purpose |
|---|---|---|
| PostgreSQL | postgresql |
Configuration DB |
| ClickHouse | clickhouse-server |
History storage |
| nginx | nginx |
HTTP reverse proxy for UI |
| PHP-FPM | php*-fpm |
PHP FastCGI for UI |
3.2 Web / PHP packages
Debian ships one default PHP version per release (Bookworm: 8.2, Bullseye: 7.4, Trixie: 8.4). To install a specific version — including older releases for compatibility testing — add the deb.sury.org PHP repository first. Glaber requires PHP >= 7.4.0 (see ui/include/classes/setup/CFrontendSetup.php).
3.2.1 Add the Sury PHP repository (recommended)
Run before installing PHP packages. Uses the current DEB822 source format from packages.sury.org.
apt-get update
apt-get install -y lsb-release ca-certificates curl
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb
# Remove legacy one-line sources that conflict with the keyring package
rm -f /etc/apt/sources.list.d/php.list /etc/apt/sources.list.d/deb.sury.org-php.list
tee /etc/apt/sources.list.d/php.sources <<EOF
Types: deb
URIs: https://packages.sury.org/php/
Suites: $(lsb_release -sc)
Components: main
Signed-By: /usr/share/keyrings/debsuryorg-archive-keyring.gpg
EOF
apt-get update
List PHP versions available for your Debian release:
apt-cache search --names-only '^php[0-9]+\.[0-9]+-cli$' | awk '{print $1}' | sed 's/-cli$//' | sort -V
Set PHP_VER to the desired major.minor (examples: 7.4, 8.2, 8.3, 8.4). Sury builds for supported Debian releases only — EOL releases (e.g. old Stretch) are not maintained.
3.2.2 Install nginx and PHP-FPM
If you skipped Sury, pick the default from apt-cache policy php | grep Candidate and map it to a phpX.Y-* package name where applicable.
PHP_VER=8.2
apt-get install -y \
nginx \
php${PHP_VER}-fpm \
php${PHP_VER}-cli \
php${PHP_VER}-common \
php${PHP_VER}-gd \
php${PHP_VER}-bcmath \
php${PHP_VER}-mbstring \
php${PHP_VER}-xml \
php${PHP_VER}-xmlreader \
php${PHP_VER}-xmlwriter \
php${PHP_VER}-ctype \
php${PHP_VER}-sockets \
php${PHP_VER}-gettext \
php${PHP_VER}-ldap \
php${PHP_VER}-pgsql \
php${PHP_VER}-opcache
PHP settings for the UI (create /etc/php/${PHP_VER}/fpm/conf.d/99-glaber.ini):
cat > /etc/php/${PHP_VER}/fpm/conf.d/99-glaber.ini <<'EOF'
max_execution_time=300
memory_limit=256M
post_max_size=16M
upload_max_filesize=2M
max_input_time=300
max_input_vars=10000
date.timezone=UTC
EOF
3.3 Build / development packages
Packages required to compile Glaber server, proxy, and agent (see configure.ac and build/*/SPECS/glaber.spec):
apt-get install -y \
build-essential \
gcc \
g++ \
make \
autoconf \
automake \
libtool \
pkg-config \
libssl-dev \
libpcre3-dev \
libpq-dev \
postgresql-client \
libxml2-dev \
libevent-dev \
libcurl4-openssl-dev \
libssh-dev \
libldap2-dev \
libopenipmi-dev \
libsnmp-dev \
snmp \
unixodbc-dev \
libgnutls28-dev \
zlib1g-dev \
libsqlite3-dev \
default-jdk \
golang-go
Optional (Agent 2 / Web Service, Java gateway, UI rebuild):
# Node.js LTS (for ui/ — Vite 7 needs a current LTS)
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y nodejs
# Composer is optional — PHP deps are vendored in ui/vendor/
# apt-get install -y composer
4. PostgreSQL installation and database initialization
4.1 Install PostgreSQL
Using the official PGDG repository (PostgreSQL 15):
install -d /usr/share/keyrings
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
| gpg --dearmor -o /usr/share/keyrings/postgres.gpg
echo "deb [signed-by=/usr/share/keyrings/postgres.gpg] \
https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
> /etc/apt/sources.list.d/pgdg.list
apt-get update
apt-get install -y postgresql-15 postgresql-client-15
systemctl enable --now postgresql
4.2 Create user and database
Database name: glaber, user: glaber, password: glaber.
sudo -u postgres psql <<'EOF'
CREATE USER glaber WITH PASSWORD 'glaber';
CREATE DATABASE glaber OWNER glaber ENCODING 'UTF8';
GRANT ALL PRIVILEGES ON DATABASE glaber TO glaber;
\c glaber
GRANT ALL ON SCHEMA public TO glaber;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO glaber;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO glaber;
EOF
Ensure local password authentication works. In /etc/postgresql/15/main/pg_hba.conf add (or adjust) before broader rules:
local glaber glaber scram-sha-256
host glaber glaber 127.0.0.1/32 scram-sha-256
host glaber glaber ::1/128 scram-sha-256
Reload PostgreSQL:
systemctl reload postgresql
Verify login:
PGPASSWORD=glaber psql -h 127.0.0.1 -U glaber -d glaber -c 'SELECT 1;'
4.3 Import Glaber schema and seed data
4.3.1 Clean the database
Use this before a fresh import, or after a failed data.sql run left the database empty or inconsistent (ROLLBACK discards the whole data.sql transaction).
export PGPASSWORD=glaber
psql -h 127.0.0.1 -U glaber -d glaber <<'EOF'
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO glaber;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO glaber;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO glaber;
EOF
To drop and recreate the database entirely (requires superuser, e.g. postgres):
sudo -u postgres psql <<'EOF'
DROP DATABASE IF EXISTS glaber;
CREATE DATABASE glaber OWNER glaber ENCODING 'UTF8';
GRANT ALL PRIVILEGES ON DATABASE glaber TO glaber;
EOF
4.3.2 Build SQL files
From the repository root (requires ./bootstrap.sh and ./configure first):
cd /path/to/glaber
make dbschema
This generates database/postgresql/schema.sql and database/postgresql/data.sql (and schemas for other supported databases). For PostgreSQL only:
make dbschema_postgresql
4.3.3 Import schema, images, and data
Import in this order. images.sql must run before data.sql: seed data references map icons (sysmaps_elements.iconid_off → images.imageid). Importing data.sql first causes a foreign-key error and rolls back the entire transaction; later lines then only show current transaction is aborted.
cd /path/to/glaber
export PGPASSWORD=glaber
psql -h 127.0.0.1 -U glaber -d glaber -v ON_ERROR_STOP=1 -f database/postgresql/schema.sql
psql -h 127.0.0.1 -U glaber -d glaber -v ON_ERROR_STOP=1 -f database/postgresql/images.sql
psql -h 127.0.0.1 -U glaber -d glaber -v ON_ERROR_STOP=1 -f database/postgresql/data.sql
Verify:
PGPASSWORD=glaber psql -h 127.0.0.1 -U glaber -d glaber -c \
"SELECT COUNT(*) AS users FROM users; SELECT COUNT(*) AS images FROM images;"
Expected: users = 2, images = 187 (approximate; depends on Glaber version).
5. ClickHouse installation and initialization
5.1 Install ClickHouse server
install -d /usr/share/keyrings
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repository.key' \
| gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] \
https://packages.clickhouse.com/deb stable main" \
> /etc/apt/sources.list.d/clickhouse.list
apt-get update
apt-get install -y clickhouse-server clickhouse-client
systemctl enable clickhouse-server
Set a password during package configuration when prompted, or configure users in the next section.
5.2 Prevent system log tables from growing
ClickHouse writes internal diagnostics to system.* tables (query_log, query_thread_log, metric_log, asynchronous_metric_log, part_log, etc.). On a dev machine these can consume significant disk space.
Create drop-in configs under /etc/clickhouse-server/config.d/ (same approach as build/appliance/run/ansible/roles/clickhouse/files/config.d/):
Disable metric and async metric logs — /etc/clickhouse-server/config.d/disable_metric_logs.xml:
<clickhouse>
<metric_log remove="1" />
<asynchronous_metric_log remove="1" />
</clickhouse>
Disable query thread log — /etc/clickhouse-server/config.d/disable_query_thread_log.xml:
<clickhouse>
<query_thread_log remove="1"/>
</clickhouse>
Disable part log — /etc/clickhouse-server/config.d/disable_part_log.xml:
<clickhouse>
<part_log remove="1" />
</clickhouse>
Disable other verbose system logs — /etc/clickhouse-server/config.d/disable_extra_logs.xml:
<clickhouse>
<trace_log remove="1" />
<text_log remove="1" />
<session_log remove="1" />
<opentelemetry_span_log remove="1" />
<processors_profile_log remove="1" />
</clickhouse>
Option A — disable query_log entirely — /etc/clickhouse-server/config.d/disable_query_log.xml:
<clickhouse>
<query_log remove="1" />
</clickhouse>
Option B — keep query_log with short TTL (use instead of Option A) — /etc/clickhouse-server/config.d/query_log.xml:
<clickhouse>
<query_log replace="1">
<database>system</database>
<table>query_log</table>
<flush_interval_milliseconds>30000</flush_interval_milliseconds>
<engine>
ENGINE = MergeTree
PARTITION BY event_date
ORDER BY (event_time)
TTL event_date + INTERVAL 3 HOUR
SETTINGS ttl_only_drop_parts=1
</engine>
</query_log>
</clickhouse>
Disable empty default password — /etc/clickhouse-server/config.d/disable_empty_password.xml:
<clickhouse>
<allow_no_password>0</allow_no_password>
</clickhouse>
User profile: do not log queries — /etc/clickhouse-server/users.d/glaber.xml:
<clickhouse>
<profiles>
<default>
<log_queries>0</log_queries>
</default>
</profiles>
<users>
<glaber>
<password>glaber</password>
<networks>
<ip>::1</ip>
<ip>127.0.0.1</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</glaber>
</users>
</clickhouse>
Set ownership and restart:
chown -R clickhouse:clickhouse /etc/clickhouse-server/config.d /etc/clickhouse-server/users.d
systemctl restart clickhouse-server
systemctl status clickhouse-server
5.3 Create Glaber history schema
From the repository root:
cd /path/to/glaber
clickhouse-client --user glaber --password glaber --multiquery < database/clickhouse/schema.sql
Verify:
clickhouse-client --user glaber --password glaber --query "SHOW TABLES FROM glaber"
6. Build Glaber server from source
6.1 Compile and install
cd /path/to/glaber
./bootstrap.sh
./configure \
--enable-server \
--enable-proxy \
--enable-agent \
--with-postgresql \
--with-openssl \
--with-libcurl \
--with-ldap \
--with-libxml2 \
--with-libevent \
--with-net-snmp \
--with-unixodbc \
--with-ssh \
--with-openipmi \
--with-libpcre \
--enable-ipv6 \
--sysconfdir=/etc/glaber
make -j"$(nproc)"
make install
6.2 System user and runtime directories
Glaber daemons run as a dedicated glaber system account (separate from the PostgreSQL user glaber in section 4). Create the account and runtime paths before starting the server — the same layout is used in packaged installs (build/altlinux/*/SPECS/glaber.spec, build/astra/*/glaber-server*.init).
# System group and user (idempotent)
getent group glaber >/dev/null || groupadd --system glaber
getent passwd glaber >/dev/null || useradd --system \
-g glaber \
-d /var/lib/glaber \
-s /usr/sbin/nologin \
-c 'Glaber Monitoring System' \
glaber
# Config directory
install -d -m 0755 /etc/glaber
# Logs, PID/IPC sockets, value-cache dumps (see conf/zabbix_server.conf)
install -d -m 0755 -o glaber -g glaber \
/var/lib/glaber \
/var/log/glaber \
/var/run/glaber \
/var/vcdump
# Optional: SNMP trap log (referenced in packaged server/proxy configs)
install -d -m 0755 -o glaber -g glaber /var/log/snmptrap
# Recreate /run/glaber after reboot (same as build/*/SOURCES/glaber-tmpfiles.conf)
cat > /etc/tmpfiles.d/glaber-server.conf <<'EOF'
d /run/glaber 0755 glaber glaber - -
EOF
systemd-tmpfiles --create /etc/tmpfiles.d/glaber-server.conf 2>/dev/null || true
| Path | Purpose |
|---|---|
/var/lib/glaber |
Home directory for the glaber system user |
/var/log/glaber |
Server/proxy logs (LogFile=...) |
/var/run/glaber |
PID files and IPC sockets (PidFile=, SocketDir=) |
/var/vcdump |
Value-cache dump files (ValueCacheDumpLocation=) |
/etc/glaber |
Server/proxy/agent configuration |
On Debian, /var/run is a symlink to /run; either path works.
6.3 Server configuration
Copy the sample config and set database and ClickHouse settings:
cd /path/to/glaber
cp conf/zabbix_server.conf /etc/glaber/glaber_server.conf
chown root:glaber /etc/glaber/glaber_server.conf
chmod 640 /etc/glaber/glaber_server.conf
Edit /etc/glaber/glaber_server.conf. At minimum, set paths and credentials (packaged installs use the same paths):
LogFile=/var/log/glaber/glaber_server.log
PidFile=/var/run/glaber/glaber_server.pid
SocketDir=/var/run/glaber
DBHost=127.0.0.1
DBName=glaber
DBSchema=public
DBUser=glaber
DBPassword=glaber
HistoryModule=clickhouse;{"url":"http://127.0.0.1:8123","username":"glaber","password":"glaber","dbname":"glaber","disable_reads":100,"timeout":10}
ValueCacheDumpLocation=/var/vcdump/
ValueCacheDumpFrequency=300
6.4 Run the server
# Foreground (dev)
cd /path/to/glaber
src/zabbix_server/glaber_server -c /etc/glaber/glaber_server.conf
# Or after make install
glaber_server -c /etc/glaber/glaber_server.conf
7. Web UI — install and run
7.1 Build frontend assets
cd /path/to/glaber/ui
npm install
npm run build:all
For active Vue/Tailwind development:
npm run dev # Vite dev server with HMR
npm run watch:tailwind # optional, separate terminal
See also ui/src/readme_en.md.
7.2 PHP configuration file
Create ui/conf/zabbix.conf.php from the example:
cd /path/to/glaber/ui
cp conf/zabbix.conf.php.example conf/zabbix.conf.php
Edit conf/zabbix.conf.php:
<?php
$DB['TYPE'] = 'POSTGRESQL';
$DB['SERVER'] = '127.0.0.1';
$DB['PORT'] = '5432';
$DB['DATABASE'] = 'glaber';
$DB['USER'] = 'glaber';
$DB['PASSWORD'] = 'glaber';
$DB['SCHEMA'] = 'public';
$ZBX_SERVER = '127.0.0.1';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'Glaber Dev';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
Ensure the config file is not world-readable:
chown www-data:www-data conf/zabbix.conf.php
chmod 640 conf/zabbix.conf.php
7.3 PHP-FPM pool
Create /etc/php/${PHP_VER}/fpm/pool.d/glaber.conf:
[glaber]
user = www-data
group = www-data
listen = /run/php/glaber.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
mkdir -p /run/php /var/lib/php/sessions
chown www-data:www-data /run/php /var/lib/php/sessions
systemctl restart php${PHP_VER}-fpm
7.4 nginx site
Create /etc/nginx/sites-available/glaber.conf (replace /path/to/glaber with the actual repo path):
server {
listen 80;
server_name _;
root /path/to/glaber/ui;
index index.php;
location = /favicon.ico {
log_not_found off;
}
location / {
try_files $uri $uri/ =404;
}
location /assets {
access_log off;
expires 10d;
}
location ~ /\.ht {
deny all;
}
location ~ /(api/|conf[^.]|include|locale) {
deny all;
return 404;
}
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/run/php/glaber.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /path/to/glaber/ui;
fastcgi_param SCRIPT_FILENAME /path/to/glaber/ui$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /path/to/glaber/ui$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
}
}
Enable the site and reload nginx:
ln -sf /etc/nginx/sites-available/glaber.conf /etc/nginx/sites-enabled/glaber.conf
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
7.5 Open the web UI
- Start PostgreSQL, ClickHouse, PHP-FPM, nginx, and
glaber_server. - Open
http://<host-ip>/in a browser. - If
conf/zabbix.conf.phpis missing or invalid, the setup wizard atsetup.phpruns. - Default credentials after seed import: user Admin, password zabbix (change in production).
8. Start / stop checklist
# Services
systemctl start postgresql
systemctl start clickhouse-server
systemctl start php${PHP_VER}-fpm
systemctl start nginx
# Glaber server (foreground dev run)
cd /path/to/glaber
src/zabbix_server/glaber_server -c /etc/glaber/glaber_server.conf
Quick health checks:
PGPASSWORD=glaber psql -h 127.0.0.1 -U glaber -d glaber -c '\dt' | head
clickhouse-client --user glaber --password glaber --query "SELECT count(*) FROM glaber.history_str"
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/
ss -tlnp | grep -E '5432|8123|80|10051'
9. Troubleshooting
| Symptom | Check |
|---|---|
data.sql: current transaction is aborted |
Not encoding — an earlier statement failed. Re-run with -v ON_ERROR_STOP=1 to see the first error. Often wrong import order: use schema.sql → images.sql → data.sql. Clean DB (section 4.3.1) and reimport. |
violates foreign key constraint "c_sysmaps_elements_2" |
images.sql not loaded before data.sql. Clean and reimport in correct order. |
| UI "Database error" | PostgreSQL running; zabbix.conf.php credentials; schema imported |
| UI setup wizard loops | ui/conf/zabbix.conf.php exists and is readable by www-data |
| Server won't start | DBPassword, DBHost, schema in /etc/glaber/glaber_server.conf; glaber user and dirs in section 6.2 exist and are owned by glaber:glaber |
| Server permission errors | /var/log/glaber, /var/run/glaber, /var/vcdump owned by glaber:glaber; config readable by glaber |
| ClickHouse disk growth | Log drop-ins in /etc/clickhouse-server/config.d/ applied; systemctl restart clickhouse-server |
| History not stored | ClickHouse schema loaded; HistoryModule in server config |
| PHP 500 errors | tail -f /var/log/nginx/error.log; FPM socket path matches nginx config |
10. References in this repository
| Topic | Location |
|---|---|
| Libraries and dependencies | docs/LIBRARIES_AND_DEPENDENCIES.md |
| PostgreSQL schema | database/postgresql/schema.sql, images.sql, data.sql (import in that order) |
| ClickHouse schema | database/clickhouse/schema.sql |
| ClickHouse log tuning (appliance) | build/appliance/run/ansible/roles/clickhouse/files/config.d/ |
| Ansible production install | build/appliance/run/ansible/glaber.yaml |
| UI development | ui/src/readme_en.md |
| Server config example | conf/zabbix_server.conf |