EdgeKey 是一套有vike框架开发,可直接部署到 Cloudflare 的一体化全栈卡密商城系统:同一套代码同时包含前端页面、SSR 渲染、后端 API / 数据变更入口,并由 Cloudflare Workers 运行。
- 🚀 真正的零成本 — 不用购买服务器和域名,基于 Cloudflare 全球边缘网络运行。一键部署,即刻上线。把钱花在刀刃上,把时间还给自己。
- 🌍 零成本运维 — 基于 Workers + D1,免费额度足够满足日常运营,无需担心额外的账单扣费。
- 🛍️ 商品管理 — 支持分类、商品上下架、库存模式(有限/无限)、最小/最大购买数量。
- 🔑 卡密管理 — 批量导入卡密,支付后自动发货,支持库存实时预警。
- 📦 订单管理 — 包含订单列表、手动补发、自动关闭过期订单及详细的支付日志。
- 💳 多支付网关 — 内置 BEpusdt (USDT)、Epay (聚合支付),支持插件式扩展更多接口。
- 📧 邮件通知 — 支持 SMTP / API / Cloudflare Email 三种通道,内置详细的邮件发送日志。
- ⚙️ 站点设置 — 灵活配置站点名称、Logo、公告及客服联系方式。
- 🔐 管理后台 — 安全可靠的管理员账号体系。
Tip
关于 0 成本运行: 在配合支付渠道(usdt、自建等)、个人邮箱 SMTP 以及免费图床的理想状态下,本项目可实现 100% 零成本 运营。
本项目支持三种部署方式,按推荐程度排序:
| 方式 | 适合场景 | 便捷程度 |
|---|---|---|
| 一键部署(推荐) | 首次部署,无需本地环境 | ⭐⭐⭐ 最简单,点击按钮全自动完成 |
| Git 自动部署 | 持续迭代,代码推送自动更新 | ⭐⭐ 配置一次后全自动 |
| 手动部署 | 二开需求,细节掌控 | ⭐ 需要本地环境和命令行操作 |
详细步骤见下方各章节说明。
点击按钮后,会打开 Cloudflare Workers 部署向导,操作提示:
- 登录并授权 Git 账户(github、gitlab),它会自动在你的git账号创建一个新仓库。
- 为了增强安全性,请在向导中修改默认的密钥(
AUTH_SECRET)。- 如果你不绑定已有的D1数据库,它会自动完成新建数据库并初始化数据(管理员账号等)的操作,无需手动干预。
- 部署成功之后在页面的日志里面可以找到 "Deployed edgekey triggers (0.38 sec) https://edgekey.你的账号.workers.dev" 这样的日志,其中 "https://edgekey.你的账号.workers.dev" 就是你的项目网址。
- https://edgekey.你的账号.workers.dev/admin 为管理后台登陆地址,默认管理员账号:admin,密码:admin123456,切记登陆后立即修改密码!
如果你使用 Cloudflare Workers 的 Git 集成(连接 GitHub/GitLab 仓库自动部署),需要先完成以下前置步骤:
0. 前置:在 Cloudflare Dashboard 创建 D1 数据库
- 进入 dash.cloudflare.com → Storage & Databases → D1
- 点击 Create 创建数据库,名称填
edgekey-db - 记录数据库详情页中的
database_id,后续部署命令中需要用到
数据库表结构和种子数据会在首次部署时由 deploy 脚本自动完成初始化,无需手动操作。
1. 部署命令
由于 wrangler.jsonc 中的 database_id 需要与你的实际 D1 数据库绑定,Git 自动部署时请在 Cloudflare 的"构建配置"中将部署命令设置为:
sed -i 's/"database_name": "edgekey-db"/"database_name": "edgekey-db", "database_id": "你的database_id"/' wrangler.jsonc && bun run deploy将 你的database_id 替换为你的实际 D1 数据库 ID(可在 Cloudflare Dashboard → D1 → 数据库详情页找到)。
2. 配置 AUTH_SECRET 环境变量
在 Cloudflare Workers Git 集成的"高级设置"中:
- 添加变量名
AUTH_SECRET - 输入你的密钥字符串作为变量值
- 勾选"加密"选项
首次部署到 Cloudflare 前,需要先在云端创建并初始化 D1 数据库:
-
登录并创建数据库
bunx wrangler login bunx wrangler d1 create edgekey-db
-
绑定 Database ID 将上一步终端输出的
database_id填入wrangler.jsonc。
-
按顺序初始化云端表结构
bun run db:migrations:remote
-
初始化管理员账号与初始化种子数据
bun run db:seed:remote
-
配置 AUTH_SECRET 输入命令执行,根据命令行提示输入你要使用的密钥字符串。```bash bunx wrangler secret put AUTH_SECRET
-
生成 Prisma Client 并一键部署
bun run db:generate bun run up
bun run up 等价于先构建再发布:
vike buildwrangler deploy
部署配置见 wrangler.jsonc(其中 main 指向 Photon 的 Cloudflare server-entry 虚拟入口)。
当前项目使用管理员账号密码登录。用于生产环境前请务必:
- Cloudflare 生产环境必须配置
AUTH_SECRET,未配置会抛出异常并禁止管理员登录 - 配置方式详见上方"一键部署"、"通过 Git 连接 Cloudflare 自动部署"、"构建与部署(手动)"各章节说明
- 生产环境配置AUTH_SECRET命令
wrangler secret put AUTH_SECRET - 默认管理员账号为
admin / admin123456,首次登录后请立即修改密码
推荐使用 Bun(也可替换为 npm/pnpm/yarn)。
bun install由于本项目使用了 Cloudflare D1 数据库,在首次启动本地开发服务器前,必须先初始化本地的 D1 模拟器表结构:
# 1. 生成 Prisma Client(首次安装依赖后必须执行)
bun run db:generate
# 2. 按顺序将所有迁移脚本应用到本地 Wrangler 模拟器
bun run db:migrations:local
# 3. 初始化管理员账号与初始化种子数据
bun run db:seed
# 4. 准备.env 文件
# 请在 `env.example` 中填写必要的环境变量,例如 `AUTH_SECRET`。
# 然后复制 `env.example` 到 `env` 文件。
# 5. 启动开发服务器
bun run dev本项目使用了 Prisma ORM 与 Cloudflare D1 数据库,完全遵循 官方 Prisma + Cloudflare D1 指南 的最佳实践。
bun dev运行在 Cloudflare 风格的本地开发环境中,Prisma 会通过env.DB连接到本地 D1 模拟器。bun run up部署后,Prisma 会通过同一个env.DB绑定连接到远程 D1。.env中的DATABASE_URL仅用于 Prisma CLI / 配置层,不参与当前应用运行时的数据库连接。- 当前
prisma/schema.prisma仅保留 Cloudflare client generator,运行时统一使用generated/prisma/client。 - 因此,本项目当前的数据库运行模式是:开发环境用本地 D1,生产环境用远程 D1。
当你需要修改数据库表结构时,请严格按照以下流程执行:
第一步:修改 Schema 并生成 SQL 迁移脚本
修改 prisma/schema.prisma 后,不要使用常规的 migrate dev,而是使用 migrate diff 生成 SQL 脚本:
# 由于 Cloudflare D1 和普通的 MySQL 完全不同。普通的 Prisma migrate dev 依赖于一个长期运行的数据库连接来比对状态、创建 shadow database 等等,而 D1 不支持这些操作。
# 后续增量迁移(修改现有表结构时)
# 新版 Prisma 已经废弃了 --from-local-d1,推荐使用 --from-migrations
bunx prisma migrate diff \
--from-migrations prisma/migrations \
--to-schema prisma/schema.prisma \
--script > prisma/migrations/0002_xxx.sql说明:
0001_init.sql只用于第一次初始化,不应在后续迁移中反复覆盖。- 后续迁移请按顺序新增文件,例如
0002_add_foo.sql、0003_add_bar.sql。
第二步:将迁移同步到本地 D1 模拟器(用于本地开发/测试)
bun run db:migrations:local如果不执行这一步,运行 bun dev 访问页面时会报错 no such table。
第三步:将迁移同步到 Cloudflare 线上(发布前)
bun run db:migrations:remote本地和线上需要分别执行一次。
bun dev上面的命令会启动本地开发服务器,并使用 wrangler.jsonc 中定义的 D1 绑定连接到本地 D1 模拟器。
- Telefunc 函数按约定放在对应页面目录下,以
.telefunc.ts结尾。 - 当前 Windows +
bun dev+workerd组合下,Telefunc 的开发态命名/同目录检查会触发路径兼容问题,因此在server/telefunc-handler.ts中关闭了该检查。 - 这不会影响 Telefunc 的实际加载和调用,只是跳过开发态的命名约定校验。
- 不要假设
bun dev使用的是prisma/db.sqlite;当前它实际使用的是本地 D1 模拟器。 - 不要使用
prisma migrate dev,这会偏离当前 D1 迁移工作流。 - 不要反复覆盖
prisma/migrations/0001_init.sql;初始化迁移和后续增量迁移应分开维护。
- 框架与渲染
- Vike(文件路由 + SSR)
- Vue 3(前端组件)
- Server / 运行时
- Hono(服务端路由与中间件)
- Photon(将服务端入口适配到 Cloudflare)
- Wrangler(Cloudflare 部署与本地开发工具)
- 数据与变更
- Telefunc(前后端同构的数据变更 RPC)
- Prisma(ORM)
- D1(Cloudflare 原生 SQLite 数据库,本项目开发与部署统一使用)
- UI
- Tailwind CSS
- daisyUI(Tailwind 组件与主题)
- 认证
- Auth.js(管理员账号密码登录)
.
├─ assets/ # 静态资源
├─ components/ # 复用组件(非路由页面)
├─ pages/ # Vike 文件路由目录(页面就近放置组件/样式/类型)
│ ├─ +config.ts # 全局配置(例如 title、SSR 等)
│ ├─ +Layout.vue # 全局布局
│ ├─ +Head.vue # 全局 head 标签
│ ├─ tailwind.css # Tailwind + daisyUI 入口
│ ├─ index/+Page.vue # 前台首页(/)
│ ├─ product/+Page.vue # 商品详情页(/product/:slug)
│ ├─ query/+Page.vue # 订单查询页(/query)
│ ├─ order/+Page.vue # 订单详情页(/order/:orderNo)
│ ├─ admin/ # 管理后台(/admin)
│ └─ _error/+Page.vue # 错误页
├─ server/ # 服务端入口(Hono)与中间件
│ ├─ entry.ts # 服务端主入口
│ ├─ authjs-handler.ts # Auth.js handler + session middleware
│ ├─ prisma-middleware.ts # Prisma D1 注入中间件
│ └─ telefunc-handler.ts # Telefunc handler
├─ lib/ # 业务逻辑库(支付适配器、发货逻辑等)
├─ modules/ # 功能模块(支付通知、订单等)
├─ scripts/ # 辅助脚本(种子数据、验证脚本)
├─ prisma/ # Prisma Schema 与迁移 SQL
│ ├─ schema.prisma
│ └─ migrations/
│ ├─ 0001_init.sql
│ └─ 0002_xxx.sql
├─ vite.config.ts # Vite 插件配置(vike + vue + tailwind + telefunc)
├─ wrangler.jsonc # Cloudflare Workers 配置(入口为 Photon 虚拟模块)
└─ package.json # 脚本与依赖
pages/ 目录下以 + 开头的文件是 Vike 的"约定接口文件",用于声明页面、配置与数据加载等;不带 + 的文件会被当作普通模块(组件、样式、类型)处理,便于页面就近组织代码。
常见 + 文件:
+Page.vue:页面组件+data.ts:页面数据获取(SSR/CSR 共享)+Layout.vue:布局(包裹页面)+Head.vue:head 标签+config.ts:页面/全局配置
当邮件发送异常或支付回调出现问题时,可在 Cloudflare Dashboard 查看 Workers 运行日志:
- 进入 dash.cloudflare.com
- 左侧菜单 → Workers & Pages → 点击 edgekey
- 顶部 tab → Observability
- 在搜索框输入关键词过滤日志,例如:
email.notify_order_paid.config_failed— 支付后邮件配置获取失败email.send.failed— 邮件发送失败email.order_paid.failed— 支付成功后发送邮件通知失败payment.notify.route_exception— 支付回调路由异常payment.notify.context_missing— 支付回调缺少数据库上下文payment.notify.diagnostic— 支付回调校验异常诊断(签名错误、金额不匹配等)bepusdt.verify_notify— BEpusdt 回调原始 payload(info 级别)
感谢下列开源项目
- Ebpusdt — 加密货币交易支持
- worker-mailer — Workers环境SMTP邮件支持