VPS 教程
VPS 搭建 LiteLLM 统一 LLM API 网关(2026):Docker、虚拟 Key、预算控制和多模型路由指南
这篇教程讲清楚如何在 VPS 上自托管 LiteLLM Proxy,把 OpenAI、Claude、Gemini、DeepSeek、OpenRouter 等模型统一成 OpenAI 兼容接口。内容覆盖 Docker Compose 部署、config.yaml 模型路由、虚拟 Key、团队预算、PostgreSQL、Prometheus、Caddy HTTPS、备份升级和常见坑。

我见过很多团队一开始只是把 OpenAI Key 写进项目里,后来模型越接越多,账单也越来越乱。
一个接口调 OpenAI,一个接口调 Claude,一个接口调 Gemini,还有人临时加 DeepSeek、OpenRouter、Azure OpenAI。最后代码里到处是 API Key,哪个项目花了多少钱也说不清。
LiteLLM 解决的就是这个问题。
它可以把一堆模型供应商统一成 OpenAI 兼容接口。你的应用只需要请求一个地址,比如:
https://llm.example.com/v1/chat/completions
后面到底转发给 OpenAI、Claude、Gemini、DeepSeek,还是多个 Key 轮询,交给 LiteLLM 管。
这篇按 VPS 自托管来写:怎么用 Docker Compose 跑起来,怎么配置 config.yaml,怎么做虚拟 Key、预算控制、HTTPS、备份,以及它和 One-API / New-API 到底有什么区别。
如果你只是自己用一个 OpenAI Key,LiteLLM 可能有点多余。
但只要出现下面几种情况,它就很有价值:
| 场景 | 为什么适合 LiteLLM |
|---|---|
| 一个项目要接多个模型 | 统一成 OpenAI 格式,代码少改 |
| 团队共用模型 API | 给每个人发虚拟 Key,方便控制预算 |
| 想做 fallback | 一个模型挂了自动切另一个 |
| 想统计花费 | 按 Key、用户、模型看消耗 |
| 想统一入口 | 只暴露一个 API 网关地址 |
我自己的判断很简单:
- 个人单 Key 使用:没必要
- 多项目、多模型、多成员:很有必要
- 想做内部 AI API 平台:值得部署
它不是聊天界面,也不是 AI 应用平台。它更像一个 LLM API 网关。
LiteLLM 本身不重,真正占资源的是 PostgreSQL、Prometheus、请求并发和日志量。
| 用法 | VPS 配置建议 |
|---|---|
| 个人测试 | 1 核 / 1GB / 20GB SSD |
| 小团队共用 | 2 核 / 4GB / 40GB SSD |
| 多项目生产使用 | 4 核 / 8GB / 80GB SSD |
如果只是做代理,不跑本地模型,2C4G 基本够用。
别把它和 Ollama 混在一起算资源。LiteLLM 是转发网关,不负责本地推理。你接的是 OpenAI、DeepSeek、Claude 这些远程 API,它自己的 CPU 压力不大。
别急着复制 Compose。
LiteLLM 有三个东西一开始就要定好:
LITELLM_MASTER_KEYLITELLM_SALT_KEYconfig.yaml里的模型命名规则
MASTER_KEY 是管理员钥匙,必须以 sk- 开头。
SALT_KEY 更重要,它用来加密数据库里的模型 API Key。官方文档也提醒过:添加模型后不要随便改这个值。你改了,旧的加密凭据可能就解不开了。
所以不要写:
LITELLM_SALT_KEY=sk-1234
应该生成一个长一点的随机值:
openssl rand -hex 32
然后写进 .env。
这篇用 Ubuntu / Debian 举例。
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg ufw nano
安装 Docker:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
确认一下:
docker --version
docker compose version
mkdir -p /opt/litellm
cd /opt/litellm
生成两个 Key:
echo "sk-$(openssl rand -hex 32)"
echo "sk-$(openssl rand -hex 32)"
一个给 LITELLM_MASTER_KEY,一个给 LITELLM_SALT_KEY。
创建 .env:
cat > .env << 'EOF'
LITELLM_MASTER_KEY="sk-replace-with-master-key"
LITELLM_SALT_KEY="sk-replace-with-long-salt-key"
OPENAI_API_KEY="sk-replace-with-openai-key"
DEEPSEEK_API_KEY="replace-with-deepseek-key"
POSTGRES_PASSWORD="replace-with-postgres-password"
EOF
如果暂时不用 OpenAI 或 DeepSeek,可以先留空,但 MASTER_KEY 和 SALT_KEY 一定要认真填。
config.yaml 是 LiteLLM 的核心。
它决定了:
- 外部看到的模型名叫什么
- 实际转发到哪个供应商
- API Key 从哪里读取
- 数据库和后台设置怎么配
创建文件:
nano config.yaml
写入一个最小可用版本:
model_list:
- model_name: gpt-4o-mini
litellm_params:
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
- model_name: deepseek-chat
litellm_params:
model: deepseek/deepseek-chat
api_key: os.environ/DEEPSEEK_API_KEY
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
database_url: "postgresql://litellm:${POSTGRES_PASSWORD}@db:5432/litellm"
store_model_in_db: true
litellm_settings:
request_timeout: 600
set_verbose: false
json_logs: true
这里最容易搞混的是:
model_name: gpt-4o-mini
这是你对外暴露的名字。
model: openai/gpt-4o-mini
这是 LiteLLM 内部识别的供应商和模型。
也就是说,你可以对外统一叫:
company-fast-model
但后面实际接的是 DeepSeek、OpenAI 或别的供应商。
创建 docker-compose.yml:
services:
db:
image: postgres:16
container_name: litellm-db
restart: unless-stopped
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./postgres-data:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm -d litellm"]
interval: 10s
timeout: 5s
retries: 5
litellm:
image: ghcr.io/berriai/litellm-database:main-stable
container_name: litellm
restart: unless-stopped
depends_on:
db:
condition: service_healthy
env_file:
- .env
volumes:
- ./config.yaml:/app/config.yaml:ro
command: ["--config", "/app/config.yaml", "--port", "4000"]
ports:
- "127.0.0.1:4000:4000"
注意我把 4000 和 5432 都绑定到了 127.0.0.1。
很多示例为了方便,会把服务直接暴露到公网。生产环境别这么干。LiteLLM 后面放 Caddy 或 Nginx,数据库更不要直接暴露。
启动:
docker compose up -d
看状态:
docker compose ps
docker logs litellm --tail=100
本机测试:
curl http://127.0.0.1:4000/health
如果健康检查正常,就可以继续配 HTTPS。
假设域名是:
llm.example.com
DNS 里添加 A 记录指向你的 VPS IP。
安装 Caddy:
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install -y caddy
编辑配置:
nano /etc/caddy/Caddyfile
写入:
llm.example.com {
reverse_proxy 127.0.0.1:4000
}
检查并重载:
caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy
浏览器访问:
https://llm.example.com/ui
用你的 LITELLM_MASTER_KEY 登录管理后台。
只开放 SSH、80、443:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status
不要开放 4000 和 5432:
ufw deny 4000/tcp
ufw deny 5432/tcp
如果你要给内网系统调用,建议用 Tailscale、WireGuard 或 Cloudflare Tunnel,不要把管理后台裸奔到公网。
用 OpenAI 兼容格式请求 LiteLLM:
curl https://llm.example.com/v1/chat/completions \
-H "Authorization: Bearer sk-your-master-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{"role": "user", "content": "用一句话解释什么是 VPS"}
]
}'
如果你想测试 DeepSeek:
curl https://llm.example.com/v1/chat/completions \
-H "Authorization: Bearer sk-your-master-key" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [
{"role": "user", "content": "给我一个 Docker Compose 备份建议"}
]
}'
只要应用本来支持 OpenAI API,大多数情况下把 base_url 改成你的 LiteLLM 地址就能用。
例如:
OPENAI_BASE_URL=https://llm.example.com/v1
OPENAI_API_KEY=sk-your-virtual-key-or-master-key
真正让 LiteLLM 有价值的不是代理转发,而是虚拟 Key。
你可以给不同项目发不同 Key:
project-docs-botproject-customer-supportdeveloper-testmarketing-agent
每个 Key 单独设置:
- 可用模型
- 每分钟请求数
- 每月预算
- 到期时间
- 使用记录
这样比把真实 OpenAI Key 发给所有人安全得多。
实际用的时候,我会这样分:
| Key | 用途 | 限制 |
|---|---|---|
| dev-test | 开发调试 | 小预算、低 RPM |
| prod-api | 线上服务 | 高预算、只给后端用 |
| data-script | 批处理脚本 | 限模型、限并发 |
| demo | 临时演示 | 1 天过期 |
出了问题也好查:到底是谁把钱花完了,哪个项目请求量异常,直接看 Key 维度就行。
如果只是个人用,可以先不加 Prometheus。
如果团队共用,建议加上,因为你迟早会想知道:
- 请求量多少
- 哪个模型最常用
- 延迟高不高
- 是否频繁报错
LiteLLM 官方示例里会用 prometheus.yml,这里有个坑:这个文件必须是真文件。
如果你直接在 Compose 里挂载:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
但本地没有这个文件,Docker 可能会把它当目录创建,Prometheus 就起不来。
先创建:
cat > prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: "litellm"
static_configs:
- targets: ["litellm:4000"]
EOF
然后再扩展 Compose。不要把 Prometheus 面板直接暴露公网,至少也要加 Basic Auth 或只允许内网访问。
至少备三样:
/opt/litellm/.env
/opt/litellm/config.yaml
/opt/litellm/postgres-data
.env 里有密钥,不要随便放进 GitHub。
config.yaml 可以进私有 Git 仓库,但里面不要硬编码真实 API Key,尽量用:
api_key: os.environ/OPENAI_API_KEY
PostgreSQL 备份可以这样做:
cd /opt/litellm
docker exec litellm-db pg_dump -U litellm litellm | gzip > litellm-db-$(date +%F).sql.gz
再把备份同步到对象存储:
rclone copy litellm-db-$(date +%F).sql.gz r2:backup-bucket/litellm/
如果只备份 Compose,不备数据库,虚拟 Key、预算记录、使用统计都会丢。
升级前先备份:
cd /opt/litellm
docker exec litellm-db pg_dump -U litellm litellm | gzip > litellm-before-upgrade-$(date +%F).sql.gz
cp config.yaml config.yaml.bak.$(date +%F)
cp .env .env.bak.$(date +%F)
然后拉新镜像:
docker compose pull
docker compose up -d
看日志:
docker logs litellm --tail=200
LiteLLM 会涉及数据库迁移。生产环境别在高峰期升级,先在测试机验证一遍更稳。
LiteLLM 对 master key 有格式要求。
不要写:
LITELLM_MASTER_KEY="my-password"
写成:
LITELLM_MASTER_KEY="sk-xxxxxxxx"
LITELLM_SALT_KEY 用来加密和解密凭据。
加了模型、创建了 Key 之后,不要随手换。换之前先确认你知道怎么恢复,否则数据库里的加密内容可能解不开。
看到 Compose 里有:
ports:
- "5432:5432"
我建议改成:
ports:
- "127.0.0.1:5432:5432"
或者干脆不映射给宿主机,只让 Docker 网络内部访问。
请求里用的是 model_name,不是 litellm_params.model。
如果配置是:
model_name: deepseek-chat
litellm_params:
model: deepseek/deepseek-chat
那请求时写:
"model": "deepseek-chat"
不是:
"model": "deepseek/deepseek-chat"
启动前先确认:
ls -lah prometheus.yml
它应该是一个文件,不是目录。
如果已经变成目录:
rm -rf prometheus.yml
nano prometheus.yml
再重启。
这几个工具会被放在一起比较。
| 工具 | 更适合 |
|---|---|
| One-API / New-API | 面向用户分发、渠道管理、面板化运营 |
| LiteLLM | 面向开发团队、统一 SDK/API、路由和预算控制 |
| OpenRouter | 不想自建,直接用托管聚合服务 |
如果你是站长,想给用户开 Key、做渠道、看余额,New-API 更像成品面板。
如果你是开发团队,想让内部项目统一走一个 OpenAI 兼容入口,LiteLLM 更顺手。
它俩不是完全替代关系。你也可以让 LiteLLM 接上游 New-API,或者让内部应用都走 LiteLLM,再由 LiteLLM 做 fallback 和预算控制。
如果是我自己给小团队部署 LiteLLM,我会这样来:
- VPS:2 核 4GB 起步
- 部署:Docker Compose + PostgreSQL
- 入口:Caddy HTTPS
- 端口:4000 只监听 127.0.0.1
- 数据库:不暴露公网
- Key:每个项目一个虚拟 Key
- 预算:开发 Key 小预算,生产 Key 单独限额
- 配置:
config.yaml放私有仓库,真实 API Key 放.env - 备份:每天备份 PostgreSQL、
.env和config.yaml
LiteLLM 最适合的不是“我想搭一个聊天网站”,而是“我有多个应用要调用多个模型,但不想每个应用都管一套 API Key 和模型适配”。
当模型供应商越来越多,统一入口会越来越省事。你现在花半小时把网关搭好,后面换模型、加预算、查账单,会少很多麻烦。