人工智能· · 发布于 2026-01-13 00:46:23

(转载)手把手,嘴对嘴教你Docker(Compose)部署AI全家桶(API+MCP+轮询),玩转AI不求人!

  1. 一般我们使用AI的时候,需要一个API地址,和一个API KEY,然后才能使用AI的API服务.那么New API就是负责创建并管理各种AI渠道和API KEY的发放,以及额度控制和用户管理的.使用New API的好处之一就是,比如我们使用很多的AI官方服务,比如DeepSeek, OpenAI, Grok, Google Gemini等,如果没有这种整合,那么我就需要在每个用来聊天的AI客户端里,依次添加每个渠道的API地址和API KEY,太麻烦了.那么我们就可以把这些渠道整合在New API里,对外只需要一个域名,一个Key,就可以直接访问这些所有的渠道,非常方便.并且也不用担心KEY的泄露,毕竟不是你的官Key泄露,只需要在New API里删除重新创建一个就行了,而且有完善的日志管理和额度控制,有可疑的地方,翻一翻也能找出问题在哪.还有个好处就是,只要你搭建New API的服务器能正常访问ChatGPT, Claude等,你又能正常访问你的New API这台服务器,那么等于你不用代理也能正常访问ChatGPT, Claude.不会暴露你的本机IP.并且New API也可以配置访问代理,用配置的代理(比如WARP)来访问这些官方的API服务,非常地隐私友好.
MCP全称Model Context Protocol,模型上下文协议,简单理解就是你可以使用它来获取需要让AI知道的内容,然后喂给AI.比如时间MCP,它会获取本机的时间,然后将返回结果的JSON喂给AI,AI就知道现在是什么时候了,从而给出更符合当前情境的答案.有很多实用的MCP服务器都是stdio类型的,需要在本机运行.但是有一些MCP比如代码运行之类的工具,在本机运行的话可能有风险(比如跑了个删除文件的代码给你电脑文件删了).还有就是如果我手机端要用,基本上stdio类的MCP是用不了的,一般只能用SSE或者Streamable HTTP类型的,可以理解为MCP在远程服务器运行,你只需要调用它提供的SSE或者Streamable HTTP的API API KEY的轮询项目(可选),用途是有大量的API KEY的时候,可以轮询使用,用完1次下次就换下1个KEY,避免频率限制等问题(主要是针对大量的,免费的Gemini KEY).因我不喜欢用New API自带的轮询,我喜欢用GPT-Load,也是隔壁站流行打野的时候开始用的,而且比较效率,轻量,用来当New API的后端很不错. 简单介绍完,那么就开始搭建步骤

New API

新建一个new-api目录
mkdir new-api && cd new-api
配置环境变量(文本编辑工具爱用哪个用哪个,我喜欢用nano)
nano .env
输入以下内容(自己用SQLite就够了,MYSQL等数据库可以去参照官方文档部署):
REDIS_CONN_STRING=redis://new-api-redis
MEMORY_CACHE_ENABLED=true
TZ=Asia/Shanghai
ERROR_LOG_ENABLED=true
创建docker-compose.yml文件
nano docker-compose.yml
输入以下内容,这里映射的端口是用来SSH隧道访问演示用的,实际使用是和Cloudflared容器组一个自定义网络,然后直接通过CF Tunnel后台配置的域名访问New API容器的,其他容器也如此.你可以自行换成其他方式,比如映射到宿主机端口,或者用nginx容器反代也行.
name: new-api
services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: unless-stopped
    env_file:
      - .env
    command: --log-dir /app/logs
    volumes:
      - ./data:/data
      - ./logs:/app/logs
    depends_on:
      new-api-redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      internal:
      cf_tunnel:
        ipv4_address: 192.168.0.2
    expose:
      - 3000
    ports: # 用于SSH隧道访问,可以创建完管理员账号以后删除
      - 127.0.0.1:3000:3000 # 用于SSH隧道访问,可以创建完管理员账号以后删除

new-api-redis:
image: redis:alpine
container_name: new-api-redis
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
networks:
- internal

networks:
internal:
internal: true
cf_tunnel:
external: true


