2026년 3월 업데이트 8가지 서비스 설명

Dify Docker Compose 설정 가이드

Dify의 Docker 아키텍처에 관해 알아야 할 모든 것 — 각 컨테이너가 하는 일부터 커스텀 설정으로 프로덕션 배포를 강화하는 방법까지.

Dify의 Docker 아키텍처

Dify의 docker-compose.yaml은 8가지 서비스를 실행합니다. 각 서비스가 무엇을 하는지 이해하면 배포를 설정하고, 문제를 해결하고, 확장하는 데 도움이 됩니다.

nginx 리버스 프록시 / 웹 서버

들어오는 HTTP 요청을 올바른 내부 서비스(웹 UI 또는 API)로 라우팅합니다. 외부에서 접근 가능해야 하는 유일한 컨테이너입니다.

~50 MB
api Dify API 서버

주요 Python/Flask 백엔드. 모든 비즈니스 로직, LLM 호출, RAG 파이프라인 실행 및 REST API 엔드포인트를 처리합니다.

~300 MB
worker Celery 백그라운드 워커

비동기 작업을 처리합니다: 문서 인덱싱, 데이터셋 가져오기, 장기 실행 LLM 체인. API 컨테이너와 코드를 공유합니다.

~300 MB
web Next.js 프론트엔드

Next.js 앱으로 제공되는 React 기반 사용자 인터페이스. API 컨테이너와 통신합니다.

~150 MB
db PostgreSQL 데이터베이스

모든 영구 데이터를 저장합니다: 앱, 대화, 데이터셋 메타데이터, 사용자 및 API 키.

~100 MB
redis 캐시 및 메시지 브로커

자주 사용하는 쿼리를 캐시하고, 워커용 Celery 작업 큐를 저장하고, 속도 제한 데이터를 처리합니다.

~30 MB
weaviate 벡터 데이터베이스

RAG 지식 베이스용 문서 임베딩을 저장합니다. 가장 많은 메모리를 사용합니다. pgvector 또는 Qdrant로 교체할 수 있습니다.

~500 MB
sandbox 코드 실행 샌드박스

Dify 워크플로우에서 사용자 정의 코드 노드를 실행하기 위한 격리된 컨테이너. 제한된 권한으로 실행됩니다.

~100 MB

총 기본 RAM: 유휴 상태의 컨테이너만으로 ~1.5 GB. 4GB 서버에서는 OS 및 실제 워크로드용으로 ~2.5 GB가 남습니다. 프로덕션에는 8GB RAM을 권장합니다.

환경 변수 가이드

Dify의 모든 설정은 dify/docker/.env에 있습니다. .env.example에서 복사하고 다음 핵심 설정을 사용자 정의하세요:

보안 (필수)

# 생성 명령: openssl rand -base64 42
SECRET_KEY=your-very-long-random-secret-key

# 저장된 민감한 데이터 암호화 키
# 생성 명령: openssl rand -hex 16
ENCRYPT_IV=your-16-char-hex-value

데이터베이스 설정

# PostgreSQL 설정 (Docker 내부 네트워크)
DB_USERNAME=postgres
DB_PASSWORD=change-this-strong-password
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify

# Redis 설정
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=change-this-redis-password
REDIS_DB=0

URL 및 CORS 설정

# 도메인 (끝에 슬래시 없음)
CONSOLE_URL=https://your-domain.com
APP_URL=https://your-domain.com
SERVICE_API_URL=https://your-domain.com

# CORS 오리진 (쉼표로 구분)
CONSOLE_CORS_ALLOW_ORIGINS=https://your-domain.com
WEB_API_CORS_ALLOW_ORIGINS=https://your-domain.com

LLM API 키 (설정 시 선택 사항)

# Dify 웹 UI에서도 설정할 수 있습니다
# 이 .env 설정은 첫 실행 시 제공업체를 미리 설정합니다

OPENAI_API_KEY=sk-your-openai-key
ANTHROPIC_API_KEY=sk-ant-your-key
GOOGLE_API_KEY=your-gemini-key

# Ollama용 (로컬 LLM)
# UI에서 설정: 설정 → 모델 제공업체 → Ollama

커스텀 설정

커스텀 포트 매핑

포트 80이 사용 중이라면 .env를 편집하여 Dify Nginx가 바인딩할 호스트 포트를 변경하세요:

# Nginx 컨테이너의 호스트 포트 변경
EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=8443

Weaviate 비활성화 (pgvector 사용)

Weaviate는 ~500MB RAM을 사용합니다. 메모리가 제한된 서버에서는 PostgreSQL 컨테이너에서 이미 사용 가능한 pgvector로 전환하세요:

# .env에서 — 벡터 저장소를 pgvector로 변경
VECTOR_STORE=pgvector

# 그런 다음 Weaviate 없이 재시작
docker compose up -d --scale weaviate=0

GPU 지원 활성화

NVIDIA GPU를 전달하려면 (로컬 임베딩 모델용) docker-compose.override.yaml에 GPU 런타임을 추가하세요:

services:
  api:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

전체 설정 지침은 GPU 호스팅 가이드를 참조하세요.

자주 사용하는 명령어

모든 서비스 시작 docker compose up -d
모든 서비스 중지 docker compose down
단일 서비스 재시작 docker compose restart api
로그 보기 (스트림) docker compose logs -f api worker
API 컨테이너에 셸 열기 docker compose exec api bash
컨테이너 상태 확인 docker compose ps
컨테이너별 리소스 사용량 docker stats
중지된 컨테이너 제거 docker compose down --remove-orphans
최신 이미지 다운로드 docker compose pull
서비스 재빌드 docker compose up -d --build api

문제 해결

컨테이너가 계속 재시작됩니다

로그를 확인하세요: docker compose logs api. 일반적으로 SECRET_KEY의 잘못된 형식이나 누락된 필수 환경 변수가 원인입니다. SECRET_KEY가 최소 32자인지 확인하세요.

메모리 부족 — OOM killer에 의해 컨테이너가 종료됩니다

스왑 공간을 추가하거나 더 큰 서버로 업그레이드하세요. dmesg | grep -i "killed process"를 실행하여 OOM 실패를 확인하세요. Weaviate 컨테이너가 주로 원인입니다 — pgvector로 전환하는 것을 고려하세요.

웹 컨테이너가 API에 연결할 수 없습니다

.envCONSOLE_URLAPP_URL 변수가 실제 도메인과 일치하는지 확인하세요. CORS 오류는 거의 항상 잘못된 URL 설정으로 인해 발생합니다.