20260929 會議記錄

:::info

上週待辦

cofacts.ai

@MrOrz:試著把 PR#400 部署到 staging,用 staging LINE bot 傳影片測 e2e,確認 rumors-api 轉傳 URL 給 Vertex AI 後能正常運作。一路上遇到不少雷,但和實作無關,是資料流上的小眉角,細節在 PR comment。

@MrOrz:用 HTTP URL 的話,agent platform 只能傳 15MB(文件)。LINE 影片很容易超過 15MB,PR#400 可能沒辦法出 QQ @yutin:Copy that,我想一下怎麼解,週一處理

@MrOrz:embedding API 沒寫大小限制,但如果都傳了 GCS,或許 embedding 也一起用 GCS 比較順。另外 embedding 有 task instructions,該用 search result 還是 fact checking? @yutin:沒有大小限制,但有長度限制;可以裁切範圍內的長度,只做部分搜尋? @MrOrz:超過長度會 4XX 還是自動截斷不清楚。不存檔就截斷較複雜,存檔要注意 disk。覺得截前 120s 還行;之前 design doc 是希望每段時間切,schema 也有預留一份文件存多個 embedding。

refactor(transcript): 直接把 media URI 交給 Vertex,不再複製到 GCS #400

Site revamp

doc(cofacts.ai): Phase 3 網站遷移與前端架構 design doc #31(opened 2026-09-28)


Cofacts article classifier

https://github.com/cofacts/kb/pull/29

[!Note] TODO MrOrz 把 key 丟給 AI 讓他做實驗 再回頭更新 kb#29、給大家 review

小聚 rundown

場地想法摘要 — 板橋中心(下次小聚同場地)

來源: 20260818 小聚檢討 / 小松果

上週重點整理(2026-09-22 ~ 2026-09-29)

GitHub 活動

cofacts/rumors-api

cofacts/ai

cofacts/devops

cofacts/kb

cofacts/takedowns

cofacts/cofacts-ai-eval

LINE Bot request_timeout 調查彙整

調查期間:2026-09-24 ~ 2026-09-29 觸發原因:production LINE bot(Cofacts 真的假的|轉傳查證)持續收到 LINE 的「bot server returned no response or an error」通知信,但手動測試(tutorial、影片查證)都正常。

結論先講:找到兩個確定的根因並修掉了,但不確定問題是否已經完全解決,還額外挖出一個舊的未解謎團


一、症狀與資料來源

錯誤從至少 2026-09-11 就存在(Gmail 訂閱信可查),9/21~9/24 明顯加劇(LINE 統計:30 → 55 → 40 → 96 次/天),之後回落。

關鍵前提:確認 /callback 流量本身在整段期間持平(每天 9,700~13,000 次,無成長趨勢)——不是使用量變多造成的。


二、根因 #1:Node 預設 keepAliveTimeout(5 秒)與 reverse proxy 連線重用視窗不匹配

修法:server.keepAliveTimeout = 65_000、server.headersTimeout = 66_000(拉到明顯大於 proxy 的重用視窗)。

PR:cofacts/rumors-line-bot#416 — 已 merge、已部署(2026-09-26 08:21 UTC 重啟生效)。

效果:部署後,「短時間內同一分鐘炸裂好幾筆」的密集錯誤模式消失了;但零星、單筆的失敗並未歸零,代表這不是唯一成因。


三、根因 #2:每小時的 PM2 reload(cron)在 SIGINT 時沒有優雅關閉

查 /etc/cron.d/cofacts-ops 發現:

# Chatbot group 重啟(穩定性維護)
15 * * * *  root  cd /srv/rumors-deploy && docker compose exec -T line-bot-zh node_modules/.bin/pm2 reload all ...

line-bot-zh 每小時被 pm2 reload all rolling-restart 一次(透過 Cloud Logging 查證,至少從 9/14 起、每小時精準地在 :15:0X 秒發生)。

修法:SIGINT handler 加 server.close()(先停止接受新連線),ecosystem.config.js 的 kill_timeout 拉到 15 秒(給收尾時間)。

PR:cofacts/rumors-line-bot#417 — 已開,尚未 merge / 部署。


四、意外發現:一次獨立的、跟上述都無關的當機事件

9/22 台灣時間凌晨 03:34~04:56,Cloudflare 自己內建的 health check 打 line-bot.cofacts.tw/ 有 ~30% 收到 502(持續約 50 分鐘)。查了 dmesg/journalctl,沒有 OOM、沒有 container 重啟紀錄——origin 當下應該是「活著但卡住沒回應」,原因不明(舊 container log 已隨 9/26 部署被換掉,回不去查了)。這單一事件把 9/22 當天的錯誤數字拉得特別高,跟根因 #1、#2 是分開的事,暫時懸而未決。


五、順著 cron 註解「Chatbot group 重啟」牽出的舊謎團(尚未解決)

這部分是真的「空手而回」——只找到線索、沒有結論,值得帶去會議上讓其他人一起想。


六、目前狀態與待決事項

項目 狀態
PR #416(keepAliveTimeout) ✅ 已部署
PR #417(graceful shutdown) 🟡 已開 PR,待 review / 部署
Cron 頻率 目前每 3 小時一次(Johnson 已從每小時調整)——待決:#417 部署驗證前,是否該先調回每小時以降低 group 卡住的曝險時間?
9/22 凌晨的獨立當機事件 ❓ 原因不明,未查
Group 訊息偶爾沒回覆(3年舊謎團) ❓ 未解,需要團隊一起想怎麼查
request_timeout 是否已完全解決 ❓ 不確定,#417 部署後才有更多資料判斷

