加载头像

利用 Cloudflare + Telegram 搭建永久免费图床:零成本 Pages/D1/KV

今天给大家带来一个非常实用的 GitHub 开源项目,教大家如何利�?Cloudflare 的生态系统搭建一�?完全免费 的个人图床�?

该方案的巧妙之处在于�?使用 Cloudflare Pages 部署前端,KV 存储元数据,D1 存储数据库,而真正的图片文件则存储在 Telegram �?(利�?TG 的无限容量作为免费硬盘)�?


1. 项目准备

首先,进入本项目地址�?Fork 到你�?GitHub 账号下:

来到这个项目之后先给项目的作者点一�?star,感谢作者的辛苦付出,然后点�?fork

image-20260618152201109

2. 配置 Cloudflare Pages

没有 Claudflare 账号可以先注册一个,只需要一个邮箱就可以注册�?

  1. 登录 Cloudflare 控制台,点击 Workers �?Pages -> 创建应用程序 -> Pages -> 连接�?Git�?

    image-20260618155146906

    image-20260618155234365

    image-20260618155501792

    image-20260618155554048

    如果是第一次使用,还需要先关联登录自己的, github账号�?

    image-20260618155719028

    第一次关联会先来到这样的页面,此时需要进行仓库的关联设置�?
    image-20260618155921819

    下滑来到仓库权限设置�?

    image-20260618160113992

    可以直接选择�?cloudflare有权访问所有的仓库,同时也可以选择指定的仓库,按照个人需求进行选择�?

    许纳泽完成之后,点击 save.

    image-20260618160243009

    ⚠️ **注意!!**这里必须要点�?Save才能重新跳转�?cloudflare页面,如�?save是灰色,那就点击一下另一个选项,再点击回你期望的选项,save按钮就可以正常的点击了�?

  2. 选择你刚�?Fork 的项�?CloudFlare-ImgBed�?

    image-20260619155029789

  3. 在“构建设置”中进行如下配置�?

    • 框架预设:没�?(None)
    • 构建命令npm install
    • 构建输出路径frontend-dist
  4. 点击“保存并部署”�?

    image-20260619155116732

3. 配置 KV 数据�?

  1. 回到 Cloudflare 控制台,在选择 Storage & databeses -> Workers KV�?

image-20260619155436398

  1. 点击“创建命名空间”,名称输入:img_url�?

image-20260619155555017

image-20260619155610762

4. 绑定 KV 到项�?

  1. 进入你刚刚创建的 Pages 项目设置�?

image-20260619155926829

  1. 选择 设置 -> 绑定 -> KV 命名空间绑定�?

    image-20260619160120095

  2. 点击“添加绑定”:

  • 变量名称img_url �?必须是这个名称,否则程序无法读取*�?

image-20260619160327472

  • KV 命名空间:选择刚才创建�?img_url�?

image-20260619160609625

说明:在这个项目中,KV 仅用来存储图片的元数据(如短链接索引),它并不存储真实的图片文件。我们利�?Telegram 作为后端“硬盘”来存储实际图片�?

5. 创建 D1 数据库并初始�?

  1. 在控制台选择 Workers �?Pages -> D1�?

image-20260619160738683

点击“创建数据库”,名称建议使用:img_d1�?

image-20260619160850411

  1. 数据库位置建议选第一个�?

  2. 进入该数据库,点�?*控制�?,复制并执行以下 SQL 脚本来创建表结构�?

image-20260619160957301

image-20260619161029971

image-20260619161124154

SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 );
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 );
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 );
CREATE TABLE IF NOT EXISTS index_metadata ( key TEXT PRIMARY KEY , last_updated INTEGER , total_count INTEGER DEFAULT 0 , last_operation_id TEXT, chunk_count INTEGER DEFAULT 0 , chunk_size INTEGER DEFAULT 0 , created_at DATETIME DEFAULT CURRENT_TIMESTAMP , updated_at DATETIME DEFAULT CURRENT_TIMESTAMP );
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 );
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);
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 ;

6. 绑定 D1 数据�?

  1. 回到 Pages 项目�?设置 -> 绑定�?

image-20260619161247787

  1. 找到 *D1 数据库绑�?,点击“添加绑定”:

    • 变量名称img_d1
    • *D1 数据�?:选择刚才创建�?img_d1

    image-20260619161324982

    image-20260619161358235

7. 重新部署并生�?

  1. �?Pages 项目中点�?部署 选项卡�?
  2. 在最近的一条部署记录右侧点击三个点 ...,选择 重新部署�?

image-20260619161541042

  1. 等待部署完成,访问你�?Pages 域名�?

image-20260619161806327

  1. 安全提醒:首次登录后,请务必第一时间进入后台修改管理员账号、密码以及上传密码�?

    image-20260619161921387

    image-20260619162004445

    image-20260619162043177

8. 获取 Telegram 配置

  1. 获取 Token:关注机器人 @BotFather,根据提示创建一个新机器人,获取 API Token�?

�?image-20260619190748834

image-20260619190952976

按照提示的步骤创建一个机器人,创建完成之后保存自己创建的机器人的 API_token.

image-20260619191136087

  1. 获取 Chat ID:关注机器人 @VersaToolsBot,向其发送一条消息即可获得你的个�?Chat ID�?

image-20260619191307351

  1. 将保存好�?bot_token �?聊天id 填入图床的渠道配�?

�?image-20260619191432733

image-20260619191456568

image-20260619191521548

最后填�?配置信息�?

image-20260619191553965


评论
✅ 你无需删除空行,直接评论以获取最佳展示效果
avatar
status
一个相信技术不该有门槛的普通人。拆解晦涩的概念,分享趁手的数字工具,让每个愿意学习的人都能跟上这个数字时代
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體