我所使用的是别人的开源项目,项目成品预览:CloudFlare ImgBed,认证码为:cfbed
注:请不要使用演示站点上传,图片数据无法保证
{% tip warning faa-horizontal animated-hover %}
本篇文章所有图片皆为自建图床+CDN效果,速度很快
{% endtip %}

Cloudflare部署

📂 第一步:Fork 项目

  1. 访问 CloudFlare ImgBed 项目
  2. 点击右上角的 "Fork" 按钮
    <img src="https://pic.seln.cn/file/jc/1767405750891_146f5e4b4745c6f36fb8c613abc56cf7.jpg" alt="image.png" width=70% />
  3. 选择您的 GitHub 账户
  4. 确认 Fork 完成

🏗️ 第二步:创建 Pages 项目

2.1 访问 Cloudflare Dashboard

  1. 登录 Cloudflare Dashboard
  2. 选择左侧菜单的 "计算和AI" -> "Workers & Pages"
  3. 点击 "创建应用程序"
  4. 在最下方 Looking to deploy Pages? 选择 "Get started"
    <img src="https://pic.seln.cn/file/jc/1767405757570_66cd337965fc8af67091dc22fbb5a42a.jpg" alt="pages-create.png" width=70% />
  5. 在 "导入现有 Git 存储库" 处点击 "开始使用"
    <img src="https://pic.seln.cn/file/jc/1767405761040_ba6cd0c0c4a8329a388567aa5e8806ab.jpg" alt="pages-create-1.png" width=70% />

2.2 连接 GitHub 仓库

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

2.3 配置项目设置

配置项 说明
项目名称 cloudflare-imgbed(或自定义) 项目标识符
生产分支 main 生产环境分支
构建命令 npm install 重要:构建命令
构建输出目录 / 保持默认
<img src="https://pic.seln.cn/file/jc/1767405764256_7f82b467928622c4753977e497321ce6.jpg" alt="pages-build-config.png" width=70% />

2.4 部署项目

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

🗄️ 第三步:配置数据库

注意:kv和d1只需存在一个,若两项都加可能有意料之外的问题

特点 KV 数据库 D1 数据库
读写性能 较低
免费额度
大文件上传 支持 不支持

创建 KV 命名空间

  1. 在 Cloudflare Dashboard 中选择 "存储和数据库"
  2. 点击 "Workers KV"
  3. 点击 "创建实例"
    <img src="https://pic.seln.cn/file/jc/1767405763347_5bf936ac906141db10818bc533b29a3e.jpg" alt="image.png" width=75% />
  4. 输入命名空间名称:img_url
    <img src="https://pic.seln.cn/file/jc/1767405766806_b52830873e9a09d36a8ca2f914199c9c.jpg" alt="image.png" width=75% />
  5. 点击 "创建"

绑定 KV 到项目

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

创建 D1 数据库

注意:kv和d1只需存在一个,若两项都加可能有意料之外的问题

  1. 在 Cloudflare Dashboard 中选择 "存储和数据库"
  2. 点击 "D1 SQL 数据库"
  3. 点击 "创建数据库"
    <img src="https://pic.seln.cn/file/jc/1767405773723_3b8426163b8896face1d52c5c2d71348.jpg" alt="image.png" width=50% />
  4. 输入数据库名称:img_d1(建议使用此名称)
    <img src="https://pic.seln.cn/file/jc/1767405776835_693e31b07316d9cf8f4f6a78b2d051cb.jpg" alt="image.png" width=50% />
  5. 不选择地区,点击 "创建"

初始化 D1 数据库

  1. 创建完成后,点击进入数据库详情页
  2. 选择 "控制台" 选项卡
    <img src="https://pic.seln.cn/file/jc/1767405776104_595ac90bc110f72c84a40f54113bb60f.jpg" alt="image.png" width=50% />
  3. 在 SQL 输入框中逐段粘贴并执行初始化语句
    填写示例:
    <img src="https://pic.seln.cn/file/jc/1767405787259_79707cfa9d39e7d23f412dff625d89f6.jpg" alt="image.png" width=60% />
    {% folding blue, 太多了,请展开 %}
    文件表 - 存储文件元数据
SQL
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
);

系统配置表

SQL
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
);

索引操作表

SQL
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
);

其他数据表

SQL
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
);

创建索引

SQL
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);

创建触发器

SQL
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;

插入初始的索引元数据

SQL
INSERT OR REPLACE INTO index_metadata (key, last_updated, total_count, last_operation_id)
VALUES ('main_index', 0, 0, NULL);

