docker-compose.yml•2.38 kB
version: '3.8'
services:
# Browserless instance
browserless:
image: ghcr.io/browserless/chromium:latest
container_name: browserless
restart: unless-stopped
ports:
- "3000:3000"
environment:
- TOKEN=${BROWSERLESS_TOKEN:-your-secure-token-here}
- CONCURRENT=10
- TIMEOUT=120000
- HEALTH=true
- CORS=true
- MAX_CPU_PERCENT=85
- MAX_MEMORY_PERCENT=85
- ALLOW_FILE_PROTOCOL=false
- ALLOW_GET=true
- DEBUG=browserless:*
volumes:
- browserless_data:/app/data
- browserless_downloads:/app/downloads
- browserless_metrics:/app/metrics
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
deploy:
resources:
limits:
memory: 2G
cpus: '1.0'
reservations:
memory: 1G
cpus: '0.5'
# Browserless MCP Server
browserless-mcp:
build:
context: .
dockerfile: Dockerfile
container_name: browserless-mcp
restart: unless-stopped
environment:
- BROWSERLESS_HOST=browserless
- BROWSERLESS_PORT=3000
- BROWSERLESS_TOKEN=${BROWSERLESS_TOKEN:-your-secure-token-here}
- BROWSERLESS_PROTOCOL=http
- BROWSERLESS_TIMEOUT=30000
- BROWSERLESS_CONCURRENT=5
depends_on:
browserless:
condition: service_healthy
volumes:
- ./logs:/app/logs
healthcheck:
test: ["CMD", "node", "-e", "console.log('MCP server health check')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
# Optional: Nginx reverse proxy for SSL termination
nginx:
image: nginx:alpine
container_name: browserless-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- browserless
- browserless-mcp
profiles:
- production
volumes:
browserless_data:
driver: local
browserless_downloads:
driver: local
browserless_metrics:
driver: local
networks:
default:
name: browserless-network