创建自定义网络(用来和Cloudflared容器共享网络,走Cloudflare Tunnel从公网访问)
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.254 --ipv6 cf_tunnel

运行容器

docker compose up -d
查看日志是否正常运行
docker logs -f new-api
通过SSH隧道访问(虽然一般情况下不会有被扫,然后抢先注册管理员账号的情况发生,因为没有意义),不过这算是一个好习惯吧. 浏览器访问127.0.0.1:3000,注册New API的管理员账号
ssh -N -L 127.0.0.1:3000:127.0.0.1:3000 -p <port_number> <user>@<your_vps_ip>
我们前面在compose配置文件里已经做好了数据持久化,所以下一步 输入完账号密码,下一步 选择自用模式,下一步 最后一步,点初始化系统 我们点击右上角的登录,用刚才注册的管理员账号登录 先点进系统设置,把新用户注册关了(没配置邮箱貌似没问题,因为根本没有邮件服务,所以注册不了,但是怕后面忘了,好习惯,有需要自己再开) 然后我们去添加一个AI渠道,这里演示是DeepSeek 类型选DeepSeek,输入你喜欢的渠道名称,官方的API KEY,下面模型那里如果没显示模型,就点下获取模型列表,然后添加.没问题我们就点提交 测试下渠道看看是否有效 然后我们创建一个API KEY,准备开始跟AI聊天 额度,过期时间,用户组什么的随便设置.(顺便提一嘴,你可以用用户分组控制来实现不同分组的用户,允许或限制访问指定的模型,或者不同的倍率,这里就不多说了,可以自己了解下.这里演示默认是default分组,添加的渠道也是默认default分组,所以不需要额外设置) 打开AI聊天客户端,这里演示用Cherry Studio.添加一个提供商 输入你喜欢的名称 输入好API地址和API KEY后点击管理(这里因为是SSH隧道转发到本地的,所以这里填的是http://127.0.0.1:3000,后面用Cloudflare Tunnel可以配置域名从公网访问) 添加所有模型 新建一个AI助手,点左边的模型设置,再点右上角的模型选择,选择我们刚才添加的模型 恭喜你,你有了属于自己的AI API网关

MCP网关

我推荐使用ptbsare大佬的mcp-proxy-server项目,可以聚合MCP服务器,把Stdio, SSE, Streamable HTTP类型的MCP全部集合在这个容器里运行,然后统一对外提供SSE或者Streamable HTTP接口来调用,现在的桌面端AI聊天客户端一般都支持SSE和Streamable HTTP的.手机端的话只有少部分支持Streamable HTTP(比如RikkaHub).那么开始部署: 创建mcp-proxy-server文件夹
mkdir mcp-proxy-server && cd mcp-proxy-server
配置环境变量
nano .env
输入以下内容:
PORT=8080
ALLOWED_KEYS=<建议用长一点的密码,最好不要带$>
ENABLE_ADMIN_UI=false
ADMIN_USERNAME=username
ADMIN_PASSWORD=<建议用长一点的密码,最好不要带$>
SESSION_SECRET=<建议用长一点的密码,最好不要带$>
RETRY_SSE_TOOL_CALL=true
SSE_TOOL_CALL_MAX_RETRIES=4
SSE_TOOL_CALL_RETRY_DELAY_BASE_MS=300
RETRY_HTTP_TOOL_CALL=true
HTTP_TOOL_CALL_MAX_RETRIES=4
HTTP_TOOL_CALL_RETRY_DELAY_BASE_MS=500
RETRY_STDIO_TOOL_CALL=true
STDIO_TOOL_CALL_MAX_RETRIES=5
STDIO_TOOL_CALL_RETRY_DELAY_BASE_MS=1000
创建docker-compose.yml
nano docker-compose.yml
输入以下内容:
services:
  mcp-proxy-server:
    image: ghcr.io/ptbsare/mcp-proxy-server/mcp-proxy-server:latest
    container_name: mcp-proxy-server
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - ./config.json:/mcp-proxy-server/config/mcp_server.json
    networks:
      cf_tunnel:
        ipv4_address: 192.168.0.3
    expose:
      - 3001
    ports:
      - 127.0.0.1:3001:3001 # 用于SSH隧道演示访问,用不到可删除

networks:
cf_tunnel:
external: true


创建config.json配置文件

nano config.json
输入以下内容:
{
    "mcpServers": {
        "time": {
            "type": "stdio",
            "name": "Time",
            "active": true,
            "command": "uvx",
            "args": [
                "mcp-server-time",
                "--local-timezone=Asia/Shanghai"
            ]
        }
    }
}
运行容器
docker compose up -d
查看运行日志,容器是否正常运行
docker logs -f mcp-proxy-server
开启SSH隧道转发
ssh -N -L 127.0.0.1:3001:127.0.0.1:3001 -p <port_number> <user>@<your_vps_ip>
继续转到Cherry Studio,我们添加一个MCP服务器 名称随意,类型选择Streamable HTTP, URL填http://127.0.0.1:3001/mcp ,还是一样,可以从Cloudflare Tunnel配置域名从公网访问. 请求头我们填写X-Api-Key=sk-test,也就是你在环境变量里设置的ALLOWED_KEYS 保存并启用以后,可以看到我们的MCP服务器版本号亮了,并且可用工具的数量也更新了. 让我们实际体验一下,先给AI启用对应的MCP服务器 非常完美,AI终于有了获取当前真实世界时间的能力!

KEY轮询

一般来说,个人用没有这么多KEY,所以一般来说是用不到,但是因为之前隔壁站流行打野,基本上人手都是几千上万的Gemini KEY,这个项目可以添加海量KEY并轮询,性能非常高,占用特别低,而且我也不喜欢New API自带的轮询(一开始还有BUG,后面慢慢完善了),所以后端我一般就用这个项目 开始部署: 创建gpt-load文件夹
mkdir gpt-load && cd gpt-load
配置环境变量
nano .env
PORT=3000
HOST=0.0.0.0

SERVER_READ_TIMEOUT=60
SERVER_WRITE_TIMEOUT=600
SERVER_IDLE_TIMEOUT=120
SERVER_GRACEFUL_SHUTDOWN_TIMEOUT=10

IS_SLAVE=false

TZ=Asia/Shanghai
AUTH_KEY=sk-test

REDIS_DSN=redis://gpt-load-redis:6379/0

MAX_CONCURRENT_REQUESTS=99

ENCRYPTION_KEY=encrypt_password

#如果有需要可以自己设置代理,通过代理来访问API
#HTTP_PROXY=socks5://192.168.1.1:1080
#HTTPS_PROXY=socks5://192.168.1.1:1080


创建docker-compose.yml
nano docker-compose.yml

输入以下内容:

name: gpt-load
services:
  gpt-load:
    image: ghcr.io/tbphp/gpt-load:latest
    container_name: gpt-load
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - ./data:/app/data
    healthcheck:
      test: wget -q --spider -T 10 -O /dev/null http://localhost:${PORT:-3001}/health
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    depends_on:
      gpt-load-redis:
        condition: service_healthy
        restart: true
    networks:
      internal:
      cf_tunnel:
        ipv4_address: 192.168.0.4
    expose:
      - 3000
    ports:
      - 127.0.0.1:3002:3000 # 我这里为了演示就不创建域名了,就用SSH隧道演示下

gpt-load-redis:
image: redis:latest
container_name: gpt-load-redis
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 3
networks:
- internal

networks:
internal:
internal: true
cf_tunnel:
external: true


起飞
docker compose up -d

查看日志,观察容器是否正常运行

docker logs -f gpt-load
开启SSH隧道转发
ssh -N -L 127.0.0.1:3002:127.0.0.1:3002 -p <port_number> <user>@<your_vps_ip>
浏览器访问 http://127.0.0.1:3002 登录后台,密钥就是环境变量里设置的AUTH_KEY 这里会有很多警告,因为我这里演示密码设置的很短很不安全,所以你们实际部署的时候,需要设置比较复杂的密码,推荐64位以上数字加字母大小写,符号也可以,但是docker环境变量的话$是保留字符,所以如果你需要表示$本身的话就需要2个$$来转义,所以之前密码我才不建议带$. 我们添加一个组 因为演示,我就只添加了DeepSeek官方渠道,实际使用你可以添加任意的OpenAI兼容渠道,Gemini兼容渠道和Anthropic兼容渠道.这里点生成按钮可以生成任意数量的密钥,因为一般是用作New-API的后端,所以生成1个就行了. 给渠道添加任意数量的KEY 测试一下渠道是否有效 OK,那么如何搭配New-API使用呢,因为这2个容器是在同一个网络(cf_tunnel)中的,所以可以在New-API里添加一个渠道,类型选OpenAI,API地址就填http://192.168.0.4:3000/proxy/deepseek ,这里192.168.0.4是GPT-Load容器的IP, 3000是端口, /proxy是固定路径, /deepseek是刚才我们创建分组时填写的名称.所以对外提供服务的链接就是http://192.168.0.4:3000/proxy/deepseek 模型列表里默认会存在大量OpenAI的模型,我们先点击清除,再点击获取 勾选渠道包含的模型,然后确定 测试一下是否有问题 OK,至此API网关+MCP网关(+轮询)就部署完毕了.但是因为这里为了方便,所以用的是SSH隧道的方式访问,下面再讲一下配合Cloudflared(Cloudflare Tunnel)容器实现公网访问.但是需要你自己有域名,并且已经托管到CF.

我们先登录到Cloudflare控制面板,找到Zero Trust

然后 网络 -> Tunnels

创建一个新隧道

类型选Cloudflared

输入你喜欢的隧道名称,然后创建

我们并不需要安装什么,我们只需要他的密钥,我们点击复制按钮复制安装命令,找个文本编辑器比如VS Code,然后把install后面开始的密钥记录下来,后面要用.

创建cloudflared文件夹

mkdir cloudflared && cd cloudflared

配置环境变量

nano .env
输入以下内容:
CLOUDFLARED_TOKEN=<你刚才复制并提取的密钥,ey开头的>
编辑docker-compose.yml
nano docker-compose.yml
输入以下内容:
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    env_file:
      - .env
    command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TOKEN}
    networks:
      cf_tunnel:
        ipv4_address: 192.168.0.1