初始化完成
{% endfolding %}
4. 点击 "执行"

绑定 D1 到项目

  1. 返回您的 Pages 项目
  2. 选择 "设置" → "绑定"
  3. 点击 "添加" → "D1 数据库"
  4. 填写绑定信息:
    • 变量名称img_d1(必须是这个名称)
    • D1 数据库:选择刚创建的数据库
  5. 点击 "保存"
    <img src="https://pic.seln.cn/file/jc/1767405783325_83bcb6b3ce244362bad9d8ff8e314322.jpg" alt="image.png" width=60% />

🔄 第四步:重新部署

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

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

<img src="https://pic.seln.cn/file/jc/1767405803094_dac7ad1c9467d8ffe261221d912de62e.jpg" alt="redeploy.png" width=60% />

第五步:绑定域名

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

加入EO CDN

Cloudflare本身的速度太慢,域名备案后套上CDN会更快,如没有备案域名忽略这步
ping值:
<img src="https://pic.seln.cn/file/jc/1767405794925_e5fa455f55911eb601a3812f9fa37f59.jpg" alt="image.png" width=55% />

操作

打开EdgeOne - 控制台并登陆,添加域名
<img src="https://pic.seln.cn/file/jc/1767405802957_911cb3bf15f6c179495a0f9515c7baf2.jpg" alt="image.png" width=65% />
点击域名管理➡️添加域名
<img src="https://pic.seln.cn/file/jc/1767406283508_297c2427c54a8d0955e32925b80e17ce.jpg" alt="image.png" width=60% />
Cloudflare page域名就是这个第一个域,直接填进去保存就行
<img src="https://pic.seln.cn/file/jc/1767406300751_3a8093f101713711c3dfaefaaeec7dc8.jpg" alt="image.png" width=55% />

配置存储渠道

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

访问管理后台

访问 https://你的域名/
<img src="https://pic.seln.cn/file/jc/1767405808620_89d1ba37d05ebe91afc4758f9eb5ce4f.jpg" alt="image.png" width=46% />

配置 Telegram 渠道

2.1 获取 TG_BOT_TOKEN

2.2 获取 TG_CHAT_ID

<img src="https://cfbed.sanyue.de/images/deployment/telegram-channel-id.png" alt="2397c3b45c290a65b1a68918a5dd14a3.jpg" width=30% />

2.3 配置 Telegram

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

<img src="https://pic.seln.cn/file/jc/1767406498921_11541ba1fb80934d9f2300338eccbee0.jpg" alt="image.png" width=31% />

配置 R2 渠道

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

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

  2. 在管理后台配置:

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

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

🔒 安全设置

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

认证管理

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

上传管理

图像审查

审查渠道支持 nsfwjs 和 moderatecontent.com,可根据如下步骤自行配置。

moderatecontent.com
  • 访问 ModerateContent
  • 注册并获取免费 API Key(目前已不再支持免费注册)
  • 在管理后台 "系统设置" → "安全设置" 中填入 API Key

安全设置

点开菜单➡️系统设置➡️安全设置➡️管理端认证
添加用户名和密码,给自己设置一个管理员账户

🌐 网页设置

前端网页相关设置,在管理后台的 "系统设置" → "网页设置" 中配置

字段名 用途 类型 内容规范
siteTitle 网站标题 字符串 只支持字符串类型,设置为你自定义的网站标题
siteIcon 网站图标 字符串 只支持字符串类型,设置为你自定义的网站图标链接
ownerName 图床名称 字符串 只支持字符串类型,设置为你自定义的图床名称(默认为Sanyue
logoUrl 图床Logo 字符串 只支持字符串类型,设置为你自定义的图床Logo链接
bkInterval 背景切换间隔 正整数 设置为背景图的轮播时间,默认3000,单位ms。 <br>例如你希望10s切换一次,设置为10000即可。
bkOpacity 背景图透明度 (0,1]的浮点数 展示的背景图透明度,默认为1。 <br>如果你觉得显示效果不佳,可以自定义,如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"] <br>2、当字段类型为字符串时,目前仅支持字符串值为bing,设置为该值时启用bing随机图片轮播模式。
uploadBkImg 上传页背景图 列表/字符串 同loginBkImg
footerLink 页脚传送门链接 字符串 只支持字符串类型,设置为你自定义的传送地址(如个人博客链接)
disableFooter 隐藏页脚 boolean 支持boolean类型,设为true时禁用页脚,默认false
adminLoginBkImg 管理页背景图 列表/字符串 同loginBkImg

部署完成

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

评论