极简付费博客。Hugo 静态站 + Notion/FlowUs 数据源 + 边缘函数付费墙。客户端零 JavaScript,首屏就是浏览器默认样式下的 HTML,参考 1986 年的网页。
- 个人作者要一个付费文章系统,不想给 Substack / 知识星球交分成
- 国内访问要快(EdgeOne 境内节点 30-80ms TTFB)
- 海外访问要能用(Cloudflare Pages 免费档)
- 5 年不改代码:选型都是单二进制、单文件、无框架运行时
作者 → Notion 或 FlowUs 里写文章(打 paid / price / preview 字段)
↓
GitHub Action 定时拉取
↓
scripts/prebuild-*.mjs → content/posts/*.md (带 <!--more--> 标记)
↓
Hugo 构建 → public/ (纯 HTML,~1KB 首屏)
↓
双端部署
├─ Cloudflare Pages (海外, 免费)
└─ EdgeOne Pages (境内, ¥28/月, 需备案)
读者访问付费文章
↓
边缘函数 functions/_middleware.js
├─ 未登录 → 直接返回预览 + 付费墙 HTML
├─ 已登录 → 查边缘 KV 是否购买
│ ├─ 已购 → splice 全文进 HTML
│ └─ 未购 → 保留付费墙
└─ 整个过程 0 回源,0 客户端 JS
6892872/
hugo.toml # 站点配置
bin/hugo # Hugo 0.160.1 extended (本地开发用, git ignored)
layouts/ # 1986 风主题(这就是"主题",没有 themes/ 目录)
_default/
baseof.html # 基础 HTML 骨架
single.html # 文章页
list.html # 归档/标签列表
index.html # 首页
partials/
paywall.html # 付费墙 UI(form)
content/
posts/_index.md # 归档页元数据
posts/*.md # 文章(通常由 prebuilder 生成)
scripts/
package.json
prebuild-notion.mjs # Notion → Markdown 导出
prebuild-flowus.mjs # FlowUs → Markdown 导出(stub)
functions/ # CF Pages / EdgeOne Pages Functions
_middleware.js # 付费墙拦截与注入
api/
pay.js # POST 创建订单 → 支付重定向
pay-callback.js # 支付完成回调 → 写 KV + set cookie
login.js # OAuth 登录入口(dmxapi SSO)
.github/workflows/deploy.yml # CI/CD:拉数据 → build → 双端发布
title: "..." # 必填
slug: "..." # 必填(若 prebuilder 生成则来自 Notion/FlowUs 的 Slug 字段)
date: 2026-04-20 # 必填
tags: [...] # 可选
paid: true # 是否付费文章
price: 3 # 单位元,paid=true 时必填
preview_paragraphs: 2 # 免费预览段数;prebuilder 据此插入 <!--more-->./bin/hugo server -D # 开发服务器,带 draft
./bin/hugo # 一次性构建到 public/cd scripts
npm install
NOTION_TOKEN=secret_xxx NOTION_DATABASE_ID=xxx npm run notion
# 或
FLOWUS_TOKEN=xxx FLOWUS_DATABASE_ID=xxx npm run flowus注意:目前两个 prebuilder 的
fetchPages()都是 stub,等 Notion/FlowUs 开放 API 文档确认后补实现。interface 已定稳,不会再动。
- 在 CF Pages 新建项目,连 GitHub 仓库
- 构建命令:
cd scripts && npm ci && npm run notion && cd .. && hugo --minify - 输出目录:
public - 环境变量 / Secrets:
NOTION_TOKEN,NOTION_DATABASE_IDDMXAPI_BASE,DMXAPI_SERVICE_TOKEN,DMXAPI_CLIENT_ID
- KV 绑定:创建
PURCHASESnamespace,绑定到 Pages - 自定义域:
6892872.xyz(不备案)
- 注册
.com域名 → 个人备案(3-4 周) - EdgeOne 控制台新建 Pages 项目,连同一 GitHub 仓库
- 同样的构建命令 / 环境变量
- EdgeOne KV:创建
PURCHASESKV 空间 - 自定义域:
6892872.com(备案完成后绑定) - DNS 分流:用 DNSPod 智能解析,境内线路 CNAME → EdgeOne,海外线路 CNAME → CF
通过 repository variable DATA_SOURCE 控制用哪个数据源(notion 或 flowus)。海外实例设 notion,境内实例设 flowus,作者把两个数据库保持同步即可。
| 项 | 月成本 |
|---|---|
| EdgeOne Pages 基础版 | ¥28 |
| Cloudflare Pages | ¥0 |
| 域名 .com | ¥5 |
| 备案 | ¥0 |
| 边缘 KV | 含在套餐 |
| Postgres | ¥0(复用外部账户系统) |
| 合计 | ¥33/月 |
- M0 骨架(Hugo + 1986 主题 + prebuilder 接口 + 边缘函数 stub)
- M2.a 共享 block→Markdown 翻译器(Notion + FlowUs)
- M2.b FlowUs HTTP 客户端 +
fetchPages()实装 - M1 Notion
fetchPages()实装 - M3 边缘函数接入 dmxapi 账户系统(支付 + SSO + 购买校验)
- M4 双部署流水线实装(CF + EdgeOne)
- M5 备案 + 境内上线
浏览器默认 Times 衬线字体,默认蓝色下划线链接,默认白底黑字,<hr> 做分隔。没有 CSS,没有 JS,没有字体加载,没有图片懒加载,没有 hydration。一篇文章的 HTML 大小 < 3KB。这是 1986 年网页的朴素美学,也是目前技术栈下能做到的最低加载延迟。
- tangly1024/NotionNext — 本项目数据层设计的灵感来源,未采用其 Next.js 渲染栈
- gohugoio/hugo — 静态站构建器
源代码按 PolyForm Noncommercial 1.0.0 发布。
- 个人博客,自娱自乐、学习研究、非商业爱好
- 学术/慈善/公共研究/政府机构使用
- 在上述范围内随便 fork、改、再发布(保留版权声明即可)
- 免费档单实例文章数建议 ≤ 100 篇(超过视为达到商业规模)
包括但不限于:
- 运行带付费订阅/会员的商业博客
- 把本项目打包成产品或 SaaS 销售/分发
- 任何营利主体内部使用
- 启用
functions/api/下的支付/SSO 集成模块 - 单实例发表超过 100 篇文章(不论是否直接营利)
商业 License 联系:license@6892872.com(域名启用后生效)
商业档解锁:不限文章数 / 支付模块可用 / 去除底栏署名 / 优先响应。
- Hugo 按 Apache 2.0 使用,作为构建工具而非源码分发
- 未引入 NotionNext 任何代码,仅在架构思路上致敬
- FlowUs 文档以自己语言改写归档在
docs/,FlowUs 版权归 FlowUs 所有