主機搬遷

背景

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,先放一起,要拆機器以後再說。」

來源:20181010、20181017、20180808


2019 年 5–11 月:從 Linode 舊機搬至新 Linode(cofacts.org)

GGM 提議將服務搬到以 GCP snapshot 備份、部署於 cofacts.org 的新機器,目標是消除 request timeout 問題。計畫先搬移資源密集的服務(API、DB、Site、URL resolver),chatbot 留在 Heroku。

遷移 checklist 包含:

惟因資料庫遷移難度(需下線)一再延後,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 次以上降至數十次以下。

來源:20210512、20210526、20210609


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)

來源:20230308、20230921、20231004


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(可打統編、需研究),評估結論留待觀察。

來源:20240603、20241104


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)。

來源:20251014、20251021、20251104


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)。

來源:20260324、20260331、20260414


目前架構

截至 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(保留部分服務)

Cloudflare

外部服務

費用概況(2026 年 6 月)

服務 費用
GCP(Cloud Run + GCE + Logging 等) 約 250 USD/mo
Vultr staging 20 USD/mo
Linode 已刪除(0 USD)

來源:20260414、20260616


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年

待決:有 Billing Account 權限者至 GCP Console 執行採購。

來源:20260616


2026 年 6 月:封鎖商業 SEO 爬蟲 + Cloudflare 快取規則

2026/6/10 晚間,Cloudflare 新增兩項設定:

  1. WAF 規則「Block 商業爬蟲」:封鎖 DotBot、SemrushBot、AhrefsBot、DataForSeoBot、Barkrowler、MJ12bot,這些爬蟲每月吃掉 ~330 GB origin 流量,快取命中率近 0%。
  2. Cache Rule「en/ja/zh SSR HTML」:en/ja/zh.cofacts.tw 頁面由 Cloudflare 快取 60 秒(原本 100% 直打主機)。

生效 36 小時成效(origin 流量):

後續評估中:是否封鎖 ClaudeBot(Anthropic AI 爬蟲,~95 GB/月)、是否擴展快取至 cofacts.tw /article/*。

來源:20260616