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
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.
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 to8080and is overridable via thePORTenv var.
-e, --env-file, or your platform's secret store, never in a Dockerfile or committed file.
Verify
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.