七、想帶去會議討論的問題

  1. 9/22 凌晨那次 origin 卡住(非 OOM、非重啟)還有沒有人有印象/猜測?要不要加更持久的 log 保存,下次再發生能回頭查?
  2. Group 訊息「有時候沒回覆」這個 2023 年就有的謎團,有沒有人記得更多背景,或當時排查到什麼程度?
  3. Cron 重啟頻率該怎麼權衡(webhook 穩定性 vs. group queue 卡住的自癒時間)?

cofacts/rumors-line-bot

GCE(cofacts-prod)主機

每格依序是 min | avg | p95 | max(%)。

日期 CPU Mem Swap
09-22 9.25 | 17.33 | 24.58 | 43.33 64.18 | 67.05 | 68.98 | 81.71 46.53 | 48.54 | 50.51 | 51.31
09-23 10.20 | 18.72 | 26.42 | 41.26 64.77 | 67.50 | 69.74 | 71.03 43.62 | 46.94 | 51.33 | 51.56
09-24 10.43 | 19.69 | 26.50 | 48.92 64.32 | 67.38 | 69.61 | 78.91 45.52 | 47.93 | 50.50 | 57.31
09-25 9.95 | 17.72 | 25.56 | 38.15 64.39 | 67.53 | 69.82 | 71.20 45.38 | 47.47 | 49.12 | 50.08
09-26 9.10 | 15.95 | 23.19 | 57.38 64.00 | 66.35 | 68.41 | 70.64 44.09 | 47.05 | 49.45 | 49.55
09-27 8.08 | 14.64 | 20.87 | 34.06 63.06 | 65.65 | 67.83 | 69.25 46.56 | 49.42 | 51.05 | 53.54
09-28 8.16 | 12.72 | 18.13 | 21.84 63.86 | 66.38 | 68.34 | 70.25 46.15 | 47.33 | 49.33 | 50.90
09-29* 12.65 | 17.09 | 21.67 | 21.67 65.43 | 67.17 | 70.55 | 70.55 46.85 | 48.84 | 51.71 | 51.71

* 09-29 只有半天資料。

目前狀態: 已連續運行 145 天,load average 為 1.28 / 0.90 / 0.83。記憶體用 21 GiB / 31 GiB(還有 9.6 GiB 可用),Swap 用 1.9 GiB / 4 GiB。硬碟 71%(48G / 67G)。

GCE 主要程序(跟上週 9/15–9/22 比)

CPU 單位是 core(核心數)。

程序 記憶體平均(尖峰) CPU 平均(尖峰) 穩定度(Stddev) 觀察
Elasticsearch 19.2 GB(19.6 GB) 0.25(0.65) 記憶體 σ≈96MB,很穩 跟上週幾乎一樣。CPU 尖峰從 0.49 升到 0.65,屬偶發
rumors-site(server.js) 342 MB(843 MB) 0.16(0.23) σ≈111MB,起伏較大 比上週低,CPU 尖峰從 0.31 降到 0.23
rumors-api(build/index.js) 151 MB(838 MB) 0.12(0.24) σ≈7MB,很穩 CPU 尖峰從 0.18 升到 0.24,屬偶發
Chromium(renderer 等) 單一程序最多約 580 MB 單一程序最多 0.04 起伏很大 屬正常的短暫工作。這週高用量的 renderer 比上週多
cloudflared — 0.017(0.04) 穩 正常

Cloud Run

部署: 9/26 重新部署了 line-bot-tw、line-bot-en、line-bot-ja 和 dev-line-bot,所有服務狀態都是 ✔。

服務 CPU p50(正常區間) CPU p95 / p99 記憶體 p50 → p99 穩定度與建議
site-tw 0.10 0.81 / 1.0 0.79 → 1.01 ⚠️ 記憶體 p99 已達上限,CPU p99 也滿載,跟上週一樣。建議評估調高記憶體上限,或查 OOM/重啟紀錄
line-bot-ja 0.007 0.15 / 0.27 0.40 → 0.46 穩定
line-bot-en 0.011 0.14 / 0.19 0.40 → 0.43 穩定,p95 比上週低
cofacts-ai 0.015 0.12 / 0.29 0.06 → 0.07 穩定,比上週略低
line-bot-tw 0.005 0.11 / 0.12 0.37 只有 9/26(部署當天)有資料
site-staging-tw / en、dev-line-bot 趨近 0 偶有尖峰 0.65–0.86 測試環境,不需處理

流量(Network Out)

服務 本週(9/22–28)每日平均 上週每日平均 變化
site-tw 5.69 GB(9/24 最高 7.31 GB) 4.36 GB +30%

site-tw 的流量在 9/23–9/24 最高,9/27 以後明顯回落,9/28 降到 3.48 GB。這跟 6 月開始的 egress 降費任務有關,建議看一下 Cloudflare 那幾天是否有新的爬蟲,或是 WAF 規則沒擋到的流量。

本週重點

  1. ✅ GCE 很穩:CPU 平均 13–20%,記憶體約 67%,Swap 維持在 47–49%,這幾項跟上週差不多。
  2. ⚠️ site-tw 資源貼齊上限:記憶體 p99 為 1.01,CPU p99 約 1.0,連續兩週都這樣。建議優先處理。
  3. ⚠️ site-tw 流量增加約 30%:尖峰在 9/23–24,之後已回落,要確認是不是爬蟲造成的。
  4. ℹ️ GCE 硬碟 71%:還有 20G 可用,持續觀察即可。

所有摘要檔都存在 workspace/metrics/,檔名含 2026-09-22_2026-09-29_1790652244。