Свой LLM-шлюз на VPS: один адрес, виртуальные ключи и видимый счёт за токены
Туториал на вечер: как поднять на зарубежном VPS собственный OpenAI-совместимый endpoint. Контур состоит из двух половин — LiteLLM управляет официальными API-ключами, OmniRoute подключает подписочную авторизацию ChatGPT и Claude. Вторая половина требует платной подписки, а вот слой LiteLLM отделяется и собирается сам по себе: приложения перестают знать ключи провайдеров, а расход становится виден по каждому проекту. Переключение клиента показано на curl и конфигах CLI-агентов, примера на SDK в статье нет.
- LiteLLM Proxy встаёт между приложением и провайдерами: приложение шлёт обычный OpenAI-совместимый запрос на https://свой-домен/v1, а маршрут, ключ и модель выбирает шлюз. Имя модели можно сделать своим алиасом вроде main-coder и позже подменить модель за ним, не трогая код клиентов.
- Docker-compose из статьи поднимает два контейнера: ghcr.io/berriai/litellm:main-stable с портом 127.0.0.1:4000:4000 и healthcheck на /health/liveliness, плюс postgres:16-alpine с проверкой через pg_isready. Наружу порт не торчит — к нему ходит только nginx.
- В nginx обязательны proxy_buffering off и proxy_read_timeout 3600s. Без первого nginx копит куски потокового ответа вместо того, чтобы сразу отдавать их клиенту.
- LITELLM_SALT_KEY нельзя менять после добавления моделей: им шифруются учётные данные провайдеров в базе, и после замены сохранённые токены перестанут расшифровываться.
- Виртуальный ключ выпускается в веб-интерфейсе с ограничением по модели, бюджетом и сроком действия. После первого же запроса в разделе Usage появляются модель, число токенов, задержка и стоимость.
- Автор сам очерчивает границу схемы: подписка через OmniRoute не превращается в официальный API-ключ, лимиты и правила провайдера остаются в силе, а для публичного прода нужны официальные ключи.
- Собрать только слой LiteLLM: docker compose up -d с образом ghcr.io/berriai/litellm:main-stable и postgres:16-alpine, спрятать порт 4000 за nginx с proxy_buffering off и выпустить сертификат командой certbot --nginx.
- В разделе Models → Add Model подключить один свой ключ провайдера, дать модели короткий публичный алиас и выпустить под него виртуальный ключ с бюджетом.
- Перевести одно своё приложение с прямого ключа провайдера на адрес шлюза и этот алиас.
- Метрика: приложение больше не хранит ключ провайдера, а в разделе Usage по вашему виртуальному ключу видны модель, токены, задержка и стоимость каждого запроса.
из статьи