# ── Production compose — KHÔNG mount source, image từ registry, bí mật qua .env ── # Dùng: docker compose -f docker-compose.prod.yml up -d services: redis: image: redis:7-alpine restart: unless-stopped web: image: ${IMAGE:-sonicforge-studio:latest} restart: unless-stopped ports: - "${WEB_PORT:-8000}:8000" env_file: .env volumes: - sf_data:/app/app/storage - ${VST3_DIR:-./vst_plugins}:/opt/daw_engine/vst3:ro - ${SOUNDFONTS_DIR:-./soundfonts}:/opt/daw_engine/soundfonts:ro - ${PIANOBOOK_DIR:-./samples/pianobook}:/opt/daw_engine/samples/pianobook:ro healthcheck: test: ["CMD", "python", "-c", "import urllib.request;urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 5s retries: 3 start_period: 15s depends_on: - redis worker: image: ${IMAGE:-sonicforge-studio:latest} restart: unless-stopped command: celery -A app.tasks.worker.celery_app worker --loglevel=info env_file: .env volumes: - sf_data:/app/app/storage - ${VST3_DIR:-./vst_plugins}:/opt/daw_engine/vst3:ro - ${SOUNDFONTS_DIR:-./soundfonts}:/opt/daw_engine/soundfonts:ro - ${PIANOBOOK_DIR:-./samples/pianobook}:/opt/daw_engine/samples/pianobook:ro depends_on: - redis beat: image: ${IMAGE:-sonicforge-studio:latest} restart: unless-stopped command: celery -A app.tasks.worker.celery_app beat --loglevel=info env_file: .env volumes: - sf_data:/app/app/storage depends_on: - redis volumes: sf_data: