# 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`。 注册标签必须严格使用: ```text 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 终端运行: ```bash 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,失败时自动回滚。 首次安装和验收完成前,发布工作流只允许在 Gitea Actions 页面手动触发。确认 Runner、Registry、NAS 更新服务和回滚流程均正常后,再启用指定分支的 `push` 触发。