Files
Lottery/deploy/DEPLOY.md
T
vincent 5cebbfa433 fix: 修复代码审查反馈全部问题
审查意见修复清单:

P1 列映射语义修复 (lottery.py):
- _normalize_history_format() 不再将红球2-6映射到开机号/和值特征/奇偶比等
  格式A不含这些特征字段,缺失列留空,前端做降级显示
- 删除已用于构建号码列的原始分列,避免数据重复

P2 架构优化:
- 提取 Excel 兼容逻辑到公共模块 history_loader.py
  lottery.py 和 app.py 共同引用,消除三处重复代码
- web_executor.py 标记为已废弃,功能已整合到 app.py

部署修复:
- 删除 deploy/lotto-web.service (旧服务),仅保留 lotto-app.service
- 更新 deploy/DEPLOY.md: 端口5000→8085, 接口清单更新, 添加迁移说明

安全加固:
- API Token 改为环境变量读取: os.environ.get('LOTTO_API_TOKEN')
- 错误信息不再暴露内部异常,改为通用错误消息+日志记录
- 目录遍历防护改用 os.path.realpath 检查最终路径

其他:
- .gitignore 补充排除 双色球历史数据.xlsx
- app.py 引用公共模块,简化 get_statistics_data 和 load_history_dataframe

测试验证: 全部 API 测试通过,120条历史数据正确解析

Issue: BIZ-75
2026-07-04 01:28:57 +08:00

