静看光阴荏苒
不管不顾不问不说也不念

Debian13部署DeepSeek Harness用于远程开发

记录下DeepSeek Harness安装、反向代理、接入ChatGPT订阅、MCP配置等。

机器配置:OVH-KS-LE-B
操作系统:OVH官方Debian 13模板,无桌面环境
登录方式:SSH密钥
默认用户:debian

这个系统模板不允许SSH密码登录,也不允许用root账号登录SSH,用默认的debian用户登录上去后,创建自己喜欢的新用户:

sudo adduser imlala

按提示设置密码,姓名等信息可以直接回车跳过,系统会自动创建。之后赋予sudo权限:

sudo usermod -aG sudo imlala

复用同一把私钥,就不需要重新生成密钥了:

sudo install -d -m 700 -o imlala -g imlala /home/imlala/.ssh
sudo install -m 600 -o imlala -g imlala \
  /home/debian/.ssh/authorized_keys \
  /home/imlala/.ssh/authorized_keys

建议退出终端重新使用新的用户登录,而不是使用su等命令切换,主要是验证一下你的SSH密钥是否配置正确。登录成功后,旧的这个debian用户如不需要可以删掉。

安装xdg-user-dirs:

sudo apt install xdg-user-dirs

执行如下命令进行设置,如果你的系统是带桌面环境的(KDE、GNOME等),一般情况下可以省略这些步骤:

mkdir -p "$HOME/Documents"
xdg-user-dirs-update --set DOCUMENTS "$HOME/Documents"
xdg-user-dir DOCUMENTS

这个是为了解决DeepSeek Harness在首次启动时无法创建默认工作区的问题。服务器系统普遍过于精简且不带桌面环境,会缺少这个包和相关设置。

安装mise开发环境与多语言版本管理工具:

sudo apt install -y extrepo
sudo extrepo enable mise
sudo apt update
sudo apt install -y mise

激活mise:

echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

使用mise安装Node.js和pnpm:

mise use -g --pin node@24 pnpm@10

-g:全局安装,--pin:固定精确版本,这里额外装一个pnpm包管理器是因为DeepSeek Harness内部安装插件需要用到。经常搞前端开发的肯定也知道pnpm本身就是另一个包管理器,如果你想直接用pnpm安装DeepSeek Harness也是可以的,只是后续编写systemd配置文件的时候会麻烦一点,你可能需要配置它自己的全局命令目录和PATH,而用Node.js自带的npm的话就没这些问题。

所以这里我还是图简单就用npm安装DeepSeek Harness:

npm install -g @deepseek-ai/dsh@0.2.1-rc.2

接下来为DeepSeek Harness创建systemd用户服务,注意这里是用户服务,创建用户服务需要使用这个目录:

~/.config/systemd/user

新建的用户默认不一定有这个目录,如果没有得先创建:

mkdir -p ~/.config/systemd/user

创建DeepSeek Harness的systemd用户服务配置文件:

nano ~/.config/systemd/user/dsh.service

写入如下内容:

[Unit]
Description=DSH Web

[Service]
Type=simple
WorkingDirectory=%h
ExecStart=/usr/bin/mise exec -- dsh web --no-open --host 127.0.0.1 --port 3080 --public-url https://dsh.example.com/ --trusted-host dsh.example.com
Restart=on-failure
RestartSec=5
TimeoutStopSec=30

[Install]
WantedBy=default.target

注意修改域名:

--public-url #设置外部访问地址。
--trusted-host #允许该域名通过DSH的Host校验。

启动并设置开机自启:

systemctl --user enable --now dsh

systemd用户服务在你退出登录后(终端、桌面等)会自动停止,执行下面的命令启用用户服务在退出登录后继续运行的能力:

sudo loginctl enable-linger imlala

接下来配置反向代理,安装NGINX、Certbot、htpasswd:

sudo apt install -y nginx python3-certbot-nginx apache2-utils

DeepSeek Harness的Web UI自带令牌验证,如果不放心可以再加一个basic auth,设置账号密码:

sudo htpasswd -cB /etc/nginx/dsh.htpasswd admin
sudo chown root:www-data /etc/nginx/dsh.htpasswd
sudo chmod 640 /etc/nginx/dsh.htpasswd

新建NGINX站点配置文件:

sudo nano /etc/nginx/sites-available/dsh

写入如下内容:

map $http_upgrade $dsh_connection_upgrade {
    default upgrade;
    ''      close;
}

# 不记录查询参数,避免启动链接中的token写入访问日志
log_format dsh_no_query
    '$remote_addr - $remote_user [$time_local] '
    '"$request_method $uri $server_protocol" $status $body_bytes_sent';

