fix(gitea): 修复可验证备份、持久 Runner 与接管验收 #1

Open
opened 2026-09-25 22:12:24 +08:00 by gao · 4 comments
Owner

用户授权将现有 Gitea 修到能够可靠接管的状态。范围:识别真实数据卷并修复空备份;隔离恢复演练;持久化、仓库受限的 Runner;CI 成功和失败阻断验收;服务恢复、运维记录。保留已有 GitHub 主链与现有仓库数据。异机备份目标由用户提供。根因:备份脚本使用 gitea-data,实际数据卷为 gitea_gitea-data;现有 launchd 任务未加载。

用户授权将现有 Gitea 修到能够可靠接管的状态。范围:识别真实数据卷并修复空备份;隔离恢复演练;持久化、仓库受限的 Runner;CI 成功和失败阻断验收;服务恢复、运维记录。保留已有 GitHub 主链与现有仓库数据。异机备份目标由用户提供。根因:备份脚本使用 gitea-data,实际数据卷为 gitea_gitea-data;现有 launchd 任务未加载。
Author
Owner

平台修复进展(2026-09-25,最终恢复演练进行中):

  • 源码 PR #2 已按已检查且交叉评审通过的 b6e8204 合并,merge 917501939b9abe8045fbf628f274ae2d7db87d28。
  • 正式 Gitea 1.27.3、固定镜像 digest、新卷、旧卷保留;当前健康检查和 LAN Git 读取通过。
  • 新版运行:完整项目检查 3136、运维源码检查 3137、v3 制品/缓存跨 job 字节校验 3139 全部成功。合并门禁实测失败检查 405、旧 HEAD 409。
  • 本地 Actions upload/download 仓库默认 HEAD 无效已修复;所有非空库默认 HEAD 检查无残留。制品本地文件 SHA256 与测试载荷一致。
  • 第三次最终一致性备份正在加密,随后从 T5 恢复镜像及新卷,并验证 SQLite、全部 refs/git fsck、默认 HEAD 和测试制品。当前已完成的恢复回执仍对应首次旧版快照,不冒称最新恢复已完成。

待用户处理:macOS 后台 Python 的可移除宗卷权限;backup.key 独立保管。无人值守 T5 备份与整机丢失恢复尚未验收。备份遇运行中 CI 会退出且当前没有自动补跑;小时审计仅写日志,无主动告警。正式业务 workflow/secrets/发布管道及 GitHub 订阅尚未切换。

平台修复进展(2026-09-25,最终恢复演练进行中): - 源码 PR #2 已按已检查且交叉评审通过的 b6e8204 合并,merge 917501939b9abe8045fbf628f274ae2d7db87d28。 - 正式 Gitea 1.27.3、固定镜像 digest、新卷、旧卷保留;当前健康检查和 LAN Git 读取通过。 - 新版运行:完整项目检查 [3136](http://192.168.1.83:33000/gao/ai-shitiku-ci-pilot/actions/runs/3136)、运维源码检查 [3137](http://192.168.1.83:33000/gao/ai-shitiku-ci-pilot/actions/runs/3137)、v3 制品/缓存跨 job 字节校验 [3139](http://192.168.1.83:33000/gao/ai-shitiku-ci-pilot/actions/runs/3139) 全部成功。合并门禁实测失败检查 405、旧 HEAD 409。 - 本地 Actions upload/download 仓库默认 HEAD 无效已修复;所有非空库默认 HEAD 检查无残留。制品本地文件 SHA256 与测试载荷一致。 - 第三次最终一致性备份正在加密,随后从 T5 恢复镜像及新卷,并验证 SQLite、全部 refs/git fsck、默认 HEAD 和测试制品。当前已完成的恢复回执仍对应首次旧版快照,不冒称最新恢复已完成。 待用户处理:macOS 后台 Python 的可移除宗卷权限;backup.key 独立保管。无人值守 T5 备份与整机丢失恢复尚未验收。备份遇运行中 CI 会退出且当前没有自动补跑;小时审计仅写日志,无主动告警。正式业务 workflow/secrets/发布管道及 GitHub 订阅尚未切换。
Author
Owner

