本文所有命令与配置均照搬 One API 官方仓库 README(github.com/songquanpeng/one-api,main 分支)与仓库内
.env.example、docs/API.md等文件,未作任何改动与发挥。信息核验日期:2026-11-01。
一、项目介绍
One API 是由开发者 songquanpeng(JustSong)开源的大模型统一网关 / 分发系统。官方 README 副标题为:"通过标准的 OpenAI API 格式访问所有的大模型,开箱即用"。它在各类大模型上游(OpenAI、Azure OpenAI、Anthropic Claude、Google Gemini、Mistral、字节豆包、百度文心、阿里通义、讯飞星火、智谱 ChatGLM、腾讯混元、Moonshot、DeepSeek、xAI、Groq、Ollama 等)与你的应用之间充当反向代理:上游各家模型的不同协议被 One API 统一改写成 OpenAI Chat Completions 格式,下游只需要一个 API Base + 一个令牌就能调用所有模型。
官方同时提供 Docker 镜像 justsong/one-api(Docker Hub)与 ghcr.io/songquanpeng/one-api(GitHub Container Registry),稳定版与 alpha 版分别发布。项目在 GitHub(songquanpeng/one-api)持续活跃维护(核验日期 2026-11-01),官方在线演示站为 https://openai.justsong.cn/ 。
二、功能拆解
按官方 README「功能」一节,One API 的核心能力如下:
| 功能 | 说明 |
|---|---|
| 多模型聚合 | 统一 OpenAI 格式接入 OpenAI、Azure、Claude、Gemini、豆包、文心、通义、星火、ChatGLM、混元、Moonshot、DeepSeek、xAI、Groq、Ollama 等数十家上游 |
| 镜像与第三方代理 | 支持配置镜像地址以及第三方代理服务 |
| 负载均衡 | 多个渠道之间按权重/分组做负载均衡,失败自动重试 |
| Stream 流式 | 支持 SSE 流式传输,前端打字机效果 |
| 多机部署 | 主从架构:主节点 master、从节点 slave,共享同一 MySQL 数据库 |
| 令牌管理 | 为终端用户签发 API 令牌,可设置过期时间、额度、允许 IP、允许模型 |
| 兑换码管理 | 批量生成兑换码并导出,用户可凭码充值 |
| 渠道管理 | 批量创建渠道、为渠道指定可用模型列表、设置分组倍率 |
| 用户分组 / 渠道分组 | 不同分组使用不同倍率,实现计费隔离 |
| 绘图接口 | 兼容 OpenAI 图像生成接口 |
| 自定义主题 | 环境变量 THEME 切换主题,默认 default |
| 多种登录方式 | 邮箱注册/登录、飞书 OAuth、GitHub OAuth、微信公众号(需额外部署 WeChat Server) |
| 管理 API | 通过系统访问令牌调用管理 API,便于二次开发扩展 |
| Cloudflare 集成 | 渠道代理可指向 Cloudflare AI Gateway;用户校验可启用 Cloudflare Turnstile |
三、官方/GitHub 链接
- GitHub 仓库:https://github.com/songquanpeng/one-api
- 官方在线演示:https://openai.justsong.cn/
- Docker Hub 镜像(稳定版):https://hub.docker.com/r/justsong/one-api
- GHCR 镜像(稳定版):https://github.com/songquanpeng/one-api/pkgs/container/one-api
- Docker Hub 镜像(alpha 版):https://hub.docker.com/r/justsong/one-api-alpha
- Release 下载(二进制 / 源码):https://github.com/songquanpeng/one-api/releases/latest
- 仓库内 API 文档:https://github.com/songquanpeng/one-api/blob/main/docs/API.md
- 主题列表:https://github.com/songquanpeng/one-api/tree/main/web/README.md
四、环境要求
官方 README 提供四种原生部署方式:基于 Docker、宝塔面板一键、Docker Compose、手动编译。最常用、官方文档最完整的是 Docker 方式。
- 操作系统:官方 Docker 镜像为 Linux 容器镜像,需在 Linux 主机(或 macOS / Windows 上的 Docker Desktop)运行 Docker。
- 软件依赖:仅需 Docker(如使用 Docker Compose 方式还需 docker-compose)。手动编译方式额外需要 Node.js + npm(构建前端)与 Go(构建后端)。
- 端口:容器内默认监听 3000;官方示例
-p 3000:3000,第一个 3000 是宿主机端口,可按需修改。 - 数据库:默认使用 SQLite(零依赖,数据落盘在挂载卷
/data下的one-api.db);并发量较大或多机部署时官方要求切换到 MySQL(或 PostgreSQL,"适配中")。 - 硬件:官方 README 未给出最低硬件指标;官方多机部署章节建议高并发场景搭配 Redis 缓存。
- 数据目录:官方示例将宿主目录
/home/ubuntu/data/one-api挂载为容器内/data,数据与日志都保存在此。
五、部署步骤
方式 A:Docker 部署(官方 README「基于 Docker 进行部署」)
步骤 1:准备数据目录
mkdir -p /home/ubuntu/data/one-api
逐段解释:
mkdir -p递归创建目录;/home/ubuntu/data/one-api是官方示例给出的数据持久化宿主路径,请确保该目录存在且对当前用户可写,或改成你自己的路径。
预期输出参考: 命令成功,无输出。
步骤 2:使用 SQLite 启动(官方原命令)
docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api
逐段解释:
-docker run启动一个新容器;
---name one-api给容器命名为 one-api;
--d后台运行;
---restart always容器退出或 Docker 守护进程重启后自动拉起(即官方提供的开机自启方式);
--p 3000:3000将宿主 3000 端口映射到容器 3000 端口,官方 README 注明:"其中,-p 3000:3000中的第一个3000是宿主机的端口,可以根据需要进行修改";
--e TZ=Asia/Shanghai设置容器时区为上海;
--v /home/ubuntu/data/one-api:/data将宿主数据目录挂载到容器/data,SQLite 数据库文件与日志都保存在这里;
-justsong/one-api是官方 Docker Hub 镜像名。
预期输出参考: 输出一串容器 ID(长哈希字符串),回到命令行提示符。
步骤 2(备选):使用 MySQL 启动(官方原命令)
官方 README 原文:"使用 MySQL 的部署命令,在上面的基础上添加 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi",请自行修改数据库连接参数"。官方示例命令:
docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api
逐段解释:与步骤 2 相同,额外多了一个环境变量
-e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi",告诉 One API 连接外部 MySQL 数据库(用户 root、密码 123456、主机 localhost:3306、库名 oneapi)。官方 README 注明:"注意需要提前建立数据库oneapi,无需手动建表,程序将自动建表";"如果使用本地数据库:部署命令可添加--network="host"以使得容器内的程序可以访问到宿主机上的 MySQL"。
步骤 3:确认容器运行状态
docker ps --filter name=one-api
逐段解释:
docker ps列出运行中容器,--filter name=one-api按名字过滤。
预期输出参考: 看到 one-api 容器 STATUS 为 Up ...,PORTS 列显示 0.0.0.0:3000->3000/tcp。
方式 B:Docker Compose 部署(官方 README「基于 Docker Compose 进行部署」)
官方 README 原文:"仅启动方式不同,参数设置不变,请参考基于 Docker 部署部分"。仓库提供了基于 MySQL 的 compose 文件,官方命令:
# 目前支持 MySQL 启动,数据存储在 ./data/mysql 文件夹内
docker-compose up -d
# 查看部署状态
docker-compose ps
逐段解释:
docker-compose up -d在当前目录读取docker-compose.yml后台启动全部服务(One API + MySQL);docker-compose ps查看本 compose 项目的容器状态。官方注明"数据存储在 ./data/mysql 文件夹内"。
方式 C:手动编译部署(官方 README「手动部署」)
步骤 1:拉取源码并构建前端
git clone https://github.com/songquanpeng/one-api.git
# 构建前端
cd one-api/web/default
npm install
npm run build
逐段解释:
git clone克隆源码;进入web/default前端目录后用 npm 安装依赖并构建生产包。
步骤 2:构建后端
cd ../..
go mod download
go build -ldflags "-s -w" -o one-api
逐段解释:回到仓库根目录;
go mod download下载 Go 依赖;go build -ldflags "-s -w" -o one-api编译为单一可执行文件one-api。
步骤 3:运行
chmod u+x one-api
./one-api --port 3000 --log-dir ./logs
逐段解释:
chmod u+x给可执行文件加执行权限;./one-api启动服务;--port 3000指定监听端口;--log-dir ./logs指定日志目录。
方式 D:宝塔面板一键部署(官方 README)
官方 README「通过宝塔面板进行一键部署」:① 安装宝塔面板 9.2.0 及以上;② 在宝塔面板中安装 Docker 服务;③ 在应用商店搜索 One-API 并安装,配置域名等基本信息即可。详细步骤另见官方 issue #175(https://github.com/songquanpeng/one-api/issues/175)。
六、配置参数详解
官方 README「环境变量」一节明确列出了全部可调参数。系统本身开箱即用,可通过环境变量或命令行参数配置。
1. 命令行参数(官方「命令行参数」一节):
| 参数 | 默认值 | 说明 |
|---|---|---|
--port <port_number> |
3000 |
服务器监听端口号 |
--log-dir <log_dir> |
工作目录下 logs/ |
日志文件夹路径 |
--version |
- | 打印系统版本号并退出 |
--help |
- | 查看命令帮助 |
2. 关键环境变量(官方「环境变量」一节):
| 变量 | 示例 / 默认 | 说明 |
|---|---|---|
REDIS_CONN_STRING |
redis://default:redispw@localhost:49153 |
设置后使用 Redis 作为缓存;哨兵/集群模式设为节点列表 localhost:49153,localhost:49154,...,并配合 REDIS_PASSWORD、REDIS_MASTER_NAME |
SESSION_SECRET |
random_string |
固定会话密钥,重启后已登录 cookie 仍有效 |
SQL_DSN |
MySQL:root:123456@tcp(localhost:3306)/oneapi;PostgreSQL:postgres://postgres:123456@localhost:5432/oneapi |
使用指定数据库替代 SQLite;需提前建库,自动建表 |
SQL_MAX_IDLE_CONNS |
100 |
最大空闲连接数 |
SQL_MAX_OPEN_CONNS |
1000 |
最大打开连接数;如遇 Error 1040: Too many connections 请减小 |
SQL_CONN_MAX_LIFETIME |
60(分钟) |
连接最大生命周期 |
LOG_SQL_DSN |
未设置 | 为 logs 表单独使用一个数据库 |
FRONTEND_BASE_URL |
https://openai.justsong.cn |
仅限从服务器设置,重定向页面请求到主服务器 |
MEMORY_CACHE_ENABLED |
false |
启用内存缓存(会带来额度更新延迟) |
SYNC_FREQUENCY |
600(秒) |
启用缓存后与数据库同步配置的频率 |
NODE_TYPE |
master |
节点类型:master / slave |
CHANNEL_UPDATE_FREQUENCY |
未设置 | 定期更新渠道余额(分钟) |
CHANNEL_TEST_FREQUENCY |
未设置 | 定期检查渠道可用性(分钟) |
POLLING_INTERVAL |
无 | 批量更新渠道余额与测试可用性时的请求间隔(秒) |
BATCH_UPDATE_ENABLED |
false |
启用数据库批量更新聚合(缓解连接数过多) |
BATCH_UPDATE_INTERVAL |
5(秒) |
批量更新聚合时间间隔 |
GLOBAL_API_RATE_LIMIT |
180 |
全局 API 速率限制(单 IP 三分钟最大请求数,中继请求除外) |
GLOBAL_WEB_RATE_LIMIT |
60 |
全局 Web 速率限制 |
TIKTOKEN_CACHE_DIR |
未设置 | 词元编码缓存目录,离线/网络不稳时配置 |
DATA_GYM_CACHE_DIR |
未设置 | 同 TIKTOKEN_CACHE_DIR,优先级较低 |
RELAY_TIMEOUT |
不设置 | 中继超时(秒) |
RELAY_PROXY |
未设置 | 请求 API 时使用的代理 |
USER_CONTENT_REQUEST_TIMEOUT |
未设置 | 用户上传内容下载超时(秒) |
USER_CONTENT_REQUEST_PROXY |
未设置 | 请求用户上传内容(如图片)时使用的代理 |
SQLITE_BUSY_TIMEOUT |
3000(毫秒) |
SQLite 锁等待超时 |
GEMINI_SAFETY_SETTING |
BLOCK_NONE |
Gemini 安全设置 |
GEMINI_VERSION |
v1 |
One API 使用的 Gemini 版本 |
THEME |
default |
系统主题 |
ENABLE_METRIC |
不开启 | 是否根据请求成功率禁用渠道 |
METRIC_QUEUE_SIZE |
10 |
成功率统计队列大小 |
METRIC_SUCCESS_RATE_THRESHOLD |
0.8 |
成功率阈值 |
INITIAL_ROOT_TOKEN |
未设置 | 首次启动时自动创建一个 root 用户令牌 |
INITIAL_ROOT_ACCESS_TOKEN |
未设置 | 首次启动时自动创建一个 root 系统管理令牌 |
ENFORCE_INCLUDE_USAGE |
不开启 | 是否强制 stream 模式返回 usage |
TEST_PROMPT |
Print your model name exactly and do not output without any other text. |
测试模型时的用户 prompt |
官方 README 同时注明:"One API 支持从 .env 文件中读取环境变量,请参照 .env.example 文件,使用时请将其重命名为 .env"。
3. Nginx 反向代理参考配置(官方 README 原文):
server{
server_name openai.justsong.cn; # 请根据实际情况修改你的域名
location / {
client_max_body_size 64m;
proxy_http_version 1.1;
proxy_pass http://localhost:3000; # 请根据实际情况修改你的端口
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_read_timeout 300s; # GPT-4 需要较长的超时时间,请自行调整
}
}
逐段解释:
server_name改为自己的域名;proxy_pass指向本机 One API 的 3000 端口;client_max_body_size 64m允许较大的请求体;proxy_read_timeout 300s长超时以适配 GPT-4 类长响应。
4. HTTPS 配置(官方 README 原文,使用 Let's Encrypt certbot):
# Ubuntu 安装 certbot:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 生成证书 & 修改 Nginx 配置
sudo certbot --nginx
# 根据指示进行操作
# 重启 Nginx
sudo service nginx restart
七、启动与运维
- 启动 / 停止 / 重启: Docker 方式启动即上面的
docker run;停止docker stop one-api;启动已存在容器docker start one-api;重启docker restart one-api。 - 后台常驻 / 开机自启: 官方命令中带的
--restart always即官方提供的自启策略——容器异常退出或 Docker 守护进程重启后自动拉起。 - 修改端口: 官方 README 注明:"
-p 3000:3000中的第一个3000是宿主机的端口,可以根据需要进行修改",即把宿主端口改成想要的端口(如-p 8080:3000),容器内端口保持 3000 不变。 - 查看日志:
docker logs -f one-api跟踪容器日志(Ctrl+C 退出跟踪不停止容器)。手动部署方式日志输出在--log-dir指定目录。 - 数据持久化: 官方示例
-v /home/ubuntu/data/one-api:/data,SQLite 数据库文件one-api.db与日志均落在该宿主目录。 - 更新命令(官方 README 原文):
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR(使用 Watchtower 自动拉取并重启更新)。 - 镜像拉取失败备选: 官方 README:"如果上面的镜像无法拉取,可以尝试使用 GitHub 的 Docker 镜像,将上面的
justsong/one-api替换为ghcr.io/songquanpeng/one-api即可"。 - 启动失败加特权: 官方 README:"如果启动失败,请添加
--privileged=true,具体参考 https://github.com/songquanpeng/one-api/issues/482"。
八、实操验证
- 浏览器访问
http://服务器IP:3000/,看到 One API 登录页(官方 README:"访问 http://localhost:3000/ 并登录")。 - 使用初始账号登录:用户名
root,密码123456(官方 README 原文:"初始账号用户名为root,密码为123456")。 - 登录后进入管理后台,左侧菜单「渠道」→ 新建渠道,填入某上游(如 OpenAI)的 API Key 与分组。
- 左侧菜单「令牌」→ 新增令牌,复制生成的
sk-xxx令牌。 - 用官方 README 给出的 OpenAI 官方库环境变量方式验证调用:
OPENAI_API_KEY="sk-xxxxxx"
OPENAI_API_BASE="https://<HOST>:<PORT>/v1"
逐段解释:把
OPENAI_API_KEY设为上一步生成的令牌,把OPENAI_API_BASE设为你的 One API 地址(末尾带/v1)。官方 README:"你需要在各种用到 OpenAI API 的地方设置 API Base 为你的 One API 的部署地址……API Key 则为你在 One API 中生成的令牌"。预期输出参考: 用 OpenAI SDK 发起一次 chat completion 请求,One API 后台「日志」页能看到这条请求记录,令牌额度相应扣减。
6. 官方 README 还说明可以在令牌后加渠道 ID 指定走某个渠道:Authorization: Bearer ONE_API_KEY-CHANNEL_ID,"需要是管理员用户创建的令牌才能指定渠道 ID"。
登录与安全(重要)
- 官方默认账号密码: 用户名
root,密码123456。官方 README 顶部 WARNING 原文:"使用 root 用户初次登录系统后,务必修改默认密码123456!" - 登录地址:
http://服务器IP:3000/。 - 首次登录修改密码: 登录后进入右上角个人设置("个人设置"页面)修改密码。
- 密码重置: 官方 README 注明支持"通过邮箱进行密码重置"(需在系统设置中配置好 SMTP)。管理员也可在后台「用户」管理中重置其他用户密码。
- 密码配置存放位置: 密码以哈希形式存于数据库——SQLite 方式为
/data/one-api.db(即宿主/home/ubuntu/data/one-api/one-api.db);MySQL 方式为SQL_DSN指定的库。SESSION_SECRET环境变量用于签名会话 cookie,不属于密码。 - 安全提醒:部署完成后必须立即登录并把
123456改成强密码;公网部署建议按官方 Nginx + certbot 配置 HTTPS;高并发务必设置SQL_DSN切到 MySQL,避免 SQLite 成为瓶颈。
九、故障排查
案例 1:启动失败,需加 --privileged=true
- 报错原文(官方 README 引用 issue #482):容器启动即退出,日志中常见权限类错误(如无法挂载 /data 或访问设备失败)。
- 报错原因:官方 README 原文:"如果启动失败,请添加
--privileged=true,具体参考 https://github.com/songquanpeng/one-api/issues/482"。 - 分步解决:①
docker rm -f one-api删除失败容器;② 在原docker run命令中追加--privileged=true后重新执行;③docker ps确认 Up。
案例 2:渠道测试报错 invalid character '<' looking for beginning of value
- 报错原文(官方 README「常见问题」第 4 条):
invalid character '<' looking for beginning of value
- 报错原因:官方 README 原文——"这是因为返回值不是合法的 JSON,而是一个 HTML 页面。大概率是你的部署站的 IP 或代理的节点被 CloudFlare 封禁了"。
- 分步解决:① 检查渠道配置的代理 / 镜像地址是否返回 HTML 拦截页;② 更换出口 IP 或代理节点;③ 在 One API 中重新点「测试」按钮验证。
案例 3:ChatGPT Next Web 前端报错 Failed to fetch
- 报错原文(官方 README「常见问题」第 5 条):
Failed to fetch
- 报错原因:官方 README 原文——"部署的时候不要设置
BASE_URL。检查你的接口地址和 API Key 有没有填对。检查是否启用了 HTTPS,浏览器会拦截 HTTPS 域名下的 HTTP 请求"。 - 分步解决:① 启动 chatgpt-next-web 容器时去掉
BASE_URL环境变量;② 在 Next Web 页面的设置里把接口地址填成 One API 地址(如https://openai.justsong.cn),API Key 填 One API 令牌;③ 用 HTTPS 暴露 One API(按官方 Nginx + certbot 配置)。
案例 4:当前分组负载已饱和,请稍后再试
- 报错原文(官方 README「常见问题」第 6 条):
当前分组负载已饱和,请稍后再试
- 报错原因:官方 README 原文——"上游渠道 429 了"。
- 分步解决:① 到「渠道」页查看对应渠道的状态与余额;② 给同一分组增加备用渠道做负载均衡;③ 调低客户端并发或等待上游限流恢复。
案例 5:升级后数据丢失(SQLite 未挂载卷)
- 报错原因:官方 README「常见问题」第 7 条——"如果使用 SQLite,需要按照我所给的部署命令挂载 volume 持久化 one-api.db 数据库文件,否则容器重启后数据会丢失"。
- 分步解决:① 确认
docker run命令中包含-v /home/ubuntu/data/one-api:/data;② 若之前漏挂载,立即docker cp one-api:/data/one-api.db ./one-api.db把数据拷出;③ 用带卷挂载的命令重建容器。
十、升级、回滚与卸载
升级(官方 README 原文命令):
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR
逐段解释:这是 Watchtower 官方镜像,挂载 Docker socket 后会自动检查并拉取所有正在运行容器的新镜像,
-cR即 monitor all / restart running。官方 README 同时注明(常见问题第 8 条):"一般情况下不需要"手动改数据库 schema,"系统将在初始化的时候自动调整";如需手动变更会在更新日志中说明。
手动升级: 也可 docker pull justsong/one-api 拉新镜像后 docker stop one-api && docker rm one-api,再按原 docker run 命令(相同 -v 挂载)重新运行。
回滚: 官方未提供一键回滚命令;可将镜像标签改为旧版本(如 justsong/one-api:旧版本号)后重新 docker run。官方 README「常见问题」第 7 条注明:使用 MySQL 时升级不丢数据;使用 SQLite 时数据在 /data 卷中保留,旧版本可读取。
卸载: docker stop one-api && docker rm one-api 删除容器。如需彻底清理数据:删除宿主数据目录 /home/ubuntu/data/one-api(此操作永久删除 one-api.db 与日志,先备份)。镜像可 docker rmi justsong/one-api。
十一、商用许可合规说明
- 许可证:MIT License(仓库 LICENSE 文件:
MIT License, Copyright (c) 2023 JustSong)。 - MIT 协议允许自由使用、修改、分发与商用(包括闭源商业产品),但必须保留原始版权声明与许可文本。
- 额外署名要求(官方 README「注意」一节原文): "本项目使用 MIT 协议进行开源,在此基础上,必须在页面底部保留署名以及指向本项目的链接。如果不想保留署名,必须首先获得授权。同样适用于基于本项目的二开项目。"——即商用部署时,页面底部需保留 One API 署名与回链;如需去除需联系作者授权。
- 官方 README 同时提示合规风险:"使用者必须在遵循 OpenAI 的使用条款以及法律法规的情况下使用,不得用于非法用途",并提醒"根据《生成式人工智能服务管理暂行办法》的要求,请勿对中国地区公众提供一切未经备案的生成式人工智能服务"。