主機搬遷
背景
Cofacts 自 2017 年初上線起,基礎設施歷經多次重大變動。初期各服務分散部署於 Heroku(LINE bot、chatbot)與 Linode(Elasticsearch 資料庫、API、網站)兩個平台。隨著流量與服務複雜度的增長,Heroku 的記憶體上限(512MB~1GB dyno)與費用問題,以及 Linode 的維運負擔,促使團隊逐步規劃往 GCP(Google Cloud Platform)遷移。
歷次搬遷記錄(附引用,按時間排序)
2017 年以前:Heroku 初期部署
LINE bot(rumor-line-bot.herokuapp.com)最早部署在 Heroku,日誌可見典型的 Heroku dyno 啟停紀錄。API 與資料庫則分開架設於外部機器。
來源:20170327
2018 年:Linode + Heroku 雙軌時期
至 2018 年,production Elasticsearch 已運行於 Linode(4GB 機器);LINE bot 仍在 Heroku。年底預算規劃中,兩者費用明細如下:Heroku 一年 210×12 = 2,520 USD;Linode 一年 600×12 = 7,200 USD。
「API 與 URL resolver 先拆成兩個不同 image,先放一起,要拆機器以後再說。」
2019 年 5–11 月:從 Linode 舊機搬至新 Linode(cofacts.org)
GGM 提議將服務搬到以 GCP snapshot 備份、部署於 cofacts.org 的新機器,目標是消除 request timeout 問題。計畫先搬移資源密集的服務(API、DB、Site、URL resolver),chatbot 留在 Heroku。
遷移 checklist 包含:
- 設定 Elasticsearch GCP snapshot repo
- 轉移 SSL cert
- 更換
cofacts-api.g0v.tw與cofacts.g0v.tw指向新 IP - 關閉舊機器自動備份
惟因資料庫遷移難度(需下線)一再延後,9 月起討論改用 GCP Hosted Elasticsearch(Elastic Cloud)以減少停機時間,最終因技術複雜度而暫緩。
來源:20190515、20190522、20190529、20190717、20190724、20190821、20190911、20190918
2020 年 3 月:Linode 升級至 16GB 機器
因武漢肺炎疫情期間流量暴增,2020/3/9 發生硬碟寫滿(94GB Docker log)導致資料庫唯讀,以及 3/11 server load 飆至 100 的事件。緊急將 Linode 升級至 16GB / 6 CPU / 320GB(80 USD/mo) 計畫。
「Linode 升級到 16GB plan (80USD / month)」
來源:20200311
2021 年 6 月:LINE bot 從 Heroku 遷移到 Linode
LINE bot 長期受 Heroku 512MB~1024MB RAM 上限困擾,每天出現 memory quota exceed,費用每月約 45 USD。2021 年 5 月完成 Docker 化後,計畫搬至現有 Linode 主機。
2021/6/7 凌晨 1:52,LINE bot 正式切換至 Linode(line-bot.cofacts.tw)。Heroku 保留 free dyno 作為備援但不再使用,7 月起 Heroku 費用歸零。
遷移後觀察:request timeout error rate 由每週 200 次以上降至數十次以下。
2023 年 3 月起:Linode → GCP Cloud Run(分階段遷移)
動機:Linode 在 2023/4 起漲價(80 → 96 USD/mo),且 CI/CD 管理複雜(需維護 Docker Hub、GitHub Action、nginx 等多層設定)。
階段一(2023/3):Staging 環境上 Cloud Run
dev.cofacts.tw(staging site-tw)首先部署至 Cloud Run,並驗證 Cloudflare Full SSL 設定(避免與 Cloud Run 自動 HTTPS redirect 產生無限循環)。
階段二(2023/9):Production EN、JA site 上 Cloud Run
2023 年 9 月,staging 與 production 的英文(site-en)、日文(site-ja)網站遷移至 Cloud Run。nginx 的 header、redirect 設定移至 Cloudflare Transform Rules。API log 同步切換至 GCP Cloud Logging(9/16),取代 AWS CloudWatch(June 起費用暴增至 60 USD/mo)。
「cofacts.tw still on Linode」(中文版網站暫留 Linode)
2024 年:Chatbot 上 Cloud Run、主機打統編評估
2024 年初,LINE bot staging 環境改為 Cloud Run job 架構(notification 移至 Cloud Run Job)。
2024/11 討論 Linode production 主機(96 USD/mo)是否遷至 GCP Compute Engine(E2: 75 USD/mo)或 Vultr(可打統編、需研究),評估結論留待觀察。
2025 年 10 月:cofacts.tw(中文主站)上 Cloud Run
2025/10/13,Linode 上 rumors-site 佔用過多 RAM,導致 API 出現 bad gateway,服務中斷。
2025/10/14 凌晨 3–4 時,將 cofacts.tw 中文主站從 Linode 遷移至 Cloud Run,完成後 Linode 僅剩 api.cofacts.tw 與 line-bot.cofacts.tw 透過 Cloudflare Tunnel 對外。
Cloud Run cost 上升至約 225 USD/mo(total GCP)。
2026 年 3 月:主機從 Linode 全面遷移至 GCE(e2-highmem-4)
2026/3/27,mrorz 將剩餘服務(API、LINE bot、Elasticsearch、url-resolver 等)從 Linode 搬遷至 Google Compute Engine(cofacts-prod,e2-highmem-4 規格)。停機約一小時,遷移後服務恢復正常。架構上改用 Cloudflare Zero Trust Tunnel(cloudflared),取代 Cloudflare Tunnel + nginx。同時將 Elasticsearch 從 v6 升級至 v9。
2026/4/8,將 site-en、site-ja 也從 Cloud Run 移至 GCE,Cloud Run 請求量於 4/9 後歸零,降載成功。
2026/4/14,Linode instance 正式刪除(省 96 USD/mo)。
目前架構
截至 2026 年 6 月,Cofacts 基礎設施全面運行於 GCP,架構如下:
GCE(cofacts-prod,e2-highmem-4,Ubuntu 24.04 LTS)
以 Docker Compose 管理以下容器,透過 Cloudflare Zero Trust Tunnel(cloudflared)對外提供服務:
| 容器 | 功能 |
|---|---|
site-tw |
中文主站(SSR 前端) |
site-en / site-ja |
英日文站 |
api(rumors-api) |
GraphQL API Server |
line-bot-zh |
LINE 機器人 |
db(Elasticsearch 9) |
全文搜尋 + 向量檢索 |
url-resolver |
爬取外部網頁(記憶體限制 512m) |
cron-runner |
排程腳本 |
管理員透過 GCP Identity-Aware Proxy(IAP)SSH 登入,透過 pam_group.so 取得 docker 操作權限。日誌與監控由 Google Cloud Ops Agent 收集,傳送至 Cloud Monitoring / Logging。
GCP Cloud Run(保留部分服務)
site-twCloud Run 服務在 GCE 承接流量後降載(保留備援)- 其他 staging 環境服務
- cofacts.ai(AI 查核平台)仍在評估部署方式
Cloudflare
- WAF / DNS / DDoS 防禦
- Cloudflare Tunnel(cloudflared)作為 GCE 對外入口,取代 nginx
- Transform Rules 處理 header、redirect(原 nginx 功能)
外部服務
- MongoDB Atlas:仍使用 MongoDB 官方雲端服務
- Redis Cloud:LINE bot 使用(staging free tier;production 付費)
- Staging 環境:Vultr 4GB 機器(20 USD/mo)
費用概況(2026 年 6 月)
| 服務 | 費用 |
|---|---|
| GCP(Cloud Run + GCE + Logging 等) | 約 250 USD/mo |
| Vultr staging | 20 USD/mo |
| Linode | 已刪除(0 USD) |
2026 年 6 月:GCP Committed Use Discount(CUD)購買評估
因主機搬遷完成後費用結構穩定,2026/6 進行 GCP Flexible CUD 購買方案試算。CUD 可涵蓋 GCE、Cloud Run、GKE,以 Billing Account 為單位。
2026-05 實際可被 CUD 涵蓋的費用約 $188/mo($0.26/hr),主要為 GCE e2-highmem-4 的 CPU/RAM($155)與 Cloud Run($60)。
建議採購方案:$0.14/hr 3年 + $0.02/hr 1年
- $0.14/hr 3 年涵蓋 GCE 長期穩定用量
- $0.02/hr 1 年涵蓋目前 Cloud Run 生產站(預計 cofacts.ai 上線後取代),到期不續約
- 3 年總費用估計 $3,908,比不買省約 $2,224
待決:有 Billing Account 權限者至 GCP Console 執行採購。
來源:20260616
2026 年 6 月:封鎖商業 SEO 爬蟲 + Cloudflare 快取規則
2026/6/10 晚間,Cloudflare 新增兩項設定:
- WAF 規則「Block 商業爬蟲」:封鎖 DotBot、SemrushBot、AhrefsBot、DataForSeoBot、Barkrowler、MJ12bot,這些爬蟲每月吃掉 ~330 GB origin 流量,快取命中率近 0%。
- Cache Rule「en/ja/zh SSR HTML」:en/ja/zh.cofacts.tw 頁面由 Cloudflare 快取 60 秒(原本 100% 直打主機)。
生效 36 小時成效(origin 流量):
- en.cofacts.tw:-54%、ja.cofacts.tw:-70%、zh.cofacts.tw:-71%
- site-tw 對外流量從週初 12.1 GB 降至一週後 3.1 GB(-74%)
- GCE egress 預估省 $13–15/月 + Cloud Run $4–5/月
後續評估中:是否封鎖 ClaudeBot(Anthropic AI 爬蟲,~95 GB/月)、是否擴展快取至 cofacts.tw /article/*。
來源:20260616