콘텐츠로 이동

Dify RAG 시스템 구축 계획서 v3.0

작성일: 2026-04-20
작성자: 미미 (4에이전트 종합 + 기존 v2.0 병합)
상태: 🔴 대기 (미미아빠 확인 후 시작)


  1. 프로젝트 개요
  2. 아키텍처 설계
  3. 인프라 구성
  4. 임베딩 모델 전략
  5. 데이터 수집 및 구조화
  6. 청킹 및 검색 전략
  7. LLM 티어링 전략
  8. 보안 및 권한 관리
  9. 백업 및 재해 복구
  10. 단계별 실행 계획
  11. 비용 추정
  12. 리스크 및 대응
  13. 체크리스트

개인이 보유한 문서, 위키, 대화 기록, 메모 등을 체계적으로 수집·구조화하여, 언제든 자연어로 질문하고 정확한 답변을 받을 수 있는 개인 지식 베이스를 구축한다.

  • 비용 최소화: 로컬 LLM을 기본으로, 클라우드 LLM은 보조용
  • 한국어 최우선: 임베딩·검색·생성 모두 한국어 품질 우선
  • 데이터 주권: 모든 데이터는 자가 호스팅, 외부 유출 금지
  • 점진적 확장: 작게 시작해서 검증 후 확대
