开启精彩搜索
热门搜索
emby EMBY 解析 免流 源码 IPV6 阿里 阿里云 青龙 音乐 网心 网心云 webdav 阿里云盘 unraid 洗白 Rclone 刮削 云梦

Cloudflare Workers 从零搭建个人博客(CF-blog 完整部署教程)

本文记录我从零开始,用 Cloudflare Workers + D1 数据库搭建一个完整个人博客的全过程。包括:环境准备、数据库创建、敏感信息用 Secrets 管理、后台使用等。适合有一定命令行基础、想白嫖 Cloudflare 免费额度的朋友。


一、为什么选 Cloudflare Workers

  • 免费额度足够个人博客:每天 10 万次请求,个人站点根本用不完
  • 无需服务器:不用买 VPS,不用管运维
  • 全球 CDN 加速:Cloudflare 全球节点,访问速度快
  • 自带数据库:D1(基于 SQLite)免费 5GB 存储
  • 自带域名xxx.workers.dev 免费子域名,也可以绑自己的域名

二、准备工作

在开始之前,确保你有:

项目 说明
Cloudflare 账号 注册地址:https://dash.cloudflare.com/sign-up (免费)
一个域名 托管在 Cloudflare(可选,用 workers.dev 也行)
Node.js 18 以上版本,下载:https://nodejs.org/
代码编辑器 VSCode 推荐
命令行 Windows PowerShell / Git Bash / Mac Terminal 均可

三、安装 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';"

应该看到 articlessystem_configcomments 三张表。


六、敏感信息改用 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

  1. 访问 https://dash.cloudflare.com/profile/api-tokens
  2. 点「创建令牌」→「创建自定义令牌」
  3. 权限添加:区域 → 缓存清除 → 清除
  4. 区域资源:选择你的域名
  5. 创建后立刻复制 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 就能看到博客首页了。


八、绑定自定义域名

  1. 登录 Cloudflare 后台
  2. 进入 Workers & Pages → 点 cfblog
  3. 设置域和路由添加自定义域
  4. 输入你的域名(如 blog.example.com
  5. 点「添加域」,如果域名在同账号会自动配置 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| 是图标前缀,支持 homebooklistmonitorfoldercloudcaplinktag

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

十二、安全建议

  1. 必须改默认密码ADMIN_PASSWORD 别用默认的
  2. SESSION_SECRET 用随机值openssl rand -hex 32
  3. 敏感信息用 Secret:密码、Token 一律 wrangler secret put
  4. 不要提交 .dev.vars:加进 .gitignore
  5. .wrangler/ 目录不要提交:包含本地状态
  6. 定期备份 D1wrangler d1 export

十三、进阶玩法

  • 文章加密:后台编辑文章时设置「文章访问密码」
  • 评论可见:文章内用 #reply]内容#/reply] 包裹,评论后才显示
  • 折叠块:文章内用 #collapse=标题]内容#/collapse]
  • 自定义分类样式:修改代码里的 CATEGORY_STYLE 对象
  • 绑定自定义域名:见第八节

🔒
评论后可见
本条内容需要评论一次才能查看
去评论 ↓

十四、总结

整个流程可以概括为:

  1. 装 wranglernpm install -g wrangler && wrangler login
  2. 建 D1wrangler d1 create cfblog-db + 执行 schema.sql
  3. 改代码 → 敏感信息走环境变量
  4. 写 Secretswrangler secret put ADMIN_PASSWORD
  5. 部署wrangler deploy
  6. 绑域名 → Cloudflare 后台操作
  7. 登录后台 → 配置分类、菜单、幻灯片
  8. 写文章 → 发布站点

整个部署过程不到半小时,免费额度够个人博客用很久。

💬 评论区 0