变更记录
每条采用四段式:做了什么 / 为什么 / 影响面 / 回滚点。只追加,不改写既有条目。
2026-08-27 — 建立 zmuke-devops 仓库,导入 zmuke-n-00001 业务运维单元
做了什么
新建本地 Git 仓库 zmuke-devops(main 分支),建立目录骨架、模块边界文档、 主机文档、站点构建与 Gitea Actions 发布流水线,并以只读方式从 zmuke-n-00001 导入下列业务运维单元:
| 单元 | 导入内容 | 来源 |
|---|---|---|
gitea | compose.yml + README | /opt/zmuke-gitea/compose.yml(原样,无密钥) |
cloudflared | docker-compose.yml + .env.example + README | ~adminb84002/devops/docker/cloudflared/docker-compose.yml(原样,token 为变量引用) |
pages | compose.yml(重建件)+ README | 实机无 compose 源,按 docker inspect 观测重建 |
act-runner | act-runner.service + README | /etc/systemd/system/act-runner.service(原样) |
vault-backup | vault-backup.service、.timer + README | /etc/systemd/system/(原样) |
evebox | compose.yml(重建件)+ README | 实机无 compose 源,来源待查,按 docker inspect 观测重建 |
logging | docker-compose.yml(已脱敏)+ .env.example + README | ~adminb84002/devops/docker/logging/docker-compose.yml |
同时导入运维手册 docs/runbooks/loki-issue-watcher-auto-500.md (源 ~adminb84002/devops/docs/ops/,已逐行确认无凭据真值)。
脱敏项(提交前逐行核对,只记路径与行号,不记值):
logging/docker-compose.yml:107—GF_SECURITY_ADMIN_PASSWORD原含弱默认口令 字面量,改为${GRAFANA_ADMIN_PASSWORD:?...}强制外部提供。logging/docker-compose.yml:75,92—GITEA_TOKEN本为空默认变量引用,原样保留。cloudflared/docker-compose.yml—CF_TUNNEL_TOKEN本为变量引用,原样保留; 真值留在主机.env,仓库只给.env.example(仅键名)。
未取回(权限不足,亦不应入库):/opt/act-runner/ 下的运行器注册文件、 /usr/local/sbin/vault-backup.sh。
未导入:所有 data/、secrets/、sqlite、日志;logging 栈的子配置目录; Hermes 试装目录的任何内容;slaunchx-media 的任何文件。
记录本次决策 D1(三模块边界)、D2(Pages + Access 发布)、D3(zmuke-router / zmuke-ad-browser 重新归位,工作待办)、D4(zmuke-gost 归 fleet,合并待办)。
为什么
zmuke-n-00001 上的业务运维单元此前没有版本化的记录源:四个运行中的业务 容器全部由 docker run 创建,磁盘上的 compose 文件与运行态未收敛,部分单元 (zmuke-pages、evebox)在全主机范围内找不到任何启动来源。这使得变更无法 追溯、回滚点不明确。按 D1 确定的模块边界,这些内容归 devops 模块,需要一个独立 于 fleet 与 vault 的仓库承载。
影响面
- 对实机零影响。本次全部操作为只读读取,未在
zmuke-n-00001上启动、停止、 重建或修改任何服务、文件、配置。 - 本仓自此成为上述单元的记录源;此后变更方向为 仓库 → 实机(人工执行), 每次变更须在本文件追加条目。
- 仓库为本地仓库,未添加 remote、未推送。Gitea 建仓与 Actions secrets 配置 需 owner 手动完成(实例已关闭 push-to-create,必须先在 Web 建仓)。
- 文档站尚未发布:Pages 项目与自定义域
devops.zmuke.com均待建。
回滚点
- 仓库层面:本次为首次提交,回滚 = 删除本地目录
~/workspace/zmuke/zmuke-devops。无远端、无外部副作用。 - 实机层面:无需回滚(未做任何变更)。
- 各单元自身的回滚点分别记在
deploy/zmuke-n-00001/<unit>/README.md的"回滚点"小节。
本次核实发现的残留与异常
- Hermes 试装残留 —
~adminb84002/devops/docker/hermes/,2026-05-07 试装nousresearch/hermes-agent:latest,无容器运行,data/与secrets/为 root 属主,compose 声明挂载./secrets/.netrc。待 owner 核查后清理,本仓未复制。 - 跨组织负载 —
slaunchx-media-mysql/slaunchx-media-redis(compose 项目slaunchx-media,~adminb84002/workspace/claude/slaunchx-media-platform) 是 SlaunchX 的业务负载,却运行在 ZMUKE 主机上,且端口绑0.0.0.0:3307/0.0.0.0:6380。登记为跨组织残留,归slaunchx-devops,本仓不导入其文件。 - logging 栈未运行且归属存疑 —
~adminb84002/devops/docker/logging/是 SlaunchX 观测栈副本(slaunchx-*容器名、gitea.slaunchx.cc、SlaunchX targets),docker ps中无任何对应容器。归属待 owner 决定,决定前不要启动。 - Cloudflare Tunnel token 暴露在容器命令行 —
zmuke-cloudflared以--token <值>启动,docker inspect的.Config.Cmd可读到完整 token。 建议改为环境变量或 credentials 文件注入并轮换该 token。本仓未做变更。 - 运行态与 compose 全面漂移 —
zmuke-gitea、zmuke-pages、zmuke-cloudflared、evebox的com.docker.compose.*label 全部缺失。zmuke-cloudflared的实际容器名与 compose 中的container_name: cf-tunnel不符。 - 浮动镜像标签 — cloudflared、nginx、evebox 均未按 digest 固定,无确定回滚点。
- 来源缺失 —
zmuke-pages与evebox在~adminb84002、/usr/local/sbin、/etc/systemd范围内(排除会话日志)均无 compose / unit / 启动脚本命中。 - 其它 /opt 残留 —
openvpn-ui.old-backup(fleet,待清理)、slaunchx-fleet-backups(SlaunchX)、apache-maven-3.9.16; 主机级redis-server.service用途待查。
Gitea 实例设置核实(非密钥)
| 设置 | 值 |
|---|---|
ENABLE_PUSH_CREATE_ORG | false |
ENABLE_PUSH_CREATE_USER | false |
DEFAULT_PRIVATE | private |
DISABLE_REGISTRATION | true |
即组织仓库不支持 push-to-create,zmuke/zmuke-devops 必须由 owner 先在 Web 端建仓;新建仓库默认可见性为 private。