这是什么
DeepSeek Harness AI 控制台(DSH)是我自己搭的一个 AI 自动化控制台。它跑在 .223 这台机器上,通过隧道对外提供 dsh 域名入口,平时我打开这个域名就能用。
为什么做
以前做 AI 相关的自动化,能力都散在一堆脚本和临时命令里:跑在哪个目录、用哪个环境变量、有没有在跑,全靠记忆。我想要一个固定的入口,把调用、插件和常驻任务收拢到一处,于是就有了 DSH。
解决什么问题
- 统一入口:一个 dsh 域名进控制台,不用再记端口、路径和零散脚本。
- 插件化扩展:新能力以插件形式接进来,不用改进程主体,加完重启就生效。
- 常驻可用:和 .223 上其它服务一样用 systemd 托管,配合隧道进程,机器重启后能自己起来。
- 和 Homelab 一致:部署方式沿用这台机器已有的习惯(服务化 + 隧道),维护成本低。
现在什么状态
状态:运行中,已经作为日常入口在用,后续继续按需补插件和自动化任务。这个项目主要是练 DSH 部署、插件机制、隧道和服务化这几件事。
功能
- 对公网提供 dsh 域名入口的 AI 自动化控制台
- 跑在 .223 上,控制台与隧道进程分离部署
- 用 systemd 托管常驻,机器重启后自动恢复
- 插件化接入新能力,不改动进程主体
- 与同机其它 Homelab 服务共用一套服务化与隧道习惯
技术栈
Node.jsDSHsystemd隧道转发Linux
使用 / 部署教程
部署思路
DSH 的形态很朴素:一个常驻进程 + 一条隧道。进程负责控制台和插件,隧道负责把内网端口映射到公网域名。下面是我在 .223 上用的通用步骤。
1. 准备运行环境
确认机器上有 Node.js 和常用构建工具,建一个独立的运行用户和目录,不要用 root 直接跑业务:
sudo useradd -r -s /usr/sbin/nologin dsh
sudo mkdir -p /opt/dsh && sudo chown dsh:dsh /opt/dsh
2. 放置代码与依赖
把 DSH 放到 /opt/dsh,安装依赖。配置(密钥、端口、插件开关)统一走环境变量或 .env,文件和目录权限收紧到运行用户。
3. 用 systemd 托管
在这台机器上,所有常驻服务都是 systemd unit,DSH 也照这个来。新建 dsh.service,关键点:User=dsh、WorkingDirectory=/opt/dsh、Restart=always、EnvironmentFile= 指向配置文件。写好后:
sudo systemctl daemon-reload
sudo systemctl enable --now dsh
sudo systemctl status dsh
journalctl -u dsh -f
4. 打通隧道
dsh 域名入口由隧道提供。参照同机已有的 *-tunnel.service 写法,单独做一个隧道 unit,把本地控制台端口映射到 dsh 域名,同样 enable --now,并设为开机自启。隧道和控制台分开成两个 unit,任一挂掉互不牵连。
5. 验证
- 本机
curl 127.0.0.1:<端口>能通; - 外网访问 dsh 域名能打开控制台;
- 重启机器后,
systemctl status dsh和隧道 unit 都自动恢复; - 装一个插件,重启进程,确认加载生效。
注意事项
- 控制台对公网开放,前面一定要有认证或访问白名单,别裸奔。
- 密钥只放环境变量文件,不进 Git、不进日志。
- .223 上还跑着其它服务和备份 timer,改 unit 前先确认不影响别人。
注意
- 控制台经隧道对公网开放,务必加认证或 IP 白名单,避免暴露管理面。
- API key 等敏感配置只用环境变量或权限收紧的配置文件,不要提交到仓库或打印到日志。
- .223 上同时运行着其它 systemd 服务和备份 timer,改动 unit 或重启机器时注意别打断它们。