在阿里云 ECS 上给 dsh-providers-hub 搭一个常驻网关
它把十几家 AI 编程服务的账号收进一个池子:18 个 provider 路由、1 个聚合路由,登录与续期都在 Jet Hub 设置页完成,不注册斜杠命令。附带的 OpenAI 兼容网关属于旁路能力,默认监听 127.0.0.1:8326,同时提供 /v1/chat/completions 与 /v1/responses,让 Continue、Cline 这类客户端复用已登录账号。
把它搬到 ECS 常驻,绝大多数时间不在配面板,而在回答一个问题:网关绑哪个地址。
容器里 curl 127.0.0.1 为什么会骗你
坑一 · 端口映射到本机网关却连不上
现象:docker run -p 8326:8326 后,容器内 curl 127.0.0.1:8326 正常,从宿主机访问却报 Connection reset by peer。
原因:网关只绑回环。容器里的 127.0.0.1 是它自己的回环,docker-proxy 与同网络容器走桥接网卡 eth0,那里没有监听。对照 Web 端口绑的是容器 IP,映射才可用——这点最容易误判成安全组。
解决:把 DSH_OPENAI_GATEWAY_HOST 设成容器自身 IP,取值用 hostname -i 或 ip -4 addr show eth0,如 172.21.0.8;改完 docker exec <name> ss -tlnp | grep 8326 验一下监听地址。
换成 ECS 私网地址,只放行该放的端口
裸机部署把 DSH_OPENAI_GATEWAY_HOST 写成实例私网 IP:ECS 网卡上只有私网地址,公网由 NAT 或 EIP 承担,绑公网会直接失败。
安全组只放行真要用的端口,用源地址限制到办公网段或跳板机,别给 0.0.0.0/0 开 8326。网关没有账号体系,唯一的门就是 Bearer Key。
坑二 · 把网关绑到 0.0.0.0 图省事
现象:设 DSH_OPENAI_GATEWAY_HOST=0.0.0.0 求省事,网关反而没起来,日志一条错误,别的功能都正常。
原因:宿主显式拒绝 0.0.0.0 与 ::,记录错误后跳过启动,不会静默换端口。这是刻意的——绑通配等于把「用你已登录账号发请求」交给整个网络。
解决:填具体接口地址。要跨网就前置 Nginx 反向代理,网关仍只听私网网卡,并显式设 DSH_OPENAI_GATEWAY_API_KEY。
装包时留下的两个旧账
坑三 · 旧包名还锁在 profile 里
现象:升级后 Jet Hub 界面整个不见,日志里只有一行 N entry did not activate,插件被自动禁用。
原因:包在 0.2.0-rc.11 从 dsh-codearts-auth 改了名。DSH 按包名字符串寻址 bundle,老 profile 的 dependencies 与 dsh.profile.bundles 两处都还写着旧名。只改一处或都不改都会坏:旧名解析得到、新名解析不到,加载行 import 失败,插件被禁且不弹提示。
解决:别手改。dsh plugin --profile <name> remove 旧的再 add 新的,让工具一次写两处。跑多个 profile 的话每个都走一遍。
坑四 · 在 0.2.2-rc.1 上装却没看 peer 白名单
现象:较新的 dsh 上装完,插件看似在,模型目录却空着,或启动阶段就有依赖告警。
原因:peerDependencies 里 dsh-llm、dsh-commands、dsh-credentials 只列到 ^0.2.1-rc.2,是几个 rc 的枚举而非开放区间。站点「待复验」也来自这里。
解决:先在 0.2.1-rc.2 跑通再升引擎。另外站点页写 2.18.261107,npm registry 现查 2.19.261108,以 registry 为准;README 那句「尚未发布到 npm registry」已过时。
两个阈值会先撞上
413 是体积问题,不是额度问题
现象:客户端报 HTTP 413,响应体写着 request_too_large,同一套配置昨天还正常。
原因:请求体上限 300 MiB,数的是整段请求而非单条消息。每轮把全量历史重新回传的客户端,只要历史里混进大截图或长日志附件,累计体积就会顶到这条线——账号、额度、网络都没问题,是体积问题。
解决:新建会话,或删掉带附件的那一轮,体积立刻回落。长期习惯是把图另存为文件、只回传路径,别塞进对话历史里。
空闲两分钟后的第一次调用
现象:长跑的客户端每隔一阵第一次调用必失败,错误是 Connection reset,隔一秒重试又好了。
原因:空闲 keep-alive 上限 120 秒,到点由服务端发 FIN 关闭连接;客户端以为链路还在,往一条已经断掉的 socket 上写,拿回的是 RST,看起来就像进程崩了。
解决:客户端侧开启连接存活检测与自动重连。判据很简单——「失败后立刻重试即成功」就是本坑,不必再去查网关进程或安全组。
常驻用 systemd,不要 nohup
unit 里 Restart=on-failure,三个 DSH_OPENAI_GATEWAY_* 放 Environment=,密钥放 EnvironmentFile= 并把文件权限设成 600。别用 nohup ... &:ECS 重启、会话断开、OOM 之后没人拉起它。网关是旁路能力,挂了不影响登录、积分与模型目录,所以更不会有人替你发现。
密钥放在哪,以及它的局限
未设环境变量时,首次启动会在 $DSH_HOME/openai-gateway/api-key 生成随机密钥并持久化,明文。POSIX 的 0600 在 Windows 上不生效,Windows 实例或多人共用的机器请改用环境变量注入。
另有两个易误判之处:直接打开 http://<ip>:8326/v1/models 会 401,这是缺 Bearer 头的预期;改绑非回环后,暴露面包含宿主本身,隔离只剩 API Key。
总结
云上部署的配置项不多,难点全在「地址」与「谁能连到它」:绑回环则映射失效,绑通配则被拒绝,绑具体网卡才是正解,同时换来一份得自己守住的安全边界。想确认插件当前状态,可以从 站点上的插件详情与清单 看起。
适合与不适合
适合:有一台常驻 ECS、要让多个客户端共用已登录账号的团队;要把网关收进内网、由安全组统一管控的部署;跑 headless profile、本就不在服务器上开浏览器的场景。
不适合:客户端与网关同在一台笔记本上的人,默认 127.0.0.1 就够,改绑只会扩大暴露面;把网关当公网 API 对外提供的场景,它没有多租户、配额与审计;Windows 实例上又不想动环境变量的多用户机器。
标签:阿里云、ECS、systemd、OpenAI 兼容网关、端口绑定
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。