目标

恢复分两层:

  • 网站构建能力:能 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 login
  • CLOUDFLARE_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 的设备发布。

灾难恢复顺序

如果旧设备损坏:

  1. 新设备 clone GitHub 仓库。
  2. 安装 Node 和 npm 依赖。
  3. 恢复 Obsidian vault。
  4. 创建 .cryo-blog.local.json
  5. 恢复或挂载照片导出目录。
  6. 登录 Cloudflare 或设置 API token。
  7. 运行 npm run doctor
  8. 运行 npm run publish:dry-run
  9. 没问题后再 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 仍要单独备份。