version: '3'

services:
  # 1. 데이터베이스
  db_postgres:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_DATABASE}
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE}"]
      interval: 10s
    networks:
      - dify_bridge

  # 2. 레디스
  dify_redis:
    image: redis:7-alpine
    restart: always
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - ./volumes/redis/data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 5s
    networks:
      - dify_bridge

  # 3. 큐드란트
  qdrant:
    image: qdrant/qdrant:latest
    restart: always
    volumes:
      - ./volumes/qdrant:/qdrant/storage
    networks:
      - dify_bridge

  # 4. API 서버
  api:
    image: langgenius/dify-api:1.14.0
    restart: always
    ports:
      - "18080:5001"
    environment:
      MODE: api
    env_file: .env
    depends_on:
      db_postgres:
        condition: service_healthy
      dify_redis:
        condition: service_healthy
    volumes:
      - ./volumes/storage:/app/api/storage
    networks:
      - dify_bridge

  # 5. 워커 서버
  worker:
    image: langgenius/dify-api:1.14.0
    restart: always
    environment:
      MODE: worker
    env_file: .env
    depends_on:
      db_postgres:
        condition: service_healthy
      dify_redis:
        condition: service_healthy
    volumes:
      - ./volumes/storage:/app/api/storage
    networks:
      - dify_bridge

  # 6. 웹 UI
  web:
    image: langgenius/dify-web:1.14.0
    restart: always
    ports:
      - "18081:3000"
    env_file: .env
    depends_on:
      - api
    networks:
      - dify_bridge

  # 7. 플러그인 데몬 (DB 이름 dify로 강제 매핑)
  plugin_daemon:
    image: langgenius/dify-plugin-daemon:0.6.0-local
    restart: always
    ports:
      - "15002:5002"
    env_file: .env
    environment:
      # 로그 에러 핵심 해결: dify_plugin 대신 dify를 쓰라고 명령함
      DB_HOST: db_postgres
      DB_PORT: 5432
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_DATABASE: dify     
      SERVER_KEY: ${PLUGIN_DAEMON_KEY}
      DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY}
      DIFY_INNER_API_URL: http://api:5001
      PLUGIN_REMOTE_INSTALLING_HOST: 0.0.0.0
      PLUGIN_REMOTE_INSTALLING_PORT: 5003
      PLUGIN_WORKING_PATH: /app/storage/cwd
    depends_on:
      db_postgres:
        condition: service_healthy
    volumes:
      - ./volumes/plugin_daemon:/app/storage
    networks:
      - dify_bridge

  # 8. 샌드박스
  sandbox:
    image: langgenius/dify-sandbox:0.2.15
    restart: always
    env_file: .env
    networks:
      - dify_bridge

networks:
  dify_bridge:
    driver: bridge