Self-hosted container deployment. Push an image, Gordon routes it to the web.
- Website: https://gordon.bnema.dev
- Documentation: Docs | Wiki
- Discuss: GitHub Discussions
Gordon is a private container registry and HTTP reverse proxy for your VPS. Push a container image that exposes a web port — Gordon deploys it with zero downtime.
# Install
curl -fsSL https://gordon.bnema.dev/install.sh | sh
# Start the server
gordon serveConfig is created at ~/.config/gordon/gordon.toml. See the Getting Started guide for full setup.
Build locally, push directly to your Gordon server:
# Push an image and deploy it to a domain
gordon push app.example.com --image myapp:latest
# Or add a route manually, then deploy
gordon routes add app.example.com myapp:latest
gordon routes deploy app.example.com
# Check status
gordon statusRoll back, restart, or manage secrets — all from the command line:
gordon rollback app.example.com # Revert to a previous image tag
gordon restart app.example.com # Restart the container
gordon secrets set app.example.com DB_HOST=db.internal API_KEY=secret123Push to Gordon's registry from any CI pipeline. Gordon deploys automatically on image push.
- uses: bnema/gordon/.github/actions/deploy@main
with:
registry: registry.mydomain.com
username: ${{ secrets.GORDON_USERNAME }}
password: ${{ secrets.GORDON_TOKEN }}docker login registry.mydomain.com
docker build -t registry.mydomain.com/myapp:v1.0.0 .
docker push registry.mydomain.com/myapp:v1.0.0
# -> Deployed automaticallySee the Deploy Action README for multi-platform builds, monorepo support, and all available options.
| Command | Description |
|---|---|
gordon serve |
Start the Gordon server |
gordon status |
Show server and route health |
gordon config show |
Display server configuration |
| Command | Description |
|---|---|
gordon push <domain> |
Tag and push an image to deploy |
gordon routes list |
List all routes |
gordon routes add <domain> <image> |
Create or update a route |
gordon routes remove <domain> |
Remove a route |
gordon routes deploy <domain> |
Redeploy a route |
gordon rollback <domain> |
Roll back to a previous image |
gordon restart <domain> |
Restart a route container |
| Command | Description |
|---|---|
gordon images list |
List runtime and registry images |
gordon images prune |
Clean up dangling images and old tags |
gordon images tags <repo> |
List registry tags for a repository |
| Command | Description |
|---|---|
gordon secrets list <domain> |
List secrets for a route |
gordon secrets set <domain> KEY=VAL |
Set secrets |
gordon secrets remove <domain> <key> |
Remove a secret |
| Command | Description |
|---|---|
gordon remotes list |
List remote Gordon endpoints |
gordon remotes add <name> <url> |
Add a remote |
gordon remotes use <name> |
Set the active remote |
gordon auth login |
Authenticate to a remote |
gordon auth token generate |
Generate a JWT token |
- Private Docker registry on your VPS
- Domain-to-container routing via HTTP reverse proxy
- Automatic deployment on image push
- Auto-routing from image labels
- Remote CLI management
- Zero downtime updates
- Persistent volumes from Dockerfile VOLUME directives
- Environment variable management with secrets support
- Network isolation per application
- Single binary, ~15MB RAM
Full documentation at gordon.bnema.dev
GPL-3.0 — Use freely, contribute back.