零成本搭建高速图床

需求分析

我目前博客的图片都是存在博客的images文件夹里面的,每次在Typora写完文章要发布的时候都要重新整理图片路径太麻烦了,并且直接把图片都放到博客里面也不是长久之计。

我的需求

  1. 主打白嫖,能省就省
  2. 数据自主可控
  3. 有密码只能我一个人使用
  4. 在Typora里面添加图片可以自动上传到图床并替换好链接
  5. 有网页管理页面,我可以通过网页上传图片

方案

我想到的方案是使用 Cloudflare R2 对象存储 +CloudflareWorkers + EdgeOne +PicList

Cloudflare R2 对象存储会给每个用户10G空间,用来存图片绰绰有余。

EdgeOne 用来缓存照片,可以有效降低 Cloudflare R2 的请求命中率。

CloudflareWorkers 用来构建网页,有现成的项目可以直接修改实现。

PicList软件用于在Typora里面添加图片自动上传到图床并替换好链接。

部署教程

准备三个域名(三个子域名也可以,但主域名必须托管到CF),其中一个必须托管到CF(免费域名也可以)

一.准备CF存储桶并且配置加速链接

第一步添加R2对象存储

添加存储

存储桶名称:随便写要记住之后要用

位置:选择亚太或者用默认的

第二步启用公共开发url

启用公共开发url

第三步使用EO加速

使用EO加速

源站地址回源 HOST 头都要填写CF给你的公共开发url,回源协议HTTPS

配置网站缓存
配置网站缓存

修改默认的404页面

修改默认的404页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<link rel="icon" href="https://i.itrf.cn/favicon.ico" type="image/x-icon">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>404 - 图片走丢了</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: #0f172a;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: #f8fafc;
overflow: hidden;
position: relative;
}
/* 动态渐变背景光球 */
.bg-glow {
position: absolute;
width: 400px;
height: 400px;
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
filter: blur(120px);
border-radius: 50%;
z-index: 0;
animation: float 10s ease-in-out infinite alternate;
}
@keyframes float {
0% { transform: translate(-100px, -100px); }
100% { transform: translate(100px, 100px); }
}
/* 毛玻璃卡片容器 */
.card {
position: relative;
z-index: 1;
background: rgba(30, 41, 59, 0.7);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 40px 50px;
border-radius: 24px;
text-align: center;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
max-width: 420px;
width: 90%;
}
.error-code {
font-size: 6rem;
font-weight: 800;
background: linear-gradient(to right, #60a5fa, #c084fc);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 1;
margin-bottom: 15px;
letter-spacing: -2px;
}
h2 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 10px;
color: #e2e8f0;
}
p {
color: #94a3b8;
font-size: 0.95rem;
margin-bottom: 25px;
line-height: 1.5;
}
.btn {
display: inline-block;
background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);
color: white;
font-weight: 500;
padding: 12px 28px;
border-radius: 9999px;
text-decoration: none;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(59, 130, 246, 0.6);
}
.countdown {
margin-top: 15px;
font-size: 0.85rem;
color: #64748b;
}
</style>
</head>
<body>

<div class="bg-glow"></div>

<div class="card">
<div class="error-code">404</div>
<h2>哎呀,图片走丢了</h2>
<p>你访问的链接可能已经失效,或者输入的地址有误。</p>
<a href="占位符" class="btn" id="homeLink">返回主页</a>
<div class="countdown"><span id="sec">5</span> 秒后自动返回主页</div>
</div>

<script>
// 倒计时自动跳转逻辑
let seconds = 5;
const secTag = document.getElementById('sec');
const targetUrl = "占位符";

const timer = setInterval(() => {
seconds--;
secTag.innerText = seconds;
if (seconds <= 0) {
clearInterval(timer);
window.location.href = targetUrl;
}
}, 1000);
</script>
</body>
</html>

可以参考我的,占位符可以改成你想跳转的网站,可以填写之后要部署的网页的域名

在EO里面开启HTTPS,等待网站配置完成
现在就可以使用自己的域名来代替公共访问url了
只会要访问图床里面的图片直接使用这个域名就可以了
利用EO的缓存机制,可以有效减少CF的请求数

二.配置PicList实现自动上传图床

访问官网,安装软件,并完成相关配置

返回到CF R2对象存储 获取密钥

获取密钥1
选择 对象读和写
获取密钥2

注意密钥只会出现一次,请保存好再关闭网页

参考PicList的官方教程添加存图床,选择S3类型

添加存图床1
添加存图床2

下面的按照自己的需求配置吧,可以去看看官方文档,配置太多了

云端同步删除

移除图片基础信息

自定义上传名称

配置Typora实现自动上传,按照我的配置就可以了

文件->偏好设置->图像

Typora配置

三.部署网页

使用我二开的PixR2部署网页,新增支持图床自定义域名功能

项目文档里面有详细部署教程,下面我只做演示,推荐直接看项目文档

第一步创建CFWorkers

复制仓库里面的_worker.js里面的代码

1

2

3

4

5

6

设置完成环境变量之后需要重新部署一下Workers

第二步给网页添加自己的域名并使用EO加速

因为CFWorkers限制,我们没有办法直接加速Workers里面的添加的域名,但是经过我的研究,发现使用Workers路由可以完美解决这个问题,我们需要准备一个域名做中转,这个域名必须托管到CF

给这个域名开启小云盾,解析地址随便填写,可以填我这个

配置中转域名

添加Workers路由,不要直接在Workers里面直接添加域名,一定要用路由!!!

添加路由

打开EO添加站点

源站地址回源 HOST 头都要填写上面设置的中转域名

使用EO加速

等待部署完成,开启HTTPS,并且配置缓存,可以参考上面的缓存策略

站点加速 -> 规则引擎 -> 配置缓存

配置完成缓存策略可以减少CF命中次数

注意:网页加速和图床加速配置一个就可以了,当然你也可以都配置,环境变量IMAGE_DOMAIN填写就走图床地址,不填写就走网页地址,按照需求填写。
我推荐填写IMAGE_DOMAIN,这样软件上传和网页上传的返回的图片链接是一致的,详细请看项目里面对这个参数的介绍

注意点

  1. 源站地址回源 HOST 头 必须一致,并且回源协议选择HTTPS
  2. 不能直接用EO加速Workers给你的域名或者在Workers里面添加的域名
  3. 必须利用Workers路由绕开限制,直接加速会出现522错误码