利用Cloudflare自建图床并套入cdn
我所使用的是别人的开源项目,项目成品预览:CloudFlare ImgBed,认证码为:cfbed。
注:请不要使用演示站点上传,图片数据无法保证
本篇文章所有图片皆为自建图床+CDN效果,速度很快
Cloudflare部署
📂 第一步:Fork 项目
- 访问 CloudFlare ImgBed 项目
- 点击右上角的 “Fork” 按钮
- 选择您的 GitHub 账户
确认 Fork 完成
🏗️ 第二步:创建 Pages 项目
2.1 访问 Cloudflare Dashboard
- 选择左侧菜单的 “计算和AI” -> “Workers & Pages”
- 点击 “创建应用程序”
- 在最下方
Looking to deploy Pages?选择 “Get started” - 在 “导入现有 Git 存储库” 处点击 “开始使用”
2.2 连接 GitHub 仓库
- 如果首次使用,需要授权 Cloudflare 访问 GitHub
- 选择您 Fork 的
CloudFlare-ImgBed仓库 - 点击 “开始设置”
2.3 配置项目设置
| 配置项 | 值 | 说明 |
|---|---|---|
| 项目名称 | cloudflare-imgbed(或自定义) | 项目标识符 |
| 生产分支 | main | 生产环境分支 |
| 构建命令 | npm install | 重要:构建命令 |
| 构建输出目录 | / | 保持默认 |
2.4 部署项目
- 点击 “保存并部署”
- 等待首次部署完成(约 2-3 分钟)
🗄️ 第三步:配置数据库
创建 KV 命名空间
- 在 Cloudflare Dashboard 中选择 “存储和数据库”
- 点击 “Workers KV”
- 点击 “创建实例”
- 输入命名空间名称:
img_url - 点击 “创建”
绑定 KV 到项目
- 返回您的 Pages 项目
- 选择 “设置” → “绑定”
- 点击 “添加” → “KV 命名空间”
- 填写绑定信息:
- 变量名称:
img_url(必须是这个名称) - KV 命名空间:选择刚创建的命名空间
- 变量名称:
- 点击 “保存”
- 注意:绑定 KV 时,变量名称必须为
img_url,这是项目预设的变量名,填错会出现无法进入管理界面等情况。
创建 D1 数据库
- 在 Cloudflare Dashboard 中选择 “存储和数据库”
- 点击 “D1 SQL 数据库”
- 点击 “创建数据库”
- 输入数据库名称:
img_d1(建议使用此名称) - 不选择地区,点击 “创建”
初始化 D1 数据库
- 创建完成后,点击进入数据库详情页
- 选择 “控制台” 选项卡
- 在 SQL 输入框中逐段粘贴并执行初始化语句
填写示例:太多了,请展开
文件表 - 存储文件元数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23CREATE TABLE IF NOT EXISTS files (
id TEXT PRIMARY KEY,
value TEXT,
metadata TEXT NOT NULL,
file_name TEXT,
file_type TEXT,
file_size TEXT,
upload_ip TEXT,
upload_address TEXT,
list_type TEXT,
timestamp INTEGER,
label TEXT,
directory TEXT,
channel TEXT,
channel_name TEXT,
tg_file_id TEXT,
tg_chat_id TEXT,
tg_bot_token TEXT,
is_chunked BOOLEAN DEFAULT FALSE,
tags TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);系统配置表
1
2
3
4
5
6
7
8CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
category TEXT,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);索引操作表
1
2
3
4
5
6
7
8CREATE TABLE IF NOT EXISTS index_operations (
id TEXT PRIMARY KEY,
type TEXT NOT NULL,
timestamp INTEGER NOT NULL,
data TEXT NOT NULL,
processed BOOLEAN DEFAULT FALSE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);其他数据表
1
2
3
4
5
6
7
8CREATE TABLE IF NOT EXISTS other_data (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
type TEXT,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);创建索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15CREATE INDEX IF NOT EXISTS idx_files_timestamp ON files(timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_files_directory ON files(directory);
CREATE INDEX IF NOT EXISTS idx_files_channel ON files(channel);
CREATE INDEX IF NOT EXISTS idx_files_file_type ON files(file_type);
CREATE INDEX IF NOT EXISTS idx_files_upload_ip ON files(upload_ip);
CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_files_tags ON files(tags);
CREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);
CREATE INDEX IF NOT EXISTS idx_index_operations_timestamp ON index_operations(timestamp);
CREATE INDEX IF NOT EXISTS idx_index_operations_processed ON index_operations(processed);
CREATE INDEX IF NOT EXISTS idx_index_operations_type ON index_operations(type);
CREATE INDEX IF NOT EXISTS idx_other_data_type ON other_data(type);创建触发器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23CREATE TRIGGER IF NOT EXISTS update_files_updated_at
AFTER UPDATE ON files
BEGIN
UPDATE files SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
END;
CREATE TRIGGER IF NOT EXISTS update_settings_updated_at
AFTER UPDATE ON settings
BEGIN
UPDATE settings SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;
END;
CREATE TRIGGER IF NOT EXISTS update_index_metadata_updated_at
AFTER UPDATE ON index_metadata
BEGIN
UPDATE index_metadata SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;
END;
CREATE TRIGGER IF NOT EXISTS update_other_data_updated_at
AFTER UPDATE ON other_data
BEGIN
UPDATE other_data SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;
END;插入初始的索引元数据
1
2INSERT OR REPLACE INTO index_metadata (key, last_updated, total_count, last_operation_id)
VALUES ('main_index', 0, 0, NULL);初始化完成
- 点击 “执行”
绑定 D1 到项目
- 返回您的 Pages 项目
- 选择 “设置” → “绑定”
- 点击 “添加” → “D1 数据库”
- 填写绑定信息:
- 变量名称:
img_d1(必须是这个名称) - D1 数据库:选择刚创建的数据库
- 变量名称:
- 点击 “保存”
🔄 第四步:重新部署
绑定数据库后需要重新部署以生效:
- 进入项目的 “部署” 页面
- 找到最新的部署记录
- 点击右侧的 “…” 菜单
- 选择 “重试部署”
- 等待部署完成
第五步:绑定域名
为你的项目配置一个域名,如使用cdn可不用配置
加入EO CDN
Cloudflare本身的速度太慢,域名备案后套上CDN会更快,如没有备案域名忽略这步
ping值:
操作
打开EdgeOne - 控制台并登陆,添加域名
点击域名管理➡️添加域名
Cloudflare page域名就是这个第一个域,直接填进去保存就行
配置存储渠道
部署完成后访问您的域名,进入管理后台配置存储渠道。
访问管理后台
访问 https://你的域名/
配置 Telegram 渠道
2.1 获取 TG_BOT_TOKEN
- 在 Telegram 中搜索 @BotFather
- 发送
/newbot命令 - 先输入你要为机器人准备的英文名字
再输入机器人id,必须_bot结尾
获得 Bot Token(格式:
123456789:ABCdefGHIjklMNOpqrsTUVwxyz)
点击上图中被打码的链接,随便发点文字把bot添加到联系人
2.2 获取 TG_CHAT_ID
- 创建一个新的 Telegram 频道(Channel)
点击右下角的笔➡️新建频道➡️随便填一个名字然后点右上角的确定➡️更改为私密频道 - 将创建的 Bot 添加为频道管理员
给予 Bot 消息管理的权限
点击创建的频道名➡️点击管理员(如是英文就是第二项)➡️点击添加管理员,搜索bot的名字将他拉进来,给bot所有权限在频道中发送一条测试消息
- 向 @VersaToolsBot 转发这条消息
- 获得频道 ID(示例:
-1001234567890)
2.3 配置 Telegram
- 左上角菜单栏进入 “系统设置” → “上传设置”
- 找到 “Telegram 渠道配置”
- 点击 “添加渠道”
- 填入准备好的 Token 和 Chat ID:
- 渠道名称:自定义名称(如:主渠道)
- Bot Token:从 @BotFather 获得的 Token
- Chat ID:频道 ID(有
-号时需要保留) - 启用状态:开启
- 点击 “保存设置”
配置 R2 渠道
服务器部署时默认添加了 Cloudflare R2 存储方式,以下步骤仅针对 Cloudflare 部署方式:
在项目设置中绑定 R2 存储桶:
- 选择 “设置” → “绑定”
- 添加 “R2 存储桶”
- 变量名称:
img_r2 - R2 存储桶:选择已创建的存储桶
r2的教程看这边:Cloudflare的r2存储桶使用 | mccsjs
在管理后台配置:
- 进入 “系统设置” → “上传设置”
- 配置 R2 渠道参数
- 如需图像审查,填入 R2 公开访问链接
提示
请注意Cloudflare R2 的免费额度限制,超过后可能会产生费用。
🔒 安全设置
安全相关设置,在管理后台的 “系统设置” → “安全设置” 中配置
认证管理
图像审查
审查渠道支持 nsfwjs 和 moderatecontent.com,可根据如下步骤自行配置。
moderatecontent.com
- 访问 ModerateContent
- 注册并获取免费 API Key(目前已不再支持免费注册)
- 在管理后台 “系统设置” → “安全设置” 中填入 API Key
安全设置
点开菜单➡️系统设置➡️安全设置➡️管理端认证
添加用户名和密码,给自己设置一个管理员账户
🌐 网页设置
前端网页相关设置,在管理后台的 “系统设置” → “网页设置” 中配置
| 字段名 | 用途 | 类型 | 内容规范 |
|---|---|---|---|
| siteTitle | 网站标题 | 字符串 | 只支持字符串类型,设置为你自定义的网站标题 |
| siteIcon | 网站图标 | 字符串 | 只支持字符串类型,设置为你自定义的网站图标链接 |
| ownerName | 图床名称 | 字符串 | 只支持字符串类型,设置为你自定义的图床名称(默认为Sanyue) |
| logoUrl | 图床Logo | 字符串 | 只支持字符串类型,设置为你自定义的图床Logo链接 |
| bkInterval | 背景切换间隔 | 正整数 | 设置为背景图的轮播时间,默认3000,单位ms。例如你希望10s切换一次,设置为 10000即可。 |
| bkOpacity | 背景图透明度 | (0,1]的浮点数 | 展示的背景图透明度,默认为1。如果你觉得显示效果不佳,可以自定义,如 0.8 |
| urlPrefix | 默认 URL 前缀 | 字符串 | 只支持字符串类型,设置为自定义的全局默认链接前缀,该前缀会覆盖原始默认前缀,但不会覆盖用户自定义的链接前缀 |
| announcement | 公告 | 字符串 | 只支持字符串类型,可以为 HTML 格式,设置为你自定义的公告内容(如有) |
| defaultUploadChannel | 默认上传渠道 | 字符串 | 只支持字符串类型,设置为你自定义的默认上传渠道,支持telegram(Telegram 渠道)、cfr2(Cloudflare R2)和s3(S3 渠道) |
| defaultUploadNameType | 默认命名方式 | 字符串 | 只支持字符串类型,设置为你自定义的默认上传文件命名方式,支持default(默认)、index(仅前缀)、original(仅原名)和short(短链接) |
| loginBkImg | 登录页背景图 | 列表/字符串 | 1、当字段类型为列表时,列表中元素为需要添加到轮播列表中的图片链接(列表中只有一张图时即为固定背景),形如["1.jpg","2.jpg"]2、当字段类型为 字符串时,目前仅支持字符串值为bing,设置为该值时启用bing随机图片轮播模式。 |
| uploadBkImg | 上传页背景图 | 列表/字符串 | 同loginBkImg |
| footerLink | 页脚传送门链接 | 字符串 | 只支持字符串类型,设置为你自定义的传送地址(如个人博客链接) |
| disableFooter | 隐藏页脚 | boolean | 支持boolean类型,设为true时禁用页脚,默认false |
| adminLoginBkImg | 管理页背景图 | 列表/字符串 | 同loginBkImg |
部署完成
结束,访问域名开始使用吧





























