Dify 완전 정복 가이드 1편: 아키텍처 분석 및 OS별 Docker 완전 설치Dify 소개·아키텍처·완전 설치 가이드 (1/3)

0
122
Ubuntu, Rocky, Oracle Linux 환경에서 Docker Compose를 활용하여 프로덕션 레벨의 Dify LLM 오픈소스 AI 플랫폼을 아키텍처 기반으로 완전 설치하는 가이드 대표 이미지
1편: Dify 시스템 아키텍처 이해와 리눅스 OS별 Docker Compose 완전 설치
🚀 Dify 완전 정복 가이드 — 3편 시리즈
시리즈1편 / 3편
퍼머링크dify-complete-guide-installation
섹션 수12개
🤖 Dify 소개 🏗️ 아키텍처 🐳 Docker 설치 🐧 Ubuntu Rocky Linux Oracle Linux
Dify가 무엇인지, 왜 선택해야 하는지부터 시작해 Ubuntu·Rocky·Oracle Linux 세 가지 OS에서 Docker Compose로 완전히 설치하는 방법을 한 편에 모두 담았습니다. 아키텍처 이해 → 하드웨어 요구사항 검증 → Docker 설치 → 디렉토리 설계 → .env 보안 설정 → 서비스 자동 등록까지 실제 프로덕션 환경 기준으로 설명합니다.
SECTION01

Dify 가이드 – Dify란 무엇인가

Dify(Do It For You)는 오픈소스 LLM 애플리케이션 개발 플랫폼입니다. GitHub 스타 90,000+를 돌파하며 셀프호스팅 AI 플랫폼 중 가장 활발하게 개발되는 대형 프로젝트입니다.

핵심 가치는 세 가지입니다. 첫째, 복잡한 AI 파이프라인을 코딩 없이 GUI로 구성합니다. 둘째, 단일 인터페이스로 100개 이상의 LLM 공급자를 통제합니다. 셋째, 완전한 셀프호스팅을 지원하여 핵심 데이터 유출을 원천 차단합니다.

Dify로 구축 가능한 핵심 기능

📂
RAG 기반 지식 챗봇 핵심 기능
PDF, 웹페이지, Notion 등을 파싱·인덱싱하여 정밀 문서 기반 Q&A 시스템 구현
주요 기술 스펙
벡터 검색과 BM25 하이브리드 검색을 기본 지원하며, 고도화된 컨텍스트 매칭을 제공합니다.
AI 워크플로우 자동화 시각적 구성
조건 분기, 반복, 격리 코드 실행을 포함한 정밀 파이프라인 제어
지원 노드 컴포넌트
IF/ELSE 분기 HTTP Request 코드 실행 샌드박스
🤖
멀티 모델 인프라 통합 관리 100+ 공급자
다양한 상용 LLM과 로컬 오픈소스 인프라 모델 통합 연동 및 스위칭
연동 예시
OpenAI GPT-4o, Anthropic Claude 및 로컬 인프라의 Ollama 가상엔진 완벽 호환

오픈소스 AI 플랫폼 지표 비교

플랫폼코딩 필요셀프호스팅RAG 지원워크플로우멀티 모델
Dify불필요완전 지원고급지원100+
LangChain필요지원고급코드 제어다수
Flowise불필요지원기본형지원제한적
n8n + AI일부 필요지원제한적강력제한적
💡
엔지니어가 셀프호스팅을 선택해야 하는 이유

Cloud 환경은 호출 세션 및 트래픽 제한과 민감 내부 데이터 유출 리스크가 따릅니다. 인하우스 홈랩을 통한 독자 인프라 배포는 초기 구성 이후 무제한 호출 트래픽 보장, 철저한 내부망 격리, 로컬 LLM 클러스터 직결 연동이라는 대체 불가능한 고유 이점을 가집니다.

SECTION02

Dify 시스템 아키텍처 완전 이해

Dify는 Docker Compose 오케스트레이션을 기반으로 다수의 마이크로서비스 컨테이너가 유기적으로 연동되어 작동합니다. 아키텍처 계층을 이해해야 트러블슈팅 발생 시 정확한 타깃 로그 파싱이 가능해집니다.