networks:
cf_tunnel:
external: true


拉起容器

docker compose up -d
观察容器运行日志,判断容器是否正常运行
docker logs -f cloudflared
我们回到Cloudflare控制台,点击我们刚才创建的隧道,然后点击编辑 切到已发布应用程序路由标签,然后我们添加一个应用程序路由 子域名看你自己喜好填写,域名选择你托管的域名,类型HTTP,URL填写New API容器的IP地址和端口 mcp-proxy-server也一样 配置以后可能因为DNS同步的关系,你本地不一定能立即访问,几秒钟到几个小时都是正常的. 确定解析生效了以后我们就可以去Cherry Studio里,将之前演示用的SSH隧道的本地地址,换成域名从公网访问了. OK,大功告成!至此你已经拥有了属于自己的API网关,MCP网关.你可以把大量的渠道添加进New API或者GPT-Load,然后对外统一一个URL和KEY来访问,喜欢的MCP服务器也可以全部放进mcp-proxy-server这个容器里运行,你的任何AI聊天客户端都只需要访问mcp-proxy-server提供的SSE或者Stremable HTTP接口即可,All in One!而且SSE和Stremable HTTP接口是同时提供,不是只能用一个,你2个同时用都行.避免了很多手机端的AI聊天客户端只支持SSE的尴尬场面,因为有的MCP网关只支持Streamable HTTP.

接下来为了提升使用体验,你将会在网上搜集更多有趣,好用的MCP服务器来充实你的AI体验,比如从这里开始.

登录后操作

好文章

厉害

🛡️ 权限设置
提示:选择"私有"会覆盖等级限制。
app
安装到桌面,像 App 一样使用
打开更快 · 全屏体验 · 入口常驻

iPhone/iPad 安装到桌面

  1. 使用 Safari 打开本站(微信/QQ 内置浏览器不稳定)。
  2. 点击底部 分享 按钮(方框上箭头)。
  3. 选择 添加到主屏幕,确认即可。
首页
搜索
动态
发帖
私信
我的