Dify RAG 시스템 구축 계획서
Dify RAG 시스템 구축 계획서
섹션 제목: “Dify RAG 시스템 구축 계획서”📋 개요
섹션 제목: “📋 개요”현재 인프라
섹션 제목: “현재 인프라”| 장비 | 사양 | 용도 |
|---|---|---|
| 맥미니 M4 Pro | macOS, Tailscale: 100.96.177.124 | 게이트웨이 (OpenClaw) |
| 메인컴 | i7-14700K + RTX 4070 + 96GB RAM, WSL2 | Dify 주력 서버 |
| 보조컴 | 3900X + RTX 3080 + 64GB RAM, WSL2 | 백업/장애 대응 |
| 주영나스 | WebDAV | 데이터 저장소 |
| ps-bk-nas | SSH | 백업 전용 나스 |
| Ollama | glm-5.1, qwen3.5, minimax-m2.5, gemma4:31b, nomic-embed-text | LLM/임베딩 |
요구사항
섹션 제목: “요구사항”- 웹 기반 UI ✓ (Dify 기본 제공)
- RBAC (역할 기반 접근 통제) ✓ (Dify内置)
- 파일 업로드 ✓
- 버전 관리 ✓ (Git-like 저장소)
- RAG 검색 ✓
- Dify 사용 ✓
1. Tailscale VPN 경유 접근 시 보안 설정
섹션 제목: “1. Tailscale VPN 경유 접근 시 보안 설정”권장 아키텍처
섹션 제목: “권장 아키텍처”인터넷 → (포트 제한) → Tailscale VPN → 메인컴 Dify구체적 설정
섹션 제목: “구체적 설정”1.1 Tailscale 접근 제어
섹션 제목: “1.1 Tailscale 접근 제어”# 나스/보조컴의 ACL 파일 설정{ "acls": [ # 메인컴에서만 Dify 접근 가능 { "src": ["tag:dify-server"], "dst": ["*:*"] }, # 특정 기기만 접근 허용 (게이트웨이, 메인컴, 보조컴) { "src": ["100.96.177.124", "100.105.122.120", "100.124.61.85"], "dst": ["*:*"] } ], "ssh": [ # SSH 접근 제한 { "src": ["group:admin"], "dst": ["tag:server"], "users": ["root"] } ]}1.2防火墙 설정 (메인컴 UFW)
섹션 제목: “1.2防火墙 설정 (메인컴 UFW)”# Tailscale 인터페이스만 허용ufw allow from 100.96.177.124/32 to any port 3000 comment "게이트웨이"ufw allow from 100.105.122.120/32 to any port 3000 comment "메인컴 WSL"ufw allow from 100.124.61.85/32 to any port 3000 comment "보조컴 WSL"
# 외부 접근 차단ufw default deny incomingufw enable1.3 Nginx 리버스 프록시 + Basic Auth (선택)
섹션 제목: “1.3 Nginx 리버스 프록시 + Basic Auth (선택)”server { listen 3000; server_name _;
location / { # Basic Auth (선택적) auth_basic "Dify Restricted"; auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}1.4 Dify 컨테이너 직접 노출 방지
섹션 제목: “1.4 Dify 컨테이너 직접 노출 방지”# docker-compose.yml - services/api/container_ports 수정services: api: ports: - "127.0.0.1:3001:3000" # 로컬만 listening2. 데이터 백업 전략
섹션 제목: “2. 데이터 백업 전략”2.1 백업 대상 및 주기
섹션 제목: “2.1 백업 대상 및 주기”| 데이터 종류 | 저장 위치 | 백업 주기 | 보관 기간 |
|---|---|---|---|
| PostgreSQL (메타데이터) | Docker 볼륨 | 일 1회 + 주 1회 | 30일/1년 |
| 벡터 DB (pgvector) | Docker 볼륨 | 일 1회 + 주 1회 | 30일/1년 |
| 업로드 파일 | /data/storage | 일 1회 | 30일 |
| Dify 설정 (env, yaml) | Git Repo | 버전별 | 무제한 |
| Docker 이미지 | 로컬 레지스트리 | 업데이트 시 | 3개 버전 |
2.2 백업 스크립트 예시
섹션 제목: “2.2 백업 스크립트 예시”#!/bin/bashBACKUP_DIR="/mnt/nas/dify-backups"DATE=$(date +%Y%m%d)CONTAINER_NAME="dify-api-1"
# PostgreSQL 백업docker exec $CONTAINER_NAME pg_dump -U postgres dify > "$BACKUP_DIR/postgres/dify_${DATE}.sql"
# 벡터 DB 백업 (pgvector)docker exec $CONTAINER_NAME pg_dump -U postgres pgvector > "$BACKUP_DIR/vector/pgvector_${DATE}.sql"
# 파일 백업rsync -avz /data/storage/ "$BACKUP_DIR/storage/${DATE}/"
# 나스로 복사 (주영나스 WebDAV)curl -u user:pass -T "$BACKUP_DIR/postgres/dify_${DATE}.sql" \ "https://nas.minicity.kr/webdav/dify-backups/"
# 30일 이상된 파일 삭제find $BACKUP_DIR -type f -mtime +30 -delete
echo "[$(date)] Backup completed" >> /var/log/dify-backup.log2.3 Cron 설정
섹션 제목: “2.3 Cron 설정”# crontab -e# 매일 새벽 3시 백업0 3 * * * /opt/backup/dify-backup.sh >> /var/log/dify-backup.log 2>&1
# 매주 일요일 전체 백업0 4 * * 0 /opt/backup/dify-full-backup.sh >> /var/log/dify-full-backup.log 2>&13. 장애 대응 (메인컴 다운 시 복구)
섹션 제목: “3. 장애 대응 (메인컴 다운 시 복구)”3.1 복구 목표 (RTO/RPO)
섹션 제목: “3.1 복구 목표 (RTO/RPO)”- RTO (복구 시간 목표): 4시간 이내
- RPO (복구 지점 목표): 24시간 이전 데이터
3.2 이중화架构
섹션 제목: “3.2 이중화架构”┌─────────────────┐ ┌─────────────────┐│ 메인컴 │ │ 보조컴 ││ (Dify 주력) │────▶│ (Dify 대기) ││ 14700K+4070 │ │ 3900X+3080 │└─────────────────┘ └─────────────────┘ │ │ ▼ ▼ [데이터 동기화] [자동 페일오버]3.3 구체적 장애 대응 절차
섹션 제목: “3.3 구체적 장애 대응 절차”3.3.1 실시간 동기화 ( GlusterFS 또는 rsync)
섹션 제목: “3.3.1 실시간 동기화 ( GlusterFS 또는 rsync)”# 보조컴에서 메인컴 데이터 동기화rsync -avz --delete \ --exclude='*.log' \ --exclude='.cache' \ user@100.105.122.120:/data/dify/ \ /data/dify-standby/3.3.2 자동 페일오버 스크립트
섹션 제목: “3.3.2 자동 페일오버 스크립트”#!/bin/bashMAIN_HOST="100.105.122.120"STANDBY_HOST="100.124.61.85"CHECK_INTERVAL=60
while true; do # 메인컴 health check if ! curl -sf http://$MAIN_HOST:3000/health > /dev/null 2>&1; then echo "[$(date)] 메인컴 연결 실패 - 페일오버 시작"
# Dify 서비스 중단 (메인컴) ssh user@$MAIN_HOST "docker-compose -f /opt/dify/docker-compose.yml down"
# 보조컴에서 Dify 시작 ssh user@$STANDBY_HOST "cd /opt/dify && docker-compose up -d"
# DNS 또는 IP 변경 알림 echo "Dify 서비스가 보조컴으로 이동되었습니다." >> /var/log/failover.log fi sleep $CHECK_INTERVALdone3.3.3 수동 복구 체크리스트
섹션 제목: “3.3.3 수동 복구 체크리스트”- 메인컴 상태 확인 (ping, SSH)
- 장애 원인 분석 (로그 확인)
- 데이터 동기화 상태 확인
- 보조컴에서 Dify 정상 동작 확인
- 사용자에게 새 접근 주소 안내
4. 사용자 권한 관리 (RBAC)
섹션 제목: “4. 사용자 권한 관리 (RBAC)”4.1 Dify 기본 RBAC
섹션 제목: “4.1 Dify 기본 RBAC”Dify는 기본적으로 다음과 같은 역할을 제공:
- ** Owner** (소유자): 전체 관리 권한
- ** Admin** (관리자): 워크플로우/앱 관리
- ** Editor** (편집자): 앱 생성/편집
- ** Viewer** (뷰어): 읽기 전용
4.2 커스텀 RBAC 설정
섹션 제목: “4.2 커스텀 RBAC 설정”# Dify의 API를 통한 사용자 관리 예시# 필요 시 Keycloak 연동 고려4.3 권장 권한 구조
섹션 제목: “4.3 권장 권한 구조”| 역할 | 권한范围 | 사용 상황 |
|---|---|---|
| Admin | 전체 관리 | 시스템 관리자 |
| Editor | 생성/편집/실행 | 개발자 |
| Viewer | 읽기/실행 | 최종 사용자 |
| API-User | API만 사용 | 외부 연동 |
5. API 키 관리
섹션 제목: “5. API 키 관리”5.1 Dify API 키 관리
섹션 제목: “5.1 Dify API 키 관리”# Dify API 키 생성 (관리자 페이지에서)# 웹 UI → 설정 → API 키
# 사용 예시curl -X POST 'http://100.105.122.120:3000/v1/chat-messages' \ -H 'Authorization: Bearer sk-xxxxx' \ -H 'Content-Type: application/json' \ -d '{"query": "안녕하세요", "response_mode": "blocking"}'5.2 키 관리 원칙
섹션 제목: “5.2 키 관리 원칙”-
환경 변수로 관리
Terminal window # .env 파일DIFY_API_KEY=sk-xxxxxxxxxxxxxDIFY_API_URL=http://localhost:3000 -
나스 분리 저장
- API 키는 나스에 별도 파일로 암호화 저장
- 서버에서는 환경 변수만 참조
-
키 순환 주기
- 90일마다 키 재발급
- 사용하지 않는 키는 즉시 폐기
6. 로그 모니터링
섹션 제목: “6. 로그 모니터링”6.1 Dify 로그 확인
섹션 제목: “6.1 Dify 로그 확인”# 전체 컨테이너 로그docker-compose -f /opt/dify/docker-compose.yml logs -f
# 특정 서비스만docker logs -f dify-api-1docker logs -f dify-worker-16.2集中 로그 관리 (선택)
섹션 제목: “6.2集中 로그 관리 (선택)”# docker-compose.yml에 Loki 추가services: loki: image: grafana/loki:latest ports: - "3100:3100" volumes: - ./loki-config.yml:/etc/loki/config.yml6.3 알림 설정
섹션 제목: “6.3 알림 설정”LOG_FILE="/var/log/dify.log"
# 오류 감지 시 알림tail -f $LOG_FILE | while read line; do if echo "$line" | grep -q "ERROR\|CRITICAL"; then # 텔레그램 알림 curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \ -d "chat_id=${CHAT_ID}&text=[Dify 오류] $line" fidone6.4 권장 모니터링 스택
섹션 제목: “6.4 권장 모니터링 스택”| 도구 | 용도 | 자원 |
|---|---|---|
| Prometheus + Grafana | 메트릭 수집/시각화 | 중 |
| Loki | 로그 수집 | 소 |
| AlertManager | 알림 | 소 |
7. Dify 버전 업데이트 전략
섹션 제목: “7. Dify 버전 업데이트 전략”7.1 업데이트 원칙
섹션 제목: “7.1 업데이트 원칙”- 테스트 환경 먼저: 보조컴에서 먼저 테스트
- 백업 필수: 업데이트 전 항상 전체 백업
- 마이너 업데이트 우선: 0.3.x → 0.3.y 순서로
- 릴리스 노트 확인: Breaking Changes 체크
7.2 업데이트 절차
섹션 제목: “7.2 업데이트 절차”# 1. 백업/opt/backup/dify-backup.sh
# 2. 현재 버전 확인cd /opt/difydocker-compose version
# 3. 이미지 다운로드docker-compose pull
# 4. 컨테이너 재시작docker-compose up -d
# 5. 마이그레이션 확인docker logs dify-api-1 | grep -i migration
# 6. 동작 확인curl http://localhost:3000/health7.3 롤백 절차
섹션 제목: “7.3 롤백 절차”# 이전 버전으로 롤백docker-compose -f /opt/dify/docker-compose.yml down
# docker-compose.yml에서 이미지 태그 변경# 예: image: langgenius/dify:0.14.0 → 0.13.0
docker-compose up -d7.4 버전 관리 표
섹션 제목: “7.4 버전 관리 표”| 버전 | 업데이트 날짜 | 비고 |
|---|---|---|
| 0.15.0 | - | 현재 사용 중 |
| 0.14.0 | 2026-02-15 | 이전 버전 |
| 0.13.0 | 2026-01-10 | 롤백용 |
8. 나스 연결 안정성 (WebDAV vs SMB/CIFS)
섹션 제목: “8. 나스 연결 안정성 (WebDAV vs SMB/CIFS)”8.1 비교 분석
섹션 제목: “8.1 비교 분석”| 방식 | 장점 | 단점 | 권장 상황 |
|---|---|---|---|
| WebDAV | HTTP/HTTPS만으로 접근, 방화벽 단순화 | 성능이 SMB보다 느림 | 외부 접근 (주영나스) |
| SMB/CIFS | 성능 우수, Windows 호환성 | Linux에서 추가 설정 필요 | 내부 네트워크 |
8.2 권장 구성
섹션 제목: “8.2 권장 구성”8.2.1 주영나스 (WebDAV) - 백업용
섹션 제목: “8.2.1 주영나스 (WebDAV) - 백업용”# WebDAV 마운트sudo mount -t davfs https://nas.minicity.kr/webdav /mnt/nas-dav \ -o user=username,passwd=/opt/.davfs-passwd
# fstab 등록 (부팅 시 자동 마운트)echo "https://nas.minicity.kr/webdav /mnt/nas-dav davfs user,noauto 0 0" | sudo tee -a /etc/fstab8.2.2 로컬 나스 (SMB) - 데이터 저장용
섹션 제목: “8.2.2 로컬 나스 (SMB) - 데이터 저장용”# SMB 마운트 (WSL에서)sudo mount -t cifs //192.168.x.x/share /mnt/nas-smb \ -o username=user,password=pass,vers=3.08.3 안정성 향상 팁
섹션 제목: “8.3 안정성 향상 팁”- ** mounts 옵션**:
soft,timeo=30,retry=3(연결 실패 시 자동 재시도) - ** cron으로 주기적 마운트 확인**: 연결 끊기면 자동 재연결
- ** 로컬 캐시 활용**:频繁 접근 파일은 로컬에 캐시
9. 재해 복구 계획
섹션 제목: “9. 재해 복구 계획”9.1 재해 시나리오별 대응
섹션 제목: “9.1 재해 시나리오별 대응”| 시나리오 | 대응 방법 | 소요 시간 |
|---|---|---|
| 메인컴 하드웨어 장애 | 보조컴으로 페일오버 | 30분~4시간 |
| 데이터 손실 (24시간 이내) | 나스에서 최신 백업 복원 | 1~2시간 |
| 전체 데이터 손실 | 원격 백업 (ps-bk-nas)에서 복원 | 4~8시간 |
| 나스 장애 | ps-bk-nas에서 복원 | 2~4시간 |
9.2 복구 체크리스트
섹션 제목: “9.2 복구 체크리스트”9.2.1 전체 시스템 복구
섹션 제목: “9.2.1 전체 시스템 복구”[ ] 하드웨어/서버 준비[ ] OS 설치 및 기본 설정[ ] Docker, Docker-compose 설치[ ] 네트워크 설정 (Tailscale, 방화벽)[ ] Dify 설치 (docker-compose)[ ] 백업 데이터 복원[ ] 서비스 정상 동작 확인[ ] 사용자 접근 테스트9.2.2 데이터만 복구
섹션 제목: “9.2.2 데이터만 복구”[ ] Dify 컨테이너 정상 동작 확인[ ] PostgreSQL 백업 복원[ ] 벡터 DB 백업 복원[ ] 업로드 파일 복원[ ] 인덱스 재구성 (필요 시)[ ] 데이터 무결성 확인9.3 복구 훈련
섹션 제목: “9.3 복구 훈련”- 분기별 (3개월) 1회 복구 훈련 실시
- 문서화된 절차대로 복구 시간 측정
- 개선점 발견 시 문서 업데이트
10. 비용 추정
섹션 제목: “10. 비용 추정”10.1 전기비
섹션 제목: “10.1 전기비”| 장비 | 전원 소비 (W) | 일 사용 시간 | 일 전기비 (₩) | 월 전기비 (₩) |
|---|---|---|---|---|
| 메인컴 | 250W (전체) | 24시간 | ~1,500 | ~45,000 |
| 보조컴 | 150W (전체) | 24시간 (대기) | ~900 | ~27,000 |
| 맥미니 | 30W | 24시간 | ~180 | ~5,400 |
| 나스 (주영) | 기존 | - | - | (별도) |
| 합계 | ~2,580 |
💡 전기비 계산: 150W × 24h × 30일 = 108kWh × ₩140/kWh
10.2 유지보수 비용
섹션 제목: “10.2 유지보수 비용”| 항목 | 비용 | 주기 |
|---|---|---|
| 도메인 (Dify.myhome.local) | 무료 (내부) | - |
| SSL 인증서 (Let’s Encrypt) | 무료 | 90일 |
| 백업 스토리지 (나스) | 기존 요금 | - |
| 도메인/DNS (외부 공개 시) | ~₩15,000/년 | yearly |
| 합계 | ~₩15,000/년 |
10.3 총 비용 요약
섹션 제목: “10.3 총 비용 요약”- 월간: ~₩77,400 (전기)
- 연간: ~₩77,400 × 12 + ₩15,000 = ~₩943,800
📌 실행 체크리스트
섹션 제목: “📌 실행 체크리스트”1단계: 기초 설정 (1주일)
섹션 제목: “1단계: 기초 설정 (1주일)”- 메인컴에 Docker, Docker-compose 설치
- Dify docker-compose.yml 다운로드 및 설정
- Tailscale 설치 및 연결
- 방화벽 설정 (ufw)
2단계: 백업 설정 (1주일)
섹션 제목: “2단계: 백업 설정 (1주일)”- 나스 WebDAV 마운트
- 백업 스크립트 작성
- Cron 설정 및 테스트
- 복원 테스트
3단계: 이중화 (1주일)
섹션 제목: “3단계: 이중화 (1주일)”- 보조컴에 동일 환경 구축
- 데이터 동기화 설정
- 페일오버 스크립트 작성 및 테스트
4단계: 모니터링 (3일)
섹션 제목: “4단계: 모니터링 (3일)”- 로그 시스템 구축
- 알림 설정 (텔레그램/이메일)
- Grafana 대시보드 구성
5단계: 문서화 (3일)
섹션 제목: “5단계: 문서화 (3일)”- 운영 매뉴얼 작성
- 복구 절차 문서화
- 사용자 가이드 작성
🔗 참고 자료
섹션 제목: “🔗 참고 자료”작성일: 2026-04-20 최종 업데이트: -