豪享生活架站方式封面:Next.js 前端、Go 微服務、Railway 部署與發文流程

豪享生活是我一個人架的個人網站。前端是一個 Next.js 專案,用子網域分出部落格與三個工具,四個產品共用同一個 Google 登入。後端用 Go 寫成微服務,主服務管登入與付款,文章與各產品各有自己的服務和資料庫;全部用 Docker 部署在 Railway,前面由 Cloudflare 擋著,圖片放 R2 走 CDN。

這篇記錄我的技術選型、為什麼第一天就拆成微服務、部署踩過的坑,以及文章從 Markdown 到網站的發文流程。開發時怎麼和 AI 分工,另外寫在一人開發怎麼用 AI 團隊。

個人網站的技術怎麼選?

四個產品用同一套技術,下表是 2026 年 10 月在用的技術。

豪享生活的技術選型

層技術負責什麼
前端Next.js 16、React 19、Tailwind CSS 4四個產品的畫面,放在同一個專案
登入NextAuth只提供 Google 登入,跨子網域共用
後端Go、Gin、GORM主服務、文章服務與各產品服務
資料PostgreSQL、Redis、Kafka資料庫、快取計數與服務之間的事件
部署Docker、Railway、GitHub Actions打包、執行服務與自動檢查
網路與圖片Cloudflare、R2+CDN擋在網站前面,配圖從 CDN 送出
分析自架 Umami、Cloudflare Web Analytics流量分析與網頁速度

前端用 Next.js,頁面可以在伺服器先畫好,再送到瀏覽器。只在瀏覽器畫的頁面,搜尋引擎讀到的可能是空白;豪享看股票改版前,Google 看到的每一頁都是空的。

文章頁在 2026 年 6 月 21 日改成伺服器先畫首屏;豪享看股票與豪享學英文沒登入時看到的頁面,也在 10 月中改成伺服器先畫。

後端全部用 Go 搭配 Gin 與 GORM,每個服務的寫法一致。豪享算命在 2026 年 9 月 26 日上線後,我把它整理成新產品的範本,附上一份上線踩雷清單;之後開新服務,都從這個骨架開始。

整體架構分成四層:讀者進站先經過 Cloudflare,再到同一個 Next.js 前端;前端把請求交給後端的 Go 服務,每個服務存取自己的資料庫。

豪享生活架構圖:讀者經 Cloudflare 進到同一個 Next.js 前端,前端分成主站與三個工具的子網域,後端是主服務、文章服務與各產品的 Go 服務,最下層是 PostgreSQL、Redis 與 Kafka 豪享生活的整體架構:一個前端、多個 Go 服務,每個服務各有資料庫

為什麼第一天就拆成 Go 微服務?

2026 年 2 月 25 日開工那天,我就建了三個專案:前端、主服務與文章服務。主服務是統一入口,管登入與身分;文章服務只管文章。

那時候網站只有部落格,拆成兩個服務看起來是多做。多一個服務,就多一個要部署、要照顧的東西。

回頭看,拆的界線是「會不會被其他產品共用」:

  • 每個產品都要用的:登入、身分與付款,集中在主服務。
  • 內容:文章獨立成文章服務,之後哪個產品要用都能接。
  • 只屬於一個產品的:各自開服務,例如豪享看股票、豪享學英文與豪享算命。

這個拆法到 2026 年 9 月 27 日才派上用場。那天文章服務改成各產品共用,其他產品要放文章,直接接這個服務就好,不用各自再做一套。

豪享生活的後端服務

服務開始開發(2026 年)負責什麼
主服務2 月 25 日統一入口,管登入、身分與付款
文章服務2 月 25 日文章與草稿,9 月底改成各產品共用
豪享學英文3 月 10 日字典、抽卡與票券
豪享看股票4 月 17 日行情代理、選股因子與快取
豪享算命6 月 21 日排盤與運勢計算
背景工作9 月 2 日讀事件、跑排程

豪享看股票的服務還多了一個角色:代理。前端只跟自己的後端要資料;資料怎麼準備、多久更新,都由後端控管。

