# 浩景CNC机床数据采集分析系统 - 部署指南
## 文档信息
| 项目 | 内容 |
|------|------|
| 版本 | v1.0.0 |
| 日期 | 2026-04-13 |
| 部署环境 | Windows Server + IIS + MariaDB |
---
## 目录
1. [环境要求](#1-环境要求)
2. [一、安装 .NET 8.0 Runtime](#一安装-net-80-runtime)
3. [二、数据库配置](#二数据库配置)
4. [三、项目发布](#三项目发布)
5. [四、IIS 配置](#四iis-配置)
6. [五、生产配置](#五生产配置)
7. [六、日志配置](#六日志配置)
8. [七、权限配置](#七权限配置)
9. [八、防火墙配置](#八防火墙配置)
10. [九、验证部署](#九验证部署)
11. [十、故障排查](#十故障排查)
12. [部署清单](#部署清单)
---
## 1. 环境要求
### 1.1 服务器配置
| 项目 | 最低要求 | 推荐配置 |
|------|----------|----------|
| 操作系统 | Windows Server 2016 | Windows Server 2019/2022 |
| CPU | 2 核心 | 4 核心及以上 |
| 内存 | 4 GB | 8 GB 及以上 |
| 磁盘空间 | 50 GB | 100 GB 及以上 |
| .NET Runtime | .NET 8.0 | .NET 8.0 LTS |
### 1.2 依赖软件
| 软件 | 版本 | 用途 |
|------|------|------|
| MariaDB | 10.6+ | 业务库 + 日志库 |
| .NET Runtime | 8.0 | 运行后端 API |
| IIS | 10.0+ | Web 服务 |
| Web Deploy | 3.6+ | 可选,发布工具 |
### 1.3 网络要求
- 服务器固定 IP 地址
- 端口 5000(API)、8080(Admin)、8081(Dashboard)可用
- 数据库端口 3306 可访问
---
## 一、安装 .NET 8.0 Runtime
### 1.1 下载 .NET 8.0 Hosting Bundle
访问 Microsoft 官方下载页面:
```
https://dotnet.microsoft.com/download/dotnet/8.0
```
下载文件:`dotnet-hosting-8.0.0-win.exe`(或当前最新版本)
### 1.2 安装步骤
1. 以**管理员身份**运行下载的安装程序
2. 如果提示关闭 IIS,先停止 IIS:`iisreset /stop`
3. 接受许可协议
4. 等待安装完成
5. 重启 IIS:`iisreset /start`
### 1.3 验证安装
打开 PowerShell,执行:
```powershell
dotnet --list-runtimes
```
确认输出包含 `Microsoft.AspNetCore.App 8.0.x`
### 1.4 常见问题
- **安装失败**:确保以管理员身份运行,关闭杀毒软件
- **IIS 检测失败**:先安装 IIS,再安装 Hosting Bundle
---
## 二、数据库配置
### 2.1 连接 MariaDB
```powershell
mysql -u root -p
```
### 2.2 创建数据库和用户
```sql
-- 创建专用数据库用户(密码请使用强密码)
CREATE USER 'haoliang'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
CREATE USER 'haoliang'@'127.0.0.1' IDENTIFIED BY 'YourStrongPassword123!';
-- 创建业务库
CREATE DATABASE cnc_business CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建日志库
CREATE DATABASE cnc_log CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 授权
GRANT ALL PRIVILEGES ON cnc_business.* TO 'haoliang'@'localhost';
GRANT ALL PRIVILEGES ON cnc_log.* TO 'haoliang'@'localhost';
FLUSH PRIVILEGES;
-- 验证
SHOW GRANTS FOR 'haoliang'@'localhost';
```
### 2.3 导入数据库结构
```powershell
# 进入项目数据库脚本目录
cd C:\path\to\haoliang\database
# 导入业务库
mysql -u haoliang -p cnc_business < cnc_business.sql
# 导入日志库(使用修复版本,修正了视图定义问题)
mysql -u haoliang -p cnc_log < cnc_log_fixed.sql
# 验证表结构
mysql -u haoliang -p -e "USE cnc_business; SHOW TABLES;"
mysql -u haoliang -p -e "USE cnc_log; SHOW TABLES;"
```
> **注意**:`cnc_log_fixed.sql` 是修正版本,修复了原 `cnc_log.sql` 中视图定义引用不存在表的问题。
### 2.4 验证数据库连接
```powershell
mysql -u haoliang -p -e "SELECT 1 AS Test;"
```
---
## 三、项目发布
### 3.1 构建后端
```powershell
# 进入项目根目录
cd C:\path\to\haoliang
# 清理并发布后端(Release 模式)
dotnet clean Haoliang.sln -c Release
dotnet publish Haoliang.Api/Haoliang.Api.csproj -c Release -o .\publish\api --self-contained false
# 发布后目录结构
# C:\path\to\haoliang\publish\api\
```
### 3.2 构建前端 Admin
```powershell
# 进入 Admin 目录
cd C:\path\to\haoliang\src\frontend\admin
# 安装依赖(如已有 node_modules 可跳过)
npm install
# 构建生产版本
npm run build
```
构建完成后,输出在 `dist` 目录。
### 3.3 构建前端 Dashboard
```powershell
# 进入 Dashboard 目录
cd C:\path\to\haoliang\src\frontend\dashboard
# 安装依赖
npm install
# 构建生产版本
npm run build
```
### 3.4 创建部署目录
```powershell
# 创建部署根目录
New-Item -ItemType Directory -Path "C:\inetpub\haoliang\api" -Force
New-Item -ItemType Directory -Path "C:\inetpub\haoliang\admin" -Force
New-Item -ItemType Directory -Path "C:\inetpub\haoliang\dashboard" -Force
New-Item -ItemType Directory -Path "C:\inetpub\haoliang\api\logs" -Force
New-Item -ItemType Directory -Path "C:\inetpub\haoliang\api\data" -Force
# 复制文件
Copy-Item -Path "C:\path\to\haoliang\publish\api\*" -Destination "C:\inetpub\haoliang\api\" -Recurse
Copy-Item -Path "C:\path\to\haoliang\src\frontend\admin\dist\*" -Destination "C:\inetpub\haoliang\admin\" -Recurse
Copy-Item -Path "C:\path\to\haoliang\src\frontend\dashboard\dist\*" -Destination "C:\inetpub\haoliang\dashboard\" -Recurse
```
### 3.5 最终目录结构
```
C:\inetpub\haoliang\
├── api\
│ ├── wwwroot\
│ ├── appsettings.json
│ ├── Haoliang.Api.dll
│ ├── Haoliang.Api.exe
│ ├── logs\ # 日志目录
│ ├── data\ # 数据目录
│ └── web.config
├── admin\
│ ├── index.html
│ ├── assets\
│ └── ...
└── dashboard\
├── index.html
├── assets\
└── ...
```
---
## 四、IIS 配置
### 4.1 创建应用程序池
**方式一:IIS 管理器**
1. 打开 **Internet Information Services (IIS) 管理器**
2. 右键 **应用程序池** → **添加应用程序池**
3. 配置:
| 配置项 | 值 |
|--------|-----|
| 名称 | `HaoliangApi` |
| .NET CLR 版本 | **无托管代码** |
| 托管管道模式 | **集成** |
| 立即启动应用程序池 | ✓ |
**方式二:PowerShell**
```powershell
New-WebAppPool -Name "HaoliangApi"
Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "managedRuntimeVersion" -Value ""
Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "managedPipelineMode" -Value "Integrated"
```
### 4.2 创建网站
**方式一:IIS 管理器**
1. 右键 **网站** → **添加网站**
2. 配置:
| 配置项 | 值 |
|--------|-----|
| 网站名称 | `HaoliangApi` |
| 物理路径 | `C:\inetpub\haoliang\api` |
| 绑定类型 | HTTP |
| 端口 | `5000` |
| 应用程序池 | `HaoliangApi` |
**方式二:PowerShell**
```powershell
New-WebSite -Name "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\api" -Port 5000 -ApplicationPool "HaoliangApi"
```
### 4.3 创建子应用程序
```powershell
# 创建 Admin 子应用
New-WebApplication -Name "admin" -Site "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\admin" -ApplicationPool "HaoliangApi"
# 创建 Dashboard 子应用
New-WebApplication -Name "dashboard" -Site "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\dashboard" -ApplicationPool "HaoliangApi"
# 验证
Get-WebApplication -Site "HaoliangApi"
```
### 4.4 应用程序池高级设置
1. 选择 **HaoliangApi** 应用程序池
2. 右键 → **高级设置**
3. 配置:
| 配置项 | 推荐值 | 说明 |
|--------|--------|------|
| 回收间隔(分钟) | `1740` | 每天凌晨回收一次 |
| 虚拟内存限制(MB) | `0` | 无限制 |
| 专用内存限制(KB) | `0` | 无限制 |
| 启动模式 | `OnDemand` | 按需启动 |
| 最小工作进程数 | `1` | - |
### 4.5 创建 web.config
在 `C:\inetpub\haoliang\api\web.config`(如不存在):
```xml
```
---
## 五、生产配置
### 5.1 创建生产配置文件
创建 `C:\inetpub\haoliang\api\appsettings.Production.json`:
```json
{
"ConnectionStrings": {
"CNCBusinessDB": "Server=localhost;Database=cnc_business;User=haoliang;Password=YourStrongPassword123!;CharSet=utf8mb4;",
"CNCLLogDB": "Server=localhost;Database=cnc_log;User=haoliang;Password=YourStrongPassword123!;CharSet=utf8mb4;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"AppSettings": {
"ApiVersion": "v1",
"EnableSwagger": false,
"EnableCors": true,
"AllowedOrigins": [
"http://localhost:5000",
"http://localhost:8080",
"http://localhost:8081",
"http://192.168.1.100:5000",
"http://192.168.1.100:8080",
"http://192.168.1.100:8081"
],
"DefaultCacheDuration": 300,
"MaxConcurrentCollections": 100
},
"CollectionSettings": {
"DefaultInterval": 30,
"MaxRetryCount": 3,
"RetryInterval": 30,
"PingTimeout": 5000,
"CollectionTimeout": 10000
}
}
```
### 5.2 设置环境变量
```powershell
# 设置环境变量
Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "environmentVariables" -Value @(
@{ name="ASPNETCORE_ENVIRONMENT"; value="Production" }
)
# 验证
Get-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "environmentVariables"
# 重启应用程序池
Restart-WebAppPool -Name "HaoliangApi"
```
### 5.3 修改 CORS 配置(可选)
如果需要更严格的 CORS,在 `Startup.cs` 中修改:
```csharp
services.AddCors(options =>
{
options.AddPolicy("AllowConfiguredOrigins", builder =>
{
var allowedOrigins = Configuration.GetSection("AppSettings:AllowedOrigins").Get();
builder.WithOrigins(allowedOrigins)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
```
---
## 六、日志配置
### 6.1 目录权限
```powershell
# 设置日志目录权限
icacls "C:\inetpub\haoliang\api\logs" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
icacls "C:\inetpub\haoliang\api\data" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
# 验证权限
icacls "C:\inetpub\haoliang\api\logs"
```
### 6.2 Serilog 配置说明
当前配置(Program.cs)已包含:
```csharp
.WriteTo.File("logs/app.log",
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: 30,
fileSizeLimitBytes: 104857600) // 100MB
```
- 日志路径:`C:\inetpub\haoliang\api\logs\app-{Date}.log`
- 保留天数:30 天
- 单文件大小限制:100MB
### 6.3 日志查看
```powershell
# 查看最新日志
Get-Content "C:\inetpub\haoliang\api\logs\app-20260413.log" -Tail 50
# 实时跟踪日志
Get-Content "C:\inetpub\haoliang\api\logs\app-20260413.log" -Wait -Tail 10
```
---
## 七、权限配置
### 7.1 目录权限
```powershell
# API 目录 - 完全控制
icacls "C:\inetpub\haoliang\api" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
icacls "C:\inetpub\haoliang\api" /grant "IIS_IUSRS:(OI)(CI)RX"
# 前端目录 - 只读
icacls "C:\inetpub\haoliang\admin" /grant "IIS_IUSRS:(OI)(CI)RX"
icacls "C:\inetpub\haoliang\dashboard" /grant "IIS_IUSRS:(OI)(CI)RX"
```
### 7.2 IIS 管理器权限配置
1. 右键网站 **HaoliangApi** → **编辑权限**
2. 安全标签页 → 编辑 → 添加:
| 用户/组 | 权限 |
|---------|------|
| `IIS_IUSRS` | 读取 |
| `IUSR` | 读取 |
| `IIS AppPool\HaoliangApi` | 读取/写入 |
---
## 八、防火墙配置
### 8.1 Windows 防火墙规则
```powershell
# 开放 API 端口 (5000)
New-NetFirewallRule -DisplayName "Haoliang API" `
-Direction Inbound -Protocol TCP `
-LocalPort 5000 -Action Allow `
-Profile Any
# 开放 Admin 端口 (8080)
New-NetFirewallRule -DisplayName "Haoliang Admin" `
-Direction Inbound -Protocol TCP `
-LocalPort 8080 -Action Allow `
-Profile Any
# 开放 Dashboard 端口 (8081)
New-NetFirewallRule -DisplayName "Haoliang Dashboard" `
-Direction Inbound -Protocol TCP `
-LocalPort 8081 -Action Allow `
-Profile Any
# 验证规则
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "Haoliang*"}
```
### 8.2 端口检查
```powershell
# 检查端口占用
netstat -an | findstr ":5000 :8080 :8081"
# 测试端口连通性
Test-NetConnection -ComputerName localhost -Port 5000
```
---
## 九、验证部署
### 9.1 启动服务
```powershell
# 启动 IIS
iisreset /start
# 启动应用程序池
Start-WebAppPool -Name "HaoliangApi"
# 启动网站
Start-WebSite -HaoliangApi
```
### 9.2 健康检查
浏览器或 curl 访问:
```powershell
# API 健康检查
curl http://localhost:5000/api/v1/health
# 预期返回示例
# {"status":"healthy","timestamp":"2026-04-13T00:00:00Z"}
```
### 9.3 验证目录访问
| URL | 预期结果 |
|-----|----------|
| `http://localhost:5000/` | 返回 API 根信息或 404 |
| `http://localhost:5000/api/v1/devices` | 返回设备列表 JSON |
| `http://localhost:5000/admin/` | 返回 Admin 管理后台首页 |
| `http://localhost:5000/dashboard/` | 返回 Dashboard 大屏首页 |
| `http://localhost:5000/swagger` | 生产环境返回 404(正常) |
### 9.4 查看实时日志
```powershell
# 跟踪日志
Get-Content "C:\inetpub\haoliang\api\logs\stdout_*" -Wait -Tail 20
```
---
## 十、故障排查
### 10.1 常见错误及解决方案
| 错误代码 | 可能原因 | 解决方案 |
|----------|----------|----------|
| `500.19` | web.config 语法错误 | 检查 web.config 文件 |
| `500.21` | 模块未正确安装 | 重新安装 .NET Hosting Bundle |
| `502.5` | 应用程序启动失败 | 检查 .NET Runtime、查看 stdout 日志 |
| `502.3` | 应用程序池错误 | 检查环境变量配置 |
| `503.0` | 应用程序池未启动 | 启动应用程序池 |
| `404.0` | 文件不存在 | 检查物理路径配置 |
### 10.2 日志分析方法
```powershell
# 查看应用程序池错误
Get-Content "C:\inetpub\haoliang\api\logs\stdout_*.log" | Select-String "Error"
# 查看最近 100 行
Get-Content "C:\inetpub\haoliang\api\logs\app-20260413.log" -Tail 100
```
### 10.3 数据库连接问题
```powershell
# 测试数据库连接
mysql -u haoliang -p -e "USE cnc_business; SELECT COUNT(*) FROM Devices;"
# 检查连接字符串
# 确保 Server=localhost;Port=3306;
```
### 10.4 权限问题
```powershell
# 重置权限
icacls "C:\inetpub\haoliang\api" /reset
# 重新设置
icacls "C:\inetpub\haoliang\api" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M" /T
```
---
## 部署清单
### 部署前检查
```
[ ] Windows Server 已安装并激活
[ ] 服务器 IP 地址已固定
[ ] 所有依赖软件版本确认
[ ] 部署脚本和文件已准备
```
### 环境安装
```
[ ] .NET 8.0 Hosting Bundle 已安装
[ ] IIS 已安装并启动
[ ] MariaDB 已安装并启动
[ ] 所有端口(3306/5000/8080/8081)可用
```
### 数据库配置
```
[ ] 数据库用户 haoliang 已创建
[ ] 业务库 cnc_business 已创建
[ ] 日志库 cnc_log 已创建
[ ] 数据库脚本已导入
[ ] 数据库连接测试通过
```
### 文件部署
```
[ ] API 文件已复制到 C:\inetpub\haoliang\api
[ ] Admin 文件已复制到 C:\inetpub\haoliang\admin
[ ] Dashboard 文件已复制到 C:\inetpub\haoliang\dashboard
[ ] 日志目录已创建
[ ] web.config 已配置
```
### IIS 配置
```
[ ] 应用程序池 HaoliangApi 已创建
[ ] 网站 HaoliangApi 已创建并绑定端口 5000
[ ] Admin 子应用已创建
[ ] Dashboard 子应用已创建
[ ] 应用程序池高级设置已配置
```
### 权限配置
```
[ ] API 目录权限已设置
[ ] 前端目录权限已设置
[ ] 日志目录写入权限已设置
[ ] IIS_IUSRS 读取权限已设置
```
### 生产配置
```
[ ] appsettings.Production.json 已创建
[ ] 数据库连接字符串已配置
[ ] CORS 源已配置
[ ] 环境变量 ASPNETCORE_ENVIRONMENT=Production 已设置
```
### 防火墙配置
```
[ ] 端口 5000 防火墙规则已创建
[ ] 端口 8080 防火墙规则已创建
[ ] 端口 8081 防火墙规则已创建
```
### 验证测试
```
[ ] IIS 服务已启动
[ ] 应用程序池已启动
[ ] API 健康检查通过
[ ] Admin 页面可访问
[ ] Dashboard 页面可访问
[ ] 日志正常写入
```
---
## 附录
### A. 常用 PowerShell 命令
```powershell
# IIS 管理
iisreset /start # 启动 IIS
iisreset /stop # 停止 IIS
iisreset /restart # 重启 IIS
# 应用程序池
Start-WebAppPool -Name "HaoliangApi"
Stop-WebAppPool -Name "HaoliangApi"
Restart-WebAppPool -Name "HaoliangApi"
# 网站
Start-WebSite -Name "HaoliangApi"
Stop-WebSite -Name "HaoliangApi"
# 查看配置
Get-WebBinding -Name "HaoliangApi"
Get-WebApplication -Site "HaoliangApi"
```
### B. 快速重启脚本
创建 `restart.ps1`:
```powershell
# 停止
Stop-WebSite -Name "HaoliangApi"
Stop-WebAppPool -Name "HaoliangApi"
Start-Sleep -Seconds 2
# 启动
Start-WebAppPool -Name "HaoliangApi"
Start-WebSite -Name "HaoliangApi"
Write-Host "Haoliang API restarted successfully."
```
### C. 备份配置
```powershell
# 备份配置文件
Copy-Item "C:\inetpub\haoliang\api\appsettings.Production.json" `
"C:\Backup\appsettings.Production.json.$(Get-Date -Format 'yyyyMMdd')" -Force
# 备份网站配置
%windir%\system32\inetsrv\appcmd list site "HaoliangApi" > "C:\Backup\site_config.txt"
```
---
## 联系方式
如有问题,请检查:
1. 日志文件:`C:\inetpub\haoliang\api\logs\`
2. Windows 事件查看器
3. IIS 管理器连接测试
---
*文档最后更新:2026-04-13*