Files
hyungi_document_server/docs/gpu-migration-plan.md
Hyungi Ahn 0ca78640ee infra: migrate application from Mac mini to GPU server
- 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>
2026-04-03 07:47:09 +09:00

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_PATHNAS_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_PATHNAS_NFS_PATH=/mnt/nas/Document_Server
  • MLX_ENDPOINThttp://100.76.254.116:8800/v1/chat/completions
  • GPU_SERVER_IP 항목 제거 (로컬이 됨)
  • AI_GATEWAY_ENDPOINThttp://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 설정에는 불필요