Quick start — Self-hosted Docker
Pull, run, license, done. The same API as hosted, on your own infrastructure.
1. Pull the image
docker pull rendarium/rendarium:latest
Tags: 2026.8.1 pins an exact build, 2026.8 follows the latest patch of a release, latest follows the newest release. Images are multi-arch (Linux x64 and ARM64). Pin an exact tag in production.
2. Run it
docker run -d --name rendarium -p 8490:8490 \
-e RENDARIUM_LICENSE_KEY= \
rendarium/rendarium:2026.8
RENDARIUM_LICENSE_KEY — leave empty for demo mode (watermarked output). Paste your license key to activate. The service listens on port 8490; GET /health returns 200 when ready.
curl -X POST http://localhost:8490/convert/html \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Hello from my server</h1>"}' \
--output hello.pdf
Without RENDARIUM_API_KEYS the container accepts unauthenticated requests — the normal choice on an internal network. There are no credits in self-hosted mode.
3. Add the license key
The key arrives by email after purchase (see licenses). It is verified offline at start-up with a public key embedded in the image: no activation server, no phone-home. GET /license reports the edition and the update horizon; the watermark disappears from every output.
docker run -d --name rendarium -p 8490:8490 \
-e RENDARIUM_LICENSE_KEY=RNDM2-XXXXXXXX-XXXXXXXX-... \
rendarium/rendarium:2026.8
A key with horizon 2027.08 runs every release whose year.month is ≤ 2027.08, forever. Pulling a release published after the horizon starts the container in demo mode and logs the reason.
4. Optional: require API keys
To let several teams share one container with distinct credentials, generate keys inside the image and list them in the environment:
docker run --rm rendarium/rendarium genkey
# rnd_self_q3w8e2r7t5y1u9i4o6p0a8s3d7f2g5h1
docker run -d -p 8490:8490 \
-e RENDARIUM_LICENSE_KEY=... \
-e RENDARIUM_API_KEYS=rnd_self_q3w8...,rnd_self_m4n7... \
rendarium/rendarium:2026.8
Clients then send Authorization: Bearer rnd_self_... exactly as against the hosted API. Comparison is constant-time; a wrong key gets 401. Rendarium never sees these keys.
5. Docker Compose
services:
rendarium:
image: rendarium/rendarium:2026.8
restart: unless-stopped
ports: ["8490:8490"]
environment:
# Leave empty for demo mode (watermarked). Paste your license key to activate.
RENDARIUM_LICENSE_KEY: ""
# RENDARIUM_API_KEYS: "rnd_self_..."
deploy:
resources:
limits: { cpus: "2", memory: 4G }
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8490/health"]
interval: 15s
timeout: 5s
retries: 3
6. Sizing and scaling
- Recommended per replica: 2 vCPU, 4 GB RAM. HTML rendering is CPU-bound; office conversions are lighter.
- The container is stateless. Run as many replicas as you need behind your own load balancer (nginx, Caddy, HAProxy, a Kubernetes Service) and route on
/health. - Use async jobs for very large documents so that a load balancer time-out never interrupts a conversion.
- Logs go to stdout in JSON; set
RENDARIUM_LOG_LEVEL=debugwhen investigating a rendering issue.