Как я перенаправил Claude Desktop и Claude Code на свой VPS с CLIProxyAPI

За последние пару дней Anthropic забанило много аккаунтов. Точной причины компания не называет, апелляции, судя по постам в соц сетях, разбанивают крайне редко, и деньги за подписку не возвращают.
Моя предположение: под бан попадали аккаунты, на которых периодически светился российский IP, плюс часовой пояс ПК. Поэтому я сделал так, чтобы запросы к Claude всегда уходили с одного IP сервера в поддерживаемой стране. Да, IP дата‑центра тоже можно детектить, но компании же как‑то работают из облаков:)
Ниже рассказываю, как это настроить: сервер, вход в аккаунт, Claude Desktop и Claude Code. Для каждого шага два варианта: промпт для агента и ручная инструкция в спойлере.
Как это устроено
На VPS в Docker крутится CLIProxyAPI (дальше CPA): прокси, который хранит OAuth‑вход вашего аккаунта Claude и отдаёт совместимый API на 127.0.0.1:8317. Компьютер ходит к нему через SSH‑туннель, так что наружу сервера торчит только порт 22. Claude Desktop и Claude Code настраиваются на этот адрес как на собственный шлюз.
Плюсы и минусы
Плюсы
можно использовать без VPN;
можно подключить несколько аккаунтов (главное не борщить: в CPA есть отдельный прокси для каждого аккаунта);
меньше риска блокировки.
Минусы
нужен свой VPS: платить за него и следить за ним придётся самому;
показ usage в Claude Code надо настраивать отдельно;
с кастомным провайдером Claude Desktop работает только локально: нет SSH‑сессий, облачных окружений и Remote Control;
способ неофициальный, риск бана не исчезает, он только меньше.
0. Что нужно
Любой VPS в стране, где Claude работает официально, и SSH‑доступ под root. Порты открывать не нужно: CPA слушает только localhost сервера. Если не хочется держать туннель, можно открыть CPA по домену: подойдёт свой, бесплатный поддомен DuckDNS или адрес вида IP.sslip.io, который работает без регистрации. Тогда перед CPA нужен reverse proxy с HTTPS, а единственной защитой станет ваш API‑ключ, поэтому делайте его длинным.
1. Ставим CPA на сервер
Промпт для агента (подставьте IP):
У меня есть VPS на Ubuntu, доступ: ssh root@SERVER_IP. Поставь на него CLIProxyAPI в Docker:
1. Установи Docker, если его нет.
2. Создай /opt/cpa с config.yaml (host "", port 8317, auth-dir /root/.cli-proxy-api, один api-key вида sk-+48 hex-символов, сгенерируй через openssl) и docker-compose.yml: образ eceasy/cli-proxy-api:latest, порты ТОЛЬКО 127.0.0.1:8317 и 127.0.0.1:54545, тома ./config.yaml, ./auths, restart: unless-stopped.
3. Запусти docker compose up -d и проверь: curl с этим ключом на http://127.0.0.1:8317/v1/models должен вернуть 200.
4. Не открывай порты наружу и не трогай firewall.
5. Ключ в чат не печатай, скажи только, в каком файле он лежит. В конце коротко расскажи, что сделал. OAuth-вход я выполню сам.

Вручную
Нужен Docker. Если его нет: curl -fsSL https://get.docker.com | sh. Дальше на сервере:
mkdir -p /opt/cpa/auths && cd /opt/cpa
KEY="sk-$(openssl rand -hex 24)"; echo "$KEY"
cat > config.yaml <<EOF
host: ""
port: 8317
auth-dir: "/root/.cli-proxy-api"
api-keys:
- "$KEY"
EOF
cat > docker-compose.yml <<EOF
services:
cli-proxy-api:
image: eceasy/cli-proxy-api:latest
container_name: cli-proxy-api
ports:
- "127.0.0.1:8317:8317"
- "127.0.0.1:54545:54545"
volumes:
- ./config.yaml:/CLIProxyAPI/config.yaml
- ./auths:/root/.cli-proxy-api
restart: unless-stopped
EOF
docker compose up -d
Ключ, который напечатала команда (он же лежит в /opt/cpa/config.yaml), сохраните: он нужен в шагах 3 и 4. Автозапуск после перезагрузки обеспечивает restart: unless-stopped.
2. Туннель и вход в аккаунт через OAuth
Промпт для агента (на своём компьютере):
Добавь в мой ~/.ssh/config хост cpa: HostName SERVER_IP, User root, LocalForward 8317 127.0.0.1:8317 и 54545 127.0.0.1:54545, ServerAliveInterval 30. Подними туннель (ssh -N cpa, в фоне) и проверь, что curl http://127.0.0.1:8317/v1/models с моим ключом из /opt/cpa/config.yaml отдаёт 200. Потом на сервере выполни: cd /opt/cpa && docker compose exec cli-proxy-api ./CLIProxyAPI -claude-login -no-browser. Покажи мне ссылку claude.ai/oauth/authorize из вывода и жди. Я открою её в своём браузере и войду сам, ничего вводить за меня не нужно. Когда в выводе появится сообщение об успехе, скажи мне. Ключ в чат не печатай и никуда не коммить.