227 lines
6.8 KiB
Markdown
Raw 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.
# 双色球系统部署文档
## 部署信息
| 项目 | 值 |
|------|-----|
| 项目名称 | 双色球自动化系统 |
| 部署时间 | 2026-07-04 |
| 开发人员 | 徐聪 (costcodev) |
| 部署人员 | 严维序 (opengineer) |
| 服务地址 | http://192.168.1.99:8085 |
| 代码仓库 | http://192.168.1.99:12299/vincent/Lottery.git |
| 宿主服务器 | Ubuntu-OpenClaw (192.168.1.99) |
---
## 一、项目结构
```
/home/vincent/Studio/lottoData/
├── venv/ # Python 虚拟环境
├── app.py # Flask 统一 Web 服务 (监听 0.0.0.0:8085)
├── index.html # 前端 UI (响应式,4 Tab 页面)
├── lottery.py # 双色球号码生成器核心逻辑
├── fetch_data.py # 历史数据抓取脚本
├── web_console.html # 数据抓取控制台前端页面
├── web_executor.py # [已废弃] 旧版独立抓取服务,功能已整合到 app.py
├── requirements.txt # Python 依赖清单
├── 双色球历史数据.xlsx # 历史数据文件 (不纳入 git)
├── lottery/ # 号码生成结果输出目录 (不纳入 git)
├── .generation_records.json # 生成记录索引 (不纳入 git)
├── .fetch_status.json # 抓取状态文件 (不纳入 git)
├── docs/ # 文档目录
│ ├── PRD-双色球 WebUI-v1.0.md
│ └── 开发文档-双色球WebUI-v1.0.md
└── deploy/ # 部署文件
├── DEPLOY.md # 本文档
├── lotto-app.service # systemd 服务文件 (统一入口)
├── fetch_daily.sh # 每日定时抓取脚本
├── backup.sh # 备份脚本 (30天保留)
├── cron.log # Cron 执行日志
└── fetch_YYYYMMDD.log # 每日抓取详细日志
```
**说明**: `app.py` 是统一入口,整合了号码生成、历史数据、生成记录、统计数据抓取等全部功能。`web_executor.py` 已废弃,不需独立部署。
---
## 二、依赖清单
| 包 | 用途 |
|----|------|
| Flask | Web 服务框架 |
| pandas | 数据处理 |
| openpyxl | Excel 读写 |
| numpy | 数值计算 |
| requests | HTTP 请求 (数据抓取) |
| beautifulsoup4 | HTML 解析 (数据抓取) |
安装命令:
```bash
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
```
---
## 三、systemd 服务配置
### 服务文件
`/etc/systemd/system/lotto-app.service`
```ini
[Unit]
Description=双色球号码生成 Web 服务 (app.py :8085)
After=network.target
[Service]
Type=simple
User=vincent
WorkingDirectory=/home/vincent/Studio/lottoData
ExecStart=/home/vincent/Studio/lottoData/venv/bin/python3 /home/vincent/Studio/lottoData/app.py
ExecStartPre=/home/vincent/Studio/lottoData/venv/bin/python3 -c "import flask; import pandas; import openpyxl; import numpy"
Restart=on-failure
RestartSec=5
KillMode=control-group
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
```
### 管理命令
```bash
# 安装/启用
sudo cp deploy/lotto-app.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable lotto-app
sudo systemctl start lotto-app
# 日常管理
sudo systemctl status lotto-app # 查看状态
sudo systemctl restart lotto-app # 重启
sudo systemctl stop lotto-app # 停止
sudo journalctl -u lotto-app -f # 查看实时日志
```
### 生产部署建议
建议使用 gunicorn 替代 Flask 内置服务器:
```bash
./venv/bin/pip install gunicorn
# 修改 ExecStart 为:
# /home/vincent/Studio/lottoData/venv/bin/gunicorn -w 4 -b 0.0.0.0:8085 app:app
```
---
## 四、Cron 定时任务
### Cron 配置
```
30 2 * * * /home/vincent/Studio/lottoData/deploy/fetch_daily.sh >> /home/vincent/Studio/lottoData/deploy/cron.log 2>&1
0 3 * * * /home/vincent/Studio/lottoData/deploy/backup.sh >> /home/vincent/Studio/lottoData/deploy/cron.log 2>&1
```
- 每天 02:30 自动抓取双色球历史数据
- 每天 03:00 自动备份数据(保留 30 天)
### 手动执行
```bash
/home/vincent/Studio/lottoData/deploy/fetch_daily.sh
# 或通过 Web 控制台触发: http://192.168.1.99:8085/fetch
```
---
## 五、Web 接口清单
| 路径 | 方法 | 说明 |
|------|------|------|
| `/` | GET | 双色球 Web UI 首页(号码生成) |
| `/fetch` | GET | 数据抓取控制台 |
| `/api/generate` | POST | 生成号码(参数: num_tickets, strategy |
| `/api/history` | GET | 获取历史开奖数据(参数: page, page_size, search |
| `/api/records` | GET | 获取生成记录列表(参数: page, page_size |
| `/api/records/:id` | DELETE | 删除生成记录 |
| `/api/statistics` | GET | 获取统计分析数据 |
| `/api/download/:filepath` | GET | 下载文件 |
| `/api/status` | GET | 系统状态 |
| `/api/config` | GET | 前端配置 |
| `/api/fetch/status` | GET | 抓取执行状态 |
| `/api/fetch/execute` | POST | 触发数据抓取 |
### 示例
```bash
# 查看状态
curl http://192.168.1.99:8085/api/status
# 生成号码
curl -X POST http://192.168.1.99:8085/api/generate \
-H "Content-Type: application/json" \
-d '{"num_tickets": 10, "strategy": "advanced"}'
# 触发抓取
curl -X POST http://192.168.1.99:8085/api/fetch/execute
```
---
## 六、迁移说明(从旧版升级)
如果之前部署了旧版 `lotto-web.service`(端口 5000):
```bash
# 1. 停止旧服务
sudo systemctl stop lotto-web
sudo systemctl disable lotto-web
sudo rm /etc/systemd/system/lotto-web.service
sudo systemctl daemon-reload
# 2. 部署新服务
sudo cp deploy/lotto-app.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now lotto-app
# 3. 更新 cron(指向新的 fetch_daily.sh
crontab -l | sed 's|web_executor|app|g' | crontab -
# 或手动编辑: crontab -e
# 4. 验证
curl http://127.0.0.1:8085/api/status
```
---
## 七、验证清单
- [ ] 依赖安装完整 (Flask, pandas, openpyxl, numpy, requests, beautifulsoup4)
- [ ] systemd 服务运行正常 (active, enabled)
- [ ] Web 服务可访问 (http://192.168.1.99:8085, HTTP 200)
- [ ] API 接口正常 (/api/status, /api/generate, /api/history 等)
- [ ] 前端页面正常 (4 Tab: 号码生成、历史数据、生成记录、统计分析)
- [ ] 移动端响应式布局正常
- [ ] Cron 定时任务已配置 (每日 2:30 抓取, 3:00 备份)
- [ ] 旧版 lotto-web.service 已停止并移除
- [ ] 开机自启已配置 (systemd enable)
---
## 八、监控要点
1. **服务存活**`systemctl status lotto-app` 确认 active
2. **Web 可达**`curl http://127.0.0.1:8085/api/status`
3. **数据更新**:检查 `双色球历史数据.xlsx` 修改时间
4. **Cron 日志**:检查 `deploy/cron.log`
5. **磁盘空间**:Excel 文件约 13KB,定期检查 `lottery/` 目录增长
---
> 部署人:严维序 (opengineer) | 2026-07-04