From 77a6c5fc8b4df531dcc1b4ac1ccc69e205cae152 Mon Sep 17 00:00:00 2001
From: "821644@qq.com" <821644@qq.com>
Date: Mon, 13 Apr 2026 19:59:25 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E7=BD=B2=E6=96=87?=
=?UTF-8?q?=E6=A1=A3=EF=BC=9A=E4=BB=A5deploy.ps1=E4=B8=BA=E4=B8=AD?=
=?UTF-8?q?=E5=BF=83=E7=9A=84=E9=83=A8=E7=BD=B2=E6=B5=81=E7=A8=8B=EF=BC=8C?=
=?UTF-8?q?=E7=AE=80=E5=8C=96IIS=E9=85=8D=E7=BD=AE=E6=AD=A5=E9=AA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/DEPLOYMENT.md | 807 +++++++++++++--------------------------------
1 file changed, 224 insertions(+), 583 deletions(-)
diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md
index eb632ce..6a23fe6 100644
--- a/docs/DEPLOYMENT.md
+++ b/docs/DEPLOYMENT.md
@@ -6,105 +6,111 @@
|------|------|
| 版本 | v1.0.0 |
| 日期 | 2026-04-13 |
-| 部署环境 | Windows Server + IIS + MariaDB |
+| 部署方式 | 使用 deploy.ps1 一键构建 + IIS 手动配置 |
---
## 目录
-1. [环境要求](#1-环境要求)
-2. [一、安装 .NET 8.0 Runtime](#一安装-net-80-runtime)
-3. [二、数据库配置](#二数据库配置)
-4. [三、项目发布](#三项目发布)
-5. [四、IIS 配置](#四iis-配置)
-6. [五、生产配置](#五生产配置)
-7. [六、日志配置](#六日志配置)
-8. [七、权限配置](#七权限配置)
-9. [八、防火墙配置](#八防火墙配置)
-10. [九、验证部署](#九验证部署)
-11. [十、故障排查](#十故障排查)
-12. [部署清单](#部署清单)
+1. [部署流程概述](#1-部署流程概述)
+2. [第一步:运行部署脚本](#2-第一步运行部署脚本)
+3. [第二步:配置数据库](#3-第二步配置数据库)
+4. [第三步:复制文件到 IIS 目录](#4-第三步复制文件到-iis-目录)
+5. [第四步:IIS 配置](#5-第四步iis-配置)
+6. [第五步:修改生产配置](#6-第五步修改生产配置)
+7. [第六步:验证部署](#7-第六步验证部署)
+8. [故障排查](#8-故障排查)
---
-## 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
+## 1. 部署流程概述
+
+部署分为以下步骤:
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ 1. 运行 deploy.ps1 构建项目 │
+│ └─> 输出目录: publish\wwwroot\ │
+│ ├── api\ (后端 API) │
+│ ├── admin\ (管理后台) │
+│ └── dashboard\ (BI 大屏) │
+└─────────────────────────────────────────────────────────────┘
+ ↓
+┌─────────────────────────────────────────────────────────────┐
+│ 2. 配置数据库 (MariaDB) │
+│ ├─ 创建数据库和用户 │
+│ └─ 导入数据库脚本 cnc_business.sql / cnc_log_fixed.sql │
+└─────────────────────────────────────────────────────────────┘
+ ↓
+┌─────────────────────────────────────────────────────────────┐
+│ 3. 复制文件到 IIS 目录 │
+│ └─ publish\wwwroot\* → C:\wwwroot\haoliang\ │
+└─────────────────────────────────────────────────────────────┘
+ ↓
+┌─────────────────────────────────────────────────────────────┐
+│ 4. IIS 配置 │
+│ ├─ 创建应用程序池 HaoliangApi │
+│ ├─ 创建网站 Haoliang (端口 5000) │
+│ └─ 创建子应用 admin / dashboard │
+└─────────────────────────────────────────────────────────────┘
+ ↓
+┌─────────────────────────────────────────────────────────────┐
+│ 5. 修改生产配置 │
+│ └─ 修改 appsettings.Production.json 中的数据库连接 │
+└─────────────────────────────────────────────────────────────┘
```
-下载文件:`dotnet-hosting-8.0.0-win.exe`(或当前最新版本)
-
-### 1.2 安装步骤
+---
-1. 以**管理员身份**运行下载的安装程序
-2. 如果提示关闭 IIS,先停止 IIS:`iisreset /stop`
-3. 接受许可协议
-4. 等待安装完成
-5. 重启 IIS:`iisreset /start`
+## 2. 第一步:运行部署脚本
-### 1.3 验证安装
+### 2.1 执行构建
-打开 PowerShell,执行:
+在项目根目录下执行部署脚本:
```powershell
-dotnet --list-runtimes
+cd D:\git\git\haoliang
+.\deploy.ps1
```
-确认输出包含 `Microsoft.AspNetCore.App 8.0.x`
+### 2.2 脚本输出
-### 1.4 常见问题
+构建成功后,输出目录结构如下:
-- **安装失败**:确保以管理员身份运行,关闭杀毒软件
-- **IIS 检测失败**:先安装 IIS,再安装 Hosting Bundle
+```
+D:\git\git\haoliang\publish\wwwroot\
+├── api\
+│ ├── Haoliang.Api.exe # 主程序
+│ ├── Haoliang.Api.dll
+│ ├── appsettings.json # 开发配置
+│ ├── appsettings.Production.json # 生产配置 ← 稍后修改
+│ ├── web.config # IIS 配置文件
+│ ├── logs\ # 日志目录
+│ └── data\ # 数据目录
+├── admin\
+│ ├── index.html
+│ ├── assets\
+│ └── ...
+└── dashboard\
+ ├── index.html
+ ├── assets\
+ └── ...
+```
---
-## 二、数据库配置
+## 3. 第二步:配置数据库
-### 2.1 连接 MariaDB
+### 3.1 登录 MariaDB
```powershell
mysql -u root -p
```
-### 2.2 创建数据库和用户
+### 3.2 创建数据库和用户
```sql
--- 创建专用数据库用户(密码请使用强密码)
+-- 创建专用数据库用户(请修改密码)
CREATE USER 'haoliang'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
CREATE USER 'haoliang'@'127.0.0.1' IDENTIFIED BY 'YourStrongPassword123!';
@@ -119,129 +125,103 @@ 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 导入数据库结构
+### 3.3 导入数据库脚本
```powershell
# 进入项目数据库脚本目录
-cd C:\path\to\haoliang\database
+cd D:\git\git\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 验证数据库连接
+### 3.4 验证数据库
```powershell
-mysql -u haoliang -p -e "SELECT 1 AS Test;"
+# 验证表已创建
+mysql -u haoliang -p -e "USE cnc_business; SHOW TABLES;"
+mysql -u haoliang -p -e "USE cnc_log; SHOW TABLES;"
```
----
-
-## 三、项目发布
-
-### 3.1 构建后端
-
-```powershell
-# 进入项目根目录
-cd C:\path\to\haoliang
+预期输出:
+- cnc_business 库包含:Devices, Users, Templates, AlarmRules, ProductionRecords 等表
+- cnc_log 库包含:CollectionLogs, SystemLogs, ExceptionLogs 等表
-# 清理并发布后端(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\
-```
+## 4. 第三步:复制文件到 IIS 目录
-### 3.2 构建前端 Admin
+### 4.1 创建目标目录
```powershell
-# 进入 Admin 目录
-cd C:\path\to\haoliang\src\frontend\admin
-
-# 安装依赖(如已有 node_modules 可跳过)
-npm install
+# 创建部署根目录
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang" -Force
-# 构建生产版本
-npm run build
+# 创建子目录
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang\api" -Force
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang\api\logs" -Force
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang\api\data" -Force
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang\admin" -Force
+New-Item -ItemType Directory -Path "C:\wwwroot\haoliang\dashboard" -Force
```
-构建完成后,输出在 `dist` 目录。
-
-### 3.3 构建前端 Dashboard
+### 4.2 复制文件
```powershell
-# 进入 Dashboard 目录
-cd C:\path\to\haoliang\src\frontend\dashboard
-
-# 安装依赖
-npm install
+# 复制 API 文件
+Copy-Item -Path "D:\git\git\haoliang\publish\wwwroot\api\*" -Destination "C:\wwwroot\haoliang\api\" -Recurse -Force
-# 构建生产版本
-npm run build
-```
-
-### 3.4 创建部署目录
+# 复制 Admin 文件
+Copy-Item -Path "D:\git\git\haoliang\publish\wwwroot\admin\*" -Destination "C:\wwwroot\haoliang\admin\" -Recurse -Force
-```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
+# 复制 Dashboard 文件
+Copy-Item -Path "D:\git\git\haoliang\publish\wwwroot\dashboard\*" -Destination "C:\wwwroot\haoliang\dashboard\" -Recurse -Force
```
-### 3.5 最终目录结构
+### 4.3 验证复制结果
```
-C:\inetpub\haoliang\
+C:\wwwroot\haoliang\
├── api\
-│ ├── wwwroot\
-│ ├── appsettings.json
-│ ├── Haoliang.Api.dll
│ ├── Haoliang.Api.exe
-│ ├── logs\ # 日志目录
-│ ├── data\ # 数据目录
-│ └── web.config
+│ ├── web.config
+│ ├── appsettings.json
+│ ├── appsettings.Production.json
+│ ├── logs\
+│ └── data\
├── admin\
│ ├── index.html
-│ ├── assets\
-│ └── ...
+│ └── assets\
└── dashboard\
├── index.html
- ├── assets\
- └── ...
+ └── assets\
```
---
-## 四、IIS 配置
+## 5. 第四步:IIS 配置
+
+### 5.1 创建应用程序池
+
+**方式一:PowerShell(推荐)**
-### 4.1 创建应用程序池
+```powershell
+# 创建应用程序池
+New-WebAppPool -Name "HaoliangApi"
+Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "managedRuntimeVersion" -Value ""
+Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "managedPipelineMode" -Value "Integrated"
+Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "startMode" -Value "OnDemand"
+Start-WebAppPool -Name "HaoliangApi"
+```
-**方式一:IIS 管理器**
+**方式二:IIS 管理器**
-1. 打开 **Internet Information Services (IIS) 管理器**
+1. 打开 **IIS 管理器**
2. 右键 **应用程序池** → **添加应用程序池**
3. 配置:
@@ -250,529 +230,190 @@ C:\inetpub\haoliang\
| 名称 | `HaoliangApi` |
| .NET CLR 版本 | **无托管代码** |
| 托管管道模式 | **集成** |
-| 立即启动应用程序池 | ✓ |
-**方式二:PowerShell**
+### 5.2 创建网站
+
+**方式一: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"
+New-WebSite -Name "Haoliang" -PhysicalPath "C:\wwwroot\haoliang\api" -Port 5000 -ApplicationPool "HaoliangApi"
+Start-WebSite -Name "Haoliang"
```
-### 4.2 创建网站
-
-**方式一:IIS 管理器**
+**方式二:IIS 管理器**
1. 右键 **网站** → **添加网站**
2. 配置:
| 配置项 | 值 |
|--------|-----|
-| 网站名称 | `HaoliangApi` |
-| 物理路径 | `C:\inetpub\haoliang\api` |
-| 绑定类型 | HTTP |
+| 网站名称 | `Haoliang` |
+| 物理路径 | `C:\wwwroot\haoliang\api` |
| 端口 | `5000` |
| 应用程序池 | `HaoliangApi` |
-**方式二:PowerShell**
-
-```powershell
-New-WebSite -Name "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\api" -Port 5000 -ApplicationPool "HaoliangApi"
-```
-
-### 4.3 创建子应用程序
+### 5.3 创建子应用程序
```powershell
# 创建 Admin 子应用
-New-WebApplication -Name "admin" -Site "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\admin" -ApplicationPool "HaoliangApi"
+New-WebApplication -Name "admin" -Site "Haoliang" -PhysicalPath "C:\wwwroot\haoliang\admin" -ApplicationPool "HaoliangApi"
# 创建 Dashboard 子应用
-New-WebApplication -Name "dashboard" -Site "HaoliangApi" -PhysicalPath "C:\inetpub\haoliang\dashboard" -ApplicationPool "HaoliangApi"
+New-WebApplication -Name "dashboard" -Site "Haoliang" -PhysicalPath "C:\wwwroot\haoliang\dashboard" -ApplicationPool "HaoliangApi"
-# 验证
-Get-WebApplication -Site "HaoliangApi"
+# 验证配置
+Get-WebApplication -Site "Haoliang"
```
-### 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
- }
-}
+Name Path PhysicalPath
+---- ---- ------------
+admin /admin C:\wwwroot\haoliang\admin
+dashboard /dashboard C:\wwwroot\haoliang\dashboard
```
-### 5.2 设置环境变量
+### 5.4 设置目录权限
```powershell
-# 设置环境变量
-Set-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "environmentVariables" -Value @(
- @{ name="ASPNETCORE_ENVIRONMENT"; value="Production" }
-)
+# API 目录权限
+icacls "C:\wwwroot\haoliang\api" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
+icacls "C:\wwwroot\haoliang\api\logs" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
+icacls "C:\wwwroot\haoliang\api\data" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M"
-# 验证
-Get-ItemProperty -Path "IIS:\AppPools\HaoliangApi" -Name "environmentVariables"
-
-# 重启应用程序池
-Restart-WebAppPool -Name "HaoliangApi"
+# 前端目录权限
+icacls "C:\wwwroot\haoliang\admin" /grant "IIS_IUSRS:(OI)(CI)RX"
+icacls "C:\wwwroot\haoliang\dashboard" /grant "IIS_IUSRS:(OI)(CI)RX"
```
-### 5.3 修改 CORS 配置(可选)
-
-如果需要更严格的 CORS,在 `Startup.cs` 中修改:
+### 5.5 防火墙配置(如需要)
-```csharp
-services.AddCors(options =>
-{
- options.AddPolicy("AllowConfiguredOrigins", builder =>
- {
- var allowedOrigins = Configuration.GetSection("AppSettings:AllowedOrigins").Get();
- builder.WithOrigins(allowedOrigins)
- .AllowAnyMethod()
- .AllowAnyHeader()
- .AllowCredentials();
- });
-});
+```powershell
+# 开放端口
+New-NetFirewallRule -DisplayName "Haoliang API" -Direction Inbound -Protocol TCP -LocalPort 5000 -Action Allow -Profile Any
```
---
-## 六、日志配置
+## 6. 第五步:修改生产配置
-### 6.1 目录权限
+### 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:\wwwroot\haoliang\api\appsettings.Production.json
```
-- 日志路径:`C:\inetpub\haoliang\api\logs\app-{Date}.log`
-- 保留天数:30 天
-- 单文件大小限制:100MB
+### 6.2 修改数据库连接
-### 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
+```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;"
+ }
+}
```
----
-
-## 七、权限配置
-
-### 7.1 目录权限
+### 6.3 重启应用程序池
```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"
+Restart-WebAppPool -Name "HaoliangApi"
```
-### 7.2 IIS 管理器权限配置
-
-1. 右键网站 **HaoliangApi** → **编辑权限**
-2. 安全标签页 → 编辑 → 添加:
-
-| 用户/组 | 权限 |
-|---------|------|
-| `IIS_IUSRS` | 读取 |
-| `IUSR` | 读取 |
-| `IIS AppPool\HaoliangApi` | 读取/写入 |
-
---
-## 八、防火墙配置
+## 7. 第六步:验证部署
-### 8.1 Windows 防火墙规则
+### 7.1 检查服务状态
```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*"}
-```
+# 检查网站状态
+Get-WebSiteState -Name "Haoliang"
-### 8.2 端口检查
-
-```powershell
-# 检查端口占用
-netstat -an | findstr ":5000 :8080 :8081"
-
-# 测试端口连通性
-Test-NetConnection -ComputerName localhost -Port 5000
+# 检查应用程序池状态
+Get-WebAppPoolState -Name "HaoliangApi"
```
----
+### 7.2 浏览器访问测试
-## 九、验证部署
+| 地址 | 预期结果 |
+|------|----------|
+| http://localhost:5000/ | API 响应(JSON 或空白页) |
+| http://localhost:5000/api/v1/health | 健康检查 JSON |
+| http://localhost:5000/admin | 管理后台登录页 |
+| http://localhost:5000/dashboard | BI 大屏首页 |
-### 9.1 启动服务
+### 7.3 查看日志
```powershell
-# 启动 IIS
-iisreset /start
+# 查看 stdout 日志
+Get-Content "C:\wwwroot\haoliang\api\logs\stdout_*.log" -Tail 20
-# 启动应用程序池
-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
+# 查看应用日志
+Get-Content "C:\wwwroot\haoliang\api\logs\app-*.log" -Tail 20
```
---
-## 十、故障排查
+## 8. 故障排查
-### 10.1 常见错误及解决方案
+### 8.1 常见错误
-| 错误代码 | 可能原因 | 解决方案 |
-|----------|----------|----------|
-| `500.19` | web.config 语法错误 | 检查 web.config 文件 |
-| `500.21` | 模块未正确安装 | 重新安装 .NET Hosting Bundle |
-| `502.5` | 应用程序启动失败 | 检查 .NET Runtime、查看 stdout 日志 |
-| `502.3` | 应用程序池错误 | 检查环境变量配置 |
-| `503.0` | 应用程序池未启动 | 启动应用程序池 |
-| `404.0` | 文件不存在 | 检查物理路径配置 |
+| 错误 | 原因 | 解决方案 |
+|------|------|----------|
+| 500.19 | web.config 语法错误 | 检查 web.config 文件 |
+| 500.21 | .NET Core 模块未安装 | 安装 .NET Core Hosting Bundle |
+| 502.5 | 应用程序启动失败 | 检查 appsettings.Production.json 数据库连接 |
+| 502.3 | 托管模块配置错误 | 检查 web.config 中 AspNetCore 模块 |
+| 404.0 | 路径不存在 | 检查物理路径配置 |
-### 10.2 日志分析方法
+### 8.2 排查步骤
```powershell
-# 查看应用程序池错误
-Get-Content "C:\inetpub\haoliang\api\logs\stdout_*.log" | Select-String "Error"
+# 1. 检查应用程序池是否启动
+Get-WebAppPoolState -Name "HaoliangApi"
-# 查看最近 100 行
-Get-Content "C:\inetpub\haoliang\api\logs\app-20260413.log" -Tail 100
-```
-
-### 10.3 数据库连接问题
+# 2. 查看详细错误日志
+Get-Content "C:\wwwroot\haoliang\api\logs\stdout_*.log" | Select-String "Error"
-```powershell
-# 测试数据库连接
-mysql -u haoliang -p -e "USE cnc_business; SELECT COUNT(*) FROM Devices;"
+# 3. 测试数据库连接
+mysql -u haoliang -p -e "USE cnc_business; SELECT 1;"
-# 检查连接字符串
-# 确保 Server=localhost;Port=3306;
+# 4. 检查端口占用
+netstat -an | findstr ":5000"
```
-### 10.4 权限问题
+### 8.3 快速重启
```powershell
-# 重置权限
-icacls "C:\inetpub\haoliang\api" /reset
-
-# 重新设置
-icacls "C:\inetpub\haoliang\api" /grant "IIS AppPool\HaoliangApi:(OI)(CI)M" /T
+Restart-WebAppPool -Name "HaoliangApi"
+Start-WebSite -Name "Haoliang"
```
---
## 部署清单
-### 部署前检查
-
-```
-[ ] 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 已配置
+[ ] 1. 运行 deploy.ps1 构建成功
+[ ] 2. MariaDB 数据库已创建
+[ ] 3. 数据库用户 haoliang 已创建并授权
+[ ] 4. 数据库脚本已导入 (cnc_business.sql, cnc_log_fixed.sql)
+[ ] 5. 文件已复制到 C:\wwwroot\haoliang
+[ ] 6. 应用程序池 HaoliangApi 已创建
+[ ] 7. 网站 Haoliang 已创建 (端口 5000)
+[ ] 8. 子应用 admin 已创建
+[ ] 9. 子应用 dashboard 已创建
+[ ] 10. 目录权限已设置
+[ ] 11. appsettings.Production.json 数据库连接已修改
+[ ] 12. 应用程序池已重启
+[ ] 13. 浏览器访问测试通过
```
-### 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*