Docker newapi 部署实战:用 docker-compose 把 endpoint 改到 TaoToken
1. 为什么要在 Docker 里跑 newapi 并把 endpoint 指向 TaoTokennewapi 是一个开源的 AI 网关项目能做什么简单说它把 OpenAI、Claude、Gemini 这些不同厂商的接口格式统一成一套 OpenAI 兼容协议你对外只暴露一个地址、一把 Key后端换模型、换供应商都不用改业务代码。适合谁适合自建 AI 网关的开发者、需要给团队做统一 Key 分发的运维、以及想把多个模型渠道收敛到一个入口的中小型项目。我这次的需求很具体用 docker-compose 把 newapi 容器化部署起来然后把它的上游 endpoint 改到 TaoToken让 newapi 作为统一入口TaoToken 作为实际模型通道。这样做的价值在于业务侧只认 newapi 的地址渠道切换、额度统计、日志审计都在 newapi 里完成而真正的模型调用走 TaoToken 的 API。很多人卡在哪卡在 docker-compose 编排里数据库、Redis、网络三件套没配好容器起来了但连不上库或者 endpoint 填错请求发出去返回 401再或者环境变量注入顺序不对SQL_DSN 里的密码和 postgres 容器不一致。这篇就按「编排 → 注入 → 指向 → 验证 → 排障」的顺序把可复制的配置片段和验证命令都给出来。先明确一个概念newapi 里的「渠道」才是真正决定请求发往哪里的地方。docker-compose 负责把容器跑起来endpoint 指向 TaoToken 是在 newapi 后台的渠道配置里完成的两者是配合关系不是二选一。理解这一点后面的步骤就不会乱。TaoToken 在这里扮演的角色是上游模型通道它的 API 地址是 https://taotoken.net/api官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。你需要在 TaoToken 控制台拿到 Key然后在 newapi 里新建一个渠道把 Base URL 填成 TaoToken 的 API 地址模型 ID 填你要用的模型。2. 前置准备TaoToken Key 与 docker-compose 目录结构在动手写 docker-compose.yml 之前先把两件事准备好TaoToken 的 API Key以及服务器上的目录结构。TaoToken 这边你需要登录控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content进去之后在 API Keys 页面新建一把 Key复制保存好后面要填到 newapi 的渠道配置里。如果你还没决定用哪个模型可以先到模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 试一下确认模型 ID 再回填。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content里面有 Base URL 和请求格式的说明。服务器目录结构建议这样规划和后面 compose 里的挂载路径保持一致mkdir -p /app/newapi/data /app/newapi/logs mkdir -p /app/postgres/data mkdir -p /app/redis/data为什么要单独建目录因为 newapi 的 data 目录存的是配置和渠道信息logs 存运行日志postgres 和 redis 各自的数据目录也要持久化。容器重启后数据不丢靠的就是这些挂载点。我见过有人把 data 目录挂到容器内不存在的路径结果 newapi 启动后配置全空白折腾半天。网络这块compose 里用了一个 external 网络叫 zhaoxin。external 的意思是「这个网络不是 compose 创建的是外部已经存在的」所以你得先手动建docker network create zhaoxin如果你不想用 external也可以把 compose 里的 networks 改成默认网络但多容器互通时显式网络更清晰。建好之后postgres、redis、newapi 三个容器都接入这个网络newapi 里就能用服务名 postgres 和 redis 作为主机名来连接。TaoToken 的 Key 先放一边等 newapi 容器起来、后台能访问了再填。前置准备的核心就是Key 拿到手、目录建好、网络建好。这三样齐了compose 一跑就能起来。3. 可复制的 docker-compose.yml 与 .env 配置这一节是核心直接给可复制的配置。我把敏感信息抽到 .env 里compose 文件用变量引用这样配置和密钥分离改起来也安全。先写 .env 文件放在和 docker-compose.yml 同级的目录# .env POSTGRES_USERroot POSTGRES_PASSWORDchange_this_password POSTGRES_DBnew-api REDIS_PASSWORDchange_this_redis_password TZAsia/Shanghai注意POSTGRES_PASSWORD 和 REDIS_PASSWORD 一定要改别用示例里的弱密码。生产环境用弱密码等于把数据库和缓存敞开。然后是 docker-compose.ymlservices: new-api: image: calciumion/new-api:latest container_name: new-api restart: always command: --log-dir /app/logs ports: - 3000:3000 volumes: - /app/newapi/data:/data - /app/newapi/logs:/app/logs environment: - SQL_DSNpostgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}postgres:5432/${POSTGRES_DB} - REDIS_CONN_STRINGredis://:${REDIS_PASSWORD}redis:6379 - TZ${TZ} - ERROR_LOG_ENABLEDtrue - BATCH_UPDATE_ENABLEDtrue - STREAMING_TIMEOUT300 depends_on: - postgres - redis networks: - zhaoxin healthcheck: test: [CMD-SHELL, wget -q -O - http://localhost:3000/api/status | grep -o \success\:\\s*true || exit 1] interval: 30s timeout: 10s retries: 3 postgres: image: postgres:15 container_name: postgres restart: always environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - /app/postgres/data:/var/lib/postgresql/data ports: - 5432:5432 networks: - zhaoxin redis: image: redis:latest container_name: redis restart: unless-stopped ports: - 6379:6379 volumes: - /app/redis/data:/data command: redis-server --requirepass ${REDIS_PASSWORD} networks: - zhaoxin networks: zhaoxin: external: true几个关键点解释一下。SQL_DSN 用的是 postgresql:// 前缀主机名是 postgres也就是 compose 里的服务名端口 5432库名从 .env 读。REDIS_CONN_STRING 的格式是 redis://:密码主机:端口注意密码前面有个冒号这是 Redis 连接串的固定写法漏了冒号会连不上。STREAMING_TIMEOUT 我设成了 300 秒。默认是 120 秒如果你遇到流式返回空补全把这个值调大通常能解决。ERROR_LOG_ENABLED 和 BATCH_UPDATE_ENABLED 都开成 true方便排查问题和减少数据库写入压力。healthcheck 那段是检查 newapi 的 /api/status 接口返回里包含 success: true 就算健康。这个检查每 30 秒跑一次失败 3 次容器会被标记为 unhealthy。注意 healthcheck 里用的是 wgetnewapi 镜像里带了这个工具所以能直接用。启动命令docker compose up -d起来之后用docker compose ps看状态三个容器都应该是 runningnewapi 的 health 状态过一会儿会变成 healthy。4. 在 newapi 后台把渠道 endpoint 指向 TaoToken 并验证请求容器起来后浏览器访问http://你的服务器IP:3000第一次进会让你设置管理员账号密码。登录后进「渠道」页面新建一个渠道。渠道配置里几个关键字段字段填写内容渠道类型OpenAI 兼容Base URLhttps://taotoken.net/apiAPI Key你在 TaoToken 控制台创建的 Key模型填你要用的模型 ID比如 gpt-4o、claude-3-5-sonnet 等Base URL 这里填 https://taotoken.net/api不要带多余的路径。模型 ID 要和 TaoToken 支持的模型名一致不确定的话去模型对话页面试一下或者查接入文档。填完保存渠道状态应该显示为「已启用」。接下来验证。newapi 对外暴露的是 OpenAI 兼容接口所以你可以直接用 curl 打 newapi 的地址看它能不能把请求转发到 TaoToken 并正常返回。先拿 newapi 的令牌在「令牌」页面新建一个令牌复制出来。然后执行curl http://localhost:3000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的newapi令牌 \ -d { model: gpt-4o, messages: [{role: user, content: 你好回复一句话}], stream: false }预期返回是一个标准的 OpenAI 格式 JSONchoices 数组里有模型回复的内容。如果返回 200 且内容正常说明 newapi → TaoToken 这条链路通了。再测一下流式curl http://localhost:3000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的newapi令牌 \ -d { model: gpt-4o, messages: [{role: user, content: 数到五}], stream: true }流式会一段段返回 data: 开头的 SSE 数据最后以 data: [DONE] 结束。如果流式卡住不动回去把 STREAMING_TIMEOUT 调大再重启容器。验证通过后你的业务代码只需要把 base_url 指向http://你的服务器IP:3000/v1api_key 用 newapi 的令牌就完成了统一入口的接入。后面换模型、加渠道都在 newapi 后台操作业务代码不用动。5. 常见报错排查401、local proxy failed、reading choices、OAuth部署和接入过程中几个报错出现频率最高逐个说清楚。401 Unauthorized。这个最常见分两种。一种是打 newapi 时 401说明你用的 newapi 令牌不对或者没带 Authorization 头检查令牌是否复制完整、有没有多余空格。另一种是 newapi 转发到 TaoToken 时 401说明渠道里填的 TaoToken Key 有问题去控制台确认 Key 是否有效、有没有被删除重新复制粘贴一次。注意 Key 前后不要有换行。local proxy failed。这个报错通常出现在 newapi 尝试连接上游时原因是容器内 DNS 解析不了或者网络不通。先确认 newapi 容器能访问外网docker exec -it new-api ping -c 2 taotoken.net。如果 ping 不通检查服务器的网络配置和防火墙出站规则。另外确认 Base URL 拼写正确是 https 不是 http路径是 /api。reading choices 相关报错比如cannot read property choices of undefined或者返回体里没有 choices 字段。这通常是上游返回了非预期格式比如返回了一个错误对象而不是正常的 completion。排查方法在 newapi 的「日志」页面看这次请求的原始响应或者在渠道里开启调试。常见原因是模型 ID 填错了TaoToken 那边不认识这个模型名返回了错误。把模型 ID 改成 TaoToken 支持的名称即可。OAuth 相关报错。如果你在 newapi 里配置了需要 OAuth 的渠道或者用了某些需要额外鉴权的上游可能会遇到 OAuth token 获取失败。TaoToken 的 API 用的是 Bearer Key 鉴权不涉及 OAuth 流程所以如果你看到 OAuth 报错先确认渠道类型选的是「OpenAI 兼容」而不是其他需要 OAuth 的类型。选错类型会导致鉴权方式不匹配。还有一个容易忽略的postgres 容器起来了但 newapi 连不上报connection refused或password authentication failed。检查 .env 里的 POSTGRES_PASSWORD 和 postgres 容器实际使用的密码是否一致。如果你改了 .env 但 postgres 数据目录里已经存了旧密码需要删掉 /app/postgres/data 重新初始化或者进容器改密码。这个坑我踩过改 .env 不生效就是因为数据目录已经固化了旧密码。排查顺序建议先看docker compose logs new-api的启动日志再看 newapi 后台的请求日志最后用 curl 直接打 TaoToken 的 API 确认上游本身是否正常。分层定位比盲目改配置快得多。6. 长期编码与 Agent 场景的接入建议如果你不只是做一次性验证而是要把这套网关用于长期编码或者 Agent 场景有几个点值得注意。长期编码场景比如你在 IDE 里用 Cline、Continue 这类插件或者跑 Claude Code 这类命令行工具它们都需要一个稳定的 Base URL 和 Key。把 newapi 作为统一入口后这些工具全部指向 newapi 的地址Key 用 newapi 令牌。这样你换模型、调额度、看用量都在 newapi 一个地方完成。TaoToken 的 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 有适合长期编码的套餐说明可以按需选择。Agent 场景对稳定性要求更高因为 Agent 会连续发很多请求。建议把 newapi 的 STREAMING_TIMEOUT 设大一点比如 300 到 600 秒避免长任务被截断。同时开启 ERROR_LOG_ENABLED出问题时能回溯。渠道里可以配置多个 TaoToken 渠道做负载均衡newapi 支持多渠道轮询一个渠道出问题自动切下一个。另外newapi 的令牌可以设置额度、过期时间、允许的模型范围。给不同的业务或不同的开发者分配不同令牌能精细控制用量。这在团队协作里很实用谁用了多少一目了然。最后提醒一句docker-compose 里的密码、TaoToken 的 Key 都属于敏感信息不要提交到公开仓库。.env 文件加到 .gitignore 里服务器上的文件权限设成 600。生产环境建议再加一层反向代理和 HTTPSnewapi 本身监听 3000 端口前面挂 Nginx 做证书和转发。整套流程走下来核心就是三件事compose 把容器编排好、newapi 后台把渠道指向 TaoToken、curl 验证链路通。配置片段直接复制改改就能用剩下的就是按报错排查。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →