You run Maintenant on one server and it sees everything on that machine. Now you have a second VPS, then a third. Installing a separate Maintenant on each works, but you end up with three dashboards and three sets of alerts.
The multi-server mode keeps one dashboard: one server, and a lightweight agent on every other host.
How it works
- The server is a normal Maintenant instance, started with
--mode=server. It keeps the history, evaluates the alert rules and serves the dashboard. - Each agent is the same image, started with
--mode=agent. It reads the local Docker socket read-only (or Swarm, or Kubernetes, detected on its own) and streams container state, endpoints, certificates and host CPU, memory and disk to the server. - The link is one persistent gRPC stream, opened by the agent. No shared database, no message queue, no VPN.
- Every entity is attributed to its host, so two
postgrescontainers on two machines never get mixed up.
Enrolling a host
Enrollment uses a one-time token that you generate in the server’s interface. On first start, the agent creates an Ed25519 key pair locally, presents the token once, and from then on every stream is authenticated by challenge and response. You can revoke an agent from the interface at any time.
The interface generates the exact command. It looks like this:
docker run -d --name maintenant-agent --restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /proc:/host/proc:ro \
-v /etc/os-release:/host/etc/os-release:ro \
-v maintenant-agent-data:/var/lib/maintenant \
ghcr.io/kolapsis/maintenant:latest \
--mode=agent --server=grpcs://monitoring.example.com \
--enrollment-token=mnt_enr_XXXXXXXXXXXXXXXX --label="prod-worker-01"
On the server, set MAINTENANT_GRPC_URL to the address the agents will reach (for example grpcs://monitoring.example.com), so the generated commands point to the right place. The multi-host documentation covers the reverse proxy and TLS setup.
When an agent goes quiet
If the network drops, the agent keeps collecting into a local spool, reconnects on its own, and replays container events, resource samples and probe results once the stream is back. The graphs and the uptime keep no hole. On reconnect, it sends a fresh inventory first, so the current view is right immediately.
What each edition allows
| Community | Personal | Pro | |
|---|---|---|---|
| Machine running Maintenant | yes | yes | yes |
| Remote hosts through agents | none | up to 20 | Unlimited |
| Alert channels | webhook, Discord | + email, Telegram | + Slack, Teams, escalation |
| Use on someone else’s servers | yes (Apache 2.0) | no | yes |
The machine that runs the server is never counted. Personal is 149 € incl. VAT, once, for servers you own or run for yourself. If the servers belong to your clients, that is Pro.
Before you start
- The agents only need outgoing access to the server’s gRPC address.
- The server holds the agent identities. If you run it on PostgreSQL, a replacement server picks the fleet back up without re-enrolling anything.