diff --git a/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-05T10-31-24.973Z-5fca8743/manifest.json b/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-05T10-31-24.973Z-5fca8743/manifest.json deleted file mode 100644 index 32cf036..0000000 --- a/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-05T10-31-24.973Z-5fca8743/manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "schema": "openclaw.skill-collection-backup.v1", - "id": "2026-09-05T10-31-24.973Z-5fca8743", - "createdAt": "2026-09-05T10:31:24.973Z", - "workspaceDir": "/home/yangxuan/.openclaw/workspace", - "skillDirs": [], - "resultSkillDirs": [], - "resultSkillHashes": {} -} \ No newline at end of file diff --git a/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/manifest.json b/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/manifest.json new file mode 100644 index 0000000..80a2529 --- /dev/null +++ b/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/manifest.json @@ -0,0 +1,15 @@ +{ + "schema": "openclaw.skill-collection-backup.v1", + "id": "2026-09-12T10-31-40.548Z-2819fda5", + "createdAt": "2026-09-12T10:31:40.549Z", + "workspaceDir": "/home/yangxuan/.openclaw/workspace", + "skillDirs": [ + "skills/db-backup-enroll" + ], + "resultSkillDirs": [ + "skills/db-backup-enroll" + ], + "resultSkillHashes": { + "skills/db-backup-enroll": "103de3f77cfc33db3d92703ae68f3a1073f65a7e341cb6e22241a706e607a907" + } +} \ No newline at end of file diff --git a/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/workspace/skills/db-backup-enroll/SKILL.md b/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/workspace/skills/db-backup-enroll/SKILL.md new file mode 100644 index 0000000..0abd84e --- /dev/null +++ b/skill-workshop/collection-backups/eb82ecbfc65a8055/2026-09-12T10-31-40.548Z-2819fda5/workspace/skills/db-backup-enroll/SKILL.md @@ -0,0 +1,81 @@ +--- +name: "db-backup-enroll" +description: "新建带数据库的 agent 时,自动把其库加入每日备份脚本 backup-agent-dbs.sh,保证所有本地库被 crontab 03:00 备份。" +--- + +# DB Backup Enroll — 新建 agent 自动加入数据库备份 + +## 目的 + +本地 Docker MySQL 有一套每日 03:00 自动备份机制(crontab + `/usr/local/bin/backup-agent-dbs.sh`)。**每当新建一个带数据库的 agent,必须把它的库加进这个备份脚本**,否则新库不会被备份,存在数据丢失风险。 + +## 核心脚本与机制 + +| 项 | 内容 | +|----|------| +| 备份脚本 | `/usr/local/bin/backup-agent-dbs.sh`(root 所有,需 sudo 编辑)| +| 触发 | crontab:`0 3 * * * /usr/local/bin/backup-agent-dbs.sh` | +| 备份方式 | `docker exec mysql mysqldump --single-transaction --routines --triggers --events ` | +| 备份产物 | `workspace-/db/_<日期>.sql.gz` + `_latest.sql` | +| 保留 | 30 天前 `.sql.gz` 自动删除 | +| 同步 | git commit + push 到 Gitea 远程 | +| 日志 | `workspace/db/backup.log` | + +## 需要备份的 MySQL 库(本地 Docker 实例 127.0.0.1:3306) + +当前 DB_MAP(脚本内)已覆盖:main / resume / travel / fitness / finances / wellness / juaner / tab。 + +⚠️ **任何新建带库 agent,其库必须加入此映射。** + +## 标准操作流程 + +### 1. 新增 agent 后——把库加入备份(核心步骤) + +用 sudo 精确编辑 `/usr/local/bin/backup-agent-dbs.sh`,**三处都要改**(缺一不可): + +**(a) 扩展 `DB_MAP`**(脚本中部): +```bash +declare -A DB_MAP=( + ... + ["<库名>"]="workspace-" # 新增这一行 +) +``` + +**(b) 扩展清理循环名单**(`for WS in workspace ...` 一行): +```bash +for WS in workspace workspace-resume workspace-travel workspace-fitness workspace-finances workspace-wellness workspace-juaner workspace-tab workspace-sql; do +# 把 workspace- 追加进去 +``` + +**(c) 扩展 git add 名单**(`for WS in resume travel fitness finances ...` 一行): +```bash +for WS in resume travel fitness finances wellness juaner tab sql; do +# 把 追加进去 +``` + +### 2. 语法与功能验证 + +```bash +sudo bash -n /usr/local/bin/backup-agent-dbs.sh # 语法检查 +# 手动测试该库能否备份(不触发整个脚本的 git push) +docker exec mysql mysqldump -uroot -p5gynj20J --single-transaction --routines --triggers --events | gzip > /tmp/test_.sql.gz +``` + +### 3. 核对清单(新 agent 交付前) + +- [ ] DB_MAP 含 `<库名> => workspace-` +- [ ] 清理循环名单含 `workspace-` +- [ ] git add 名单含 `` +- [ ] 手动 mysqldump 该库成功 +- [ ] (可选)真实触发一次备份确认落盘 + +## 红旗 / 注意 +- 脚本属 root:编辑必须 `sudo`,改前先 `sudo cp ... .bak-$(date +%Y%m%d)` 备份。 +- 密码 `5gynj20J` 明文在脚本中,**不要外泄到聊天/日志**。 +- `docker exec mysql ...` 用的是容器名 `mysql`;PostgreSQL 部分是 `postgres` 容器 `openclaw` 库,无需动(除非新增 PG 库)。 +- 备份会自动 git push 到 Gitea——这是脚本设计的一部分,属授权操作,无需额外请示。 + +## 相关文件 +- 主脚本:`/usr/local/bin/backup-agent-dbs.sh` +- 备份日志:`/home/yangxuan/.openclaw/workspace/db/backup.log` +- 数据库映射定义:`MEMORY.md` →「🐬 本地数据库环境(Docker MySQL)」→「本地库 ↔ Agent 映射」