写在最前面

之前搞过几次公共图床的小活动,用的都是别人搭好的图床,一直就想着自己也做一个。
后来因为发的小项目没发在内板,被禁言了三天。

image

禁言的这三天没闲着,正好把这个项目继续完善了一下。

我不是程序员出身,只是站在用户的角度来做这个项目,希望下面的内容你会喜欢。

xhj018 xhj019

image

为什么做这个项目

玩 VPS、独服、小鸡时间长了,很多朋友迟早会碰到这么个问题:

  • 截图、教程图、博客配图,到底放哪合适?
  • 发论坛、写文章、写文档,图片外链怎么才能稳定?
  • 用免费图床,会不会哪天被删图、限流、压缩?
  • 想用对象存储,又嫌配置太麻烦?
  • 想自己搭个图床,又不想折腾一堆配置项?

所以就顺手做了这个小项目:OU-Image Hosting / 欧记图床

项目地址:
https://github.com/cshaizhihao/ou-image-hosting

它既不是网盘,也不是临时上传脚本,定位是一个更适合个人和小团队用的 自托管图床 / 图片库 / 相册 / 公共上传面板

思路很简单:

图片自己掌握,上传、整理、分享的过程都尽量做得舒服一些。


OU-Image Hosting 到底是什么?

OU-Image Hosting,中文叫 欧记图床,是专门给个人创作者、开发者和小团队准备的一套自托管图床方案。

它能干这些事:

  1. 自己搭建图片托管服务
  2. 上传图片并生成外链
  3. 一键复制 URL / Markdown / HTML / BBCode
  4. 管理图片库
  5. 搜索、筛选、收藏、回收站
  6. 创建相册、设置封面、写描述
  7. 支持公共上传
  8. 支持访客上传和上传历史
  9. 支持管理员、子管理员、普通用户、访客权限边界
  10. 支持本地存储
  11. 支持 Amazon S3
  12. 支持 Cloudflare R2
  13. 支持 S3-compatible 存储
  14. 支持 Docker Compose 一键部署
  15. 支持 Caddy 反向代理和 HTTPS
  16. 提供更新、备份、恢复、回滚、诊断、日志查看等维护命令

说白了,就是一个自己完全能掌控的图床面板。


新手常见问题

Q:为什么要自己搭图床?

A:核心原因就是想要可控性。

免费图床刚开始用着都挺顺手,但用久了容易碰上这些情况:

  • 图片被压缩画质变差
  • 加载速度变慢
  • 外链突然失效
  • 被限制流量
  • 平台规则说改就改
  • 图片管理起来不方便
  • 想换个地方迁移很麻烦

自己搭图床的好处在于:

  • 数据始终在自己手上
  • 可以对接 Cloudflare R2 / S3
  • 能自己绑定域名
  • 公开还是隐藏自己说了算
  • 备份、迁移、恢复都很方便
  • 发论坛、写博客、写文档链接都比较稳

当然,自建也就意味着服务器和存储都得自己维护,所以更适合手上已经有 VPS、或者打算长期折腾自托管服务的朋友。

Q:用 Cloudflare R2 做图床合适吗?

A:挺合适的。

R2 的优势是对象存储成本低,还不像传统 S3 那样收公网出口流量费,对个人图床、博客配图、论坛发图这类场景都挺友好。

OU-Image Hosting 支持:

本地存储
Amazon S3
Cloudflare R2
S3-compatible

如果只是自己玩玩,先用本地存储就够了。

如果图片数量比较多,或者想给以后迁移留个方便,建议一开始就用 R2 / S3 这类对象存储。

Q:开放公共上传会不会有风险?

A:开放公共上传一定要划清边界。

所以这个项目把管理后台和公共上传做了严格区分:

  • 管理员后台只对应管理员自己的图片库
  • 普通用户只能用公共图床、看自己的上传记录
  • 游客上传不会掺进管理员的个人历史里
  • 公共上传可以自行配置各种限制

目前公共上传这块支持的能力有:

  • 速率限制
  • 每日额度上限
  • 人机验证
  • IP 封禁
  • 操作审计记录
  • 公开/隐藏一键切换
  • 上传历史分页查看
  • 批量删除

如果你不想像我前几次搞图床活动那样被人恶意塞满乱七八糟的图片,建议刚部署的时候别直接无限制开放公共上传,这是我用血泪换来的教训。(还挺怀念当年那 100 多 G 的高清素材……)

Q:完全没经验的新手能上手吗?

A:适合有一点点 VPS 基础的新手,纯小白可能会有点吃力。

只要你会:

ssh root@服务器IP

能把一条命令复制粘贴到服务器上执行,就可以试着上手。

依赖安装、Docker 配置、反向代理、服务启动这些安装脚本都会自动搞定。

要是遇到网站打不开的情况,可以先用内置的诊断命令看看:

ouih doctor

它会自动检查 Docker、端口、DNS、HTTPS、磁盘、内存和配置这几类常见问题。


一键部署

在服务器上直接跑这条命令:

curl -fsSL https://raw.githubusercontent.com/cshaizhihao/ou-image-hosting/main/install.sh | bash

安装器会自动帮你搞定:

  • 系统依赖
  • Docker 环境
  • 项目配置
  • 反向代理
  • 服务启动

安装结束后,打开脚本提示给出的访问地址,注册第一个管理员账号,就可以直接用了。