컨테이너 명칭기능 개요 및 역할표준 포트진단 포인트
dify-nginx모든 네트워크 인바운드 트래픽을 라우팅하는 리버스 프록시 진입점80 / 443웹 세션 접속 거부 발생 시
dify-webNext.js 기반의 프론트엔드 관리 웹 콘솔 대시보드3000UI 컴포넌트 렌더링 에러 발생 시
dify-apiFastAPI 기반의 코어 백엔드 API 서버 (비즈니스 로직 제어)5001인증 오류 및 API 호출 실패 시
dify-workerCelery 비동기 엔진 (문서 인덱싱, 청크 분할, 백그라운드 태스크)지식베이스 빌드 지연 발생 시
dify-dbPostgreSQL 인프라 데이터 레이어 (계정 및 히스토리 저장)5432데이터 무결성 에러 발생 시
dify-qdrant고속 벡터 DB 계층 (임베딩 벡터 스토리지 및 유사도 매칭)6333RAG 지식 검색 정밀도 유실 시
dify-sandbox격리된 코드 실행 가상 환경 (보안 자바스크립트/파이썬 실행 엔진)8194코드 노드 스크립트 실행 실패 시

트래픽 요청 및 비동기 파이프라인 흐름

Browser / Client Nginx (80/443) dify-api (FastAPI)
동기 쿼리 즉시 응답 반환
비동기 인덱싱 dify-redis (Broker) dify-worker (Celery)
임베딩 연산 Ollama Engine dify-qdrant (Vector)
⚠️
CRITICAL: 영구 볼륨 레이어 보호 조치 규칙

Dify 오케스트레이션 내의 모든 휘발성 영구 데이터는 호스트의 docker/volumes/ 디렉토리에 마운트됩니다. 데이터베이스 스키마와 물리 세션이 가동 중인 환경에서 컨테이너 검증 없이 빌드를 강제하거나, 마이그레이션 도중 해당 컨텍스트가 임의로 손상될 경우 DB 초기화로 인한 심각한 데이터 유실이 발생하므로 백업 정책 수립 전 절대 해당 볼륨 컨텍스트를 수정하지 마십시오.

SECTION03

인프라 하드웨어 요구사항 검증

호스트 인프라 표준 요구 사양 표

인프라 항목최소 가동 사양 (개발·테스트용)권장 운영 사양 (실전 빌드용)
물리 코어 수 (CPU)2 Cores4 Cores 이상 권장
시스템 메모리 (RAM)4 GB8 GB 이상 메인 메모리
스토리지 디스크 크기20 GB 여유 공간50 GB 이상 고속 가속 NVMe/SSD
인프라 구동 OS 환경Ubuntu 20.04 LTS / Rocky Linux 8Ubuntu 22.04+ / Rocky Linux 9 표준 호환
Docker Engine24.0+ 정식 릴리즈 버전최신 Stable 가동 환경

Ollama 로컬 가속 구동 시 추가 자원 할당 명세

가속 모델 크기예시 모델 컨텍스트최소 시스템 RAM 추가가속 VRAM 스펙 (권장)
7B Classqwen2.5:7b, llama3.1:8b+ 8 GB 이상5 GB+ 할당
12~14B Classqwen2.5:14b, mistral-nemo:12b+ 16 GB 이상9 GB+ 고속 VRAM
Embedding Layerbge-m3, nomic-embed-text+ 2 GB 최소1.5 GB 가속 스토리지
SECTION04

Dify 애플리케이션 유형 분석

Dify 프레임워크는 배포 목적에 맞춤화된 네 가지 비즈니스 앱 유형을 구조화하여 제공합니다.

앱 아키텍처 모델동작 메커니즘 특성추천 사용 타깃사례구현 난이도 배배지
Chatbot단순 턴제 대화형. 프롬프트 세팅 및 지식 연동 위주사내 표준 FAQ 및 상시 고객 응답 인프라Low
Agent툴 가동 자율 추론. 외부 검색 API 및 샌드박스 추론 연동자동 데이터 분석 파이프라인 및 리서치 팩트 체크Medium
Workflow완전 비대화형 자동화 파이프라인 정밀 노드 스트림대량 문서 일괄 전처리, 데이터 배치 트랜잭션Medium
Chat FlowWorkflow 제어와 대화 인터페이스의 복합 통합 모듈정밀 엔지니어링 조건 제어형 RAG 시스템High
SECTION05

설치 전 사전 준비

어떤 OS든 시작 전에 시스템을 최신 상태로 업데이트하고 필수 패키지를 설치합니다. 특히 전용 서비스 계정 생성은 보안과 권한 관리를 위해 프로덕션 환경에서 필수입니다.

Ubuntu 20.04 / 22.04 / 24.04

bash — Ubuntu
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y

# 필수 패키지 설치
sudo apt install -y \
  curl wget git vim \
  ca-certificates gnupg \
  lsb-release apt-transport-https \
  software-properties-common \
  htop net-tools

