Self-host

Run the container image

Pull the published image and run it as a non-root container on port 8080, no build, no toolchain, just a container runtime.

Routeplane ships as a single container image. Pull it, give it provider keys and a virtual-key registry, and run it, no build step and no toolchain, just a container runtime. The image runs as a non-root user and listens on port 8080.

Pull the image

bashdocker pull
docker pull ghcr.io/routeplane-core/routeplane:latest

Pin to a released version in production (for example :1.4.0) rather than :latest, so deploys are reproducible.

Run the container

Provide provider credentials as environment variables and mount your virtual-key registry. The configs/ directory ships inside the image with an example registry; mount your own keys.json over it.

bashdocker run
docker run --rm -p 8080:8080 \
  -e OPENAI_API_KEY=sk-... \
  -e ANTHROPIC_API_KEY=sk-ant-... \
  -v "$PWD/keys.json:/usr/local/bin/configs/keys.json:ro" \
  ghcr.io/routeplane-core/routeplane:latest

Prefer an env file? Swap the -e flags for --env-file .env. The full set of variables and the keys.json shape are in Configuration.

Production posture is baked in

  • Non-root. The process runs as UID 1000, so the container does not need a platform-enforced security context.
  • Patched base. OS packages are kept current so fixable HIGH/CRITICAL CVEs in the base layer are not shipped.
  • Listens on $PORT. Defaults to 8080 and is overridable via the PORT env var.
Never bake secrets into the image or a derived layer. Inject provider keys at run time via -e, --env-file, or your platform's secret store, never in a Dockerfile or committed file.

Verify

bashsmoke test
curl -s http://localhost:8080/healthz          # 200 OK once the container is up

curl -s http://localhost:8080/v1/chat/completions \
  -H 'content-type: application/json' \
  -H 'x-routeplane-api-key: rp_dev_REPLACE_ME' \
  -H 'x-routeplane-provider: openai,anthropic' \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hello"}]}'

Ready to ship it somewhere? See Deploy to a container platform.