diff --git a/DOCKER_DEPLOY.md b/DOCKER_DEPLOY.md new file mode 100644 index 00000000..1a5c841f --- /dev/null +++ b/DOCKER_DEPLOY.md @@ -0,0 +1,212 @@ +# CLIProxyAPI Docker 배포 가이드 + +NAS(nas.gru.farm)에 Docker로 CLIProxyAPI를 배포하는 방법을 정리합니다. + +## 사전 조건 + +| 항목 | 내용 | +|------|------| +| NAS 접속 | `ssh airkjw@nas.gru.farm -p 22` | +| Docker | `sudo /usr/local/bin/docker` (NOPASSWD) | +| Docker Compose | `sudo /usr/local/bin/docker compose` | +| NAS 내부 IP | 192.168.0.17 | + +## 1. 배포 디렉토리 준비 + +```bash +ssh airkjw@nas.gru.farm + +# 배포 디렉토리 생성 +mkdir -p ~/docker/cli-proxy-api +cd ~/docker/cli-proxy-api +``` + +## 2. 필요 파일 구성 + +NAS에 아래 파일들이 필요합니다: + +``` +~/docker/cli-proxy-api/ +├── docker-compose.yml # 컨테이너 설정 +├── config.yaml # 서비스 설정 (API 키, 포트 등) +├── auths/ # OAuth 인증 데이터 (자동 생성) +└── logs/ # 로그 디렉토리 (자동 생성) +``` + +## 3. docker-compose.yml + +로컬 빌드 방식 (소스에서 직접 빌드): + +```yaml +services: + cli-proxy-api: + build: + context: . + dockerfile: Dockerfile + container_name: cli-proxy-api + ports: + - "8317:8317" # 메인 API 포트 + # 필요시 추가 포트 오픈 + # - "8085:8085" + volumes: + - ./config.yaml:/CLIProxyAPI/config.yaml + - ./auths:/root/.cli-proxy-api + - ./logs:/CLIProxyAPI/logs + environment: + - TZ=Asia/Seoul + restart: unless-stopped +``` + +또는 공식 이미지 사용: + +```yaml +services: + cli-proxy-api: + image: eceasy/cli-proxy-api:latest + container_name: cli-proxy-api + ports: + - "8317:8317" + volumes: + - ./config.yaml:/CLIProxyAPI/config.yaml + - ./auths:/root/.cli-proxy-api + - ./logs:/CLIProxyAPI/logs + environment: + - TZ=Asia/Seoul + restart: unless-stopped +``` + +## 4. config.yaml 설정 + +`config.example.yaml`을 기반으로 작성합니다. + +### 최소 설정 예시 + +```yaml +# 서버 바인딩 +host: "" +port: 8317 + +# API 키 (클라이언트 인증용, 원하는 값으로 설정) +api-keys: + - "my-secret-api-key-1" + +# 디버그 (초기 설정 시 true 권장, 안정화 후 false) +debug: false + +# 로그를 파일로 기록 +logging-to-file: true +logs-max-total-size-mb: 100 + +# 재시도 설정 +request-retry: 3 +``` + +### Claude API 키 사용 시 추가 + +```yaml +claude-api-key: + - api-key: "sk-ant-xxxxx" + # base-url: "https://api.anthropic.com" # 기본값이므로 생략 가능 +``` + +### Gemini API 키 사용 시 추가 + +```yaml +gemini-api-key: + - api-key: "AIzaSy..." +``` + +### Management UI 활성화 (웹 관리 패널) + +```yaml +remote-management: + allow-remote: true + secret-key: "my-management-password" + disable-control-panel: false +``` + +## 5. 배포 실행 + +```bash +cd ~/docker/cli-proxy-api + +# 공식 이미지 사용 시 +sudo /usr/local/bin/docker compose up -d + +# 소스 빌드 시 (Gitea에서 소스 가져와서) +git clone http://nas.gru.farm:3001/airkjw/CLIProxyAPI.git src +sudo /usr/local/bin/docker compose -f src/docker-compose.yml up -d --build +``` + +## 6. 확인 + +```bash +# 컨테이너 상태 확인 +sudo /usr/local/bin/docker ps | grep cli-proxy-api + +# 로그 확인 +sudo /usr/local/bin/docker logs cli-proxy-api + +# API 응답 테스트 +curl http://localhost:8317/ +curl http://192.168.0.17:8317/ + +# 모델 목록 확인 (API 키 인증) +curl -H "Authorization: Bearer my-secret-api-key-1" http://localhost:8317/v1/models +``` + +## 7. 클라이언트 연결 + +CLIProxyAPI가 실행되면 각 AI CLI 도구에서 프록시 주소로 연결합니다. + +### Claude Code에서 사용 + +```bash +# 환경변수 설정 +export ANTHROPIC_BASE_URL=http://192.168.0.17:8317 +export ANTHROPIC_API_KEY=my-secret-api-key-1 +``` + +### OpenAI 호환 클라이언트에서 사용 + +```bash +export OPENAI_BASE_URL=http://192.168.0.17:8317/v1 +export OPENAI_API_KEY=my-secret-api-key-1 +``` + +## 8. 관리 & 운영 + +```bash +# 컨테이너 중지 +sudo /usr/local/bin/docker compose down + +# 설정 변경 후 재시작 +sudo /usr/local/bin/docker compose restart + +# 이미지 업데이트 (공식 이미지 사용 시) +sudo /usr/local/bin/docker compose pull +sudo /usr/local/bin/docker compose up -d + +# 로그 실시간 모니터링 +sudo /usr/local/bin/docker logs -f cli-proxy-api +``` + +## 포트 목록 + +| 포트 | 용도 | 필수 여부 | +|------|------|-----------| +| 8317 | 메인 API | 필수 | +| 8085 | 추가 API | 선택 | +| 1455 | 추가 서비스 | 선택 | +| 54545 | 추가 서비스 | 선택 | +| 51121 | 추가 서비스 | 선택 | +| 11451 | 추가 서비스 | 선택 | + +> 기본적으로 8317 포트만 열면 됩니다. 나머지는 특정 기능 사용 시 필요합니다. + +## 주의사항 + +- `config.yaml`은 `.gitignore`에 포함되어 있어 Git에 커밋되지 않음 (API 키 보호) +- OAuth 인증(Claude, Gemini 등)은 최초 1회 브라우저 로그인 필요 +- `auths/` 디렉토리를 볼륨으로 마운트하면 컨테이너 재생성 시에도 인증 유지 +- NAS 외부 접근 시 방화벽/포트포워딩 설정 필요 diff --git a/REVERSE_PROXY_SETUP.md b/REVERSE_PROXY_SETUP.md new file mode 100644 index 00000000..8e52bacc --- /dev/null +++ b/REVERSE_PROXY_SETUP.md @@ -0,0 +1,104 @@ +# CLIProxyAPI 역방향 프록시 & HTTPS 설정 가이드 + +외부에서 `https://cliproxy.gru.farm`으로 CLIProxyAPI에 접근하기 위한 설정입니다. + +## 1단계: DNS 레코드 추가 + +hostcocoa.com DNS 관리에서 A 레코드를 추가합니다. + +| 타입 | 호스트 | 값 | +|------|--------|-----| +| A | cliproxy | 125.188.185.74 | + +> 기존 `nas.gru.farm`, `haesol.gru.farm` 등과 같은 IP입니다. + +## 2단계: Synology DSM 역방향 프록시 설정 + +1. DSM 웹 UI 접속 (보통 `https://nas.gru.farm:5001`) +2. **제어판** → **로그인 포털** → **고급** 탭 → **역방향 프록시** 클릭 +3. **생성** 버튼 클릭 +4. 아래와 같이 입력: + +### 일반 설정 + +| 항목 | 값 | +|------|-----| +| 설명 | `CLIProxyAPI` | +| **소스 (프론트엔드)** | | +| 프로토콜 | `HTTPS` | +| 호스트 이름 | `cliproxy.gru.farm` | +| 포트 | `443` | +| HSTS | 비활성화 | +| **대상 (백엔드)** | | +| 프로토콜 | `HTTP` | +| 호스트 이름 | `localhost` | +| 포트 | `8317` | + +### 사용자 지정 헤더 (선택) + +필요 시 WebSocket 지원을 위해 사용자 지정 헤더 추가: +- `Upgrade` → `$http_upgrade` +- `Connection` → `$connection_upgrade` + +### 타임아웃 설정 + +AI 요청은 응답이 오래 걸릴 수 있으므로 타임아웃을 늘려주세요: +- 연결 타임아웃: `600` +- 전송 타임아웃: `600` +- 수신 타임아웃: `600` + +5. **저장** 클릭 + +## 3단계: SSL 인증서 설정 + +Synology DSM에서 `cliproxy.gru.farm` 용 SSL 인증서를 설정합니다. + +### Let's Encrypt 인증서 발급 (권장) + +1. **제어판** → **보안** → **인증서** 탭 +2. **추가** → **새 인증서 추가** → **Let's Encrypt에서 인증서 가져오기** +3. 도메인: `cliproxy.gru.farm` +4. 이메일: 본인 이메일 +5. 발급 완료 후, **설정** 버튼 클릭 +6. `cliproxy.gru.farm` 역방향 프록시 항목에 방금 발급한 인증서 선택 + +### 기존 와일드카드 인증서가 있는 경우 + +`*.gru.farm` 와일드카드 인증서가 있다면 별도 발급 없이 해당 인증서를 선택하면 됩니다. + +## 4단계: 공유기 포트 포워딩 + +공유기에서 443 포트가 NAS(192.168.0.17)로 포워딩되어 있는지 확인합니다. + +> 기존 `haesol.gru.farm` 등이 HTTPS로 동작 중이라면 이미 설정되어 있을 가능성이 높습니다. + +| 외부 포트 | 내부 IP | 내부 포트 | 프로토콜 | +|-----------|---------|-----------|----------| +| 443 | 192.168.0.17 | 443 | TCP | + +## 5단계: 확인 + +```bash +# DNS 전파 확인 +dig +short cliproxy.gru.farm +# 125.188.185.74 가 나오면 성공 + +# HTTPS 접속 테스트 +curl https://cliproxy.gru.farm/ +# {"endpoints":[...],"message":"CLI Proxy API Server"} + +# 모델 목록 확인 +curl -H "Authorization: Bearer Jinie4eva!" https://cliproxy.gru.farm/v1/models +``` + +## 클라이언트 연결 (외부) + +```bash +# Claude Code +export ANTHROPIC_BASE_URL=https://cliproxy.gru.farm +export ANTHROPIC_API_KEY=Jinie4eva! + +# OpenAI 호환 +export OPENAI_BASE_URL=https://cliproxy.gru.farm/v1 +export OPENAI_API_KEY=Jinie4eva! +```