@elf-express/admin-net-mcp 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/index.js +83 -88
  2. package/knowledge/Furion_Teaching_Manual/04-1-/351/205/215/347/275/256.md +442 -0
  3. package/knowledge/Furion_Teaching_Manual/04-2-/351/201/270/351/240/205.md +363 -0
  4. package/knowledge/Furion_Teaching_Manual/05-1-/345/213/225/346/205/213WebAPI.md +825 -0
  5. package/knowledge/Furion_Teaching_Manual/05-2-HttpContext.md +217 -0
  6. package/knowledge/Furion_Teaching_Manual/05-3-/347/257/251/351/201/270/345/231/250/346/224/224/346/210/252/345/231/250AOP.md +581 -0
  7. package/knowledge/Furion_Teaching_Manual/05-4-/350/253/213/346/261/202/347/250/275/346/240/270/346/227/245/350/252/214.md +129 -0
  8. package/knowledge/Furion_Teaching_Manual/05-5-/344/270/255/344/273/213/350/273/237/351/253/224Middleware.md +328 -0
  9. package/knowledge/Furion_Teaching_Manual/05-6-Vue-React-Angular/344/273/213/351/235/242/344/273/243/347/220/206.md +317 -0
  10. package/knowledge/Furion_Teaching_Manual/06-1/350/246/217/347/257/204/345/214/226/346/216/245/345/217/243.md +1458 -0
  11. package/knowledge/Furion_Teaching_Manual/06-2/347/254/254/344/270/211/346/226/271API_Scalar.md +91 -0
  12. package/knowledge/Furion_Teaching_Manual/07-/345/217/213/345/245/275/344/276/213/345/244/226/350/231/225/347/220/206.md +511 -0
  13. package/knowledge/Furion_Teaching_Manual/08-1-/350/263/207/346/226/231/351/251/227/350/255/211/345/237/272/347/244/216/344/275/277/347/224/250.md +587 -0
  14. package/knowledge/Furion_Teaching_Manual/10-1-SqlSugar/346/225/264/345/220/210.md +336 -0
  15. package/knowledge/Furion_Teaching_Manual/11-SaaS /345/244/232/347/247/237/346/210/266/347/255/206/350/250/230.md" +271 -0
  16. package/knowledge/Furion_Teaching_Manual/12-furion-dependency-injection.md +408 -0
  17. package/knowledge/Furion_Teaching_Manual/13-/347/211/251/344/273/266/350/263/207/346/226/231/346/230/240/345/260/204/357/274/210Mapster/357/274/211.md +162 -0
  18. package/knowledge/Furion_Teaching_Manual/14-/345/210/206/345/270/203/345/274/217/347/274/223/345/255/230.md +311 -0
  19. package/knowledge/Furion_Teaching_Manual/15-/345/256/211/345/205/250/351/211/264/346/235/203.md +832 -0
  20. package/knowledge/Furion_Teaching_Manual/17-/346/252/242/350/246/226/347/257/204/346/234/254/345/274/225/346/223/216.md +327 -0
  21. package/knowledge/Furion_Teaching_Manual/18-/346/227/245/350/252/214/350/250/230/351/214/204.md +639 -0
  22. package/knowledge/Furion_Teaching_Manual/19-1-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/237/272/347/244/216/344/275/277/347/224/250.md +621 -0
  23. package/knowledge/Furion_Teaching_Manual/19-2-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/351/200/262/351/232/216/346/214/207/345/215/227.md +928 -0
  24. package/knowledge/Furion_Teaching_Manual/19-3-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/270/270/350/246/213/345/225/217/351/241/214.md +362 -0
  25. package/knowledge/Furion_Teaching_Manual/20-/350/263/207/346/226/231/345/212/240/350/247/243/345/257/206.md +286 -0
  26. package/knowledge/Furion_Teaching_Manual/20-/351/231/204/351/214/204-KSort/350/263/207/346/226/231/347/260/275/345/220/215/345/256/214/346/225/264/345/216/237/345/247/213/347/242/274.md +305 -0
  27. package/knowledge/Furion_Teaching_Manual/21-/345/205/250/347/220/203/345/214/226/345/222/214/346/234/254/345/234/260/345/214/226.md +342 -0
  28. package/knowledge/Furion_Teaching_Manual/22-/344/272/213/344/273/266/345/214/257/346/265/201/346/216/222EventBus.md +448 -0
  29. package/knowledge/Furion_Teaching_Manual/23-JSON/345/272/217/345/210/227/345/214/226.md +340 -0
  30. package/knowledge/Furion_Teaching_Manual/24-/345/215/263/346/231/202/351/200/232/350/250/212SignalR.md +247 -0
  31. package/knowledge/Furion_Teaching_Manual/25-/350/274/224/345/212/251/350/247/222/350/211/262/346/234/215/345/213/231WorkerService.md +295 -0
  32. package/knowledge/Furion_Teaching_Manual/26-1-/346/216/222/347/250/213/344/275/234/346/245/255/345/256/232/346/231/202/344/273/273/345/213/231.md +631 -0
  33. package/knowledge/Furion_Teaching_Manual/26-2-Cron/350/241/250/351/201/224/345/274/217.md +203 -0
  34. package/knowledge/Furion_Teaching_Manual/26-3-/344/273/273/345/213/231/344/275/207/345/210/227TaskQueue.md +215 -0
  35. package/knowledge/Furion_Teaching_Manual/27-/345/210/206/346/225/243/345/274/217ID/347/224/237/346/210/220.md +86 -0
  36. package/knowledge/Furion_Teaching_Manual/28-/346/250/241/347/265/204/345/214/226/351/226/213/347/231/274.md +68 -0
  37. package/knowledge/Furion_Teaching_Manual/29-/346/265/201/350/256/212/347/211/251/344/273/266Clay.md +313 -0
  38. package/knowledge/Furion_Teaching_Manual/30-/350/204/253/346/225/217/350/231/225/347/220/206/357/274/210Sensitive Detection).md" +168 -0
  39. package/knowledge/Furion_Teaching_Manual/32-/346/234/203/350/251/261/345/222/214/347/213/200/346/205/213/347/256/241/347/220/206.md +147 -0
  40. package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md +98 -0
  41. package/knowledge/Furion_Teaching_Manual/34-2-Docker/351/203/250/347/275/262.md +313 -0
  42. package/knowledge/Furion_Teaching_Manual/34-3-Nginx/351/203/250/347/275/262.md +157 -0
  43. package/knowledge/Furion_Teaching_Manual/34-8-WindowsService/351/203/250/347/275/262.md +112 -0
  44. package/knowledge/Furion_Teaching_Manual/35-1-Docker/347/222/260/345/242/203/346/214/201/347/272/214/351/203/250/347/275/262Jenkins.md +169 -0
  45. package/knowledge/Furion_Teaching_Manual/36-1-/345/226/256/345/205/203/346/270/254/350/251/246/346/225/264/345/220/210/346/270/254/350/251/246.md +275 -0
  46. package/knowledge/Furion_Teaching_Manual/36-3-/345/237/272/346/272/226/346/270/254/350/251/246Benchmarking.md +80 -0
  47. package/knowledge/attributes.md +153 -0
  48. package/knowledge/config.md +147 -0
  49. package/knowledge/entity.md +115 -0
  50. package/knowledge/event.md +124 -0
  51. package/knowledge/plugin.md +136 -0
  52. package/knowledge/service.md +146 -0
  53. package/knowledge/sqlsugar.md +172 -0
  54. package/knowledge/vue-typescript.md +338 -0
  55. package/package.json +3 -2
