An example of a full production deployment with high availability, monitoring, and backup.
A demonstration of using dockvirt in a production environment for an e-commerce company serving 10k+ users daily.
π Internet
β
ββββββββββ΄βββββββββ
β Load Balancer β
β lb.prod.com β
β Ubuntu 22.04 β
ββββββββββ¬βββββββββ
β
ββββββββββββββββββΌβββββββββββββββββ
β β β
βββββββββ΄ββββββββ ββββββββ΄βββββββ ββββββββ΄βββββββ
β Frontend 1 β β Frontend 2 β β Frontend 3 β
β app1.prod.com β βapp2.prod.comβ βapp3.prod.comβ
β React + Nginx β βReact + Nginxβ βReact + Nginxβ
β Ubuntu 22.04 β β Ubuntu 22.04β β Ubuntu 22.04β
βββββββββ¬ββββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ
β β β
ββββββββββββββββββΌβββββββββββββββββ
β
ββββββββββΌβββββββββ
β β
βββββββββ΄ββββββββ ββββββββ΄βββββββ
β API Server β β API Server β
β api1.prod.com β βapi2.prod.comβ
β Node.js + PM2 β βNode.js + PM2β
β Fedora 38 β β Fedora 38 β
βββββββββ¬ββββββββ ββββββββ¬βββββββ
β β
ββββββββββΌββββββββ
β
ββββββββββββββΌβββββββββββββ
β β β
ββββββββββ΄ββββββββ β βββββββββ΄βββββββββ
β Database β β β Cache β
β db.prod.com β β β cache.prod.com β
β PostgreSQL HA β β β Redis Cluster β
β Ubuntu 22.04 β β β Ubuntu 22.04 β
ββββββββββββββββββ β ββββββββββββββββββ
β
ββββββββββ΄βββββββββ
β Monitoring β
β mon.prod.com β
β Grafana+Prom+ELKβ
β Ubuntu 22.04 β
βββββββββββββββββββ
#!/bin/bash
# Production deployment script
set -e
echo "π Starting production deployment..."
# Build production images first
docker build -t nginx-lb:prod ./load-balancer
docker build -t ecommerce-frontend:v2.1.0 ./frontend
docker build -t ecommerce-api:v2.1.0 ./api
# Load Balancer
dockvirt up \
--name lb-prod \
--domain lb.prod.com \
--image nginx:latest \
--port 80 \
--mem 1024 \
--os ubuntu22.04
# Frontend Cluster (3 instances)
dockvirt up \
--name frontend-1 \
--domain app1.prod.com \
--image ecommerce-frontend:v2.1.0 \
--port 3000 \
--mem 2048 \
--os ubuntu22.04
dockvirt up \
--name frontend-2 \
--domain app2.prod.com \
--image ecommerce-frontend:v2.1.0 \
--port 3000 \
--mem 2048 \
--os ubuntu22.04
dockvirt up \
--name frontend-3 \
--domain app3.prod.com \
--image ecommerce-frontend:v2.1.0 \
--port 3000 \
--mem 2048 \
--os ubuntu22.04
# API Cluster (2 instances)
dockvirt up \
--name api-1 \
--domain api1.prod.com \
--image ecommerce-api:v2.1.0 \
--port 8080 \
--mem 4096 \
--cpus 4 \
--os fedora38
dockvirt up \
--name api-2 \
--domain api2.prod.com \
--image ecommerce-api:v2.1.0 \
--port 8080 \
--mem 4096 \
--cpus 4 \
--os fedora38
# Database (Primary-Secondary)
dockvirt up \
--name db-primary \
--domain db.prod.com \
--image postgres-ha:13 \
--port 5432 \
--mem 16384 \
--disk 500 \
--cpus 8 \
--os ubuntu22.04
# Redis Cache Cluster
dockvirt up \
--name cache-cluster \
--domain cache.prod.com \
--image redis-cluster:7 \
--port 6379 \
--mem 8192 \
--os ubuntu22.04
# Monitoring Stack
dockvirt up \
--name monitoring \
--domain mon.prod.com \
--image monitoring-stack:latest \
--port 3000,9090,5601 \
--mem 8192 \
--disk 200 \
--os ubuntu22.04
echo "β
Production deployment completed!"
echo "π Access your application at: https://lb.prod.com"
echo "π Monitoring: https://mon.prod.com"
Tip: Use the dockvirt CLI from the local repository virtualenv when testing locally to ensure the latest code is used:
# From repository root
. .venv-3.13/bin/activate
dockvirt --help
# Or call the binary explicitly from the venv
.venv-3.13/bin/dockvirt --help
yaml\n# prometheus-alerts.yml\ngroups:\n - name: production-alerts\n rules:\n - alert: HighAPILatency\n expr: avg(api_request_duration_seconds) > 2\n for: 5m\n annotations:\n summary: \"API latency is too high\"\n \n - alert: DatabaseConnectionsHigh\n expr: postgres_connections_active > 80\n for: 2m\n annotations:\n summary: \"Database connections approaching limit\"\n \n - alert: VMMemoryUsageHigh\n expr: vm_memory_usage_percent > 85\n for: 5m\n annotations:\n summary: \"VM memory usage is high\"\n
yaml\n# Caddyfile dla Load Balancer\nlb.prod.com {\n tls your-email@company.com\n \n # Round-robin load balancing\n reverse_proxy app1.prod.com app2.prod.com app3.prod.com {\n health_check /health\n health_check_interval 30s\n }\n \n # Security headers\n header {\n Strict-Transport-Security \"max-age=31536000;\"\n X-Content-Type-Options \"nosniff\"\n X-Frame-Options \"DENY\"\n X-XSS-Protection \"1; mode=block\"\n }\n}\n
bash\n#!/bin/bash\n# backup-production.sh\n\n# Database backup\ndockvirt exec db-primary -- pg_dump ecommerce > \"/backup/db-$(date +%Y%m%d).sql\"\n\n# VM snapshots \nvirsh snapshot-create-as frontend-1 \"daily-$(date +%Y%m%d)\"\nvirsh snapshot-create-as api-1 \"daily-$(date +%Y%m%d)\"\nvirsh snapshot-create-as db-primary \"daily-$(date +%Y%m%d)\"\n\n# Upload to S3\naws s3 sync /backup/ s3://company-backups/dockvirt/\n\necho \"β
Backup completed\"\n
bash\n# High-performance VM for the database\ndockvirt up \\\n --name db-optimized \\\n --domain db.prod.com \\\n --image postgres-tuned:13 \\\n --mem 32768 \\\n --cpus 16 \\\n --disk 1000 \\\n --disk-type ssd \\\n --cpu-model host-passthrough \\\n --os ubuntu22.04\n\n\n### Cache Configuration\n\nredis\n# Redis optimization\nmaxmemory 6gb\nmaxmemory-policy allkeys-lru\nsave 900 1\nsave 300 10\nsave 60 10000\n
bash\n# Add a new frontend node\ndockvirt up \\\n --name frontend-4 \\\n --domain app4.prod.com \\\n --image ecommerce-frontend:v2.1.0 \\\n --port 3000 \\\n --mem 2048 \\\n --os ubuntu22.04\n\n# Update the load balancer\ndockvirt exec lb-prod -- update-upstream app4.prod.com\n
yaml\n# autoscale.yml\nrules:\n - metric: cpu_usage\n threshold: 80\n action: scale_up\n max_instances: 10\n \n - metric: request_rate\n threshold: 1000\n action: scale_up\n cooldown: 300s\n
#!/bin/bash
# failover.sh
echo "π¨ Starting failover procedure..."
# Promote secondary database
dockvirt exec db-secondary -- promote-to-primary
# Update API configuration
dockvirt exec api-1 -- update-db-config db-secondary.prod.com
dockvirt exec api-2 -- update-db-config db-secondary.prod.com
# Health check
curl -f https://lb.prod.com/health || exit 1
echo "β
Failover completed successfully"
| Component | VM Count | vCPU | RAM | Storage | Monthly Cost* |
|---|---|---|---|---|---|
| Load Balancer | 1 | 2 | 4GB | 50GB | $45 |
| Frontend | 3 | 2 | 2GB | 20GB | $90 |
| API | 2 | 4 | 8GB | 50GB | $160 |
| Database | 1 | 8 | 32GB | 1TB | $320 |
| Cache | 1 | 4 | 8GB | 100GB | $95 |
| Monitoring | 1 | 4 | 8GB | 200GB | $105 |
| Total | 9 | 30 | 70GB | 1.49TB | $815 |
*Estimated costs for cloud VM equivalent
When verifying services by IP (before DNS is set up), include the Host header (Caddy/Reverse proxy):
curl -H 'Host: lb.prod.com' http://<lb_ip>/
curl -H 'Host: app1.prod.com' http://<app1_ip>/
curl -H 'Host: api1.prod.com' http://<api1_ip>/
curl -H 'Host: mon.prod.com' http://<mon_ip>/
Note: Do not run
dockvirtormakewithsudo. The tools request sudo only when needed and act on your real HOME.