# Mono-image-host
**Repository Path**: kukieol/Mono-image-host
## Basic Information
- **Project Name**: Mono-image-host
- **Description**: 一个部署在 Cloudflare Workers 上的私人图床
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-13
- **Last Updated**: 2026-09-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Mono image host
一个部署在 Cloudflare Workers 上的私人图床。前端使用 React、Vite 和 Tailwind CSS,图片存储在 Telegram,元数据与登录限速记录存储在 Cloudflare D1。
## 功能
- 管理密码登录,HMAC 签名 HttpOnly Cookie
- CSRF 与同源写操作保护
- 画廊公开浏览,上传与删除需登录
- 多图拖拽上传,支持 JPG、PNG、GIF、WebP
- 响应式瀑布流、公开图片直链和链接复制
- 随机图接口 `/random`,支持横竖图过滤和 JSON 输出
- 同步删除 Telegram 消息与 D1 记录
- Telegram Bot webhook 入库
- Node SQLite 本地测试后端
## 本地运行
需要 Node.js 22 或更高版本。
```bash
npm ci
npm run dev:api
npm run dev
```
本地地址为 `http://127.0.0.1:5173`,默认测试密码为 `mono-local`。本地图片和 SQLite 数据写入 `local-data/`,不会提交到仓库。
运行检查:
```bash
npm run check
npm run build
```
## Cloudflare 部署
### 1. 登录 Cloudflare
```bash
npx wrangler login
```
### 2. 一键部署
```bash
npm run deploy
```
部署脚本会按 `database_name` 自动查找 D1;不存在时创建数据库,然后自动注入临时 UUID、执行 `migrations/` 中的迁移并部署 Worker。无需手动创建数据表,也无需修改或提交 `database_id`。
如果只需要在远程数据库执行迁移:
```bash
npm run db:migrate:remote
```
### 3. 设置 Secrets
首次部署完成后设置:
```bash
npx wrangler secret put TG_BOT_TOKEN
npx wrangler secret put STORAGE_CHAT_ID
npx wrangler secret put ADMIN_PASSWORD
npx wrangler secret put SESSION_SECRET
```
`SESSION_SECRET` 应使用高强度随机值,例如:
```bash
openssl rand -hex 32
```
可选设置:
```bash
npx wrangler secret put ALLOWED_USERS
```
`STORAGE_CHAT_ID` 建议使用一个群聊:把 Bot 设为群管理员并开启“删除消息”权限后,可删除任意时间的消息。
否则 Telegram 只允许删除 48 小时内的消息,老图片将无法从 Telegram 侧真正删除。
`ALLOWED_USERS` 是允许使用 Bot webhook 的 Telegram 用户 ID 或聊天 ID,多个值用逗号分隔。
Worker 会根据当前请求域名生成图片直链。若需要固定到自定义域名,可在 Cloudflare 中绑定域名,并在 `wrangler.toml` 的 `[vars]` 中配置 `DOMAIN`。
## 随机图接口
```
GET /random # 302 跳转到一张随机图片
GET /random?o=h # 只抽横图(宽 ≥ 高)
GET /random?o=v # 只抽竖图(高 ≥ 宽)
GET /random?json # 返回随机图片的元数据 JSON
```
`o` 与 `json` 可组合使用,例如 `GET /random?o=v&json`。方形图同时匹配横竖两个方向。需要固定图片时请使用画廊里的直链。方向过滤依赖图片的宽高记录:Web 上传会自动记录;Bot webhook 上传时仅当 Telegram 返回了宽高信息(如照片)才有记录,无宽高的图片不会出现在方向过滤结果中。
### 同一页面嵌入多张随机图
浏览器会把同一页面中 URL 完全相同的并发请求合并成一次,导致多个位置显示同一张图。若需要每处各自随机,给每处引用附加任意不同的参数即可(服务端会忽略未知参数):
```html
```
动态页面可直接用时间戳生成唯一参数:`/random?o=h&r=${Date.now()}`。
### 4. Telegram webhook
仅在需要通过 Bot 消息上传时设置:
```bash
curl "https://api.telegram.org/bot/setWebhook?url=https:///webhook"
```
部署后应验证登录、上传、图片直链、列表和永久删除。Web 端单张图片默认限制为 20 MB。
## 环境变量
| 名称 | 类型 | 用途 |
| --- | --- | --- |
| `TG_BOT_TOKEN` | Secret | Telegram Bot Token |
| `STORAGE_CHAT_ID` | Secret | 存储图片的 Telegram chat ID |
| `ADMIN_PASSWORD` | Secret | Web 管理密码 |
| `SESSION_SECRET` | Secret | 会话 HMAC 密钥 |
| `ALLOWED_USERS` | Secret,可选 | Bot webhook 白名单 |
| `WEB_UPLOAD_MAX_MB` | Variable | Web 上传大小限制 |
| `SESSION_TTL_HOURS` | Variable | 登录会话时长 |
| `DOMAIN` | Variable,可选 | 固定图片直链域名 |
## License
[MIT](LICENSE)