ImageFlow:自托管图片管理与智能分发平台,一个 API 搞定图片优化
前言
网站上的图片是个麻烦事。
一张照片拍出来 5MB,直接放网页上加载半秒钟。转成 WebP 缩小到 200KB,但 Safari 旧版本不支持。换成 AVIF 更小,但 Firefox 的支持又滞后了几个版本。
手动转格式、维护多套分辨率、给不同设备配不同图片 —— 这些体力活在 2026 年应该自动化了。
ImageFlow 就是干这个的。它像一个图片中间层:你把原图丢进去,它自动转成 WebP 和 AVIF,然后根据访问者的浏览器和设备类型,智能选择最优格式返回。
它到底做了什么
简化版流程:
上传原图 → ImageFlow 接收 ├── 存储原始文件 ├── 异步转 WebP + AVIF └── 元数据入库(Redis)
访问图片 → 分析 User-Agent ├── 检测浏览器支持(AVIF > WebP > 原图) ├── 检测设备方向(横屏/竖屏) └── 返回最佳格式关键在于「智能选择」—— 不是简单转个格式,而是根据访问者的实际情况动态决策。Chrome 用户拿 AVIF,Safari 用户拿 WebP,老浏览器拿原图。这个决策过程发生在每次请求时,不需要你手动维护多套 URL。
Docker 部署
git clone https://github.com/Yuri-NagaSaki/ImageFlow.gitcd ImageFlowcp .env.example .env编辑 .env,至少改两个:
API_KEY=your-strong-key-here # 管理 API 认证STORAGE_TYPE=local # 或 s3启动:
docker compose up -d三个容器:前端(Next.js,
)、后端(Go + libvips, )、Redis(缓存 + 元数据)。存储方案
本地存储(默认)
STORAGE_TYPE=localLOCAL_STORAGE_PATH=static/images图片存在容器卷里,Docker Compose 映射到宿主机 ./data/images。小站点够用。
S3 存储(生产推荐)
STORAGE_TYPE=s3S3_ENDPOINT=https://xxx.r2.cloudflarestorage.comS3_ACCESS_KEY=xxxS3_SECRET_KEY=xxxS3_BUCKET=imageflowCUSTOM_DOMAIN=https://cdn.yourdomain.com # 可选 CDN 加速支持 AWS S3、Cloudflare R2、MinIO 等所有 S3 兼容存储。CUSTOM_DOMAIN 可选,配了之后返回的图片 URL 走 CDN。
在网站中使用
上传图片后,通过 API 获取:
<!-- 随机图片(自动根据浏览器选格式) --><img src="https://img.yourdomain.com/api/random?format=webp">
<!-- 按标签过滤 + 强制方向(移动端) --><img src="https://img.yourdomain.com/api/random?tags=nature&orientation=portrait">API 支持的参数:
| 参数 | 作用 |
|---|---|
format | 指定格式(webp / avif),也可不指定让系统自动选 |
tags | 按标签过滤 |
orientation | 横屏 landscape / 竖屏 portrait |
ImageFlow 返回的图片带 Cache-Control: max-age=31536000,浏览器缓存一年。建议在前面套一层 CDN,CDN 缓存 + ImageFlow 自动格式 = 最佳体验。
管理界面
前端 :3000 端口提供 Web 管理界面,支持拖拽上传、标签管理、图片浏览。API 也支持批量上传:
curl -X POST https://img.yourdomain.com/api/upload \ -H "Authorization: Bearer $API_KEY" \ -F "images[]=@photo1.jpg" \ -F "images[]=@photo2.png" \ -F "tags=blog,2026"跟传统图床的区别
传统图床(PicList + R2)是你手动转格式然后上传固定 URL。ImageFlow 的思路是:你只管传原图,格式和分发它帮你做决策。
| ImageFlow | PicList + R2 | |
|---|---|---|
| 格式转换 | 自动(上传时转) | 手动(PicList 可设规则) |
| 智能分发 | 根据浏览器自动选格式 | 固定 URL |
| 管理界面 | Web UI + API | PicList 客户端 |
| 适用场景 | 网站图片服务、动态分发 | 博客写作、固定配图 |
两者不冲突 —— 写文章配图用 PicList,网站需要动态图片服务用 ImageFlow。
性能调优
关键参数在 .env 里:
IMAGE_QUALITY=80 # 画质 75-85 是网页最佳区间WORKER_THREADS=4 # 等于 CPU 核心数WORKER_POOL_SIZE=4 # 核心数 ×2- CPU 多就拉高
WORKER_THREADS,上传后转换更快 - 内存小就降低
WORKER_POOL_SIZE,减少并发处理 - 全是照片(照片细节多)→
IMAGE_QUALITY=85;图标截图类 →IMAGE_QUALITY=75
总结
ImageFlow 解决的是「网站图片多了之后怎么管」这个问题。自动转格式 + 智能分发 + S3 存储 + CDN 前置,适合博客、图库、电商等需要大量图片的网站。
Docker 一条命令部署,配好 .env 就能用。跟 PicList 的区别在于:PicList 是写作工具,ImageFlow 是网站基础设施。如果只是博客配图,PicList 够了;如果需要给用户提供图片服务,ImageFlow 值得一试。