最终自主验收回执(2026-09-25):

最新 T5 快照已经完成真实恢复和隔离运行验收。

  • 本机数据 snapshot d69b8becc5cd900ec967875424c087782837da20e1b8f82d9b5f7990901a772d;T5 数据 snapshot 83ce9d3e6dbe53c161a8f22b14419cb63135ca619541b0c91d40d65ca290c9ab。全量 restic read-data 通过,本次冷拷贝服务暂停 63.21 秒。
  • 从 T5 加载备份镜像并恢复全新卷 gitea-restore-check-32304b1aaa41:SQLite integrity、208 仓库 / 43 issue / 19 PR / 6 用户、全部 refs 摘要一致,每库 git fsck --full 通过。完成时间 2026-09-25T15:35:59.612184+00:00。
  • 最新恢复实例 1.27.3 在 internal 网络、无发布端口启动:API 健康、Git 读取源码 merge 917501939b9abe8045fbf628f274ae2d7db87d28、194 个非空库 HEAD 及 14 个空库计数通过;CI 测试制品 SHA256 bcae9725115cbcafefb48adb732155047e5879c69f6fb04b49549a01d6c05188 一致。演练容器已停止并还原其原始 app.ini。
  • 正式 Gitea 1.27.3 healthy,专属 runner online。新版完整项目 CI 3136、运维源码 CI 3137、v3 制品/缓存 CI 3139 已全部成功;源码 PR #2 已合入。

仍不关闭此 issue: 后台外盘查询超时,最后交互 status 复测也外盘查询超时;macOS 权限待用户处理。独立密钥保管尚未得到确认。额外的 T5 工具文件重新校验卡在系统 open,已终止只读检查,待授权后重试并复制最终回执。已有加密快照的全量读校验及最新完整恢复确已成功,不与后续权限阻断混淆。

03:30 备份/60 秒恢复守卫/小时审计已安装,但运行中 CI 导致备份退出后没有自动补跑;审计只写日志、没有主动告警。正式业务 workflows、Secrets、部署及 GitHub 账单尚未切换。平台和私有试点验收通过,不宣称无人值守或全部 GitHub 接管已完成。

详细中文回执位于 /Users/brunogao/ops/gitea-reliability/ACCEPTANCE.md;当前运行说明和早先交接文档均已入源码仓库。本评论补充其中最新 CI、快照和恢复结果。

最终自主验收回执(2026-09-25): **最新 T5 快照已经完成真实恢复和隔离运行验收。** - 本机数据 snapshot `d69b8becc5cd900ec967875424c087782837da20e1b8f82d9b5f7990901a772d`;T5 数据 snapshot `83ce9d3e6dbe53c161a8f22b14419cb63135ca619541b0c91d40d65ca290c9ab`。全量 restic read-data 通过,本次冷拷贝服务暂停 63.21 秒。 - 从 T5 加载备份镜像并恢复全新卷 `gitea-restore-check-32304b1aaa41`:SQLite integrity、208 仓库 / 43 issue / 19 PR / 6 用户、全部 refs 摘要一致,每库 git fsck --full 通过。完成时间 `2026-09-25T15:35:59.612184+00:00`。 - 最新恢复实例 1.27.3 在 internal 网络、无发布端口启动:API 健康、Git 读取源码 merge 917501939b9abe8045fbf628f274ae2d7db87d28、194 个非空库 HEAD 及 14 个空库计数通过;CI 测试制品 SHA256 `bcae9725115cbcafefb48adb732155047e5879c69f6fb04b49549a01d6c05188` 一致。演练容器已停止并还原其原始 app.ini。 - 正式 Gitea 1.27.3 healthy,专属 runner online。新版完整项目 CI 3136、运维源码 CI 3137、v3 制品/缓存 CI 3139 已全部成功;源码 PR #2 已合入。 **仍不关闭此 issue:** 后台外盘查询超时,最后交互 status 复测也外盘查询超时;macOS 权限待用户处理。独立密钥保管尚未得到确认。额外的 T5 工具文件重新校验卡在系统 open,已终止只读检查,待授权后重试并复制最终回执。已有加密快照的全量读校验及最新完整恢复确已成功,不与后续权限阻断混淆。 03:30 备份/60 秒恢复守卫/小时审计已安装,但运行中 CI 导致备份退出后没有自动补跑;审计只写日志、没有主动告警。正式业务 workflows、Secrets、部署及 GitHub 账单尚未切换。平台和私有试点验收通过,不宣称无人值守或全部 GitHub 接管已完成。 详细中文回执位于 `/Users/brunogao/ops/gitea-reliability/ACCEPTANCE.md`;当前运行说明和早先交接文档均已入源码仓库。本评论补充其中最新 CI、快照和恢复结果。
Author
Owner

