services: redis: image: redis:7-alpine container_name: whisper_redis restart: unless-stopped # RDB 스냅샷 저장 실패 시에도 쓰기 허용 (Celery 브로커 용도) command: redis-server --stop-writes-on-bgsave-error no environment: - TZ=Asia/Seoul volumes: - redis_data:/data networks: - whisper_net app: build: context: ./app dockerfile: Dockerfile container_name: whisper_app restart: unless-stopped ports: - "8800:8000" # 호스트 Nginx가 리버스 프록시 environment: - TZ=Asia/Seoul # ── 인증 (반드시 변경) ────────────────────────────── - AUTH_USERNAME=byun - AUTH_PASSWORD=admin - JWT_SECRET=your-very-secret-key-change-this - JWT_EXPIRE_HOURS=12 # ── Whisper STT ───────────────────────────────────── - REDIS_URL=redis://redis:6379/0 - UPLOAD_DIR=/data/uploads - OUTPUT_DIR=/data/outputs - WHISPER_MODEL=medium # tiny/base/small/medium/large-v3 - WHISPER_DEVICE=cpu - WHISPER_COMPUTE_TYPE=int8 - WHISPER_LANGUAGE=ko - WHISPER_BEAM_SIZE=5 - WHISPER_INITIAL_PROMPT= # 예: "고객 상담 녹취록입니다." # ── 파일 관리 ──────────────────────────────────────── - MAX_UPLOAD_MB=500 - OUTPUT_KEEP_HOURS=48 # ── PaddleOCR ──────────────────────────────────────── - OCR_LANG=korean # korean/en/japan/chinese_cht/ch # ── Ollama OCR ─────────────────────────────────────── # 호스트 실제 LAN IP 사용 (host.docker.internal은 Linux에서 불안정) - OLLAMA_URL=http://192.168.0.126:11434 - OLLAMA_TIMEOUT=600 # 11b 이상 모델은 300 이상 권장 volumes: - stt_data:/data - whisper_models:/root/.cache/huggingface - paddle_models:/root/.paddlex depends_on: - redis networks: - whisper_net worker: build: context: ./app dockerfile: Dockerfile container_name: whisper_worker restart: unless-stopped # --pool=solo : CTranslate2(faster-whisper)가 prefork 방식과 충돌(SIGSEGV) 발생 # solo 모드로 포크 없이 실행하여 해결 # --max-tasks-per-child=50 : Whisper/Paddle 모델 메모리 누수 방지 command: > celery -A tasks worker --loglevel=info --pool=solo --max-tasks-per-child=50 -Q stt,ocr environment: - TZ=Asia/Seoul - REDIS_URL=redis://redis:6379/0 - UPLOAD_DIR=/data/uploads - OUTPUT_DIR=/data/outputs - WHISPER_MODEL=medium - WHISPER_DEVICE=cpu - WHISPER_COMPUTE_TYPE=int8 - WHISPER_LANGUAGE=ko - WHISPER_BEAM_SIZE=5 - WHISPER_INITIAL_PROMPT= - MAX_UPLOAD_MB=500 - OUTPUT_KEEP_HOURS=48 - OCR_LANG=korean - OLLAMA_URL=http://192.168.0.126:11434 - OLLAMA_TIMEOUT=600 - JWT_SECRET=your-very-secret-key-change-this volumes: - stt_data:/data - whisper_models:/root/.cache/huggingface - paddle_models:/root/.paddlex depends_on: - redis networks: - whisper_net volumes: redis_data: stt_data: whisper_models: paddle_models: networks: whisper_net: driver: bridge