一个基于 Flask 的支持文件上传和优雅退出的简单HTTP文件服务器,专为容器化部署优化。
- 基于 Flask 框架: 使用 Flask 构建的现代Web应用,易于扩展和维护
- 现代化沉浸式 UI: 提供带悬浮效果和移动端自适用的极简界面,文件夹统一呈现原生系统 Emoji 渲染并修复叠字干扰问题。
- 并发任务机制与图标按钮: 左下角上传队列浮窗中支持小图标操控。彻底重写了 JavaScript 避免在刷新进度时造成 DOM 闪烁闪退等,可精准中止和删除任意并行传输的项。
- 断点截留与分离缓冲: 为解决上传不完整导致产生碎片文件的问题,本系统将在项目根目录自动创建
/tmp用于上传期间的数据切片积攒和组合,等到100%完成核对后再安全转移至目标upload文件夹。 - 优雅异常与死锁切断拦截: 除了
SIGTERM/SIGINT信号完美捕停的逻辑之外,在内核底层新增拦截并跳出由于浏览器主动强行断开导致的b""(0字节)死循环等待,及完美静默拦截WinError 10053断联警告。 - 健康检查与版本: 包含
/health与/version供运维监控。
pip install -r requirements.txt# 安装依赖
pip install -r requirements.txt
# 复制环境变量配置文件(可选)
cp .env.example .env
# 编辑 .env 文件自定义配置
# 使用默认配置(自动读取 .env 文件)
python server.py
# 指定端口和目录(命令行参数优先级高于 .env 文件)
python server.py --port 8080 --directory ./uploads --log-level DEBUG
# 绑定特定地址
python server.py --bind 127.0.0.1 --port 8080
# 开发模式(代码修改自动重载)
python server.py --dev# 构建镜像
docker build -t fileserver:latest .
# 运行容器
docker run -d \
--name fileserver \
-p 8000:8000 \
-v $(pwd)/uploads:/data \
-e LOG_LEVEL=INFO \
fileserver:latest
# 停止容器(优雅退出)
docker stop -t 30 fileserver# 复制环境变量模板
cp .env.example .env
# 编辑 .env 文件配置参数
# PORT=8000
# LOG_LEVEL=INFO
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务(优雅退出)
docker-compose down本地启动时会自动加载当前目录下的 .env 文件(如果存在)。
# 复制示例配置文件
cp .env.example .env
# 编辑 .env 文件
cat .env
PORT=8080
LOG_LEVEL=DEBUG
SERVE_DIRECTORY=./uploads
HOST=127.0.0.1
# 启动服务(自动读取 .env)
python server.py容器启动时不读取 .env 文件,仅使用创建容器时设置的环境变量。
# 通过 docker run -e 参数设置
docker run -d \
-p 8000:8000 \
-e PORT=9000 \
-e LOG_LEVEL=DEBUG \
fileserver:latest
# 或在 docker-compose.yml 中设置| 变量 | 说明 | 默认值 |
|---|---|---|
HOST |
绑定地址 | 0.0.0.0 |
PORT |
服务端口 | 8000 |
LOG_LEVEL |
日志级别 | INFO |
SERVE_DIRECTORY |
服务目录 | /data (容器) 或当前目录 |
FLASK_DEV |
开发模式 | False |
| 参数 | 说明 | 默认值 |
|---|---|---|
--bind, -b |
绑定地址 | 环境变量或空字符串 |
--port |
服务端口 | 环境变量或8000 |
--directory, -d |
服务目录 | 当前目录 |
--log-level |
日志级别 | INFO |
--dev |
开发模式(代码修改自动重载) | False |
GET /- 目录列表GET /filename- 下载文件POST /- 上传文件
-
GET /health- 健康检查{ "status": "healthy", "timestamp": "2024-01-15T10:30:00.000000", "version": "2.0.0" } -
GET /version- 版本信息{ "version": "2.0.0", "python": "3.11.0", "server": "SimpleHTTPWithUpload/2.0.0" }
服务器实现了完善的优雅退出机制,防止重复触发关闭:
- 使用
_shutdown_called标志确保关闭只执行一次 - 使用
_shutdown_lock锁保护关闭状态 - 重复信号触发时恢复默认处理器并强制退出
SIGTERM- Docker 默认停止信号SIGINT- Ctrl+C 中断SIGQUIT- 退出信号(如果可用)
当接收到关闭信号时:
- 检查关闭标志: 使用锁检查
_shutdown_called,如果已在关闭中则处理重复信号 - 设置关闭标志: 标记关闭已开始
- 恢复默认处理器: 防止重复注册信号处理器
- 等待活跃请求: 最多等待5秒让活跃请求完成
- 关闭服务器: 最终关闭服务器
如果在关闭过程中再次收到信号:
- 日志记录警告信息
- 恢复默认信号处理器
- 强制终止进程
.
├── server.py # 主程序执行文件
├── static/ # 样式 (style.css) 与前端引擎 (script.js)
├── templates/ # 目录索引及上传结果 HTML 模板
├── tmp/ # 文件上传临时缓存池 (运行时自动构建)
├── Dockerfile # Docker 构建引擎指令
├── docker-compose.yml # Docker 组合与起停配置
├── docker-entrypoint.sh # 容器初始化及环境起调入口
├── .dockerignore # Docker 打包剔除规则
├── .env.example # 容器环境变量示范文件
└── README.md # 项目使用手册与更新纪要
遵循 MIT 许可证。
欢迎提交 Issue 和 Pull Request 来改进这个项目。
