Docker Compose 기반 스토리지 연결 및 ChromaDB 배포 (4/5)

시리즈글 4 / 5
업데이트2026년 5월
핵심 기술NFS · ChromaDB · AnythingLLM · Docker Compose
난이도중급~고급
NFS 마운트 ChromaDB AnythingLLM 임베딩 모델 Docker Compose
마크다운으로 변환된 노트가 준비되었습니다. 이제 시놀로지 NAS의 스토리지와 AI 연산 스택을 연결하는 인프라 설계 단계입니다. 네트워크 프로토콜 선택부터 벡터DB 비교, RAG 오케스트레이터 구성, 최적의 임베딩 모델 선정까지 — Docker Compose 하나로 전체 스택을 배포하는 완전한 명세서를 제공합니다.
LAYER01

시놀로지 → AI 스택 스토리지 연결 전략

AI 오케스트레이터가 시놀로지 NAS의 마크다운 노트를 실시간으로 읽으려면 적절한 스토리지 공유 프로토콜을 선택해야 합니다. 연산 위치(NAS 내부 vs 외부 PC)에 따라 최적 방식이 달라집니다.

🔧 환경별 스토리지 연결 방식 비교

연산 위치권장 프로토콜속도설정 난이도추천 이유
NAS 내부 Docker볼륨 바인드 마운트로컬 디스크 속도⭐ 가장 쉬움오버헤드 0. NAS Docker에서 직접 경로 마운트
같은 LAN 내 PCNFS v4~115MB/s (기가비트)⭐⭐ 보통Linux/macOS에 최적. 저지연 파일 I/O
Windows PCSMB 3.0~100MB/s⭐⭐ 보통Windows 네이티브 지원. WSL2와도 연동 가능
외부 네트워크WebDAV + HTTPS~10~50MB/s⭐⭐⭐ 복잡VPN 없이 외부 접근 시. 속도 제한 있음

⚙️ NFS v4 설정 — 시놀로지 DSM

1
DSM 제어판 → 파일 서비스 → NFS 활성화
NFS v4 체크 후 저장. NFSv4를 지원하는 Linux 클라이언트에서 최고 성능 제공.
2
공유 폴더 NFS 권한 설정
AI_Knowledge_Base 폴더 → 편집 → NFS 권한 → 허용 IP 추가 (AI 연산 서버 IP) → 읽기/쓰기 허용
3
클라이언트 서버에서 마운트
아래 명령어로 NAS 볼륨을 로컬 폴더에 마운트. fstab에 등록하면 재시작 시 자동 마운트.
bash — NFS 마운트 (클라이언트 서버)
# 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
LAYER02

벡터 데이터베이스 비교 선정 가이드

벡터 DB는 임베딩된 노트 데이터를 저장하고, 유사도 검색을 수행하는 RAG의 핵심 컴포넌트입니다. 선택에 따라 검색 속도, 관리 편의성, 시놀로지 환경 호환성이 크게 달라집니다.

벡터 DB설치 방식메모리 사용영속성시놀로지 추천도특징
ChromaDBDocker / 내장낮음 (500MB~)볼륨 마운트⭐⭐⭐⭐⭐설정 최소, AnythingLLM 내장. 시놀로지 NAS 최적
QdrantDocker중간 (1GB~)볼륨 마운트⭐⭐⭐⭐고성능 필터링, REST API 완비. Dify 기본 연동
WeaviateDocker높음 (2GB~)볼륨 마운트⭐⭐⭐GraphQL API, 멀티모달 지원. 리소스 요구 높음
MilvusDocker Compose매우 높음 (4GB~)분산 스토리지⭐⭐대규모 엔터프라이즈용. NAS 환경엔 과도한 스펙
💡
시놀로지 NAS 환경 추천: ChromaDB + 외부 컨테이너 분리

AnythingLLM 내장 ChromaDB는 편리하지만 컨테이너 재시작 시 데이터 손실 위험이 있습니다. 반드시 ChromaDB를 별도 컨테이너로 분리하고 시놀로지 볼륨에 데이터를 영속 저장해야 합니다. 노트 수천 개 기준 ChromaDB 볼륨 크기는 원본의 약 3~5배입니다.

LAYER03

한국어 최적 임베딩 모델 선정 가이드

임베딩 모델이 노트의 의미를 얼마나 정확하게 벡터로 변환하느냐가 RAG 검색 정확도를 결정합니다. 특히 한국어 문서는 영어 중심 임베딩 모델을 쓰면 검색 성능이 30~50% 하락합니다.

모델방식벡터 차원한국어 성능리소스추천 상황
bge-m3Ollama 로컬1024🟢 최고 (다국어 특화)중간 (1.5GB)한국어 1순위 추천
mxbai-embed-largeOllama 로컬1024🟢 우수중간 (670MB)성능·속도 균형
nomic-embed-textOllama 로컬768🟡 보통낮음 (274MB)저사양 NAS 환경
text-embedding-3-smallOpenAI API1536🟢 우수API 비용품질 우선 + 예산 여유
text-embedding-3-largeOpenAI API3072🟢 최고API 비용 높음최고 품질 필요 시
bash — Ollama 임베딩 모델 설치
# 한국어 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\"])}')"
LAYER04

RAG 오케스트레이터 비교 & Docker Compose 전체 배포

🔀 RAG 오케스트레이터 비교

도구설치 난이도Folder Watch멀티유저API 지원추천 대상
AnythingLLM⭐ 쉬움🟢 내장🟢 지원🟢 완비개인·소규모 팀. 빠른 시작
Open WebUI⭐ 쉬움🟡 Knowledge 수동🟢 강력🟢 완비멀티유저·기업 환경. Ollama 연동 최적
Dify⭐⭐⭐ 복잡🟡 API 연동🟢 강력🟢 최강워크플로우 자동화·에이전트 구축

🐳 완전한 Docker Compose 배포 명세서

📁 /volume1/docker/ai-stack/docker-compose.yml
yaml — 완전한 RAG 스택 (AnythingLLM + ChromaDB + Ollama)
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: {}   # 볼륨은 위에서 직접 경로 지정
bash — 스택 배포 및 초기 모델 설치
# 스택 전체 기동
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 서비스 계정에 읽기 권한 부여.

Leave a reply

Please enter your comment!
Please enter your name here