banner
约 4,200 字
14 分钟

拼多多福袋互助平台部署(命令行版):Cloudflare Workers + D1 全流程

拼多多福袋互助平台部署(命令行版):Cloudflare Workers + D1 全流程

摘要

拼多多福袋互助平台部署(命令行版):Node 22 + Wrangler 初始化、D1 建表、管理密钥、自定义域名与 Cron 时区坑逐条说明,约 20 分钟免费上线。

拼多多福袋互助平台,整个站点就是一个 src/index.js(3586 行、约 170 KB),跑在 Cloudflare Workers + D1 上——零服务器、零成本、不需要备案。这篇文章手把手带你部署上去,全程免费,15~20 分钟搞定。

版本对应:项目当前版本 0.9.2(更新日志见仓库的 CHANGELOG.md)。本文按这个版本核对过,其中有四处是照着做最容易翻车的地方,正文里都单独标了警示:

  • Node.js 必须是 22 及以上;

  • 先部署、再设密钥,顺序反了会报 code: 10007;

  • 建表必须是 6 张,漏掉 visits 首页会白屏;

  • 归属地走的是「本地优先」的新链路,不再依赖外部 IPv4 接口。

三个来源,按需取:

一、你需要准备什么

项目

是否必须

说明

电脑(Windows / Mac / Linux)

✅ 必须

用来执行命令

Cloudflare 账号

✅ 必须

免费注册

Node.js 22+

✅ 必须

运行 Wrangler 工具(新版 Wrangler 要求 Node 22 及以上)

Git

❌ 可选

克隆项目用;没装可从 GitHub 下载 ZIP

一个域名

❌ 可选

没有也能用,只是网址长一点

没有域名? 部署后会得到一个 xxx.workers.dev 的网址,直接用就行。不过中国大陆可能无法访问 workers.dev,建议有条件的绑一个自己的域名(第九步会讲)。

二、注册 Cloudflare 账号

  1. 打开浏览器,访问 https://dash.cloudflare.com/sign-up;

  2. 输入邮箱和密码,点 Create Account;

  3. 去邮箱收验证邮件,点验证链接;

  4. 登录成功,看到 Cloudflare 控制台首页。

已经有账号的直接登录就行。

三、安装工具并获取项目代码

3.1 安装 Node.js

  1. 打开 https://nodejs.org/;

  2. 下载 LTS(长期支持版),一路下一步安装;

  3. 安装完成后打开终端验证:

bash
node -v

应该显示 v22.0.0 或更高(例如 v24.11.0)。

⚠️ 版本必须 ≥ 22:最新版 Wrangler 的 engines 要求 Node 22+,装低了下一步会直接报 EBADENGINE。如果你看到的是 v20 或更低,回官网下载最新 LTS 重装即可。

3.2 安装 Wrangler

Wrangler 是 Cloudflare 的命令行工具,用来部署代码:

bash
npm install -g wrangler

如果提示权限错误(Mac / Linux),前面加 sudo。安装完验证:

bash
wrangler --version

应该显示类似 wrangler 4.x.x 的版本号。

如果这一步报 EBADENGINE ... Required: {"node":">=22.0.0"},说明 3.1 的 Node 版本太低,回去升级。

3.3 获取项目代码

方式一:命令行克隆(推荐)

bash
git clone https://github.com/jjsxjxj/pdd-fudai.git
cd pdd-fudai

方式二:没有 Git

打开 https://github.com/jjsxjxj/pdd-fudai → 绿色 Code → Download ZIP,解压后用 cd 进入解压出来的目录。

⚠️ 有个坑要先说:克隆下来的仓库里没有 wrangler.toml——它已经加入 .gitignore(里面含你的私有 ID,不该入库),仓库里只放模板。第七步会教你从模板生成。

四、登录 Cloudflare

bash
wrangler login

