本文记录我从零开始,用 Cloudflare Workers + D1 数据库搭建一个完整个人博客的全过程。包括:环境准备、数据库创建、敏感信息用 Secrets 管理、后台使用等。适合有一定命令行基础、想白嫖 Cloudflare 免费额度的朋友。
一、为什么选 Cloudflare Workers
- 免费额度足够个人博客:每天 10 万次请求,个人站点根本用不完
- 无需服务器:不用买 VPS,不用管运维
- 全球 CDN 加速:Cloudflare 全球节点,访问速度快
- 自带数据库:D1(基于 SQLite)免费 5GB 存储
- 自带域名:
xxx.workers.dev 免费子域名,也可以绑自己的域名
二、准备工作
在开始之前,确保你有:
三、安装 Wrangler CLI
Wrangler 是 Cloudflare 官方的命令行工具。
# 全局安装
npm install -g wrangler
# 检查版本
wrangler --version
# 输出类似:wrangler 4.x.x
# 登录 Cloudflare(会打开浏览器,点「允许」)
wrangler login
# 确认登录状态
wrangler whoami
wrangler whoami 会输出你的账号名和 Account ID,记下 Account ID,后面要用。
四、创建项目结构
在本地新建文件夹,比如 D:\cfblog:
cfblog/
├── src/
│ └── index.js # 主代码
├── wrangler.toml # 配置文件
├── package.json
├── .gitignore
├── .dev.vars # 本地开发用(不提交 Git)
└── schema.sql # 数据库建表脚本
1. package.json
{
"name": "cfblog",
"version": "1.0.0",
"scripts": {
"dev": "wrangler dev",
"deploy": "wrangler deploy"
},
"devDependencies": {
"wrangler": "^3.0.0"
}
}
2. .gitignore
.dev.vars
node_modules/
.wrangler/
*.log
五、创建 D1 数据库
1. 创建数据库
wrangler d1 create cfblog-db
输出:
✅ Successfully created DB 'cfblog-db'
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
记下 database_id。
2. 配置 wrangler.toml
name = "cfblog"
main = "src/index.js"
compatibility_date = "2024-01-01"
[[d1_databases]]
binding = "CFBLOG"
database_name = "cfblog-db"
database_id = "你的-database-id"
# ========== 非敏感变量 ==========
[vars]
ADMIN_USER = "admin"
THIRD_TOKEN = "cfblog"
CACHE_ZONE_ID = "你的区域ID"
SITE_DOMAIN = "你的域名"
SESSION_MAX_AGE = "604800"
3. 创建表结构 schema.sql
-- 文章表
CREATE TABLE IF NOT EXISTS articles (
id TEXT PRIMARY KEY,
title TEXT,
img TEXT,
link TEXT,
createDate TEXT,
category TEXT,
tags TEXT,
contentMD TEXT,
contentHtml TEXT,
contentText TEXT,
priority TEXT DEFAULT '0.5',
changefreq TEXT DEFAULT 'daily',
top_timestamp INTEGER DEFAULT 0,
modify_timestamp INTEGER DEFAULT 0,
hidden INTEGER DEFAULT 0,
viewCount INTEGER DEFAULT 0,
password TEXT DEFAULT '',
comment_visible INTEGER DEFAULT 0,
updated_at TEXT
);
-- 系统配置表
CREATE TABLE IF NOT EXISTS system_config (
key TEXT PRIMARY KEY,
value TEXT,
updated_at TEXT
);
-- 评论表
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_id TEXT,
nick TEXT,
email TEXT,
website TEXT,
content TEXT,
created_at INTEGER,
ip TEXT,
user_agent TEXT,
parent_id INTEGER DEFAULT 0,
status INTEGER DEFAULT 1,
reply TEXT DEFAULT ''
);
-- 索引(加速查询)
CREATE INDEX IF NOT EXISTS idx_comments_article ON comments(article_id);
CREATE INDEX IF NOT EXISTS idx_comments_ip ON comments(ip);
4. 执行建表
# 线上生产环境
wrangler d1 execute cfblog-db --remote --file=./schema.sql
验证表是否创建成功:
wrangler d1 execute cfblog-db --remote --command "SELECT name FROM sqlite_master WHERE type='table';"
应该看到 articles、system_config、comments 三张表。
六、敏感信息改用 Secrets 管理
⚠️ 重要:不要把密码硬编码在代码里!
1. 修改代码,从环境变量读取
打开 src/index.js,找到配置区,把原来的 ACCOUNT 常量改成函数:
// ========== 从环境变量读取敏感配置 ==========
function buildAccount(env) {
return {
user: env.ADMIN_USER || "admin",
password: env.ADMIN_PASSWORD || "",
third_token: env.THIRD_TOKEN || "cfblog",
cacheZoneId: env.CACHE_ZONE_ID || "",
cacheToken: env.CACHE_TOKEN || "",
sessionSecret: env.SESSION_SECRET || "",
sessionMaxAge: parseInt(env.SESSION_MAX_AGE || "604800", 10)
};
}
// 运行时会被 handlerRequest 重新赋值
let CONFIG = { ...OPT, privateBlog: OPT.privateBlog || false };
let ACCOUNT = null;
在 handlerRequest 函数开头初始化:
async function handlerRequest(request, env, ctx) {
// ★ 运行时初始化敏感配置
ACCOUNT = buildAccount(env);
CONFIG = { ...OPT, privateBlog: OPT.privateBlog || false };
if (env.SITE_DOMAIN) CONFIG.siteDomain = env.SITE_DOMAIN;
// ★ 校验必需 secret
if (!ACCOUNT.password || !ACCOUNT.sessionSecret) {
return new Response(
'服务未正确配置:请在 Workers 中设置 ADMIN_PASSWORD 和 SESSION_SECRET 环境变量。',
{ status: 500, headers: { 'content-type': 'text/plain;charset=UTF-8' } }
);
}
const db = env.CFBLOG;
// ... 下面保持不变
}
2. 写入 Secrets
# 后台登录密码
wrangler secret put ADMIN_PASSWORD
# 输入密码,回车(不显示输入内容,正常)
# 会话签名密钥(随机字符串)
wrangler secret put SESSION_SECRET
# 输入 openssl rand -hex 32 生成的值
# Cloudflare API Token(用于清缓存)
wrangler secret put CACHE_TOKEN
# 输入从 Cloudflare 创建的 API Token
3. 获取 API Token
- 访问 https://dash.cloudflare.com/profile/api-tokens
- 点「创建令牌」→「创建自定义令牌」
- 权限添加:区域 → 缓存清除 → 清除
- 区域资源:选择你的域名
- 创建后立刻复制 Token(只显示一次)
4. 验证 Secrets
wrangler secret list
输出应该包含:
[
{ "name": "ADMIN_PASSWORD", "type": "secret_text" },
{ "name": "SESSION_SECRET", "type": "secret_text" },
{ "name": "CACHE_TOKEN", "type": "secret_text" }
]
5. 本地开发用 .dev.vars
ADMIN_USER=admin
ADMIN_PASSWORD=本地测试密码
SESSION_SECRET=本地随机串
CACHE_ZONE_ID=你的区域ID
CACHE_TOKEN=你的token
THIRD_TOKEN=cfblog
SITE_DOMAIN=你的域名
SESSION_MAX_AGE=604800
七、部署到 Cloudflare
wrangler deploy
输出类似:
Total Upload: 290.81 KiB / gzip: 60.14 KiB
Your Worker has access to the following bindings:
Binding Resource
env.CFBLOG (cfblog-db) D1 Database
env.ADMIN_USER ("admin") Environment Variable
env.SITE_DOMAIN ("你的域名") Environment Variable
...
Deployed cfblog triggers (1.31 sec)
https://cfblog.your-account.workers.dev
访问 https://cfblog.your-account.workers.dev 就能看到博客首页了。
八、绑定自定义域名
- 登录 Cloudflare 后台
- 进入 Workers & Pages → 点
cfblog - 设置 → 域和路由 → 添加 → 自定义域
- 输入你的域名(如
blog.example.com) - 点「添加域」,如果域名在同账号会自动配置 DNS
等 1-2 分钟,访问 https://blog.example.com 即可。
九、登录后台并初始化
1. 登录
访问 https://你的域名/admin/login:
- 用户名:
admin(对应 ADMIN_USER) - 密码:你
wrangler secret put ADMIN_PASSWORD 时设置的
2. 初始配置
登录后进入后台,依次配置:
| 菜单 |
内容 |
| 博客设置 |
分类、顶部菜单(JSON 格式) |
| 首页幻灯片 |
首页轮播图(JSON 数组) |
| 友情链接 |
添加友链 |
| 新建文章 |
开始写作 |
3. 分类示例
["经验分享", "干货分享", "软件分享", "收集整理"]
4. 顶部菜单示例
[
{"title": "home|首页", "url": "/"},
{"title": "book|经验分享", "url": "/category/经验分享"},
{"title": "link|关于本站", "url": "/article/000001.html"}
]
home| 是图标前缀,支持 home、book、list、monitor、folder、cloud、cap、link、tag。
5. 幻灯片示例
[
{"img": "https://example.com/1.jpg", "url": "https://example.com"},
{"img": "https://example.com/2.jpg", "url": "https://example.com"}
]
6. 写完文章记得「发布站点」
后台 → 发布站点 → 「立即发布」,清一次缓存,前台才会生效。
十、数据库备份与恢复
导出备份
wrangler d1 export cfblog-db --remote --output=./backup.sql
恢复数据
wrangler d1 execute cfblog-db --remote --file=./backup.sql
清空数据
# 只清数据,保留表结构
wrangler d1 execute cfblog-db --remote --command "DELETE FROM articles; DELETE FROM system_config; DELETE FROM comments;"
彻底重置
# 删表
wrangler d1 execute cfblog-db --remote --command "DROP TABLE IF EXISTS articles; DROP TABLE IF EXISTS system_config; DROP TABLE IF EXISTS comments;"
# 重建表
wrangler d1 execute cfblog-db --remote --file=./schema.sql
十一、常用命令速查
# 本地开发预览
wrangler dev
# 部署
wrangler deploy
# 查看实时日志
wrangler tail
# 列出 Secrets
wrangler secret list
# 删除 Secret
wrangler secret delete ADMIN_PASSWORD
# 查看当前登录账号
wrangler whoami
# D1 查询
wrangler d1 execute cfblog-db --remote --command "SELECT COUNT(*) FROM articles;"
# D1 导出
wrangler d1 export cfblog-db --remote --output=./backup.sql
# D1 导入
wrangler d1 execute cfblog-db --remote --file=./backup.sql
十二、安全建议
- 必须改默认密码:
ADMIN_PASSWORD 别用默认的 SESSION_SECRET 用随机值:openssl rand -hex 32- 敏感信息用 Secret:密码、Token 一律
wrangler secret put - 不要提交
.dev.vars:加进 .gitignore .wrangler/ 目录不要提交:包含本地状态- 定期备份 D1:
wrangler d1 export
十三、进阶玩法
- 文章加密:后台编辑文章时设置「文章访问密码」
- 评论可见:文章内用
#reply]内容#/reply] 包裹,评论后才显示 - 折叠块:文章内用
#collapse=标题]内容#/collapse] - 自定义分类样式:修改代码里的
CATEGORY_STYLE 对象 - 绑定自定义域名:见第八节
🔒
评论后可见
本条内容需要评论一次才能查看
去评论 ↓
十四、总结
整个流程可以概括为:
- 装 wrangler →
npm install -g wrangler && wrangler login - 建 D1 →
wrangler d1 create cfblog-db + 执行 schema.sql - 改代码 → 敏感信息走环境变量
- 写 Secrets →
wrangler secret put ADMIN_PASSWORD 等 - 部署 →
wrangler deploy - 绑域名 → Cloudflare 后台操作
- 登录后台 → 配置分类、菜单、幻灯片
- 写文章 → 发布站点
整个部署过程不到半小时,免费额度够个人博客用很久。
🔒
评论后可见
本文需要评论一次才能查看完整内容。
请先发表一条评论,然后返回本页即可查看。
去评论 ↓
💬 评论区 0