작성일: 2026-04-20
작성자: 미미 (4에이전트 종합 + 기존 v2.0 병합)
상태: 🔴 대기 (미미아빠 확인 후 시작)
- 프로젝트 개요
- 아키텍처 설계
- 인프라 구성
- 임베딩 모델 전략
- 데이터 수집 및 구조화
- 청킹 및 검색 전략
- LLM 티어링 전략
- 보안 및 권한 관리
- 백업 및 재해 복구
- 단계별 실행 계획
- 비용 추정
- 리스크 및 대응
- 체크리스트
개인이 보유한 문서, 위키, 대화 기록, 메모 등을 체계적으로 수집·구조화하여, 언제든 자연어로 질문하고 정확한 답변을 받을 수 있는 개인 지식 베이스를 구축한다.
- 비용 최소화: 로컬 LLM을 기본으로, 클라우드 LLM은 보조용
- 한국어 최우선: 임베딩·검색·생성 모두 한국어 품질 우선
- 데이터 주권: 모든 데이터는 자가 호스팅, 외부 유출 금지
- 점진적 확장: 작게 시작해서 검증 후 확대
| 장비 | 사양 | 용도 |
|---|
| 맥미니 M4 Pro | macOS, Tailscale: 100.96.177.124 | 게이트웨이 (OpenClaw) + Caddy 리버스 프록시 |
| 메인컴 | i7-14700K + RTX 4070 + 96GB RAM, WSL2 | Dify 주력 서버 |
| 보조컴 | 3900X + RTX 3080 + 64GB RAM, WSL2 | 백업/장애 대응 |
| 주영나스 | WebDAV (http://minicity.kr:5005) | 데이터 저장소 |
| 백업나스 | SSH (100.83.176.55:55) | 백업 전용 |
| Ollama | glm-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/ ← 건드리지 말 것!
┌─────────────────────────────────────────────────────┐
│ ┌──────────────────────────────────────────────┐ │
│ │ dify.minicity.kr → 메인컴 WSL2:80 │ │
│ └──────────────────────────────────────────────┘ │
│ Tailscale: 100.96.177.124 │
└──────────────────────┬──────────────────────────────┘
┌──────────────────────▼──────────────────────────────┐
│ 메인컴 (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-web | langgenius/dify-web | 3000 (내부) | 프론트엔드 |
| dify-api | langgenius/dify-api | 5001 (내부) | 백엔드 API |
| dify-worker | langgenius/dify-api | — | 백그라운드 작업 |
| dify-plugin | langgenius/dify-plugin-daemon | — | 플러그인 실행기 |
| qdrant | qdrant/qdrant | 6333/6334 (내부) | 벡터 DB |
| postgres | postgres:15-alpine | 5432 (내부) | 메타데이터 DB |
| redis | redis:7-alpine | 6379 (내부) | 캐시/큐 |
| caddy | caddy:2-alpine | 80, 443 | 리버스 프록시 (WSL 내부) |
| ollama | (기존 host 설치) | 11434 | 로컬 LLM + 임베딩 |
참고: Dify는 자체 Nginx 컨테이너를 포함하므로, WSL 내부의 Caddy는 Dify의 Nginx를 경유. 맥미니의 Caddy가 최종 리버스 프록시 역할.
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
sudo systemctl start docker && sudo systemctl enable docker
sudo usermod -aG docker $USER && newgrp docker
docker --version && docker compose version
C:\Users\pinksky\.wslconfig:
autoMemoryReclaim=gradual
mkdir -p ~/dify && cd ~/dify
git clone https://github.com/langgenius/dify.git
SECRET_KEY=$(openssl rand -base64 42)
sed -i "s/^SECRET_KEY=.*/SECRET_KEY=${SECRET_KEY}/" .env
docker compose ps # 모든 컨테이너 Up/healthy 확인
# === 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
QDRANT_URL=http://qdrant:6333
# === 임베딩 (Dify 내에서 설정) ===
# Ollama를 통한 nomic-embed-text 사용
SECRET_KEY=<openssl rand -base64 42 결과>
INIT_PASSWORD=Mini3388!Dify
APP_MAX_EXECUTION_TIME=1200
# === 데이터베이스 (운영 전 비밀번호 변경) ===
DB_PASSWORD=difyai123456 # ← 운영 시 변경!
REDIS_PASSWORD=difyai123456 # ← 운영 시 변경!
reverse_proxy 100.105.122.120:80 {
header_up Connection {>Connection}
header_up Upgrade {>Upgrade}
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
Referrer-Policy strict-origin-when-cross-origin
output file /var/log/caddy/dify-access.log {
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
| 항목 | 내용 |
|---|
| 모델 | 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, .html | Dify API | ★★☆ |
| 소스 | 형식 | 수집 방식 | 우선순위 |
|---|
| OpenClaw 세션 로그 | .json → .md | 변환 스크립트 | ★★★ |
| AI 대화 요약 | .md | 자동 추출 | ★★★ |
| 텔레그램 중요 대화 | .txt, .md | 수동/반자동 | ★★☆ |
핵심: 대화 기록은 원본 그대로 넣지 않는다. 주제별로 요약·구조화한 뒤에 넣어야 검색 품질이 높아진다.
| 소스 | 형식 | 수집 방식 | 우선순위 |
|---|
| 개발/설정 노트 | .md | 직접 업로드 | ★★★ |
| 트러블슈팅 기록 | .md | 직접 업로드 | ★★★ |
| 서버 설정 기록 | .md, .yaml | 직접 업로드 | ★★☆ |
| 소스 | 형식 | 수집 방식 | 우선순위 |
|---|
| 웹 클리핑 | .md | 브라우저 확장 | ★★☆ |
| 기술 블로그 | .md | URL → summarize 스킬 | ★★☆ |
| 논문/가이드 | .pdf | 파일 업로드 | ★☆☆ |
하나의 거대한 지식 베이스는 검색 품질을 떨어뜨린다. 주제별로 분할하라.
| 지식 베이스명 | 내용 | 예상 문서 수 | 검색 모드 |
|---|
KB-obsidian | Obsidian 볼트 마크다운 | 100~500 | 하이브리드 |
KB-conversations | AI 대화 요약 | 200~1000 | 의미 검색 |
KB-tech-manuals | 기술 매뉴얼, 설정 가이드 | 50~200 | 하이브리드 |
KB-life | 레시피, 가사, 일상 기록 | 50~100 | 의미 검색 |
KB-reference | 웹 클립, 논문, 외부 자료 | 100~300 | 하이브리드 |
[동기화 스크립트] ← cron 또는 수동 실행
| 문서 유형 | 청킹 크기 | 오버랩 | 분할 기준 | 이유 |
|---|
| 마크다운 위키 | 600 토큰 | 100 토큰 | 헤딩(#)+단락 | 위키는 헤딩이 자연스러운 경계 |
| 대화 요약 | 400 토큰 | 80 토큰 | 대화 세션 단위 | 문맥 보존이 중요 |
| 기술 매뉴얼 | 800 토큰 | 150 토큰 | 섹션+단락 | 절차의 연속성 유지 |
| 레시피/일상 | 500 토큰 | 100 토큰 | 자동 | 짧은 문서가 많음 |
| 웹 클립/PDF | 600 토큰 | 100 토큰 | 자동 | 혼합 포맷 |
source: "obsidian" # obsidian | conversation | manual | web | email
category: "tech" # tech | life | reference | work | personal
subcategory: "devops" # 세부 분류
language: "ko" # ko | en | mixed
tags: ["docker", "dify", "rag"]
importance: "high" # high | medium | low
| 컬렉션명 | 대응 지식 베이스 | 벡터 차원 | 거리 측도 |
|---|
kb_obsidian | KB-obsidian | 512 | Cosine |
kb_conversations | KB-conversations | 512 | Cosine |
kb_tech_manuals | KB-tech-manuals | 512 | Cosine |
kb_life | KB-life | 512 | Cosine |
kb_reference | KB-reference | 512 | Cosine |
- 한국어는 교착어라 조사/어미가 단어 경계를 흐림 → 단순 공백 분리 부적합
- 마크다운 구조(헤딩) 기반 분할이 한국어에 가장 안전
- 오버랩을 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 (클라우드, 사용자 확인 후)
- 설정 → 모델 공급자 → Ollama 추가
- Base URL:
http://host.docker.internal:11434
- 모델 등록: glm-5.1, minimax-m2.5, qwen3.5, gemma4:31b
- (선택) 클라우드 제공자 추가 → API 키 입력, 일일 한도 설정
- 각 앱의 기본 모델을 glm-5.1로 설정
인터넷 → (포트 제한) → Tailscale VPN → 메인컴 Dify
- Tailscale 네트워크 내에서만 접근 허용
- 공개 인터넷 노출 금지
- Dify 컨테이너는 로컬만 리스닝 (
127.0.0.1:3001:3000)
- UFW로 Tailscale 인터페이스만 허용
| 역할 | 권한 | 사용 상황 |
|---|
| Owner (미미아빠) | 전체 관리 | 시스템 관리 |
| Editor | 생성/편집/실행 | 개발 |
| Viewer | 읽기/실행 | 일반 사용 |
- 환경 변수로만 관리 (
.env 파일)
- 나스에 별도 암호화 저장
- 90일마다 키 순환
- 미사용 키 즉시 폐기
| 포트 | 서비스 | 접근 범위 |
|---|
| 80 | Dify (Nginx) | Tailscale 내부 |
| 443 | Dify (Nginx) | Tailscale 내부 |
| 11434 | Ollama API | Docker 내부 + Tailscale |
| 5003 | Dify Plugin Daemon | Docker 내부 전용 |
| 5432 | PostgreSQL | Docker 내부 전용 |
| 6379 | Redis | Docker 내부 전용 |
| 6333/6334 | Qdrant | Docker 내부 전용 |
| 데이터 | 저장 위치 | 백업 주기 | 보관 기간 |
|---|
| PostgreSQL (메타데이터) | Docker 볼륨 | 일 1회 | 30일 |
| Qdrant (벡터 인덱스) | Docker 볼륨 | 일 1회 | 30일 |
| 업로드 파일 | /data/storage | 일 1회 | 30일 |
| Dify 설정 (.env, yaml) | Git Repo | 변경 시 | 무제한 |
| Docker 이미지 | 로컬 | 업데이트 시 | 3 버전 |
BACKUP_DIR="/mnt/nas/dify-backups"
docker exec dify-db pg_dump -U postgres dify > "$BACKUP_DIR/postgres/dify_${DATE}.sql"
curl -X POST "http://localhost:6333/collections/kb_obsidian/snapshots"
rsync -avz /data/storage/ "$BACKUP_DIR/storage/${DATE}/"
find $BACKUP_DIR -type f -mtime +30 -delete
echo "[$(date)] Backup completed"
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-1 | WSL2에 Docker + Docker Compose 설치 | docker compose version 동작 |
| 1-2 | .wslconfig 메모리 설정 (64GB) | WSL 재시작 후 적용 |
| 1-3 | Dify 저장소 클론 및 .env 설정 | .env 파일 작성 완료 |
| 1-4 | VECTOR_STORE=qdrant 설정 | .env에 반영 |
| 1-5 | Docker Compose로 Dify 기동 | 웹 UI 접속 확인 |
| 1-6 | 맥미니 Caddy 리버스 프록시 설정 | dify.minicity.kr 접속 확인 |
| 1-7 | Ollama 연결 (LLM + 임베딩) | 모델 목록에 표시됨 |
| 단계 | 작업 | 완료 기준 |
|---|
| 2-1 | ollama pull nomic-embed-text-v2-moe | 모델 다운로드 완료 |
| 2-2 | Dify에서 임베딩 모델로 nomic 설정 | 테스트 임베딩 성공 |
| 2-3 | 테스트 문서 5개 업로드 후 한국어 검색 품질 확인 | 한국어 검색 정상 |
| 단계 | 작업 | 완료 기준 |
|---|
| 3-1 | Obsidian 볼트에서 핵심 마크다운 50개 선별 | 파일 목록 확정 |
| 3-2 | KB-obsidian 지식 베이스 생성 후 업로드 | 인덱싱 완료 |
| 3-3 | 기술 매뉴얼/설정 가이드 20개 수집 | KB-tech-manuals 생성 |
| 3-4 | 검색 테스트 (10개 질문) | 8/10 이상 정확도 |
| 3-5 | 청킹 설정 미세 조정 | 검색 품질 개선 확인 |
| 단계 | 작업 | 완료 기준 |
|---|
| 4-1 | OpenClaw 세션 로그 변환 스크립트 작성 | JSON → 구조화된 마크다운 |
| 4-2 | AI 대화 요약 추출 및 KB-conversations 구축 | 100+ 대화 요약 등록 |
| 4-3 | 일상/레시피 문서 수집 → KB-life 구축 | 30+ 문서 등록 |
| 4-4 | Obsidian 동기화 스크립트 v1 작성 | 수동 실행으로 동기화 확인 |
| 단계 | 작업 | 완료 기준 |
|---|
| 5-1 | 기본 챗봇 앱 생성 (glm-5.1 + KB 연결) | 질문 응답 정상 |
| 5-2 | 전문 검색 에이전트 앱 생성 (minimax-m2.5) | 복잡 질문 대응 |
| 5-3 | 워크플로우: 복잡도 기반 자동 라우팅 | Tier 전환 동작 확인 |
| 5-4 | 시스템 프롬프트 최적화 (한국어) | 응답 품질 향상 |
| 5-5 | 출처 인용(Citation) 프롬프트 추가 | 답변에 출처 표시됨 |
| 단계 | 작업 | 완료 기준 |
|---|
| 6-1 | Tailscale 외부 접근 테스트 | 외부에서 접속 가능 |
| 6-2 | 백업 스크립트 작성 및 cron 설정 | 일일 자동 백업 |
| 6-3 | Obsidian 동기화 자동화 (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,500 | Tailscale 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 설정 |
작성일: 2026-04-20
버전: v3.0 (4에이전트 종합 + 기존 v2.0 병합)
다음 단계: 미미아빠 확인 후 Phase 1 시작