会自动打开浏览器,显示 Cloudflare 授权页面,点 Allow,看到 "You have granted authorization" 就成功了。如果浏览器没有自动弹出:终端里会显示一个网址,手动复制到浏览器打开就行。

五、创建 D1 数据库

D1 是 Cloudflare 的 SQLite 数据库,免费 5GB,用来存储邀请码、黑名单等数据:

bash
wrangler d1 create pdd-fudai-db

输出大概长这样:

纯文本
✅ Successfully created DB 'pdd-fudai-db'
┌───────────────────────────────────────┬───────────────────────────────┐
│ database_id                           │ database_name                 │
├───────────────────────────────────────┼───────────────────────────────┤
│ abcdef12-3456-7890-abcd-ef1234567890  │ pdd-fudai-db                  │
└───────────────────────────────────────┴───────────────────────────────┘

⚠️ 重要! 把 database_id(那一串 UUID)记下来,第七步要用。

六、初始化数据库表

进入项目目录,执行建表命令:

bash
wrangler d1 execute pdd-fudai-db --remote --file=schema.sql

看到 ✅ Executed ... queries 就成功了。这会创建 6 张表:

表名

用途

codes

邀请码(用户提交的互助码)

blacklist

IP 黑名单

reports

假码举报记录

submit_logs

提交日志(限流统计与审计)

visits

访问统计(首页「今日访问量」读它,漏建会让首页白屏)

settings

站点设置(公告、广告、QQ、识别模式等)

以及 15 个索引。限流类查询都是 (ip, action, created_at) 三条件组合,所以用复合索引;schema.sql 里还显式写了一句 DROP INDEX IF EXISTS idx_logs_ip——那个单列索引已经被复合索引的最左前缀完全覆盖,留着只会增加写入放大。

整个 schema.sql 的语句都带 IF NOT EXISTS,重复执行是安全的。

七、部署到 Cloudflare Workers

7.1 从模板生成配置文件

bash
cp wrangler.toml.example wrangler.toml

打开 wrangler.toml,把这里替换成第五步记下的 database_id:

toml
[[d1_databases]]
binding = "DB"
database_name = "pdd-fudai-db"
database_id = "换成你自己的-database-id"

binding 必须是 DB——代码里用的是 env.DB,写错就连不上数据库,首页会白屏。

模板里还有两个值得留意的段落:

  • [ai] + binding = "AI":给「识别截图」的 AI 兜底用的。不想要这层兜底,把这一段删掉也能正常部署,本地像素识别不受影响。

  • routes = [...]:自定义域名路由。没绑定域名就把这一段整段删掉,否则 wrangler deploy 会因为 zone_id 是占位符而报错。

7.2 执行部署

bash
wrangler deploy

看到类似输出就成功了(体积数字随版本变化):

纯文本
Total Upload: xxx KiB / gzip: xx KiB
Uploaded pdd-fudai (1.23 sec)
  Deployed pdd-fudai triggers
    - https://pdd-fudai.<你的子域名>.workers.dev
    - cron: 59 15 * * *

把网址复制到浏览器打开,就能看到首页了。手机上打开是这个样子:

部署完成后的首页(手机端):今日 IP / 今日访问 / 今日提交统计、邀请码输入框与识别截图按钮
部署完成后的首页(手机端):今日 IP / 今日访问 / 今日提交统计、邀请码输入框与识别截图按钮

中国大陆用户注意:workers.dev 域名在中国大陆可能打不开,请看第九步绑定自己的域名。

八、设置管理密钥(必须在部署之后)

管理密钥是进后台的密码,一定要设一个复杂的:

bash
wrangler secret put ADMIN_KEY

终端会提示 Enter a secret value:,输入你自己想好的密码,回车,看到 ✅ Success 即可。