部署前记录(2026-09-26):PR #3 已按 d8bb18a091 的真实 Gitea CI run 3142 成功状态和独立交叉评审 PASS 合并;确定的 master merge commit 是 012d06cf49425713b18df063fd7dbc8e0435fac8。

本次发布范围只涉及 Gitea 备份脚本与 3 个用户 LaunchAgent 的配置:03:30 起每小时检查,遇 CI 忙稍后重试,当前窗口外盘复制失败时先补复制现有本机快照,跨日旧失败不挡新本机备份。正式容器镜像、数据卷、Runner、学生数据、共享服务均不在本次变更范围。

部署前确认 Gitea healthy、运行中 CI=0、维护标记不存在;旧脚本和三个 LaunchAgent 已备份到 /Users/brunogao/ops/gitea-reliability/deploy-before-20260926T000015Z,可据此回退。将从上述 merge commit 的干净隔离目录安装;随后用实际 launchd kickstart 验证退出码和无重复停机。

今天 03:30 的快照 cc2940aca52a5c759c40742e0af3c138609512eb1d968887f6d7a4f19b2c04f3 已于 07:44 不停机补复制到 T5 并通过全量 read-data,后台 audit 07:45 已成功。恢复密钥独立保管仍待用户确认。

部署前记录(2026-09-26):PR #3 已按 d8bb18a0916fae5374125a7999125273f7bcdba6 的真实 Gitea CI run 3142 成功状态和独立交叉评审 PASS 合并;确定的 master merge commit 是 012d06cf49425713b18df063fd7dbc8e0435fac8。 本次发布范围只涉及 Gitea 备份脚本与 3 个用户 LaunchAgent 的配置:03:30 起每小时检查,遇 CI 忙稍后重试,当前窗口外盘复制失败时先补复制现有本机快照,跨日旧失败不挡新本机备份。正式容器镜像、数据卷、Runner、学生数据、共享服务均不在本次变更范围。 部署前确认 Gitea healthy、运行中 CI=0、维护标记不存在;旧脚本和三个 LaunchAgent 已备份到 `/Users/brunogao/ops/gitea-reliability/deploy-before-20260926T000015Z`,可据此回退。将从上述 merge commit 的干净隔离目录安装;随后用实际 launchd kickstart 验证退出码和无重复停机。 今天 03:30 的快照 `cc2940aca52a5c759c40742e0af3c138609512eb1d968887f6d7a4f19b2c04f3` 已于 07:44 不停机补复制到 T5 并通过全量 read-data,后台 audit 07:45 已成功。恢复密钥独立保管仍待用户确认。
Author
Owner