@@ -0,0 +1,98 @@
1
+ # 33. IPC 程序通訊
2
+
3
+ ---
4
+
5
+ ## 33.1 概述
6
+
7
+ IPC(Inter-Process Communication)是指不同程序之間的資料交互。Furion 框架內建了**程序內**和**程序外**兩種通訊模式:
8
+
9
+ | 模式 | 實作方式 | 狀態 |
10
+ |------|---------|------|
11
+ | **程序內通訊**(執行緒間) | `Channel` 管道 | ✅ 已實作 |
12
+ | **程序外通訊**(跨程序) | `MemoryMappedFile` 共享記憶體 | 🔜 後續版本 |
13
+
14
+ ---
15
+
16
+ ## 33.4 程序內通訊(執行緒間)
17
+
18
+ 採用 `Channel`(管道)+ `Lazy` + `Task.Factory` 實現高效能的執行緒間通訊,是 .NET 實現**生產者-消費者**模式最簡易且強大的方式。
19
+
20
+ ### Channel 兩種模式
21
+
22
+ | 模式 | 說明 | 建議 |
23
+ |------|------|------|
24
+ | `UnBoundedChannel` | 無限容量,生產者全速生產,有記憶體耗盡風險 | — |
25
+ | `BoundedChannel` | 有限容量(預設 1000),超過上限生產者等待 | ✅ 推薦 |
26
+
27
+ ### 33.4.2 基本使用
28
+
29
+ **建立管道處理程式**:
30
+
31
+ ```csharp
32
+ using Furion.IPCChannel;
33
+
34
+ public class MyChannelHandler : ChannelHandler<string>
35
+ {
36
+ public override Task InvokeAsync(string message)
37
+ {
38
+ Console.WriteLine(message);
39
+ return Task.CompletedTask;
40
+ }
41
+ }
42
+ ```
43
+
44
+ > `ChannelHandler<TMessage>` 的泛型型別決定接收的訊息類型,不同型別自動過濾。
45
+
46
+ **發送訊息**:
47
+
48
+ ```csharp
49
+ public async Task SendAsync()
50
+ {
51
+ for (int i = 0; i < 100; i++)
52
+ {
53
+ // 非同步寫入(有限容量管道)
54
+ await ChannelContext<string, MyChannelHandler>.BoundedChannel.Writer.WriteAsync($"Loop {i} times.");
55
+
56
+ // 也可同步寫入
57
+ // ChannelContext<string, MyChannelHandler>.BoundedChannel.Writer.TryWrite($"Loop {i} times.");
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### 33.4.3 實現多訂閱
63
+
64
+ 預設初始化一個長時間 Task 進行訂閱,如需多訂閱可建立新的讀取器:
65
+
66
+ ```csharp
67
+ var reader = ChannelContext<string, MyChannelHandler>.BoundedChannel.Reader;
68
+
69
+ _ = Task.Factory.StartNew(async () =>
70
+ {
71
+ while (await reader.WaitToReadAsync())
72
+ {
73
+ if (!reader.TryRead(out var message)) continue;
74
+ // 預設重試 3 次(每次間隔 1s)
75
+ await Retry.InvokeAsync(async () =>
76
+ await Activator.CreateInstance<MyChannelHandler>().InvokeAsync(message),
77
+ 3, 1000, finalThrow: false);
78
+ }
79
+ }, TaskCreationOptions.LongRunning);
80
+ ```
81
+
82
+ ### 33.4.5 CallContext 方式
83
+
84
+ Furion v2.18+ 提供 `CallContext` 靜態類(基於 `AsyncLocal<T>`),也可實現執行緒間通訊:
85
+
86
+ ```csharp
87
+ CallContext.SetLocalValue("name", "Furion");
88
+ var name = CallContext.GetLocalValue("name");
89
+
90
+ CallContext<int>.SetLocalValue("count", 1);
91
+ var count = CallContext<int>.GetLocalValue("count");
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 33.5 程序外通訊(共享記憶體)
97
+
98
+ 計畫透過 `MemoryMappedFile` 實現跨程序共享記憶體通訊,目前尚未開放,將在後續版本提供。
@@ -0,0 +1,313 @@
1
+ # 34.2 Docker 部署
2
+
3
+ ---
4
+
5
+ ## 34.2.1 概述
6
+
7
+ Docker 是開源的應用容器引擎,透過容器技術實現「一次建置,到處運行」。官方網站:https://www.docker.com/
8
+
9
+ ### 精簡發佈檔案
10
+
11
+ ```xml
12
+ <PropertyGroup>
13
+ <TargetFramework>net6.0</TargetFramework>
14
+ <SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
15
+ </PropertyGroup>
16
+
17
+ <!-- 不產生 .pdb 檔案 -->
18
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
19
+ <DebugType>none</DebugType>
20
+ <DebugSymbols>false</DebugSymbols>
21
+ </PropertyGroup>
22
+ ```
23
+
24
+ ---
25
+
26
+ ## 34.2.2 Dockerfile
27
+
28
+ ### Visual Studio 自動產生(推薦)
29
+
30
+ 1. 啟動層專案 → 右鍵 → 新增 → Docker 支援 → 選擇 **Linux**
31
+ 2. 將 `Dockerfile` 移動到解決方案根目錄(與 `.sln` 同級)
32
+ 3. 編輯 `.csproj` 加入:
33
+
34
+ ```xml
35
+ <PropertyGroup>
36
+ <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
37
+ <DockerfileFile>..\Dockerfile</DockerfileFile>
38
+ </PropertyGroup>
39
+ <ItemGroup>
40
+ <None Include="..\Dockerfile"><Link>Dockerfile</Link></None>
41
+ </ItemGroup>
42
+ ```
43
+
44
+ ### 手動編寫(.NET 6 範例)
45
+
46
+ ```dockerfile
47
+ FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
48
+ WORKDIR /app
49
+ EXPOSE 80
50
+ EXPOSE 443
51
+
52
+ FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
53
+ ARG BUILD_CONFIGURATION=Release
54
+ WORKDIR /src
55
+ COPY ["YourProject.Web.Entry/YourProject.Web.Entry.csproj", "YourProject.Web.Entry/"]
56
+ COPY ["YourProject.Application/YourProject.Application.csproj", "YourProject.Application/"]
57
+ COPY ["YourProject.Core/YourProject.Core.csproj", "YourProject.Core/"]
58
+ RUN dotnet restore "./YourProject.Web.Entry/YourProject.Web.Entry.csproj"
59
+ COPY . .
60
+ WORKDIR "/src/YourProject.Web.Entry"
61
+ RUN dotnet build "./YourProject.Web.Entry.csproj" -c $BUILD_CONFIGURATION -o /app/build
62
+
63
+ FROM build AS publish
64
+ ARG BUILD_CONFIGURATION=Release
65
+ RUN dotnet publish "./YourProject.Web.Entry.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
66
+
67
+ FROM base AS final
68
+ WORKDIR /app
69
+ COPY --from=publish /app/publish .
70
+ ENTRYPOINT ["dotnet", "YourProject.Web.Entry.dll"]
71
+ ```
72
+
73
+ ### 已手動發佈的簡化版
74
+
75
+ ```dockerfile
76
+ FROM mcr.microsoft.com/dotnet/aspnet:6.0
77
+ WORKDIR /app
78
+ EXPOSE 80
79
+ EXPOSE 443
80
+ COPY . .
81
+ ENTRYPOINT ["dotnet", "YourProject.Web.Entry.dll"]
82
+ ```
83
+
84
+ ---
85
+
86
+ ## 34.2.3 建置映像檔
87
+
88
+ ```bash
89
+ docker build -t your-project:1.0 .
90
+ docker images ls # 查看映像檔列表
91
+ ```
92
+
93
+ ## 34.2.4 執行映像檔
94
+
95
+ ```bash
96
+ # 執行(映像檔 → 容器)
97
+ docker run --name yourproject -p 8090:80 --restart=always -d your-project:1.0
98
+
99
+ # 查看日誌
100
+ docker logs yourproject
101
+
102
+ # 進入容器
103
+ docker exec -it yourproject bash
104
+ ```
105
+
106
+ ---
107
+
108
+ ## 34.2.5 發佈映像檔(Docker Hub)
109
+
110
+ ```bash
111
+ # 打標籤
112
+ docker tag your-project:1.0 username/tests:1.0
113
+
114
+ # 登入
115
+ docker login
116
+
117
+ # 推送
118
+ docker push username/tests:1.0
119
+
120
+ # 其他人即可執行
121
+ docker run --name tests -p 8091:80 --restart=always -d username/tests:1.0
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 34.2.6 私有倉庫
127
+
128
+ ### Docker Registry(輕量級)
129
+
130
+ ```bash
131
+ # 啟動 Registry
132
+ docker run --name registry -p 9000:5000 -v /path/to/images:/var/lib/registry --restart always -d registry:2
133
+
134
+ # 打標籤並推送
135
+ docker tag your-project:1.0 localhost:9000/monksoul/tests:1.0
136
+ docker push localhost:9000/monksoul/tests:1.0
137
+
138
+ # 查看倉庫
139
+ # http://localhost:9000/v2/_catalog
140
+ ```
141
+
142
+ > 需在 Docker Engine 設定中加入 `"insecure-registries": ["localhost:9000"]`。
143
+
144
+ ### Harbor(推薦,企業級)
145
+
146
+ Harbor 提供 RBAC、映像簽名、複製、LDAP 整合等企業級功能。
147
+
148
+ ```bash
149
+ # 下載並解壓
150
+ wget https://github.com/goharbor/harbor/releases/download/v2.9.2/harbor-offline-installer-v2.9.2.tgz
151
+ tar -zxf harbor-offline-installer-v2.9.2.tgz
152
+ cp harbor.yml.tmpl harbor.yml
153
+
154
+ # 編輯 harbor.yml(設定 hostname、port、https 等)
155
+ # 安裝
156
+ sudo ./install.sh
157
+
158
+ # 推送映像
159
+ docker tag your-project:1.0 localhost:9001/project-name/tests:1.0
160
+ docker login localhost:9001
161
+ docker push localhost:9001/project-name/tests:1.0
162
+ ```
163
+
164
+ > 預設帳號密碼:`admin` / `Harbor12345`。啟用 Trivy 漏洞掃描:`sudo ./install.sh --with-trivy`。
165
+
166
+ ---
167
+
168
+ ## 34.2.7 資料卷(Volume)
169
+
170
+ 資料卷用於持久化資料、容器間共享、效能優化。最佳實踐:將容器設計為**無狀態容器**。
171
+
172
+ ```bash
173
+ # 掛載本機目錄到容器
174
+ docker run --name vol1 -p 8094:80 -v /host/path:/app/configs --restart=always -d vol:0.1
175
+
176
+ # 從容器複製檔案到本機
177
+ docker cp vol1:/app/configs_temp/ /host/path/
178
+ ```
179
+
180
+ Dockerfile 中宣告資料卷:
181
+
182
+ ```dockerfile
183
+ COPY YourProject.Web.Entry/configs/* /app/configs_temp/
184
+ VOLUME /app/configs
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 34.2.8 Docker Compose
190
+
191
+ 透過 `docker-compose.yml` 定義和執行多容器應用。
192
+
193
+ ### 範例
194
+
195
+ ```yaml
196
+ version: '3.8'
197
+
198
+ services:
199
+ first-mssql:
200
+ container_name: first-mssql
201
+ image: mcr.microsoft.com/mssql/server
202
+ environment:
203
+ - ACCEPT_EULA=Y
204
+ - SA_PASSWORD=YourPassword!123
205
+ - MSSQL_PID=Express
206
+ ports:
207
+ - 1433:1433
208
+
209
+ first-mysql:
210
+ container_name: first-mysql
211
+ image: mysql
212
+ environment:
213
+ - MYSQL_ROOT_PASSWORD=123456
214
+ ports:
215
+ - 3306:3306
216
+
217
+ first-nginx:
218
+ container_name: first-nginx
219
+ image: nginx
220
+ ports:
221
+ - 8081:80
222
+ ```
223
+
224
+ ```bash
225
+ docker-compose up -d # 啟動
226
+ docker-compose down # 停止並刪除
227
+ docker-compose up --build # 重新建置
228
+ docker-compose ps # 查看狀態
229
+ docker-compose logs # 查看日誌
230
+ ```
231
+
232
+ ---
233
+
234
+ ## 34.2.9 常見問題
235
+
236
+ ### 無 HTTPS 憑證
237
+
238
+ 若設定了 `https://` URL 但未提供憑證,映像檔啟動會失敗。解法:提供有效憑證或移除 https URL。
239
+
240
+ ### DateTime.Now 時區問題
241
+
242
+ ```dockerfile
243
+ ENV TZ=Asia/Taipei
244
+ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
245
+ ```
246
+
247
+ ### 國內映像加速
248
+
249
+ ```json
250
+ {
251
+ "registry-mirrors": [
252
+ "https://registry.docker-cn.com",
253
+ "https://docker.mirrors.ustc.edu.cn"
254
+ ]
255
+ }
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 34.2.11 參考資料
261
+
262
+ ### 前端 Dockerfile 範例(Vue/React/Angular)
263
+
264
+ ```dockerfile
265
+ FROM nginx:stable-alpine
266
+ RUN rm /etc/nginx/conf.d/default.conf
267
+ COPY nginx.conf /etc/nginx/conf.d/
268
+ COPY build /usr/share/nginx/html
269
+ EXPOSE 80
270
+ CMD ["nginx", "-g", "daemon off;"]
271
+ ```
272
+
273
+ ### Docker 常用命令速查
274
+
275
+ | 命令 | 說明 |
276
+ |------|------|
277
+ | `docker build -t name:tag .` | 建置映像檔 |
278
+ | `docker run --name c -p 80:80 -d img` | 執行容器 |
279
+ | `docker images ls` | 映像檔列表 |
280
+ | `docker container ps -a` | 所有容器 |
281
+ | `docker start/stop/restart name` | 啟動/停止/重啟 |
282
+ | `docker logs name` | 查看日誌 |
283
+ | `docker exec -it name bash` | 進入容器 |
284
+ | `docker rm -f name` | 強制刪除容器 |
285
+ | `docker rmi name:tag` | 刪除映像檔 |
286
+ | `docker cp container:path host_path` | 複製檔案 |
287
+
288
+ ### Docker Compose 常用命令速查
289
+
290
+ | 命令 | 說明 |
291
+ |------|------|
292
+ | `docker-compose up -d` | 背景啟動 |
293
+ | `docker-compose down` | 停止並刪除 |
294
+ | `docker-compose up --build` | 重新建置 |
295
+ | `docker-compose ps` | 查看服務 |
296
+ | `docker-compose logs` | 查看日誌 |
297
+ | `docker-compose exec svc bash` | 進入服務 |
298
+ | `docker-compose restart svc` | 重啟服務 |
299
+
300
+ ### Dockerfile 常用指令速查
301
+
302
+ | 指令 | 說明 |
303
+ |------|------|
304
+ | `FROM` | 指定基礎映像檔 |
305
+ | `WORKDIR` | 設定工作目錄 |
306
+ | `COPY` / `ADD` | 複製檔案(ADD 支援 URL) |
307
+ | `RUN` | 建置時執行命令 |
308
+ | `CMD` | 容器啟動時執行命令 |
309
+ | `ENTRYPOINT` | 容器啟動後第一個命令 |
310
+ | `EXPOSE` | 宣告埠號 |
311
+ | `ENV` | 設定環境變數 |
312
+ | `VOLUME` | 宣告資料卷 |
313
+ | `USER` | 設定執行使用者 |
@@ -0,0 +1,157 @@
1
+ # 34.3 Nginx 部署
2
+
3
+ ---
4
+
5
+ ## 34.3.1 概述
6
+
7
+ Nginx 是一款高效能的 HTTP 伺服器 / 反向代理伺服器,支援同時處理上萬個並行連線,CPU 和記憶體消耗極低。
8
+
9
+ ---
10
+
11
+ ## 34.3.2 安裝 Nginx
12
+
13
+ ### Linux / Mac OS
14
+
15
+ ```bash
16
+ sudo apt-get update
17
+ sudo apt install nginx
18
+ sudo systemctl start nginx
19
+ sudo systemctl enable nginx
20
+ sudo systemctl status nginx
21
+ ```
22
+
23
+ ### Windows
24
+
25
+ 1. 從 https://nginx.org/en/download.html 下載 nginx
26
+ 2. 下載 [NSSM](https://nssm.cc/) 並解壓,進入 `win64` 目錄
27
+ 3. 執行 `nssm install nginx_service`(或 `./nssm.exe install nginx_service`)
28
+ 4. 指定 `nginx.exe` 路徑 → Install service
29
+ 5. 啟動 `nginx_service` 服務
30
+
31
+ > 若 IIS 佔用 80 埠,需先停止該站點。安裝 Nginx 後可透過 `proxy_pass` 轉發到任意埠。
32
+
33
+ ---
34
+
35
+ ## 34.3.3 網站設定
36
+
37
+ ### 34.3.3.1 部署 ASP.NET Core 網站
38
+
39
+ 先透過 pm2、IIS 或 Windows Service 將 ASP.NET Core 部署到非 80/443 埠(如 8090)。
40
+
41
+ **取得真實 IP 地址**:
42
+
43
+ ```csharp
44
+ // 方式一:Configure 中設定
45
+ app.UseForwardedHeaders(new ForwardedHeadersOptions
46
+ {
47
+ ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
48
+ });
49
+
50
+ // 方式二:若仍取得代理 IP,改用此設定
51
+ services.Configure<ForwardedHeadersOptions>(options =>
52
+ {
53
+ options.ForwardedHeaders = ForwardedHeaders.All;
54
+ options.KnownNetworks.Clear();
55
+ options.KnownProxies.Clear();
56
+ });
57
+ app.UseForwardedHeaders(); // 確保第一個註冊
58
+ ```
59
+
60
+ ### 34.3.3.2 設定檔位置
61
+
62
+ | 系統 | 路徑 |
63
+ |------|------|
64
+ | Linux / Mac | `/etc/nginx/conf.d/` |
65
+ | Windows | `nginx 安裝目錄/conf/` |
66
+
67
+ ### 34.3.3.3 HTTP 設定
68
+
69
+ 在 `conf.d` 或 `conf` 目錄新增 `yoursite.com.conf`:
70
+
71
+ ```nginx
72
+ http {
73
+ map $http_connection $connection_upgrade {
74
+ "~*Upgrade" $http_connection;
75
+ default keep-alive;
76
+ }
77
+
78
+ server {
79
+ listen 80;
80
+ listen [::]:80;
81
+ server_name yoursite.com; # 無域名可不寫
82
+
83
+ location / {
84
+ proxy_pass http://localhost:8090;
85
+ proxy_http_version 1.1;
86
+ proxy_set_header Upgrade $http_upgrade;
87
+ proxy_set_header Connection $connection_upgrade;
88
+ proxy_set_header Host $host;
89
+ proxy_cache_bypass $http_upgrade;
90
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
91
+ proxy_set_header X-Forwarded-Proto $scheme;
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### 34.3.3.4 重啟 / 重載設定
98
+
99
+ ```bash
100
+ # Linux / Mac
101
+ sudo systemctl restart nginx
102
+ # 或僅重載設定
103
+ nginx -s reload
104
+
105
+ # Windows(NSSM)
106
+ nssm restart nginx_service
107
+ ```
108
+
109
+ ---
110
+
111
+ ## 34.3.4 HTTPS 設定
112
+
113
+ 推薦使用 [certbot](https://certbot.eff.org/) 產生免費 HTTPS 憑證(支援自動續期)。
114
+
115
+ ```nginx
116
+ http {
117
+ map $http_connection $connection_upgrade {
118
+ "~*Upgrade" $http_connection;
119
+ default keep-alive;
120
+ }
121
+
122
+ # HTTPS
123
+ server {
124
+ listen 443 ssl;
125
+ server_name yoursite.com;
126
+
127
+ ssl_certificate /etc/letsencrypt/live/yoursite.com/fullchain.pem;
128
+ ssl_certificate_key /etc/letsencrypt/live/yoursite.com/privkey.pem;
129
+ ssl_session_cache shared:SSL:1m;
130
+ ssl_session_timeout 5m;
131
+ ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
132
+ ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
133
+ ssl_prefer_server_ciphers on;
134
+
135
+ location / {
136
+ proxy_pass http://localhost:8090;
137
+ proxy_http_version 1.1;
138
+ proxy_set_header Upgrade $http_upgrade;
139
+ proxy_set_header Connection $connection_upgrade;
140
+ proxy_set_header Host $host;
141
+ proxy_cache_bypass $http_upgrade;
142
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
143
+ proxy_set_header X-Forwarded-Proto $scheme;
144
+ }
145
+ }
146
+
147
+ # HTTP → HTTPS 重新導向
148
+ server {
149
+ listen 80;
150
+ listen [::]:80;
151
+ server_name yoursite.com;
152
+ rewrite ^(.*)$ https://$host$1 permanent;
153
+ }
154
+ }
155
+ ```
156
+
157
+ > 重啟 / 重載 Nginx 設定即可生效。
@@ -0,0 +1,112 @@
1
+ # 34.8 Windows Service 部署
2
+
3
+ ---
4
+
5
+ ## 34.8.1 概述
6
+
7
+ Windows Service 是 Windows 作業系統中的後台程序,獨立於使用者登入狀態,系統啟動時自動啟動,不顯示 UI,透過服務控制管理員(SCM)與作業系統互動。
8
+
9
+ ## 34.8.2 關於 NSSM
10
+
11
+ NSSM 可將普通 `.exe` 或 `.bat` 封裝成 Windows 服務執行。
12
+
13
+ - 官網:http://nssm.cc/
14
+ - 下載:nssm-2.24.zip(免安裝)
15
+
16
+ ---
17
+
18
+ ## 34.8.3 發佈網站
19
+
20
+ 1. 選擇啟動專案 → 右鍵 → 發佈 → 發佈到資料夾
21
+ 2. 設定發佈目錄、編輯發佈設定(通常預設即可)
22
+ 3. 點擊發佈
23
+
24
+ ## 34.8.4 設定伺服器 .NET 環境
25
+
26
+ > 若選擇單檔案/獨立發佈模式,可跳過此步驟。
27
+
28
+ 1. 安裝 [.NET Core 執行階段捆綁包](https://dotnet.microsoft.com/download)
29
+ 2. 執行:
30
+
31
+ ```powershell
32
+ net stop was /y
33
+ net start w3svc
34
+ set ASPNETCORE_ENVIRONMENT=Production
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 34.8.5 建立網站服務
40
+
41
+ ### .exe 方式
42
+
43
+ 1. 進入 NSSM 的 `win64` 目錄,開啟 PowerShell:
44
+
45
+ ```powershell
46
+ ./nssm.exe install MyProject
47
+ ```
48
+
49
+ 2. 選擇發佈目錄中的 `.exe` 檔案 → Install service
50
+ 3. 啟動服務:
51
+
52
+ ```powershell
53
+ nssm start MyProject
54
+ ```
55
+
56
+ 4. 開啟 `http://localhost:5000` 存取(預設埠 5000)
57
+
58
+ ### .bat 方式(推薦)
59
+
60
+ 支援透過 `dotnet` 命令啟動,可自由設定埠等參數。
61
+
62
+ 1. 在發佈目錄建立 `MyProject.bat`:
63
+
64
+ ```bat
65
+ pushd "C:\Workspace\TestPublish"
66
+ dotnet Furion.Web.Entry.dll --urls=http://0.0.0.0:8089
67
+ pause
68
+ ```
69
+
70
+ 2. 透過 NSSM 建立服務:
71
+
72
+ ```powershell
73
+ ./nssm.exe install MyProject
74
+ ```
75
+
76
+ 3. 選擇 `MyProject.bat` → Install service
77
+ 4. 啟動服務:
78
+
79
+ ```powershell
80
+ nssm start MyProject
81
+ ```
82
+
83
+ 5. 開啟 `http://localhost:8089` 存取
84
+
85
+ ---
86
+
87
+ ## 34.8.6 刪除服務
88
+
89
+ ```powershell
90
+ nssm stop MyProject
91
+ nssm remove MyProject
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 34.8.7 NSSM 常用命令
97
+
98
+ | 命令 | 說明 |
99
+ |------|------|
100
+ | `nssm install 服務名` | 安裝服務 |
101
+ | `nssm remove 服務名` | 刪除服務 |
102
+ | `nssm remove 服務名 confirm` | 刪除服務(免確認) |
103
+ | `nssm edit 服務名` | 修改服務(顯示介面) |
104
+ | `nssm start 服務名` | 啟動服務 |
105
+ | `nssm stop 服務名` | 停止服務 |
106
+ | `nssm restart 服務名` | 重啟服務 |
107
+
108
+ > 更多命令:https://nssm.cc/commands
109
+
110
+ ## 34.8.8 開啟 Windows Service 管理
111
+
112
+ `Win + R` → 輸入 `services.msc` → Enter。