⚠️ 顺序很重要:这一步必须在第七步部署成功之后执行。 wrangler secret put 要求目标 Worker 已经存在。如果还没部署就直接执行,会报一个很难看懂的错: `` ✘ [ERROR] A request to the Cloudflare API (/accounts/xxx/workers/scripts/pdd-fudai/secrets) failed. workers.api.error.script_not_found [code: 10007] ` 遇到这个报错,回第七步先 wrangler deploy`,再回来设密钥。

设完不用再部署:wrangler secret put 会自动创建新版本并立即上线,效果等同于执行一次 deploy。

请牢记这个密码! 后台登录、API 管理都需要它,丢了只能重新设置(Worker 已在线上,直接再跑一次 wrangler secret put ADMIN_KEY 覆盖即可)。

九、绑定自定义域名(推荐)

有自己的域名体验会好很多,网址短好记,全球可访问。

9.1 域名接入 Cloudflare

如果你的域名不在 Cloudflare 管理:

  1. Cloudflare Dashboard → Add a Site,输入你的域名;

  2. 选择 Free(免费)计划;

  3. Cloudflare 会给你 2 个 NS 地址;

  4. 去你的域名注册商(阿里云 / 腾讯云 / GoDaddy 等),把 DNS 的 NS 记录改成 Cloudflare 给的那两个;

  5. 等待生效(通常几分钟到几小时)。

9.2 添加 DNS 记录

  1. 进入你的域名 → DNS → Records → Add record;

  2. 填写:

  • Type:A

  • Name:fudai(或者你想要的子域名前缀)

  • IPv4 address:192.0.2.1(占位地址,Workers 会自动接管)

  • Proxy status:🟠 Proxied(橙色云朵,必须开)

9.3 在配置里加路由并重新部署

toml
routes = [
  { pattern = "fudai.yourdomain.com/*", zone_id = "你的Zone-ID" }
]

Zone ID 在 Cloudflare Dashboard → 你的域名 → Overview 右侧边栏最下方。改完再执行一次 wrangler deploy,输出里就会显示你的自定义域名。

十、Cron 定时任务的时区坑

项目内置了每天 23:59 自动清空互助码的定时任务:

toml
[triggers]
crons = ["59 15 * * *"]

为什么是 59 15 而不是 59 23? 因为 Cron 用的是 UTC 时间,中国时间 = UTC + 8,所以 23:59 CST = 15:59 UTC。改成其他时间的换算表:

中国时间

UTC 时间

Cron 表达式

23:59

15:59

59 15 * * *

00:00

16:00

0 16 * * *

06:00

22:00

0 22 * * *

12:00

04:00

0 4 * * *

Cron 最多延迟几分钟触发属正常现象;即使没触发,用户下次访问也会触发懒清理兜底。

十一、后台管理

打开 https://你的域名/admin,输入第八步设置的 ADMIN_KEY 即可进入后台。

站点设置里能改的东西(改完即时生效,不必重新部署):

设置项

说明

公告 / 广告条

首页顶部公告、提交框上方广告,留空则不显示

弹窗广告标题 / 副标题

留空则整个标题栏不渲染

QQ 群号 / 站长 QQ

「建议·反馈·申诉·加入组织」弹窗里的联系方式

智能直达

开关,开启后首页显示「一键直达」按钮

刷新间隔

列表自动刷新秒数(3~30)

识别截图模式

local(仅本地像素识别,默认)/ ai(本地识别 + AI 兜底,需额外绑定 Workers AI)

iOS 快捷指令地址

首页 iOS 按钮指向的链接,留空则隐藏该按钮

每分钟 / 每日提交上限

限流阈值,默认 5 次 / 分钟、30 次 / 天

功能页:数据统计、邀请码管理(可看完整码与归属地)、IP 黑名单(封禁 24h / 1 月 / 1 年 / 永久,过期自动解禁)、举报管理、提交日志(分页审计,保留 30 天)。

