目标
恢复分两层:
- 网站构建能力:能 clone、安装、预览、构建。
- 完整发布能力:能同步 Obsidian 内容、上传新图片到 R2、执行
ship。
如果只改代码或已同步文章,通常只需要第一层。新增图片或重新生成图片派生图,需要第二层。
新设备必备
- GitHub 仓库访问权限。
- Node.js
>=22.12.0。 - Obsidian vault 已同步到本机。
- Lightroom Web exports 或可访问的照片导出目录。
- Cloudflare / R2 发布凭据。
- R2 public photo base URL。
代码恢复
git clone <repo-url>
cd "Cryo Blog"
npm install
npm run doctor
doctor 失败时,先修本机配置,不要直接发布。
本机配置
在仓库根目录创建:
cp .cryo-blog.example.json .cryo-blog.local.json
按新设备路径修改:
{
"photoRoot": "/absolute/path/to/Photos",
"travelSource": "/absolute/path/to/Cryo-Blog/content/travel",
"poetrySource": "/absolute/path/to/Cryo-Blog/content/poetry",
"r2Bucket": "cryo-media",
"cloudflareAccountId": "aca980bd2e11cd79e2fd4cb2d4c566bc"
}
不要提交 .cryo-blog.local.json。它是本机配置,不是项目源文件。
也可以临时用环境变量覆盖:
PHOTO_ROOT=/absolute/path/to/Photos npm run doctor
CRYO_TRAVEL_SOURCE=/absolute/path/to/travel npm run dev
CRYO_POETRY_SOURCE=/absolute/path/to/poetry npm run dev
Obsidian 内容同步
确认这些目录存在:
Cryo-Blog/content/travel
Cryo-Blog/content/poetry
然后运行:
npm run content:sync
npm run validate:content
如果 iCloud 还没同步完,先等同步完成。不要在源目录半同步时发布。
图片恢复
线上图片在 R2。已上传图片不依赖本机。
新图发布仍需要本机有 Lightroom Web exports:
Photos/{year}/{project_id}/Exports/Web/2560/{asset_id}.jpg
Photos/{year}/{project_id}/Exports/Web/Phone/{asset_id}.jpeg
检查引用图片但不上传:
npm run photos:r2:published:dry-run
上传已发布文章引用的图片:
npm run photos:r2:published
Cloudflare / R2 凭据
本地上传 R2 需要其中一种方式:
wrangler loginCLOUDFLARE_API_TOKEN
检查 wrangler:
npx wrangler --version
npm run doctor
GitHub Actions 部署 Pages 使用仓库 secret 和 variable:
secret: CLOUD
variable: PUBLIC_PHOTO_BASE_URL
本地预览
npm run dev
开发时图片 URL 会优先走本机 PHOTO_ROOT 预览中间件。生产构建会使用 PUBLIC_PHOTO_BASE_URL 指向 R2。
发布流程
正常发布只从 main 执行:
git switch main
git pull --ff-only
npm run doctor
npm run ship
ship 会检查内容、图片引用、构建结果,确认后上传 R2、提交并推送 main。推送 main 后 GitHub Actions 部署 Cloudflare Pages。
不要从 develop 直接发布生产。
多设备发布规则
- 同一时间只让一台设备执行
ship。 - 发布前必须
git pull --ff-only。 - 发布前看一眼
git status,确认没有本机临时改动混进去。 - Obsidian / iCloud 未同步完成时不发布。
- 新图片只在拥有完整
PHOTO_ROOT的设备发布。
灾难恢复顺序
如果旧设备损坏:
- 新设备 clone GitHub 仓库。
- 安装 Node 和 npm 依赖。
- 恢复 Obsidian vault。
- 创建
.cryo-blog.local.json。 - 恢复或挂载照片导出目录。
- 登录 Cloudflare 或设置 API token。
- 运行
npm run doctor。 - 运行
npm run publish:dry-run。 - 没问题后再
npm run ship。
如果只需要恢复线上网站,不需要本地照片源:
GitHub 仓库 -> GitHub Actions -> Cloudflare Pages
R2 已上传图片继续服务
备份重点
优先保护这些源头:
- RAW / Lightroom Catalog / XMP / Master。
- Lightroom
Exports/Web。 - Obsidian vault。
- GitHub 仓库。
- R2 bucket。
- Cloudflare / GitHub 账号恢复方式。
R2 是线上图片仓库,不是摄影源文件备份。RAW 和 Lightroom Catalog 仍要单独备份。