基于 Typecho 完整重写的现代博客系统,运行在 Astro + Cloudflare Workers + D1 之上。保留 Typecho 数据库表结构,支持从 PHP 版 Typecho 直接迁移数据。
前台:文章列表 / 分类 / 标签 / 作者 / 搜索归档、嵌套评论(Gravatar 头像)、RSS 2.0 / Atom 1.0 / RSS 1.0、文章密码保护、响应式默认主题
管理后台:文章 & 页面编辑管理、评论审核、媒体管理(R2 拖放上传)、用户管理(5 种角色)、主题切换、插件管理(启用/禁用/配置)、全站设置、安装向导
系统:主题系统(npm 包分发)、插件系统(Hook 机制,50+ 挂载点)、PHP 版 Typecho 数据迁移工具、SHA-256 + salt 认证
- Node.js 18+
- pnpm(
npm install -g pnpm) - Wrangler CLI(
npm install -g wrangler) - Cloudflare 帐号
# 克隆并安装依赖
git clone https://github.com/eslizn/typecho-cf.git
cd typecho-cf
pnpm install
# 启动开发服务器(D1 + R2 由 wrangler 自动模拟)
pnpm run dev访问 http://localhost:4321,首次访问自动跳转安装向导。
1. 创建 Cloudflare 资源
# 创建 D1 数据库
wrangler d1 create typecho-cf-db
# 创建 R2 存储桶
wrangler r2 bucket create typecho-cf-uploads2. 更新 wrangler.toml
将 database_id 替换为上一步输出的 D1 数据库 ID:
[[d1_databases]]
binding = "DB"
database_name = "typecho-cf-db"
database_id = "替换为实际的 ID"3. 构建并部署
pnpm run deploy部署完成后访问 Worker URL,首次访问自动跳转安装向导。
| 命令 | 说明 |
|---|---|
pnpm run dev |
本地开发服务器 |
pnpm run build |
生产构建 |
pnpm run deploy |
构建 + 部署到 Cloudflare Workers |
pnpm run test |
运行所有测试 |
pnpm run test:watch |
监听模式运行测试 |
pnpm run test:coverage |
生成覆盖率报告 |
pnpm run db:generate |
生成 Drizzle 数据库迁移 |
pnpm run db:studio |
启动 Drizzle Studio |
pnpm run db:migrate:local |
迁移 PHP Typecho 数据到本地 |
pnpm run db:migrate:cloudflare |
迁移 PHP Typecho 数据到 Cloudflare D1 |
pnpm run db:migrate:dry-run |
预览迁移(不写入) |
pnpm run reset-password |
重置用户密码(本地) |
pnpm run reset-password:cloudflare |
重置用户密码(Cloudflare) |
# 迁移到 Cloudflare(生产环境)
pnpm run db:migrate:cloudflare \
--source /path/to/typecho.db \
--uploads /path/to/usr/uploads
# 迁移到本地(开发调试)
pnpm run db:migrate:local \
--source /path/to/typecho.db \
--uploads /path/to/usr/uploads
# 预览模式(不写入任何数据)
pnpm run db:migrate:dry-run \
--source /path/to/typecho.db \
--uploads /path/to/usr/uploads| 参数 | 说明 | 默认值 |
|---|---|---|
--source, -s |
源 SQLite 数据库路径 | (必填) |
--uploads, -u |
源 usr/uploads/ 目录 |
(必填) |
--prefix |
源表前缀 | typecho_ |
--dry-run, -n |
预览模式 | false |
--site-url |
新站点 URL(用于重写附件 URL) | — |
--d1-name |
D1 数据库名 | typecho-cf-db |
--r2-bucket |
R2 存储桶名 | typecho-cf-uploads |
密码哈希算法不兼容(PHP phpass → SHA-256 + salt),迁移后需重置密码:
# 本地
pnpm run reset-password
# Cloudflare
pnpm run reset-password:cloudflare参考 插件开发规范。
参考 主题开发规范。
| 组件 | 技术 |
|---|---|
| 框架 | Astro 6.x (SSR) |
| 运行时 | Cloudflare Workers |
| 数据库 | Cloudflare D1 (SQLite) |
| ORM | Drizzle ORM |
| 文件存储 | Cloudflare R2 |
| 测试 | Vitest |
| 包管理 | pnpm |
| 方面 | 状态 |
|---|---|
| 数据库结构 | ✅ 完全兼容,可直接导入 SQLite 数据库 |
| 默认主题样式 | ✅ CSS & HTML 结构保持一致 |
| URL 结构 | ✅ 路由规则与 Typecho 默认配置一致 |
| 密码哈希 | |
| PHP 主题 / 插件 | ❌ 需按新格式重新封装(TypeScript / npm 包) |
MIT