홈랩 AI 서버 완전 구축 — 5편 마스터 시리즈
글 4에서 다루는 내용
시놀로지 → AI 스택 스토리지 연결 전략
AI 오케스트레이터가 시놀로지 NAS의 마크다운 노트를 실시간으로 읽으려면 적절한 스토리지 공유 프로토콜을 선택해야 합니다. 연산 위치(NAS 내부 vs 외부 PC)에 따라 최적 방식이 달라집니다.
🔧 환경별 스토리지 연결 방식 비교
| 연산 위치 | 권장 프로토콜 | 속도 | 설정 난이도 | 추천 이유 |
|---|---|---|---|---|
| NAS 내부 Docker | 볼륨 바인드 마운트 | 로컬 디스크 속도 | ⭐ 가장 쉬움 | 오버헤드 0. NAS Docker에서 직접 경로 마운트 |
| 같은 LAN 내 PC | NFS v4 | ~115MB/s (기가비트) | ⭐⭐ 보통 | Linux/macOS에 최적. 저지연 파일 I/O |
| Windows PC | SMB 3.0 | ~100MB/s | ⭐⭐ 보통 | Windows 네이티브 지원. WSL2와도 연동 가능 |
| 외부 네트워크 | WebDAV + HTTPS | ~10~50MB/s | ⭐⭐⭐ 복잡 | VPN 없이 외부 접근 시. 속도 제한 있음 |
⚙️ NFS v4 설정 — 시놀로지 DSM
# NFS 클라이언트 설치 sudo apt install -y nfs-common # 마운트 포인트 생성 sudo mkdir -p /mnt/synology/AI_Knowledge_Base # NFS 마운트 (192.168.1.100은 NAS IP) sudo mount -t nfs4 192.168.1.100:/volume1/AI_Knowledge_Base \ /mnt/synology/AI_Knowledge_Base # 재시작 시 자동 마운트 (fstab 등록) echo "192.168.1.100:/volume1/AI_Knowledge_Base /mnt/synology/AI_Knowledge_Base nfs4 defaults 0 0" \ | sudo tee -a /etc/fstab # 마운트 확인 df -h | grep synology
벡터 데이터베이스 비교 선정 가이드
벡터 DB는 임베딩된 노트 데이터를 저장하고, 유사도 검색을 수행하는 RAG의 핵심 컴포넌트입니다. 선택에 따라 검색 속도, 관리 편의성, 시놀로지 환경 호환성이 크게 달라집니다.
| 벡터 DB | 설치 방식 | 메모리 사용 | 영속성 | 시놀로지 추천도 | 특징 |
|---|---|---|---|---|---|
| ChromaDB | Docker / 내장 | 낮음 (500MB~) | 볼륨 마운트 | ⭐⭐⭐⭐⭐ | 설정 최소, AnythingLLM 내장. 시놀로지 NAS 최적 |
| Qdrant | Docker | 중간 (1GB~) | 볼륨 마운트 | ⭐⭐⭐⭐ | 고성능 필터링, REST API 완비. Dify 기본 연동 |
| Weaviate | Docker | 높음 (2GB~) | 볼륨 마운트 | ⭐⭐⭐ | GraphQL API, 멀티모달 지원. 리소스 요구 높음 |
| Milvus | Docker Compose | 매우 높음 (4GB~) | 분산 스토리지 | ⭐⭐ | 대규모 엔터프라이즈용. NAS 환경엔 과도한 스펙 |
AnythingLLM 내장 ChromaDB는 편리하지만 컨테이너 재시작 시 데이터 손실 위험이 있습니다. 반드시 ChromaDB를 별도 컨테이너로 분리하고 시놀로지 볼륨에 데이터를 영속 저장해야 합니다. 노트 수천 개 기준 ChromaDB 볼륨 크기는 원본의 약 3~5배입니다.
한국어 최적 임베딩 모델 선정 가이드
임베딩 모델이 노트의 의미를 얼마나 정확하게 벡터로 변환하느냐가 RAG 검색 정확도를 결정합니다. 특히 한국어 문서는 영어 중심 임베딩 모델을 쓰면 검색 성능이 30~50% 하락합니다.
| 모델 | 방식 | 벡터 차원 | 한국어 성능 | 리소스 | 추천 상황 |
|---|---|---|---|---|---|
bge-m3 | Ollama 로컬 | 1024 | 🟢 최고 (다국어 특화) | 중간 (1.5GB) | 한국어 1순위 추천 |
mxbai-embed-large | Ollama 로컬 | 1024 | 🟢 우수 | 중간 (670MB) | 성능·속도 균형 |
nomic-embed-text | Ollama 로컬 | 768 | 🟡 보통 | 낮음 (274MB) | 저사양 NAS 환경 |
text-embedding-3-small | OpenAI API | 1536 | 🟢 우수 | API 비용 | 품질 우선 + 예산 여유 |
text-embedding-3-large | OpenAI API | 3072 | 🟢 최고 | API 비용 높음 | 최고 품질 필요 시 |
# 한국어 1순위: bge-m3 (권장) docker exec -it ollama ollama pull bge-m3 # 저사양 대안: nomic-embed-text docker exec -it ollama ollama pull nomic-embed-text # 임베딩 API 테스트 curl http://localhost:11434/api/embeddings -d '{ "model": "bge-m3", "prompt": "시놀로지 NAS 프라이빗 RAG 구축" }' | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'벡터 차원: {len(d[\"embedding\"])}')"
RAG 오케스트레이터 비교 & Docker Compose 전체 배포
🔀 RAG 오케스트레이터 비교
| 도구 | 설치 난이도 | Folder Watch | 멀티유저 | API 지원 | 추천 대상 |
|---|---|---|---|---|---|
| AnythingLLM | ⭐ 쉬움 | 🟢 내장 | 🟢 지원 | 🟢 완비 | 개인·소규모 팀. 빠른 시작 |
| Open WebUI | ⭐ 쉬움 | 🟡 Knowledge 수동 | 🟢 강력 | 🟢 완비 | 멀티유저·기업 환경. Ollama 연동 최적 |
| Dify | ⭐⭐⭐ 복잡 | 🟡 API 연동 | 🟢 강력 | 🟢 최강 | 워크플로우 자동화·에이전트 구축 |
🐳 완전한 Docker Compose 배포 명세서
services:
# ── 벡터 데이터베이스 ─────────────────────────
chromadb:
image: chromadb/chroma:latest
container_name: rag_chromadb
ports:
- "8000:8000"
environment:
- CHROMA_SERVER_AUTH_CREDENTIALS=your_secure_token # 토큰 변경
- CHROMA_SERVER_AUTH_PROVIDER=chromadb.auth.token.TokenAuthServerProvider
- IS_PERSISTENT=TRUE
volumes:
- /volume1/docker/chroma/data:/chroma/chroma # NAS 영속 저장
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/heartbeat"]
interval: 30s
# ── Ollama (LLM + 임베딩 엔진) ──────────────
ollama:
image: ollama/ollama:latest
container_name: rag_ollama
ports:
- "11434:11434"
volumes:
- /volume1/docker/ollama/models:/root/.ollama
environment:
- OLLAMA_NUM_PARALLEL=2
- OLLAMA_FLASH_ATTENTION=1
restart: unless-stopped
# ── RAG 오케스트레이터 (AnythingLLM) ─────────
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: rag_anythingllm
ports:
- "3001:3001"
environment:
- STORAGE_DIR=/app/storage
- VECTOR_DB=chroma
- CHROMA_ENDPOINT=http://chromadb:8000
- CHROMA_API_HEADER=Authorization
- CHROMA_API_KEY=your_secure_token
- OLLAMA_BASE_PATH=http://ollama:11434
- EMBEDDING_ENGINE=ollama
- EMBEDDING_MODEL_PREF=bge-m3 # 한국어 임베딩 모델
- LLM_PROVIDER=ollama
- OLLAMA_MODEL_PREF=qwen2.5:7b # 추론 모델 (환경에 맞게 변경)
volumes:
- /volume1/docker/anythingllm/storage:/app/storage
# 시놀로지 노트 폴더를 컨테이너에 마운트
- /volume1/AI_Knowledge_Base:/app/storage/documents/my_notes:ro
depends_on:
- chromadb
- ollama
restart: unless-stopped
volumes: {} # 볼륨은 위에서 직접 경로 지정# 스택 전체 기동 cd /volume1/docker/ai-stack docker compose up -d # 컨테이너 상태 확인 docker compose ps # 필수 모델 설치 (최초 1회) docker exec -it rag_ollama ollama pull bge-m3 # 임베딩 docker exec -it rag_ollama ollama pull qwen2.5:7b # 추론 # AnythingLLM 접속: http://NAS_IP:3001 # ChromaDB 상태: http://NAS_IP:8000/api/v1/heartbeat
- ChromaDB 연결 실패 —
CHROMA_ENDPOINT가 컨테이너명(http://chromadb:8000)으로 설정되어 있는지 확인.localhost는 작동하지 않음. - 임베딩 모델 다운로드 전 인덱싱 시도 —
docker exec -it rag_ollama ollama list로 bge-m3 설치 확인 후 AnythingLLM에서 임베딩 시작. - NAS 볼륨 권한 문제 — AnythingLLM 컨테이너가
/app/storage/documents/my_notes를 읽지 못하면 DSM에서 Docker 서비스 계정에 읽기 권한 부여.
