Docker Deployment
TL;DR
Deploy CMDOP Control Plane with Docker using docker-compose. The stack includes the CMDOP server, PostgreSQL 15, and Redis 7. Configure environment variables in a .env file, optionally add Traefik for automatic TLS, and use health checks and resource limits for production readiness.
Run CMDOP Control Plane using Docker containers.
How do I get started with Docker?
# Clone the CMDOP repository containing docker-compose.yaml
git clone https://github.com/cmdop/cmdop
cd cmdop
# Start all services (CMDOP server, PostgreSQL, Redis) in detached mode
docker-compose up -dWhat does the docker-compose.yaml look like?
version: '3.8'
services:
cmdop:
image: cmdop/server:latest
ports:
- "443:443"
- "50051:50051"
- "50052:50052"
environment:
- DB_HOST=postgres
- DB_PORT=5432
- DB_NAME=cmdop
- DB_USER=cmdop
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
- REDIS_PORT=6379
- JWT_SECRET=${JWT_SECRET}
- DOMAIN=${DOMAIN}
volumes:
- ./config.yaml:/app/config.yaml
- ./certs:/app/certs
depends_on:
- postgres
- redis
restart: unless-stopped
postgres:
image: postgres:15
environment:
- POSTGRES_DB=cmdop
- POSTGRES_USER=cmdop
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:7
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
restart: unless-stopped
volumes:
postgres_data:
redis_data:What environment variables are needed?
Create .env file:
# Database
DB_PASSWORD=your-secure-password
# Redis
REDIS_PASSWORD=your-redis-password
# Auth
JWT_SECRET=your-jwt-secret
# Domain
DOMAIN=cmdop.yourcompany.comHow do I configure the server?
What goes in config.yaml?
server:
http_port: 443
grpc_port: 50051
tls:
enabled: true
cert_file: /app/certs/cert.pem
key_file: /app/certs/key.pem
database:
host: ${DB_HOST}
port: ${DB_PORT}
name: ${DB_NAME}
user: ${DB_USER}
password: ${DB_PASSWORD}
redis:
host: ${REDIS_HOST}
port: ${REDIS_PORT}
password: ${REDIS_PASSWORD}How do I set up TLS with Traefik?
Using Traefik as reverse proxy with automatic TLS:
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=admin@yourcompany.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- letsencrypt:/letsencrypt
cmdop:
image: cmdop/server:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.cmdop.rule=Host(`cmdop.yourcompany.com`)"
- "traefik.http.routers.cmdop.entrypoints=websecure"
- "traefik.http.routers.cmdop.tls.certresolver=letsencrypt"
environment:
# ... same as above
depends_on:
- postgres
- redis
volumes:
letsencrypt:How do I build a custom Docker image?
# Dockerfile
FROM cmdop/server:latest
# Add custom config
COPY config.yaml /app/config.yaml
# Add custom plugins
COPY plugins/ /app/plugins/Build and run:
docker build -t my-cmdop .
docker run -d --name cmdop my-cmdopHow do I add health checks?
services:
cmdop:
# ...
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3How do I view and configure logs?
View logs:
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f cmdopConfigure log rotation:
services:
cmdop:
# ...
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"How do I back up the database?
# Database backup
docker-compose exec postgres pg_dump -U cmdop cmdop > backup.sql
# Restore
cat backup.sql | docker-compose exec -T postgres psql -U cmdop cmdopHow do I upgrade CMDOP?
# Pull latest images
docker-compose pull
# Restart services
docker-compose up -d
# Run migrations
docker-compose exec cmdop ./cmdop-server migrateHow do I set resource limits?
services:
cmdop:
# ...
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2GHow do I set up monitoring?
Add Prometheus metrics:
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafanaHow do I troubleshoot Docker issues?
What if the container won’t start?
# Check logs
docker-compose logs cmdop
# Check config
docker-compose config
# Interactive shell
docker-compose exec cmdop shHow do I debug database connection issues?
# Test PostgreSQL connectivity from the CMDOP container
docker-compose exec cmdop pg_isready -h postgres -U cmdopHow do I diagnose network issues?
# List all Docker networks to verify cmdop_default exists
docker network ls
# Inspect the network for IP assignments and connected containers
docker network inspect cmdop_defaultWhat should I read next?
- Kubernetes — K8s deployment
- Self-Hosted — Manual installation
Last updated on