我用 FastAPI + SQLite 给自己搭了一套自建图床

灯火阑珊
2026-09-22
点 赞
0
热 度
3
评 论
0
  1. 首页
  2. 技术
  3. 我用 FastAPI + SQLite 给自己搭了一套自建图床

一、缘起:我受够了文章里的图一条条变灰

写博客、记笔记、发帖子,图片放哪儿一直是个烦人的问题:

  • 丢到某个免费图床,过两年图床跑路,文章里全是裂图;

  • 丢进自己的对象存储,要花钱、要备案、还要管密钥;

  • 只用一家图床,它清库你图就没了;想用多家,又得记住哪张图传到了哪家。

后来看到 NiuBi 图床 这类「多接口聚合 + 302 智能中转」的玩法,思路一下就通了:

本站不存图,只存"这张图在哪些地方"这份索引;对外永远只发自己域名下的一个链接,哪个源挂了就换下一个。

换句话说,我做的不是图床,而是一堆图床之上的"套利层":空间用别人的,容灾和索引归自己。

于是有了这个小项目 —— niubi-imgbed。它跑起来只有一个 Python 进程加一个 SQLite 文件,没有 Redis、没有消息队列、没有前端构建,却能做到:图片秒传、多源并发分发、单源失效自动切换、引用链接长期有效


二、它长什么样

能力

说明

多源分发

一次上传并发推到多个第三方/自建接口,勾几个传几个

302 中转

对外只发 https://你的域名/i/{slug},真实直链藏在库里

自动容灾

源挂了自动切下一个;死源不会再被选中

定时体检

后台自检各直链,403/404/410 一次判死

秒传

相同 SHA256 直接返回旧链接,勾了新接口还会就地补传

接口即数据

表单上传接口 / S3 对象存储都支持,全在后台页面里增删改

游客直传

不登录也能传,额度按来源 IP

多用户

游客 / 免费用户 / VIP 会员 / 管理员 四档额度分级

零依赖部署

start.bat 一键起,或者 Docker 一条命令

零构建前端

原生 HTML/JS 单页,不引 CDN,断网也能正常显示

技术栈朴素得有点过分:

Python 3.14 + FastAPI + SQLite  +  原生 HTML/CSS/JS(无 npm、无 webpack)

整个项目(含前端、含测试)不到 9000 行,app/ 目录约 6500 行,main.py 里 38 个路由。


三、核心设计:为什么"不存图"反而更可靠

1. 本站只做索引,不做仓库

图片字节流从来不落在自己服务器上,本站只保存三样东西:

  • images 表:这张图的元信息(slug、文件名、SHA256、归属用户、浏览数);

  • sources 表:这张图在每个第三方上的真实直链、健康状态、失败次数;

  • data/niubi.db:唯一的数据源,备份就是拷这一个文件。

磁盘占用几乎为零,也就不用担心"自建图床把自己硬盘塞满"。

2. 一张图,多个源

上传时把同一张图并发推给多个接口。某个接口抽风、超时、限流,都不影响整体结果 —— 只要有一个成功,图就有地方待着。源越多,链接的预期寿命越长。

3. 对外只发一个链接

无论这张图最终存在 catbox、缤纷云 S3 还是 B 站图床,我给出去的永远是:

https://你的域名/i/7uwgtuir

访问它时,服务端现场决定 302 跳到哪个真实直链

仓库地址

https://github.com/clover1420/lstc

本文由ai生成


用键盘敲击出的不只是字符,更是一段段生活的剪影、一个个心底的梦想。希望我的文字能像一束光,在您阅读的瞬间,照亮某个角落,带来一丝温暖与共鸣。

灯火阑珊

站长

具有版权性

请您在转载、复制时注明本文 作者、链接及内容来源信息。 若涉及转载第三方内容,还需一同注明。

具有时效性

目录

欢迎来到灯火阑珊的站点,为您导航全站动态

12 文章数
3 分类数
8 评论数
14标签数