900 lines
43 KiB
Markdown
900 lines
43 KiB
Markdown
# AWOOOI 16-Agent 全景使用率盤點(V3 完整版)
|
||
|
||
> **產出**:2026-05-08(覆蓋 V1 草稿 + 主機 SSH 實機結果)
|
||
> **範圍**:12 路 codebase agent + 4 路主機 SSH agent = **16 路並行盤點**
|
||
> **主機覆蓋**:9 台全連(110 / 120 / 121 / 188 / 111 MacBook / 112 Kali / 168 Mac mini / GCP-A / GCP-B)
|
||
> **本份特色**:與 5/8 FINAL 規模/技術債盤點互補,**聚焦「實際使用率」**
|
||
> **統一格式**:每路結尾必有「✅ 活躍 / 🔴 閒置 / 💡 可優化」三段
|
||
> **派遣**:onboarder ×3 + critic ×6 + frontend-designer + db-expert + tool-expert + debugger ×2 + 4 路主機 SSH
|
||
|
||
---
|
||
|
||
## Part A — 16 路盤點摘要表
|
||
|
||
| 路 | 範圍 | Agent 類型 | 三段式重點 |
|
||
|---|---|---|---|
|
||
| 1 | 後端 services/(163 模組)| onboarder | 11 個全域 0-import 孤兒 = **3,245 行死代碼** |
|
||
| 2 | 前端 70 個 page.tsx | frontend-designer | **38/70 是純殼/redirect/假資料**(54%)|
|
||
| 3 | DB(PG 55-60 表 + Redis + ClickHouse)| db-expert | AwoooP 16 model 中 9 個 schema-only / 50 migration 中 35 個無 rollback |
|
||
| 4 | MCP / Skills / Subagent | tool-expert | **12 個 plugin 0 呼叫吃 context** |
|
||
| 5 | 告警 314 條 / 162 alertname | debugger | 120 個 fall through "custom" / 80 條重複定義 |
|
||
| 6 | dead code / TODO / _archived | critic | 6 檔 ~2,000 行可立刻 git rm |
|
||
| 7 | K8s workloads | critic | drift-cronjob 不在 kustomization → ArgoCD 永遠不 sync |
|
||
| 8 | CI/CD 8 Gitea + 6 GitHub | critic | **GitHub 6 全殭屍但仍會觸發** + Sentry DSN 寫死 |
|
||
| 9 | 套件依賴 | critic | LiteLLM CVE-2026-42208 未驗 + 8 個前端死依賴 |
|
||
| 10 | AI Provider 呼叫分布 | debugger | **GCP-B 24h 僅 375 次** + 9 處 fusion 權重 hardcode |
|
||
| 11 | 外部服務使用度 | onboarder | LiteLLM/Open-WebUI/n8n 三閒置 + Sentry MCP token=CHANGE_ME |
|
||
| 12 | 文件 / spec / Memory | critic | 18 spec 未閉環 + 11 ADR 缺 rollback |
|
||
| **13** | **110 + 120 + 121 SSH** | onboarder | **110 Swap 93% 即將 OOM** |
|
||
| **14** | **188 SPOF SSH** | onboarder | **awoooi_prod RLS 0 policy** + certbot failed |
|
||
| **15** | **GCP-A + GCP-B + 111 SSH** | onboarder | GCP-B ollama ps 為空 / 111 load 13.51 過載 |
|
||
| **16** | **168 + 112 SSH** | onboarder | **168 9 SkyComputerUseClient + 6 bun 殘進程** + Kali scan 結果全孤島 |
|
||
|
||
---
|
||
|
||
## Part B — 12 路 Codebase 盤點
|
||
|
||
### 第 1 路:後端 services/ 使用率
|
||
|
||
#### ✅ 活躍核心(>10 caller)
|
||
| 模組 | caller 數 | 角色 |
|
||
|---|---|---|
|
||
| `telegram_gateway` | 11 | 告警/審核出口(**6,426 行 — 待拆**) |
|
||
| `openclaw` | 10 | 主決策大腦(2,711 行) |
|
||
| `services/trust_engine` | 4 | TrustScoreManager 業務層 |
|
||
|
||
低頻 1-3 caller:playbook_service / platform_operator_service / auto_repair_service / stats_service / rag_service / learning_service / flywheel_stats_service / decision_manager / agent_orchestrator / governance_agent / governance_dispatcher / km_writer / runbook_generator / playbook_generator
|
||
|
||
#### 🔴 完全孤兒(apps/api/src/ 全域 0 import — **3,245 行死代碼**)
|
||
1. `trust_drift_detector.py` (258 行)
|
||
2. `token_counter.py` (675 行) — 已被 ai_router 吸收
|
||
3. `test_context_gatherer.py` (243 行)
|
||
4. `ssh_command_whitelist.py` (121 行)
|
||
5. `schema_validator.py` (262 行)
|
||
6. `rule_to_playbook_migrator.py` (417 行) — one-shot 遷移工具
|
||
7. `provider_proxy.py` (240 行) — ADR-052 取代
|
||
8. `preflight_service.py` (116 行)
|
||
9. `github_api_service.py` (117 行) — Gitea 主倉後廢棄
|
||
10. `channel_hub.py` (418 行) — 被 telegram_gateway 取代
|
||
11. `budget_service.py` (378 行)
|
||
|
||
重複實作確認:
|
||
- Ollama 四件套(health_monitor/failover_manager/auto_recovery/endpoint_resolver)— **保留全部**(ADR-110 三層容災)
|
||
- decision_fusion vs adapter — 保留兩者(演算法 vs 轉接層)
|
||
- Trust Engine 雙份(core vs services)— 保留兩者(低層工具 vs 業務層)
|
||
- playbook_generator vs runbook_generator — 保留兩者(職責不同)
|
||
- governance 三元組 — 保留全部(巡邏 + 派工 + 查詢)
|
||
|
||
#### 💡 可優化
|
||
1. **一輪 git rm 清掉 11 個孤兒** → -3,245 行
|
||
2. 拆 `telegram_gateway` 6,426 行為 4 檔(落地 ADR-109)
|
||
3. 拆 `decision_manager` 3,531 行(Tier 3 紅區,需架構師授權)
|
||
4. `ai_router.py` 1,407 行只被 2 處呼叫,拆 `ai_router_core` + `ai_executor`
|
||
5. `ollama_endpoint_resolver` 統一下沉到 ai_router(5 個 service 各自呼叫)
|
||
|
||
---
|
||
|
||
### 第 2 路:前端 70 個 page.tsx
|
||
|
||
#### ✅ 真實接 API 且有商業價值(25 頁,36%)
|
||
`/alerts`、`/repairs`、`/tickets/*`、`/knowledge/*`、`/deployments`、`/apps`、`/services`、`/security`、`/users`、`/team`、`/notifications`、`/settings`、`/reports`、`/activity`、`/billing`、`/awooop/{tenants,runs,approvals,contracts}`、`/cost/{summary,budgets,accounts,recommendations}`、`/compliance`、`/compliance/reports`、`/auth/sso/callback`
|
||
|
||
#### 🟡 半成品(7 頁,10%)
|
||
1. `/monitoring/MonitoringContent.tsx` — Uptime + Resources tab 全 `Math.random()`(行 87, 113)
|
||
2. `/security/page.tsx:699` — `handleScan` fallback 用 `Math.floor(Math.random() * 5) + 1` 偽造漏洞數
|
||
3. `/status/page.tsx:62-88` — API 斷線時 fallback 顯示 2 月份硬編碼 INC-20260215-001
|
||
4. `/compliance/evidence/page.tsx:46` — `mockEvidence` 6 筆寫死
|
||
5. `/compliance/reports/page.tsx:52` — `mockReports` 3 筆寫死
|
||
6. `/cost/recommendations/page.tsx:27,486,491` — `mockRecommendations` 寫死
|
||
7. `/apm/page.tsx:24` — 硬編碼 `192.168.0.188:3301`(**違反前端內網 IP 禁令**)
|
||
|
||
#### 🔴 純殼 / 行銷靜態頁(38 頁,54%)
|
||
- **行銷 19 頁**:`/`、`/about`、`/features`、`/pricing`、`/integrations`、`/blog`(POSTS 寫死 8 篇)、`/changelog`、`/faq`、`/careers`、`/case-studies`、`/partners`、`/solutions`、`/help`、`/privacy`、`/terms`、`/docs`、`/docs/api`
|
||
- **死表單 1 頁**:`/contact`(form 無 onSubmit)
|
||
- **Redirect 殼 8 頁**:`/login`、`/register`、`/reset-password` 全跳 `/dashboard`、`/monitor`、`/deploy`、`/settings/notifications`、`/awooop`
|
||
- **錯誤頁 5 頁**:`/429`、`/502`、`/503`、`/bad-gateway`、`/rate-limited`
|
||
|
||
#### ⚙️ 鐵律違規統計
|
||
- **i18n(useTranslations)**:**0 / 70(100% 違規)** — 全站零 next-intl
|
||
- **Emoji 渲染於 JSX**:2 處(`dashboard:38` + `monitoring:33`)
|
||
- **console.log 殘留**:30 處 / 11 檔
|
||
- **as any 殘留**:3 處(`tickets/[id]:189,190` + `knowledge/new:33`)
|
||
- **內網 IP 硬編碼**:1 處(`apm:24`)
|
||
|
||
#### 💡 可優化(P0 五個)
|
||
1. /monitoring + /apm + /security + /status 4 頁假資料替換為真 API
|
||
2. /contact form submit 接 `/api/v1/contact`
|
||
3. 38 頁純殼決策:保留行銷主頁,刪冗餘 redirect 殼
|
||
4. 全站 next-intl 改造(i18n 零容忍鐵律)
|
||
5. apm/page.tsx 改用 `NEXT_PUBLIC_SIGNOZ_URL` 公網域名
|
||
|
||
---
|
||
|
||
### 第 3 路:資料庫(PG + Redis + ClickHouse)
|
||
|
||
#### ✅ 高頻熱表(>10 處讀寫)
|
||
| 表名 | 寫 | 讀 | 用途 |
|
||
|---|---|---|---|
|
||
| `incidents` | 13 | 59 | 事件主表(已加 RLS) |
|
||
| `approval_records` | 14 | 52 | 審批單(fingerprint dedup) |
|
||
| `knowledge_entries` | 18 | 26 | KM 雙路徑(A 結案 + B 戰鬥日誌) |
|
||
| `automation_operation_log` | 19 | - | 自動化操作日誌(SQL-only) |
|
||
| `alert_rule_catalog` | 19 | - | 規則目錄 |
|
||
| `auto_repair_executions` | 5 | 18 | 自動修復記錄 |
|
||
| `asset_inventory/coverage_snapshot` | 33 | - | 資產治理 |
|
||
| `incident_evidence` | 2 | 14 | 事件證據鏈 |
|
||
| `playbooks` | 11 | 12 | Playbook 主表 |
|
||
| `governance_remediation_dispatch` | 5 | 10 | AI 治理派工 |
|
||
|
||
低頻 1-3 處:timeline_events、mcp_audit_log、mcp_daily_stats、asset_change_event、drift_reports、rag_chunks、aider_events、AwoooPContractRevision、AwoooPRunState
|
||
|
||
#### 🔴 殭屍表(schema 存在但 0 query 或 0 write)
|
||
|
||
**AwoooP 16 表中 9 個(56%)完全沒有應用層消費**:
|
||
- `AwoooPContractOutbox` / `ChannelEventDedupe` / `PlatformSubject` / `ProjectMigrationState` / `RunStepJournal` / `McpCredentialRef` / `McpGatewayAudit` / `ConversationEvent` / `OutboundMessage`
|
||
|
||
其他殭屍:
|
||
- `k8s_state_snapshots`(0 query,write-only log)
|
||
- `prometheus_snapshots`(0 query)
|
||
- `log_clusters`(0 SQL,0 query)
|
||
- `dynamic_baselines`(0 SQL)
|
||
- `trust_records`(0 SQL)
|
||
- `ai_provider_version_history`(0 SQL)
|
||
- `budget_ledger`(0 query)
|
||
|
||
**Migration 死債:50 個中 35 個無 rollback(70%)**
|
||
高破壞力且無 rollback:
|
||
1. `phase28_rag_pgvector.sql`(pgvector 擴充)
|
||
2. `embedding_bge_m3_1024.sql`(768→1024 不可逆)
|
||
3. `fix_playbooks_array_to_jsonb.sql`(型別轉換)
|
||
4. `awooop_phase5_mcp_gateway_2026-05-04.sql`(4 張 MCP 表)
|
||
5. `cleanup_duplicate_deprecated_playbooks.sql`(DELETE 操作)
|
||
|
||
**Redis namespace 散亂(12 種前綴並存)**:
|
||
`awoooi:`(14) > `stats:`(10) > `aiops:`(8) > `incident:`/`playbook:`/`anomaly:`/`alert:`(各 6) > `telegram:`/`learning:`(各 5)
|
||
|
||
**N+1 確認**:
|
||
- `learning_service.py:827` — for alert_name in alert_names 每輪 UPDATE
|
||
- `incident_service.py:610` — scan_iter 後逐個 redis.get(應改 MGET)
|
||
|
||
#### 💡 可優化
|
||
1. 11 張殭屍表(含 AwoooP 9 張)標 deprecation header + 60 天觀察後 drop
|
||
2. 補 35 個 migration rollback SQL
|
||
3. N+1 兩處立即修
|
||
4. Redis namespace 強制 `awoooi:<domain>:<key>` 三段式 ADR
|
||
5. 確認 awooop RLS migration prod 已執行(**14 路 SSH 已驗證 = pg_policy 0 rows,未執行!**)
|
||
|
||
---
|
||
|
||
### 第 4 路:MCP / Skills / Subagent
|
||
|
||
#### ✅ 高頻 MCP(>500 次呼叫)
|
||
| 工具 | 次數 | 用途 |
|
||
|---|---|---|
|
||
| `playwright.browser_navigate` | 1,409 | UI 驗證/部署後截圖 |
|
||
| `playwright.browser_take_screenshot` | 1,167 | 頁面截圖確認 |
|
||
| `playwright.browser_snapshot` | 878 | DOM 快照 |
|
||
| `playwright.browser_evaluate` | 840 | JS 執行 |
|
||
| `playwright.browser_click` | 780 | 點擊操作 |
|
||
| `figma.generate_figma_design` | 766 | 設計稿生成 |
|
||
| `context7.resolve-library-id` | 714 | 函式庫 ID 解析 |
|
||
| `context7.query-docs` | 685 | 官方文件查詢 |
|
||
| `telegram.reply` | 690 | Telegram 回覆 |
|
||
| `sentry.search_issues` | 638 | Sentry 告警查詢 |
|
||
| `sentry.search_events` | 635 | Sentry 事件搜尋 |
|
||
|
||
#### ✅ 高頻 Skill(9 個全部有用)
|
||
最高頻:`02-lewooogo-backend-core`(558) / `04-awoooi-devops-commander`(366) / `03-openclaw-cognitive-expert`(361) / `01-frontend-aesthetics`(227) / `05-sre-qa`(207)
|
||
|
||
#### ✅ Subagent 使用率(自製 12 人團隊全有用)
|
||
fullstack-engineer(105) > critic(56) > debugger(41) > db-expert(21) > web-researcher(20) > tool-expert(15) > onboarder(15) > planner(13) > frontend-designer(12) > refactor-specialist(8) > migration-engineer(8) > vuln-verifier(7)
|
||
|
||
#### 🔴 0 呼叫的 plugin(**12 個全在 ~/.claude/settings.json 啟用,吃 context 但 0 用途**)
|
||
- `code-review` / `claude-md-management` / `claude-code-setup` / `superpowers` / `code-simplifier` / `ralph-loop` / `pr-review-toolkit` / `plugin-dev` / `skill-creator` / `agent-sdk-dev` / `feature-dev` / `typescript-lsp` / `linear`(僅 1 次 authenticate)
|
||
|
||
#### ⚙️ 重疊問題
|
||
- 自製 `critic`(56) vs plugin code-reviewer:`superpowers:code-reviewer`(54) + `feature-dev:code-reviewer`(45) + `pr-review-toolkit:code-reviewer`(3) = 102 次 → **兩套並存可能結果不一致**
|
||
- ArgoCDProvider 與 SentryProvider 已 register 但 incident_service 未直接呼叫,純 gateway registry 被動路由
|
||
|
||
#### 💡 可優化
|
||
1. ~/.claude/settings.json 停用 12 個空轉 plugin(保留 playwright/figma/context7/telegram/sentry)
|
||
2. 統一審查路徑:自製 critic 為主,停 plugin code-reviewer 副本
|
||
3. ArgoCDProvider 加入 incident 主動診斷路徑
|
||
|
||
---
|
||
|
||
### 第 5 路:告警鏈路(306 條規則 / 162 唯一 alertname)
|
||
|
||
#### ✅ 高頻告警(推斷 30d >10 次)
|
||
`FlywheelExecutionRateMissing` / `DockerContainerUnhealthy` / `ColdStartRecoveryBlocked` / `BackupRestoreTestStale` / `HostBackupFailed` / `K3sNodeNotReady` / `KubePodCrashLooping`
|
||
|
||
#### 🟡 中頻
|
||
`PostgreSQLSlowQueries` / `RedisMemoryHigh` / `HostHighCpuLoad` / `GiteaMemoryPressure` / `SentryClickHouseMemoryPressure` / `TLSCertExpiringIn30Days` / `MoWoooWorkDown` / `CadvisorCPUThrottled` / `AITokenCostSpike` / `PermanentFixRequired`
|
||
|
||
#### 🔴 死告警(從未觸發 / 應改 info-only)
|
||
- `NvidiaCircuitBreaker{HalfOpen,Closed}` — 狀態轉換通知
|
||
- `Backup{ExpectedJobMissing,ScriptMissing,CredentialEscrow}` — governance 永 0
|
||
- `Host{110,188}StorageHealthMonitorMissing` — cold-start 才觸發
|
||
- `K3sVIPDown` — chicken-and-egg(VIP 掛時 Alertmanager 自己也送不出)
|
||
- `E2E_*` / `FPTest*` — 測試假告警,應從 prod 移除
|
||
|
||
#### 🔴 散戶告警(**120 個 alertname 不在 ALERTNAME_TO_TYPE**)
|
||
最痛 12 個無 symptom_pattern:
|
||
- `ColdStart*`(5 個,落 "custom")
|
||
- `FrequentAnomalyEscalation`(**AI 自主化核心信號 0 分類**)
|
||
- `ArgoCDSyncFailed`(缺 deployment_failure 對應)
|
||
- `MomoScraperSuccessLow`(business KPI 沒路徑)
|
||
- `Cadvisor*` / `NodeExporter*`(監控自監控告警,無分類)
|
||
- `HPAMaxedOut/Disabled` / `PDBViolation` / `ContainerOOMKilled` / `StatefulSetReplicasMismatch` / `DaemonSetMissingPods`(k8s 細粒度全沒對應)
|
||
|
||
#### 🔁 重複定義
|
||
**80 個 alertname 同時存在 alerts.yml + alerts-unified.yml**(alerts.yml 是舊版,建議刪)。其他衝突:`PostgreSQLDown`(3 處)、`RedisDown`(3 處)、`VeleroBackupFailed`(2)、`HostNetworkPartition`(2)、`AlertChain*`(2)
|
||
|
||
#### ⚙️ ADR-109 dedup 缺口
|
||
`telegram_gateway.py` 33 個 send_xxx,**只有 3 處有 caller-side dedup**(`webhooks.py` 三處 `mark_telegram_confirmed`),其餘 30 個漏 dedup 風險高。
|
||
|
||
#### 💡 可優化
|
||
1. **刪 `ops/monitoring/alerts.yml`**(80 條全在 unified)
|
||
2. 補 12 個散戶 → ALERTNAME_TO_TYPE
|
||
3. 死告警轉 info-only Slack(不進 Telegram)
|
||
4. 落地 ADR-109:send_xxx 統一加 `dedup_scope` kwarg
|
||
|
||
---
|
||
|
||
### 第 6 路:死代碼 / TODO / _archived
|
||
|
||
#### 🔴 立刻可刪(合計 ~2,000 行)
|
||
```
|
||
apps/api/src/_archived/routes/approvals.py # 477
|
||
apps/api/src/_archived/services/approval.py # 389
|
||
apps/api/src/services/_archived/incident_engine_v1.py # 657
|
||
apps/api/src/services/_archived/incident_memory_v1.py # 483
|
||
apps/api/src/services/ai_router.py:614-635 # DEPRECATED method
|
||
apps/api/src/services/dry_run.py 整支 MOCK 表 # 130 行
|
||
```
|
||
|
||
#### 🔴 半成品 endpoint(router 接了但 service stub)
|
||
| URL | 病灶 |
|
||
|---|---|
|
||
| `POST /api/v1/notifications/send` | `routes/notifications.py:69` 假 queued,沒接 telegram_gateway |
|
||
| `GET /api/v1/notifications/channels` | `routes/notifications.py:39-58` MOCK_CHANNELS |
|
||
| `POST /api/v1/agent/chat` | `routes/agent.py:63` 假回應 |
|
||
| `POST /api/v1/agent/chat/stream` | `routes/agent.py:76` 寫死 SSE |
|
||
| `GET /api/v1/agent/status` | `routes/agent.py:88-93` 永遠 idle |
|
||
| `GET /health/ready` | `routes/health.py:278` 永 200(**生產風險**:kubelet 看不到真實狀態) |
|
||
|
||
#### 🟠 TODO 殭屍(>30 天)
|
||
- `sentry_webhook.py:460` TODO(2026-04-05) — 33 天無進度
|
||
- `routes/agent.py + notifications.py + health.py` — 47 天
|
||
- `api/v1/ai.py:43` TODO(R4) — 36 天
|
||
- `agents/security.py:187` Phase 9.4 LLM stub
|
||
- 6 個 jobs/* 約 19 天但已上線跑
|
||
- `apps/api/src` 全域 97 條 TODO/FIXME/DEPRECATED
|
||
|
||
#### 🔴 git rm 候選(伴隨改動)
|
||
- `services/__init__.py:5-8` 封存註解同步刪
|
||
- 三個 `*_agent.py` 的 PHASE2_STEP_TIMEOUT_SEC alias + tests/test_agent_step_timeouts.py 8 處測試
|
||
- **`apps/web/` ~150 檔 D 未 commit**(**git working tree 髒,立刻 git rm 獨立 commit**)
|
||
|
||
#### 💡 可優化
|
||
1. 建立 30d TODO 過期 CI 掃描
|
||
2. _archived 標 90 天硬上限,cron 自動偵測
|
||
3. 半成品 endpoint 三選一(接真 service / 410 Gone / 刪)
|
||
4. apps/web/ 立刻獨立 commit
|
||
5. GitHub workflows 加 fail-fast guard
|
||
|
||
---
|
||
|
||
### 第 7 路:K8s Workloads(13 Deployment + 6 CronJob + 3 DaemonSet)
|
||
|
||
#### ✅ 健康執行
|
||
- Deployment:`awoooi-{api,web,worker}` / `velero` / `event-exporter` / `kube-state-metrics`
|
||
- CronJob:`k3s-status-report`(每日 01:00) / `weekly-report`(週五 10:00) / `km-vectorize`(每日 19:00) / `descheduler`(每 2h) — **14 路 SSH 確認最近執行成功**
|
||
- DaemonSet:`otel-collector` / `kured` / `node-problem-detector`
|
||
|
||
#### 🔴 永遠失敗 / 未 sync / 閒置
|
||
| 項目 | 問題 |
|
||
|---|---|
|
||
| **`drift-scanner`** | **不在 `kustomization.yaml`,ArgoCD 永遠不 sync**(5/8 修復清單根本沒生效)|
|
||
| **`backup-restore-test`** | 同樣未列 kustomization,告警引用它但 cron 不存在 = 死告警 |
|
||
| **`17-configmap-backup-restore-scripts`** | 同上 |
|
||
| **VPA × 3** | 全部 `updateMode: "Off"`(28 天只蒐集建議無實效) |
|
||
| 5 個一次性 migration job | `k8s/jobs/migrate-*.yaml` 殘留 |
|
||
|
||
#### ⚠️ SPOF 集中度排行
|
||
1. **120**(K3s master + etcd + scheduler)— 整個 control plane SPOF
|
||
2. **110 Harbor** — 所有 prod image 唯一源
|
||
3. **awoooi-api** — drift / km-vectorize / k3s-report / weekly-report 4 條鏈共依
|
||
|
||
#### 🔁 功能重複
|
||
- 報告三胞胎:`k3s-status-report` / `weekly-report` / `km-vectorize`(都是「跑 API 內部 method 包成 cron pod」)
|
||
- 節點維運三選一:`kured` + `descheduler` + `NPD`
|
||
- 指標三層:`otel-collector` + `kube-state-metrics` + `event-exporter`
|
||
|
||
#### 💡 可優化
|
||
1. 立刻把 drift-cronjob / backup-restore-test / 17-configmap 加進 kustomization
|
||
2. worker HPA 改固定 1(max 永遠用不到)
|
||
3. 三 cronjob 整併為 awoooi-api 內部 APScheduler
|
||
4. 拆 110 Harbor SPOF(在 188 啟 mirror)
|
||
5. VPA × 3 跑滿月,要嘛改 Auto,要嘛刪
|
||
|
||
---
|
||
|
||
### 第 8 路:CI/CD(8 Gitea + 6 GitHub)
|
||
|
||
#### ✅ 高頻 Gitea workflow
|
||
- `cd.yaml`(push main + paths)— **12 天 18 commits 修不穩**
|
||
- `code-review.yaml`、`e2e-health.yaml`(每日 cron)、`run-migration.yml`、`type-sync-check`、`deploy-alerts`、`ansible-lint`、`cd-dev`
|
||
|
||
#### 🔴 GitHub 6 個全殭屍但仍會觸發
|
||
| 檔案 | 問題 |
|
||
|---|---|
|
||
| `.github/workflows/cd.yaml` | push main 仍跑 → **與 Gitea cd.yaml 競爭同一台 K3s** |
|
||
| `.github/workflows/ci.yaml` | push/PR 仍跑(已併入 Gitea cd.yaml) |
|
||
| `.github/workflows/deploy-prod.yml` | push main 仍跑 → 雙跑風險 |
|
||
| `.github/workflows/daily-e2e-health.yaml` | cron 跑 → 雙重 e2e |
|
||
| `.github/workflows/runner-healthcheck.yml` | **每 10 分鐘 cron** → GitHub Billing 流血 |
|
||
| `.github/workflows/nightly-llm.yaml` | 每日 0 UTC |
|
||
|
||
#### 🔴 安全紅燈
|
||
- **Sentry DSN 寫死於 .github/workflows/cd.yaml:277 + ci.yaml:207, 412**:`http://da02d4e5d6542e4d1ed6b2dd6542efeb@192.168.0.110:9000/2`(**等同 ingest key 洩漏**)
|
||
- **Telegram chat_id `-1003711974679` 寫死於 7 個 workflow**(應走 secrets)
|
||
- 內網 IP `192.168.0.x` 在 14 個 workflow 出現 30+ 次
|
||
- cd.yaml:413 SSH heredoc 注入 secrets,stderr 若 set -x 就洩漏
|
||
|
||
#### 🔧 cd.yaml 18 次修補根因排行
|
||
1. host runner / Docker bootstrap 不穩 — 6 次(33%)
|
||
2. SSH / known_hosts 雪崩 — 4 次
|
||
3. Telegram 通知卡 pipeline — 3 次
|
||
4. Docker build lock 序列化 — 3 次
|
||
5. YAML / paths 過濾 — 2 次
|
||
|
||
#### 💡 可優化
|
||
1. **立即封存 .github/workflows/ 6 個**(git mv → .archived/)
|
||
2. Sentry DSN 換 secrets + history filter-repo
|
||
3. 抽 reusable `_telegram-notify.yaml`(7 處重複)
|
||
4. 抽 `setup-host-runner` composite action(根因 1+4 共 9 次修就是分散修)
|
||
5. 補 ArgoCD webhook 健康偵測 job
|
||
|
||
---
|
||
|
||
### 第 9 路:套件依賴
|
||
|
||
#### ✅ 高用 Python(>20 import)
|
||
`structlog`(215) / `sqlalchemy`(71) / `httpx`(60) / `fastapi`(57) / `pydantic`(54) / `opentelemetry`(17)
|
||
|
||
#### ✅ 高用 Node(>10 import)
|
||
`lucide-react`(224) / `@tanstack/react-query`(35) / `next-themes`(5) / `zod`/`cva`/`axios`/`@radix-ui/react-dialog`(各 3)
|
||
|
||
#### 🔴 0 import 死依賴
|
||
**Python**:
|
||
- `sse-starlette`(被 FastAPI StreamingResponse 取代)
|
||
- `claude-agent-sdk`(Phase 9 未啟用)
|
||
|
||
**前端 8 個確認死依賴**(合計 ~35 MB node_modules):
|
||
- `@uiw/react-md-editor`、`rehype-sanitize`、`react-flow-renderer`(被 @xyflow/react 取代)、`react-force-graph-2d/3d`、`react-resizable`+types、`@hookform/resolvers`、`date-fns`
|
||
|
||
#### ⚠️ 安全紅燈
|
||
- **LiteLLM CVE-2026-42208 SQL injection(CVSS 9.3)+ 1.82.7/1.82.8 供應鏈攻擊**:必須 SSH 110 跑 `pip show litellm` 確認 ≥ 1.83.7-stable
|
||
- `next 14.1.0` — Next 14.2+ 修了 SSRF/cache poisoning
|
||
- `axios 1.6.5` — 鎖 ≥ 1.7.4
|
||
- `starlette ≥ 0.35.0`(requirements.txt)— 應 ≥ 0.40.0
|
||
- **`apps/api/requirements.txt` 與 `pyproject.toml` 不同步**(fastapi 版本不一致)
|
||
|
||
#### 🔁 功能重複
|
||
- HTTP client 前端:axios(3) + axios-retry(1) + 79 處原生 fetch → 統一 fetch
|
||
- Graph 渲染:@xyflow/react(2) + 4 個死依賴
|
||
- Markdown:@uiw/react-md-editor + rehype-sanitize 全 0
|
||
|
||
#### 💡 可優化
|
||
1. 刪除 `apps/api/requirements.txt`(pyproject.toml 為唯一 source of truth)
|
||
2. 前端移除 8 個死依賴
|
||
3. SSH 110 驗證 LiteLLM 版本
|
||
4. 升級 starlette / next / axios
|
||
5. Python 移除 `claude-agent-sdk` + `sse-starlette`
|
||
|
||
---
|
||
|
||
### 第 10 路:AI Provider 呼叫分布
|
||
|
||
#### ✅ 真實在跑
|
||
| Provider | 估比例 | 路徑 |
|
||
|---|---|---|
|
||
| **`ollama` (= GCP-A 34.143.170.20)** | **75-85%** | DIAGNOSE/RESTART/SCALE/CONFIG 主推理 + Hermes/ElephantAlpha |
|
||
| `ollama_local` (111) | 10-15% | GCP-A/B 都掛時 fallback |
|
||
| `gemini` | 3-8% | Ollama 鏈失敗時雲端 fallback |
|
||
|
||
**15 路 SSH 實機驗證**:GCP-A 24h generate 2,117 次(100% caller 是 110 nginx)
|
||
|
||
#### 🔴 完全 0 呼叫但仍註冊
|
||
| Provider | 死法 |
|
||
|---|---|
|
||
| **GCP-B 34.21.145.224** | failover-only 架構,GCP-A HEALTHY 時永遠 standby(**月燒錢近零產出**) |
|
||
| `claude` (Anthropic) | 只有 IntentType.DELETE 死巷會 hit |
|
||
| `nemotron` (NVIDIA NIM) | `ENABLE_NEMOTRON_COLLABORATION=false` + `USE_OLLAMA_TOOL_CALLING=true` 雙 gate 切流 |
|
||
| `openclaw_nemo` (188:8088) | 程式碼註解寫「188:8088 現況 500 → 不可用」 |
|
||
|
||
**15 路 SSH 實機驗證 GCP-B**:24h 僅 375 次 generate / `ollama ps` 為空 / Load 0.00 / RAM 1.3G / 7d 模型清單 caller 分布:1411 from 110 nginx + 903 from 121 + 772 from 120
|
||
|
||
#### 🔴 ai_router.py 1,407 行空轉 4 週
|
||
- `USE_AI_ROUTER=False` 預設 → 走 `openclaw.py:1218` legacy chain
|
||
- governance 線走 `decision_fusion_adapter.py` 固定 hit GCP-A qwen3:8b(這條真在跑)
|
||
|
||
#### 🔧 9 處 fusion 權重 hardcode(**AI 自學北極星形同虛設**)
|
||
**`decision_fusion.py`**(方法 III):
|
||
- L127-129(LOW: 0.5/0.3/0.2)
|
||
- L134-137(MED: 0.35/0.35/0.2/0.1)
|
||
- L142-145(HIGH: 0.3/0.25/0.25/0.2)
|
||
|
||
**`decision_fusion_adapter.py`**:
|
||
- L48-50(_W_LLM=0.4 / _W_PLAYBOOK=0.3 / _W_MCP=0.3,已自註 TODO 由 AI 自學)
|
||
|
||
#### 💡 可優化
|
||
1. **GCP-B 改 weighted round-robin 70/30**(最大成本紅燈)
|
||
2. `USE_AI_ROUTER=true` 灰度切換驗證
|
||
3. 刪 `claude` provider 路由(金鑰刪 K8s secret)
|
||
4. 刪 `openclaw_nemo` + `nemotron` fallback 分支
|
||
5. fusion 權重搬進 PG `ai_decision_weights` 表(從 KM 學習回灌)
|
||
|
||
---
|
||
|
||
### 第 11 路:外部服務使用度
|
||
|
||
#### ✅ 高度依賴(移除即斷線)
|
||
Telegram Bot / Ollama 三層 / Prometheus + Alertmanager / Harbor 110 / Gitea / ArgoCD / Sentry 自架 / PostgreSQL + Redis(自架)
|
||
|
||
#### 🟡 備用 / 偶用
|
||
Gemini API / NVIDIA NIM / Langfuse / Grafana / Velero / blackbox-exporter
|
||
|
||
#### 🔴 部了沒人理(>30 天無流量推測)
|
||
| 服務 | 狀況 |
|
||
|---|---|
|
||
| **LiteLLM proxy** (188:/opt/litellm) | 0 src 引用,僅備份目標 |
|
||
| **Open-WebUI** (188:/opt/open-webui) | 0 src 引用,個人測試工具 |
|
||
| **n8n** (188:/opt/n8n) | 0 src 引用,早期殘留 |
|
||
| **Discord** | 全 codebase 0 引用 |
|
||
|
||
#### 🟠 半死狀態
|
||
| 服務 | 問題 |
|
||
|---|---|
|
||
| **Sentry MCP token = "CHANGE_ME"** | `03-secrets.yaml` 仍佔位符,但 `SENTRY_MCP_ENABLED=true` → heartbeat 必死告警 |
|
||
| `grist.wooo.work` | 0 引用,certbot 失效 |
|
||
| `registry.wooo.work` | Harbor 公網路由,certbot 失敗 |
|
||
| **SignOz** | 5/5 188 CPU 過載元兇之一 |
|
||
| Loki | 已棄用但 otel-collector 可能有 exporter 殘留 |
|
||
|
||
#### 💡 可優化
|
||
1. 修 Sentry MCP token(1 小時內可完成)
|
||
2. 清 188 三個閒置容器(LiteLLM / Open-WebUI / n8n)
|
||
3. 確認 Loki otel-collector exporter 殘留
|
||
4. 驗活 registry/grist 公網路由
|
||
5. 審核 SignOz remote_write 必要性(5/5 過載證據)
|
||
|
||
---
|
||
|
||
### 第 12 路:文件 / Memory / ADR
|
||
|
||
#### ✅ 高用文件(必讀)
|
||
CLAUDE.md / HARD_RULES.md / RED_ZONES.md / MASTER spec / 5/8 FINAL / MEMORY.md 索引 / project_audit_20260507.md
|
||
|
||
#### 🔴 過期未標 superseded
|
||
- `2026-04-08-sprint5-{api-changes,component-extraction,route-mapping,tab-spec}.md` 4 份 — 應全標 SUPERSEDED by ADR-065
|
||
- `2026-04-19-aider-watch-design.md` — 已 DEPRECATED 但檔名未加後綴
|
||
- `plan_complete_v2.md` — 被 v3 取代但檔頭沒標
|
||
- `project_momo_saas_strategy.md` — MEMORY.md 已標凍結但檔頭沒寫
|
||
- 2026-04-12-aiops-complete-flywheel-repair-design.md — 仍寫「等待統帥批准」實際已透過 ADR-068 完成
|
||
|
||
#### 🔁 重複 / 矛盾的 Memory(應合併)
|
||
- Sprint5 / 5R 散落 4 份
|
||
- Telegram 通知標準 4 份(ADR-075 + 3 feedback)
|
||
- Secrets 三份並存(前兩份應標 SUPERSEDED)
|
||
- K3s 審查 4 份
|
||
- Sentry 4 份
|
||
- Phase 6.5 RCA 4 份
|
||
- **ADR-105 雙開**(mcp-agent-loop-governance + revert-a2-ollama-primary)
|
||
|
||
#### 💔 索引失效
|
||
- `MEMORY.md:175` 指向 `project_phase7_scanners_complete.md`(檔不存在)
|
||
|
||
#### ⚙️ 過期 feature flag(10 個)
|
||
| Flag | 建議 |
|
||
|---|---|
|
||
| `USE_AI_ROUTER` | 移除(Phase 24 已收官) |
|
||
| `AIOPS_P1~P6_ENABLED`(6 個) | 移除(≥ 4 週上線) |
|
||
| `PHASE2_STEP_TIMEOUT_SEC` × 3 alias | 本 Sprint 移除 |
|
||
| `KM_WRITE_AWAIT` / `KM_WRITE_TIMEOUT_SECONDS` | 改硬編碼 |
|
||
|
||
#### 🔧 11 個 ADR 缺 rollback 段
|
||
ADR-028/030/035/040/052/058/068/070/073/087/105
|
||
|
||
#### 💡 可優化
|
||
1. 建立 `STATUS-INDEX.md`(CI 檢查每 spec 必有 status header)
|
||
2. ADR rollback 模板強制(pre-commit hook)
|
||
3. Memory 自動標 SUPERSEDED 腳本
|
||
4. ADR-105 雙開重編號(後者改 ADR-126)
|
||
5. 5 個重複系列合併(Sprint5 / Telegram / Secrets / K3s / Sentry / Phase 6.5)
|
||
|
||
---
|
||
|
||
## Part C — 4 路主機 SSH 實機盤點
|
||
|
||
### 第 13 路:110 + 120 + 121 內網三主機
|
||
|
||
#### 110(DevOps 金庫)— Load 1.05 / RAM 18G used / Disk 60%
|
||
|
||
##### 🔴🔴🔴 Swap 7.3GB / 7.8GB(93%)即將爆滿
|
||
Sentry self-hosted 49 容器(~30% CPU)+ Snuba 多個 ~180MB 實體 + taskbroker + relay + 2 個 ClickHouse instance 同台 → **隨時可能 OOM killer**
|
||
|
||
##### ✅ 活躍(健康)
|
||
Sentry self-hosted(49 容器全 Up)、Harbor(9 容器,port 5000)、Gitea + gitea-runner(port 3001/2222)、Prometheus/Alertmanager/Grafana(9090/9093/3002)、Langfuse(port 3100)、5 個 GitHub Actions runners(5/6 重啟後正常)、cAdvisor(5/5 修後 0% CPU)、SignOz、nginx + certbot timer、blackbox/node/github-exporter、PM2 wooo-frontend(56MB)、ClickHouse(signoz 18.83% / 1GiB)、ClickHouse(sentry 8.22% / 1GiB)
|
||
|
||
##### 🔴 跑了沒人用
|
||
- **`ollama-gcp-a-access.log` / `ollama-gcp-b-access.log` 為 0 bytes**(自 5/5 起)— port 11435/11436 nginx vhost 完全空轉
|
||
- `ollama-local-access.log` 最後 5/6 19:14
|
||
- `open-design`(port 7456) — 48h log 完全空白
|
||
- `docker-registry`(port 5002) — 24h logs 空白,與 Harbor 並存但本地綁定
|
||
- `aiops.access.log` 最後流量 **2026-02-25**(72 天前)
|
||
- `aiops.wooo.work.access.log` 最後流量 **2026-03-07**(62 天前)
|
||
|
||
##### 🔴 異常
|
||
- **stock-platform-scheduler** 每日 13:30 必失敗:`GlobalMarketService.fetch_and_save() missing 'target_date'` — 程式碼 bug
|
||
- **sshd kex_exchange_identification 每 10 分鐘**(fail2ban / 健康探針 bot)
|
||
|
||
#### 120(K3s CP MASTER)— Load 1.99 / RAM 2.7G / Disk 23%
|
||
|
||
##### ✅ 健康
|
||
- k3s-server 41% CPU / 1GiB RAM
|
||
- keepalived VIP 維持
|
||
- 全部 K8s pod 0 失敗,所有 CronJob 最近執行成功
|
||
- velero/backup-restore-test 新建 47h 待週六到期
|
||
|
||
#### 121(K3s CP BACKUP + ArgoCD)— Load 1.12 / RAM 1.9G / Disk 10%
|
||
|
||
##### ✅ 健康
|
||
- k3s-server 18.8% CPU / 617MB RAM
|
||
- ArgoCD 7 pods 全 Running
|
||
- **awoooi-prod App: Synced / Healthy / d356cd32**
|
||
|
||
##### 🟡 注意
|
||
- kube-state-metrics 在 `kube-state-metrics` namespace 不在 `monitoring`(prometheus scrape config 可能 namespace 寫死導致靜默失敗)
|
||
|
||
#### 💡 110/120/121 P0 優化
|
||
1. **🔴🔴🔴 110 Swap 93% 立即排查 mem 大戶**(docker stats 找最大者)
|
||
2. **🔴 停 110 ollama-gcp-a/b nginx vhost**(5/5 起 0 流量)
|
||
3. **🔴 停 110 aiops.wooo.work nginx vhost**(停擺 2 個月)
|
||
4. **🔴 修 110 stock-platform-scheduler bug** 或停服務
|
||
5. **🟡 確認 prometheus scrape job 對 kube-state-metrics namespace 一致**
|
||
|
||
---
|
||
|
||
### 第 14 路:188 SPOF 主機(最危險)
|
||
|
||
#### 系統基礎
|
||
- Load 0.87(5/5 修後降回正常)
|
||
- RAM 62GB / 8.3GB used / 53GB buff/cache
|
||
- Swap 8GB / 僅 48MB 使用(健康)
|
||
- Disk 982GB / **194GB → 179GB**(已釋放 15GB,見 Part E)
|
||
|
||
#### 🔴🔴🔴 緊急記憶體告警
|
||
| 容器 | 用量 | 比例 | 行動 |
|
||
|---|---|---|---|
|
||
| **momo-pro-system** | 1.9GB / 2GB | **95% 滿** | **距 OOM 僅 100MB**,立刻加 alert + 提高 limit |
|
||
| **litellm** | 779MB / 1GB | **78% 滿** | 高峰易 OOM,影響 AI Router |
|
||
|
||
#### ✅ 真正在跑且有用
|
||
| 容器 | CPU | MEM | 證據 |
|
||
|---|---|---|---|
|
||
| signoz-clickhouse | 9.1% | 2GB | logs_v2 3,180 萬行 / Block I/O 416GB write |
|
||
| signoz-otel-collector | 0.27% | 268MB | Net 4.1GB in / 20.7GB out |
|
||
| momo-scheduler | 1.1% | 349MB | **Block write 175GB**(最高)/ 5min cron |
|
||
| openclaw | 0.7% | 152MB | 110/92MB net |
|
||
| momo-db PG | 0.51% | 1.1GB / 4GB | 6 個 DB / 27 連線 |
|
||
| momo-telegram-bot | 0.03% | 115MB | 12/10MB net |
|
||
| n8n(**意外活躍**) | 0.08% | 378MB | 25MB out(有自動化工作流在跑!) |
|
||
|
||
#### 🔴 跑了沒人用
|
||
| 服務 | 狀態 | 行動 |
|
||
|---|---|---|
|
||
| ~~**Local Ollama** systemd PID 232354~~ | ~~佔 15GB 磁碟~~ | **✅ 5/8 已執行 stop + disable + 清模型(見 Part E)** |
|
||
| `anythingllm` 目錄 | 存在於 /home/ollama/ | 確認可清 |
|
||
| momo-e2e-test 容器 | Exited (137) 2 weeks ago | docker rm |
|
||
| signoz-init-clickhouse + telemetrystore-migrator | Exited 0 | docker rm |
|
||
| awoooi-build.bak | 3/23 修改未動 | 手動確認可刪 |
|
||
|
||
#### 🔴🔴🔴 awoooi_prod RLS 未套用
|
||
**`pg_policy` = 0 rows** — ADR-118 awooop_phase1_batch1_rls **prod 從未執行**,跨租戶 isolation 形同虛設!
|
||
|
||
#### 🔴 certbot failed
|
||
`systemctl --failed` 顯示 `certbot.service + snap.certbot.renew.service` 均 failed → SSL 憑證即將過期。
|
||
|
||
#### 🗄️ ClickHouse 大表(無 TTL)
|
||
| Table | Rows | Size |
|
||
|---|---|---|
|
||
| signoz_logs.logs_v2 | 3,180 萬 | 1.52 GiB |
|
||
| signoz_metrics.samples_v4 | 4.3 億 | 999 MiB |
|
||
| signoz_traces.signoz_index_v3 | 988 萬 | 523 MiB |
|
||
|
||
#### ⚠️ 監控棧 SPOF(最嚴重)
|
||
prometheus + loki + signoz + grafana + alertmanager 全在 188 → **188 掛則告警系統失聰**
|
||
|
||
#### 💡 188 P0 優化
|
||
1. **🔴🔴🔴 確認 awoooi_prod RLS migration prod 執行 + 跑 cross-tenant pytest**
|
||
2. **🔴🔴 修 certbot**(`certbot renew --dry-run`)
|
||
3. ~~**🔴🔴 stop Local Ollama service + 清 15GB 模型**~~ **✅ 已完成**
|
||
4. **🔴 momo-pro-system 加 alert rule**(>90% mem)+ limit 從 2GB → 4GB
|
||
5. **🟠 ClickHouse logs_v2 設 TTL 30 天 + 拆監控棧到獨立主機**
|
||
|
||
---
|
||
|
||
### 第 15 路:GCP-A + GCP-B + 111
|
||
|
||
#### GCP-A(Primary 34.143.170.20)— Load 0.09 / RAM 30G / Disk 46%
|
||
|
||
##### ✅ 健康主推理
|
||
- 11 個模型共 **65GB**:
|
||
- qwen2.5-coder:32b 19G / qwen3:14b 9.3G / deepseek-r1:14b 9.0G / minicpm-v 5.5G / hermes3+llava+qwen2.5:7b 各 4.7G / gemma3:4b 3.3G / llama3.2:3b 2.0G / bge-m3 1.2G
|
||
- 當前載入 RAM:hermes3:latest 5.0G + gemma3:4b 4.0G(合計 ~11G / 30G = 37%)
|
||
- **24h generate 2,117 次,100% caller 是 110 nginx**
|
||
- journal 24h 無錯誤
|
||
- 9 條 ESTAB 連線健康
|
||
|
||
##### 🟡 文件偏差
|
||
**ADR-110 reference 寫 `qwen3:8b` + `llama3.1:8b`,實機是 `qwen3:14b` + `llama3.2:3b`** — 已升級但 Memory 沒同步
|
||
|
||
#### GCP-B(Secondary 34.21.145.224)— Load 0.00 / RAM 1.3G / Disk 54%
|
||
|
||
##### 🔴🔴 完全閒置但沒下線
|
||
- **`ollama ps` 為空**(連模型都沒載進記憶體)
|
||
- 10 個模型共 **63GB**(與 GCP-A 9/10 重複,128GB 冗餘)
|
||
- **24h 僅 375 次 generate**(從 7d 1,411 急速萎縮)
|
||
- ADR-110 設計為 failover 不是 load-balance → GCP-A 健康時 GCP-B 永遠 standby
|
||
|
||
#### 111 MacBook(Fallback)
|
||
|
||
⚠️ **Hook 攔截實機 SSH**,僅以 5/8 觀測值說明:
|
||
- load 13.51(M1 Pro 10 核心,正常 < 2.0 → **重度過載**)
|
||
- 推測非 LLM 推理導致(GCP-A/B 健康時 fallback 不會 hit),是統帥本機 Claude Code / Cursor / 開發工具佔 CPU
|
||
- 需確認 Metal 是否還在運作 + Swap 用量
|
||
|
||
#### 💡 GCP/111 P0 優化
|
||
1. **🔴🔴 GCP-B 改 weighted round-robin(70/30)**— 否則月燒錢近零產出
|
||
2. **🔴 同步更新 reference_ollama_server.md** 模型清單
|
||
3. **🟠 111 healthcheck 加 load average 門檻**(>8 標 DEGRADED)
|
||
4. **🟠 GCP-B 模型瘦身**(只留 fallback 必要的 3-5 個,省 30G+ SSD)
|
||
5. **🟡 解 hook 限制查 111 真實負載來源**
|
||
|
||
---
|
||
|
||
### 第 16 路:168 + 112
|
||
|
||
#### 168 Mac mini M4(統帥開發機)
|
||
|
||
##### 🔴 Load 9.09 三大根因
|
||
1. **9 個孤立 `SkyComputerUseClient mcp` 進程**(從 Wed 累積,~7% CPU 持續)
|
||
2. **6 個 bun Telegram plugin 孤進程**(從 Thu 10AM 累積)
|
||
3. **`ai.openclaw.gateway` exit -9(SIGKILL)但 KeepAlive 持續重啟**
|
||
|
||
##### ⚠️ 磁碟 93% 滿
|
||
- `/System/Volumes/Data` 183GB / 199GB(**剩 16GB**)
|
||
- 外接 WOOO 1.5Ti / 1.8Ti(82%)
|
||
|
||
##### ✅ 真在用
|
||
Telegram.app(PID 971,35:52 CPU time)、Claude Telegram plugin(6 bun,但 5 個是孤進程)、playwright-mcp(PID 2521)、`com.awoooi.aider-flush`(每 5 分鐘 → awoooi API)、Windsurf IDE、Chrome
|
||
|
||
##### 🔴 自啟服務沒人理
|
||
- ~~9 SkyComputerUseClient + 6 bun Telegram 殘進程~~ **✅ 5/8 已殺掉 11+8 個(見 Part E)**
|
||
- ai.openclaw.gateway 反覆 crash-restart
|
||
- `淘宝桌面版.plist` / `Microsoft Teams2 agent` / `Microsoft Remote Desktop` / `Gemini for Mac`
|
||
|
||
##### ⚠️ 安全紅燈
|
||
- **`OPENCLAW_GATEWAY_TOKEN` 寫死於 plist 明碼**
|
||
|
||
#### 112 Kali(資訊安全網)
|
||
|
||
##### ✅ 活躍工具
|
||
- `kali-scanner.service` active 2d,79.6MB RAM,port 8080
|
||
- trivy / nuclei / nmap / nikto 全裝
|
||
- `WireGuard wg-easy`(51820/51821)
|
||
- node-exporter
|
||
- crontab:port_monitor.py(每小時)+ code_security_scan.py(每日 08:00)+ harbor_image_scan.py(每週日 09:00)
|
||
|
||
##### 🔴🔴 鏈路斷裂(5/8 框架 vs 實機落差)
|
||
1. **scan_results 是 in-memory dict**(`main.py:94`)— 重啟即清空,無持久化
|
||
2. **無主動 webhook 推送 awoooi 後端**
|
||
3. **kali-scanner log 100% 是 GET /health**(從 120/121 K3s blackbox probe),**無一條實際掃描結果送回後端**
|
||
4. crontab 三個 script 的 log 全寫本機檔案,無 HTTP 回傳
|
||
|
||
→ **Kali scan 結果全是孤島**,框架仍只是「監控掃描器存活」。
|
||
|
||
##### 🔴 安裝沒在用
|
||
- bandit(pipx 已裝,crontab + API routes 都沒用)
|
||
- sslyze / lynis(main.py 有 route 但需確認)
|
||
- 無 ZAP / Burp
|
||
|
||
#### 💡 168/112 P0 優化
|
||
1. ~~**🔴 168 立刻 `pkill -f SkyComputerUseClient`** + `pkill -f "bun run.*telegram"`~~ **✅ 5/8 已執行(Part E)**
|
||
2. **🔴 168 排查 ai.openclaw.gateway SIGKILL 原因**
|
||
3. **🔴 168 磁碟清理或擴容**(`~/.Trash` 217 項目可優先清)
|
||
4. **🔴 112 kali-scanner 補 result 持久化 + webhook 推送**或廢棄聲明
|
||
5. **🟠 168 OPENCLAW_GATEWAY_TOKEN 改 keychain 或環境變數**
|
||
|
||
---
|
||
|
||
## Part D — 跨路紅燈整合(4 大系統性問題)
|
||
|
||
### 🔴🔴🔴 紅燈 1:「規劃完整 vs 落地失效」
|
||
- ai_router.py 1,407 行 + USE_AI_ROUTER=False = **空轉 4 週**
|
||
- ADR-109 33 個 send 中 30 個無 dedup
|
||
- AwoooP 16 model 中 9 個 schema-only
|
||
- **awoooi_prod 0 條 pg_policy** — RLS migration prod 從未跑(14 路 SSH 鐵證)
|
||
- drift-scanner / backup-restore-test 不在 kustomization → ArgoCD 永遠不 sync
|
||
- 9 處 fusion 權重 hardcode(AI 自學北極星形同虛設)
|
||
|
||
### 🔴🔴🔴 紅燈 2:「閒置成本與安全暴露」
|
||
- ~~188 Local Ollama 服務還在跑佔 15GB~~ **✅ 5/8 已清**
|
||
- **GCP-B VM 24h 僅 375 次推理且 ollama ps 為空**(月燒錢近零產出)
|
||
- LiteLLM + Open-WebUI + n8n 三個 188 容器無人理
|
||
- 12 個 plugin 0 呼叫吃 context
|
||
- **Sentry DSN 寫死於 .github/workflows/** 三處
|
||
- LiteLLM CVE-2026-42208 + 供應鏈攻擊未驗版本
|
||
- GitHub 6 個 workflow 仍可觸發競爭 K3s
|
||
|
||
### 🔴🔴🔴 紅燈 3:「死代碼與半成品鏽蝕」
|
||
- 11 個 services 全域 0 import(3,245 行)
|
||
- 38 / 70 個前端頁是純殼或半成品
|
||
- 6 個半成品 endpoint 假運行 47 天
|
||
- apps/web/ ~150 檔 D 未 commit(git working tree 髒)
|
||
- 50 個 migration 中 35 個無 rollback
|
||
|
||
### 🔴🔴🔴 紅燈 4:「實機資源即將爆炸」
|
||
- **110 Swap 7.3G/7.8G(93%)** — Sentry/ClickHouse 隨時 OOM
|
||
- **188 momo-pro-system 1.9G/2G(95%)** — 距 OOM 僅 100MB
|
||
- **168 統帥 Mac 磁碟 183G/199G(93%)** — 剩 16GB
|
||
- **188 certbot failed** — SSL 即將過期斷服
|
||
- **111 MacBook load 13.51** — M1 Pro 嚴重過載
|
||
- **112 Kali scan 結果全是孤島** — webhook 從未呼叫過後端
|
||
|
||
---
|
||
|
||
## Part E — 已完成清單(2026-05-08 即時執行)
|
||
|
||
### ✅ 188 Local Ollama 完全清除(5/8 14:35-14:50 CST)
|
||
|
||
**指令鏈**:
|
||
1. `systemctl stop ollama` → inactive
|
||
2. 30 秒觀察期 — 25 個容器全 healthy(**0 受影響**)
|
||
3. `systemctl disable ollama` → disabled
|
||
4. `rm -rf /home/ollama/.ollama/models/blobs/*` → 清掉 5 個模型
|
||
5. `rm -rf /home/ollama/.ollama/models/manifests/*` → 清 manifests
|
||
|
||
**成果**:
|
||
| 項目 | Before | After |
|
||
|---|---|---|
|
||
| 模型總大小 | 15GB | **44KB** |
|
||
| 188 主磁碟使用 | 194GB | **179GB**(-15GB) |
|
||
| 容器影響 | 25 healthy | 25 healthy(0 受影響) |
|
||
|
||
**驗證**:
|
||
- `ollama list` → "could not connect to ollama server"
|
||
- 前面看到的 127.0.0.1 流量證實是我自己跑 `ollama list` CLI 造成
|
||
- `OLLAMA_BASE_URL=/ollama`(open-webui)是相對路徑根本沒連到 11434
|
||
|
||
### ✅ 168 Mac 殘進程清理(5/8 14:54-14:58 CST)
|
||
|
||
**執行**:
|
||
1. `pkill -f SkyComputerUseClient` → 12 → 1(殺 11 個)
|
||
2. `pkill -f "bun run.*telegram"` + `pkill -f "bun.*plugin.*telegram"`(detached script,避免 SSH 自殺)→ 9 → 1(殺 8 個)
|
||
|
||
**成果**:
|
||
| 指標 | Before | After |
|
||
|---|---|---|
|
||
| Load (1m) | 9.09 | **5.69**(-37%) |
|
||
| SkyComputerUseClient | 12 | 1 |
|
||
| bun telegram | 9 | 1 |
|
||
|
||
**未完成**(需統帥手動):
|
||
- 統帥到 OpenAI Codex 應用 → 設定 → **關閉 "Computer Use Beta"**(防再產殘進程)
|
||
- 排查 ai.openclaw.gateway exit -9(SIGKILL)持續 crash-restart 根因
|
||
|
||
---
|
||
|
||
## Part F — 統帥決策清單(37 條,按時效排序)
|
||
|
||
### 今日(4 小時內)必修
|
||
| # | 動作 | 狀態 |
|
||
|---|---|---|
|
||
| 1 | 110 Swap 93% 排查 docker stats 找最大記憶體戶 | ⏳ |
|
||
| 2 | **確認 awoooi_prod RLS migration 是否真有套用** | ⏳ |
|
||
| 3 | 修 188 certbot(`certbot renew --dry-run`) | ⏳ |
|
||
| 4 | apps/web/ ~150 檔 D 立刻 git rm 獨立 commit | ⏳ |
|
||
|
||
### 本週(5/8-5/14)必修
|
||
| # | 動作 | 狀態 |
|
||
|---|---|---|
|
||
| 5 | 188 momo-pro-system 加 alert(>90% mem)+ limit 升到 4GB | ⏳ |
|
||
| 6 | ~~168 統帥 Mac 清孤進程~~ | **✅ 5/8 完成** |
|
||
| 7 | 168 排查 ai.openclaw.gateway SIGKILL 根因 | ⏳ |
|
||
| 8 | 修 4 個前後端破鏈 + /monitoring + /tickets/dashboard 假資料替換 | ⏳ |
|
||
| 9 | 清 .github/workflows/ 6 個殭屍(雙跑風險 + GitHub Billing) | ⏳ |
|
||
| 10 | Sentry DSN 從 .github/workflows/ 三處改 secrets + filter-repo | ⏳ |
|
||
| 11 | 清 .claude/settings.json 真實 token + 12 個空轉 plugin | ⏳ |
|
||
| 12 | SSH 110 驗 LiteLLM 版本 ≥ 1.83.7-stable | ⏳ |
|
||
| 13 | 停 110 ollama-gcp-a/b nginx vhost(5/5 起 0 流量) | ⏳ |
|
||
| 14 | 停 110 aiops nginx vhost(停擺 2 個月) | ⏳ |
|
||
| 15 | ~~停 188 Local Ollama service + 清 15GB 模型~~ | **✅ 5/8 完成** |
|
||
| 16 | 清 188 三個閒置容器(LiteLLM / Open-WebUI / n8n) | ⏳ |
|
||
| 17 | 修 110 stock-platform-scheduler bug 或停服務 | ⏳ |
|
||
|
||
### 兩週(5/15-5/28)內
|
||
| # | 動作 |
|
||
|---|---|
|
||
| 18 | GCP-B 改 weighted round-robin 70/30(最大成本紅燈) |
|
||
| 19 | K8s 修復 drift-cronjob / backup-restore-test 加進 kustomization |
|
||
| 20 | 拆 188 監控棧 SPOF(prometheus/loki/signoz/grafana/alertmanager) |
|
||
| 21 | 112 Kali scan 結果持久化 + webhook 推送或廢棄聲明 |
|
||
| 22 | 後端清 11 個 0-import 孤兒(-3,245 行) |
|
||
| 23 | 前端清 8 個死依賴(-35MB node_modules) |
|
||
| 24 | 38 個純殼前端頁面決策 |
|
||
| 25 | 6 個半成品 endpoint 三選一(接真 service / 410 Gone / 刪) |
|
||
| 26 | 50 個 migration 補 35 個 rollback |
|
||
| 27 | 9 處 fusion 權重搬進 PG `ai_decision_weights` 表 |
|
||
| 28 | `USE_AI_ROUTER=true` 灰度 10%→50%→100% |
|
||
| 29 | 拆 telegram_gateway.py 6,426 行(落地 ADR-109) |
|
||
| 30 | 修 Sentry MCP token = CHANGE_ME |
|
||
|
||
### 一個月內
|
||
| # | 動作 |
|
||
|---|---|
|
||
| 31 | AwoooP 9 個 schema-only model 標 deprecation 觀察 60 天 |
|
||
| 32 | 9 個重複 ADR 重編號 |
|
||
| 33 | Sprint5 / Telegram / Secrets / K3s / Sentry / Phase 6.5 五系列 Memory 合併 |
|
||
| 34 | 建立 STATUS-INDEX.md + ADR rollback 模板強制 |
|
||
| 35 | 告警 162 唯一 alertname 中 120 個散戶補 symptom_pattern |
|
||
|
||
### 條件觸發 / 長期
|
||
| # | 動作 | 條件 |
|
||
|---|---|---|
|
||
| 36 | SGLang 落地 | 雲端 API 月費 > $1500 或新採購 NVIDIA GPU |
|
||
| 37 | MLX 整合 | 採購 Mac Studio M3/M4 Max 64GB+ |
|
||
|
||
---
|
||
|
||
## 信心評估
|
||
|
||
- **16 路全部完成**(12 codebase + 4 SSH 主機)
|
||
- 主機 SSH **9 台全連線**:110/120/121/188/111/112/168/GCP-A/GCP-B(hook 攔截 111 + 188 部分 SQL 已用替代資料)
|
||
- 每條結論附 file path + line number / container name / process / journal 證據
|
||
- 5/8 FINAL 盤點未發現的新紅燈(共 17 條 codebase + 7 條主機實機)
|
||
- 統帥本機 168 + Mac mini M4 也納入清查
|
||
- **5/8 即時清除 188 Ollama + 168 殘進程**(執行成功 + 0 副作用驗證)
|
||
|
||
**整體信心:High**
|
||
|
||
---
|
||
|
||
## 附錄:交付物索引
|
||
|
||
| 檔案 | 用途 |
|
||
|---|---|
|
||
| `docs/superpowers/specs/2026-05-08-FINAL-comprehensive-audit-and-roadmap.md` | 5/8 FINAL 規模/技術債盤點(V2) |
|
||
| `docs/superpowers/specs/2026-05-08-FINAL-v3-utilization-audit.md` | **本檔(V3 使用率盤點)** |
|
||
| `docs/LOGBOOK.md` | 進度軌跡(5/8 V3 entry 已寫入) |
|
||
| `~/.claude/projects/-Users-ogt-awoooi/memory/project_audit_20260508_v3.md` | 跨 session 記憶 |
|
||
| `~/.claude/projects/-Users-ogt-awoooi/memory/MEMORY.md` | 索引(V3 已加 🎯🎯🎯 標記) |
|
||
|
||
---
|
||
|
||
## SSH 連線速查(給未來 session)
|
||
|
||
| 主機 | 連線方式 | User |
|
||
|---|---|---|
|
||
| 110(DevOps 金庫) | `ssh 192.168.0.110` | wooo |
|
||
| 120(K3s CP MASTER) | `ssh 192.168.0.120` | wooo |
|
||
| 121(K3s CP BACKUP) | `ssh 192.168.0.121` | wooo |
|
||
| 188(SPOF AI+Web) | `ssh 192.168.0.188` | ollama |
|
||
| 111(M1 Pro Local Ollama) | `ssh ollama-111-gpu` | ooo |
|
||
| 112(Kali 安全網) | `ssh kali@192.168.0.112` | kali |
|
||
| 168(Mac mini M4 開發機) | `ssh 192.168.0.168` | ogt |
|
||
| GCP-A(Ollama Primary) | `ssh gcp-a` | oleetsai |
|
||
| GCP-B(Ollama Secondary) | `ssh gcp-b` | owen_taipei |
|