Docker
Run Vrata using the official multi-arch Docker image. No binary download needed.
Image
ghcr.io/achetronic/vrata:latest
Available for linux/amd64 and linux/arm64. The image contains both /server and /controller binaries on a distroless base.
Quick start
docker run -d \
--name vrata \
-p 8080:8080 \
-p 3000:3000 \
-v vrata-data:/data \
ghcr.io/achetronic/vrata:latest \
/server --config /dev/stdin <<'EOF'
mode: "controlplane"
controlPlane:
address: ":8080"
storePath: "/data"
log:
format: "json"
level: "info"
EOF
The REST API is on port 8080. Port 3000 is for a listener you’ll create via the API.
With a config file
Create config.yaml on your host:
mode: "controlplane"
controlPlane:
address: ":8080"
storePath: "/data"
log:
format: "json"
level: "info"
Mount it into the container:
docker run -d \
--name vrata \
-p 8080:8080 \
-p 3000:3000 \
-v $(pwd)/config.yaml:/etc/vrata/config.yaml:ro \
-v vrata-data:/data \
ghcr.io/achetronic/vrata:latest \
/server --config /etc/vrata/config.yaml
Docker Compose
services:
vrata:
image: ghcr.io/achetronic/vrata:latest
command: ["/server", "--config", "/etc/vrata/config.yaml"]
ports:
- "8080:8080"
- "3000:3000"
volumes:
- ./config.yaml:/etc/vrata/config.yaml:ro
- vrata-data:/data
volumes:
vrata-data:
docker compose up -d
Verify
# Swagger UI
open http://localhost:8080/api/v1/docs/
# Create a listener + destination + route + snapshot (same as binary install)
curl -s -X POST localhost:8080/api/v1/listeners \
-H 'Content-Type: application/json' \
-d '{"name": "main", "port": 3000}'
# ... (see Binary install for the full verification flow)
Pinning a version
Use a specific release tag instead of latest:
docker pull ghcr.io/achetronic/vrata:v0.1.0
Running the controller
The same image contains the controller binary. Override the entrypoint:
docker run -d \
--name vrata-controller \
-v $(pwd)/controller-config.yaml:/etc/vrata/config.yaml:ro \
ghcr.io/achetronic/vrata:latest \
/controller --config /etc/vrata/config.yaml