feat: v0.10.0 生产环境优化 — HTTPS、前端生产构建、安全加固
- feat(deploy): 前端多阶段构建 (vite build + nginx:alpine),移除 Vite 开发模式 - feat(deploy): OpenResty HTTPS 配置 (SSL + HSTS + 安全头) - fix(ws): WebSocket 路由添加 /api 前缀,修正前后端路径不匹配 - security: SSH AutoAddPolicy → WarningPolicy - security: CORS 来源环境变量化 (CORS_ORIGINS) - security: 限流器使用 X-Forwarded-For 真实客户端 IP - perf(db): 数据库连接池配置 (pool_size=20, max_overflow=40) - refactor: 移除硬编码 URL/IP (NTP、域名、微信代理),改为环境变量 - chore: 更新 .env.example 模板,补充新增配置项 - chore: 清理 .reasonix/、scripts/、guide.md 无用文件 - docs: 更新 CLAUDE.md 至 v0.10.0,补充生产架构文档 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -4,8 +4,8 @@
|
||||
|
||||
这是一个基于 Python FastAPI + Vue 3 的 H3C OLT 设备监控管理系统,用于监控 4000+ ONU 设备的在线状态。
|
||||
|
||||
**当前版本**: v0.9.0
|
||||
**开发状态**: 核心功能已完成,运维增强功能持续迭代
|
||||
**当前版本**: v0.10.0
|
||||
**开发状态**: 生产环境优化完成,运维增强功能持续迭代
|
||||
|
||||
**已实现功能**:
|
||||
- ✅ SSH 连接 H3C OLT 设备查询 ONU 状态(支持 More 分页、终端控制字符清理)
|
||||
@@ -29,7 +29,12 @@
|
||||
- ✅ 操作记录日志(查看指定设备的上下线事件历史)
|
||||
- ✅ OLT 时间同步(NTP 服务器配置同步到所有 OLT)
|
||||
- ✅ IMC 网管服务集成(ONU 远程重启、光功率查询)
|
||||
- ✅ 企业微信告警通知(设备离线、全离线学校检测)
|
||||
- ✅ WebSocket 实时推送(仪表板状态更新、检查进度)
|
||||
- ✅ iOS PWA 主屏幕支持(standalone 模式 safe area 适配)
|
||||
- ✅ 生产环境 HTTPS 部署(OpenResty + SSL + 安全头)
|
||||
- ✅ 前端生产构建(多阶段 Dockerfile,nginx:alpine 静态服务)
|
||||
- ✅ 数据库连接池优化(pool_size=20, max_overflow=40)
|
||||
|
||||
**技术栈**:
|
||||
- 后端:Python FastAPI + PostgreSQL + Celery + Redis + Paramiko
|
||||
@@ -115,6 +120,17 @@
|
||||
- `GET /api/settings` - 获取系统设置
|
||||
- `PUT /api/settings` - 更新系统设置
|
||||
|
||||
### 企业微信
|
||||
- `GET /api/wechat/callback` - 企业微信回调 URL 验证
|
||||
- `POST /api/wechat/callback` - 企业微信消息接收
|
||||
- `POST /api/wechat/menu/create` - 创建企业微信菜单
|
||||
|
||||
### WebSocket
|
||||
- `WS /api/ws/dashboard` - 仪表板实时状态推送(Redis pub/sub)
|
||||
|
||||
### 任务监控
|
||||
- `GET /api/monitor/tasks` - 查看正在运行的后台任务
|
||||
|
||||
### 系统
|
||||
- `GET /health` - 健康检查
|
||||
- `GET /docs` - API 文档(Swagger UI)
|
||||
@@ -242,9 +258,17 @@
|
||||
必需配置:
|
||||
- `DATABASE_URL`:PostgreSQL 连接字符串
|
||||
- `REDIS_URL`:Redis 连接字符串
|
||||
- `CASDOOR_*`:Casdoor 认证配置
|
||||
- `CASDOOR_*`:Casdoor 认证配置(`ENDPOINT`, `CLIENT_ID`, `CLIENT_SECRET`, `ORG_NAME`, `APP_NAME`)
|
||||
- `CASDOOR_REDIRECT_URL`:Casdoor 登录回调地址(生产必填,无默认值)
|
||||
- `SECRET_KEY`:应用密钥
|
||||
|
||||
可选配置:
|
||||
- `CORS_ORIGINS`:CORS 允许的来源(逗号分隔)
|
||||
- `FRONTEND_URL`:前端访问地址(用于微信帮助消息等,默认 `https://onu.dhdx.fun`)
|
||||
- `NTP_OLD_SERVER` / `NTP_NEW_SERVER`:NTP 同步服务器 IP
|
||||
- `IMC_API_*`:iMC 网管 API 配置(ONU 重启/光功率查询)
|
||||
- `WECHAT_*`:企业微信告警配置
|
||||
|
||||
#### 监控告警
|
||||
- 健康检查端点:`/health`
|
||||
- 性能指标端点:`/metrics`
|
||||
@@ -290,20 +314,99 @@ docker ps | grep <port>
|
||||
|
||||
**解决方法**:先停掉占用端口的旧容器,再 `docker compose rm -f && docker compose up -d`。
|
||||
|
||||
### frontend 容器必须配置 VITE_API_PROXY_TARGET
|
||||
### 前端生产构建(v0.10.0+)
|
||||
|
||||
**问题**:根目录 `docker-compose.yml` 的 frontend 服务如果没有配置 `VITE_API_PROXY_TARGET`,Vite 代理会默认打到 `http://localhost:8001`,导致所有 `/api` 请求 500 或无法到达后端。
|
||||
**问题**:早期版本前端容器运行 `npm run dev`(Vite 开发服务器),存在热更新开销、源码暴露、无压缩等问题。
|
||||
|
||||
**必须在 docker-compose.yml 中配置**:
|
||||
```yaml
|
||||
frontend:
|
||||
build: ./frontend
|
||||
ports:
|
||||
- "5173:5173"
|
||||
environment:
|
||||
- VITE_API_PROXY_TARGET=http://backend:8000
|
||||
**生产构建流程**:
|
||||
```dockerfile
|
||||
# 多阶段构建 — frontend/Dockerfile
|
||||
# Stage 1: vite build → dist/
|
||||
# Stage 2: nginx:alpine 静态文件服务
|
||||
```
|
||||
|
||||
**生产模式下不需要 `VITE_*` 环境变量**:前端所有 API 调用使用相对路径 `/api`,由 OpenResty/Nginx 在边缘层代理。Vite 的 proxy 仅用于本地开发。
|
||||
|
||||
**前端部署到远程服务器**:
|
||||
```bash
|
||||
cd frontend
|
||||
docker build -t h3conums2-frontend:latest .
|
||||
docker save h3conums2-frontend:latest | ssh -p 7072 root@<remote> "docker load"
|
||||
ssh -p 7072 root@<remote> "docker stop h3conums2-frontend && docker rm h3conums2-frontend && docker run -d --name h3conums2-frontend --restart always -p 18062:80 h3conums2-frontend:latest"
|
||||
```
|
||||
|
||||
### 生产部署架构(v0.10.0+)
|
||||
|
||||
**部署拓扑**:前端在远程服务器,后端在本地服务器,通过 frp 隧道通信。
|
||||
|
||||
```
|
||||
用户浏览器 → onu.dhdx.fun (HTTPS)
|
||||
│
|
||||
OpenResty (80/443)
|
||||
│
|
||||
┌───────────┴───────────┐
|
||||
▼ ▼
|
||||
前端容器(:18062) frp 隧道(:18060)
|
||||
nginx:alpine │
|
||||
静态文件服务 frpc → frps → 本机后端(:8000)
|
||||
```
|
||||
|
||||
**关键配置**:
|
||||
- OpenResty 由 1Panel 管理,配置文件位于 `/opt/1panel/apps/openresty/openresty/conf/conf.d/`
|
||||
- SSL 证书位于 `/www/sites/onu.dhdx.fun/ssl/`(OpenResty 容器内路径)
|
||||
- 前端容器端口映射:`18062:80`
|
||||
- frp 后端隧道:远程 `127.0.0.1:18060` → 本机 `127.0.0.1:8000`
|
||||
|
||||
### 新增环境变量(v0.10.0)
|
||||
|
||||
生产环境新增配置项:
|
||||
```bash
|
||||
# CORS & 前端
|
||||
CORS_ORIGINS=http://localhost:5173,http://localhost:18002,https://onu.dhdx.fun
|
||||
FRONTEND_URL=https://onu.dhdx.fun
|
||||
|
||||
# NTP 同步
|
||||
NTP_OLD_SERVER=172.16.0.254
|
||||
NTP_NEW_SERVER=172.16.1.252
|
||||
|
||||
# iMC 网管 API
|
||||
IMC_API_URL=https://172.16.1.252:8443
|
||||
IMC_API_USERNAME=admin
|
||||
IMC_API_PASSWORD=...
|
||||
IMC_API_VERIFY_SSL=false
|
||||
|
||||
# Casdoor 回调(生产必填,无默认值)
|
||||
CASDOOR_REDIRECT_URL=https://onu.dhdx.fun/callback
|
||||
|
||||
# 企业微信代理(无默认值,按需配置)
|
||||
WECHAT_PROXY_API_URL=https://api.v6ole.top
|
||||
```
|
||||
|
||||
### 数据库连接池
|
||||
|
||||
**配置**(`backend/app/core/database.py`):
|
||||
```python
|
||||
engine = create_engine(
|
||||
settings.DATABASE_URL,
|
||||
pool_pre_ping=True,
|
||||
pool_size=20,
|
||||
max_overflow=40,
|
||||
pool_recycle=3600, # 1小时回收,防 PostgreSQL 断闲置连接
|
||||
pool_timeout=30,
|
||||
)
|
||||
```
|
||||
|
||||
### SSH 主机密钥策略
|
||||
|
||||
**当前使用 `WarningPolicy`**:记录未知主机密钥警告但允许连接。生产环境 OLT 设备在内网,安全风险可接受。如需严格验证,改为 `RejectPolicy` 并预置 `known_hosts` 文件。
|
||||
|
||||
### OpenResty / 1Panel 注意事项
|
||||
|
||||
- 配置文件由 1Panel 管理,直接修改文件后需重载:`docker exec openresty openresty -s reload`
|
||||
- 1Panel 面板重新保存站点配置会覆盖手动修改
|
||||
- WebSocket 通过 HTTP/1.1 升级,需确保 `/api/` location 传递 `Upgrade` 和 `Connection` 头
|
||||
- 当前使用自签名证书,可通过 1Panel 面板申请 Let's Encrypt 正式证书
|
||||
|
||||
### 新增数据库模型后必须执行迁移
|
||||
|
||||
**问题**:新增了 SQLAlchemy 模型(如 `DeviceDailySnapshot`、`SystemSetting`),重建镜像后如果不执行 `alembic upgrade head`,表不存在会导致 500 错误。
|
||||
@@ -429,6 +532,8 @@ H3ConuMS2/
|
||||
│ ├── scripts/ # 初始化脚本
|
||||
│ └── templates/ # Excel 导入模板
|
||||
├── frontend/ # Vue 3 前端
|
||||
│ ├── Dockerfile # 多阶段构建(vite build + nginx:alpine)
|
||||
│ ├── nginx.conf # 生产 nginx 配置(Gzip、缓存、SPA fallback)
|
||||
│ └── src/
|
||||
│ ├── api/ # API 调用封装
|
||||
│ ├── components/ # 公共组件
|
||||
@@ -440,10 +545,11 @@ H3ConuMS2/
|
||||
│ └── views/ # 页面组件
|
||||
├── deploy/ # 部署配置
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── openresty/ # OpenResty 站点配置
|
||||
│ ├── nginx/
|
||||
│ └── scripts/
|
||||
├── docs/ # 文档
|
||||
└── docker-compose.yml # 主部署文件
|
||||
└── docker-compose.yml # 本地开发 Docker Compose
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user