# DataCenter Service
## 目錄
[TOC]
# Service 建立與管理
## 開發環境及管理工具
* 使用 [Visual Studio Code](https://code.visualstudio.com/) 作為 Linux 開發環境
* 安裝 [.Net Core SDK 3.1](https://dotnet.microsoft.com/download)
* 安裝 [C# extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
* 使用 [PostgreSQL](https://www.postgresql.org/) 作為 Database 工具
* 使用 [pgAdmin](https://www.pgadmin.org/) 作為 Database 圖形介面
* 使用 [X2Go](https://wiki.x2go.org/doku.php) 作為遠端桌面工具
* 使用 [FileZilla](https://filezilla-project.org/) 進行遠端程式碼及設定檔更新
## Linux Systemd 建立方式
### 建立程式
1. 開啟 VS Code 命令列輸入 <code>dotnet new worker</code>
2. 加入套件 <code>Microsoft.Extensions.Hosting.Systemd</code>
3. 增加 <code>UseSystemd()</code> 到 <code>Program.cs</code> 的 <code>CreateHostBuilder</code> 中
```gherkin=
Host.CreateDefaultBuilder(args)
.UseSystemd()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
```
*以上程式碼中的 CreateDefaultBuilder 即為程式進入點
簡易 Worker.cs 程式:
```gherkin=
public class Worker : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
// do something
await Task.Delay(1000, stoppingToken);
}
}
}
```
### 建立 Service
1. 發佈專案,可自行指定路徑 (以下以檔案傳輸 Service 為例)
```=shell
sudo dotnet publish -o /usr/sbin/dcDataTransferService
```
2. 建立 .service 檔
在 <code>/etc/systemd/system</code> 目錄下提供一個 <code>dcDataTransfer.service</code> 檔做配置 service 之用
```gherkin=
[Unit]
Description=Data Center DataTransfer Service
[Service]
WorkingDirectory=/home/SSD1TB/IAIoT-DataCenter/Config #設定檔路徑
Type=notify
ExecStart=/usr/sbin/dcDataTransferService/DataTransferService
TimeoutSec=300
TimeoutStopSec=90
[Install]
WantedBy=multi-user.target
```
3. 重載服務
```=shell
sudo systemctl daemon-reload
```
4. 啟用 Service
```=shell
sudo systemctl enable dcDataTransfer.service
```
5. 執行 Service
```=shell
sudo systemctl start dcDataTransfer.service
```
6. 查看 Service 狀態
```=shell
sudo systemctl status dcDataTransfer.service
```
7. 啟用後重開機時 service 也會自動開啟,如需停用需移除 <code>dcDataTransfer.service</code> 檔案
# DataCenter Service 說明
## DataTransfer Service
### Service 目的
1. 檢測結果資料透過 SFTP 傳送至 Data Center
2. 機台狀態 log 檔案傳輸 (最終目標是做出 Digital Twin, log檔格式需先統一定義)
### 相關 Database Table
* DetectionResult
### 啟動 Service
修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcDataTransfer.service</code>
* 開啟 <code>sudo systemctl start dcDataTransfer.service</code>
### 設定檔說明
設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/DataCenterConfig.json</code>
```gherkin=
{
"DatabaseName": "SpindleDataCenter-GVL",
"FilePath": "/home/SSD1TB/IAIoT-DataCenter",
"LimitedHardDriveName" = "/home/SSD1TB",
"LimitedHardDriveSpaceGB" = 100.0,
"MachineConfig": [
{
"ID": "NOGV0A1000",
"Address": "10.68.200.1",
"Username": "datacenter",
"Password": "0ycVpzC3HEc0rb041o+jUXYc1O26n3NjnAw9VAU3TIzo22roXLbUFGPDvCBjwAuChA7pN3NPZLF0vJdITXJxf2j2RU0/BLHgwuVmNL1emLE=",
"EnableDataTransfer": true,
"EnableDataDelete": true,
"DataTransferTime": [
{ "Start": "22:00", "Stop": "08:00" },
{ "Start": "12:00", "Stop": "13:00" }
]
},
{
"ID": "NOGV0A1001",
"Address": "10.68.200.2",
"Username": "datacenter",
"Password": "0ycVpzC3HEc0rb041o+jUXYc1O26n3NjnAw9VAU3TIzo22roXLbUFGPDvCBjwAuChA7pN3NPZLF0vJdITXJxf2j2RU0/BLHgwuVmNL1emLE=",
"EnableDataTransfer": true,
"EnableDataDelete": true,
"DataTransferTime": [
{ "Start": "22:00", "Stop": "08:00" },
{ "Start": "12:00", "Stop": "13:00" }
]
}
]
}
```
* DatabaseName - DC 端資料庫名稱
* FilePath - DC 端檔案儲存根目錄
* LimitedHardDriveName - DC 儲存資料裝置名稱,空間不足時停止資料傳輸
* LimitedHardDriveSpaceGB - DC 儲存資料空間限制
* MachineConfig - 以陣列方式儲存,可根據機台配置新增/刪除
* ID - 機台對應名稱
* Address - 機台 IP 位置
* Username - 機台登入帳號,需有管理者權限
* Password - 機台登入密碼
* EnableDataTransfer - 開啟/關閉檔案傳輸功能
* EnableDataDelete - 開啟/關閉檔案刪除功能。開啟時,機台端檔案將在傳送至DC端後刪除
* DataTransferTime - 資料傳輸限定時間, 需為固定格式 "HH:mm"
## LabelProject Service
### Service 目的
1. 產生 LabelProject
2. 監控標定狀態
3. 上傳標定專案及標定圖檔 ([參考連結](https://hackmd.io/@1Howr5YGR5WJmeFl-gN0uw/S1jKkpcpv))
### 相關 Database Table
* LabelProject
* LabelProjectTask
* DetectionResult
* Machine
### 啟動 Service
修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcLabelProject.service</code>
* 開啟 <code>sudo systemctl start dcLabelProject.service</code>
### 設定檔說明
設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/LabelProject.json</code>
```gherkin=
[
{
"ModelName": "C8C80",
"ConfigXML": "/home/HHD10TB1/IAIoT-DataCenter/Config/C8C80.xml",
"Address": "10.68.161.31",
"Username": "nvidia",
"Password": "Cs0TYZD9Vp60XbHn6GuG+7u3GWncsFv9ZlGQEz2Tv6Y38Vq3ZOnBElNEk3E0Ke73TX7P3EcEHVHa+luwGiPvpKZgQ6rrERKZKfWrcOOmMLU=",
"UploadFilePath": "/media/nvidia/HDD1T/RemoteData",
"StartTime": "2020-12-29 00:00:00"
},
{
"ModelName": "C9C78",
"ConfigXML": "/home/HHD10TB1/IAIoT-DataCenter/Config/C9C78.xml",
"Address": "10.68.161.31",
"Username": "nvidia",
"Password": "Cs0TYZD9Vp60XbHn6GuG+7u3GWncsFv9ZlGQEz2Tv6Y38Vq3ZOnBElNEk3E0Ke73TX7P3EcEHVHa+luwGiPvpKZgQ6rrERKZKfWrcOOmMLU=",
"UploadFilePath": "/media/nvidia/HDD1T/RemoteData",
"StartTime": "2020-12-29 15:46:00"
}
]
```
* ModelName - 機台型號
* ConfigXML - AI Team 定義 Label-Studio 相關設定檔位置
* Address - 上傳裝置 IP
* Username - 上傳裝置使用者名稱
* Password - 上傳裝置密碼 (加密後結果)
* ID - 機台對應名稱
* UploadFilePath - 上傳資料夾位置
* StartTime - 標定資料開始收集時間
## Report Service
### Service 目的
1. 產生 Daily Report PDF 檔案
2. 產生 Region 對應 Excel 檔案
3. 將 PDF 及 Excel 檔案以 Email 方式寄出
### 相關 Database Table
* DetectionResult
* DetectionResultObject
* ProcessReport
* Network
* Machine
### 啟動 Service
修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcReport.service</code>
* 開啟 <code>sudo systemctl start dcReport.service</code>
### 設定檔說明
設定檔位置 <code>/home/SSD1TB/IAIoT-DataCenter/Config/ReportConfig.json</code>
```gherkin=
{
"DayDelta": -1,
"ReportCreateTimeStart": 7,
"ReportCreateTimeStop": 9,
"MailToList": [
"py.yang@getac.com.tw",
"woody.lin@getac.com.tw",
"frank.cw.chen@getac.com.tw",
"mike.lc.lai@getac.com.tw",
"ken.liang@getac.com.tw",
"denver.tan@getac.com.tw"
],
"MailCCList": [
"ky.tsai@getac.com.tw",
"ivy.cheng@getac.com.tw"
]
}
```
* DayDelta - 產生第幾天的資料,e.g. -1 指產生昨天的資料
* ReportCreateTimeStart - 開始產生資料時間
* ReportCreateTimeStop - 停止產生資料時間,只在開始與停止中間產生一次
* MailToList - 收件者 Email 名單
* MailCCList - 副本 Email 名單
## Message Service
### Service 目的
1. 定期檢查 DataCenter 與機台間網路狀況並寫入 Database 供 ReportService 產生報表使用
### 啟動 Service
修改設定後需關閉並重新啟動 Service
* 關閉 <code>sudo systemctl stop dcMessage.service</code>
* 開啟 <code>sudo systemctl start dcMessage.service</code>