使用 Cloudflare 的注意事项

如果你的域名走了 Cloudflare 代理,建议提前确认好:

DNS 已指向服务器 IP
SSL/TLS 设置为 Full (strict)
服务器放行 80 / 443 端口

安装的时候选 Cloudflare 模式就行。

无人值守安装的示例命令:

curl -fsSL https://raw.githubusercontent.com/cshaizhihao/ou-image-hosting/main/install.sh \
  | bash -s -- --yes --origin https://img.example.com --proxy cloudflare --port 3080

日常运维

装好之后,可以直接用这个命令:

ouih

image

常用命令与故障排查:
ouih status     查看服务状态
ouih logs       查看运行日志
ouih update     更新项目
ouih doctor     检查 Docker、端口、DNS、HTTPS、磁盘、内存和配置
ouih backup     创建备份
ouih restore    恢复备份
ouih rollback   回退最近一次成功更新
ouih url        查看访问地址
ouih dir        查看安装目录
ouih uninstall  卸载服务

如果网站打不开,建议先执行:

ouih doctor

手把手新手上手流程(附多图)

第一步:准备服务器

先准备一台 VPS,配置别太寒酸就行。

如果只是自己上传图片、写写博客、发发论坛,小机器完全够用。

需要提前准备好:

一台 VPS
一个域名,非必须但推荐
服务器开放 80 / 443 端口
SSH 登录权限

如果是刚 DD 重装好的全新小鸡就更理想了。
打算用 Cloudflare R2 的话,也可以提前把存储桶和访问密钥准备好。

第二步:配置域名解析

有域名的话,加一条 DNS 记录就行,比如:

img.example.com -> 你的服务器 IP

用 Cloudflare 的话要注意:

SSL/TLS 建议设置为 Full (strict)
确认 80 / 443 端口放行

要不要开小黄云代理,看你的部署方式和实际需求来定。

如果只是先体验一下,也可以先不配域名,直接用安装脚本给出的地址访问就行。

第三步:执行安装命令

SSH 登录到服务器后执行:

curl -fsSL https://raw.githubusercontent.com/cshaizhihao/ou-image-hosting/main/install.sh | bash

脚本会自动完成安装并启动服务,缺什么依赖它也会自动帮你装上。

安装结束后会打印出访问地址。

image

image

image

第四步:创建管理员账号

打开安装完成后给出的访问地址。

第一次进入的时候,注册第一个管理员账号。

image

创建好之后,就能进后台使用图床的各项功能了。

image

第五步:上传图片

登录后台之后就能上传图片了。

支持的上传方式有:

拖拽上传
粘贴上传
URL 上传
公共上传

HEIC / HEIF 格式也支持,包括 JPEG/HEIC 搭配 MOV Live Photo 动态片段这类场景也能处理。

image

第六步:复制外链

图片传完之后,可以一键复制成:

URL
Markdown
HTML
BBCode

不管是发 NodeSeek、写博客还是写 Markdown 文档,都能方便不少。

第七步:整理图片与相册

在后台可以对图片做各种整理:

搜索
筛选
收藏
回收站
批量操作

也支持创建相册:

设置封面
填写描述
批量加入图片
从图片详情返回原相册
第八步:开放公共上传

如果想让别人也能用,可以打开公共上传功能。

建议同时把这些配置好:

速率限制
每日额度
人机验证
IP 封禁
审计记录

这样长期开放起来才更放心。

image


所用技术栈

项目主要基于:

Next.js 15
React 19
Radix UI
CSS Modules
Fastify
TypeScript
Sharp
Docker Compose
Caddy
Vitest
Playwright
GitHub Actions

适合谁用

比较推荐:

  • 经常写博客的朋友
  • 经常在论坛发帖的朋友
  • 想自己掌控图片外链的人
  • 想用 Cloudflare R2 / S3 搭图床的人
  • 想给小团队提供一个图片上传入口的人
  • 想要个轻量图片库和相册面板的人
  • 喜欢折腾自托管服务的 MJJ

不太建议:

  • 想找一个完整网盘的人
  • 需要企业级 DAM 资产管理系统的人
  • 完全不想维护服务器的人
  • 只是想临时传张图就走的人

OU-Image Hosting 目前的定位就是:

一个简单、轻量、能自己托管、更适合个人和小团队使用的图床面板。


权限与安全边界

后台和公共上传默认就是分开的。

普通注册用户只能用公共图床、看自己的上传记录,游客上传既不会混进管理员的个人历史,也不会误入后台。

后台不会显示用户密码,只提供重置密码的入口。

公共上传建议配合各种限制一起用,尤其是开放给外部用户的时候,不建议什么限制都不加就直接裸奔。


相关文档

项目里也附带了一些文档:

部署文档
备份与恢复
安全模型
发布说明

可以直接去 GitHub 仓库里查看。


在线体验地址:

https://you1.gay/

开源仓库

GitHub 地址:

https://github.com/cshaizhihao/ou-image-hosting

欢迎给个 Star,也欢迎 fork 之后自己二次创作。

如果你正好也需要一个自己的图床,希望这个项目能让你少折腾一些。

欢迎各位 MJJ 安装体验、点个 star,也欢迎提 issue、发 PR,或者直接改成自己顺手的版本——这个项目完全是基于我以往用图床的经验和个人习惯写出来的。祝大家用得开心!