我所使用的是别人的开源项目,项目成品预览:CloudFlare ImgBed,认证码为:cfbed
注:请不要使用演示站点上传,图片数据无法保证

本篇文章所有图片皆为自建图床+CDN效果,速度很快

Cloudflare部署

📂 第一步:Fork 项目

  1. 访问 CloudFlare ImgBed 项目
  2. 点击右上角的 “Fork” 按钮
    image.png
  3. 选择您的 GitHub 账户
  4. 确认 Fork 完成

    🏗️ 第二步:创建 Pages 项目

    2.1 访问 Cloudflare Dashboard

  5. 登录 Cloudflare Dashboard

  6. 选择左侧菜单的 “计算和AI” -> “Workers & Pages”
  7. 点击 “创建应用程序”
  8. 在最下方 Looking to deploy Pages? 选择 “Get started”
    pages-create.png
  9. 在 “导入现有 Git 存储库” 处点击 “开始使用”
    pages-create-1.png

2.2 连接 GitHub 仓库

  1. 如果首次使用,需要授权 Cloudflare 访问 GitHub
  2. 选择您 Fork 的 CloudFlare-ImgBed 仓库
  3. 点击 “开始设置”

2.3 配置项目设置

配置项说明
项目名称cloudflare-imgbed(或自定义)项目标识符
生产分支main生产环境分支
构建命令npm install重要:构建命令
构建输出目录/保持默认

pages-build-config.png

2.4 部署项目

  1. 点击 “保存并部署”
  2. 等待首次部署完成(约 2-3 分钟)

🗄️ 第三步:配置数据库

创建 KV 命名空间

  1. 在 Cloudflare Dashboard 中选择 “存储和数据库”
  2. 点击 “Workers KV”
  3. 点击 “创建实例”
    image.png
  4. 输入命名空间名称:img_url
    image.png
  5. 点击 “创建”

绑定 KV 到项目

  1. 返回您的 Pages 项目
  2. 选择 “设置” → “绑定”
  3. 点击 “添加” → “KV 命名空间”
    image.png
  4. 填写绑定信息:
    • 变量名称img_url(必须是这个名称)
    • KV 命名空间:选择刚创建的命名空间
      image.png
  5. 点击 “保存”
  • 注意:绑定 KV 时,变量名称必须为 img_url,这是项目预设的变量名,填错会出现无法进入管理界面等情况。

创建 D1 数据库

  1. 在 Cloudflare Dashboard 中选择 “存储和数据库”
  2. 点击 “D1 SQL 数据库”
  3. 点击 “创建数据库”
    image.png
  4. 输入数据库名称:img_d1(建议使用此名称)
    image.png
  5. 不选择地区,点击 “创建”

初始化 D1 数据库

  1. 创建完成后,点击进入数据库详情页
  2. 选择 “控制台” 选项卡
    image.png
  3. 在 SQL 输入框中逐段粘贴并执行初始化语句
    填写示例:
    image.png
    太多了,请展开

    文件表 - 存储文件元数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE 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
    8
    CREATE 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
    8
    CREATE 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
    8
    CREATE 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
    15
    CREATE 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
    23
    CREATE 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
    2
    INSERT OR REPLACE INTO index_metadata (key, last_updated, total_count, last_operation_id)
    VALUES ('main_index', 0, 0, NULL);

    初始化完成

  4. 点击 “执行”

绑定 D1 到项目

  1. 返回您的 Pages 项目
  2. 选择 “设置” → “绑定”
  3. 点击 “添加” → “D1 数据库”
  4. 填写绑定信息:
    • 变量名称img_d1(必须是这个名称)
    • D1 数据库:选择刚创建的数据库
  5. 点击 “保存”
    image.png

🔄 第四步:重新部署

绑定数据库后需要重新部署以生效:

  1. 进入项目的 “部署” 页面
  2. 找到最新的部署记录
  3. 点击右侧的 “…” 菜单
  4. 选择 “重试部署”
  5. 等待部署完成

redeploy.png

第五步:绑定域名

为你的项目配置一个域名,如使用cdn可不用配置

加入EO CDN

Cloudflare本身的速度太慢,域名备案后套上CDN会更快,如没有备案域名忽略这步
ping值:
image.png

操作

打开EdgeOne - 控制台并登陆,添加域名
image.png
点击域名管理➡️添加域名
image.png
Cloudflare page域名就是这个第一个域,直接填进去保存就行
image.png

配置存储渠道

部署完成后访问您的域名,进入管理后台配置存储渠道。

访问管理后台

访问 https://你的域名/
image.png

配置 Telegram 渠道

2.1 获取 TG_BOT_TOKEN

  • 在 Telegram 中搜索 @BotFather
  • 发送 /newbot 命令
  • 先输入你要为机器人准备的英文名字
  • 再输入机器人id,必须_bot结尾
    Screenshot_20251228_182807.jpg

  • 获得 Bot Token(格式:123456789:ABCdefGHIjklMNOpqrsTUVwxyz
    telegram-bot-creation.png
    点击上图中被打码的链接,随便发点文字把bot添加到联系人

2.2 获取 TG_CHAT_ID

  • 创建一个新的 Telegram 频道(Channel)
    76ccb5f85cec445cc6a7aa030718f01f.jpg
    2397c3b45c290a65b1a68918a5dd14a3.jpg
    点击右下角的笔➡️新建频道➡️随便填一个名字然后点右上角的确定➡️更改为私密频道
  • 将创建的 Bot 添加为频道管理员
  • 给予 Bot 消息管理的权限
    点击创建的频道名➡️点击管理员(如是英文就是第二项)➡️点击添加管理员,搜索bot的名字将他拉进来,给bot所有权限
    2397c3b45c290a65b1a68918a5dd14a3.jpg2397c3b45c290a65b1a68918a5dd14a3.jpg
    2397c3b45c290a65b1a68918a5dd14a3.jpg

  • 在频道中发送一条测试消息

  • @VersaToolsBot 转发这条消息
  • 获得频道 ID(示例:-1001234567890

2397c3b45c290a65b1a68918a5dd14a3.jpg

2.3 配置 Telegram

  1. 左上角菜单栏进入 “系统设置” → “上传设置”
  2. 找到 “Telegram 渠道配置”
  3. 点击 “添加渠道”
  4. 填入准备好的 Token 和 Chat ID:
    • 渠道名称:自定义名称(如:主渠道)
    • Bot Token:从 @BotFather 获得的 Token
    • Chat ID:频道 ID(有-号时需要保留)
    • 启用状态:开启
  5. 点击 “保存设置”

image.png

配置 R2 渠道

服务器部署时默认添加了 Cloudflare R2 存储方式,以下步骤仅针对 Cloudflare 部署方式:

  1. 在项目设置中绑定 R2 存储桶:

  2. 在管理后台配置:

    • 进入 “系统设置” → “上传设置”
    • 配置 R2 渠道参数
    • 如需图像审查,填入 R2 公开访问链接
      提示

请注意Cloudflare R2 的免费额度限制,超过后可能会产生费用。注意

🔒 安全设置

安全相关设置,在管理后台的 “系统设置” → “安全设置” 中配置

认证管理

  • 用户端认证:用于 Web 端用户登录和 API 认证
  • 管理端认证: 管理员用户名和密码,用于访问管理后台

    上传管理

图像审查

审查渠道支持 nsfwjsmoderatecontent.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

部署完成

结束,访问域名开始使用吧