@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.
- package/dist/index.js +83 -88
- package/knowledge/Furion_Teaching_Manual/04-1-/351/205/215/347/275/256.md +442 -0
- package/knowledge/Furion_Teaching_Manual/04-2-/351/201/270/351/240/205.md +363 -0
- package/knowledge/Furion_Teaching_Manual/05-1-/345/213/225/346/205/213WebAPI.md +825 -0
- package/knowledge/Furion_Teaching_Manual/05-2-HttpContext.md +217 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/05-5-/344/270/255/344/273/213/350/273/237/351/253/224Middleware.md +328 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/06-2/347/254/254/344/270/211/346/226/271API_Scalar.md +91 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/10-1-SqlSugar/346/225/264/345/220/210.md +336 -0
- 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
- package/knowledge/Furion_Teaching_Manual/12-furion-dependency-injection.md +408 -0
- 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
- package/knowledge/Furion_Teaching_Manual/14-/345/210/206/345/270/203/345/274/217/347/274/223/345/255/230.md +311 -0
- package/knowledge/Furion_Teaching_Manual/15-/345/256/211/345/205/250/351/211/264/346/235/203.md +832 -0
- 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
- package/knowledge/Furion_Teaching_Manual/18-/346/227/245/350/252/214/350/250/230/351/214/204.md +639 -0
- 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
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/20-/350/263/207/346/226/231/345/212/240/350/247/243/345/257/206.md +286 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/22-/344/272/213/344/273/266/345/214/257/346/265/201/346/216/222EventBus.md +448 -0
- package/knowledge/Furion_Teaching_Manual/23-JSON/345/272/217/345/210/227/345/214/226.md +340 -0
- package/knowledge/Furion_Teaching_Manual/24-/345/215/263/346/231/202/351/200/232/350/250/212SignalR.md +247 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/26-2-Cron/350/241/250/351/201/224/345/274/217.md +203 -0
- package/knowledge/Furion_Teaching_Manual/26-3-/344/273/273/345/213/231/344/275/207/345/210/227TaskQueue.md +215 -0
- package/knowledge/Furion_Teaching_Manual/27-/345/210/206/346/225/243/345/274/217ID/347/224/237/346/210/220.md +86 -0
- package/knowledge/Furion_Teaching_Manual/28-/346/250/241/347/265/204/345/214/226/351/226/213/347/231/274.md +68 -0
- package/knowledge/Furion_Teaching_Manual/29-/346/265/201/350/256/212/347/211/251/344/273/266Clay.md +313 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md +98 -0
- package/knowledge/Furion_Teaching_Manual/34-2-Docker/351/203/250/347/275/262.md +313 -0
- package/knowledge/Furion_Teaching_Manual/34-3-Nginx/351/203/250/347/275/262.md +157 -0
- package/knowledge/Furion_Teaching_Manual/34-8-WindowsService/351/203/250/347/275/262.md +112 -0
- 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
- 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
- package/knowledge/Furion_Teaching_Manual/36-3-/345/237/272/346/272/226/346/270/254/350/251/246Benchmarking.md +80 -0
- package/knowledge/attributes.md +153 -0
- package/knowledge/config.md +147 -0
- package/knowledge/entity.md +115 -0
- package/knowledge/event.md +124 -0
- package/knowledge/plugin.md +136 -0
- package/knowledge/service.md +146 -0
- package/knowledge/sqlsugar.md +172 -0
- package/knowledge/vue-typescript.md +338 -0
- package/package.json +3 -2
package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md
ADDED
|
@@ -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。
|