项目内置的几条自动规则,用之前值得知道:

  • 自动拉黑:某个提交者的 IP 在 24 小时内被 3 个以上不同举报人举报,系统自动拉黑该 IP(默认 24 小时);

  • 举报防武器化:不能举报自己提交的码;同一举报人 10 分钟内只能举报一次;计票用 COUNT(DISTINCT ip) 去重;

  • 列表容量:首页最多展示 50 条活跃码,用完的码 30 秒后自动从列表里轮换掉;

  • 登录态:后台密钥存在 sessionStorage 里,刷新页面不会掉登录,关掉标签页即清除——密钥不会长期留在浏览器中。

顺手做一下 SEO(可选)

src/index.js 顶部的 CONFIG 里有几个占位:

JavaScript
SITE_ORIGIN: 'https://fudai.10087.eu.org',  // 换成你自己的域名
SEO_VERIFY_BAIDU: '',    // 百度搜索资源平台的验证串
SEO_VERIFY_GOOGLE: '',   // Google Search Console 的验证串
SEO_VERIFY_BING: '',     // 必应 Webmaster 的 msvalidate.01

SITE_ORIGIN 默认预置的是官方演示站地址,部署后记得改成你自己的域名——canonical、og:url、sitemap.xml、robots.txt 都统一引用它,换域名只改这一处。填了对应验证串,首页 head 就会输出验证 meta,方便在站长平台提交站点。

十二、懒人方案:装个 Skill 让 AI 帮你部署

如果你在用支持 Skill 的 AI 助手(比如 WorkBuddy),还有第三种更省事的部署方式——这套流程被打包成了 cloudflare-workers-deploy Skill,装好后让 AI 全程引导你完成部署,出错了它还能帮你排查。

12.1 安装 Skill

方式一:对话安装(推荐)

在对话框直接输入:

纯文本
安装 skill cloudflare-workers-deploy

助手会自动搜索并完成安装,Skill 存放在 ~/.workbuddy/skills/cloudflare-workers-deploy/。

方式二:手动安装

从 GitHub 或 Skill 市场拿到 cloudflare-workers-deploy 包后,解压到 ~/.workbuddy/skills/cloudflare-workers-deploy/,重启会话即可被发现。

12.2 Skill 里有什么

纯文本
cloudflare-workers-deploy/
├── SKILL.md                  # 触发条件 + 部署流程概览
├── references/
│   ├── deploy-cli.md         # 命令行部署完整教程(本文的完整版)
│   └── deploy-web.md         # 网页在线部署完整教程
└── assets/
    ├── schema.sql            # D1 建表脚本,直接执行
    └── wrangler.toml         # 配置模板,替换占位符即用

12.3 怎么用

安装后直接说:

帮我把这个项目部署到 Cloudflare Workers

或者更直白一些:

我不用命令行,能在网页上部署到 Cloudflare 吗?

AI 会自动加载 Skill,然后依次问你:选哪条部署路径(命令行 / 网页)、是否已有 Cloudflare 账号、要不要绑自定义域名、要不要配定时任务——按回答给出对应步骤,遇到报错把错误信息丢给它就行。

十三、常见问题

Q: 部署后打开网站是白屏?

按顺序检查:

  1. wrangler.toml 里的 database_id 有没有换成自己的;

  2. 第六步建表有没有执行成功——特别是有没有 visits 表(首页「今日访问量」要读它,缺了会让 /api/config 报错,页面直接白屏);

  3. D1 绑定的 binding 是不是 DB;

  4. 重新执行一次 wrangler deploy;

  5. 还不行就看 wrangler tail 的实时日志。

Q: 执行 wrangler secret put 报 script_not_found?

说明这个 Worker 还没部署过——密钥只能给已存在的 Worker 设置。先 wrangler deploy,再设密钥(顺序见第七、八步)。

Q: workers.dev 打不开?

中国大陆网络环境下可能被屏蔽。绑定自己的域名(第九步),或者挂代理访问。

Q: 后台进不去,提示密码错误?

直接重新设置即可(Worker 已在线上):

bash
wrangler secret put ADMIN_KEY

