Random Image API

1174 字
6 分钟
Random Image API

Random Image API#

CharyeahOwO
/
random-image-api
Waiting for api.github.com...
00K
0K
0K
Waiting...

中文 | English

Node
Node
Docker
Docker
License
License
Tests
Tests

一个自托管的随机图片 API,带管理后台。基于 Node.js + Express,无需数据库,图片存在本地文件系统。适合个人图床、壁纸站等场景。

功能#

  • 多图库管理,支持 pc(横屏)和 mobile(竖屏)分类
  • 随机图 API,默认 302 跳转到绝对图片 URL,并支持返回图片本体或 JSON
  • 图片 API 默认不缓存,静态图片文件长缓存,适合配合 CDN 使用
  • 管理后台:上传、预览、筛选、排序、批量删除
  • 上传时校验真实文件头,拒绝危险文件类型
  • Cookie Session、CSRF、Helmet、限流、CORS

路径约定#

应用挂载在 /image 子路径下。

部署#

Docker Hub 镜像(推荐)#

镜像地址:docker.io/charyeahowo/nyaovo-random-image-api:latest

docker compose 部署(点击展开)

创建 docker-compose.yml,复制以下内容,修改 ADMIN_PASSWORDSESSION_SECRET

services:
nyaovo-random-image-api:
image: charyeahowo/nyaovo-random-image-api:latest
container_name: nyaovo-random-image-api
ports:
- "3400:3000"
volumes:
- ./images:/app/public/images
environment:
PORT: 3000
PUBLIC_BASE_URL: http://localhost:3400
IMAGE_ROOT: public/images
CACHE_TTL_SECONDS: 60
RATE_LIMIT_WINDOW_MS: 60000
RATE_LIMIT_MAX: 120
ADMIN_USERNAME: admin
ADMIN_PASSWORD: changeme # ← 务必修改
SESSION_SECRET: please-change-this # ← 务必修改
ADMIN_PATH: /image/admin
MAX_FILE_SIZE_MB: 10
MAX_UPLOAD_FILES: 20
CORS_ORIGIN: "*"
restart: unless-stopped
Terminal window
docker compose up -d

容器启动时会自动修复 ./images 目录权限,无需手动 chown。

如果是从旧版本升级,首次启动可能需要几秒完成权限修复。

访问 http://localhost:3400/image,后台 http://localhost:3400/image/admin

docker run 部署(点击展开)

Terminal window
docker run -d \
--name nyaovo \
-p 3400:3000 \
-v ./images:/app/public/images \
-e ADMIN_PASSWORD=your-password \
-e SESSION_SECRET=your-secret \
-e PUBLIC_BASE_URL=http://localhost:3400 \
--restart unless-stopped \
charyeahowo/nyaovo-random-image-api:latest

挂载的 images 目录需要写权限,不要加 :ro

本地构建部署(点击展开)

Terminal window
git clone https://github.com/charyeahowo/nyaovo-random-image-api.git
cd nyaovo-random-image-api
cp .env.example .env
# 编辑 .env,至少修改 ADMIN_PASSWORD 和 SESSION_SECRET
docker compose up -d --build

如需使用本地构建而非远程镜像,请将 docker-compose.yml 中的 image 行替换为:

build:
context: .
dockerfile: Dockerfile

1Panel 部署(点击展开)

  1. 新建 Docker Compose 编排,上传项目或 Git 拉取
  2. 使用项目自带 docker-compose.yml,创建 .env 文件填写环境变量
  3. 启动后在 OpenResty / Nginx 配置反向代理绑定域名

本地运行#

Terminal window
npm install
cp .env.example .env # 编辑配置
npm start # 或 npm run dev 热更新

默认账号 admin,默认密码 changeme

Cloudflare Worker + R2 公开 API#

如果只想把随机图公开访问迁移到 Cloudflare,保留现有后台和 Docker 部署不变,可以使用新增的 Worker + R2 方案:

第一阶段只承载 /image/api/.../image/images/... 的公开访问能力,后台管理仍使用当前 Express 项目。

EdgeOne Pages + Edge Functions 公开 API#

如果主要面向国内访问加速,或想用腾讯云 EdgeOne Pages 做轻量公开访问层,可以使用新增的 EdgeOne 方案:

  • EdgeOne 代码、Pages 配置和文档位于 edgeone/
  • 迁移脚本:npm run edgeone:manifest
  • 部署说明见 edgeone/README.md

第一阶段只迁移随机图、图库列表、图片列表、统计和健康检查等公开接口;后台管理仍继续使用当前 Express 项目。

目录结构#

.
├── src
│ ├── index.js
│ ├── config.js
│ ├── imageStore.js
│ ├── routes/
│ ├── middleware/
│ └── utils/
├── public
│ ├── images/ # 图片存储
│ │ └── {gallery}/
│ │ ├── pc/
│ │ └── mobile/
│ └── assets/ # CSS, JS
├── views/ # HTML 模板
├── Dockerfile
├── docker-compose.yml
└── package.json

API#

GET /image/api/random#

随机返回一张图片。默认 302 跳转到真实图片文件的绝对 URL,适合 CDN 缓存 /image/images/... 下的图片资源;随机入口本身不缓存。图片 API 和最终静态图片响应都会带 Access-Control-Allow-Origin: *,方便主题、前端页面和跨域图片加载使用。

device 优先级高于 type。例如 /image/api/random?device=mobile&type=mobile 会按 device=mobile 选择手机竖屏图片,并使用默认 302 跳转返回;未知 type 会被忽略并按默认 redirect 处理。

返回格式说明:

默认访问 /image/api/random 等价于 /image/api/random?type=redirect。如需直接返回图片本体,可使用 ?type=image;如需 JSON,可使用 ?type=json;如需显式跳转,可使用 ?type=redirect

缓存与跨域:

  • /image/api/... 响应统一设置 Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate
  • /image/images/... 静态图片统一设置 Cache-Control: public, max-age=31536000, immutable
  • 图片 API、302 响应和静态图片响应统一带 Access-Control-Allow-Origin: *

JSON 响应示例:

{
"url": "https://example.com/image/images/anime/pc/001.webp",
"gallery": "anime",
"device": "pc",
"filename": "001.webp",
"size": 123456,
"width": 1920,
"height": 1080,
"type": "webp",
"total": 12
}

图片管理#

  • 支持格式:jpg, jpeg, png, webp, gif, avif
  • 上传时自动识别真实格式,扩展名错误也会纠正
  • 图库名仅支持小写字母、数字、下划线、短横线
  • 也可直接把图片放入 public/images/{gallery}/pcmobile 目录,程序会自动扫描

安全提醒#

  • 部署前务必修改 ADMIN_PASSWORDSESSION_SECRET
  • 建议修改 ADMIN_PATH 为不易猜到的路径
  • 反代中可为后台路径添加 IP 白名单或 Basic Auth
  • 请勿上传未授权图片用于公开服务

开源协议#

MIT License

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Random Image API
https://blog.nyaovo.com/posts/2026-06-02-730-random-image-api/
作者
小柚 (Little Pomelo)
发布于
2026-06-02
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
慕棱
不知名小站点~
公告
欢迎来到拾光物语,新站内容正在从 WordPress 迁移整理中。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
13
分类
3
标签
3
总字数
8,620
运行时长
0
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录