dsh-cloudflared-manager:在 DSH 里管理 Cloudflare 隧道与本地服务

前言

在 DeepSeek Harness(DSH)里跑本地 Web 服务、调试智能体回调时,常见做法是单独开终端维护 cloudflared、手写 ingress 与 DNS,再用另一套脚本启停进程、翻日志。命令分散、凭据文件权限容易疏忽,排查 502 或 DNS 半同步状态时也更费时间。下面介绍社区插件 dsh-cloudflared-manager:把 Named 隧道、本地进程和 trycloudflare 快速暴露收进 DSH 右侧面板,并暴露统一的 HTTP API,便于在已有 DSH 工作流里衔接。

这是什么

dsh-cloudflared-manager 由维护者 96bearli 发布,在 SkillHub 插件目录 中归类为工作流。它是 DeepSeek Harness 的 npm 插件(当前资料中的版本为 1.10.1,许可证 MIT),定位是 Cloudflare Tunnel + 本地服务管理器:固定域名 Named 隧道的 ingress 增删改查与 DNS 同步、本地服务的启停/日志/源码编辑,以及无需 Cloudflare 账号的临时公网隧道。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。安装前建议自行查看 GitHub 源码与许可证,并记住插件以当前 DSH 进程的用户与权限运行,会读写 API Token、隧道凭证与进程。

核心功能

Named 隧道(固定域名)

  • 在面板里对 ingress 做增删改查(hostname → 本地端口),写入 Cloudflare 并重载隧道配置。
  • 配置 API Token 后,可自动创建/删除 DNS CNAME;支持多个根域名,按 hostname 后缀匹配 zone(无需手工填 Zone ID;资料说明 zoneId 字段已废弃)。
  • 一键启停 Named 隧道,可设为 DSH 启动时自动拉起。

新增/删除映射分两步(先 tunnel ingress,再 DNS),非原子操作;若 Token 缺 DNS 权限,可能出现「隧道里已有映射但域名未解析」或「DNS 残留 CNAME」——面板会明确报错,需在 Cloudflare 控制台核对。

本地服务管理

  • 用 services.json 定义服务:名称、端口、启动命令、工作目录、备注、autoStart 等。
  • 面板内启动、停止、重启、tail 日志;支持在线查看/编辑启动脚本,保存后重启生效。
  • 探活:PID 文件、端口探测、进程命令行匹配;支持无端口服务;停止时清理子进程。
  • 点服务名可查看一行备注说明用途。

快速隧道(trycloudflare)

  • 无需 Cloudflare 账号,可将本地端口暴露到临时公网 URL。
  • 可选配置 URL 改写代理前缀:当直连 trycloudflare.com 不可达时,面板可额外给出代理地址(默认关闭)。

HTTP API

插件在 DSH Web 进程上提供 POST /dsh-cf/api,请求体为 {"method": "...", "args": {...}},覆盖状态、Named 隧道、本地服务、源码、配置、根域名白名单、快速隧道等方法(详见仓库 README 方法表)。

安装与启用

从 npm 安装(README 推荐):

dsh plugin --profile web add dsh-cloudflared-manager

装完重启 DSH。若 dsh plugin 报 declares no dsh.bundle,说明版本低于 1.2.0,需升级后再试。

从 GitHub 安装:

dsh plugin --profile web add github:96bearli/dsh-cloudflared-manager

从本地路径安装(README 示例,需自行 clone 到本机后替换路径):

dsh plugin --profile web add /path/to/dsh-plugin-cloudflared-manager

安装并重启后,会话头部会出现「隧道」入口,面板停靠在右侧边栏,含「域名映射」「本地服务」「快速隧道」等页签。也可在 DSH 设置 → Cloudflared 隧道页签填写 API Token、Account ID、Tunnel ID 与根域名白名单。

运行目录默认为 $DSH_HOME/cloudflared-setup/,可用环境变量 DSH_CF_SETUP 覆盖。cf_config.json、credentials.json 含密钥,应设为 600,不要提交到 git。credentials.json 可在首次启动时由插件根据 API 自动生成。

典型用法

1. 定义本地服务

编辑运行目录下的 services.json(或在面板中维护),例如:

[
  {
    "name": "我的 Web 应用",
    "port": 8080,
    "command": "/usr/bin/node /opt/app/server.js",
    "cwd": "/opt/app",
    "autoStart": true,
    "note": "主站,对外 example.com"
  }
]

命令建议写绝对路径;新增时若命令里包含脚本路径,「源码」按钮才便于定位文件。

2. 配置 Cloudflare 凭据

API Token 需包含 Zone DNS Edit、Zone Read、Account Cloudflare Tunnel Edit(生成 credentials.json 时还需 Tunnel Read)。Account ID、Tunnel ID 在控制台对应位置获取;根域名白名单填根域(如 example.com),不要填子域。面板可对白名单逐项「校验可用性」。

若公网访问延迟抖动或超时,可先查 sysctl net.core.rmem_max;偏小可在 cf_config.json 中改用 TCP:

{ "protocol": "http2" }

3. 面板与 API

头部进入隧道面板:管理 ingress 与 DNS、启停本地服务、开快速隧道。需要脚本集成时,例如查询综合状态:

curl -s -X POST http://127.0.0.1:3080/dsh-cf/api \
  -H 'Content-Type: application/json' \
  -d '{"method":"cf-status"}'

停止指定服务时参数放在 args 里:

curl -s -X POST http://127.0.0.1:3080/dsh-cf/api \
  -H 'Content-Type: application/json' \
  -d '{"method":"cf-svc-stop","args":{"name":"我的 Web 应用"}}'

实际端口以本机 DSH Web 监听为准,上例中的 3080 仅为 README 示例。

适用场景与注意

适合谁: 已在 Linux 容器或同类环境中跑 DSH,需要用 Cloudflare Tunnel 把本机服务暴露到固定域名或临时 URL,并希望在同一界面管理进程与隧道,而不是维护多套 shell 脚本。

环境限制(资料原文): 当前版本仅支持 Linux x64,并按 Docker 容器环境调优;cloudflared 二进制路径固定为 @farthershore/cloudflared-linux-x64。未做 macOS / Windows / ARM 分支,在其他平台安装可能拿不到可用二进制。日志与 PID 写在运行目录下的 logs/、pids/,适配容器内 /tmp 为 tmpfs 的场景。

localhost 与 502: 插件会把 ingress 里的 http://localhost:PORT 改写成 http://127.0.0.1:PORT,避免 cloudflared 优先连 [::1] 而本地服务只监听 IPv4 导致 502。确需 IPv6 时可手填 http://[::1]:PORT。

安全与信任: 插件会调用 Cloudflare API、启动子进程、读写敏感配置;安装前请阅读 GitHub 仓库 源码。本仓库 README 注明为精简版,不含 CF 优选 IP 等扩展能力。

结尾

经过上面的步骤,可以把 Named 隧道、DNS 同步、本地服务生命周期和 trycloudflare 快速暴露收敛到 DSH 侧边栏,减少重复记命令与手工改 YAML 的成本。进一步细节以仓库 README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