DEPLOYMENT.md 5.9 KB

部署指南

目录

  1. Windows 部署
  2. Linux 部署
  3. Docker 部署
  4. 配置说明
  5. TLS 配置
  6. 运维手册

Windows 部署

方式一:直接运行

  1. 下载或编译 Windows 版本
  2. 解压到任意目录(如 C:\YZWater)
  3. 双击运行 YZWater.Avalonia.exe

方式二:安装为 Windows 服务

# 使用 nssm 安装为服务
nssm install YZWater "C:\YZWater\YZWater.Avalonia.exe"
nssm set YZWater AppDirectory "C:\YZWater"
nssm start YZWater

Linux 部署

方式一:使用安装脚本

# 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

方式二:手动安装

# 创建目录
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 部署

快速启动

# 构建镜像
docker-compose build

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

目录结构

./config/          # 配置文件(yzwater-config.json)
./data/            # 数据库(yzwater.db)
./logs/            # 日志文件
./backups/         # 数据库备份
./projects/        # 项目档案

配置说明

核心配置文件

yzwater-config.json(首次运行自动创建):

{
  "PlcIp": "192.168.1.100",
  "PlcPort": 102,
  "AutoConnect": true,
  
  "LevelHighAlarm": 80,
  "LevelLowAlarm": 20,
  "FlowHighAlarm": 100,
  "FlowLowAlarm": 5,
  
  "RunMode": "Direct",
  "HubPort": 8765,
  "HubServerUrl": "ws://localhost:8765",
  
  "IsDarkTheme": true,
  "IsChinese": true
}

运行模式

模式 说明
Direct 直连 PLC(默认)
Server 中控服务端(连接 PLC + 启动 WebSocket)
Client 中控客户端(连接 WebSocket 服务端)
Mock 模拟模式(无 PLC,生成测试数据)

TLS 配置

服务端(HubServer)

  1. 准备 PFX 证书文件(如 server.pfx)

  2. 在 Windows 绑定证书:

    # 导入证书
    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. 修改配置文件:

    {
    "HubPort": 8765,
    "UseTls": true,
    "CertificatePath": "C:\\YZWater\\server.pfx",
    "CertificatePassword": "your_password"
    }
    

客户端(HubClient)

修改配置文件:

{
  "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

数据库备份

手动备份

在应用界面点击"数据库备份",或:

# Linux
sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_$(date +%Y%m%d_%H%M%S).db';"

自动备份

创建 cron 任务(Linux):

# 每天凌晨 2 点备份
0 2 * * * sqlite3 /opt/yzwater/Data/yzwater.db "VACUUM INTO '/opt/yzwater/Backups/backup_\$(date +\%Y\%m\%d).db';"

数据库恢复

# 停止服务
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:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    }
  }
}

常见问题

1. PLC 连接失败

  • 检查 PLC IP 和端口是否正确
  • 检查网络连通性:ping <PLC_IP>
  • 检查 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