Co-Authored-By: Codex <noreply@anthropic.com>
Plainleaf 专用 Gitea Actions Runner
此 Runner 只注册到 wushenghua/plainleaf 仓库,只提供
plainleaf-release 标签。它不提供 ubuntu-latest 标签,因此不会执行仓库继承的
SilverBullet 通用 CI。
Runner 使用固定版本 gitea/runner:3.1.0-dind-rootless 和独立的 Docker 数据卷:
- 不挂载
/var/run/docker.sock - 看不到 NAS 上的 Gitea、MySQL 或其他容器
- 任务容器禁止 privileged 模式和任意 volume 挂载
- 同时只执行一个任务,最多使用 3 核 CPU、8 GB 内存
- 不挂载 Plainleaf 的
/data或 Markdown 目录 - 只将 NAS 内网 Gitea Registry
192.168.31.68:8092标记为 HTTP Registry
外层 rootless DinD 需要 privileged: true 才能创建用户命名空间和内部 Docker
守护进程。由于极空间没有 rootlesskit AppArmor profile,Runner 单独使用
apparmor=unconfined;它只挂载 Runner 自身的目录和命名卷,不挂载任何业务数据。
镜像登录和推送直接走 NAS 内网 Registry,避免大镜像经过公网 FRP;Gitea 中的包
仍可由 NAS 更新服务通过 gitea.aichickenfarm.cn 的 HTTPS 地址拉取。
一次性注册
注册令牌从仓库 设置 -> Actions -> Runners 获取。令牌只通过终端标准输入传给
一次性注册容器,不写入 Compose 或 Git。注册完成后,凭据保存在 data/.runner。
注册标签必须严格使用:
plainleaf-release:docker://docker.gitea.com/runner-images:ubuntu-latest
启动前应确认 data 目录由 Runner 的 UID/GID 1000:1000 持有。Runner 无需开放
任何端口,只主动连接 https://gitea.aichickenfarm.cn/ 拉取任务。
将本目录放到 NAS 的 Plainleaf Runner 专用目录后,在可见 SSH 终端运行:
sudo ./install-runner.sh
脚本先空载启动 Runner 并验证内部 rootless Docker,验证成功后才静默读取一次注册
令牌。令牌不会写入文件、Compose 或 Git,注册凭据只保存在 NAS 的
data/.runner 中。如果空载验证失败,令牌不会被使用;脚本只停止
plainleaf_actions_runner,不会操作其他容器。
Actions Secrets
仓库需要两个 Secret:
REGISTRY_TOKEN:wushenghua用户的write:package令牌NAS_DEPLOY_KEY:Plainleaf 专用 SSH 私钥,只对应 NAS 上的 forced-command 公钥
工作流不会输出 Secret。镜像推送完成后,它使用固定 SSH host key 触发 NAS 上的
plainleaf-update.service;该服务只拉取并重建 Plainleaf,失败时自动回滚。
当前发布工作流会在代码推送到 main 分支时自动运行。Gitea Actions 页面仍保留
手动触发入口,用于发布失败后的重试。