阿里云 ECS 与 Workbench CLI
来源:
intranet-tunnel/docs/AGENTS-ARCHIVE.md→## intranet-tunnel 云服务器部署(2026-09-12)· 完整版(原文 2191 字符)
intranet-tunnel 云服务器部署(2026-09-12)· 完整版
(2026-09-13 自工作区 AGENTS.md 的「intranet-tunnel 云服务器部署(2026-09-12 实测)」一节 逐字移出;AGENTS.md 里只留判据与指针。移出原因是指令字节预算,不是内容无用。)
部署时踩的坑(均已实测确认)
- compose 缺 certs/backups 挂载:
tunnel-server只挂了tunnel-data:/app/data,
注释却写「宿主机 ./certs 即容器 /app/certs」——该映射并不存在。 Dockerfile 为 /app/certs 声明了匿名卷,证书不会丢,但宿主机 ./certs 恒为空, 而前置 nginx 读的正是那里。已补 ./certs:/app/certs 与 ./backups:/app/backups。
- bind mount 后必须
chown 10001:10001:容器以USER tunnel(uid 10001)运行,
匿名卷会继承镜像内属主,bind mount 不会。宿主机目录属 root 时报 open certs/acme_account.key: permission denied,且日志不断刷「服务端启动失败」并无限重启。
- 面板「外网访问」开关以数据库为准:
.env的PANEL_OUTSIDE_ACCESS
只在 system_settings 表首次初始化时写入,运行期读表里的 panel.outside_access。 于是形成鸡生蛋(改设置要进面板、进面板要改设置),只能直接改库: update system_settings set setting_value='true' where setting_key='panel.outside_access'; 注意列名是 setting_key / setting_value,不是 key / value。
- 项目自带的 DNS-01 在阿里云不可用:
cert/acme.go把 ACME 授权标识符
直接当作 DNS 托管主域传给服务商,对 tunnel.sushike.cloud 报 InvalidDomainName.NoExist(阿里云要求 DomainName 必须是托管主域 sushike.cloud)。 本次改用 acme.sh(--dns dns_ali)签发,续期走 acme.sh 自带 cron。 不要把该证书再导入面板——两套续期会互相干扰。
- 源码落后于运行镜像:面板 API 要求传
dns_provider/dns_credentials,
但仓库源码的 handleCreateCert 并未把这些字段传给签发器,且该报错文案在源码中根本不存在。 改后端之前先确认镜像与源码的版本关系,别默认两者一致。
Workbench CLI 的两个传参坑
- 远程命令里以
-开头的 token 会被 workbench 当成自己的 flag:
报 bad flag syntax: ---,或 unknown shorthand flag: 'l' in -l(后者来自 wc -l)。 根因是 PowerShell 5.1 把多行字符串传给原生程序时会拆分参数。 对策:远程脚本写成文件上传,再用 sh /path/script.sh 这种极简命令执行。 同理 upload 有覆盖保护(默认答案 No,非交互直接终止),重新上传前先 rm 远程文件。
exec的 stdout 会被截断,psql的对齐表格尤其明显;
需要完整输出时重定向到文件再 cat。
阿里云 API 手写签名的排序陷阱
- 参数排序必须用 Ordinal(ASCII)。PowerShell 的
Sort-Object默认是
不区分大小写的文化排序,会把 TTL 排到 Timestamp 之后 (文化排序比较 ttl vs timestamp,i < t),而阿里云要求 ASCII 序 ('T'=0x54 < 'i'=0x69)。症状是 SignatureDoesNotMatch。 正确写法:[array]::Sort($arr, [System.StringComparer]::Ordinal)。 隐蔽之处:参数名首字母各不相同时两种排序结果一致(所以 ECS 调用正常), 只有出现 TTL/Timestamp/Type 这类同首字母参数才暴露。
来源:
intranet-tunnel/deploy/cloud/BAOTA-DEPLOY.md→## 七、Workbench CLI 的两个传参坑(用本工具部署时必踩)(原文 408 字符)
七、Workbench CLI 的两个传参坑(用本工具部署时必踩)
- 远程命令里以
-开头的 token 会被 workbench 当成自己的 flag。
报错形如 bad flag syntax: --- 或 unknown shorthand flag: 'l' in -l(后者来自 wc -l)。 PowerShell 5.1 把多行字符串传给原生程序时会拆分参数。 对策:把远程脚本写成文件上传,再用 sh /path/script.sh 这种极简命令执行。
upload有覆盖保护,默认答案为 No,非交互场景会直接终止。
重新上传前先 rm 远程同名文件。
另:exec 的 stdout 会被截断,psql 的对齐表格尤其明显, 需要完整输出时把结果重定向到文件再 cat。
