services: redis: image: redis:7 restart: unless-stopped minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY_ID:-videoroll} MINIO_ROOT_PASSWORD: ${S3_SECRET_ACCESS_KEY:-videorollsecret} ports: - "${PUBLISH_ADDR:-127.0.0.1}:${MINIO_CONSOLE_PORT:-9001}:9001" volumes: - ./data/minio:/data restart: unless-stopped minio-init: image: minio/mc:latest depends_on: - minio entrypoint: /bin/sh command: > -c " until mc alias set local http://minio:9000 ${S3_ACCESS_KEY_ID:-videoroll} ${S3_SECRET_ACCESS_KEY:-videorollsecret}; do echo 'waiting for minio...'; sleep 1; done && mc mb -p local/${S3_BUCKET:-videoroll} || true " restart: "no" app: build: context: . args: INSTALL_ASR: ${INSTALL_ASR:-1} YTDLP_VERSION: ${YTDLP_VERSION:-latest} image: videoroll:prod environment: DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} S3_ENDPOINT_URL: ${S3_ENDPOINT_URL} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY} S3_BUCKET: ${S3_BUCKET} S3_REGION_NAME: ${S3_REGION_NAME:-us-east-1} S3_USE_SSL: ${S3_USE_SSL:-false} SUBTITLE_ASR_ENGINE: ${SUBTITLE_ASR_ENGINE:-faster-whisper} SUBTITLE_WHISPER_MODEL: ${SUBTITLE_WHISPER_MODEL:-tiny} SUBTITLE_WHISPER_DEVICE: ${SUBTITLE_WHISPER_DEVICE:-cpu} SUBTITLE_WHISPER_COMPUTE_TYPE: ${SUBTITLE_WHISPER_COMPUTE_TYPE:-int8} SUBTITLE_WHISPER_MODEL_DIR: ${SUBTITLE_WHISPER_MODEL_DIR:-/models/whisper} SUBTITLE_OPENVINO_MODEL: ${SUBTITLE_OPENVINO_MODEL:-} SUBTITLE_OPENVINO_DEVICE: ${SUBTITLE_OPENVINO_DEVICE:-GPU} SUBTITLE_OPENVINO_NUM_BEAMS: ${SUBTITLE_OPENVINO_NUM_BEAMS:-1} SUBTITLE_OPENVINO_MAX_NEW_TOKENS: ${SUBTITLE_OPENVINO_MAX_NEW_TOKENS:-448} FFMPEG_PATH: ${FFMPEG_PATH:-ffmpeg} WORK_DIR: ${WORK_DIR:-/work/videoroll} UVICORN_ROOT_PATH: ${UVICORN_ROOT_PATH:-/api} YOUTUBE_USER_AGENT: "${YOUTUBE_USER_AGENT:-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36}" YOUTUBE_COOKIE_FILE: ${YOUTUBE_COOKIE_FILE:-} YOUTUBE_PROXY: ${YOUTUBE_PROXY:-} YOUTUBE_EXTRACTOR_ARGS_JSON: ${YOUTUBE_EXTRACTOR_ARGS_JSON:-} BILIBILI_PUBLISH_MODE: ${BILIBILI_PUBLISH_MODE:-web} CELERY_PUB_CONCURRENCY: ${CELERY_PUB_CONCURRENCY:-1} CELERY_BEAT_ENABLED: ${CELERY_BEAT_ENABLED:-true} TASK_QUEUE_TICK_INTERVAL_SECONDS: ${TASK_QUEUE_TICK_INTERVAL_SECONDS:-10} CORS_ALLOW_ORIGINS: ${CORS_ALLOW_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000} SUBTITLE_SERVICE_URL: ${SUBTITLE_SERVICE_URL:-http://localhost:8000/subtitle-service} YOUTUBE_INGEST_URL: ${YOUTUBE_INGEST_URL:-http://localhost:8000/youtube-ingest} BILIBILI_PUBLISHER_URL: ${BILIBILI_PUBLISHER_URL:-http://localhost:8000/bilibili-publisher} STORAGE_CLEANUP_INTERVAL_SECONDS: ${STORAGE_CLEANUP_INTERVAL_SECONDS:-3600} volumes: - ./data/models:/models - ./data/secrets:/secrets - ./data/work:/work extra_hosts: - host.docker.internal:host-gateway depends_on: redis: condition: service_started minio: condition: service_started minio-init: condition: service_completed_successfully restart: unless-stopped web: build: context: ./src/web args: VITE_ORCHESTRATOR_URL: ${VITE_ORCHESTRATOR_URL:-} VITE_SUBTITLE_SERVICE_URL: ${VITE_SUBTITLE_SERVICE_URL:-} VITE_YOUTUBE_INGEST_URL: ${VITE_YOUTUBE_INGEST_URL:-} VITE_BILIBILI_PUBLISHER_URL: ${VITE_BILIBILI_PUBLISHER_URL:-} image: videoroll-web:prod ports: - "${PUBLISH_ADDR:-127.0.0.1}:${WEB_PORT:-3000}:80" depends_on: app: condition: service_started restart: unless-stopped