version: '3.8' services: # Core processing services recorder: build: context: ./services/recorder dockerfile: Dockerfile container_name: voice-recorder restart: unless-stopped environment: - DISCORD_TOKEN=${DISCORD_TOKEN} - CLIENT_ID=${CLIENT_ID} - GUILD_ID=${GUILD_ID} - POSTGRES_URL=${POSTGRES_URL} - REDIS_URL=redis://redis:6379 volumes: - ./data/audio/raw:/app/audio/raw - ./data/logs:/app/logs depends_on: - postgres - redis networks: - voice-translator audio-processor: build: context: ./services/audio-processor dockerfile: Dockerfile container_name: voice-audio-processor restart: unless-stopped environment: - REDIS_URL=redis://redis:6379 - POSTGRES_URL=${POSTGRES_URL} volumes: - ./data/audio/raw:/app/audio/raw - ./data/audio/processed:/app/audio/processed - ./data/logs:/app/logs depends_on: - redis - postgres networks: - voice-translator whisper-service: build: context: ./services/whisper-service dockerfile: Dockerfile container_name: voice-whisper restart: unless-stopped runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES=all - REDIS_URL=redis://redis:6379 - POSTGRES_URL=${POSTGRES_URL} - WHISPER_MODEL=${WHISPER_MODEL:-large-v2} deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] volumes: - ./data/audio/processed:/app/audio/processed - ./data/models:/app/models - ./data/logs:/app/logs ports: - "8001:8000" # No conflict - available depends_on: - redis - postgres networks: - voice-translator translator: build: context: ./services/translator dockerfile: Dockerfile container_name: voice-translator restart: unless-stopped environment: - REDIS_URL=redis://redis:6379 - POSTGRES_URL=${POSTGRES_URL} - GOOGLE_TRANSLATE_API_KEY=${GOOGLE_TRANSLATE_API_KEY} - DEEPL_API_KEY=${DEEPL_API_KEY} - AZURE_TRANSLATOR_KEY=${AZURE_TRANSLATOR_KEY} - AZURE_TRANSLATOR_REGION=${AZURE_TRANSLATOR_REGION} volumes: - ./data/logs:/app/logs ports: - "8002:8000" # No conflict - available depends_on: - redis - postgres networks: - voice-translator transcriber: build: context: ./services/transcriber dockerfile: Dockerfile container_name: voice-transcriber restart: unless-stopped environment: - DISCORD_TOKEN=${DISCORD_TOKEN} - REDIS_URL=redis://redis:6379 - POSTGRES_URL=${POSTGRES_URL} - WHISPER_SERVICE_URL=http://whisper-service:8000 - TRANSLATOR_SERVICE_URL=http://translator:8000 volumes: - ./data/logs:/app/logs depends_on: - postgres - redis - whisper-service - translator networks: - voice-translator dashboard: build: context: ./services/dashboard dockerfile: Dockerfile container_name: voice-dashboard restart: unless-stopped environment: - POSTGRES_URL=${POSTGRES_URL} - REDIS_URL=redis://redis:6379 - NODE_ENV=production volumes: - ./data/logs:/app/logs ports: - "3010:3000" # Changed from 3000 to avoid Gitea conflict depends_on: - postgres - redis networks: - voice-translator # Data services postgres: image: postgres:15-alpine container_name: voice-postgres restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DB:-voice_translator} - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - ./data/database:/var/lib/postgresql/data - ./infrastructure/database/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5434:5432" # Changed from 5432 to avoid Excalidraw conflict networks: - voice-translator redis: image: redis:7-alpine container_name: voice-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - ./data/redis:/data - ./infrastructure/redis/redis.conf:/usr/local/etc/redis/redis.conf ports: - "6379:6379" # No conflict - available networks: - voice-translator # Optional management services nginx: image: nginx:alpine container_name: voice-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./infrastructure/nginx/nginx.conf:/etc/nginx/nginx.conf - ./infrastructure/nginx/ssl:/etc/nginx/ssl depends_on: - dashboard networks: - voice-translator profiles: - proxy # Optional admin interfaces pgadmin: image: dpage/pgadmin4:latest container_name: voice-pgadmin restart: unless-stopped environment: - PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL:-admin@example.com} - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD} ports: - "8085:80" # Changed from 8080 to avoid Owncast conflict depends_on: - postgres networks: - voice-translator profiles: - admin redis-commander: image: rediscommander/redis-commander:latest container_name: voice-redis-commander restart: unless-stopped environment: - REDIS_HOSTS=local:redis:6379 ports: - "8086:8081" # Changed from 8081 to avoid Restreamer conflict depends_on: - redis networks: - voice-translator profiles: - admin networks: voice-translator: driver: bridge volumes: postgres_data: redis_data: audio_data: model_cache: