Skip to content

2.2. Installation — plain Linux host

How to install OPENMARU Observability on an ordinary Linux host with Docker Compose.

Overview

OPENMARU Observability runs on an ordinary Linux host without Kubernetes. The server stack starts in one go with Docker Compose, and you deploy a node agent to each host you want to monitor.

Once installation is complete, the node agent collects metrics, logs, traces and profiling data on each host and sends them to the server. There is no need to change application code or install a separate SDK.

This chapter covers the shortest path from installation to seeing the screens. For details such as offline Docker installation in an air-gapped environment, the full list of environment variables, and per-language OpenTelemetry instrumentation, see the installation and operations manual.

Components

The following services run as containers together on a single server host.

ComponentRoleExternal port
ServerProcesses collected data and serves it to the UI8080
UIThe web screens you open in a browser80
KeycloakHandles sign-in (SSO)8081
OTel CollectorReceives OpenTelemetry data4317, 4318
PostgreSQLStores configuration and user informationInternal only
ClickHouseStores log, trace and profiling dataInternal only
VictoriaMetricsTime-series database that stores metricsInternal only
Cluster AgentCollects database and AWS RDS instrumentation metricsInternal only

The node agent is not part of this stack. You deploy it separately on every host you monitor.

Data flow

Data flow between the server and agents

Node agents push data to the server, so the server never needs to connect back to the monitored hosts even when they are spread across different locations.


System requirements

Server host

ItemRequirement
OSOrdinary Linux (x86_64 or ARM64), one server
RuntimeDocker and docker compose v2
Memory16 GB or more recommended — the container limits add up to about 13 GB
CPU16 vCPU or more recommended — the container limits add up to about 8 vCPU
DiskData accumulates under data/ in the deployment directory, in proportion to how long you retain logs and traces (ClickHouse)
Run privilegesMust be run as root
SELinuxIf Enforcing, access to the data directory is blocked

Why root is required: the start script hands the directories under data/ to the account each container runs as (chown). Without root this step is skipped, the containers cannot write to the data directory and they exit repeatedly.

SELinux: if it is Enforcing, turn it off with setenforce 0 and set SELINUX=disabled in /etc/selinux/config. If you would rather leave it on, add the :z label to the Compose volumes.

Hosts where the node agent is installed

The node agent collects data from the host kernel using eBPF. The requirements below apply to the host operating system, not to a container.

ItemRequirement
KernelLinux kernel 4.16 or later — checked at start-up; the agent will not start below this
RHEL familyRHEL 8 or later. RHEL, CentOS, Rocky and Alma 7 are not supported — their kernel is 3.10
tracefs/sys/kernel/debug/tracing or /sys/kernel/tracing must exist
NetworkMust be able to reach the server's collection port (8080 by default)
Deployment unitOne per host you monitor

Ports

PortPurpose
80UI access
8080Collection port the node agents send data to
8081Keycloak admin console
4317, 4318OpenTelemetry data ingestion

Note: if port 8080 is already in use on the host, change SERVER_HTTP_PORT in .env. The address the node agents point at must use the same port.


Installing the server stack

Copy the deployment directory (observ-server/) to the server host and run it as root.

cd observ-server

# 1) Start — give the server host IP and it is written into .env as the access address.
OBSERV_HOST=10.20.10.5 ./start-observ.sh

# 2) Verify — waits until the server is healthy, then prints the access address.
./verify-observ.sh

start-observ.sh does the following.

  1. Creates .env if it does not exist, generating the secrets used for sign-in at random.
  2. Creates the directories under data/ and hands them to the account each container runs as.
  3. Stops with an error if CHANGE-ME is still present in .env.
  4. Builds the sign-in (Keycloak) configuration and starts all services.

.env is created only once. To set the values again, delete .env and run the script again. If you do not provide OBSERV_HOST, the first IP on the host is detected and used.

Key settings

All configuration lives in a single .env file.

