news 2026/9/27 20:57:31

new-api 用 docker compose 快速部署:TaoToken 统一 Key 接入配置骨架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
new-api 用 docker compose 快速部署:TaoToken 统一 Key 接入配置骨架

1. 为什么我要用 docker compose 跑 new-api

new-api 是一个把多家大模型 API 统一成 OpenAI 兼容格式的开源网关,简单说就是:你手里有 OpenAI、Claude、Gemini 或者任意兼容 OpenAI 协议的服务,通过 new-api 可以只暴露一个地址、一套 Key,让下游的客户端、脚本、Agent 都只认这一个入口。适合谁?自建 AI 网关的开发者、想给团队做统一计费和额度管理的同学、以及需要把多个模型渠道聚合到一个 Key 后面的场景。

但真到自己部署的时候,坑往往不在 new-api 本身,而在编排:MySQL 和 Redis 的连接串写错一个字符,容器起来了但页面 500;SESSION_SECRET 没设或者太短,登录态一直掉;端口映射和云服务器安全组对不上,本地 curl 通、外网访问不了。我试过手动 docker run 三个容器,改一次配置要重启三次,后来换成 docker compose 一把梭,配置文件即文档,重建环境只要一条命令。

这篇就聚焦一件事:用 docker compose 把 new-api + MySQL + Redis 一次性编排跑通,并且把上游渠道指向 TaoToken 的统一 API 通道,让 new-api 作为你本地的统一出口。全程给你可复制的docker-compose.yml、环境变量清单、启动后的连通性验证命令,以及最常见的几类报错怎么排。你跟着做,十分钟内应该能看到登录页。

2. TaoToken 前置准备:拿到统一 Key 和 API 地址

new-api 本身是网关,它需要至少一个上游渠道才能真正转发请求。这里我们用 TaoToken 作为上游:它提供 OpenAI 兼容的统一 API 通道,一个 Key 可以调用多种模型,正好和 new-api 的「渠道」概念对上。

你需要提前准备两样东西:

第一是 API Key。登录 TaoToken 控制台,在 API Keys 页面创建一个新 Key,复制保存。这个 Key 就是后面填进 new-api 渠道里的密钥。

第二是 API 地址。TaoToken 的 API 端点是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 new-api 渠道的 Base URL 填入即可。new-api 在转发时会自动拼接/v1/chat/completions这类路径,所以你不要自己多加/v1,否则会变成/v1/v1/...导致 404。

相关入口我列一下,方便你按需跳转:

  • 模型对话体验:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
  • Coding Plan(长期编码/Agent 场景):https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan
  • 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
  • API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc

注意:Key 只在创建时完整显示一次,页面刷新后就看不到了。建议创建后立刻粘贴到你的密码管理器或临时文件里,别等关了页面再找。

3. 可复制的 docker-compose.yml 与配置骨架

下面这份编排是我实际在用的精简版,三个服务:new-api 主程序、MySQL 8.0 存数据、Redis 7.0 做缓存和会话。目录结构建议这样放:

new-api-deploy/ ├── docker-compose.yml ├── data/ # new-api 运行数据 ├── mysql/ # MySQL 持久化 └── redis/ # Redis 持久化

docker-compose.yml内容如下,你可以直接复制:

version: '3.8' services: new-api: image: calciumion/new-api:latest container_name: new-api restart: always ports: - "3000:3000" volumes: - ./data:/data environment: - SQL_DSN=root:newapi_pass_2024@tcp(mysql:3306)/newapi?charset=utf8mb4&parseTime=True&loc=Local - REDIS_CONN_STRING=redis://redis:6379/0 - SESSION_SECRET=change_this_to_a_long_random_string_at_least_32_chars - NODE_TYPE=master - TZ=Asia/Shanghai depends_on: - mysql - redis mysql: image: mysql:8.0 container_name: new-api-mysql restart: always environment: - MYSQL_ROOT_PASSWORD=newapi_pass_2024 - MYSQL_DATABASE=newapi - TZ=Asia/Shanghai volumes: - ./mysql:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci redis: image: redis:7.0 container_name: new-api-redis restart: always volumes: - ./redis:/data command: redis-server --appendonly yes

几个关键点解释一下,这些是我踩过坑之后固定下来的写法:

SQL_DSN里的密码必须和 MySQL 服务的MYSQL_ROOT_PASSWORD完全一致,tcp(mysql:3306)里的mysql是 compose 的服务名,容器间通过服务名互相解析,不要写成localhost或127.0.0.1,那会指向容器自己。

SESSION_SECRET别用示例里的字符串,换成你自己的随机串,长度至少 32 位。生成方法:

openssl rand -hex 32

REDIS_CONN_STRING用redis://redis:6379/0,末尾的/0是数据库编号。如果你给 Redis 设了密码,要写成redis://:你的密码@redis:6379/0,冒号前面留空表示用户名。