2026-09-26 发布及备份补跑回执(保留 issue 开启,等待异机密钥保管确认)

  • 03:30 定时冷备暂停 Gitea 57.26 秒并成功生成本机加密快照 cc2940aca52a5c759c40742e0af3c138609512eb1d968887f6d7a4f19b2c04f3;diskutil 查询 T5 超时使异机复制失败,任务正确以失败退出,未误报为成功。
  • 07:44 对同一份本机快照执行补复制,无需再次停 Gitea;T5 数据快照 52f09d35e3fd31ce2aa3d24925ef101533dcff1f0810a203a983b307686ffdb6、镜像快照均通过 restic check --read-data。07:45 真实 launchd 后台审计退出码 0。
  • 自动补跑修复 PR #3 的精确候选 HEAD d8bb18a0916fae5374125a7999125273f7bcdba6 经源 CI run 3142 成功与独立交叉评审 PASS;正常合并提交 012d06cf49425713b18df063fd7dbc8e0435fac8。从干净合并提交部署,备份任务现每小时 :30 触发。当天已验证则只做状态检查;当天本机备份待复制则先补复制;跨日旧失败不阻止新本机快照。守卫先恢复任何中断维护状态。
  • 实际 launchctl kickstart 验证新任务退出码 0,日志为 PASS: current backup window already verified;前后 Gitea 启动时间、镜像与正式数据卷未变,未重复停服务。最终 Gitea /api/healthz HTTP 200、Runner online、备份/审计/守卫最近退出码 0。
  • /Volumes/t5/gitea-restic-recovery/tools 已从合并源码更新,9/9 文件 SHA256 校验通过;恢复目录根部 10 份非密钥回执和验收记录原子复制并核对 SHA256。旧版工具包保留在 tools-before-012d06cf。本机回退目录 /Users/brunogao/ops/gitea-reliability/deploy-before-20260926T000015Z。当前完整回执 /Users/brunogao/ops/gitea-reliability/ACCEPTANCE-20260926.md。

边界:最新快照已做 T5 全量读取校验,最近一次真正全量恢复/隔离服务验证对应前一个快照 d69b8becc5cd900ec967875424c087782837da20e1b8f82d9b5f7990901a772d。backup.key 仍需本人将文件内容保存到 T5 以外的密码管理器并确认可取回;持续失败目前仅有本机日志,无主动告警;正式业务 workflow/Secrets/发布链尚未切换,GitHub 订阅未改变。

2026-09-26 发布及备份补跑回执(保留 issue 开启,等待异机密钥保管确认) - 03:30 定时冷备暂停 Gitea 57.26 秒并成功生成本机加密快照 `cc2940aca52a5c759c40742e0af3c138609512eb1d968887f6d7a4f19b2c04f3`;`diskutil` 查询 T5 超时使异机复制失败,任务正确以失败退出,未误报为成功。 - 07:44 对同一份本机快照执行补复制,无需再次停 Gitea;T5 数据快照 `52f09d35e3fd31ce2aa3d24925ef101533dcff1f0810a203a983b307686ffdb6`、镜像快照均通过 `restic check --read-data`。07:45 真实 launchd 后台审计退出码 0。 - 自动补跑修复 PR #3 的精确候选 HEAD `d8bb18a0916fae5374125a7999125273f7bcdba6` 经源 CI run 3142 成功与独立交叉评审 PASS;正常合并提交 `012d06cf49425713b18df063fd7dbc8e0435fac8`。从干净合并提交部署,备份任务现每小时 :30 触发。当天已验证则只做状态检查;当天本机备份待复制则先补复制;跨日旧失败不阻止新本机快照。守卫先恢复任何中断维护状态。 - 实际 `launchctl kickstart` 验证新任务退出码 0,日志为 `PASS: current backup window already verified`;前后 Gitea 启动时间、镜像与正式数据卷未变,未重复停服务。最终 Gitea `/api/healthz` HTTP 200、Runner online、备份/审计/守卫最近退出码 0。 - `/Volumes/t5/gitea-restic-recovery/tools` 已从合并源码更新,9/9 文件 SHA256 校验通过;恢复目录根部 10 份非密钥回执和验收记录原子复制并核对 SHA256。旧版工具包保留在 `tools-before-012d06cf`。本机回退目录 `/Users/brunogao/ops/gitea-reliability/deploy-before-20260926T000015Z`。当前完整回执 `/Users/brunogao/ops/gitea-reliability/ACCEPTANCE-20260926.md`。 边界:最新快照已做 T5 全量读取校验,最近一次真正全量恢复/隔离服务验证对应前一个快照 `d69b8becc5cd900ec967875424c087782837da20e1b8f82d9b5f7990901a772d`。`backup.key` 仍需本人将文件内容保存到 T5 以外的密码管理器并确认可取回;持续失败目前仅有本机日志,无主动告警;正式业务 workflow/Secrets/发布链尚未切换,GitHub 订阅未改变。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gao/macos-tools#1