One reverse proxy for every dock.
Route, secure and observe your services on a laptop, a VPS or a cluster. One static Rust binary on Cloudflare's Pingora, with Traefik's rule language and reloads that never drop a request.
docker run -p 80:80 ghcr.io/docker-hunterpedia/rdock:0.2.0-alpha.1Apache-2.0 · free forever · no account, no telemetry
listeners: web: { address: ":80" } websecure: { address: ":443", tls: {} } routes: app: match: "Host(`app.example.com`)" service: app middlewares: [gzip] api: match: "Host(`app.example.com`) && PathPrefix(`/api`)" service: api services: app: { backends: [{ address: "app:3000" }] } api: { backends: [{ address: "api:8080" }] } # HTTP → HTTPS redirect and HTTP/2 are on by default.
Rust on Pingora
The HTTP engine Cloudflare runs at its edge, with our own listeners on top. HTTP/1.1, HTTP/2, h2c, WebSocket, SSE and gRPC.
Reloads that drop nothing
Edit the file, send SIGHUP or call the API. A broken config is refused and the last good one keeps serving.
Labels on your containers
Route containers from rdock.* labels, with the common Traefik labels understood as they are.
Automatic HTTPS
Certificates from Let's Encrypt, renewed on schedule, including wildcards through DNS-01.
Keep your Traefik rules. Lose the boilerplate.
ReverseDock reads the same Host, PathPrefix and Headers matchers as Traefik v3, with the same priorities. Each migration guide maps every concept, shows both configs side by side and walks you through a switch-over you can roll back.
http: routers: app: rule: "Host(`app.example.com`)" service: app services: app: loadBalancer: servers: - url: "http://app:3000"
routes: app: match: "Host(`app.example.com`)" service: app services: app: backends: [{ address: "app:3000" }]
Every feature says when it ships.
No page promises what the binary can't do. A setting that isn't implemented yet is refused at start with the version it's planned for.
Where ReverseDock fits.
| Capability | ReverseDock | Traefik | Caddy | NGINX |
|---|---|---|---|---|
| Written in | Rust (Pingora) | Go | Go | C |
| License | Apache-2.0 | MIT | Apache-2.0 | BSD-2-Clause |
| Traefik rule syntax | Yes | Yes | No | No |
| Docker labels | Yes | Yes | With a plugin | No |
| Automatic HTTPS | v0.3 | Yes | Yes | With certbot |
| Reload without dropping requests | Yes | Yes | Yes | Yes |
The full matrix compares 171 capabilities across seven proxies, each with its source. Read the feature matrix
Running in five minutes.
A 26 MB image or a single static binary for Linux on x86-64 and ARM64. Every release is signed and ships with an SBOM, so you can check what you run.
docker run -d --name rdock \ -p 80:80 -p 443:443 \ -v "$PWD/config:/etc/rdock:ro" \ -v rdock-data:/var/lib/rdock \ ghcr.io/docker-hunterpedia/rdock:0.2.0-alpha.1
services:
rdock:
image: ghcr.io/docker-hunterpedia/rdock:0.2.0-alpha.1
ports: ["80:80", "443:443"]
volumes:
- ./config:/etc/rdock:ro
- rdock-data:/var/lib/rdock
read_only: true
volumes:
rdock-data:curl -LO https://github.com/Docker-Hunterpedia/ReverseDock/releases/download/v0.2.0-alpha.1/rdock-0.2.0-alpha.1-x86_64-unknown-linux-musl.tar.gz tar -xzf rdock-0.2.0-alpha.1-x86_64-unknown-linux-musl.tar.gz sudo install rdock-0.2.0-alpha.1-x86_64-unknown-linux-musl/rdock /usr/local/bin/ rdock validate /etc/rdock/rdock.yaml
sudo install -m 0644 deploy/systemd/rdock.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now rdock sudo systemctl reload rdock # after editing /etc/rdock/rdock.yaml
Read the docs, then put it in front of something real.
Guides for every middleware, a configuration reference generated from the schema, and troubleshooting by symptom.