# (선택) 전용 서비스 계정 생성 — 프로덕션 권장
sudo useradd -m -s /bin/bash dify
sudo usermod -aG sudo dify
su - dify

Rocky Linux 8/9 & Oracle Linux 8/9

bash — Rocky / Oracle Linux
# 시스템 업데이트
sudo dnf update -y

# 필수 패키지 설치
sudo dnf install -y \
  curl wget git vim \
  ca-certificates \
  dnf-plugins-core \
  htop net-tools

# Oracle Linux 전용 — EPEL 저장소
sudo dnf install -y oracle-epel-release-el$(rpm -E %rhel)

# Rocky Linux 전용 — EPEL 저장소
# sudo dnf install -y epel-release

# SELinux 상태 확인 (Rocky/Oracle)
sestatus
SECTION06

Docker 설치 — Ubuntu

Ubuntu의 기본 apt 저장소에는 구버전 Docker가 포함되어 있습니다. 반드시 Docker 공식 저장소를 추가해서 최신 버전을 설치해야 합니다. Docker 29.x 미만 버전에서는 Watchtower 등 컨테이너 관리 도구에서 API 버전 불일치 문제가 발생할 수 있습니다.

bash — Ubuntu Docker 설치
# 1. 기존 Docker 완전 제거
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
  sudo apt remove -y $pkg 2>/dev/null
done

# 2. Docker GPG 키 및 저장소 추가
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 3. Docker Engine 설치
sudo apt update
sudo apt install -y \
  docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 4. docker 그룹에 현재 사용자 추가
sudo usermod -aG docker $USER
newgrp docker

# 5. 서비스 자동 시작
sudo systemctl enable --now docker

# 6. 설치 확인 (버전 확인)
docker --version        # Docker Engine 29.x+
docker compose version  # Docker Compose 2.x+
docker run hello-world  # 정상 동작 확인
⚠️
Ubuntu 24.04 — snap Docker 주의

Ubuntu 24.04에서 sudo snap install docker로 설치하면 구버전이 설치됩니다. snap list | grep docker로 확인 후 snap 버전이 있으면 sudo snap remove docker로 제거 후 위 방법으로 재설치하세요. snap 버전은 Docker API 버전이 낮아 호환성 문제가 발생합니다.

SECTION07

Docker 설치 — Rocky Linux & Oracle Linux

RHEL 계열 OS는 SELinux가 활성화되어 있어 Docker 컨테이너의 볼륨 접근에 추가 설정이 필요합니다. 이 설정을 놓치면 컨테이너가 시작하지 못하거나 파일을 읽지 못하는 문제가 발생합니다.

bash — Rocky / Oracle Linux Docker 설치
# 1. 기존 Docker 제거
sudo dnf remove -y docker docker-client docker-client-latest \
  docker-common docker-latest docker-latest-logrotate \
  docker-logrotate docker-engine 2>/dev/null || true

# 2. Docker 공식 저장소 추가
sudo dnf config-manager \
  --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# 3. Docker 설치
sudo dnf install -y \
  docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 4. docker 그룹 추가 및 서비스 시작
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable --now docker

# 5. SELinux — 컨테이너 cgroup 접근 허용 (Rocky/Oracle 필수)
sudo setsebool -P container_manage_cgroup 1

# 6. SELinux — 볼륨 마운트 컨텍스트 설정
# docker-compose.yml의 볼륨에 :z 또는 :Z 옵션을 추가하거나
# 아래와 같이 SELinux를 permissive 모드로 변경 (테스트 시)
# sudo setenforce 0

# 7. 방화벽 설정
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# 8. 설치 확인
docker --version
docker compose version
💡
SELinux Permissive vs Enforcing 선택

프로덕션 환경에서는 SELinux Enforcing을 유지하고 각 볼륨 마운트에 :z(공유) 또는 :Z(전용) 레이블을 추가하는 것이 보안상 올바릅니다. 개발/테스트 환경에서는 sudo setenforce 0으로 임시 비활성화하고 안정화 후 Enforcing으로 복원하세요.

SECTION08

디렉토리 구조 설계 & 권한 설정

Dify 데이터를 체계적으로 관리하기 위한 디렉토리 구조를 먼저 설계합니다. 특히 volumes/ 폴더의 권한이 잘못되면 컨테이너가 파일을 읽지 못해 침묵의 오류가 발생합니다.

bash — 디렉토리 생성 및 권한 설정
# 1. Dify 루트 경로 생성
sudo mkdir -p /opt/dify
sudo chown -R $USER:$USER /opt/dify
cd /opt/dify

# 2. Dify 소스 클론
git clone https://github.com/langgenius/dify.git .

