(自开发)Cloudflare Workers 博客系统部署方案
# Cloudflare Workers 博客系统部署方案 (完整版)
本博客系统基于 Cloudflare Workers 无服务器架构运行,具有高安全性、高可用性和低延迟的特点。
核心功能:
1. 内容管理:支持文章发布、编辑、删除,支持 Markdown 语法。
2. 分类系统:支持文章分类,包含“随心说”(类似说说/推特)和常规文章。
3. 评论系统:支持访客评论,集成 Cloudflare Turnstile 人机验证,具备 IP 频率限制。
4. 加密访问:支持对单篇文章设置访问密码,使用 PBKDF2 强哈希算法保护密码。
5. 文件存储:集成 R2 存储,支持图片上传(自动魔术字节校验、大小限制)。
6. 数据迁移:
* 全站备份/恢复(JSON 格式)。
* 单篇文章导出(Markdown 格式,含 YAML Front Matter)。
7. 安全加固:
* 管理员密码 PBKDF2 哈希存储 + 自动升级。
* 全站 CSP 头、CSRF Token 防护。
* 严格的 XSS 过滤。
* 后台操作强制 POST 请求 + CSRF 校验。
---
1. Cloudflare 账号:需拥有一账号,并开通 Workers 服务。
2. 域名:建议绑定自定义域名(如
3. 编辑器:推荐使用 VS Code 安装 Cloudflare Workers 插件,或直接使用 Cloudflare Dashboard(网页控制台)。
---
这是博客的数据核心,存储文章、评论和分类。
1. 登录 Cloudflare Dashboard。
2. 在左侧导航栏选择 Workers & Pages > D1 SQL Database。
3. 点击 Create database。
4. 输入数据库名称,例如:
5. 点击 Create。
6. 创建成功后,记录下 Database ID(稍后绑定要用)。
执行数据库初始化代码:
在数据库创建页面,点击 Console 按钮,依次执行以下 SQL 语句建立表结构:
-- 1. 创建分类表
CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
slug TEXT
);
-- 2. 创建文章表
-- 字段说明:type区分文章/说说,password为文章访问密码(哈希值)
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
content TEXT,
cover_image TEXT,
category_id INTEGER,
password TEXT,
type TEXT DEFAULT 'post',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 3. 创建评论表
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
post_id INTEGER,
author_name TEXT,
content TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
KV 用于存储系统配置(站点名称、管理员密码哈希、Session 等)。
1. 在左侧导航栏选择 Workers & Pages > KV。
2. 点击 Create a namespace。
3. 输入名称,例如:
4. 点击 Add。
5. 记录下生成的 Namespace ID。
用于存储上传的图片。
1. 在左侧导航栏选择 R2 Object Storage。
2. 点击 Create bucket。
3. 输入 Bucket 名称,例如:
4. 点击 Create bucket。
5. 记录下 Bucket 名称。
6. 重要设置:点击创建好的 Bucket,进入 Settings,找到 Public access。
* 不要开启 "Public Access" 开关(保持关闭状态)。
* 本系统通过 Worker 代码鉴权后代理访问图片,更加安全且可控。
1. 在左侧导航栏选择 Workers & Pages > Overview。
2. 点击 Create Worker。
3. 给 Worker 起个名字,例如:
4. 点击 Deploy(先部署默认代码,下一步再替换)。
配置绑定:
在 Worker 详情页面,点击 Settings > Variables and Secrets:
1. D1 Database Binding:
* Variable name:
* 选择刚才创建的
2. KV Namespace Binding:
* Variable name:
* 选择刚才创建的
3. R2 Bucket Binding:
* Variable name:
* 选择刚才创建的
(注意:Variable name 必须与代码中的
1. 点击 Worker 详情页右上角的 Quick Edit。
2. 删除编辑器里的所有默认代码。
3. 将之前生成的完整 JavaScript 代码粘贴进去。
4. 点击 Save and Deploy。
---
部署完成后,你需要进入 Cloudflare Dashboard 的 KV 管理界面,手动添加初始配置项,否则系统无法登录。
进入 KV > 选择
| Key (键) | Value (值) | 说明 |
| :--- | :--- | :--- |
|
|
|
|
|
|
|
|
关于
* 首次登录策略:你可以直接在 KV 中填写明文密码(如
* 自动升级:当你第一次成功登录后台后,系统会自动检测到明文密码,并将其升级为 PBKDF2 强哈希值存储。之后 KV 中的值会变成类似
* 建议:登录成功后,建议不要在 KV 中保留明文密码,直接让系统自动升级即可。
关于
* 支持 HTML 标签。例如:
---
1. 在 Worker 详情页,点击 Triggers 标签。
2. 在 Custom Domains 部分,点击 Add Custom Domain。
3. 输入你的域名(如
4. Cloudflare 会自动帮你添加 DNS 记录并申请 SSL 证书。
---
* 后台地址:
* 发布文章:支持 Markdown 编辑器,支持图片拖拽上传。
* 数据管理:
* 导出备份:点击后台顶部的“数据备份”区域,可导出 JSON 全量备份。
* 导入备份:点击“导入备份”,上传之前导出的 JSON 文件即可恢复。
* MD 导出:在文章列表点击“MD”按钮,可下载单篇文章 Markdown 文件。
* 缓存刷新:后台首页右侧有“刷新缓存”按钮,用于手动清除 Cloudflare 边缘节点的 HTML 缓存(建议发布文章后点击一次)。
---
1. CSRF 防护:后台所有 POST 请求(发布、删除、更新)均强制校验 CSRF Token,防止跨站请求伪造。
2. 密码存储:管理员密码与文章访问密码均使用 PBKDF2 (SHA-256, 100,000次迭代) 哈希存储。
3. 路由优先级:文章密码验证路由 (
4. 文件上传:
* 限制文件大小 (5MB)。
* 校验文件头魔术字节,防止伪造扩展名攻击。
5. 缓存策略:
* HTML 页面:浏览器缓存 1 小时,边缘缓存 1 天。
* R2 图片:缓存 1 年。
一、 系统功能概览
本博客系统基于 Cloudflare Workers 无服务器架构运行,具有高安全性、高可用性和低延迟的特点。
核心功能:
1. 内容管理:支持文章发布、编辑、删除,支持 Markdown 语法。
2. 分类系统:支持文章分类,包含“随心说”(类似说说/推特)和常规文章。
3. 评论系统:支持访客评论,集成 Cloudflare Turnstile 人机验证,具备 IP 频率限制。
4. 加密访问:支持对单篇文章设置访问密码,使用 PBKDF2 强哈希算法保护密码。
5. 文件存储:集成 R2 存储,支持图片上传(自动魔术字节校验、大小限制)。
6. 数据迁移:
* 全站备份/恢复(JSON 格式)。
* 单篇文章导出(Markdown 格式,含 YAML Front Matter)。
7. 安全加固:
* 管理员密码 PBKDF2 哈希存储 + 自动升级。
* 全站 CSP 头、CSRF Token 防护。
* 严格的 XSS 过滤。
* 后台操作强制 POST 请求 + CSRF 校验。
---
二、 环境准备
1. Cloudflare 账号:需拥有一账号,并开通 Workers 服务。
2. 域名:建议绑定自定义域名(如
blog.yourdomain.com),也可使用 *.workers.dev 测试域名。
3. 编辑器:推荐使用 VS Code 安装 Cloudflare Workers 插件,或直接使用 Cloudflare Dashboard(网页控制台)。
---
三、 详细部署步骤
步骤 1:创建 D1 数据库
这是博客的数据核心,存储文章、评论和分类。
1. 登录 Cloudflare Dashboard。
2. 在左侧导航栏选择 Workers & Pages > D1 SQL Database。
3. 点击 Create database。
4. 输入数据库名称,例如:
blog-db。
5. 点击 Create。
6. 创建成功后,记录下 Database ID(稍后绑定要用)。
执行数据库初始化代码:
在数据库创建页面,点击 Console 按钮,依次执行以下 SQL 语句建立表结构:
`sql
-- 1. 创建分类表
CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
slug TEXT
);
-- 2. 创建文章表
-- 字段说明:type区分文章/说说,password为文章访问密码(哈希值)
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
content TEXT,
cover_image TEXT,
category_id INTEGER,
password TEXT,
type TEXT DEFAULT 'post',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 3. 创建评论表
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
post_id INTEGER,
author_name TEXT,
content TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
`
步骤 2:创建 KV 命名空间
KV 用于存储系统配置(站点名称、管理员密码哈希、Session 等)。
1. 在左侧导航栏选择 Workers & Pages > KV。
2. 点击 Create a namespace。
3. 输入名称,例如:
blog-config。
4. 点击 Add。
5. 记录下生成的 Namespace ID。
步骤 3:创建 R2 存储桶
用于存储上传的图片。
1. 在左侧导航栏选择 R2 Object Storage。
2. 点击 Create bucket。
3. 输入 Bucket 名称,例如:
blog-images。
4. 点击 Create bucket。
5. 记录下 Bucket 名称。
6. 重要设置:点击创建好的 Bucket,进入 Settings,找到 Public access。
* 不要开启 "Public Access" 开关(保持关闭状态)。
* 本系统通过 Worker 代码鉴权后代理访问图片,更加安全且可控。
步骤 4:创建 Worker 服务并绑定资源
1. 在左侧导航栏选择 Workers & Pages > Overview。
2. 点击 Create Worker。
3. 给 Worker 起个名字,例如:
my-blog。
4. 点击 Deploy(先部署默认代码,下一步再替换)。
配置绑定:
在 Worker 详情页面,点击 Settings > Variables and Secrets:
1. D1 Database Binding:
* Variable name:
DB
* 选择刚才创建的
blog-db。
2. KV Namespace Binding:
* Variable name:
CONFIG
* 选择刚才创建的
blog-config。
3. R2 Bucket Binding:
* Variable name:
BUCKET
* 选择刚才创建的
blog-images。
(注意:Variable name 必须与代码中的
env.DB, env.CONFIG, env.BUCKET 完全一致)
步骤 5:部署代码
1. 点击 Worker 详情页右上角的 Quick Edit。
2. 删除编辑器里的所有默认代码。
3. 将之前生成的完整 JavaScript 代码粘贴进去。
4. 点击 Save and Deploy。
---
四、 系统初始化配置
部署完成后,你需要进入 Cloudflare Dashboard 的 KV 管理界面,手动添加初始配置项,否则系统无法登录。
进入 KV > 选择
blog-config > 点击 Add entry,依次添加以下键值对:
| Key (键) | Value (值) | 说明 |
| :--- | :--- | :--- |
|
site_name | 我的博客 | 网站名称 |
|
site_desc | 记录生活与技术 | 网站简介 |
|
footer_text | Powered by Cloudflare Workers | 网站底部版权文字 |
|
admin_user | admin | 管理员登录用户名 |
|
admin_pass | 请设置一个强密码 | 初始密码 (见下文说明) |
|
page_size | 10 | 每页显示文章数 |
|
turnstile_site_key | (留空) | Turnstile 网站密钥(可选,用于评论验证) |
|
turnstile_secret_key | (留空) | Turnstile 密钥(可选) |
关于
admin_pass 的安全说明:
* 首次登录策略:你可以直接在 KV 中填写明文密码(如
MyFirstPassword123!)。
* 自动升级:当你第一次成功登录后台后,系统会自动检测到明文密码,并将其升级为 PBKDF2 强哈希值存储。之后 KV 中的值会变成类似
100000:xxxx:xxxx 的格式,这代表密码已加密。
* 建议:登录成功后,建议不要在 KV 中保留明文密码,直接让系统自动升级即可。
关于
footer_text:
* 支持 HTML 标签。例如:
Copyright © 2024 <a href="/">My Blog</a>。
---
五、 域名绑定
1. 在 Worker 详情页,点击 Triggers 标签。
2. 在 Custom Domains 部分,点击 Add Custom Domain。
3. 输入你的域名(如
blog.example.com)。
4. Cloudflare 会自动帮你添加 DNS 记录并申请 SSL 证书。
---
六、 后台操作指南
* 后台地址:
https://你的域名/admin
* 发布文章:支持 Markdown 编辑器,支持图片拖拽上传。
* 数据管理:
* 导出备份:点击后台顶部的“数据备份”区域,可导出 JSON 全量备份。
* 导入备份:点击“导入备份”,上传之前导出的 JSON 文件即可恢复。
* MD 导出:在文章列表点击“MD”按钮,可下载单篇文章 Markdown 文件。
* 缓存刷新:后台首页右侧有“刷新缓存”按钮,用于手动清除 Cloudflare 边缘节点的 HTML 缓存(建议发布文章后点击一次)。
---
七、 安全机制说明
1. CSRF 防护:后台所有 POST 请求(发布、删除、更新)均强制校验 CSRF Token,防止跨站请求伪造。
2. 密码存储:管理员密码与文章访问密码均使用 PBKDF2 (SHA-256, 100,000次迭代) 哈希存储。
3. 路由优先级:文章密码验证路由 (
/verify/) 已与后台管理路由解耦,访客解锁文章不会被误拦截。
4. 文件上传:
* 限制文件大小 (5MB)。
* 校验文件头魔术字节,防止伪造扩展名攻击。
5. 缓存策略:
* HTML 页面:浏览器缓存 1 小时,边缘缓存 1 天。
* R2 图片:缓存 1 年。
评论 (0)
发表评论