MySQL 的command里加了mysql_native_password,是因为部分 new-api 版本对 MySQL 8 默认的caching_sha2_password兼容性一般,显式指定更稳。

4. 启动、验证与渠道接入

配置文件就位后,在new-api-deploy目录下执行:

docker compose up -d

第一次会拉取三个镜像,耐心等。如果卡在拉取不动,多半是镜像仓库网络问题,可以给 Docker 配置镜像加速器,在/etc/docker/daemon.json里加:

{ "registry-mirrors": ["https://docker.m.daocloud.io"] }

改完执行sudo systemctl restart docker再重新up -d。

启动完成后查看状态:

docker compose ps

三个服务都应该是Up状态。如果 new-api 反复重启,先看日志:

docker compose logs -f new-api

日志里出现database connection failed就是 DSN 写错了,出现NOAUTH就是 Redis 连接串有问题。

确认容器健康后,验证 HTTP 端口是否通:

curl -I http://127.0.0.1:3000

返回HTTP/1.1 200 OK或 302 跳转都算正常。如果部署在云服务器,记得在安全组放行 3000 端口,否则外网访问不了。然后浏览器打开http://你的服务器IP:3000,首次访问会引导你创建管理员账号。

登录后进入「渠道」页面,添加一个渠道:

  • 类型选择 OpenAI
  • Base URL 填https://taotoken.net/api
  • 密钥填你在 TaoToken 创建的 API Key
  • 模型可以手动填,比如gpt-4o-mini、claude-3-5-sonnet等,按你实际要用的填

保存后点渠道的「测试」按钮,如果返回绿色成功,说明 new-api 已经能通过 TaoToken 通道转发请求了。接着在「令牌」页面创建一个 new-api 自己的令牌,这个令牌才是你给下游客户端用的。

最后用 new-api 的令牌做一次端到端验证:

curl http://127.0.0.1:3000/v1/chat/completions \ -H "Authorization: Bearer 你的new-api令牌" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "说一句你好"}] }'

返回里带choices字段和正常内容,整条链路就通了:客户端 → new-api → TaoToken → 模型。

5. 本篇常见错排查

报错一:dial tcp 127.0.0.1:3306: connect: connection refused

说明 new-api 在连本机的 3306,而不是 MySQL 容器。检查SQL_DSN里的主机名是不是写成了localhost或127.0.0.1,必须改成服务名mysql。

报错二:NOAUTH Authentication required

Redis 设了密码但连接串没带。要么去掉 Redis 密码,要么把连接串改成redis://:密码@redis:6379/0。

报错三:页面能打开但登录后立刻掉线

SESSION_SECRET没设或太短。换成长随机串后重建容器:docker compose down && docker compose up -d。注意down不会删数据卷,数据还在。

报错四:渠道测试返回 404

Base URL 多写了/v1。TaoToken 的地址就是https://taotoken.net/api,new-api 会自己拼路径,你多加一层就重复了。

报错五:外网访问超时,本地 curl 正常

云服务器安全组没放行 3000 端口,或者系统防火墙拦了。检查安全组入站规则和ufw/firewalld状态。

报错六:MySQL 容器启动后马上退出

多半是./mysql目录权限问题,或者之前用不同密码初始化过数据目录导致密码不匹配。可以备份后清空./mysql重新初始化,但注意这会丢数据。

6. 后续怎么用这套骨架

这套编排跑通之后,你手里就有了一个本地统一出口。下游无论是 ChatBox、NextChat 这类客户端,还是自己写的脚本、Agent 框架,都只需要填http://你的IP:3000/v1和 new-api 令牌,不用再关心上游到底是哪家模型。想加新模型,在 TaoToken 侧确认可用后,在 new-api 渠道里补一个模型名就行,客户端完全无感。

如果你后面要做长期编码或 Agent 场景,可以了解下 Coding Plan,配合 new-api 做额度隔离会更顺手;单纯想先验证模型效果,直接去模型对话页面试就行。接入过程中遇到渠道配置或 Key 的问题,接入文档里有更细的字段说明,API Keys 页面可以随时新建和吊销 Key。整套骨架的价值在于:配置文件即环境,换台机器复制目录、改一下 SESSION_SECRET 和密码,docker compose up -d就能重建一套一模一样的网关。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 20:56:57

HI3798MV310机顶盒U盘强刷安卓9.0实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:53:56

麒麟V10服务器网络配置五种方式深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:53:52

PageHelper 分页原理、Spring Boot 集成与 count 优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:52:30

AI视频生成工具选型指南:免费额度、开源方案与实操避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:50:15

谷歌浏览器109版本离线安装包:老电脑Win7/Win8系统兼容的最后选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:50:11

Deep-Leafsnap植物叶片识别源码:迁移学习与小样本训练实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华