# 특정 버전 고정 시 (안정성 중요한 경우)
# git checkout $(git describe --tags --abbrev=0)

# 3. volumes 하위 디렉토리 미리 생성
mkdir -p docker/volumes/{app/storage,db/data,redis/data,qdrant,sandbox/conf}

# 4. 소유권 및 권한 설정
sudo chown -R $USER:$USER /opt/dify
chmod -R 755 /opt/dify/docker/volumes
chmod 700 /opt/dify/docker/volumes/db/data  # PostgreSQL 보안 요구사항

# 5. .dockerignore 설정 (빌드 시 데이터 보호 필수)
echo "docker/volumes" >> /opt/dify/.dockerignore
echo "*.log" >> /opt/dify/.dockerignore

# 6. 구조 확인
tree /opt/dify/docker/volumes/ 2>/dev/null || \
  find /opt/dify/docker/volumes -type d | head -20

권장 디렉토리 구조

tree
/opt/dify/
├── docker/
│   ├── docker-compose.yaml       ← 컨테이너 오케스트레이션
│   ├── .env                      ← 환경변수 (민감 정보, git 제외)
│   ├── nginx/conf.d/             ← Nginx 가상호스트 설정
│   └── volumes/                  ← ★ 모든 영구 데이터 (백업 필수)
│       ├── app/storage/          ← 업로드 파일, 임시 파일
│       ├── db/data/              ← PostgreSQL 데이터
│       ├── redis/data/           ← Redis AOF/RDB 파일
│       ├── qdrant/               ← 벡터 임베딩 데이터
│       └── sandbox/conf/         ← Sandbox 설정
├── .dockerignore                 ← volumes/ 제외 설정
└── backup/                       ← 백업 스크립트 & 아카이브
🚨
데이터 손실 3대 금지 사항

docker compose down -v-v 플래그는 볼륨까지 삭제합니다. 컨테이너만 중지할 때는 docker compose stop 또는 docker compose down(v 없이)을 사용하세요.
② volumes 폴더 이동 상태에서 docker compose up — DB가 초기화됩니다.
docker system prune -a --volumes — 모든 볼륨이 삭제됩니다.

SECTION09

.env 환경변수 완전 설정 가이드

.env 파일은 Dify의 모든 동작을 제어합니다. 기본값 그대로 운영하면 보안 취약점이 됩니다. 특히 SECRET_KEY, DB_PASSWORD, REDIS_PASSWORD는 반드시 강력한 값으로 변경해야 합니다.

bash — .env 초기화
cd /opt/dify/docker
cp .env.example .env

# SECRET_KEY 생성 (42바이트 랜덤)
openssl rand -base64 42

# DB 비밀번호 생성
openssl rand -base64 24

필수 수정 항목 — 이것만은 반드시

.env — 핵심 설정
# ── 접속 URL (가장 중요 — 혼용 시 로그인 즉시 만료) ──────────
# 도메인 사용 시: https://dify.yourdomain.com
# IP 사용 시:     http://192.168.1.100
# ★ 반드시 한 가지 URL만 사용하고 그 URL로만 접속
CONSOLE_API_URL=http://YOUR_SERVER_IP_OR_DOMAIN
CONSOLE_WEB_URL=http://YOUR_SERVER_IP_OR_DOMAIN
SERVICE_API_URL=http://YOUR_SERVER_IP_OR_DOMAIN
APP_API_URL=http://YOUR_SERVER_IP_OR_DOMAIN
APP_WEB_URL=http://YOUR_SERVER_IP_OR_DOMAIN
FILES_URL=http://YOUR_SERVER_IP_OR_DOMAIN

# ── 보안 키 (openssl rand -base64 42 결과) ───────────────────
SECRET_KEY=YOUR_GENERATED_SECRET_KEY_HERE

# ── DB & Redis 비밀번호 ───────────────────────────────────────
DB_PASSWORD=YourStrongDBPassword123!
REDIS_PASSWORD=YourStrongRedisPass123!

# ── 벡터 DB (Qdrant 권장) ────────────────────────────────────
VECTOR_STORE=qdrant

# ── 포트 변경 필요 시 (기본 80) ─────────────────────────────
# EXPOSE_NGINX_PORT=8090
# EXPOSE_NGINX_SSL_PORT=8443

# ── 파일 업로드 크기 제한 ───────────────────────────────────
UPLOAD_FILE_SIZE_LIMIT=15
UPLOAD_FILE_BATCH_LIMIT=5
🚨
URL 설정 오류 — 로그인이 계속 풀리는 원인 1위

