Your infrastructure. Your database. Your network.
Voodu is self-hosted either way — Enterprise does not move your data somewhere else, because there is nowhere else. What it lifts are the caps the free tier puts on a single operator running a single box, and it lets the control plane live in a database your DBA already backs up.
Offline licence · no phone-home · nothing to open outbound

The free tier is a complete product. It is sized for one person.
One operator, one org, one box, three days of history. That is a real tool and it stays free. It stops being enough the moment a second person needs their own login, or a second team needs their own org, or an incident review asks what happened last month.
Telemetry — metrics, logs and HEP — stays in SQLite on the container's volume in both tiers, and rebuilds itself from your controllers if you lose it. Only the control plane (orgs, people, servers, encrypted tokens) moves to Postgres, because that is the part you cannot re-derive.
Written for the person who has to sign off on it.
Buying an observability tool usually means handing a vendor a path into production. This one is the opposite shape, and the reasons are structural rather than promises — they are consequences of how the licence and the transport are built.
The licence never calls home
It is a signed token your installation verifies locally with a public key baked into the image. No licence server, no outbound connection, no telemetry back to us. It works in an air-gapped network, and there is nothing for us to switch off.
It cannot be revoked out from under you
Being offline is the trade in both directions: your licence is valid until the expiry it was signed with. Nobody can reach in and end it early — not us, not somebody who compromises us.
Lapsing hides, it never deletes
Retention has two numbers: how long you keep telemetry, and how far back the UI will search. A lapsed licence only lowers the second one. The rows are still on your volume, and renewing shows them again.
Expiry is a slope, not a cliff
Entitlements stay live for 30 days past the expiry date. A renewal that lands late, or a purchase order stuck in someone’s approvals, does not take out the dashboard your team is watching an incident on.
Nothing leaves your network
The dashboard talks to your controllers and to your database. There is no vendor tenancy, no shared analytics, no support backdoor. What your operators see, they see from your own box.
The controller token is never in flight
Controller access tokens are encrypted at rest, and requests to the PAT plane carry a per-request HMAC signature instead of the token itself. Capturing a request gets you that one request, already used — not a credential.
One thing this page will not claim: traffic to your controllers on port 8687 is plain HTTP. The credential is protected by the request signature; the response bodies are not. That is fine inside a private network and is not fine across the public internet — put the plane behind your VPN or mesh, the same as you would any other admin API.
Paste it in. Nothing restarts.
You already have the installation. Enterprise is a token you paste into it — there is no separate build, no migration, and no window where the dashboard is down. The screen below is the free tier: the licence goes in the box on the left, and the panel on the right disappears the moment it verifies.

The signature is checked locally
Against a public key already in the image. If it does not verify, nothing changes and the screen says why.
The new limits apply on the next request
No restart, no redeploy. The operator watching a dashboard sees the caps lift without losing their page.
The activation is recorded
Who pasted it, when, and for which customer — kept as history, so a renewal a year later has an audit trail.
Pasting is the fastest route and the wrong one for a fleet you rebuild from scratch. For that, ship the licence as configuration — below.
Or ship it as configuration.
A licence supplied by environment is read at boot, so a container that is destroyed and recreated comes back licensed with no manual step. Whichever source is newer wins, so a token pasted into the UI later still takes precedence over a stale one in your environment.
docker run -d --name voodu-webui \
-p 3000:3000 \
-v voodu:/rails/storage \
-e VOODU_LICENSE="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
ghcr.io/thadeu/voodu-webuidocker run -d --name voodu-webui \
-p 3000:3000 \
-v voodu:/rails/storage \
-v /etc/voodu/license.jws:/run/secrets/voodu-license:ro \
-e VOODU_LICENSE_FILE=/run/secrets/voodu-license \
ghcr.io/thadeu/voodu-webuiThe compose file below is the shape most Enterprise installations run: the licence as a file secret, and the control plane in Postgres. Telemetry stays on the volume in both cases.
services:
webui:
image: ghcr.io/thadeu/voodu-webui
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- voodu:/rails/storage
- ./license.jws:/run/secrets/voodu-license:ro
environment:
VOODU_LICENSE_FILE: /run/secrets/voodu-license
# Control plane in your own Postgres. Omit it and everything
# runs on SQLite in the volume — still a supported Enterprise
# deployment, just one you back up differently.
DATABASE_URL: postgres://voodu:CHANGE_ME@postgres:5432/voodu
# How long telemetry is KEPT. The licence caps how far back the
# UI will search; this caps what is on disk at all.
VOODU_RETENTION_DAYS: "90"
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_USER: voodu
POSTGRES_PASSWORD: CHANGE_ME
POSTGRES_DB: voodu
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U voodu"]
interval: 5s
timeout: 3s
retries: 10
volumes:
voodu:
pgdata:There is no secret key to generate: the container creates and persists its own on first boot, in the volume. Migrations run on boot and are idempotent, so upgrading is pull and up -d — keep the volume and nothing else is needed.
What happens when it runs out.
Does the dashboard stop?
No. Entitlements stay live for 30 days past expiry, and after that the installation falls back to the free tier. It keeps running, keeps polling, keeps showing you your servers.
Do we lose the data we collected?
No. Telemetry lives on your volume under your own retention setting. A lapsed licence lowers how far back the UI searches, not what is stored — renewing brings the window back.
Are we forced off Postgres?
No. Losing a licence never disconnects a database that is holding your production control plane. That would be a data-loss event dressed up as enforcement.
What about the extra orgs and people?
They stay. What the free tier stops is creating more of them, not reaching the ones you have.
Can we try it before buying?
The free tier is the same binary, so there is nothing to trial except the caps. Ask and we will issue a time-boxed licence so you can size it against your own fleet.
What licence is the software under?
Elastic License 2.0. You can read it, run it, and modify it for your own use. What it stops is someone reselling it as a competing hosted product.
Tell us how big your fleet is.
Pricing follows the size of what you are running, and the answer comes from a person rather than a form. Bring your security questionnaire — the interesting parts are answered above.