Voodu iconvoodu
How it worksManifestStackDocsSSOEnterpriseFAQ
★ Star on GitHub
// enterprise

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 Voodu dashboard overview: CPU, memory and disk cards with sparklines, a table of running pods, recent incidents, alerts and dashboards
One server, three pods. The same screen at forty.
// what changes

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.

Limit
Free
Enterprise
Accounts
1
Unlimited
Orgs
1
Unlimited
Member invites
None
Unlimited
Searchable history
3 days
90 days
Control-plane database
SQLite
SQLite or your Postgres
Single sign-on
Perimeter only
Clowk SSO

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.

// the security review

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.

offline

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.

no lock-in

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.

no data loss

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.

grace

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.

your data

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.

credentials

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.

// activation

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 License screen on the free tier: a Plan card showing Free with its limits and an Activate a licence field, beside an Enterprise panel
Dashboard → account menu → License
step 1

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.

step 2

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.

step 3

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.

// deploying it

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 — inline
docker run -d --name voodu-webui \
  -p 3000:3000 \
  -v voodu:/rails/storage \
  -e VOODU_LICENSE="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
  ghcr.io/thadeu/voodu-webui
docker run — from a mounted secret
docker 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-webui

The 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.

docker-compose.yml
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.

// the awkward questions

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.