server {
    listen 80;
    listen [::]:80;
    server_name dsh.example.com;

    access_log /var/log/nginx/dsh.access.log dsh_no_query;
    error_log  /var/log/nginx/dsh.error.log;

    client_max_body_size 0;

    auth_basic "DSH";
    auth_basic_user_file /etc/nginx/dsh.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:3080;
        proxy_http_version 1.1;

        # 保留浏览器访问的域名和端口
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $dsh_connection_upgrade;

        # Basic 认证由 Nginx 完成,不把该密码头传给 DSH
        proxy_set_header Authorization "";

        # HTTPS 在 Nginx 终止,为后端 Cookie 添加 Secure
        proxy_cookie_flags ~ secure;

        # 支持流式响应和长连接
        proxy_buffering off;
        proxy_cache off;
        proxy_connect_timeout 10s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

启用站点:

sudo ln -s /etc/nginx/sites-available/dsh /etc/nginx/sites-enabled/dsh

检查配置、签发证书:

sudo nginx -t
sudo certbot --nginx

查看DeepSeek Harness的Web UI访问链接:

sudo journalctl _SYSTEMD_USER_UNIT=dsh.service -f

给DeepSeek Harness接入浏览器自动化工具,这里我采用Playwright MCP + 无头Chromium的方式。无头浏览器在服务器后台运行,可以打开网页、点击、填写表单和截图等操作,无需安装桌面,只是服务器系统没有桌面普遍会缺少中文字体,安装一个中文字体可以避免网页截图中文字显示成方块。

安装Chromium和中文字体:

sudo apt update
sudo apt install -y chromium chromium-sandbox fonts-noto-cjk

添加MCP配置:

nano ~/.dsh/profiles/web/cordis.patch.yml

把下面内容作为一个新的列表项追加进去,保留原有配置。如果文件只有[],则用下面内容替换:

- insert:
    - id: mcp-playwright
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: playwright
        transport: stdio
        command: npx
        args:
          - '-y'
          - '@playwright/mcp@latest'
          - '--headless'
          - '--executable-path'
          - '/usr/bin/chromium'
        toolCallTimeoutMs: 120000
        failOnStartupError: false

把ChatGPT / Codex订阅直接接入DeepSeek Harness,我推荐用这个dsh-codex-subscription插件:

dsh plugin --profile web add dsh-codex-subscription@3.1.2

DeepSeek Harness有热更新能力,安装完成后无需重启,打开Web UI找到设置-Codex订阅-添加账号-设备代码登录。不要使用浏览器登录,这个在我们当前的环境是无法登录成功的,我们是部署在服务器上供远程访问使用,这里的浏览器登录是使用xdg-open打开本地浏览器,也就是服务器上的浏览器。

用ChatGPT Plus订阅,建议把这个subagent(子智能体)的功能给关了,不然你5小时的额度跑个稍微大一点的任务,20分钟就能给你干光:

注意不是上面的Codex子智能体,是子智能体,在里面按图设置:

DeepSeek Harness位于反向代理之后可能会遇到这个问题:#7206

安装下面的插件可解决,如该插件不兼容最新版可以在网上搜索一下,有很多同类替代品:

dsh plugin --profile web add @exagone313/dsh-trusted-host-is-loopback@1.0.0
systemctl --user restart dsh

更新大骚货:

npm install -g @deepseek-ai/dsh@目标版本号

不想用大骚货了?卸载并删除所有相关数据:

systemctl --user disable --now dsh.service
npm uninstall -g @deepseek-ai/dsh
rm -rf -- "$HOME/.dsh"
rm ~/.config/systemd/user/dsh.service
systemctl --user daemon-reload

补充记录一点内容,之前查看用户systemd服务日志的命令是:

sudo journalctl _SYSTEMD_USER_UNIT=dsh.service -f

这其实是不太合理的,按道理来说应该使用这个命令看,因为这是用户自己的服务:

journalctl --user -u dsh.service

用户自己的服务日志还需要用sudo去提权才能看这不是倒反天罡了,我这个系统当时是有点问题,用上面的命令报错:

Hint: You are currently not seeing messages from the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
No journal files were opened due to insufficient permissions.

和AI周旋了一下解决了,根本原因是系统把所有journal日志都存内存里面了,上面这个提示具有迷惑性,看似是权限问题。先用这个命令检查现有配置:

systemd-analyze cat-config systemd/journald.conf

如下:

# /etc/systemd/journald.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/journald.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=0
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#MaxLevelSocket=debug
#LineMax=48K
#ReadKMsg=yes
#Audit=yes

# /usr/lib/systemd/journald.conf.d/syslog.conf
# Undo upstream commit 46b131574fdd7d77 for now. For details see
#  http://lists.freedesktop.org/archives/systemd-devel/2014-November/025550.html

[Journal]
ForwardToSyslog=yes

说明:

Storage=auto:存在/var/log/journal就持久化,否则只存内存。
SplitMode=uid:已经默认按用户拆分,无需另外开启。
ForwardToSyslog=yes:只是转发日志,与这个读取权限问题无关。

确认这个目录是否存在:/var/log/journal

ls -ld /var/log/journal /run/log/journal

/var/log/journal不存在这就解释得通了,内存日志不支持按用户拆分:

创建目录并切换到持久化即可:

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo journalctl --flush

现在就可以不加sudo用journalctl命令查看用户自己的systemd服务日志了。

还有刚才的ForwardToSyslog=yes这个设置,意思是向syslog接口转发日志,但系统根本没有安装rsyslog软件包,也就是说系统重启后:启动日志、内核日志、服务日志都会消失。而现在已启用持久化,systemd收集到的启动日志、内核日志、服务日志,都可以用journalctl查看,保存下来的记录也能跨重启查询。

内核、systemd服务等日志
          ↓
       journald
          ├─ 内存日志:/run/log/journal → 重启丢失
          │
          └─ syslog 接口 → rsyslog
                              ↓
                    /var/log/syslog 等磁盘文件
                              ↓
                         重启后仍保留

它但凡给装个rsyslog也不会这么离谱。所以说这就是为什么在用VPS或者独立服务器的时候,能挂载iso安装就用iso安装,不能用iso就自己用preseed重装,商家的系统模板质量真的参差不齐。。。

赞(1)
未经允许不得转载:荒岛 » Debian13部署DeepSeek Harness用于远程开发
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