실제 접속 URL과 CONSOLE_WEB_URL이 다르면 토큰 도메인이 불일치하여 로그인 직후 세션이 즉시 만료됩니다. 로컬 IP(http://192.168.1.100)와 도메인(https://dify.example.com)을 혼용하면 반드시 이 문제가 발생합니다. 하나의 URL만 설정하고, 오직 그 URL로만 접속하세요.

SECTION10

Dify 설치 실행 & 정상 동작 확인

bash
# 1. docker 디렉토리로 이동
cd /opt/dify/docker

# 2. 이미지 다운로드 및 실행 (첫 실행 5~15분 소요)
docker compose up -d

# 3. 실행 상태 확인 — 모두 Up (healthy) 이어야 함
docker compose ps

# 4. 전체 로그 실시간 확인 (Ctrl+C로 종료)
docker compose logs -f

# 5. 특정 서비스 로그만 보기
docker compose logs -f dify-api      # API 오류 확인
docker compose logs -f dify-worker   # 인덱싱 오류 확인
docker compose logs -f dify-web      # 프론트엔드 오류 확인

정상 실행 상태 예시

bash — docker compose ps 정상 출력
NAME              STATUS              PORTS
dify-nginx        Up                  0.0.0.0:80->80/tcp
dify-api          Up (healthy)        5001/tcp
dify-web          Up                  3000/tcp
dify-worker       Up                  -
dify-db           Up (healthy)        5432/tcp
dify-redis        Up (healthy)        6379/tcp
dify-qdrant       Up                  6333/tcp, 6334/tcp
dify-sandbox      Up (healthy)        8194/tcp
설치 완료 — 최초 접속

브라우저에서 설정한 URL(http://서버IP)에 접속하면 관리자 계정 설정 화면이 나타납니다. 이메일, 비밀번호, 워크스페이스 이름을 설정하면 바로 사용 가능합니다.

SECTION11

systemd 서비스 등록 & 방화벽 / HTTPS 설정

systemd 서비스 등록 (재부팅 자동 시작)

bash — 모든 OS 공통
sudo tee /etc/systemd/system/dify.service > /dev/null << 'EOF'
[Unit]
Description=Dify AI Platform
After=docker.service network-online.target
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/dify/docker
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose stop
ExecReload=/usr/bin/docker compose restart
TimeoutStartSec=300
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now dify
sudo systemctl status dify

방화벽 설정

bash — Ubuntu (ufw)
sudo ufw allow 80/tcp comment "Dify HTTP"
sudo ufw allow 443/tcp comment "Dify HTTPS"
sudo ufw --force enable
sudo ufw status verbose
bash — Rocky / Oracle (firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Cloudflare Tunnel로 HTTPS 공개 (공인 IP 없는 경우)

bash — Cloudflare Tunnel 빠른 설정
# cloudflared 설치 (Ubuntu)
curl -L --output cloudflared.deb \
  https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb

# 로그인 및 터널 생성
cloudflared tunnel login
cloudflared tunnel create dify

# Cloudflare 대시보드에서 설정:
# Zero Trust → Networks → Tunnels → 생성한 터널 선택
# Public Hostname: dify.yourdomain.com → Service: http://localhost:80

# 서비스 등록
sudo cloudflared service install
sudo systemctl enable --now cloudflared
SECTION12

버전 업그레이드 & 마이그레이션 전략

Dify는 빠르게 업데이트됩니다. 업그레이드 전 반드시 백업하고, DB 마이그레이션이 포함된 버전은 특히 주의해야 합니다.

bash — 안전한 업그레이드 절차
# 1. 업그레이드 전 백업
cd /opt/dify
tar -czf /backup/dify-backup-$(date +%Y%m%d).tar.gz docker/volumes/

# 2. 최신 소스 가져오기
git fetch --tags
git log --oneline -5  # 최근 변경사항 확인
git pull origin main

# 3. .env 변경사항 확인 (새 환경변수 추가 여부)
diff .env.example docker/.env | grep "^>" | head -20

# 4. 최신 이미지 다운로드
cd docker && docker compose pull

# 5. 서비스 재시작
docker compose up -d

# 6. DB 마이그레이션 확인
docker compose logs dify-api | grep -i "migration\|alembic"

# 7. 정상 동작 확인
docker compose ps

다음 단계: 설치가 완료됐다면 다음 글에서 Ollama, OpenAI, Claude API 연동과 CUDA/VRAM 최적화를 진행합니다.

다음 편 →2편 — 모델 연동·워크플로우·에이전트 완전 정복

Leave A Reply

Please enter your comment!
Please enter your name here