# 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 엔드포인트 변경 현재 → 변경: ```yaml 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_Server` - `MLX_ENDPOINT` → `http://100.76.254.116:8800/v1/chat/completions` - `GPU_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는 이미 기록됨. 아래 추가: 1. Phase 3 완료 기록 (자동화 이전: law_monitor, mailplus_archive, daily_digest, automation_state, APScheduler cron) — 기록 안 되어 있으면 추가 2. Phase 4 완료 기록 (SvelteKit UI: 로그인, 대시보드, 문서 탐색/검색, Inbox, 설정, Docker 통합) — 기록 안 되어 있으면 추가 3. GPU 서버 이전 기록 (NFS 전환, docker-compose 통합, AI 엔드포인트 변경, Caddy HTTP only 구조) ### 작업 6: gpu-server/docker-compose.yml 비활성화 - 파일 상단에 주석 추가: "# 이 파일은 더 이상 사용하지 않음. 루트 docker-compose.yml로 통합됨." - 또는 gpu-server/docker-compose.yml.bak으로 리네임 --- ## 작업 순서 (추천) 1. docker-compose.yml 통합 (작업 1) 2. config.yaml 변경 (작업 2) 3. credentials.env.example 갱신 (작업 3) 4. gpu-server/docker-compose.yml 비활성화 (작업 6) 5. 문서 업데이트 (작업 5) — CLAUDE.md, architecture.md, deploy.md, devlog.md 6. 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 설정에는 불필요