| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- version: '3.8'
- # Build Arguments Configuration
- # You can override these by setting environment variables before running docker-compose
- #
- # Example for China environment (auto uses Tsinghua mirror):
- # USE_CN_MIRROR=true docker-compose up -d
- #
- # Example for international environment (default):
- # docker-compose up -d
- services:
- # Init Service - Ensures config.yaml exists before other services start
- # This fixes the Docker issue where mounting a non-existent file creates a directory
- init:
- image: alpine:latest
- volumes:
- - ./:/workspace
- command: >
- sh -c '
- if [ -d /workspace/config.yaml ]; then
- echo "⚠️ config.yaml is a directory, removing it...";
- rm -rf /workspace/config.yaml;
- fi;
- if [ ! -f /workspace/config.yaml ] && [ -f /workspace/config.example.yaml ]; then
- echo "📋 Creating config.yaml from config.example.yaml...";
- cp /workspace/config.example.yaml /workspace/config.yaml;
- echo "✅ config.yaml created successfully!";
- else
- echo "✅ config.yaml already exists.";
- fi
- '
- restart: "no"
- # API Service - FastAPI backend
- api:
- build:
- context: .
- dockerfile: Dockerfile
- args:
- USE_CN_MIRROR: ${USE_CN_MIRROR:-false}
- container_name: pixelle-video-api
- command: .venv/bin/python api/app.py --host 0.0.0.0 --port 8000
- depends_on:
- init:
- condition: service_completed_successfully
- ports:
- - "8000:8000"
- volumes:
- # Mount config file (read-write to allow saving from Web UI)
- # Note: init service auto-creates config.yaml from config.example.yaml if not exists
- - ./config.yaml:/app/config.yaml
- # Mount data directories for persistence
- # data/ contains: users/, bgm/, templates/, workflows/ (custom resources)
- - ./data:/app/data
- - ./output:/app/output
- # Note: Default resources (bgm/, templates/, workflows/) are baked into the image
- # Custom resources in data/* will override defaults
- environment:
- - TZ=Asia/Shanghai
- restart: unless-stopped
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 10s
- logging:
- driver: "json-file"
- options:
- max-size: "10m"
- max-file: "3"
- networks:
- - pixelle-network
- # Web UI Service - Streamlit frontend
- web:
- build:
- context: .
- dockerfile: Dockerfile
- args:
- USE_CN_MIRROR: ${USE_CN_MIRROR:-false}
- container_name: pixelle-video-web
- command: .venv/bin/streamlit run web/app.py --server.port 8501 --server.address 0.0.0.0
- depends_on:
- init:
- condition: service_completed_successfully
- ports:
- - "8501:8501"
- volumes:
- # Mount config file (read-write to allow saving from Web UI)
- # Note: init service auto-creates config.yaml from config.example.yaml if not exists
- - ./config.yaml:/app/config.yaml
- # Mount data directories for persistence
- # data/ contains: users/, bgm/, templates/, workflows/ (custom resources)
- - ./data:/app/data
- - ./output:/app/output
- # Note: Default resources (bgm/, templates/, workflows/) are baked into the image
- # Custom resources in data/* will override defaults
- environment:
- - TZ=Asia/Shanghai
- - STREAMLIT_SERVER_PORT=8501
- - STREAMLIT_SERVER_ADDRESS=0.0.0.0
- - STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
- restart: unless-stopped
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8501/_stcore/health"]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 15s
- logging:
- driver: "json-file"
- options:
- max-size: "10m"
- max-file: "3"
- networks:
- - pixelle-network
- networks:
- pixelle-network:
- driver: bridge
|