
HY
折腾进行时
Hello, I'm HY.








之前我一直用别人搭的图床,偶尔抽风挂了就得换一个,挺烦的。后来想着干脆自己搞一个算了,反正也不需要多大的量,个人博客够用就行。
研究了一圈发现 CloudFlare ImgBed 这个项目挺合适的。它跑在 Cloudflare Workers 上,数据库用 D1,存储可以选 R2 或者 Txxxram Bot,免费额度对个人图床来说完全够用。最关键的是不用自己搞服务器,Cloudflare 的边缘网络速度也不差。
部署方式有两种:Pages 和 Workers。Pages 更简单,Dashboard 里点几下就行。Workers 需要用 GitHub Actions,适合熟悉 CI/CD 流程的用户,支持 push 到 main 分支时自动部署,也可以手动触发。两种方式功能完全一样,我选了 Workers,主要想试试 GitHub Actions 自动部署的感觉。
先去 GitHub 上找到 CloudFlare ImgBed,点右上角 Fork 到自己的账户下。这一步没什么好说的,应该都会。
登录 Cloudflare Dashboard,点头像进「我的个人资料」,左边栏有个「API 令牌」,点进去,然后点右上角的「创建令牌」。
模板选「编辑 Cloudflare Workers」就行。选完会跳到权限配置页面,这里直接默认就好,不用改什么。权限、账户资源、区域资源都是帮你配好的,往下翻到底提交就行。
创建完之后把 Token 记下来,后面要填到 GitHub Secrets 里。
Account ID 在 Dashboard 首页右侧栏的 Account Details 区域。我一开始没找到,后来发现直接在首页问 Ask AI 就行,它会告诉你在哪。

复制下来备用。
数据库用来存图床的文件元数据,比如文件名、大小、上传时间之类的。KV 和 D1 二选一,我选了 D1,免费额度比 KV 多不少。
进 Dashboard 左侧「存储和数据库」→「D1 SQL 数据库」,点「创建数据库」。名字必须填的 img_d1,区域选了亚太地区,然后点创建。
创建完之后回到 D1 数据库的概述页面,这里能看到数据库 ID。点旁边的复制按钮把 ID 复制下来,后面配置 GitHub Secrets 要用。

接下来去 D1 的「控制台」选项卡,把初始化 SQL 执行一下。这段 SQL 会建好几个表:files(存文件信息)、settings(存配置)、index_operations(索引操作记录)之类的,还有索引和触发器。

直接复制粘贴执行就行。要分段输入,别一次全贴进去,容易出问题。控制台会显示每条语句的执行结果,看到「此查询已成功执行」就说明没问题。
这里贴一下主要的建表语句,方便你对照检查:
1CREATE TABLE IF NOT EXISTS files (2 id TEXT PRIMARY KEY,3 value TEXT,4 metadata TEXT NOT NULL,5 file_name TEXT,6 file_type TEXT,7 file_size TEXT,8 upload_ip TEXT,9 upload_address TEXT,10 list_type TEXT,11 timestamp INTEGER,12 label TEXT,13 directory TEXT,14 channel TEXT,15 channel_name TEXT,16 tg_file_id TEXT,17 tg_chat_id TEXT,18 tg_bot_token TEXT,19 is_chunked BOOLEAN DEFAULT FALSE,20 tags TEXT,21 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,22 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP23);还有 settings、index_operations、index_metadata、other_data 几个表,以及一堆索引和触发器。完整的 SQL 在项目的 database/init.sql 里。
踩坑提醒:如果你之前已经建过表想重新来,先把 SQL 开头那几行
DROP TABLE的注释去掉,执行一遍清掉旧表,再跑建表语句。生产环境慎用这个操作。
如果需要使用 R2 存储渠道,进 Dashboard 左侧「存储和数据库」→「R2 对象存储」,点「创建存储桶」,记下存储桶名称。我暂时没用 R2,先用默认的渠道跑起来再说。
在配置 GitHub Secrets 之前,先把 D1 数据库绑定到 Worker 上。进 Dashboard → Workers 和 Pages → 找到你刚创建的 Worker(默认叫 cloudflare-imgbed),点进去,选「绑定」标签页。

点「添加绑定」,选 D1 数据库。变量名称填 img_d1(跟代码里用的名字一致),D1 数据库选你之前创建的那个。

点「添加绑定」就搞定了。
回到 fork 的仓库,进 Settings → 机密和变量 → 操作。
一开始仓库里什么都没有,是空的。
点「New repository secret」把需要的值一个个加上。Secrets 是加密存储的,Actions 日志里不会泄露。别用 Variables,public 仓库的话所有人都能看到你的配置。
如果需要配置部署保护规则(比如环境机密),也可以在 Settings → 环境里设置。
最终需要加的 Secrets 如下:

| Secret 名称 | 说明 | 是否必填 |
|---|---|---|
CLOUDFLARE_API_TOKEN | Cloudflare API Token | 必填 |
CLOUDFLARE_ACCOUNT_ID | Cloudflare Account ID | 必填 |
D1_DATABASE_ID | D1 数据库 ID | 和 KV 二选一 |
KV_NAMESPACE_ID | KV 命名空间 ID | 和 D1 二选一 |
R2_BUCKET_NAME | R2 存储桶名称 | 可选 |
WORKER_NAME | Worker 名称 | 可选,默认 cloudflare-imgbed |
WORKER_VARS | 业务环境变量(JSON) | 可选 |
说实话大部分配置不用在这写。像存储渠道、审查策略什么的,部署完在管理面板里都能改。我一开始把什么都填了,后来发现根本没必要。WORKER_VARS 只有当你需要配 Telegram Bot 这类特殊渠道的时候才用得上,而且格式要是 JSON:
1{2 "TG_BOT_TOKEN": "your-bot-token",3 "TG_CHAT_ID": "your-chat-id"4}不过真要用 Telegram 渠道,我建议还是部署完在管理面板里配,比在这填 JSON 方便多了。
进仓库的 操作 页面,左边选「Deploy to Cloudflare Workers」。

点「Run workflow」,选 main 分支,开始跑。

部署完成后,可以通过 https://<worker-name>.<account-subdomain>.workers.dev 访问。第一次跑可能会慢一点,耐心等一下。可能国内访问不了,可以直接看我的Woker优先IP的文章。
部署完绑定好之后,访问你的 Worker 地址,应该能看到图床界面了。

界面还挺好看的,支持拖拽上传、点击上传、Ctrl+V 粘贴上传,底部还有文件管理和统计。默认就能用,挺省心的。
部署完成后,记得去管理面板配置存储渠道,不然图片传不上去。
整个过程其实挺顺利的,就几个小地方需要注意:
部署完能跑了,下次出个配置文章
写于 2026 年 7 月,折腾 CloudFlare ImgBed 部署的记录
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
部分内容可能已过时
分享你的想法,与大家交流讨论