Откройте ссылку, войдите и разрешите доступ. Браузер вернётся на localhost:54545, туннель донесёт ответ до сервера, в терминале появится сообщение об успехе. Желательно входить под IP самого VPS (можно поднять браузер на сервере через noVNC либо использовать VPN).
Вручную
На своём компьютере откройте туннель и оставьте окно открытым:
ssh -L 8317:127.0.0.1:8317 -L 54545:127.0.0.1:54545 root@SERVER_IP
В этом же окне, на сервере:
cd /opt/cpa && docker compose exec cli-proxy-api ./CLIProxyAPI -claude-login -no-browser
Чтобы не набирать туннель каждый раз, добавьте в ~/.ssh/config (Windows: %USERPROFILE%\.ssh\config):
Host cpa
HostName SERVER_IP
User root
LocalForward 8317 127.0.0.1:8317
LocalForward 54545 127.0.0.1:54545
ServerAliveInterval 30
Дальше туннель открывается командой ssh -N cpa. Чтобы он поднимался сам при старте компьютера, поставьте autossh или добавьте команду в автозагрузку.
3. Claude Desktop
Этот шаг делаете сами. Конфиг ниже у меня уже работает, настроен так:
включён tool search, как в оригинальном Claude: без него контекст слишком сильно засорялся;
включён встроенный браузер;
отключена телеметрия;
отключён авто‑режим: с ним лимиты уходили быстрее, потому что запросы дублировались.
Сохраните конфиг в файл claude-desktop-cpa.json, вместо КЛЮЧ подставьте ключ из шага 1:
{
"inferenceProvider": "gateway",
"inferenceCredentialKind": "static",
"inferenceGatewayBaseUrl": "http://127.0.0.1:8317",
"inferenceGatewayApiKey": "КЛЮЧ",
"inferenceModelPricingEnabled": true,
"disableEssentialTelemetry": true,
"disableNonessentialTelemetry": true,
"disableNonessentialServices": true,
"autoModeEnabled": false,
"toolSearchEnabled": true,
"builtinBrowserEnabled": true
}
В самом Desktop: Help → Troubleshooting → Enable Developer Mode (приложение перезапустится), затем Developer → Configure Third‑Party Inference…


В окне откройте меню Default → Import configuration… и выберите сохранённый файл.

Нажмите Apply Changes и выберите модель в чате. Кнопка Test connection проверит адрес и ключ. Туннель из шага 2 должен быть запущен.
Вручную и что означают настройки
4. Claude Code
Промпт для агента:
Настрой Claude Code на мой прокси CLIProxyAPI. В ~/.claude/settings.json (не в проектный .claude/settings.json) добавь в блок env, не трогая остальные настройки: ANTHROPIC_BASE_URL=http://127.0.0.1:8317, ANTHROPIC_AUTH_TOKEN=<мой ключ из /opt/cpa/config.yaml>, ENABLE_TOOL_SEARCH=true, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1. Затем проверь запросом POST /v1/messages с этим ключом, что прокси отвечает. Ключ не печатай в чат и не коммить.
Запустите claude и выполните /status: должна появиться строка Anthropic base URL с вашим адресом.
Вручную
Добавьте в ~/.claude/settings.json (Windows: %USERPROFILE%\.claude\settings.json):
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317",
"ANTHROPIC_AUTH_TOKEN": "ВАШ_КЛЮЧ",
"ENABLE_TOOL_SEARCH": "true",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}
ENABLE_TOOL_SEARCH: за собственным base URL tool search по умолчанию выключен, переменная его включает. С CPA работает.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: отключает фоновый трафик, проверки версий и автообновления, поэтому обновляйте Claude Code вручную.
Если нужна панель
К CPA можно поставить CPA Manager Plus: запросы и токены по аккаунтам и моделям, оценка стоимости, квоты, ошибки. У меня она стоит на том же VPS. Ставится по тому же принципу: отдайте агенту ссылку на репозиторий.


Проверка
Если всё сделано правильно, в Claude Desktop рядом с вашим именем появится пометка Gateway: запросы идут через ваш сервер, а не напрямую.

Если что‑то не сходится, отдайте агенту текст ошибки вместе с шагом, на котором она появилась: у него есть доступ и к серверу, и к вашим конфигам.
Мой Telegram‑канал, там я пишу интересное про AI: Pixel by Pixel
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.