系统配置页新增「版本与更新」卡片,顶栏版本号旁在有新版时亮出提示胶囊。 更新链路:下载发布包 → 比对 SHA256SUMS → -h 冒烟测试 → 暂存 artex.new → 以退出码 75 退出 → 守护脚本重新拉起并完成换装,页面轮询 /api/health 等版本号变化后自动刷新。 新增 start.sh / start.bat 作为正式启动入口,只按退出码决定是否重新拉起 (0 停止 / 75 应用新版 / 其余崩溃退避)。校验、冒烟、换装、回滚全部收在 selfupdate 包里而不写进脚本:这些逻辑在 sh 和 bat 上要写两套,而它们恰恰 最不能出错——换上跑不起来的二进制后守护进程会反复拉起它,只能上机器手工救。 Docker 的 ENTRYPOINT 一并改为该脚本,并由它转发 SIGTERM,否则 docker stop 只发给 PID 1,artex 做不了优雅关闭会被 SIGKILL 硬杀。 失败保护两道闸门互补:无法 exec 由换装前的冒烟挡住,能执行但初始化崩溃 由启动计数兜住(连续 3 次失败自动回滚 artex.old,坏的留作 artex.failed)。 GitHub 查询结果后端缓存 30 分钟(失败 2 分钟)。未认证 API 是每 IP 每小时 60 次,且这 60 次是服务器 IP 上所有用户共用的,顶栏每次整页加载都查一次, 不缓存会很快耗光配额导致真想更新时反而查不动。手动「检查更新」带 force=1 绕过缓存。 安全:只认 GitHub 域名且强制 HTTPS(逐跳校验重定向),发布源写死不可配置; 升级文件挂在可执行文件所在目录而非 CWD(服务化运行时 CWD 可能是 /); 开发构建版本号不可比较,禁用一键更新。 走完整 zip 而非裸二进制,因为现有 Release 的 SHA256SUMS 只覆盖 zip, 这样无需改 CI,也兼容已发布的历史版本。 已知限制:Docker 下只换程序不换镜像(工具链不同步、重建容器会退回镜像 版本);不同步发布包里的 skills/;更新即重启会中断运行中的任务。
46 lines
2.5 KiB
Docker
46 lines
2.5 KiB
Docker
# syntax=docker/dockerfile:1
|
||
#
|
||
# 运行镜像(不在镜像里编译):只装常用工具,放入**预编译好的 Linux 单二进制**。
|
||
# 二进制由 CI 的 binaries job 交叉编译(纯 Go、无 QEMU),按目标架构放在
|
||
# 构建上下文的 dist/<TARGETARCH>/artex。这样多架构构建时 arm64 只需模拟 apt 层,
|
||
# 不再模拟 Next/Go 编译,速度快得多。
|
||
#
|
||
# 本地手动构建镜像时,先自行准备二进制:
|
||
# cd web && npm run build:static && cd ..
|
||
# cp -r web/out server/webui/dist
|
||
# CGO_ENABLED=0 GOARCH=amd64 go build -tags embedui -o dist/amd64/artex ./cmd/artex
|
||
# docker build -t artex:local .
|
||
FROM python:3.12-slim-bookworm
|
||
ARG TARGETARCH
|
||
# 常用工具:ripgrep / curl / vim,加一批 recon 常备件(按需增删)。
|
||
# Node 从 NodeSource 装 20.x:bookworm 自带的 apt nodejs 是 18,Playwright 要求 >=20。
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
ca-certificates ripgrep curl wget vim git jq unzip \
|
||
dnsutils iputils-ping netcat-openbsd inetutils-telnet whois nmap \
|
||
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
|
||
&& apt-get install -y --no-install-recommends nodejs \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
# 预装 Playwright MCP 与 CLI(全局),运行时不再 npx 联网下载。
|
||
# @playwright/mcp:browser MCP 直接 `npx @playwright/mcp`(已全局装好,无需 -y/@latest)。
|
||
# @playwright/cli:提供 playwright-cli,装完顺带 --help 验证可执行。
|
||
# 再装 playwright(提供浏览器管理),装完用 --with-deps 预置 chromium 及其系统依赖,
|
||
# 这样容器内 MCP/CLI 首次启动即可用,不再联网下载浏览器。
|
||
RUN npm install -g @playwright/mcp@latest @playwright/cli@latest playwright@latest \
|
||
&& playwright-cli --help \
|
||
&& playwright install --with-deps chromium \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
WORKDIR /app
|
||
# 预编译好的对应架构二进制(dist/amd64/artex 或 dist/arm64/artex)
|
||
COPY dist/${TARGETARCH}/artex /app/artex
|
||
# 守护启动脚本:进程退出后按退出码决定是否重新拉起,页面一键更新靠它完成换装。
|
||
# 它同时负责把 SIGTERM 转发给 artex —— docker stop 只把信号发给 PID 1,
|
||
# 不转发的话 artex 收不到、做不了优雅关闭,10 秒后被 SIGKILL 硬杀。
|
||
COPY start.sh /app/start.sh
|
||
RUN chmod +x /app/artex /app/start.sh
|
||
COPY skills/ /app/skills/
|
||
# data/(SQLite + jwt.key)持久化点
|
||
VOLUME ["/app/data"]
|
||
EXPOSE 8787 8788
|
||
ENTRYPOINT ["/app/start.sh"]
|
||
CMD ["-addr", ":8787", "-proxy", ":8788"]
|