DSH Runtime Release
runtime-7.3:域名访问设置适配
本次待发布修订为 runtime-7.3。构建时对 DSH 0.2.0-rc.2 的设置 UI 应用精确补丁,使设置视图与表单使用 host 持久化;不修改 connection.isLoopback、可信主机、Origin 或认证逻辑。版本或目标语句不匹配时构建失败,升级上游版本必须重新审核补丁。
这是构建期适配,不是普通插件。补丁本身不识别面板登录状态,该镜像的设置 UI 会对所有访问地址尝试远程设置操作,因此只能部署在受认证、校验实例归属的面板入口之后,不得绕过认证直接公开 runtime 端口。权限由服务端保证。
发布前须在非 localhost 域名验证提供商目录、配置与凭据保存、刷新和重启持久化,以及未登录、跨用户和非法 Origin 的拒绝行为。单元测试不代替这些验收;现有实例需升级镜像才生效,不覆盖用户 profile 或创建空 patch。
dockerfile 分支只维护发布清单和 runtime 镜像构建文件,不包含管理面板源码或部署配置。
发布清单
release.json 是发布入口:schema_version 为清单格式版本,release_id 标识一次发布,version 为精确 DSH 版本,deployment_schema 为运行布局版本,platforms 为支持的平台。当前待发布配置为 runtime-7.3、DSH 0.2.0-rc.2、布局 7、linux/amd64 和 linux/arm64(aarch64,不含 32 位 ARM)。
ARM64 验收状态:已确认 Node/Caddy 基础镜像提供 ARM64 版本,但尚未完成 ARM64 runtime 构建及运行验收。清单声明会开放面板的对应平台构建入口,不等于兼容性证明;验收完成前不要推送发布。
此分支是可信代码来源,不是仅供读取的数据源:Dockerfile 和安装脚本会在构建时执行。只使用经过审核的提交,不要将不可信分支、PR 或任意远端内容直接用于构建。清单本身不代表镜像已经完成运行验收。
本地构建与检查
需要 Docker、Node.js,以及拉取基础镜像和构建依赖的网络。从仓库根目录执行,DSH 版本取自清单,平台按 Docker daemon 架构选择,不跟踪 latest:
set -eu
DSH_VERSION="$(node -p "require('./release.json').version")"
case "$(docker info --format '{{.Architecture}}')" in
aarch64|arm64) PLATFORM=linux/arm64 ;;
x86_64|amd64) PLATFORM=linux/amd64 ;;
*) echo 'Unsupported Docker daemon architecture' >&2; exit 1 ;;
esac
RELEASE_ID="$(node -p "require('./release.json').release_id")"
node --test image/*.test.mjs
docker build --platform "$PLATFORM" \
--build-arg DSH_VERSION="$DSH_VERSION" \
-t "dsh-web:$RELEASE_ID-${PLATFORM#linux/}" ./image
默认按 Docker daemon 架构原生构建,不再固定取清单第一个平台。在交叉构建环境可手动将 PLATFORM 设置为 linux/arm64 或 linux/amd64;需要事先配置对应原生 builder 或 QEMU/binfmt,仅设置 --platform 不会自动提供模拟能力。
Dockerfile 两个阶段均继承目标平台,无需写死架构;不要将 Caddy 阶段固定为构建主机平台,也不要复用另一架构的 node_modules。
发布前分别验证两个架构的镜像构建、非 root 启动、代理认证、终端及原生模块、内置插件离线协调、工作区写入和重启持久化,以及升级/恢复路径。迁移工作区时需重新安装其中的架构相关依赖。
image/ 是构建上下文。构建只生成本地镜像,不推送镜像,也不自动发布分支。保留 image/init-profile.test.mjs 作为独立 runtime 回归测试,覆盖初始化幂等性、保留已有配置和拒绝符号链接目录;它不依赖面板,且被 image/.dockerignore 排除在构建上下文之外。此测试不能替代真实容器启动、插件和持久化验收。
布局 7 合约
- 以 UID/GID 1000 运行;实例持久目录挂载到
/workspace,必须允许该身份读写。DSH_HOME、HOME和工作目录均为/workspace,XDG 数据与配置也位于其中。 /data/dsh-home是指向/workspace的兼容符号链接;不要用旧 home 挂载覆盖该路径。/shared不是布局 7 的持久化入口。- DSH 监听 loopback 3080,Caddy 在容器 8080 转发;只通过受信入口访问,不直接公开 runtime 端口,不挂载 Docker socket。原生模块需要可执行的
/tmp,可保留 nosuid/nodev 与容量限制。 - 新 profile 默认启用固定版本的 mobile、free-search 和 workspace bundle,默认工作区为
/workspace。已有非空 profile 不自动注入或覆盖;升级镜像不会强制改变已有插件选择。 - 启动前协调插件依赖,失败则不启动应用;仅含内置固定依赖的 profile 使用离线安装。用户添加插件后可能需要网络。
手动发布
- 审核 runtime 资产变更及其可信来源,选择精确 DSH 版本,更新
release.json。每次发布变更都必须使用新的release_id;布局合约变化时同步更新deployment_schema、镜像及调用方适配,不能只修改数字。 - 运行上述测试与本地构建,并完成目标平台的容器启动、插件、持久化与兼容验收;检查
git diff --check和最终差异。 - 维护者确认后,手动提交并手动推送
dockerfile分支到已核实的发布远端。修改清单或本地构建不会自动 commit/push,也不会自动更新运行中的实例。
文件范围
release.json:发布清单。README.md:本分支说明。image/Dockerfile、image/Caddyfile、image/entrypoint.sh、image/.dockerignore:镜像构建与启动。image/install-*.mjs、image/init-profile.mjs:内置 runtime 资产安装与 profile 初始化。image/init-profile.test.mjs:保留的 profile 初始化回归测试。image/entrypoint.test.mjs:从面板测试迁移的 runtime 启动失败保护与镜像约束测试,需要 Bash;不依赖 Go 或面板。