- Integrate ollama + ai-gateway into root docker-compose.yml (NVIDIA GPU runtime, single compose for all services) - Change NAS mount from SMB (NAS_SMB_PATH) to NFS (NAS_NFS_PATH) Default: /mnt/nas/Document_Server (fstab registered on GPU server) - Update config.yaml AI endpoints: primary → Mac mini MLX via Tailscale (100.76.254.116:8800) fallback/embedding/vision/rerank → ollama (same Docker network) gateway → ai-gateway (same Docker network) - Update credentials.env.example (remove GPU_SERVER_IP, add NFS path) - Mark gpu-server/docker-compose.yml as deprecated - Update CLAUDE.md network diagram and AI model config - Update architecture.md, deploy.md, devlog.md for GPU server as main - Caddyfile: auto_https off, HTTP only (TLS at upstream proxy) - Caddy port: 127.0.0.1:8080:80 (localhost only) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6.6 KiB
6.6 KiB
GPU 서버 이전 + NFS 전환 — Claude Code 작업 지시서
배경
Phase 0~4 완료. 현재 Mac mini에서 Docker 전체 구동 중. GPU 서버(Ubuntu, RTX 4070 Ti Super)로 애플리케이션 이전. NAS NFS 마운트로 Synology Drive 데드락 해결.
완료된 수동 작업
- ✅ Step 1: NAS NFS 서버 설정 (DSM에서 NFS 활성화, NFSv4.1)
- ✅ Step 2: GPU 서버 NFS 마운트 (
/mnt/nas/Document_Server, fstab 등록 완료) - ✅ Step 6: Mac mini MLX 서버 외부 접근 확인 (100.76.254.116:8800 응답 확인)
확정된 정보
- Mac mini Tailscale IP:
100.76.254.116 - NAS 로컬 IP:
192.168.1.227 - GPU 서버 로컬 IP:
192.168.1.186 - NFS 마운트 경로:
/mnt/nas/Document_Server - MLX 모델:
mlx-community/Qwen3.5-35B-A3B-4bit(Mac mini에서 계속 서빙)
목표 구조
GPU 서버 (Ubuntu, 메인 서버):
Docker Compose 단일 파일:
- postgres, fastapi, kordoc-service, frontend, caddy
- ollama (NVIDIA GPU), ai-gateway
NFS → NAS /volume4/Document_Server (/mnt/nas/Document_Server)
Mac mini M4 Pro (AI 서버만):
MLX Server: http://100.76.254.116:8800 (Qwen3.5-35B-A3B)
NAS DS1525+ (파일 저장소):
NFS export → GPU 서버
Synology Office/Calendar/MailPlus 유지
Claude Code 작업 목록
작업 1: docker-compose.yml 통합
현재 루트 docker-compose.yml (Mac mini용)에 gpu-server/docker-compose.yml의 서비스를 통합.
변경 사항:
version: '3.8'제거 (Docker Compose V2 기준)- NAS 볼륨 변수:
NAS_SMB_PATH→NAS_NFS_PATH, 기본값/mnt/nas/Document_Server - Ollama 서비스 추가 (NVIDIA GPU runtime, ollama_data 볼륨)
- AI Gateway 서비스 추가 (Ollama depends_on)
- AI Gateway 환경변수: PRIMARY_ENDPOINT=http://100.76.254.116:8800/v1/chat/completions
- Caddy 포트:
127.0.0.1:8080:80유지 (HTTPS는 앞단 프록시(UCG-Fiber)에서 처리, Caddy는 HTTP only) - ollama_data 볼륨 추가
참고 — 현재 파일:
- 루트 docker-compose.yml: postgres, kordoc-service, fastapi, frontend, caddy
- gpu-server/docker-compose.yml: ollama, ai-gateway
작업 2: config.yaml AI 엔드포인트 변경
현재 → 변경:
ai:
gateway:
endpoint: "http://ai-gateway:8080" # gpu-server → ai-gateway (같은 Docker 네트워크)
models:
primary:
endpoint: "http://100.76.254.116:8800/v1/chat/completions" # host.docker.internal → Mac mini Tailscale IP
# 나머지 동일
fallback:
endpoint: "http://ollama:11434/v1/chat/completions" # gpu-server → ollama (같은 Docker 네트워크)
# 나머지 동일
embedding:
endpoint: "http://ollama:11434/api/embeddings" # gpu-server → ollama
vision:
endpoint: "http://ollama:11434/api/generate" # gpu-server → ollama
rerank:
endpoint: "http://ollama:11434/api/rerank" # gpu-server → ollama
핵심: gpu-server 호스트명이 전부 ollama 또는 ai-gateway로 변경 (같은 Docker 네트워크).
primary만 Mac mini Tailscale IP 100.76.254.116으로 외부 호출.
작업 3: credentials.env.example 갱신
변경 사항:
NAS_SMB_PATH→NAS_NFS_PATH=/mnt/nas/Document_ServerMLX_ENDPOINT→http://100.76.254.116:8800/v1/chat/completionsGPU_SERVER_IP항목 제거 (로컬이 됨)AI_GATEWAY_ENDPOINT→http://ai-gateway:8080(같은 Docker 네트워크)- 주석 업데이트: "Mac mini MLX" → "Mac mini MLX (Tailscale 경유)"
작업 4: Caddyfile 확인
변경 불필요. 현재 상태 유지:
auto_https off+http://document.hyungi.net(HTTPS는 앞단 프록시 UCG-Fiber에서 처리)- Caddy 포트:
127.0.0.1:8080:80(localhost 바인딩, 443 불필요)
작업 5: 문서 업데이트
CLAUDE.md — 네트워크 환경 섹션 갱신
현재:
Mac mini M4 Pro (애플리케이션 서버):
- Docker Compose: FastAPI(:8000), PostgreSQL(:5432), kordoc(:3100), Caddy(:80,:443)
- MLX Server: http://localhost:8800/v1/chat/completions (Qwen3.5-35B-A3B)
- 외부 접근: document.hyungi.net (Caddy 프록시)
변경:
GPU 서버 (RTX 4070 Ti Super, Ubuntu, 메인 서버):
- Docker Compose: FastAPI(:8000), PostgreSQL(:5432), kordoc(:3100), Caddy(:8080, HTTP only), Ollama(:11434), AI Gateway(:8080), frontend(:3000)
- NFS 마운트: /mnt/nas/Document_Server → NAS /volume4/Document_Server
- 외부 접근: document.hyungi.net (Caddy 프록시)
Mac mini M4 Pro (AI 서버):
- MLX Server: http://100.76.254.116:8800/v1/chat/completions (Qwen3.5-35B-A3B)
- Roon Core
GPU 서버 Tailscale IP도 추가. AI 모델 구성 섹션에서 primary endpoint 변경 반영.
docs/architecture.md — 섹션 3 (인프라 역할 분담) 갱신
Mac mini가 애플리케이션 서버 → GPU 서버가 메인 서버로 변경. Mac mini는 AI 서버(MLX)만 담당하는 것으로 변경. 아스키 다이어그램 업데이트.
docs/deploy.md — GPU 서버 기준 배포 가이드로 변경
- 전제조건: NFS 마운트 (/mnt/nas/Document_Server)
- clone 경로, docker compose 명령 등 GPU 서버 기준으로 변경
- pg_dump/pg_restore 마이그레이션 절차 추가
docs/devlog.md — GPU 이전 기록 추가
Phase 1~2는 이미 기록됨. 아래 추가:
- Phase 3 완료 기록 (자동화 이전: law_monitor, mailplus_archive, daily_digest, automation_state, APScheduler cron) — 기록 안 되어 있으면 추가
- Phase 4 완료 기록 (SvelteKit UI: 로그인, 대시보드, 문서 탐색/검색, Inbox, 설정, Docker 통합) — 기록 안 되어 있으면 추가
- GPU 서버 이전 기록 (NFS 전환, docker-compose 통합, AI 엔드포인트 변경, Caddy HTTP only 구조)
작업 6: gpu-server/docker-compose.yml 비활성화
- 파일 상단에 주석 추가: "# 이 파일은 더 이상 사용하지 않음. 루트 docker-compose.yml로 통합됨."
- 또는 gpu-server/docker-compose.yml.bak으로 리네임
작업 순서 (추천)
- docker-compose.yml 통합 (작업 1)
- config.yaml 변경 (작업 2)
- credentials.env.example 갱신 (작업 3)
- gpu-server/docker-compose.yml 비활성화 (작업 6)
- 문서 업데이트 (작업 5) — CLAUDE.md, architecture.md, deploy.md, devlog.md
- Caddyfile 확인 (작업 4)
주의사항
- credentials.env 자체는 git에 올리지 않음 (.gitignore). example만 수정.
- Mac mini Tailscale IP
100.76.254.116은 config.yaml에 직접 기입 (credentials.env에서 변수로 관리해도 됨) - NAS 경로: Docker 컨테이너 내부에서는
/documents로 접근 (기존과 동일) - GPU 서버 로컬 IP
192.168.1.186은 NFS 마운트에만 사용, Docker 설정에는 불필요