输入新密码后回车就生效,不需要再执行一次 wrangler deploy。

Q: IP 归属地显示英文?

归属地是按这个顺序取的:

  1. 本地优先:如果访客是 IPv6 或内网地址,直接跳过外部查询(百度和 ipwho.is 都是 IPv4 库,对 IPv6 只能返回空或限流报错),改用 Cloudflare 自带数据;

  2. 百度开放数据 API(全中文)——首选;

  3. ipwho.is(HTTPS,中文地名)——备用;

  4. Cloudflare request.cf——兜底,且会经过内置的中文城市 / 省份映射表转成中文。

所以现在显示英文的情况已经很少;即便走到兜底分支,也基本是中文字样。失败结果会进 10 分钟负缓存,不会每次提交都白跑十秒——归属地只影响展示,不影响功能。

Q: 点「识别截图」没反应 / 识别失败?

识别算法是内联在代码里的像素模板匹配,不下载任何模型、不上传图片、毫秒级出结果,命令行版和网页版都能用。失败时按这个顺序看:

  1. 确认是拼多多福袋分享图或手机整屏截图,码清晰、没被裁掉边缘;

  2. 图片别太大(走服务端 AI 通道时上限 4MB);

  3. 本地没认出会提示手动输入;想让系统自动改用 AI 再试一次,需要绑定 Workers AI,并在后台把识别截图模式设成「本地识别 + AI 兜底」;

  4. 弹窗里的识别结果可以手动改——上面就是裁出来的码区原图,对着改完再点确认提交。

Q: 提示「提交过于频繁」?

防刷规则生效了:同一 IP 1 分钟内最多提交 5 次、1 天内最多 30 次。等一会儿再试;管理员可以在 CONFIG 里调这两个值。

Q: 邀请码每天什么时候清空?

每天 23:59(中国时间)自动清空所有互助码,零点开始新一天。黑名单、举报记录、设置不受影响。

Q: 怎么修改网站的颜色 / 文字?

所有前端代码都内联在 src/index.js 里。搜索关键词找到位置改完,wrangler deploy 即可。

Q: 怎么查看数据库里的数据?

bash
# 查看所有邀请码
wrangler d1 execute pdd-fudai-db --remote --command "SELECT * FROM codes"

# 查看黑名单
wrangler d1 execute pdd-fudai-db --remote --command "SELECT * FROM blacklist"

# 清空所有邀请码
wrangler d1 execute pdd-fudai-db --remote --command "DELETE FROM codes"

Q: 免费额度够用吗?

Workers 免费计划每天 100,000 次请求,D1 免费 5GB 存储,Cron Trigger 免费。个人互助平台完全够用;流量大了再考虑 $5 / 月的付费计划。

附录:完整部署命令速查

bash
# 1. 获取项目
git clone https://github.com/jjsxjxj/pdd-fudai.git
cd pdd-fudai

# 2. 安装 Wrangler(需 Node.js 22+)
npm install -g wrangler

# 3. 登录 Cloudflare
wrangler login

# 4. 创建数据库(记下输出里的 database_id)
wrangler d1 create pdd-fudai-db

# 5. 从模板生成配置,把 database_id 填进去
cp wrangler.toml.example wrangler.toml

# 6. 建表(6 张表 + 15 个索引)
wrangler d1 execute pdd-fudai-db --remote --file=schema.sql

# 7. 部署
wrangler deploy

# 8. 设置管理密钥(必须在部署之后;设完自动上线)
wrangler secret put ADMIN_KEY

# 9. 以后更新代码
wrangler deploy

写在最后

部署这条路上最容易绊倒人的其实只有三处:database_id 忘了替换、密钥设置的顺序反了、Cron 时区没换算。这三处都在正文里单独标了警示,希望你能一次过。

不想装任何软件的话,另一篇 网页版教程 全程只要点鼠标和粘贴,功能完全一致。

END