第一天之後,架構是遇到需求才一塊塊加上去的:

豪享生活架構時間軸:2026 年 2 月 25 日拆成三個專案,4 月 17 日子網域上線並共用登入,6 月 20 日開始用發文腳本發文,9 月 27 日文章服務改成各產品共用,9 月 30 日網站地圖與 RSS 上線 豪享生活的架構時間軸(2026 年 2 月到 10 月)

四個產品怎麼共用一個 Next.js 專案?

部落格與三個工具放在同一個 Next.js 專案裡,用子網域分開。主站是 www,三個工具分別是 stock-viewer、english 與 fortune;網站依照網址的子網域,把請求轉到對應產品的頁面。

子網域架構在 2026 年 4 月 17 日上線,第一個子網域是豪享看股票。同一天也做好跨子網域共用登入:在主站用 Google 登入一次,三個工具都認得。

放在同一個專案,登入與深淺色這類全站功能只要做一次,四個產品共用同一套前端程式。

共用一個專案,路由規則要涵蓋每一種網址

共用的代價是路由規則。部落格的 robots.txt 和網站地圖有好幾個月都是 404。原因是子網域的轉址規則,把主站的這兩個網址也轉到別的資料夾。

這個問題到 2026 年 9 月 30 日才發現並修好。學到的是:改子網域規則時,robots.txt、網站地圖、RSS 這類不是頁面的網址,也要一起測。

資料庫、快取與事件怎麼分工?

資料層分成三種元件,再加上一個背景工作服務:

  • PostgreSQL:每個服務一顆,一個服務的資料庫出問題,影響範圍只在那個產品。豪享看股票的資料庫連不上時,不需要資料庫的功能照常運作。
  • Redis:用在限流、瀏覽計數與快取。學英文每天的免費次數用原子遞增計算,同時送出的請求不會互相蓋掉。
  • Kafka:傳學英文的成就與產圖請求、看股票的庫存這類事件。一開始用外部的代管服務,後來搬到 Railway 上自己架。
  • 背景工作服務:從 Kafka 讀事件,2026 年 10 月 10 日起也統一接手排程工作。

比較重的工作,我不放在使用者等待的路上。豪享學英文的情境圖在本機批次產好,再同步到正式機;正式機不跑產圖。

網站怎麼部署?Railway、Cloudflare 與 R2 CDN

每個服務都包成 Docker 映像檔,跑在 Railway 上;程式推上 GitHub 後,GitHub Actions 會先跑自動檢查。所有網站前面都由 Cloudflare 擋著。

分支照三段走:開發在 dev,合併到 production 才會部署,我確認線上沒問題,才合回 main。

圖片和程式分開放。文章配圖不放進程式碼,發文時才上傳到 Cloudflare R2,網站用 CDN 子網域的網址讀圖;豪享學英文的發音檔也放在 R2,經 CDN 送出。

Railway 部署踩過哪些坑?

部署到 Railway 後,我遇過三次程式沒壞、部署卻失敗的狀況。三次的問題都在環境:建置時的記憶體、服務綁定的網路位址,以及建置時的外部下載。

建置時記憶體不夠

  • 情境:2026 年 2 月 27 日,網站第一次部署到 Railway。
  • 問題:建置步驟因為記憶體不足而中斷,服務沒有機會啟動。
  • 判斷:服務還沒開始跑就失敗,問題在建置環境的資源,不在程式邏輯。
  • 做法:先處理建置階段的記憶體,讓建置在平台給的資源內跑完。
  • 結果與學到的:雲端的建置環境有自己的資源上限。第一次上雲端,要把建置和執行分開看。

IPv6 綁定讓健康檢查失敗

  • 情境:2026 年 2 月 28 日,服務部署後要通過 Railway 的健康檢查。
  • 問題:健康檢查一直失敗,平台判定服務沒有起來。
  • 判斷:問題出在服務綁定的網路位址,和健康檢查連進來的方式對不上。
  • 做法:調整服務綁定的位址,讓健康檢查連得到。
  • 結果與學到的:健康檢查失敗,不一定是程式壞了。要先確認平台從哪個位址、用哪種協定連進來。

