从零部署 DeepSeek2API + DeepSeek Harness:用网页版账号搭建自己的 OpenAI 兼容接口(附全套踩坑)
一、前言
最近折腾 DeepSeek 的时候发现一个有意思的组合:deepseek2api 能把 DeepSeek 网页版账号「逆向」成一个 OpenAI 兼容的 API 接口,而 DeepSeek 官方开源的 deepseek-harness 又提供了一个带 Web UI 的 agent 框架。把这两者串起来,就能用网页版账号白嫖一个带图形界面的 DeepSeek 全家桶。
这篇文章记录我从零开始,在一台全新 Ubuntu 服务器上完成部署的全过程,包括所有命令、配置文件,以及我踩过的每一个坑。
⚠️ 重要提示:deepseek2api 是逆向项目,官方明确「仅限自用、禁止商用」,且有封号风险。本文仅供学习研究,切勿用于生产或对外提供服务。
二、最终效果
部署完成后,浏览器访问 http://<你的服务器IP>,输入一个 Basic Auth 密码,就能进入 DeepSeek Harness 的 Web 界面,选择模型后直接对话,跟 ChatGPT 网页版体验类似,但背后走的是你自己搭的接口。
三、串联原理
先理清楚两个项目分别干什么:
| 项目 | 作用 |
|---|---|
| deepseek2api | 把 DeepSeek 网页版账号逆向成 OpenAI 兼容 API,暴露 /v1/chat/completions |
| deepseek-harness | DeepSeek 官方开源的 agent 框架,一切皆插件,提供 Web UI |
它们的关系是这样的:
Harness Web UI → 127.0.0.1:5001/v1 (OpenAI 兼容) → deepseek2api → DeepSeek 网页版
也就是说,Harness 并不直连 DeepSeek 官方,而是把请求转发给本机的 deepseek2api,deepseek2api 再拿着你的网页版账号去官方换结果。
四、部署架构
公网浏览器
│ http://<你的服务器IP>:80
▼
Nginx (0.0.0.0:80) ← Basic Auth 保护
▼
deepseek-harness ← 仅监听 127.0.0.1:3080
▼ http://127.0.0.1:5001/v1
deepseek2api ← 仅监听 127.0.0.1:5001
▼
DeepSeek 官方网页版
端口规划很关键:
| 端口 | 服务 | 是否对外 |
|---|---|---|
| 80 | Nginx | 对外(Basic Auth) |
| 3080 | Harness Web UI | 不对外 |
| 5001 | deepseek2api | 不对外 |
5001 端口千万不能对外,否则等于把账号和 API 裸奔到公网。
五、环境准备
服务器:Ubuntu 20.04(22.04 同理),安全组放行 80 端口。
需要准备几个依赖,这里有第一个坑:
5.1 安装 Node.js 22
Ubuntu 20.04 自带的 Node 是 v20,不够,Harness 需要 v22。手动装:
cd /usr/local
wget https://nodejs.org/dist/v22.19.0/node-v22.19.0-linux-x64.tar.xz
tar -xf node-v22.19.0-linux-x64.tar.xz
mv node-v22.19.0-linux-x64 node
ln -sf /usr/local/node/bin/node /usr/local/bin/node
ln -sf /usr/local/node/bin/npm /usr/local/bin/npm
ln -sf /usr/local/node/bin/npx /usr/local/bin/npx
node -v
5.2 安装 pnpm
npm i -g pnpm@11.7.0
5.3 Git 版本坑(重点)
Ubuntu 20.04 自带 Git 2.25.1,而 Harness 依赖的 lefthook 要求 Git ≥ 2.26。两种解法:
# 方案一:升级 Git
add-apt-repository ppa:git-core/ppa -y
apt update && apt install git -y
方案二(不升级)在下面部署 Harness 时讲。
六、部署 deepseek2api
6.1 拉代码装依赖
cd /opt
git clone https://github.com/iidamie/deepseek2api.git
cd deepseek2api
pip install -r requirements.txt
6.2 配置账号
编辑 config.json:
{
"keys": ["<你的API Key>"],
"accounts": [
{ "mobile": "<你的手机号>", "password": "<你的密码>", "token": "" }
]
}
keys是对外 API key,自己起个随机串就行accounts支持多个账号轮换,缓解限流
6.3 注册 systemd 服务
vi /etc/systemd/system/deepseek2api.service
[Unit]
Description=DeepSeek2API Service
After=network.target
[Service]
WorkingDirectory=/opt/deepseek2api
ExecStart=/usr/local/bin/uvicorn app:app --host 127.0.0.1 --port 5001
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
启动并验证:
systemctl daemon-reload
systemctl enable --now deepseek2api
curl http://127.0.0.1:5001/v1/models
七、部署 deepseek-harness
7.1 拉代码
cd /opt
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
7.2 安装依赖 + lefthook 绕过
pnpm install
如果 Git 版本低于 2.26,这里会在 lefthook 安装阶段报错退出。绕过方法:设 CI=true 跳过 postinstall 里的 lefthook 校验:
CI=true pnpm install
另一个隐藏坑:
node-pty是原生模块,编译时需要下载 Node 头文件,默认会连nodejs.org超时导致失败。解决办法是指定国内镜像:export NPM_CONFIG_NODE_MIRROR=https://npmmirror.com/mirrors/node CI=true pnpm install
然后构建:
pnpm run build
构建完成后,产物在 apps/web/dist。
7.3 配置自定义 provider
这是串联的核心。创建 cordis.patch.yml:
mkdir -p /root/.dsh/profiles/web
vi /root/.dsh/profiles/web/cordis.patch.yml
- id: agent-default-model
config:
provider: deepseek-official
model: deepseek-chat
id: llm-deepseek
config:
apiKeyEnv: DEEPSEEK_API_KEY
baseURL: http://127.0.0.1:5001/v1
models:
- id: deepseek-chat
name: DeepSeek-Chat
- id: deepseek-reasoner
name: DeepSeek-Reasoner
要点:
agent-default-model把默认模型指向deepseek-official这个 provider(它内部由llm-deepseek插件承载)。llm-deepseek的baseURL指向本机 deepseek2api 的 OpenAI 兼容端点/v1。apiKeyEnv: DEEPSEEK_API_KEY是凭据引用,真实值通过 systemd 环境变量注入,不落盘明文。
注意:早期教程常用
llm-pi-ai自定义 provider,但本项目实测用内置的llm-deepseek插件更省事,直接把它的baseURL指向 deepseek2api 即可完成串联。
7.4 注册 systemd 服务
vi /etc/systemd/system/dsh-web.service
[Unit]
Description=DeepSeek Harness Web UI
After=network.target deepseek2api.service
[Service]
WorkingDirectory=/opt/deepseek-harness
Environment=DSH_HOME=/root/.dsh
Environment=DEEPSEEK_API_KEY=<你的API Key>
ExecStart=/usr/bin/node /opt/deepseek-harness/apps/cli/lib/bin.js web --host 127.0.0.1 --port 3080 --trusted-host <你的服务器IP>
Restart=on-failure
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
这里有个大坑:dsh web 官方强制只能绑 127.0.0.1,你一旦写 --host 0.0.0.0 它直接拒绝。原因是 Harness 是个能执行命令的 agent 框架,绑公网有 RCE 风险。公网访问只能靠 Nginx 反代。
八、Nginx 反代 + Basic Auth
apt install -y nginx apache2-utils
htpasswd -c /etc/nginx/.htpasswd admin
配置反代:
vi /etc/nginx/sites-available/dsh-web
server {
listen 80;
server_name <你的服务器IP>;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://127.0.0.1:3080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
}
}
启用:
ln -s /etc/nginx/sites-available/dsh-web /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
最后到云控制台放行安全组 80 端口,大功告成。
九、踩坑记录(精华)
我把整个过程中最坑的几个点单独拎出来:
坑 1:Node 版本不足
Ubuntu 20.04 自带 Node v20,Harness 编译会报错。手动装 v22 解决。
坑 2:Git 版本低于 lefthook 要求
Git 2.25.1 < 2.26,pnpm install 卡在 lefthook。要么升 Git,要么直接 CI=true pnpm install 跳过 postinstall 校验。
坑 2.5:node-pty 原生模块编译超时
pnpm install 到 node-pty 时,默认会连 nodejs.org 下载 Node 头文件,国内经常超时。设镜像解决:
export NPM_CONFIG_NODE_MIRROR=https://npmmirror.com/mirrors/node
坑 3:dsh web 拒绝绑 0.0.0.0
官方为防 RCE 强制只绑本机。想公网访问必须 Nginx 反代 + Basic Auth。
坑 4:浏览器报 crypto.randomUUID is not a function
通过公网 IP 的 HTTP 访问时,浏览器不提供 Web Crypto API,导致无法添加工作区。因为 crypto.randomUUID 只在 HTTPS 或 localhost 下可用。
解决:在 apps/web/dist/index.html 注入一段 polyfill:
<script>if(globalThis.crypto&&typeof globalThis.crypto.randomUUID!=='function'){globalThis.crypto.randomUUID=function(){return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c==='x'?r:(r&0x3|0x8);return v.toString(16);});};}</script>
注意这里我用的是单引号——如果你通过某些远程执行工具传命令,双引号很容易被转义或剥离,导致脚本语法错误、白修一场。
注入后重启服务,浏览器强刷(Ctrl+F5)即可。
最优雅的方案其实是给域名上 HTTPS(Let's Encrypt),让浏览器天然处于安全上下文,连 polyfill 都省了。
坑 5:5001 别开公网
deepseek2api 一旦 --host 0.0.0.0,你的 DeepSeek 账号和 API key 就裸奔了,务必只绑本机。
坑 6:账号被官方静音(mute)
部署完发现接口明明返回 200,但对话总是报 {"biz_code":5,"biz_msg":"user is muted"}。这是 DeepSeek 官方对你的网页版账号做了静音限制(登录、会话、PoW、补全请求都正常,只有业务层拒绝),通常会给出解封时间 mute_until。
- 现象:
/v1/chat/completions返回 200,但 body 里是biz_code: 5。 - 排查:抓 deepseek2api 的日志,看底层对 DeepSeek 官方接口的原始响应。
- 处理:等解封时间到(或换一个账号)。这类账号级限制无法通过改代码绕过,属于官方风控。
坑 7:如何验证「串联」真的通了
光看服务都起来了不算数,得让 Harness 真正发一次请求、拿到回复才算通。可以临时用 headless 模式跑一次性对话验证(不依赖浏览器):
cd /opt/deepseek-harness
mkdir -p /root/.dsh/profiles/headless
# package.json 里 bundles 写 ["@deepseek-ai/dsh-base","@deepseek-ai/dsh-headless"]
# cordis.patch.yml 里写和 web 一模一样的 agent-default-model + llm-deepseek 配置
DSH_HOME=/root/.dsh DEEPSEEK_API_KEY=<你的API Key> \
node apps/cli/lib/bin.js --profile headless "请只回复一句:串联成功"
如果 stdout 打印出模型回复、退出码为 0,说明 headless → llm-deepseek → deepseek2api → DeepSeek 官方 全链路已打通。
十、总结
整套部署的核心思路其实很清晰:
- deepseek2api 负责「把网页版账号变成 OpenAI 接口」
- Harness 负责「提供一个好用的 Web 界面」
- Nginx 负责「反代 + 认证 + 公网入口」
难点全在细节:Node 版本、Git 版本、绑定的 host、浏览器的安全上下文。把这些坑填平,剩下的就是体力活。
最后再强调一遍:逆向 API 仅限自用学习,别商用,别对外提供服务,封号了别怪我没提醒。
如果这篇对你有帮助,欢迎点赞收藏,有问题评论区交流。
更多推荐




所有评论(0)