Docker Deployment¶
Deploy Machineuse using Docker and Docker Compose.
Container Runtime Limitation
Docker containers cannot run systemd-nspawn (the actual browser container runtime). Docker deployment is for the management plane only. Browser containers require bare-metal or VM deployment with systemd support.
Quick Start¶
Single Node¶
git clone https://github.com/dotcommoners/machineuse.git
cd machineuse
# Start services
docker-compose up -d
# Check status
docker-compose ps
# View logs
docker-compose logs -f
Distributed Mode¶
# Start distributed cluster
docker-compose -f docker-compose.distributed.yml up -d
# Check all services
docker-compose -f docker-compose.distributed.yml ps
Services¶
Single Node (docker-compose.yml)¶
| Service | Port | Description |
|---|---|---|
| machineuse-api | 8000 | API server |
| postgres | 5432 | Database (optional) |
Distributed (docker-compose.distributed.yml)¶
| Service | Port | Description |
|---|---|---|
| control-plane | 8000, 5555 | Control plane |
| worker-1 | 8001 | Worker node 1 |
| worker-2 | 8002 | Worker node 2 |
| postgres | 5432 | Shared database |
Configuration¶
Environment Variables¶
services:
machineuse-api:
environment:
- MACHINEUSE_LOG_LEVEL=INFO
- MACHINEUSE_DATA_DIR=/var/lib/machineuse
- MACHINEUSE_MAX_INSTANCES=20
# For PostgreSQL backend:
- MACHINEUSE_DB_URL=postgresql://machineuse:machineuse@postgres:5432/machineuse
Volume Mounts¶
volumes:
- machineuse-data:/var/lib/machineuse # Data directory
- ./config:/etc/machineuse:ro # Configuration
Custom Configuration¶
Create config/config.json:
{
"deployment_mode": "single_node",
"api": {
"host": "0.0.0.0",
"port": 8000,
"cors_origins": ["https://yourdomain.com"]
},
"containers": {
"max_instances": 30
}
}
Mount it:
Building Images¶
Build Locally¶
# Build the image
docker build -t machineuse:latest .
# Build with specific tag
docker build -t machineuse:v2.0.0 .
Multi-architecture Build¶
Docker Compose Profiles¶
With PostgreSQL¶
Development Mode¶
# docker-compose.override.yml
services:
machineuse-api:
volumes:
- ./machineuse-api/machineuse:/app/machineuse:ro
environment:
- MACHINEUSE_LOG_LEVEL=DEBUG
Health Checks¶
Built-in health checks:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
Check health status:
Scaling Workers¶
Networking¶
Internal Network¶
Services communicate on the machineuse-net bridge network:
External Access¶
Expose ports as needed:
Custom Network¶
Persistent Storage¶
Named Volumes¶
Host Mounts¶
Logs¶
View Logs¶
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f machineuse-api
# Last 100 lines
docker-compose logs --tail=100 machineuse-api
Log Driver¶
Backup¶
Database Backup¶
# PostgreSQL backup
docker-compose exec postgres pg_dump -U machineuse machineuse > backup.sql
# Restore
docker-compose exec -T postgres psql -U machineuse machineuse < backup.sql
Volume Backup¶
# Backup data volume
docker run --rm \
-v machineuse_machineuse-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/machineuse-data.tar.gz /data
Production Considerations¶
Resource Limits¶
services:
machineuse-api:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
Restart Policy¶
Security¶
Upgrading¶
# Pull new images
docker-compose pull
# Recreate containers
docker-compose up -d --force-recreate
# Or with zero downtime (requires multiple replicas)
docker-compose up -d --no-deps --scale machineuse-api=2 machineuse-api
docker-compose up -d --no-deps --scale machineuse-api=1 machineuse-api
Troubleshooting¶
Container Won't Start¶
# Check logs
docker-compose logs machineuse-api
# Check container status
docker-compose ps
# Inspect container
docker inspect machineuse-api
Connection Issues¶
# Test internal connectivity
docker-compose exec machineuse-api curl http://postgres:5432
# Check network
docker network inspect machineuse_machineuse-net