# 晨风书屋 V2.3.0 - 发布与回滚

> 最后更新：2026-07-12
> 公网地址：https://chenningbo.com/library/

## 1. 发布边界

晨风书屋已从 `P22_HomeLibrary` 完整迁入 `P09_PersonalWebsite`。P09 是唯一源码源，不得再使用旧 P22 脚本或直接在服务器上修改文件。

`--library-only` 只能发布以下内容：

| 本地源 | 服务器目标 |
|:---|:---|
| `src/library/` | `/var/www/chenningbo/library/` |
| `src/index.html` | `/var/www/chenningbo/index.html`（仅书屋入口文案） |
| `src/projects/cangshuge.html` | `/var/www/chenningbo/projects/cangshuge.html` |
| `src/docs/chenfengshushe/` | `/var/www/chenningbo/docs/chenfengshushe/`（排除 `tests/`） |
| `src/api/home_library_api.py` | `/var/www/chenningbo/api/home_library_api.py` |
| `.hermes/server/backup-chenningbo.sh` | `/root/backup-chenningbo.sh` |
| `.hermes/server/backup_chenningbo.sh` | `/root/backup_chenningbo.sh`（旧 03:00 调度的静默兼容空壳，不生成归档） |
| `.hermes/server/backup-library-if-changed.sh` | `/root/backup-library-if-changed.sh` |
| `.hermes/server/chenningbo-library-backup.cron` | `/etc/cron.d/chenningbo-library-backup` |
| `VERSION` | `/var/www/chenningbo/VERSION` |

该范围不构建 HubNews，不同步博客、导航、其他项目页或 BiliShell，也不重启它们的服务。首页只同步已经纳入本地验收的晨风书屋入口文案；项目页只同步 `cangshuge.html`。

DeepSeek Key 不属于发布白名单。它只通过一次性命令安装到 `/etc/chenningbo/secrets/home-library.env`：

```bash
bash sync-website.sh --install-library-secret
```

本地中转文件固定为 `C:\Users\Administrator\.secrets\chenningbo\home-library.env`。安装成功后脚本自动删除本地文件；服务器文件设置 `root:root 0600` 和 immutable 属性。目标已存在时脚本拒绝覆盖，普通 `--library-only` 发布和站点备份都不会访问该路径。

管理员密码使用另一份独立 Secret，不与 DeepSeek Key 混放：

```bash
bash sync-website.sh --install-library-admin-secret
```

本地一次性文件为 `C:\Users\Administrator\.secrets\chenningbo\home-library-admin.env`，服务器目标为 `/etc/chenningbo/secrets/home-library-admin.env`，systemd drop-in 为 `30-home-library-admin.conf`。安装模式验证正确密码返回 200、错误密码返回 401 后才提交；失败自动回滚，成功后删除本地文件。普通发布和两套每日备份都不访问管理员 Secret。

## 2. 发布前

1. 从 P09 根目录读取 `.hermes/PROJECT_RULES.md`。
2. 创建修改前本地备份并记录 SHA-256。
3. 运行书屋的 JavaScript、Python API、shell 语法和浏览器测试。
4. 更新根 `VERSION` / `CHANGELOG.md` 和书屋专项版本记录。
5. 确认 Git 差异没有其他板块的意外变更。

## 3. 唯一发布命令

```bash
cd /mnt/d/Workspace/01_Windows_Projects/P09_PersonalWebsite
bash sync-website.sh --library-only
```

禁止使用 `scp`、裸 `rsync`、SSH 中的 `sed -i`、编辑器或临时 Python 脚本直接改服务器文件。

## 4. 发布管道保证

- 获取带随机令牌的正式发布锁。
- 对生产 SQLite 执行 `PRAGMA integrity_check`，记录发布前总数并生成一致性快照。
- 备份现有书屋前端、首页入口、项目详情、专项文档、Blueprint、每日备份脚本和最新 SQLite 一致性快照。
- 用校验和同步书屋白名单文件、API、备份脚本和 22:00 条件任务。
- 发布白名单不包含 `/var/www/data/home_library.db`，任何普通版本发布都不得覆盖生产数据。
- Python 编译检查通过后仅重启 `chenningbo-api.service`。
- 服务恢复后重新检查 SQLite 完整性；记录数低于发布前基线时门禁失败。
- 比对前端、首页入口、项目详情、专项文档、API、备份脚本的 SHA-256 清单和版本号。
- 检查页面、兼容脚本、`ping`、未登录 `export` 401、认证接口及 JSON 结构。

## 5. 数据恢复

全量导入前生成的数据库快照位于：

```text
/var/www/data/home_library_backups/home_library_preimport_*.db
```

每日站点备份包含：

```text
library-data/home_library.db
```

每天 22:00 的书屋数据条件备份位于：

```text
/root/backups/chenningbo/library-daily/home_library_*.tar.gz
```

恢复属于生产数据变更，不得在常规发布中自动执行。必须先停止写入、备份当前库、用 SQLite `backup` API 恢复目标快照，启动服务后验证 `ping`、记录总数和抽样书架位置。

更完整的数据策略见 [DATA_MANAGEMENT.md](DATA_MANAGEMENT.md)。
