Loading... # OU-Image Hosting 欧记图床:给自托管新手的一键图床部署教程 玩 VPS、独服、小鸡久了,几乎每个人都会遇到同一个问题:**图片到底放哪?** 免费图床用着方便,但时间一长就可能遇到限速、删图、关站、广告骚扰。于是「欧总」做了个小项目——**OU-Image Hosting / 欧记图床**,一个给个人创作者、开发者和新手 MJJ 准备的**自托管图床**。 它不是网盘,也不是临时上传脚本,而是一间自己的「图片小屋」:上传、整理、分享都可以,还能开放给别人用。重点是后台和公共页都要顺眼、清楚、好维护。 - GitHub:<https://github.com/cshaizhihao/ou-image-hosting> - 在线体验:<https://you1.gay/> - 当前版本:v1.0.0(2026-07) - 协议:MIT - 社区讨论:[NodeSeek 原帖](https://www.nodeseek.com/post-818246-1) > 本文基于 NodeSeek 开源介绍帖、官方 README、部署文档与 v1.0.0 发布说明整合改写,适合第一次自建图床的读者。 --- ## 一、它是什么,能做什么 OU-Image Hosting 的定位一句话:**简单、轻量、自托管、偏个人和小团队使用的图床面板**。 | 场景 | 能力 | | --- | --- | | 上传图片 | 拖拽、粘贴、URL、HEIC/HEIF、JPEG/HEIC + MOV Live Photo 动态片段、公共上传、登录后上传历史 | | 分享外链 | 一键复制 URL、Markdown、HTML、BBCode | | 整理图片 | 图片库、搜索、筛选、收藏、回收站、批量操作 | | 管理相册 | 创建相册、设封面、写描述、批量加入/移出,从图片详情返回原相册 | | 公共图床 | 访客上传、公开图库、站内浮窗预览、公开/隐藏切换、上传历史分页与批量删除 | | 账号权限 | 管理员、子管理员、普通用户、访客边界分离 | | 存储方式 | 本地存储、Amazon S3、Cloudflare R2、S3-compatible | | 日常运维 | 更新、备份、恢复、回滚、诊断、日志查看 | **适合:** - 有 VPS,想自己掌控图片数据 - 写博客 / 发论坛 / 做个人图库,需要外链 - 想给别人开公共上传(但要设好限制) - 想用 Cloudflare R2 这类低成本对象存储 **不太适合:** - 纯小白且没有任何服务器 - 需要重型多用户协作/企业级管理 - 期望「零维护」——自托管图床仍需要你自己维护服务器和存储 --- ## 二、新手常见问题解答 ### Q1. 为什么不用免费图床? 主要是为了**可控**。免费图床刚开始方便,久了可能遇到:限速、图片被清、站点跑路、广告、隐私担忧。 自建图床的好处: - 图片在自己手里 - 想删就删、想迁移就迁移 - 可以自己定品牌、外观、开放策略 当然,自建也意味着要自己维护服务器和存储,更适合已经有 VPS、愿意折腾一点点自托管的朋友。 ### Q2. 适合用 Cloudflare R2 吗? 比较适合。R2 的优点是**对象存储成本低,且没有传统 S3 那种公网出口流量费用**,对个人图床、博客图床、论坛发图这类场景很友好。 OU-Image Hosting 支持: - 本地存储 - Amazon S3 - Cloudflare R2 - S3-compatible 如果只是自己玩,可先用本地存储;图片多了或想迁移方便,直接用 R2 / S3。 ### Q3. 公共上传安全吗? 公共上传一定要**注意边界**。项目把后台和公共上传做了分离,并提供: - 速率限制 - 每日额度 - 人机验证 - IP 封禁 - 审计记录 作者特别提醒:**刚开始部署时,不要无限制开放公共上传**("血的教训"——曾因开放活动被塞满劣质图片)。建议开放前先配置好上述限制。 ### Q4. 新手能装吗? 适合有一点点 VPS 基础的新手。只要你: - 会 `ssh root@服务器IP` - 能复制一条命令到服务器执行 就可以尝试。安装脚本会自动处理依赖、Docker、反向代理和服务启动。遇到网站打不开,先跑内置诊断 `ouih doctor`。 --- ## 三、一键安装 **直接在服务器上执行:** ```bash curl -fsSL https://raw.githubusercontent.com/cshaizhihao/ou-image-hosting/main/install.sh | bash ``` 安装器会自动处理:依赖、Docker Engine、Docker Compose v2、反向代理(Caddy)、服务启动。 安装完成后,打开脚本提示里的访问地址,创建第一个管理员账号就能使用。 ### Cloudflare 用户提醒 如果你用 Cloudflare 代理域名,提前确认: - DNS 已指向服务器 IP - SSL/TLS 设置为 **Full (strict)** - 服务器放行 80 / 443 端口 安装时选择 Cloudflare 模式即可。不要在 Cloudflare 用 `Flexible`。 ### 无人值守安装示例 ```bash 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 ``` --- ## 四、喂饭向基本使用流程 ### 1. 准备 - 一台 VPS(自用上传、写博客、发论坛,小机器即可) - 一个域名(非必须但推荐) - 服务器开放 80 / 443 端口 - SSH 登录权限 如果准备用 Cloudflare R2,提前备好 R2 存储桶和访问密钥。 有域名的话,加一条 DNS 记录: ``` img.example.com -> 你的服务器 IP ``` Cloudflare 用户:SSL/TLS 建议 Full (strict),确认 80/443 放行。只是体验的话也可以先不用域名,直接用安装脚本提示的地址访问。 ### 2. 安装 SSH 登录后执行: ```bash curl -fsSL https://raw.githubusercontent.com/cshaizhihao/ou-image-hosting/main/install.sh | bash ``` 脚本会自动安装依赖并启动服务,完成后输出访问地址。 ### 3. 创建管理员 打开访问地址,首次进入创建第一个管理员账号,然后进入后台。 ### 4. 上传与分享 支持: - 拖拽上传 - 粘贴上传 - URL 上传 - 公共上传 - HEIC / HEIF - JPEG/HEIC + MOV Live Photo 动态片段 上传后一键复制外链格式:URL、Markdown、HTML、BBCode。 ### 5. 整理与管理 - 搜索 / 筛选 / 收藏 / 回收站 / 批量操作 - 创建相册:设封面、写描述、批量加入图片,从图片详情返回原相册 ### 6. 开放公共上传(可选) 想给别人用,可开启公共上传,同时配置:速率限制、每日额度、人机验证、IP 封禁、审计记录。这样更适合长期开放。 --- ## 五、日常维护:`ouih` 命令 安装完成后使用 `ouih`: | 命令 | 用途 | | --- | --- | | `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`**,它会帮你把常见问题先过一遍。 --- ## 六、技术栈与架构 **技术栈:** - Next.js 15 / React 19 / Radix UI / CSS Modules - Fastify / TypeScript / Sharp - Docker Compose / Caddy - Vitest / Playwright / GitHub Actions **部署形态(三个容器):** - `web`:公开的 Next.js 进程,默认绑定宿主机回环地址 - `api`:私有的 Fastify 进程,仅内部 Docker 网络可达 - `caddy`:可选的 https profile,在 80/443 终止 TLS 并反代到 Web **架构边界(v1.0.0):** - 元数据持久化是**一个 JSON 文件**,由单个 API 进程管理 - 图片原图、缩略图、版本、备份以本地持久卷为权威来源 - PostgreSQL / Redis 环境变量只影响状态/配置上报,不把存储或任务移出 API 进程 - S3/R2 配置、探测、迁移存在,但常规图片读写仍是本地 - **只运行一个 API 副本**(多副本会竞争同一个 JSON 文件,不支持) **安全加固默认值**(Compose 自动应用):只读根文件系统、丢弃全部 Linux capabilities、`no-new-privileges`、可写存储仅限数据卷与受限 tmpfs、JSON 日志轮转、进程/内存/CPU 限制、健康检查与重启策略。 --- ## 七、配置生产环境 ```bash cp .env.production.example .env.production openssl rand -hex 32 ``` 把生成值填入 `OU_SECRET_KEY`;`APP_ORIGIN` 设为完整 HTTPS 源(无结尾斜杠);`OU_PUBLIC_HOST` 设为裸域名;`OU_PROXY_MODE` 选 `caddy` 或 `cloudflare`。 务必保留: ```dotenv NODE_ENV=production COOKIE_SECURE=true EXPOSE_DEVELOPMENT_RESET_TOKEN=false ``` 不要提交 `.env.production`。 **构建与启动:** ```bash docker compose --env-file .env.production --profile https config --quiet docker compose --env-file .env.production --profile https up -d curl --fail http://127.0.0.1:3000/api/health/ready ``` --- ## 八、备份与恢复(重要) ### 应用内备份 1. 以站点 Owner 登录 2. 打开 **Storage → Backups** 3. 创建备份并等 `completed` 4. 把归档下载到**其他机器或对象存储**(不要只留在应用卷里) 5. 记录大小与 SHA-256: ```bash sha256sum ou-image-backup-*.oubackup.gz ``` **关键限制:** v1.0 拒绝超过 64 MiB 压缩 / 256 MiB 展开、超过 5000 个文件、文件负载超 128 MiB、单文件超 24 MiB 或压缩比过高的归档。 ### 停机卷快照(大图库更推荐) ```bash docker compose --env-file .env.production stop web api docker run --rm \ -v ou-image-hosting_ou_data:/source:ro \ -v "$PWD":/backup \ alpine:3.21 \ tar -C /source -czf /backup/ou-image-volume-$(date +%Y%m%d-%H%M%S).tar.gz . docker compose --env-file .env.production start api web ``` ### 恢复演练(建议至少每季度一次) 1. 把最新异地备份恢复到隔离的 Compose 项目 2. 用不同主机端口 + 拷贝的环境文件 3. 验证代表性用户、图片、版本、分享、权限 4. 记录恢复时间与手动操作 5. 删除演练环境(别碰生产卷) 注意:应用**目前不会自动调度/导出备份**,需要你手动跑或在外部安排定时任务。存储放在 Docker 数据卷内 ≠ 灾难恢复。 --- ## 九、v1.0.0 版本亮点速览 - 【iPhone】 **更适配 iPhone**:HEIC/HEIF 上传,部分环境补充转码兜底缩略图;公共上传可选接收 Live Photo 的 MOV 动态片段 - 【设置】 **更清楚的设置中心**:站点设置 / 外观 / 图片处理拆开 - 【公共图床】 **更完整的公共图床**:公共上传首页、公共图库、站内浮窗预览、上传历史与公开/隐藏控制 - 【图片管理】 **更顺手的图片管理**:多选、批量公开/隐藏、批量收藏、加入相册、回收站、分享链接 - 【相册】 **更像相册的相册**:封面、描述、数量、排序、批量补图/移出 - 【权限】 **更清楚的权限模型**:普通用户只能公共图床与自己的历史,游客不混入管理员历史,子管理员仅站点所有者授权 - 【品牌】 **更有温度的品牌体验**:站点名、副标题、Logo、登录页/公共首页文案、主题模式与受控主题色 - 【存储】 **更友好的存储配置**:本地 / S3 / R2 / S3-compatible 配置向导与连接测试 - 【运维】 **更省心的安装与运维**:一键安装、Cloudflare 小黄云、Caddy 反代、源站证书、`ouih doctor` --- ## 十、推荐场景与总结 **比较适合:** - 个人博客 / 论坛图床 - 个人图片库与相册管理 - 小团队内部图片共享 - 想用 R2/S3 低成本存储的自托管用户 **不太适合:** - 需要超大规模 / 多副本高可用 - 需要强团队协作 / 企业级权限审计体系 - 完全不想维护任何服务 **总结一句话:** OU-Image Hosting 把「图床」做成了一个顺眼、可维护、能长期自托管的完整工具。一条命令安装,自带 Caddy 反代、Cloudflare 适配、`ouih` 运维命令和备份恢复能力;图片数据始终在自己手里。如果你正好缺一个自己的图床,值得一试。 相关链接: - 项目仓库:<https://github.com/cshaizhihao/ou-image-hosting> - 在线体验:<https://you1.gay/> - NodeSeek 讨论:<https://www.nodeseek.com/post-818246-1> --- *参考来源:NodeSeek 开源介绍帖、官方 README、部署文档、备份与恢复文档、v1.0.0 发布说明。本文为整理重写的部署与使用教程,非原文搬运。* Last modification:August 9, 2026 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