← 返回首页

(自开发)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. 域名:建议绑定自定义域名(如 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)

暂无评论,快来抢沙发吧!

发表评论