Google Fonts 下載不到,建置失敗

  • 情境:2026 年 9 月 29 日,部落格大改版期間。
  • 問題:建置時要從 Google Fonts 下載字型,下載不到,整個建置就跟著失敗。
  • 判斷:部署成不成功,不該取決於外部字型服務當下連不連得上。
  • 做法:把字型檔放進專案自己提供,建置時不再對外下載。
  • 結果與學到的:建置不再因為字型失敗。建置過程中每一個對外連線,都是可能失敗的點;能自己放的檔案就自己放。

發文流程怎麼接到網站?

豪享生活的文章不在網站後台寫,而是寫成資料夾裡的 Markdown,再用發文腳本送上網站。正式發布前,我一定先在本機網站看過一次。

2026 年 6 月 20 日,第一批投資理財文章就是用發文腳本送上網站的。每篇文章一個資料夾,裡面放三樣東西:

  • article.md:正文。配圖與站內連結都寫成相對路徑,本機預覽時點得開。
  • meta.json:分類路徑、標籤、摘要、SEO 標題與描述,以及發布狀態。
  • images/:封面與配圖。

流程分成 7 步,中間有一道我把關的閘門:

豪享生活發文流程圖:寫成資料夾、單篇預覽、本機整套預覽、我確認、配圖上 CDN、發到正式站、逐篇驗證,確認沒通過時回到第一步修改 豪享生活的發文流程:本機看過、我確認之後才上正式站

  1. 寫成資料夾:正文、設定檔與配圖放進同一個資料夾。
  2. 單篇預覽:把單篇 Markdown 轉成網頁,先看排版與配圖。
  3. 本機整套預覽:發到本機跑的網站,用和正式站同一套版型看。
  4. 我確認:看過沒問題、我說「發佈」才往下走;有問題就回到第 1 步修改。
  5. 配圖上 CDN:腳本把配圖傳到 R2,文章裡的圖片換成 CDN 網址。
  6. 發到正式站:站內連結換成網站網址,缺的分類才新建;沒有明確指定公開,就發成草稿。
  7. 逐篇驗證:發完逐篇檢查正式站的文章,確認沒有破圖。

為什麼發文腳本要能重跑?

發文腳本可以重複執行,同一篇文章不會發成兩篇。文章第一次發上去後,網站給的文章編號會記回設定檔;之後再跑,腳本看到編號,就改成更新那一篇。

這樣改錯字、換配圖,都是改完檔案再跑一次,不用進後台一篇篇手動改。

為什麼預設發成草稿?

腳本預設把文章發成草稿,草稿只有作者看得到。就算流程哪裡出錯,讀者也不會先看到還沒確認的版本。

一個人架站,我學到什麼?

回頭看,豪享生活不是一次架好的。從 2026 年 2 月底的三個專案,到現在的四個產品與一條發文流程,都是遇到問題、解決問題,一點一點長出來的。

  • 先分清楚共用和專屬:身分、文章這類會被共用的,早點獨立;只屬於一個產品的,等要做時再開。
  • 讓搜尋引擎讀得到:頁面在伺服器先畫好;robots.txt、網站地圖這類不是頁面的網址,也要一起測。
  • 把部署環境當成另一台電腦:記憶體、網路位址與外部下載,都可能在雲端出問題。
  • 內容當成檔案管:文章放在資料夾,腳本能重跑、預設發草稿,改錯也不怕。

如果你也想自己架網站,希望這些判斷和踩過的坑,能讓你少走一點冤枉路。

常見問題

Q1:一個人做網站,需要一開始就拆微服務嗎?

我第一天只拆兩個服務:管身分的主服務,和管文章的文章服務。其他產品等到要做時,才各自開服務;拆分的界線是會不會被其他產品共用。

Q2:Railway 部署失敗,要先檢查什麼?

先分清楚失敗在建置、啟動,還是健康檢查。我遇過的建置失敗,一次是記憶體不夠,一次是下載不到 Google Fonts;健康檢查失敗則是 IPv6 綁定的問題。

延伸閱讀