# Harbor Desk 部署（apps/ 主線）

本目錄給 **新後端 `apps/backend` + 前端 `apps/web`** 的本機／dev 一鍵部署。  
（`old/deploy` 為舊系統封存，不要混用。）

## 架構

```text
瀏覽器 → nginx:80（可選）
           ├─ /              → Vite :5173
           ├─ /api/          → gateway :8888
           └─ /haixun-assets/→ MinIO :9000

宿主：gateway + vite
Docker：mongo / redis / minio / mailpit（只綁 127.0.0.1）
```

## 快速開始（全部清乾淨重裝）

```bash
cd /path/to/thread-master

# 1) env（首次）
cp deploy/.env.example deploy/.env.dev
# 編輯密鑰：MONGO_ROOT_PASSWORD、REDIS_PASSWORD、MINIO_ROOT_PASSWORD、JWT…
# 並同步 MONGO_URI / MONGO_URL / HAIXUN_STORAGE_S3_SECRET_KEY 內的密碼

# 2) 一鍵：清資料 + infra + migrate + build + start
./deploy/scripts/redeploy.sh --yes --kill-orphan

# 3)（建議）nginx 轉發 — 需要 sudo
./deploy/scripts/install-nginx.sh
```

只重裝 app、**保留**資料庫：

```bash
./deploy/scripts/redeploy.sh --yes --keep-data
```

## 日常開發：只重啟 app（推薦）

不動 Mongo/Redis/MinIO、不 wipe、不 migrate——只重編並重開 **gateway + worker + web**：

```bash
make -C deploy restart
# 等同
./deploy/scripts/restart.sh
```

看現在跑了什麼：

```bash
make -C deploy status
```

## 指令一覽

| 腳本 | 說明 |
|------|------|
| `scripts/restart.sh` | **日常**：build + 重開 gateway/worker/web（保留資料） |
| `scripts/redeploy.sh --yes` | 完整重部署（預設刪 volume） |
| `scripts/wipe.sh --yes` | 停 app + 刪 infra volumes |
| `scripts/up-infra.sh` | 起 Mongo/Redis/MinIO/Mailpit |
| `scripts/migrate.sh` | `golang-migrate` up + seed |
| `scripts/build.sh` | 編譯 gateway/worker、確保 web 依賴 |
| `scripts/start.sh` | 背景啟動 gateway + worker + vite |
| `scripts/stop.sh` | 停 gateway + worker + vite |
| `scripts/status.sh` | 埠／pid／健康檢查 |
| `scripts/install-nginx.sh` | 安裝 `deploy/nginx/haixun-dev.conf` |

或用 Makefile：

```bash
make -C deploy restart      # ★ 開發時重開 backend/web/worker
make -C deploy status
make -C deploy stop
make -C deploy env          # 從 example 複製 .env.dev（若不存在）
make -C deploy redeploy     # = redeploy.sh --yes --kill-orphan（清資料）
```

## 環境變數

- 範本：`deploy/.env.example`
- 實檔：`deploy/.env.dev`（**勿 commit**，已在 `.gitignore`）
- 亦可 `ENV_FILE=/path/to/env ./deploy/scripts/start.sh`

重要鍵：

| 鍵 | 用途 |
|----|------|
| `MONGO_URI` / `MONGO_URL` | gateway / migrate（URL 需含 DB 名） |
| `REDIS_PASSWORD` | monc 快取 |
| `HAIXUN_STORAGE_S3_*` | MinIO 上傳與 `PublicBaseURL` |
| `AUTH_*` / `HAIXUN_JWT_*` | JWT |
| `REDIS_NAMESPACE` | Redis 環境隔離前綴 |
| `AI_MODEL_CACHE_FINGERPRINT_SECRET` | AI model cache credential HMAC |
| `MEMBER_SETTINGS_ENCRYPTION_KEY_ID` / `MEMBER_SETTINGS_ENCRYPTION_KEY` | BYOK AES-256-GCM |
| `STRIPE_ENABLED` / `STRIPE_SECRET_KEY` / `STRIPE_WEBHOOK_SECRET` | Stripe subscription billing; disabled is startup-safe |
| `STRIPE_STARTER_PRICE_ID` / `STRIPE_PRO_PRICE_ID` | Trusted recurring Price IDs mapped by the server |
| `STRIPE_SUCCESS_URL` / `STRIPE_CANCEL_URL` / `STRIPE_PORTAL_RETURN_URL` | Trusted Checkout and portal redirects |
| `PUBLIC_WEB_BASE` | 重設信連結、郵件 logo |

## 首次管理員

Migration 不建立預設管理員，也不包含固定帳密。首次部署請設定 runtime secret 後執行：

```bash
make -C apps/backend seeder
```

## 埠與 URL

| 服務 | 位址 |
|------|------|
| Web | http://127.0.0.1:5173 |
| API | http://127.0.0.1:8888/api/v1/ping |
| Mailpit | http://127.0.0.1:8025 |
| MinIO Console | http://127.0.0.1:9001（ROOT user/pass） |
| 公開（CF/nginx） | https://threads-tool.30cm.net |

頭像公開路徑：`{HAIXUN_STORAGE_S3_PUBLIC_BASE_URL}/avatar/{uid}/{uuid}.jpg`  
未裝 nginx 時，Vite 已 proxy `/haixun-assets` → MinIO。

## 日誌與 PID

```text
deploy/run/gateway.log
deploy/run/web.log
deploy/run/gateway.pid
deploy/run/web.pid
```

## 注意

1. **wipe / redeploy 預設刪 Mongo・Redis・MinIO 全部資料**，務必 `--yes`。  
2. docker 權限：使用者需在 `docker` 群組，或用 root。  
3. `migrate` 首次會 `go install -tags mongodb …`。  
4. 舊系統 worker（`old/`）不會自動起；`--kill-orphan` 可清殘留 process。  
5. 正式 prod 映像部署仍可參考 `old/deploy/`；本目錄以 **原生 binary + compose infra** 為主。
