Context: Build a spatial risk assessment system correlating air quality data with children's respiratory disease incidence across Wuhan. Approach: FastAPI backend serving PostGIS spatial queries, React frontend with Deck.gl maps, and a PyTorch SpatialTemporalGCN pipeline for multi-day (1d/3d/7d) risk prediction. Changes: - backend/ — FastAPI API with auth (JWT), alerts, risk analysis, geocoded case data, grid statistics, and report endpoints - frontend/ — React dashboard with interactive risk maps, alert monitoring, district comparison charts, and timeline player - models/ — SpatialTemporalGCN model with trained weights and ONNX export for inference - scripts/ — ETL pipeline for weather + medical data, grid generation, feature engineering, training, and daily inference - deploy/ — Docker Compose configs for backend, frontend, and MLflow - docs/ — API docs, deployment guide, user guide, and code review Impact: Enables spatial risk visualization, alert monitoring, and ML-driven health risk forecasting for environmental health teams.
6.9 KiB
6.9 KiB
武汉市疾病监测预警系统 - 部署文档
系统要求
硬件要求
- CPU: 4 核以上
- 内存: 8GB 以上 (推荐 16GB)
- 存储: 50GB 可用空间
- 网络: 本地部署无需公网
软件要求
- Docker: 20.10+
- Docker Compose: 2.0+
- PostgreSQL: 15+ (通过 Docker 提供)
- Node.js: 18+ (仅开发环境)
- Python: 3.11+ (仅开发环境)
快速开始 (Docker Compose)
1. 克隆项目
git clone <repository-url>
cd CA
2. 配置环境变量
cp deploy/.env.example deploy/.env
编辑 deploy/.env 文件,修改以下关键配置:
# 数据库密码 (必须修改)
POSTGRES_PASSWORD=your_secure_password
# 数据库连接字符串 (必须与密码一致)
DATABASE_URL=postgresql://wuhan_user:your_secure_password@postgres:5432/wuhan_disease
# API 地址 (开发环境)
VITE_API_URL=http://localhost:8000
3. 启动服务
cd deploy
docker compose up -d
4. 验证部署
# 检查服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 测试后端 API
curl http://localhost:8000/health
# 测试前端
curl http://localhost:3000
5. 访问应用
- 前端: http://localhost:3000
- 后端 API: http://localhost:8000
- API 文档: http://localhost:8000/docs
- PostgreSQL: localhost:5432
服务架构
┌─────────────────┐
│ Frontend │ Port 3000
│ (Nginx) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Backend │ Port 8000
│ (FastAPI) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ PostgreSQL │ Port 5432
│ (PostGIS) │
└─────────────────┘
Docker Compose 配置说明
服务列表
| 服务 | 镜像 | 端口 | 说明 |
|---|---|---|---|
postgres |
postgis/postgis:15-3.3 |
5432 | PostgreSQL + PostGIS |
backend |
本地构建 | 8000 | FastAPI 后端 |
frontend |
本地构建 | 3000:80 | Nginx 前端 |
数据持久化
PostgreSQL 数据存储在 Docker volume postgres_data 中:
# 查看 volume
docker volume ls | grep postgres
# 备份数据
docker run --rm -v ca_deploy_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres-backup.tar.gz -C /data .
# 恢复数据
docker run --rm -v ca_deploy_postgres_data:/data -v $(pwd):/backup alpine tar xzf /backup/postgres-backup.tar.gz -C /data
初始化数据库
1. 创建 grids 表
docker compose exec postgres psql -U wuhan_user -d wuhan_disease -f /docker-entrypoint-initdb.d/init.sql
或手动执行:
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE TABLE IF NOT EXISTS grids (
grid_id VARCHAR(20) PRIMARY KEY,
geometry GEOMETRY(POLYGON, 4326) NOT NULL,
center_lat DOUBLE PRECISION NOT NULL,
center_lon DOUBLE PRECISION NOT NULL,
district VARCHAR(50),
dem DOUBLE PRECISION,
population_density DOUBLE PRECISION,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_grids_geometry ON grids USING GIST (geometry);
CREATE INDEX idx_grids_district ON grids (district);
2. 导入网格数据
# 从容器外复制数据到容器
docker cp processed/grid_100m_index.parquet $(docker compose ps -q postgres):/tmp/grid_data.parquet
# 在容器内导入
docker compose exec postgres python3 << 'EOF'
import pandas as pd
import geopandas as gpd
from sqlalchemy import create_engine
df = pd.read_parquet('/tmp/grid_data.parquet')
gdf = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df['center_lon'], df['center_lat']),
crs='EPSG:4326'
)
engine = create_engine('postgresql://wuhan_user:wuhan_password@localhost:5432/wuhan_disease')
gdf.to_postgis('grids', engine, if_exists='replace', index=False)
EOF
开发环境部署
1. 后端开发环境
cd backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload --host 0.0.0.0 --port 8000
2. 前端开发环境
cd frontend
npm install
npm run dev
3. 运行测试
# 后端测试
cd backend
pytest
# 前端测试
cd frontend
npm test
# E2E 测试
cd frontend
npx playwright test
生产环境部署
1. 安全配置
# .env 文件
POSTGRES_PASSWORD=<强密码>
DATABASE_URL=postgresql://wuhan_user:<强密码>@postgres:5432/wuhan_disease
# 启用 HTTPS (通过反向代理)
# 配置 Nginx SSL 证书
2. 性能优化
# 增加 PostgreSQL 连接池
# 编辑 postgresql.conf
max_connections = 200
shared_buffers = 2GB
# 启用后端缓存
# 编辑 backend/app/performance.py
FEATURE_CACHE_TTL=7200 # 2 小时
3. 日志管理
# 查看实时日志
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f postgres
# 导出日志
docker compose logs > all-logs.txt
故障排查
常见问题
1. 后端无法连接数据库
# 检查数据库服务
docker compose ps postgres
# 查看数据库日志
docker compose logs postgres
# 测试连接
docker compose exec backend python -c "import asyncpg; asyncio.run(asyncpg.connect('postgresql://...'))"
2. 前端无法连接后端
# 检查 VITE_API_URL 配置
docker compose exec frontend env | grep VITE
# 测试后端可达性
docker compose exec frontend curl http://backend:8000/health
3. 内存不足
# 限制容器内存
# 编辑 docker-compose.yml
services:
backend:
deploy:
resources:
limits:
memory: 2G
备份与恢复
备份
# 数据库备份
docker compose exec postgres pg_dump -U wuhan_user wuhan_disease > backup.sql
# 完整备份 (数据库 + 配置文件)
tar czf backup-$(date +%Y%m%d).tar.gz \
deploy/.env \
backup.sql \
processed/
恢复
# 数据库恢复
docker compose exec -T postgres psql -U wuhan_user -d wuhan_disease < backup.sql
# 解压备份
tar xzf backup-20260502.tar.gz
监控与告警
健康检查端点
- 后端:
GET http://localhost:8000/health - 前端:
GET http://localhost:3000 - 数据库:
docker compose exec postgres pg_isready
Prometheus 指标 (未来扩展)
# 启用指标端点
# 编辑 backend/main.py
from prometheus_fastapi_instrumentator import Instrumentator
Instrumentator().instrument(app).expose(app)
更新与升级
更新代码
git pull
docker compose down
docker compose build
docker compose up -d
数据库迁移
# 运行迁移脚本
docker compose exec backend python scripts/migrate.py
联系与支持
- 项目仓库:
<repository-url> - 问题反馈: GitHub Issues
- 文档:
/docs目录