Files in the top-level directory from the latest check-in
- migrations
- public
- src
- templates
- Cargo.lock
- Cargo.toml
- config.toml.example
- docker-compose.yml
- Dockerfile
- LICENSE
- README.md
HanMan
自托管漫画聚合阅读器,基于 Rust 构建。支持多站点爬取、本地图片存储、管理后台。
功能
- 后端:Axum + Tokio 异步,SQLite 持久化,SQLx 迁移
- 爬虫:多站点 CSS 选择器配置、限速(默认 2 req/s)、User-Agent 轮换、自动重试
- 图片代理:透传 CDN 图片,自动推断 Content-Type,绕过防盗链
- 管理后台:密码保护,支持手动触发采集任务、查看任务历史
- 前端:SPA,深色/浅色双主题,响应式,键盘快捷键阅读
快速开始
本地运行
# 需要 Rust >= 1.88
cargo run
# 浏览器访问
open http://127.0.0.1:3000
Docker(推荐生产部署)
# 拉取并启动
docker compose up -d
# 查看日志
docker compose logs -f
配置
默认无需配置文件,通过环境变量覆盖关键参数:
| 环境变量 | 说明 | 默认值 |
|---|---|---|
HANMAN_HOST |
监听地址 | 127.0.0.1 |
HANMAN_PORT |
监听端口 | 3000 |
HANMAN_ADMIN_PASSWORD |
管理后台密码 | 472618 |
DATABASE_URL |
SQLite 路径 | sqlite://./data/hanman.db?mode=rwc |
RUST_LOG |
日志级别 | hanman=debug |
也可通过 config.toml 文件完整配置(参考 config.toml.example):
[server]
host = "0.0.0.0"
port = 3000
admin_password = "your_password"
[crawler]
scheduler_enabled = true
list_cron = "0 0 */6 * * *"
[sites.nnhm2]
domain = "nnhm2.com"
# ... CSS selectors
目录结构
fos-hanman/
├── src/
│ ├── main.rs # 入口,服务启动
│ ├── lib.rs # 模块导出
│ ├── config.rs # 配置加载(TOML + 环境变量)
│ ├── error.rs # 统一错误类型
│ ├── models.rs # 数据结构
│ ├── proxy.rs # 图片代理
│ ├── parser.rs # HTML 解析
│ ├── crawler/ # 爬虫(列表/详情/图片下载/调度器)
│ ├── db/ # 数据库操作(SQLx + SQLite)
│ ├── handlers/ # HTTP 路由处理器
│ └── routes/ # 路由注册 + 管理鉴权中间件
├── migrations/ # SQLx 数据库迁移
├── public/ # 前端 SPA(HTML/CSS/JS)
├── Dockerfile
├── docker-compose.yml
└── config.toml.example
API
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查 |
| GET | /api/comics |
漫画列表(分页/搜索/标签) |
| GET | /api/comics/:slug |
漫画详情 |
| GET | /api/comics/:slug/chapters/:chapter |
章节图片 |
| GET | /api/proxy-image?url= |
图片代理 |
| POST | /api/admin/crawl |
触发采集(需密码) |
| GET | /api/admin/jobs |
任务历史(需密码) |
管理接口需要在请求头中携带:X-Admin-Password: <密码>
技术栈
- Rust 1.88+,edition 2021
- Axum 0.7 · Tokio 1 · SQLx 0.7 (SQLite) · reqwest 0.12 · scraper 0.18
- 前端:原生 JS ES Modules,无框架依赖
License
MIT — 详见 LICENSE