장비사양용도
맥미니 M4 PromacOS, Tailscale: 100.96.177.124게이트웨이 (OpenClaw) + Caddy 리버스 프록시
메인컴i7-14700K + RTX 4070 + 96GB RAM, WSL2Dify 주력 서버
보조컴3900X + RTX 3080 + 64GB RAM, WSL2백업/장애 대응
주영나스WebDAV (http://minicity.kr:5005)데이터 저장소
백업나스SSH (100.83.176.55:55)백업 전용
Ollamaglm-5.1, qwen3.5, minimax-m2.5, gemma4:31b로컬 LLM
현재: /Volumes/minicity.kr/Backup_data/vault/MiniCITY(v0.2_진행중_0419-)/
참고: /Volumes/minicity.kr/Backup_data/vault/MiniCITY(v0.1_예전자료_0410-0419)/
원본: /Volumes/minicity.kr/Backup_data/vault/MiniCITY/ ← 건드리지 말 것!

┌─────────────────────────────────────────────────────┐
│ 맥미니 M4 Pro (게이트웨이) │
│ ┌──────────────────────────────────────────────┐ │
│ │ Caddy (리버스 프록시) │ │
│ │ dify.minicity.kr → 메인컴 WSL2:80 │ │
│ └──────────────────────────────────────────────┘ │
│ Tailscale: 100.96.177.124 │
└──────────────────────┬──────────────────────────────┘
│ Tailscale VPN
┌──────────────────────▼──────────────────────────────┐
│ 메인컴 (i7-14700K + RTX 4070 + 96GB) │
│ ┌──────────────────────────────────────────────┐ │
│ │ WSL2 Ubuntu 24.04 │ │
│ │ ┌────────────┐ ┌────────────┐ │ │
│ │ │ Dify │ │ Ollama │ │ │
│ │ │ Docker │ │ (host) │ │ │
│ │ │ Compose │ │ :11434 │ │ │
│ │ └────────────┘ └────────────┘ │ │
│ │ ┌────────────────────────────┐ │ │
│ │ │ Qdrant (벡터 DB) │ │ │
│ │ │ PostgreSQL + Redis │ │ │
│ │ │ NAS 마운트 (/mnt/nas) │ │ │
│ │ └────────────────────────────┘ │ │
│ └──────────────────────────────────────────────┘ │
│ Tailscale: 100.105.122.120 (WSL) │
└─────────────────────────────────────────────────────┘
  • 메인컴 선택: 96GB RAM + i7-14700K → Dify + Qdrant 구동에 충분
  • 보조컴은 대기: 장애 시 페일오버용
  • Ollama는 WSL2 host에서 실행: GPU 직접 사용 가능, Docker 내부에서는 host.docker.internal로 접근
서비스이미지포트역할
dify-weblanggenius/dify-web3000 (내부)프론트엔드
dify-apilanggenius/dify-api5001 (내부)백엔드 API
dify-workerlanggenius/dify-api백그라운드 작업
dify-pluginlanggenius/dify-plugin-daemon플러그인 실행기
qdrantqdrant/qdrant6333/6334 (내부)벡터 DB
postgrespostgres:15-alpine5432 (내부)메타데이터 DB
redisredis:7-alpine6379 (내부)캐시/큐
caddycaddy:2-alpine80, 443리버스 프록시 (WSL 내부)
ollama(기존 host 설치)11434로컬 LLM + 임베딩

참고: Dify는 자체 Nginx 컨테이너를 포함하므로, WSL 내부의 Caddy는 Dify의 Nginx를 경유. 맥미니의 Caddy가 최종 리버스 프록시 역할.


Terminal window
# 1. 필수 패키지
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 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
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. Docker Engine 설치 (Desktop 아님)
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 4. 서비스 시작 및 권한 설정
sudo systemctl start docker && sudo systemctl enable docker
sudo usermod -aG docker $USER && newgrp docker
# 5. 확인
docker --version && docker compose version

C:\Users\pinksky\.wslconfig:

[wsl2]
memory=64GB
swap=8GB
processors=12
[experimental]
autoMemoryReclaim=gradual
Terminal window
# 작업 디렉토리 생성 및 클론
mkdir -p ~/dify && cd ~/dify
git clone https://github.com/langgenius/dify.git
cd dify/docker
# 환경 설정
cp .env.example .env
SECRET_KEY=$(openssl rand -base64 42)
sed -i "s/^SECRET_KEY=.*/SECRET_KEY=${SECRET_KEY}/" .env
# 컨테이너 시작
docker compose up -d
docker compose ps # 모든 컨테이너 Up/healthy 확인
Terminal window
# === URL 설정 (맥미니 Caddy 경유) ===
CONSOLE_API_URL=https://dify.minicity.kr
CONSOLE_WEB_URL=https://dify.minicity.kr
SERVICE_API_URL=https://dify.minicity.kr
APP_API_URL=https://dify.minicity.kr
APP_WEB_URL=https://dify.minicity.kr
FILES_URL=https://dify.minicity.kr
# === 벡터 DB ===
VECTOR_STORE=qdrant
QDRANT_URL=http://qdrant:6333
# === 임베딩 (Dify 내에서 설정) ===
# Ollama를 통한 nomic-embed-text 사용
# === 보안 ===
SECRET_KEY=<openssl rand -base64 42 결과>
INIT_PASSWORD=Mini3388!Dify
# === 성능 ===
SERVER_WORKER_AMOUNT=4
CELERY_WORKER_AMOUNT=4
GUNICORN_TIMEOUT=360
APP_MAX_EXECUTION_TIME=1200
# === 데이터베이스 (운영 전 비밀번호 변경) ===
DB_USERNAME=postgres
DB_PASSWORD=difyai123456 # ← 운영 시 변경!
DB_HOST=db_postgres
DB_PORT=5432
DB_DATABASE=dify
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=difyai123456 # ← 운영 시 변경!
# === 로그 ===
LOG_LEVEL=INFO
LOG_TZ=Asia/Seoul
DEPLOY_ENV=PRODUCTION
/opt/homebrew/etc/caddy/Caddyfile
dify.minicity.kr {
reverse_proxy 100.105.122.120:80 {
header_up Connection {>Connection}
header_up Upgrade {>Upgrade}
}
request_body {
max_size 100MB
}
header {
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
Referrer-Policy strict-origin-when-cross-origin
}
log {
output file /var/log/caddy/dify-access.log {
roll_size 10mb
roll_keep 5
}
}
}
Terminal window
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on tailscale0 to any port 22 proto tcp # SSH
sudo ufw allow in on tailscale0 to any port 80 proto tcp # Dify HTTP
sudo ufw allow in on tailscale0 to any port 443 proto tcp # Dify HTTPS
sudo ufw allow in on tailscale0 to any port 11434 proto tcp # Ollama
sudo ufw enable

4.1 모델 선택: nomic-embed-text-v2-moe

섹션 제목: “4.1 모델 선택: nomic-embed-text-v2-moe”
항목내용
모델nomic-embed-text-v2-moe
지원 언어100개 언어 (한국어 포함)
아키텍처Mixture-of-Experts (MoE)
차원768 (Matryoshka로 256/512 축소 가능)
컨텍스트8192 토큰
크기~300M 파라미터
라이선스Apache 2.0
비교nomic-embed-text (v1)nomic-embed-text-v2-moe
한국어❌ 영어만 최적화✅ 100개 언어 학습
다국어 검색낮은 정확도MIRACL 벤치마크 우수
저장 효율기본Matryoshka로 3배 절감 가능
Ollama 지원

⚠️ 핵심: 한국어 문서가 중심이므로 v2-moe는 선택이 아닌 필수다.

768차원 (풀) → 품질 최고, 저장 용량 큼
512차원 (권장) → 품질 약간 저하, 저장 33% 절감 ← 여기서 시작
256차원 (축소) → 품질 저하 감수, 저장 66% 절감

권장: 512차원으로 시작 → 검색 품질 모니터링 → 문제 없으면 유지

nomic-embed-text-v2-moe가 한국어에서 기대 이하라면:

대안 모델한국어 품질크기Ollama
bge-m3★★★★★568M
multilingual-e5-large★★★★☆560M
JKoSimCLR★★★★★ (한국어 전용)335M수동 설치

권장: nomic v2-moe로 시작 → 한국어 검색 품질 테스트 → 미흡 시 bge-m3로 전환


┌─────────────────────────────────────────────────┐
│ 개인 지식 베이스 │
├──────────────┬──────────────┬────────────┬───────┤
│ ① 문서/위키 │ ② 대화 기록 │ ③ 작업 로그 │ ④ 참고 │
├──────────────┼──────────────┼────────────┼───────┤
│ Obsidian 볼트 │ AI 대화 기록 │ 개발 노트 │ 웹 클립 │
│ 마크다운 문서 │ 텔레그램 대화 │ 프로젝트 로그│ 논문/가이드│
│ PDF 문서 │ 디스코드 대화 │ Git 커밋 │ 레시피 │
│ 가전 매뉴얼 │ 이메일 │ 작업 일지 │ 매뉴얼 │
└──────────────┴──────────────┴────────────┴───────┘
소스형식수집 방식우선순위
Obsidian MiniCITY 볼트.md폴더 동기화 스크립트★★★
개인 정리 문서.md, .txt직접 업로드★★★
가전/장비 매뉴얼.pdf파일 업로드★★☆
정리된 위키.md, .htmlDify API★★☆
소스형식수집 방식우선순위
OpenClaw 세션 로그.json → .md변환 스크립트★★★
AI 대화 요약.md자동 추출★★★
텔레그램 중요 대화.txt, .md수동/반자동★★☆

핵심: 대화 기록은 원본 그대로 넣지 않는다. 주제별로 요약·구조화한 뒤에 넣어야 검색 품질이 높아진다.

소스형식수집 방식우선순위
개발/설정 노트.md직접 업로드★★★
트러블슈팅 기록.md직접 업로드★★★
서버 설정 기록.md, .yaml직접 업로드★★☆
소스형식수집 방식우선순위
웹 클리핑.md브라우저 확장★★☆
기술 블로그.mdURL → summarize 스킬★★☆
논문/가이드.pdf파일 업로드★☆☆

하나의 거대한 지식 베이스는 검색 품질을 떨어뜨린다. 주제별로 분할하라.

지식 베이스명내용예상 문서 수검색 모드
KB-obsidianObsidian 볼트 마크다운100~500하이브리드
KB-conversationsAI 대화 요약200~1000의미 검색
KB-tech-manuals기술 매뉴얼, 설정 가이드50~200하이브리드
KB-life레시피, 가사, 일상 기록50~100의미 검색
KB-reference웹 클립, 논문, 외부 자료100~300하이브리드
MiniCITY 볼트 (마크다운)
[동기화 스크립트] ← cron 또는 수동 실행
1. 변경된 파일 감지 (mtime 기준)
2. 프론트매터 → 메타데이터 추출
3. Dify API로 문서 업로드/업데이트
Dify KB-obsidian 지식 베이스
[청킹 + 임베딩] 자동 처리
Qdrant에 인덱싱

문서 유형청킹 크기오버랩분할 기준이유
마크다운 위키600 토큰100 토큰헤딩(#)+단락위키는 헤딩이 자연스러운 경계
대화 요약400 토큰80 토큰대화 세션 단위문맥 보존이 중요
기술 매뉴얼800 토큰150 토큰섹션+단락절차의 연속성 유지
레시피/일상500 토큰100 토큰자동짧은 문서가 많음
웹 클립/PDF600 토큰100 토큰자동혼합 포맷
metadata:
source: "obsidian" # obsidian | conversation | manual | web | email
category: "tech" # tech | life | reference | work | personal
subcategory: "devops" # 세부 분류
language: "ko" # ko | en | mixed
date: "2026-04-20" # 작성일
tags: ["docker", "dify", "rag"]
importance: "high" # high | medium | low
컬렉션명대응 지식 베이스벡터 차원거리 측도
kb_obsidianKB-obsidian512Cosine
kb_conversationsKB-conversations512Cosine
kb_tech_manualsKB-tech-manuals512Cosine
kb_lifeKB-life512Cosine
kb_referenceKB-reference512Cosine
  • 한국어는 교착어라 조사/어미가 단어 경계를 흐림 → 단순 공백 분리 부적합
  • 마크다운 구조(헤딩) 기반 분할이 한국어에 가장 안전
  • 오버랩을 100~150토큰으로 넉넉히 잡아 문맥 단절 방지

티어모델용도비용
Tier 1 (기본)glm-5.1 (Ollama)일반 질문, 간단 검색, 일상무료
Tier 2 (고급)minimax-m2.5 (Ollama)복잡 추론, 한국어 생성 품질무료
Tier 3 (최고급)클라우드 LLM (필요시)복잡 분석, 정밀 번역, 전문 영역유료 (최소화)
질문 수신
[복잡도 판별]
├─ 간단한 팩트 질문 → Tier 1 (glm-5.1)
├─ 복잡 추론/한국어 생성 → Tier 2 (minimax-m2.5)
└─ 전문 분석/정밀 작업 → Tier 3 (클라우드, 사용자 확인 후)
  1. 설정 → 모델 공급자 → Ollama 추가
  2. Base URL: http://host.docker.internal:11434
  3. 모델 등록: glm-5.1, minimax-m2.5, qwen3.5, gemma4:31b
  4. (선택) 클라우드 제공자 추가 → API 키 입력, 일일 한도 설정
  5. 각 앱의 기본 모델을 glm-5.1로 설정

인터넷 → (포트 제한) → Tailscale VPN → 메인컴 Dify
  • Tailscale 네트워크 내에서만 접근 허용
  • 공개 인터넷 노출 금지
  • Dify 컨테이너는 로컬만 리스닝 (127.0.0.1:3001:3000)
  • UFW로 Tailscale 인터페이스만 허용
역할권한사용 상황
Owner (미미아빠)전체 관리시스템 관리
Editor생성/편집/실행개발
Viewer읽기/실행일반 사용
  • 환경 변수로만 관리 (.env 파일)
  • 나스에 별도 암호화 저장
  • 90일마다 키 순환
  • 미사용 키 즉시 폐기
포트서비스접근 범위
80Dify (Nginx)Tailscale 내부
443Dify (Nginx)Tailscale 내부
11434Ollama APIDocker 내부 + Tailscale
5003Dify Plugin DaemonDocker 내부 전용
5432PostgreSQLDocker 내부 전용
6379RedisDocker 내부 전용
6333/6334QdrantDocker 내부 전용

데이터저장 위치백업 주기보관 기간
PostgreSQL (메타데이터)Docker 볼륨일 1회30일
Qdrant (벡터 인덱스)Docker 볼륨일 1회30일
업로드 파일/data/storage일 1회30일
Dify 설정 (.env, yaml)Git Repo변경 시무제한
Docker 이미지로컬업데이트 시3 버전
/opt/backup/dify-backup.sh
#!/bin/bash
BACKUP_DIR="/mnt/nas/dify-backups"
DATE=$(date +%Y%m%d)
# PostgreSQL 백업
docker exec dify-db pg_dump -U postgres dify > "$BACKUP_DIR/postgres/dify_${DATE}.sql"
# Qdrant 스냅샷
curl -X POST "http://localhost:6333/collections/kb_obsidian/snapshots"
# 파일 백업
rsync -avz /data/storage/ "$BACKUP_DIR/storage/${DATE}/"
# 30일 이상된 파일 삭제
find $BACKUP_DIR -type f -mtime +30 -delete
echo "[$(date)] Backup completed"
Terminal window
# 매일 새벽 3시 백업
0 3 * * * /opt/backup/dify-backup.sh >> /var/log/dify-backup.log 2>&1
시나리오대응소요 시간
메인컴 하드웨어 장애보조컴으로 페일오버30분~4시간
데이터 손실 (24h 이내)나스에서 최신 백업 복원1~2시간
전체 데이터 손실백업나스에서 복원4~8시간
나스 장애백업나스에서 복원2~4시간
  • RTO (복구 시간 목표): 4시간 이내
  • RPO (복구 지점 목표): 24시간 이전 데이터

단계작업완료 기준
1-1WSL2에 Docker + Docker Compose 설치docker compose version 동작
1-2.wslconfig 메모리 설정 (64GB)WSL 재시작 후 적용
1-3Dify 저장소 클론 및 .env 설정.env 파일 작성 완료
1-4VECTOR_STORE=qdrant 설정.env에 반영
1-5Docker Compose로 Dify 기동웹 UI 접속 확인
1-6맥미니 Caddy 리버스 프록시 설정dify.minicity.kr 접속 확인
1-7Ollama 연결 (LLM + 임베딩)모델 목록에 표시됨
단계작업완료 기준
2-1ollama pull nomic-embed-text-v2-moe모델 다운로드 완료
2-2Dify에서 임베딩 모델로 nomic 설정테스트 임베딩 성공
2-3테스트 문서 5개 업로드 후 한국어 검색 품질 확인한국어 검색 정상
단계작업완료 기준
3-1Obsidian 볼트에서 핵심 마크다운 50개 선별파일 목록 확정
3-2KB-obsidian 지식 베이스 생성 후 업로드인덱싱 완료
3-3기술 매뉴얼/설정 가이드 20개 수집KB-tech-manuals 생성
3-4검색 테스트 (10개 질문)8/10 이상 정확도
3-5청킹 설정 미세 조정검색 품질 개선 확인
단계작업완료 기준
4-1OpenClaw 세션 로그 변환 스크립트 작성JSON → 구조화된 마크다운
4-2AI 대화 요약 추출 및 KB-conversations 구축100+ 대화 요약 등록
4-3일상/레시피 문서 수집 → KB-life 구축30+ 문서 등록
4-4Obsidian 동기화 스크립트 v1 작성수동 실행으로 동기화 확인

Phase 5: 앱 구성 및 워크플로우 (3~5일)

섹션 제목: “Phase 5: 앱 구성 및 워크플로우 (3~5일)”
단계작업완료 기준
5-1기본 챗봇 앱 생성 (glm-5.1 + KB 연결)질문 응답 정상
5-2전문 검색 에이전트 앱 생성 (minimax-m2.5)복잡 질문 대응
5-3워크플로우: 복잡도 기반 자동 라우팅Tier 전환 동작 확인
5-4시스템 프롬프트 최적화 (한국어)응답 품질 향상
5-5출처 인용(Citation) 프롬프트 추가답변에 출처 표시됨
단계작업완료 기준
6-1Tailscale 외부 접근 테스트외부에서 접속 가능
6-2백업 스크립트 작성 및 cron 설정일일 자동 백업
6-3Obsidian 동기화 자동화 (cron)일일 자동 동기화
6-4검색 품질 정기 모니터링주간 테스트 루틴
6-5(선택) Prometheus + Grafana 모니터링대시보드 구축

항목비용비고
Dify (오픈소스)무료Self-hosted
Qdrant (오픈소스)무료Self-hosted
nomic-embed-text-v2-moe무료Apache 2.0
Ollama 로컬 LLM무료기존 하드웨어 사용
Caddy무료오픈소스
클라우드 LLM (예비)월 $0~5사용량에 따라
합계월 $0~5
항목비용비고
전기료 (24시간 구동)₩15,000~25,000기존 PC 전력
클라우드 LLM API$0~5긴급/전문 용도만
도메인 (선택)₩0~1,500Tailscale MagicDNS면 무료
합계₩15,000~30,000

리스크확률영향대응
nomic v2-moe 한국어 품질 저하높음대안: bge-m3로 전환
WSL2 메모리 부족높음.wslconfig로 제한, Qdrant 양자화
Qdrant 데이터 손실낮음매우 높음주간 스냅샷 + 나스 백업
로컬 LLM 응답 품질 한계중간클라우드 LLM 폴백 라우팅
Obsidian 동기화 충돌낮음낮음mtime 기반 변경 감지
Dify 버전 업그레이드 문제중간백업 후 업그레이드, 롤백 준비
host.docker.internal 미작동낮음중간WSL IP 직접 사용 또는 extra_hosts 설정

  • 메인컴 WSL2 메모리 충분 (64GB 할당)
  • Docker Engine 설치 완료
  • Tailscale 연결 정상
  • Ollama 실행 중 (glm-5.1, nomic-embed-text 등)
  • 맥미니 Caddy 설치 완료
  • 나스 접근 가능 (WebDAV 또는 SMB)
  • docker compose ps → 모든 컨테이너 Up/healthy
  • https://dify.minicity.kr 접속 가능
  • 관리자 계정 생성 완료
  • Ollama 모델 목록에 표시됨
  • nomic-embed-text-v2-moe 다운로드 완료
  • Dify에서 임베딩 모델로 등록됨
  • 테스트 문서 5개 업로드 후 한국어 검색 정상
  • KB-obsidian 50개 이상 문서 인덱싱
  • KB-tech-manuals 20개 이상 문서 인덱싱
  • 10개 테스트 질문 중 8개 이상 정답
  • KB-conversations 100개 이상 대화 요약
  • KB-life 30개 이상 문서
  • Obsidian 동기화 스크립트 동작
  • 기본 챗봇 정상 응답
  • 복잡도 라우팅 동작
  • 출처 인용 표시됨
  • 외부 접속 정상
  • 일일 자동 백업 동작
  • 주간 검색 품질 테스트 루틴 확립


작성일: 2026-04-20
버전: v3.0 (4에이전트 종합 + 기존 v2.0 병합)
다음 단계: 미미아빠 확인 후 Phase 1 시작