version: '3.8' services: web: build: context: . dockerfile: Dockerfile image: markdown-web-browser:latest container_name: mdwb-web restart: unless-stopped ports: - "8000:8000" # FastAPI - "9000:9000" # Prometheus metrics environment: - OLMOCR_SERVER=${OLMOCR_SERVER:-https://ai2endpoints.cirrascale.ai/api} - OLMOCR_API_KEY=${OLMOCR_API_KEY} - OLMOCR_MODEL=${OLMOCR_MODEL:-olmOCR-2-7B-1025-FP8} - API_BASE_URL=${API_BASE_URL:-http://localhost:8000} - MDWB_API_KEY=${MDWB_API_KEY} - CACHE_ROOT=/app/.cache - RUNS_DB_PATH=/app/data/runs.db - WARNING_LOG_PATH=/app/ops/warnings.jsonl - PROMETHEUS_PORT=9000 - MDWB_SERVER_IMPL=${MDWB_SERVER_IMPL:-granian} - MDWB_SERVER_WORKERS=${MDWB_SERVER_WORKERS:-4} - MDWB_GRANIAN_RUNTIME_THREADS=${MDWB_GRANIAN_RUNTIME_THREADS:-2} - MDWB_SERVER_LOG_LEVEL=${MDWB_SERVER_LOG_LEVEL:-info} volumes: - ./data:/app/data - ./.cache:/app/.cache - ./ops:/app/ops - ./config:/app/config:ro networks: - mdwb-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s # Optional: Mock OCR server for development/testing mock-ocr: image: markdown-web-browser:latest container_name: mdwb-mock-ocr profiles: ["dev"] # Only starts with --profile dev command: ["python", "scripts/mock_ocr_server.py", "--host", "0.0.0.0", "--port", "8001"] restart: unless-stopped ports: - "8001:8001" networks: - mdwb-network # Optional: Redis for job queue (future enhancement) redis: image: redis:7-alpine container_name: mdwb-redis profiles: ["full"] # Only starts with --profile full restart: unless-stopped ports: - "6379:6379" volumes: - redis-data:/data networks: - mdwb-network command: redis-server --appendonly yes # Optional: PostgreSQL for production database postgres: image: postgres:16-alpine container_name: mdwb-postgres profiles: ["full"] # Only starts with --profile full restart: unless-stopped environment: - POSTGRES_DB=markdown_web_browser - POSTGRES_USER=${DB_USER:-mdwb} - POSTGRES_PASSWORD=${DB_PASSWORD:-changeme} ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data networks: - mdwb-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-mdwb}"] interval: 10s timeout: 5s retries: 5 # Optional: Nginx reverse proxy nginx: image: nginx:alpine container_name: mdwb-nginx profiles: ["production"] # Only starts with --profile production restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro depends_on: - web networks: - mdwb-network # Optional: Prometheus for monitoring prometheus: image: prom/prometheus:latest container_name: mdwb-prometheus profiles: ["monitoring"] # Only starts with --profile monitoring restart: unless-stopped ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' networks: - mdwb-network # Optional: Grafana for visualization grafana: image: grafana/grafana:latest container_name: mdwb-grafana profiles: ["monitoring"] # Only starts with --profile monitoring restart: unless-stopped ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana-data:/var/lib/grafana - ./grafana/dashboards:/etc/grafana/provisioning/dashboards:ro - ./grafana/datasources:/etc/grafana/provisioning/datasources:ro depends_on: - prometheus networks: - mdwb-network networks: mdwb-network: driver: bridge volumes: redis-data: postgres-data: prometheus-data: grafana-data: