# 系統架構

瞭解 Netstamp 的控制器、探測器執行階段、資料模型、API 合約產生流程、前端套件、儲存層與背景工作。

Netstamp 由自行託管的控制器與分散式探測器 agent 組成。程式碼儲存庫集中管理可執行服務、API 合約、應用程式、UI 設計系統、說明文件與部署資源。

## 執行階段拓撲

```text
                                  +-----------------------+
Browser / API client -----------> | Controller HTTP :8080 |
                                  | auth, projects, API   |
                                  +-----------+-----------+
                                              |
                                              v
                                  PostgreSQL + TimescaleDB
                                              ^
                                              |
Linux probe agents ---- hello / heartbeat / assignments / result batches
                                              |
                                              +---- alert evaluator
                                              +---- assignment refresh worker
                                              +---- notification outbox worker
```

正式環境映像檔讓控制器從 `/app/web` 提供建置完成的 React 應用程式。瀏覽器路由找不到對應檔案時會回傳 `index.html`；`/api/v1` 仍是 API；`/healthz` 對應 API 健康狀態；`/metrics` 則提供控制器指標。

## 控制器邊界

Go 後端採用模組化單體架構：

- **Transport（傳輸層）**負責 HTTP、驗證、輸入檢查、回應 DTO 與狀態碼對應。
- **Application（應用層）**負責使用案例編排、授權、介面、事件與追蹤。
- **Domain（領域層）**負責穩定的資料模型與專案權限政策。
- **Infrastructure（基礎設施層）**實作 PostgreSQL/sqlc 資料存取層、權杖、密碼雜湊、外部身分服務用戶端與通知傳送。
- **Composition（組合層）**載入設定並組合具體實作。

HTTP handler 不會直接存取資料庫。應用層服務只依賴範圍明確的介面，並負責其功能的行為語意。

## 探測器執行階段

Agent 的排程、背景工作、結果佇列與 HTTP 用戶端各自獨立。它會：

1. 完成驗證並回報執行階段能力；
2. 定期傳送心跳訊號與 IP 版本能力更新；
3. 輪詢目前有效的指派；
4. 將到期工作排入有數量上限的背景工作池（worker pool）；
5. 執行 Ping、TCP、HTTP 或 Traceroute；
6. 暫存結果，並依退避策略重試批次提交。

每個探測器的執行參數都由本機 `NETSTAMP_PROBE_*` 設定控制。控制器只傳送指派，不會下發背景工作或佇列設定。

## 資料儲存

PostgreSQL 儲存身分、工作階段、專案、標籤、探測器、檢查、指派、警示、通知、公開頁面與系統管理設定。TimescaleDB hypertable 與 continuous aggregate 則支援具型別的 Ping、TCP、HTTP、Traceroute 歷史結果，以及依時間範圍調整的查詢。

資料庫遷移使用 Goose SQL 檔案，並在應用程式容器啟動前完成。sqlc 會依查詢檔產生具型別的資料存取程式碼。

## API 合約產生流程

```text
api/*.tsp
   |
   +--> docs/public/openapi.json
   +--> server embedded openapi.json
   +--> web/src/shared/api/openapi.d.ts
   +--> Scalar API explorers
```

TypeSpec 是 API 合約的唯一準據。`pnpm generate:openapi` 會更新所有產生的使用端，因此控制器與說明文件網站發布的合約，會和 Web 用戶端使用的型別保持一致。

## 前端與說明文件

- `web/` 是使用 React 19 與 Vite 的應用程式，包含以專案為範圍的路由，並以 TanStack Query 管理伺服器狀態。
- `packages/ui/` 負責共用元件與 `--ns-*` 設計權杖。
- `docs/` 是靜態 Astro 網站，會發布產品說明文件、OpenAPI 瀏覽器與建置完成的 Storybook。

Web 與 Docs 都使用共用 UI 套件。說明文件內容存放在 Astro 內容集合，讓導覽、搜尋、頁面順序、編輯連結、網站地圖與上一頁／下一頁連結都能從 frontmatter 產生。

## 驗證層面

瀏覽器使用者透過伺服器端工作階段驗證；個人 API 權杖具有權限範圍，並同時受到目前專案權限限制，驗證格式為 `Bearer nst_pat_...`；探測器 agent 則使用 `Authorization: Probe ...`。這三種憑證刻意設計成不能互換。

目前的 Netstamp 架構沒有 GraphQL API、外部訊息佇列、物件儲存相依服務，也沒有 DNS 專用的探測器執行器。
