EmDash CMS 自托管 Node 部署参考

在你自己的基础设施上运行 EmDash,从 SQLite 渐进到 PostgreSQL 与对象存储。

何时选自托管

在运营、合规或架构约束下选自托管:

  • 数据驻留要求严格
  • 你已在内部运行共享平台服务
  • 需要完全控制运行时、进程模型与网络路径
  • 早期希望避免与托管云强耦合

自托管并不自动更便宜,通常更可控

推荐的渐进模型

不要一上来就最大复杂度,分阶段推进:

  1. Node.js + SQLite + 本地文件存储
  2. PostgreSQL,以保障多实例安全与更强持久性
  3. S3 兼容对象存储,提升媒体可移植性
  4. 进程监管与可观测性加固

该顺序在保持清晰生产路径的同时,尽量减小迁移冲击。

基线架构(阶段 1)

单节点生产或早期上线:

  • 应用运行时:Node 适配器(standalone
  • 数据库:持久盘上的 SQLite 文件
  • 媒体:本地上传目录
  • 反向代理:Nginx 或 Caddy

该配置足以支撑低至中等编辑负载、单运行时实例。

# Production build and run
npm install
npm run build
npm run start

阶段 2 升级标准(迁到 PostgreSQL)

在出现以下任一情况时升级数据库:

  • 并发写争用变得频繁
  • 备份/恢复目标超出文件拷贝策略
  • 需要更安全的多实例部署

在增加应用水平扩展前使用 PostgreSQL。在 SQLite 上扩多个应用节点会迅速带来运维风险。

存储策略:本地文件与对象存储

本地文件(从这里开始)

适合单实例环境、存储增长可预测。

S3 兼容对象存储(为扩展迁到这里)

在以下情况使用:

  • 多个应用实例需要共享媒体访问
  • 备份与灾备需要标准化
  • CDN 与边缘缓存策略依赖稳定的对象 URL

私有基础设施上可用 MinIO 提供 S3 兼容行为。

运行时进程与代理基线

进程管理

任选其一:

  • Linux 上用 systemd 做原生服务控制
  • 团队需要进程指标与快速重启时用 pm2

反向代理

在代理处终结 TLS 并转发到 Node 应用:

  • 保留 HostX-Forwarded-*
  • 配置健康检查路径
  • 设置与上传策略一致的正文大小限制

备份与恢复策略

把备份策略视为上线阻塞项,而非上线后任务。

最低基线:

  • 按计划做数据库快照
  • 媒体存储备份或复制
  • 在公开发布前至少做一次恢复演练

从未在测试中恢复过的备份只是传言,不是控制措施。

运维就绪清单

在生产切换前确认:

  • 冷启动无需手工改配置即可工作
  • 应用日志已集中且可检索
  • 5xx 告警已启用
  • 磁盘用量与存储增长已监控
  • 密钥轮换流程已文档化

从面向 Cloudflare 的搭建迁移的说明

若项目最初按 Cloudflare 假设搭建:

  • 从运行时配置中移除仅适用于云的绑定
  • 将 D1/R2 适配器替换为 Node 兼容的数据库与存储适配器
  • 在反向代理后重新校验认证与回调 URL

迁移风险主要在环境假设,而非页面级代码。

团队决策框架

使用这条规则:

  • 若需要速度与最少运维,优先托管云路径
  • 若需要控制力与现有基础设施集成,优先自托管路径

每个环境选定一个默认路径。混合部署可行,但会增加认知负担与支持成本。