Files
HYC Fixer dfae749612 P2: 清理与一致性
- CLI: --preset 实际生效;--directory-listing/--enable-stats/--enable-*/--ignore-hidden 支持 true/false(修复 type=bool 陷阱),未显式传入时不再覆盖 settings.json
- 版本号统一 v2.3(settings.json/config.py/v1/v2/Dockerfile)
- 移除硬编码 /tmp/pypi_debug.log 写文件;v2 裸 except 改记录错误返回 500
- webhook id 非法输入返回 400;下载趋势 timedelta 导入提升修复 NameError
- 打包模式 auth_token 写入 exe 目录(不再写入 _MEIPASS)
- README 修正: 线程池架构、pyinstaller 构建方式
- mirrors/__init__.py ' Quay.io' 笔误;chunked 响应去掉 Content-Length;docs/ui realpath 边界
- SQLite WAL+busy_timeout;下载计数原子 UPDATE
- requirements 移除未使用的 cachetools/apscheduler
2026-08-30 12:25:26 +08:00

721 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HYC下载站 v2.3
模块化重构的Python镜像文件服务器,支持API版本化、实时通信、系统监控、数据库集成等高级功能。
## 项目结构
```
mirror_server/
├── main.py # 主入口文件
├── requirements.txt # 依赖列表
├── settings.json # 主配置文件
├── auth_token.txt # 认证令牌文件
├── api/ # API模块
│ ├── __init__.py
│ ├── router.py # API路由器
│ ├── v1.py # API v1(基础功能)
│ ├── v2.py # API v2(增强功能)
│ ├── admin.py # 管理接口
│ ├── ws_handler.py # WebSocket处理
│ ├── sse_handler.py # SSE事件流
│ └── docs/ # API文档
├── core/ # 核心模块
│ ├── __init__.py
│ ├── config.py # 配置管理
│ ├── config_hotreload.py # 配置热重载
│ ├── utils.py # 工具函数
│ ├── server.py # 服务器核心
│ ├── database.py # 数据库管理
│ ├── mirror_sync.py # 镜像同步管理
│ ├── sync_scheduler.py # 同步调度器
│ ├── sync_engine.py # 同步引擎
│ ├── cache_manager.py # 缓存管理
│ ├── cache_prewarm.py # 缓存预热
│ ├── monitor.py # 系统监控
│ ├── health_check.py # 健康检查
│ ├── alerts.py # 告警系统
│ ├── security.py # 安全模块
│ ├── api_auth.py # API认证
│ ├── api_docs.py # API文档
│ ├── optimization.py # 性能优化
│ ├── scheduler.py # 任务调度
│ ├── graceful_restart.py # 优雅重启
│ └── prometheus.py # Prometheus监控
├── handlers/ # HTTP请求处理器
│ ├── __init__.py
│ └── http_handler.py # HTTP请求处理
├── mirrors/ # 镜像加速源模块
│ ├── __init__.py
│ ├── http.py # HTTP/HTTPS镜像
│ ├── docker.py # Docker Hub镜像
│ ├── apt.py # APT镜像
│ ├── yum.py # YUM镜像
│ ├── pypi.py # PyPI镜像
│ ├── npm.py # npm镜像
│ └── go.py # Go镜像
├── scripts/ # 辅助脚本
├── data/ # 数据目录
├── docker/ # Docker配置
└── k8s/ # Kubernetes配置
```
## 安装
```bash
pip install -r requirements.txt
```
### 依赖
- psutil - 系统监控
- python-multipart - 多部分表单数据处理
- paramiko - SFTP支持(可选)
## 使用
### 基本使用
```bash
# 启动服务器(默认端口8080)
python main.py
# 指定端口和目录
python main.py -p 8080 -d ./downloads
# 启用HTTPS
python main.py --ssl-cert cert.pem --ssl-key key.pem
# 使用配置文件
python main.py --config config.json
# 指定API版本 (默认: v2)
python main.py --api-version v2
# 使用settings.json配置文件
python main.py --settings settings.json
# 检查系统兼容性
python main.py --check-compat
```
### 认证
```bash
# 无认证
python main.py --auth-type none
# 基本认证
python main.py --auth-type basic --auth-user admin --auth-pass password
# 令牌认证
python main.py --auth-type token --auth-token your_token_here
```
### 功能开关
```bash
# 禁用监控/同步/加速源
python main.py --enable-monitor --enable-sync --enable-mirrors
# 禁用WebSocket/SSE (适合低端设备)
python main.py --disable-ws --disable-sse
# 禁用文件哈希计算
python main.py --disable-hash
# 启用下载统计
python main.py --enable-stats --show-hash
# 启用目录浏览
python main.py --directory-listing true
```
### 镜像加速源
```bash
# 启用/禁用所有加速源功能
python main.py --enable-mirrors # 启用
python main.py --enable-mirrors=false # 禁用
# 各个镜像的启用/禁用通过 settings.json 配置
# 在 mirrors.xxx.enabled 中设置,例如:
# "docker": { "enabled": true, ... }
# "pypi": { "enabled": true, ... }
```
### 镜像同步配置
镜像同步支持多种同步类型,通过 `settings.json` 中的 `sync_sources` 配置:
```json
{
"mirrors": {
"my-http-mirror": {
"type": "http",
"url": "https://example.com/mirror/",
"target": "downloads/mirror",
"enabled": true,
"auto_sync": true,
"schedule": { "enabled": true, "type": "cron", "cron": "0 4 * * *" }
},
"my-ftp-mirror": {
"type": "ftp",
"host": "ftp.example.com",
"port": 21,
"username": "anonymous",
"password": "[email protected]",
"remote_path": "/pub",
"target": "downloads/ftp",
"enabled": true
},
"my-sftp-mirror": {
"type": "sftp",
"host": "sftp.example.com",
"port": 22,
"username": "syncuser",
"password": "password",
"private_key": "/path/to/id_rsa",
"remote_path": "/mirror",
"target": "downloads/sftp"
},
"my-git-repo": {
"type": "git",
"url": "https://github.com/example/repo.git",
"branch": "main",
"depth": 1,
"target": "downloads/git"
},
"my-s3-mirror": {
"type": "s3",
"endpoint": "https://s3.amazonaws.com",
"bucket": "my-bucket",
"access_key": "AKIAIOSFODNN7EXAMPLE",
"secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"region": "us-east-1",
"prefix": "mirrors/",
"target": "downloads/s3"
},
"my-oss-mirror": {
"type": "oss",
"bucket": "my-bucket",
"access_key": "your-access-key",
"secret_key": "your-secret-key",
"region": "cn-hangzhou",
"target": "downloads/oss"
},
"my-cos-mirror": {
"type": "cos",
"bucket": "my-bucket",
"access_key": "your-access-key",
"secret_key": "your-secret-key",
"region": "ap-guangzhou",
"target": "downloads/cos"
},
"my-rsync-mirror": {
"type": "rsync",
"source": "rsync://rsync.example.com/module/path",
"target": "downloads/rsync",
"exclude": ["*.tmp", "*.log"]
},
"my-local-mirror": {
"type": "local",
"path": "/mnt/external drive/mirrors",
"target": "downloads/local"
}
}
}
```
**支持的同步类型:**
| 类型 | 说明 | 必需配置 |
|------|------|----------|
| `http` / `https` | HTTP/HTTPS同步 | `url`, `target` |
| `ftp` | FTP同步 | `host`, `target` |
| `sftp` | SFTP同步 | `host`, `username`, `target` |
| `rsync` | Rsync同步 | `source`, `target` |
| `git` | Git仓库克隆/更新 | `url`, `target` |
| `s3` | AWS S3 / MinIO | `bucket`, `access_key`, `secret_key`, `endpoint` |
| `oss` | 阿里云OSS | `bucket`, `access_key`, `secret_key` |
| `cos` | 腾讯云COS | `bucket`, `access_key`, `secret_key` |
| `webdav` | WebDAV同步 | `url`, `username`, `password` |
| `local` | 本地目录同步 | `path`, `target` |
### 下载限速
```bash
# 全局限速 (字节/秒)
python main.py --rate-limit 10485760 # 10MB/s
```
### 低端设备优化
```bash
# 使用预设配置
python main.py --preset ultra_low # 超低功耗
python main.py --preset low # 低配置
python main.py --preset medium # 中等
python main.py --preset high # 高性能
python main.py --preset auto # 自动检测
# 自定义参数
python main.py --memory-limit 256M \
--workers 2 \
--chunk-size 64K \
--buffer-size 128K
```
### 调试选项
```bash
# 启用所有调试
python main.py --debug
# 启用特定调试
python main.py --debug-http
python main.py --debug-auth
python main.py --debug-api
python main.py --debug-v2
python main.py --debug-error
python main.py --debug-download
# 输出到调试文件
python main.py --debug-log /var/log/hyc-debug.log
# 指定调试类型
python main.py --debug-types http auth api v2 error
# 详细输出
python main.py -v
python main.py -vv
python main.py -q # 静默模式
```
### 启动参数完整列表
```
服务器配置:
--host HOST 监听地址 (默认: 0.0.0.0)
-p, --port PORT 监听端口 (默认: 8080)
-d, --base-dir DIR 文件存储目录 (默认: ./downloads)
--server-name NAME 服务器名称 (默认: HYC下载站)
HTTPS配置:
--ssl-cert FILE SSL证书文件路径
--ssl-key FILE SSL私钥文件路径
认证配置:
--auth-type TYPE 认证类型: none/basic/token (默认: none)
--auth-user USER 基本认证用户名 (默认: admin)
--auth-pass PASS 基本认证密码
--auth-token TOKEN 令牌认证密钥
功能配置:
--directory-listing BOOL 启用目录浏览 (默认: True)
--enable-stats BOOL 启用下载统计 (默认: True)
--show-hash 显示文件哈希值
--ignore-hidden 忽略隐藏文件 (默认: True)
--max-upload-size SIZE 最大上传文件大小 (默认: 1G)
--api-version VERSION API版本: v1/v2 (默认: v2)
实时通信:
--enable-ws 启用WebSocket (默认: True)
--enable-sse 启用SSE (默认: True)
系统监控:
--enable-monitor 启用系统监控 (默认: True)
--monitor-interval SEC 监控采集间隔(秒) (默认: 5)
同步配置:
--enable-sync 启用镜像同步 (默认: True)
--sync-config FILE 同步配置文件路径
镜像加速源:
--enable-mirrors 启用下载加速源 (默认: True)
# 各个镜像通过 settings.json 配置 (mirrors.xxx.enabled)
下载限速:
--rate-limit BYTES 全局下载限速 (默认: 0=不限速)
低端设备优化:
--preset PRESET 设备预设: ultra_low/low/medium/high/auto (默认: auto)
--memory-limit SIZE 内存限制 (例如: 256M, 512M, 1G)
--workers NUM 工作进程数 (0=自动)
--chunk-size SIZE 文件传输块大小 (默认: 128K)
--buffer-size SIZE 缓冲区大小 (默认: 256K)
--disable-ws 禁用WebSocket
--disable-sse 禁用SSE
--disable-hash 禁用文件哈希计算
--check-compat 检查系统兼容性后退出
日志配置:
--access-log FILE 访问日志文件路径
-v, --verbose 详细输出 (可叠加: -vvv)
-q, --quiet 静默模式
调试选项:
-D, --debug 启用所有调试输出
--debug-log FILE 调试日志文件路径
--debug-http 调试HTTP请求
--debug-auth 调试认证检查
--debug-api 调试API路由
--debug-v2 调试V2 API
--debug-error 调试错误堆栈
--debug-download 调试下载记录
--debug-types TYPES 指定调试类型列表
配置文件:
--settings FILE 默认配置文件路径 (默认: settings.json)
--config FILE 覆盖配置文件路径 (JSON格式)
```
## API版本
### API v1 - 基础功能
- 文件管理:上传、下载、删除、搜索
- 目录浏览
- 基础统计
- 同步管理(HTTP/HTTPS、FTP、SFTP、本地)
#### 示例API端点
```
GET /api/v1/files # 列出文件
GET /api/v1/file/{path} # 获取文件信息
DELETE /api/v1/file/{path} # 删除文件
POST /api/v1/upload # 上传文件
GET /api/v1/search?q={term} # 搜索文件
GET /api/v1/stats # 获取统计
GET /api/v1/health # 健康检查
POST /api/v1/sync/start # 开始同步
```
### API v2 - 增强功能
继承v1所有功能,额外提供:
- 增强搜索(模糊匹配、正则表达式、内容搜索)
- 按标签和日期范围搜索
- 文件元数据管理
- 文件版本控制
- 缩略图生成
- 实时服务器监控
- Webhook支持
- 历史数据分析
#### 示例API端点
```
GET /api/v2/search/enhanced?q={term} # 增强搜索
GET /api/v2/search/by-tag?tag={tag} # 按标签搜索
GET /api/v2/search/by-date?start={date} # 按日期搜索
GET /api/v2/stats/detailed # 详细统计
GET /api/v2/stats/trending # 热门文件
GET /api/v2/file/{path}/metadata # 获取文件元数据
PUT /api/v2/file/{path}/metadata # 更新文件元数据
GET /api/v2/file/{path}/versions # 获取文件版本
POST /api/v2/file/{path}/versions # 创建文件版本
GET /api/v2/file/{path}/thumbnail?w=200&h=200 # 获取缩略图
GET /api/v2/monitor/realtime # 实时监控
GET /api/v2/webhooks # 列出webhooks
POST /api/v2/webhooks # 创建webhook
```
## 配置
### 配置文件示例
参考 `config.example.json`
### 命令行参数
```
服务器配置:
--host 监听地址 (默认: 0.0.0.0)
-p, --port 监听端口 (默认: 8080)
-d, --base-dir 文件存储目录 (默认: ./downloads)
--server-name 服务器名称
HTTPS配置:
--ssl-cert SSL证书文件路径
--ssl-key SSL私钥文件路径
认证配置:
--auth-type 认证类型: none, basic, token
--auth-user 基本认证用户名
--auth-pass 基本认证密码
--auth-token 令牌认证密钥
功能配置:
--no-directory-listing 禁用目录浏览
--no-stats 禁用下载统计
--show-hash 显示文件哈希值
--max-upload-size 最大上传文件大小 (默认: 1G)
--sync-config 同步配置文件路径
--api-version API版本: v1, v2 (默认: v1)
日志配置:
--access-log 访问日志文件路径
-v, --verbose 详细输出
-q, --quiet 静默模式
配置:
--config 配置文件路径 (JSON格式)
```
## 模块说明
### core/ - 核心模块
- **config.py**: 配置管理和验证,支持多级配置合并
- **config_hotreload.py**: 配置文件热重载,无需重启生效
- **utils.py**: 通用工具函数(文件大小格式化、哈希计算等)
- **server.py**: 服务器核心类(基于标准库 http.server 的线程池服务器)
- **database.py**: 数据库管理,支持SQLite/MySQL/PostgreSQL
- **mirror_sync.py**: 镜像同步管理器(支持HTTP/HTTPS、FTP、SFTP、本地、Rsync、Git、S3/OSS/COS、WebDAV)
- **sync_scheduler.py**: 同步调度器,定时执行同步任务
- **sync_engine.py**: 同步引擎,核心同步逻辑
- **cache_manager.py**: 缓存管理,智能缓存策略
- **cache_prewarm.py**: 缓存预热,启动时预加载热门资源
- **monitor.py**: 系统监控,CPU/内存/磁盘/网络实时监控
- **health_check.py**: 健康检查,系统组件状态检测
- **alerts.py**: 告警系统,异常情况自动告警
- **security.py**: 安全模块,防护和审计
- **api_auth.py**: API认证,Token/Basic认证
- **api_docs.py**: API文档自动生成
- **optimization.py**: 性能优化,自动检测设备配置
- **scheduler.py**: 通用任务调度器
- **graceful_restart.py**: 优雅重启,服务无缝更新
- **prometheus.py**: Prometheus监控指标导出
### api/ - API模块
- **router.py**: API路由器,支持版本化
- **v1.py**: API v1实现(基础功能)
- **v2.py**: API v2实现(增强功能,继承v1)
- **admin.py**: 管理接口,Webhooks管理
- **ws_handler.py**: WebSocket处理,实时双向通信
- **sse_handler.py**: SSE事件流,单向实时推送
- **docs/**: API文档 (index.html, api.md)
### handlers/ - HTTP请求处理器
- **http_handler.py**: HTTP请求处理,包括文件服务、目录浏览等
## 特性
- ✅ 模块化设计,易于扩展
- ✅ API版本化支持(v1/v2)
- ✅ 镜像同步(HTTP/HTTPS、FTP、SFTP、Rsync、Git、S3/OSS/COS、WebDAV、本地目录)
- ✅ 文件上传下载(支持断点续传)
- ✅ 目录浏览(镜像站风格)
- ✅ 认证支持(无、基本认证、令牌认证)
- ✅ HTTPS支持
- ✅ 下载统计
- ✅ 文件搜索(基础/增强/正则)
- ✅ 批量操作
- ✅ 压缩/解压缩
- ✅ 增强搜索(v2)
- ✅ 文件元数据管理(v2)
- ✅ 服务器监控(v2)
- ✅ Webhook支持(v2)
- ✅ 实时通信(WebSocket + SSE)
- ✅ 数据库支持(SQLite/MySQL/PostgreSQL)
- ✅ 缓存系统(智能/手动/全同步)
- ✅ 配置热重载
- ✅ 优雅重启
- ✅ Prometheus监控
- ✅ 告警系统
- ✅ 设备自动优化
- ✅ 多镜像加速源(Docker/APT/YUM/PyPI/npm/Go)
- ✅ Web管理界面
## 开发
### 添加新的API版本
1. 在 `api/` 目录下创建 `v3.py`
2. 继承 `APIv2` 或 `APIv1`
3. 实现所需方法
4. 在 `api/router.py` 中注册新版本
### 添加新的同步类型
在 `core/mirror_sync.py` 的 `MirrorSyncManager` 类中:
1. 添加 `_sync_{type}` 方法
2. 实现同步逻辑
3. 在 `_sync_worker` 中添加路由
## 构建和部署
### 使用 PyInstaller 打包成二进制文件
#### 构建当前平台
项目提供 PyInstaller 打包配置,可以将项目打包成当前平台的二进制可执行文件。
```bash
# 安装 PyInstaller
pip install pyinstaller
# 构建当前平台(使用仓库内的打包配置)
pyinstaller hyc-download.spec
# 使用旧的打包配置(含 aiohttp 隐藏依赖,已弃用)
# pyinstaller pyinstaller.spec
```
**支持的平台(仅当前平台):**
- Linux: amd64, arm64, 386
- Windows: amd64, 386
- macOS: amd64, arm64
构建完成后,二进制文件和发布包会输出到 `dist/` 目录。
#### 跨平台构建(GitHub Actions)
使用 GitHub Actions 可以方便地构建多平台版本(Linux ARM、AMD64 等):
```bash
# 1. 初始化 git 仓库
git init
git add .
git commit -m "Add build workflow"
# 2. 添加远程仓库(替换为你的仓库地址)
git remote add origin https://github.com/your-username/your-repo.git
git branch -M main
git push -u origin main
```
推送完成后:
1. 访问 GitHub 仓库
2. 点击 **Actions** 标签
3. 选择 **"Build Linux ARM Binaries"**
4. 点击 **"Run workflow"**
5. 等待 5-10 分钟后下载构建产物
**优势:**
- ✅ 完全免费
- ✅ 无需本地配置
- ✅ 支持多平台构建
- ✅ 自动化持续集成
详细说明请参考 [BUILD.md](../BUILD.md)
#### 快速开始
**Linux/macOS:**
```bash
# 给脚本添加执行权限
chmod +x docker-deploy.sh
# 构建并运行
./docker-deploy.sh build
./docker-deploy.sh run
# 使用 docker-compose
./docker-deploy.sh compose
```
**Windows:**
```batch
docker-deploy.bat build
docker-deploy.bat run
```
### HTTPS 支持
#### 使用 Nginx 反向代理
1. 创建 SSL 证书目录并放置证书
```bash
mkdir -p ssl
# 将 cert.pem 和 key.pem 放入 ssl/ 目录
```
2. 使用带 Nginx 的 docker-compose 启动
```bash
docker-compose --profile with-nginx up -d
```
#### 直接启用 HTTPS
```bash
python main.py --ssl-cert cert.pem --ssl-key key.pem
```
详细说明请参考 [DOCKER.md](DOCKER.md)
## CI/CD 自动构建
项目使用 GitHub Actions 自动构建 Docker 镜像和可执行文件。
### GitHub Actions 工作流
| 工作流文件 | 触发条件 | 功能 |
|------------|----------|------|
| `.github/workflows/releases.yml` | 打 Tag (`v*`) | 构建并发布二进制可执行文件到 GitHub Releases |
| `.github/workflows/docker-multiarch.yml` | 打 Tag (`v*`) | 构建并推送多架构 Docker 镜像到 Docker Hub |
| `.github/workflows/ci-cd.yml` | push main / PR | 运行测试 |
### 发布新版本
```bash
# 1. 推送所有代码
git push origin main
# 2. 创建版本标签
git tag v1.0.0
# 3. 推送到远程
git push origin v1.0.0
```
推送 Tag 后,GitHub Actions 会自动:
- ✅ 构建 4 个架构的二进制文件(Linux AMD64/ARM64/ARMv7 + Windows AMD64)
- ✅ 构建 3 个架构的 Docker 镜像(AMD64/ARM64/ARMv7)
- ✅ 上传到 GitHub Releases
- ✅ 推送到 Docker Hub 和 GitHub Container Registry
### GitHub Secrets 配置
需要配置以下 Secrets 才能正常工作:
| Secret 名称 | 值 | 说明 |
|-------------|-----|------|
| `DOCKERHUB_USERNAME` | Docker Hub 用户名 | |
| `DOCKERHUB_TOKEN` | Docker Hub Access Token | |
### Docker Hub 镜像
构建完成后,镜像会自动推送到:
- **Docker Hub**: `hx100cv/hyc-download:latest`
- **GitHub Container Registry**: `ghcr.io/hexikx/mirror_server:latest`
### GitHub Releases
每个版本会生成以下文件:
| 文件名 | 说明 |
|--------|------|
| `hyc-download-linux-amd64` | Linux x64 可执行文件 |
| `hyc-download-linux-arm64` | Linux ARM64 可执行文件 |
| `hyc-download-linux-armv7` | Linux ARMv7 可执行文件 |
| `hyc-download-windows-amd64.exe` | Windows x64 可执行文件 |
## Stargazers over time
[![Stargazers over time](https://starchart.cc/HEXIkx/mirror_server.svg?variant=adaptive)](https://starchart.cc/HEXIkx/mirror_server)
## Contributors
[![Contributors](https://contrib.rocks/image?repo=HEXIkx/mirror_server)](https://github.com/HEXIkx/mirror_server/graphs/contributors)
## License
[The MIT License (MIT)](https://github.com/HEXIkx/mirror_server/blob/main/LICENSE)