Deployment Overview
Strategies for deploying applications with Gordon.
Deployment Methods
| Method | Use Case |
|---|---|
| Manual Push | Development, one-off deploys |
| GitHub Actions | Automated CI/CD |
| GitLab CI | Automated CI/CD |
| Generic CI | Any CI/CD system |
Basic Deployment Workflow
1. Build Locally
docker build -t myapp .
2. Tag for Registry
docker tag myapp registry.mydomain.com/myapp:latest
3. Push to Deploy
docker push registry.mydomain.com/myapp:latest
Gordon automatically:
- Receives the image
- Deploys a new container
- Routes traffic to it
- Stops the old container
Version Strategies
Latest Tag
Always deploy the most recent build:
docker tag myapp registry.mydomain.com/myapp:latest
docker push registry.mydomain.com/myapp:latest
Configure route:
[routes]
"app.mydomain.com" = "myapp:latest"
Semantic Versioning
Pin to specific versions:
docker tag myapp registry.mydomain.com/myapp:v2.1.0
docker push registry.mydomain.com/myapp:v2.1.0
Configure route:
[routes]
"app.mydomain.com" = "myapp:v2.1.0"
Update config to deploy new version:
[routes]
"app.mydomain.com" = "myapp:v2.2.0"
Git SHA Tags
Tag with commit hash for traceability:
VERSION=$(git rev-parse --short HEAD)
docker tag myapp registry.mydomain.com/myapp:$VERSION
docker push registry.mydomain.com/myapp:$VERSION
Zero-Downtime Deployment
Gordon performs zero-downtime deployments by default:
- New container starts while old is still running
- Health check waits for new container readiness
- Traffic switches to new container
- Old container stops after traffic moves
Timeline ─────────────────────────────────────────>
Old Container: [═══════════════════]
↓ stop
New Container: [═════════════════════════>
↑ start ↑ traffic routed
Environment-Specific Deployments
Development
[routes]
"dev.mydomain.com" = "myapp:latest"
docker push registry.mydomain.com/myapp:latest
Staging
[routes]
"staging.mydomain.com" = "myapp:staging"
docker tag myapp registry.mydomain.com/myapp:staging
docker push registry.mydomain.com/myapp:staging
Production
[routes]
"app.mydomain.com" = "myapp:v2.1.0"
docker tag myapp registry.mydomain.com/myapp:v2.1.0
docker push registry.mydomain.com/myapp:v2.1.0
# Then update gordon.toml and reload
Deployment Checklist
Before deploying:
- Build passes locally
- Tests pass
- Environment file configured (
~/.gordon/env/app_mydomain_com.env) - DNS pointing to Gordon server
- Route configured in
gordon.toml
After deploying:
- Container starts successfully
- Application responds to requests
- Logs show no errors
- Health checks pass
Monitoring Deployments
Watch Logs
gordon logs -f
Check Container Status
docker ps | grep gordon
Verify Routing
curl -I https://app.mydomain.com