Dify Docker Compose 설정 가이드
Dify의 Docker 아키텍처에 관해 알아야 할 모든 것 — 각 컨테이너가 하는 일부터 커스텀 설정으로 프로덕션 배포를 강화하는 방법까지.
Dify의 Docker 아키텍처
Dify의 docker-compose.yaml은 8가지 서비스를 실행합니다. 각 서비스가 무엇을 하는지 이해하면 배포를 설정하고, 문제를 해결하고, 확장하는 데 도움이 됩니다.
nginx 리버스 프록시 / 웹 서버 들어오는 HTTP 요청을 올바른 내부 서비스(웹 UI 또는 API)로 라우팅합니다. 외부에서 접근 가능해야 하는 유일한 컨테이너입니다.
api Dify API 서버 주요 Python/Flask 백엔드. 모든 비즈니스 로직, LLM 호출, RAG 파이프라인 실행 및 REST API 엔드포인트를 처리합니다.
worker Celery 백그라운드 워커 비동기 작업을 처리합니다: 문서 인덱싱, 데이터셋 가져오기, 장기 실행 LLM 체인. API 컨테이너와 코드를 공유합니다.
web Next.js 프론트엔드 Next.js 앱으로 제공되는 React 기반 사용자 인터페이스. API 컨테이너와 통신합니다.
db PostgreSQL 데이터베이스 모든 영구 데이터를 저장합니다: 앱, 대화, 데이터셋 메타데이터, 사용자 및 API 키.
redis 캐시 및 메시지 브로커 자주 사용하는 쿼리를 캐시하고, 워커용 Celery 작업 큐를 저장하고, 속도 제한 데이터를 처리합니다.
weaviate 벡터 데이터베이스 RAG 지식 베이스용 문서 임베딩을 저장합니다. 가장 많은 메모리를 사용합니다. pgvector 또는 Qdrant로 교체할 수 있습니다.
sandbox 코드 실행 샌드박스 Dify 워크플로우에서 사용자 정의 코드 노드를 실행하기 위한 격리된 컨테이너. 제한된 권한으로 실행됩니다.
총 기본 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 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에 연결할 수 없습니다
.env의 CONSOLE_URL 및 APP_URL 변수가 실제 도메인과 일치하는지 확인하세요. CORS 오류는 거의 항상 잘못된 URL 설정으로 인해 발생합니다.