Files
wiki/tasks/claude-cli-proxy/DEV_TASK.md
2026-05-14 11:10:01 +03:00

8.3 KiB
Raw Blame History

DEV TASK: Деплой CLIProxyAPI на mva154

Статус: Выполнено
Проект: claude-cli-proxy
BRD: tasks/claude-cli-proxy/BRD.md


Цель

Поднять CLIProxyAPI в Docker на mva154, подготовить к OAuth авторизации Claude Max подписки. После авторизации — OpenClaw сможет использовать Claude через подписку вместо API токенов.

Контекст

  • CLIProxyAPI — Go-сервер, оборачивает Claude Code CLI в OpenAI-compatible API
  • Docker image: eceasy/cli-proxy-api:latest
  • Порт по умолчанию: 8317
  • OAuth порт (для логина): 54545
  • Доступ: только из docker network (OpenClaw контейнер на том же хосте)
  • Один аккаунт, без load balancing

Инфраструктура

Параметр Значение
Сервер slin@82.22.50.71 (пароль: motoZ@yaz2010)
SSH через Node.js ssh2 модуль
Docker network та же сеть что у OpenClaw контейнера
Рабочая директория /home/slin/claude-cli-proxy/

Задачи

Task 1: Подготовка файлов на сервере

Шаги:

  • 1.1 Создать директорию и config.yaml:
mkdir -p /home/slin/claude-cli-proxy/auth
cat > /home/slin/claude-cli-proxy/config.yaml << 'EOF'
port: 8317
remote-management:
  allow-remote: false
  secret-key: ""
auth-dir: "/root/.cli-proxy-api"
auth:
  providers: []
debug: false
EOF

Примечание: auth.providers: [] — отключает проверку API key, используется OAuth токен.

  • 1.2 Создать docker-compose.yml:
cat > /home/slin/claude-cli-proxy/docker-compose.yml << 'EOF'
version: "3.8"

services:
  cli-proxy-api:
    image: eceasy/cli-proxy-api:latest
    container_name: claude-cli-proxy
    restart: unless-stopped
    ports:
      - "127.0.0.1:8317:8317"
    volumes:
      - ./config.yaml:/CLIProxyAPI/config.yaml
      - ./auth:/root/.cli-proxy-api
    networks:
      - openclaw_net

networks:
  openclaw_net:
    external: true
EOF

⚠️ ВАЖНО: Нужно узнать имя docker network где живёт OpenClaw контейнер. Проверить:

docker network ls
docker inspect <openclaw-container-name> --format '{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}'

Заменить openclaw_net на реальное имя сети.

  • 1.3 Проверить что image скачивается:
cd /home/slin/claude-cli-proxy
docker compose pull

Критерий: Файлы на месте, image скачан.


Task 2: Первый запуск и OAuth авторизация

Шаги:

  • 2.1 Запустить контейнер в режиме логина (одноразово):
cd /home/slin/claude-cli-proxy
docker run --rm -it \
  -p 54545:54545 \
  -v $(pwd)/config.yaml:/CLIProxyAPI/config.yaml \
  -v $(pwd)/auth:/root/.cli-proxy-api \
  eceasy/cli-proxy-api:latest \
  /CLIProxyAPI/CLIProxyAPI --claude-login --no-browser

Это выведет URL для авторизации. Этот URL нужно передать Славе — он откроет его в браузере и залогинится.

⚠️ Флаг --no-browser обязателен (headless сервер, нет GUI).

  • 2.2 После успешного логина — проверить что токен сохранился:
ls -la /home/slin/claude-cli-proxy/auth/
# Должен быть файл с OAuth credentials

Критерий: OAuth токен сохранён в ./auth/.


Task 3: Запуск сервиса

Шаги:

  • 3.1 Запустить через docker-compose:
cd /home/slin/claude-cli-proxy
docker compose up -d
  • 3.2 Проверить что контейнер работает:
docker ps | grep claude-cli-proxy
docker logs claude-cli-proxy --tail 20
  • 3.3 Проверить API:
# Список моделей
curl -s http://127.0.0.1:8317/v1/models | python3 -m json.tool

# Тестовый запрос
curl -s -X POST http://127.0.0.1:8317/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer dummy" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "messages": [{"role": "user", "content": "Say hello, one sentence only"}],
    "stream": false
  }' | python3 -m json.tool
  • 3.4 Проверить streaming:
curl -s -X POST http://127.0.0.1:8317/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer dummy" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "messages": [{"role": "user", "content": "Count from 1 to 5"}],
    "stream": true
  }'
# Должен выдавать SSE chunks

Критерий: API отвечает, streaming работает.


Task 4: Подключение к docker network OpenClaw

Шаги:

  • 4.1 Определить сеть OpenClaw:
# Найти контейнер OpenClaw
docker ps | grep -i openclaw
# Посмотреть его сеть
docker inspect <container_name> --format '{{json .NetworkSettings.Networks}}' | python3 -m json.tool
  • 4.2 Обновить docker-compose.yml с правильным именем сети (если отличается от openclaw_net)

  • 4.3 Проверить что OpenClaw контейнер видит прокси:

# Из контейнера OpenClaw
docker exec <openclaw-container> curl -s http://claude-cli-proxy:8317/v1/models

Критерий: OpenClaw контейнер может достучаться до claude-cli-proxy:8317.


Проверка (Acceptance)

# Проверка Команда Ожидаемый результат
1 Контейнер запущен docker ps | grep claude-cli-proxy STATUS: Up
2 Models endpoint curl http://127.0.0.1:8317/v1/models JSON с claude моделями
3 Chat completion curl POST /v1/chat/completions Ответ от Claude
4 Streaming curl POST stream=true SSE chunks
5 Доступ из OpenClaw docker exec openclaw curl ... Ответ от прокси

Ограничения и грабли

  • ⚠️ SSH только через Node.js ssh2 (бинарный ssh сломан в контейнере OpenClaw)
  • ⚠️ OAuth логин — ручной шаг, нужен браузер Славы. Dev готовит URL, Слава логинится.
  • ⚠️ --no-browser обязателен при логине (headless сервер)
  • ⚠️ auth.providers: [] в config — без этого будет требовать API key
  • ⚠️ Порт 8317 слушает только на 127.0.0.1 (не наружу!)
  • ⚠️ Имя docker network нужно определить динамически — не хардкодить
  • 🚫 НЕ открывать порт наружу
  • 🚫 НЕ запускать несколько инстансов (риск бана)

После деплоя (делает Стрим, не Dev)

После успешного Task 4 — Стрим добавит provider в OpenClaw config:

{
  "id": "claude-cli-proxy",
  "type": "openai",
  "baseUrl": "http://claude-cli-proxy:8317/v1",
  "apiKey": "dummy",
  "models": ["claude-sonnet-4-20250514", "claude-opus-4-20250514"]
}

И назначит Dev-агенту модель через этот provider.


Деплой-чеклист

  • Директория и файлы созданы
  • Docker image скачан
  • OAuth авторизация пройдена (ручной шаг Славы)
  • Контейнер запущен и отвечает
  • Streaming работает
  • Доступен из docker network OpenClaw
  • Порт НЕ открыт наружу

Создано: 2026-05-14 | Автор ТЗ: Стрим | Исполнитель: Dev-агент