version: '3.8' services: translator: build: context: . dockerfile: Dockerfile target: runtime image: vibeon-translator:latest container_name: vibeon-translator restart: unless-stopped ports: - "8000:8000" # API port - "9090:9090" # Metrics port volumes: - ./uploads:/app/uploads - ./logs:/app/logs - ./cache:/app/cache - model-cache:/app/models environment: - APP_NAME=vibeon-translator - API_VERSION=v2 - LOG_LEVEL=INFO - MAX_WORKERS=4 - ENABLE_GPU=true - CUDA_VISIBLE_DEVICES=0 - MODEL_CACHE_DIR=/app/models - REDIS_URL=redis://redis:6379/0 - ENABLE_MONITORING=true - PROMETHEUS_PORT=9090 depends_on: - redis - prometheus networks: - translator-network deploy: resources: limits: memory: 16G reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/v2/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s redis: image: redis:7-alpine container_name: vibeon-redis restart: unless-stopped ports: - "6379:6379" volumes: - redis-data:/data command: redis-server --appendonly yes --maxmemory 2gb --maxmemory-policy allkeys-lru networks: - translator-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 prometheus: image: prom/prometheus:latest container_name: vibeon-prometheus restart: unless-stopped ports: - "9091:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - 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: - translator-network grafana: image: grafana/grafana:latest container_name: vibeon-grafana restart: unless-stopped ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources environment: - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false depends_on: - prometheus networks: - translator-network nginx: image: nginx:alpine container_name: vibeon-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/ssl:/etc/nginx/ssl - ./web/templates:/usr/share/nginx/html depends_on: - translator networks: - translator-network # Optional: Jupyter notebook for testing and development jupyter: build: context: . dockerfile: Dockerfile target: runtime image: vibeon-translator:latest container_name: vibeon-jupyter ports: - "8888:8888" volumes: - ./notebooks:/app/notebooks - model-cache:/app/models environment: - JUPYTER_ENABLE_LAB=yes command: jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root networks: - translator-network profiles: - development # Model downloader service (runs once to download models) model-downloader: build: context: . dockerfile: Dockerfile target: builder container_name: vibeon-model-downloader volumes: - model-cache:/app/models command: python scripts/download_models.py networks: - translator-network profiles: - setup volumes: model-cache: driver: local redis-data: driver: local prometheus-data: driver: local grafana-data: driver: local networks: translator-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16