ArturoYi
博客

PicDepot:只靠 Cloudflare 的自建图床

上传、文件库和公网直链都放在 Cloudflare 上。元数据进 D1,文件进 R2,看图不经过 Worker。

PicDepot 是我写的一套自建图床。登录后上传,文件库里管理,复制出来的是 R2 公网直链。运行时只有 Cloudflare:页面和 API 在 Workers 上,元数据在 D1,文件在 R2。

当前版本是 0.1.0。仓库可以直接拉下来自己部署。用法、配置和接口写在文档站里,中文是默认语言,英文在 /en/。站点的 Web 示例 里也能直接打开仓库。

项目初衷

我需要一个自己的图床,给笔记配图,也给自己传点文件。常见方案会再接 Telegram、S3、WebDAV 或者 Docker,我只想留在 Cloudflare 这一套里:一个账号、一次部署、账单也能看懂。

读文件走 R2 直链,不经过 Worker。列表只查 D1,不扫存储桶。这样看图的流量尽量不吃 Worker 的免费额度。

这个站点里的截图,就是从我自己部署的实例上取的直链。它是给自己用的图床,上传要登录,公开直链一旦发出去谁都能打开。如果你要的是防盗链、私有读,或者不经 Cloudflare 的对象存储,这里还不是那个产品。

它做了什么

0.1.0 已经能日常传图、找文件、复制链接。

  • 上传。首页要先登录。可以拖拽、点选、粘贴,也可以选整个文件夹。单文件上限 20MB,不分片。目录可以手填,已有目录会联想;留空时图片进 image,视频进 video,其它文件留在根目录。选过的目录会记在这台浏览器里。
  • 预览格式。HEIC、HEIF、TIFF 会在浏览器里转成 WebP,转不了再退回 JPEG,质量拉满,尽量少压一次。多页 TIFF 取面积最大的那一页。解码只在浏览器里做,不打进 Worker。
  • 链接。上传成功后可以复制直链、Markdown、HTML <img> 和 BBCode。直链域名来自你配置的 R2_PUBLIC_BASE_URL。
  • 文件库。分页、搜索,按目录或类型筛选。可以预览、改名、改目录,也可以批量删除、批量移动。图片预览支持缩放和平移。默认先藏起名为「博客」的目录,避免配图把列表撑满;点进这个目录仍然能看到。
  • 账号。库里还没有用户时,登录页可以做首次初始化,创建管理员。之后只有管理员能在后台加账号。上传和管理都校验登录会话。
  • 状态。后台能看已用空间、类型和目录分布,以及近 24 小时、7 日、30 日的上传量。占用百分比默认按 10GB 来算,只用于展示,上传时不会因为超过这个数被拦住。设成 0 就不显示百分比。

对象路径按 files/年/月/随机 id.扩展名 存放。删文件时会同时去掉 R2 对象和 D1 记录。

这一版还没做的,代码里留了位置:API Token(api_tokens 表)、标签筛选(files.tags)、以及 private / blocked 这一类可见性。上传接口现在要带登录 Cookie。PicGo 这类客户端如果带不了 Cookie,接不上。

怎么使用

本地跑起来

需要 Node.js 22 以上,包管理器用 pnpm 或 npm。

pnpm install
pnpm dev

健康检查是 http://localhost:3000/api/health。

本地要通过 wrangler.toml 绑上 D1 和 R2。没绑定时,上传和后台接口会返回 503。.env 只给本地覆盖配置用,部署到 Cloudflare 时不读它。

直链如果 404,多半是文件写进了本地模拟桶,公网地址却指向云端的桶。需要连远程桶时,先 wrangler login,再在 wrangler.toml 里给 R2 打开 remote。

部署

生产跑在 Workers + Assets 上,用 Nitro 的 cloudflare_module。它不是 Cloudflare Pages。

上线前先在 Cloudflare 建好 D1 和 R2,给 R2 打开公网访问(r2.dev 或自定义域名),把绑定和 R2_PUBLIC_BASE_URL 写进 wrangler.toml 或控制台变量,再执行一次:

pnpm db:migrate:remote

我自己用的是 Cloudflare 控制台的 Workers Builds:仓库连上之后由它构建并发布。本地 pnpm deploy 只在排障时用。文档站走另一条 GitHub Actions,发到 GitHub Pages,和应用 Worker 无关。

完整对照和排错见 部署指南。

传一张图

打开站点会先到登录页。第一次没有用户,走「首次初始化」建管理员,之后用用户名和密码登录。

首页右上角选目录,或保持「自动归类」。把图片拖进去、粘贴,或点「选择文件夹上传」。成功后从复制菜单里取需要的格式。顶栏会显示当前版本号。

管理

管理员从后台进文件库、用户和状态。文件库里可以搜索、改名、挪目录、删除。用户页只能由管理员创建账号。

直链是公开的。发出去之后,拿到链接的人都能打开,不需要再登录。不要把不想公开的文件传上来。R2 公网域名和自定义域名都要自己保管好。

协议和反馈

项目以 MIT License 发布。你可以自由使用、复制、修改、合并、发布和再分发,包括用在闭源项目里,只要保留版权和许可声明。

软件按现状提供。我不保证它没有缺陷,也不对文件丢失、直链泄露或误删负责。Nuxt、Wrangler 以及 Cloudflare 各项服务各有自己的协议和配额。

用的过程中如果上传失败、直链打不开,或者列表和桶里的文件对不上,请到 Issues 开一条。这是个人项目,回复可能慢,也不是每条都能修。

写的时候请带上:

  • 部署方式:本地 pnpm dev、Workers Builds,或本地 Wrangler
  • 应用版本号,在顶栏
  • 你做了什么、实际看到什么、你本来期望什么
  • 接口返回的状态码;能稳定复现最好
不要在 Issue 里贴 Cloudflare API Token、管理员密码、会话 Cookie,或尚未公开的文件直链。用测试文件复现就够了。

功能建议也可以开 Issue。API Token 和私有读都在计划边上,不保证下一版就做。

Copyright © 2026