VariableDefaultDescription
UI_HTTP_PORT80UI access port
SERVER_HTTP_PORT8080Collection port the node agents connect to
KC_HTTP_PORT8081Keycloak admin console port
POSTGRES_PASSWORDopenmaru1234Configuration database password
CLICKHOUSE_PASSWORD27MefVmNE3ClickHouse password
OPENMARU_OBSERV_API_KEYbm56xxcbProject key used to authenticate agents and OpenTelemetry
SERVER_SECURE_COOKIEfalseMust be false when serving over HTTP. Set true behind an HTTPS proxy

Caution: always change the default passwords in a production environment. Changing a password in .env applies it to both the server and the database.

Management commands

CommandWhat it does
./start-observ.shStart everything
./stop-observ.shStop everything (data is preserved)
./status-observ.shCheck service status
./tail-observ.shFollow all logs
./verify-observ.shCheck that the server is healthy
./start-observ-one.sh <service>Restart a single service (stop and tail take the same form)

Service names: postgres, clickhouse, victoria-metrics, server, ui, otel-collector, cluster-agent, keycloak


Installing the node agent

Starting the server alone leaves the screens empty. Deploy a node agent to every host you want to monitor.

Copy the deployment directory (observ-node-agent/) to the target host, then:

cd observ-node-agent

# Give the server host address and the rest is configured automatically.
COLLECTOR_HOST=10.20.10.5 ./start-node-agent.sh

# Verify
./verify-node-agent.sh

COLLECTOR_HOST takes the IP address of the server host. If you changed SERVER_HTTP_PORT from its default on the server, point the agent at the same port.

Repeat the same procedure on each host you want to monitor.

The node agent must run against the host kernel, so its container runs with privileged rights. Use only images you trust.


Confirming the installation

# 1) Are all services up?
./status-observ.sh

# 2) Server health
curl http://localhost:8080/health

# 3) Are metrics from the node agents arriving?
curl 'http://127.0.0.1:8428/api/v1/query?query=up'

Open http://<server host>/ in a browser and sign in — installation is complete.

Default accounts

TargetAddressIDPassword
UIhttp://<server host>/omadmopenmaru12#$
Keycloak admin consolehttp://<server host>:8081/omadmopenmaru12#$

The two accounts share an ID but are separate accounts in different realms. Add or change UI users in the openmaru realm of the Keycloak admin console.

Caution: change the password on both accounts in a production environment.


Air-gapped environments

Where images cannot be pulled, move the image bundle as files and install from it.

# After restoring images/ into the deployment directory
./docker-load-image.sh # Detects the host architecture and registers the images
./start-observ.sh

The node agent deployment directory has a script of the same name. For the offline procedure when Docker itself is missing from the host, see the installation and operations manual.


Upgrading

docker compose pull && ./start-observ.sh
./verify-observ.sh

In an air-gapped environment, bring in the new image bundle, run ./docker-load-image.sh and start. Data remains under data/ in the deployment directory and carries over.


Removal

./stop-observ.sh

To delete the data as well, stop first and then remove data/ from the deployment directory. This cannot be undone, so back up anything you need first. Back up the configuration database with the following command.

docker compose exec postgres pg_dump -U "$POSTGRES_USER" openmaru-observ > pg-backup.sql

Troubleshooting

SymptomCause and action
Start-up stops with a CHANGE-ME errorA value in .env has not been changed. Replace that line with a production value
Containers exit repeatedly with permission errorsYou did not run as root, or SELinux is Enforcing. See "System requirements"
The server restarts repeatedlyThe database passwords in .env do not match. Check with ./tail-observ.sh server
The UI and collector do not come upThey are waiting for the server to become healthy. Check the server logs first
The screens load but the charts are emptyCheck that node agents are deployed and that they point at the right server address
A node is missing from the listRun ./verify-node-agent.sh on that host and check it can reach the server collection port
The sign-in screen is brokenThe Keycloak login theme files must be present in the deployment directory

For deeper diagnosis, see the Troubleshooting chapter and the installation and operations manual.


  • Quick start — the order in which to check your first data after installation
  • Dashboard — the first screen you see after installing
  • Servers — node status and agent management
  • Settings — API keys, alert channels, user management
  • Troubleshooting — diagnosing installation and connection problems