Pixelle-Video Docker & Self-Hosted Deployment

GitHub

AI ๅ…จ่‡ชๅŠจ็Ÿญ่ง†้ข‘ๅผ•ๆ“Ž | AI Fully Automated Short Video Engine

22,683 stars Python Python 1 file ยท ~2,671 tokens #aigc#comfyui#image-generation#tts#video-generation
RAW Compose
1. Pull Image (DOCKERHUB) docker pull library/alpine
2. Docker Run (1-Click Launch) docker run -d --name pixelle-video -p 8000:8000 --restart always alpine:latest
3. Podman Run podman run -d --name pixelle-video -p 8000:8000 --restart always alpine:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/library/alpine:latest
5. ORAS Pull (OCI Artifact) oras pull alpine:latest
6. Compose Deployment docker compose up -d
docker-compose.yml
Download .yml
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