一、前言

最近折腾 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-deepseekbaseURL 指向本机 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 installnode-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 官方 全链路已打通。

十、总结

整套部署的核心思路其实很清晰:

  1. deepseek2api 负责「把网页版账号变成 OpenAI 接口」
  2. Harness 负责「提供一个好用的 Web 界面」
  3. Nginx 负责「反代 + 认证 + 公网入口」

难点全在细节:Node 版本、Git 版本、绑定的 host、浏览器的安全上下文。把这些坑填平,剩下的就是体力活。

最后再强调一遍:逆向 API 仅限自用学习,别商用,别对外提供服务,封号了别怪我没提醒。

如果这篇对你有帮助,欢迎点赞收藏,有问题评论区交流。

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