# 部署指南 ## 目录 1. [Windows 部署](#windows-部署) 2. [Linux 部署](#linux-部署) 3. [Docker 部署](#docker-部署) 4. [配置说明](#配置说明) 5. [TLS 配置](#tls-配置) 6. [运维手册](#运维手册) --- ## Windows 部署 ### 方式一:直接运行 1. 下载或编译 Windows 版本 2. 解压到任意目录(如 `C:\YZWater`) 3. 双击运行 `YZWater.Avalonia.exe` ### 方式二:安装为 Windows 服务 ```powershell # 使用 nssm 安装为服务 nssm install YZWater "C:\YZWater\YZWater.Avalonia.exe" nssm set YZWater AppDirectory "C:\YZWater" nssm start YZWater ``` --- ## Linux 部署 ### 方式一:使用安装脚本 ```bash # 1. 发布 Linux 版本 dotnet publish -c Release -r linux-x64 --self-contained -o ./publish # 2. 进入发布目录 cd publish # 3. 运行安装脚本 sudo ../deploy/install-linux.sh # 4. 启动服务 sudo systemctl start yzwater # 5. 查看状态 sudo systemctl status yzwater ``` ### 方式二:手动安装 ```bash # 创建目录 sudo mkdir -p /opt/yzwater cd /opt/yzwater # 复制发布文件 sudo cp -r /path/to/publish/* . # 创建用户 sudo useradd -r -s /bin/false yzwater sudo chown -R yzwater:yzwater /opt/yzwater # 安装服务 sudo cp deploy/yzwater.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable yzwater sudo systemctl start yzwater ``` --- ## Docker 部署 ### 快速启动 ```bash # 构建镜像 docker-compose build # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f ``` ### 目录结构 ``` ./config/ # 配置文件(yzwater-config.json) ./data/ # 数据库(yzwater.db) ./logs/ # 日志文件 ./backups/ # 数据库备份 ./projects/ # 项目档案 ``` --- ## 配置说明 ### 核心配置文件 `yzwater-config.json`(首次运行自动创建): ```json { "PlcIp": "192.168.1.100", "PlcPort": 102, "PlcProtocol": "SiemensS7", "AutoConnect": true, "LevelHighAlarm": 80, "LevelLowAlarm": 20, "FlowHighAlarm": 100, "FlowLowAlarm": 5, "RunMode": "Direct", "HubPort": 8765, "HubServerUrl": "ws://localhost:8765", "ActiveProject": "", "IsDarkTheme": true, "IsChinese": true } ``` ### 运行模式 | 模式 | 说明 | |------|------| | `Direct` | 直连 PLC(默认) | | `Server` | 中控服务端(连接 PLC + 启动 WebSocket) | | `Client` | 中控客户端(连接 WebSocket 服务端) | | `Mock` | 模拟模式(无 PLC,生成测试数据) | ### PLC 协议 | 协议 | 说明 | 默认端口 | |------|------|----------| | `SiemensS7` | 西门子 S7 系列(S200/S300/S1200/S1500) | 102 | | `MitsubishiMC` | 三菱 MC 协议 | 6000 | | `OmronFins` | 欧姆龙 Fins 协议 | 9600 | | `ModbusTcp` | Modbus TCP | 502 | | `AllenBradley` | AB EtherNet/IP | 44818 | ### 项目档案 系统支持通过项目档案适配不同泵站配置。项目 JSON 文件存放在 `projects/` 目录下。 **配置方法**: 1. 在 `projects/` 目录下创建 JSON 文件(如 `yangjie2.json`) 2. 在 `yzwater-config.json` 中设置 `ActiveProject` 为项目名(不含后缀) 3. 重启程序或运行时在参数设置页切换 **项目档案结构**: ```json { "name": "扬杰二厂泵站", "description": "3台排污泵 + 液位/压力/流量监控", "viewTemplate": "PumpStation", "pumps": [ { "name": "1#泵", "runAddress": "Q0.1", "faultAddress": "I0.1", "currentAddress": "VD50", "startAddress": "M1.3", "stopAddress": "M1.4" } ], "tanks": [ { "name": "集水池", "levelAddress": "VD62", "startPump1LevelAddress": "VD500", "stopLevelAddress": "VD528" } ], "gauges": [ { "name": "压力", "unit": "MPa", "valueAddress": "VD6600", "highSetAddress": "VD6704", "lowSetAddress": "VD6700" } ] } ``` **切换项目**: - 方法一:修改 `yzwater-config.json` 中的 `ActiveProject`,重启程序 - 方法二:运行时在「参数设置」页选择项目,点击保存(热切换) ### 西门子 S7-200 Smart 连接指南 1. **硬件连接**:PLC 以太网口 → 交换机 → 上位机 2. **PLC 配置**:使用 STEP 7-Micro/WIN SMART 设置 IP 地址(如 192.168.1.100) 3. **程序配置**: ```json { "PlcIp": "192.168.1.100", "PlcPort": 102, "PlcProtocol": "SiemensS7" } ``` 4. **测试连接**:在参数设置页点击「测试连接」 5. **地址格式**: - `VD100` - 变量存储区双字(4字节浮点数) - `M1.0` - 标志位 - `Q0.1` - 输出位 - `I0.1` - 输入位 --- ## TLS 配置 ### 服务端(HubServer) 1. 准备 PFX 证书文件(如 `server.pfx`) 2. 在 Windows 绑定证书: ```powershell # 导入证书 Import-PfxCertificate -FilePath server.pfx -CertStoreLocation Cert:\LocalMachine\My # 获取证书指纹 $thumbprint = (Get-PfxCertificate server.pfx).Thumbprint # 绑定到端口 netsh http add sslcert ipport=0.0.0.0:8765 certhash=$thumbprint appid="{00000000-0000-0000-0000-000000000000}" ``` 3. 修改配置文件: ```json { "HubPort": 8765, "UseTls": true, "CertificatePath": "C:\\YZWater\\server.pfx", "CertificatePassword": "your_password" } ``` ### 客户端(HubClient) 修改配置文件: ```json { "HubServerUrl": "wss://server-ip:8765", "IgnoreCertificateErrors": false } ``` > **注意**:自签名证书可设置 `IgnoreCertificateErrors: true`(仅测试环境) --- ## 运维手册 ### 日志位置 - **Windows**: `.\Logs\log-YYYYMMDD.txt` - **Linux**: `/opt/yzwater/Logs/log-YYYYMMDD.txt` - **Docker**: `./logs/log-YYYYMMDD.txt` - **崩溃日志**: `.\crash.log` 或 `/opt/yzwater/crash.log` ### 数据库备份 #### 手动备份 在应用界面点击"数据库备份",或: ```bash # Linux sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_$(date +%Y%m%d_%H%M%S).db';" ``` #### 自动备份 创建 cron 任务(Linux): ```bash # 每天凌晨 2 点备份 0 2 * * * sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_\$(date +\%Y\%m\%d).db';" ``` ### 数据库恢复 ```bash # 停止服务 sudo systemctl stop yzwater # 备份当前数据库 cp /opt/yzwater/Data/yzwater.db /opt/yzwater/Data/yzwater.db.bak # 恢复备份 cp /opt/yzwater/Backups/backup_20240101.db /opt/yzwater/Data/yzwater.db # 启动服务 sudo systemctl start yzwater ``` ### 性能优化 #### SQLite 优化 已在代码中自动启用: - WAL 模式(提升并发性能) - 64MB 缓存 - 内存临时表 #### 日志级别 修改 `appsettings.json`: ```json { "Serilog": { "MinimumLevel": { "Default": "Information" } } } ``` ### 常见问题 #### 1. PLC 连接失败 - 检查 PLC IP 和端口是否正确 - 检查网络连通性:`ping ` - 检查 PLC 是否支持 S7 协议 - 查看日志:`Logs/log-*.txt` #### 2. WebSocket 连接断开 - 检查服务端是否运行 - 检查防火墙是否放行 8765 端口 - 检查 Token 是否匹配 - 客户端会自动重连(最大延迟 30 秒) #### 3. 数据库锁定 SQLite 支持单写多读,高并发写入时可能锁表。解决方案: - 已启用 WAL 模式,支持并发读写 - 减少写入频率(`DataLoggingService.FlowLogIntervalSeconds`) - 考虑迁移到 PostgreSQL(大规模部署) #### 4. 内存占用过高 - 检查是否有内存泄漏(使用 `dotnet-trace`) - 调整数据保留天数:`DataRetentionDays`(默认 30 天) - 定期清理旧数据 ### 监控指标 #### 应用指标 - PLC 连接状态 - WebSocket 客户端数 - 活跃报警数 - 数据库大小 #### 系统指标 - CPU 使用率 - 内存占用 - 磁盘空间 - 网络流量 建议使用 Prometheus + Grafana 监控(待实现)。 --- ## 升级指南 ### 版本升级 1. 备份数据库和配置文件 2. 停止服务 3. 替换应用程序文件 4. 启动服务 5. 检查日志确认正常运行 ### 配置迁移 配置文件格式变更时,参考 `yzwater-config.json.example` 手动迁移。 --- ## 技术支持 - 问题反馈:GitHub Issues - 文档更新:查看项目 README.md - 日志分析:提供 `Logs/` 目录和 `crash.log`