智慧水务管理系统 - 生产环境完整部署文档
| 配置项 | 要求 |
|---|---|
| CPU | 4 核 |
| 内存 | 8 GB |
| 系统盘 | 100 GB SSD |
| 数据盘 | 200 GB SSD |
| 网络 | 10 Mbps |
| 系统 | Ubuntu 22.04 LTS / CentOS 8+ |
| 配置项 | 要求 |
|---|---|
| CPU | 8 核 |
| 内存 | 16 GB |
| 系统盘 | 100 GB SSD |
| 数据盘 | 500 GB SSD |
| 网络 | 100 Mbps |
| 系统 | Ubuntu 22.04 LTS |
| 配置项 | 要求 |
|---|---|
| 应用服务器 | 2+ 台,8C16G,负载均衡 |
| 数据库 | 主从架构,8C32G |
| Redis | 哨兵/集群模式 |
| Kafka | 3 节点集群 |
| 存储 | MinIO 分布式或云存储 |
water.example.com)用于 Web 访问mqtt.example.com)用于设备接入复制并编辑 .env 文件:
cp .env.example .env
必须修改的配置:
# 数据库
POSTGRES_DB=water_management
POSTGRES_USER=water
POSTGRES_PASSWORD=<强密码>
# Redis
REDIS_PASSWORD=<强密码>
# EMQX MQTT
EMQX_ADMIN_USER=admin
EMQX_ADMIN_PASSWORD=<强密码>
# MinIO
MINIO_USER=minioadmin
MINIO_PASSWORD=<强密码>
# 镜像标签
IMAGE_TAG=latest
# 域名
DOMAIN=water.example.com
准备 Let's Encrypt 证书(服务器初始化后可自动申请)。
# 以 root 或 sudo 执行
sudo chmod +x deploy/production/server-setup.sh
sudo deploy/production/server-setup.sh
该脚本将自动完成:
deploy)# 在本地机器执行
ssh-copy-id deploy@your-server-ip
# 在服务器执行
sudo -u deploy git clone http://git.xayunmei.com/bot_ym/water-management-system.git /opt/water-management
cd /opt/water-management
cp .env.example .env
vim .env # 编辑环境变量
cd /opt/water-management
# 构建镜像(如使用远程镜像仓库可跳过)
docker compose build
# 启动所有服务
docker compose \
-f docker-compose.yml \
-f deploy/production/docker-compose.override.yml \
up -d
# 查看服务状态
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml ps
# 查看日志
docker compose logs -f
cd /opt/water-management
# 拉取最新代码
git pull origin master
# 拉取最新镜像
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml pull
# 滚动更新
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml up -d --remove-orphans
# 清理旧镜像
docker image prune -f
# 通过 scripts/deploy.sh 脚本
./scripts/deploy.sh \
--env production \
--host your-server-ip \
--user deploy \
--tag latest
# 安装 certbot
sudo apt install certbot
# 确保 Nginx 已启动且 80 端口可访问
# 申请证书(替换域名和邮箱)
sudo certbot certonly --webroot \
-w /var/www/certbot \
-d water.example.com \
--email admin@example.com \
--agree-tos \
--no-eff-email
证书续期脚本已配置为定时任务(每天凌晨 3 点检查),也可手动执行:
sudo deploy/production/nginx/certbot-renew.sh
手动续期:
sudo certbot renew --dry-run
sudo certbot renew
curl -I https://water.example.com
# 应返回 HTTP/2 200 及 HSTS header
cd /opt/water-management
# 启动监控组件
docker compose \
-f deploy/production/monitoring/docker-compose.monitoring.yml \
up -d
# 查看状态
docker compose -f deploy/production/monitoring/docker-compose.monitoring.yml ps
| 组件 | 端口 | 用途 |
|---|---|---|
| Prometheus | 9090 | 指标收集与存储 |
| Grafana | 3000 | 可视化仪表盘 |
| Node Exporter | 9100 | 主机指标 |
| cAdvisor | 8880 | 容器指标 |
| AlertManager | 9093 | 告警管理 |
| Postgres Exporter | 9187 | PostgreSQL 指标 |
| Redis Exporter | 9121 | Redis 指标 |
http://your-server-ip:3000(生产环境建议配置 Nginx 反向代理 + HTTPS)admin / admin(首次登录后修改)已配置以下告警(详见 monitoring/alert_rules.yml):
| 告警名称 | 触发条件 | 严重级别 |
|---|---|---|
| HighCPUUsage | CPU > 80% 持续 5 分钟 | Warning |
| CriticalCPUUsage | CPU > 95% 持续 2 分钟 | Critical |
| HighMemoryUsage | 内存 > 85% 持续 5 分钟 | Warning |
| HighDiskUsage | 磁盘 > 90% 持续 5 分钟 | Critical |
| ServiceDown | 服务宕机 1 分钟 | Critical |
| ServiceSlowResponse | 响应时间 > 5s 持续 5 分钟 | Warning |
| HighErrorRate | 5xx 错误率 > 5% | Critical |
| PostgresHighConnections | 连接数 > 80% | Warning |
编辑 monitoring/alertmanager.yml,配置 Webhook:
receivers:
- name: 'wecom'
webhook_configs:
- url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY'
cd /opt/water-management
docker compose \
-f deploy/production/logging/docker-compose.logging.yml \
up -d
| 组件 | 端口 | 用途 |
|---|---|---|
| Loki | 3100 | 日志聚合存储 |
| Promtail | 9080 | 日志收集代理 |
{container="wm-gateway"} |= "error"
{service="revenue"} | json | level="ERROR"
| 类型 | 频率 | 保留时间 | 说明 |
|---|---|---|---|
| 每日备份 | 每天凌晨 2 点 | 7 天 | 全量 pg_dump |
| 每周备份 | 每周日凌晨 | 4 周 | 全量 pg_dump |
| 每月备份 | 每月 1 号 | 12 个月 | 全量 pg_dump |
# 执行备份
deploy/production/backup/backup-db.sh
# 列出备份
deploy/production/backup/restore-db.sh --list
# 恢复最近备份
deploy/production/backup/restore-db.sh --latest
# 恢复指定日期
deploy/production/backup/restore-db.sh --date 2026-06-15
# 恢复指定文件
deploy/production/backup/restore-db.sh --file /opt/water-management/backups/daily/wm_water_management_20260615_020000.sql.gz
在 .env 中配置:
S3_ENABLED=true
S3_BUCKET=water-backups
S3_ENDPOINT=http://minio:9000
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=<密码>
# ===== 服务管理 =====
# 查看所有服务状态
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml ps
# 重启单个服务
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml restart gateway
# 查看服务日志
docker compose logs -f --tail=100 gateway
# 进入容器
docker exec -it wm-gateway bash
# ===== 数据库 =====
# 连接数据库
docker exec -it wm-postgres psql -U water -d water_management
# 查看活跃连接
docker exec -it wm-postgres psql -U water -c "SELECT count(*) FROM pg_stat_activity WHERE state='active';"
# ===== Redis =====
# 查看 Redis 信息
docker exec -it wm-redis redis-cli -a <密码> info
# ===== 资源监控 =====
# 查看容器资源使用
docker stats --no-stream
# 查看磁盘使用
df -h
docker system df
# 水平扩展应用实例(需要负载均衡器)
docker compose -f docker-compose.yml -f deploy/production/docker-compose.override.yml up -d --scale gateway=2
# 修改资源限制
# 编辑 deploy/production/docker-compose.override.yml 中的 deploy.resources
# 查看证书过期时间
sudo openssl x509 -enddate -noout -in /etc/letsencrypt/live/water.example.com/fullchain.pem
# 手动续期
sudo certbot renew
# 重新申请
sudo certbot certonly --webroot -w /var/www/certbot -d water.example.com --force-renewal
# 查看详细日志
docker compose logs --tail=200 <service-name>
# 检查端口冲突
ss -tlnp | grep <port>
# 检查资源
docker stats --no-stream
df -h
free -h
# 检查 PostgreSQL 是否运行
docker exec -it wm-postgres pg_isready
# 检查连接数
docker exec -it wm-postgres psql -U water -c "SELECT count(*) FROM pg_stat_activity;"
# 检查慢查询
docker exec -it wm-postgres psql -U water -c "SELECT pid, now()-query_start AS duration, query FROM pg_stat_activity WHERE state='active' ORDER BY duration DESC LIMIT 5;"
# 查看内存使用
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
# 清理无用镜像和容器
docker system prune -a --volumes
# 调整 JVM 内存参数
# 编辑 docker-compose.override.yml 中的 JAVA_OPTS
# 查看磁盘使用
df -h
du -sh /opt/water-management/*
docker system df -v
# 清理旧备份
find /opt/water-management/backups -name "*.sql.gz" -mtime +30 -delete
# 清理 Docker
docker system prune -f
docker volume prune -f
# 检查 EMQX 状态
docker exec -it wm-emqx emqx status
# 查看 EMQX 日志
docker logs wm-emqx
# 测试 MQTT 连接
mosquitto_pub -h localhost -p 1883 -t "test" -m "hello"
/opt/water-management/
├── .env # 环境变量
├── docker-compose.yml # 基础编排
├── deploy/
│ └── production/
│ ├── docker-compose.override.yml # 生产覆盖配置
│ ├── nginx/
│ │ ├── nginx.conf # Nginx 配置
│ │ └── certbot-renew.sh # 证书续期
│ ├── backup/
│ │ ├── backup-db.sh # 数据库备份
│ │ └── restore-db.sh # 数据库恢复
│ ├── monitoring/
│ │ ├── docker-compose.monitoring.yml
│ │ ├── prometheus.yml
│ │ ├── alert_rules.yml
│ │ └── grafana/
│ ├── logging/
│ │ ├── docker-compose.logging.yml
│ │ ├── loki-config.yml
│ │ └── promtail-config.yml
│ ├── server-setup.sh # 服务器初始化
│ └── README.md # 本文档
├── backups/ # 数据库备份
│ ├── daily/
│ ├── weekly/
│ └── monthly/
└── logs/ # 应用日志
| 服务 | 端口 | 用途 |
|---|---|---|
| Nginx HTTP | 80 | Web 访问(跳转 HTTPS) |
| Nginx HTTPS | 443 | Web 安全访问 |
| MQTT | 1883 | 物联网设备接入 |
| Gateway | 8080 | API 网关(内部) |
| PostgreSQL | 5432 | 数据库(仅本地) |
| Redis | 6379 | 缓存(仅本地) |
| Grafana | 3000 | 监控面板(仅本地) |
| Prometheus | 9090 | 指标查询(仅本地) |
文档版本: 1.0 | 最后更新: 2026-06-16