
豪享生活是我一個人架的個人網站。前端是一個 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 服務,每個服務存取自己的資料庫。
豪享生活的整體架構:一個前端、多個 Go 服務,每個服務各有資料庫
為什麼第一天就拆成 Go 微服務?
2026 年 2 月 25 日開工那天,我就建了三個專案:前端、主服務與文章服務。主服務是統一入口,管登入與身分;文章服務只管文章。
那時候網站只有部落格,拆成兩個服務看起來是多做。多一個服務,就多一個要部署、要照顧的東西。
回頭看,拆的界線是「會不會被其他產品共用」:
- 每個產品都要用的:登入、身分與付款,集中在主服務。
- 內容:文章獨立成文章服務,之後哪個產品要用都能接。
- 只屬於一個產品的:各自開服務,例如豪享看股票、豪享學英文與豪享算命。
這個拆法到 2026 年 9 月 27 日才派上用場。那天文章服務改成各產品共用,其他產品要放文章,直接接這個服務就好,不用各自再做一套。
豪享生活的後端服務
| 服務 | 開始開發(2026 年) | 負責什麼 |
|---|---|---|
| 主服務 | 2 月 25 日 | 統一入口,管登入、身分與付款 |
| 文章服務 | 2 月 25 日 | 文章與草稿,9 月底改成各產品共用 |
| 豪享學英文 | 3 月 10 日 | 字典、抽卡與票券 |
| 豪享看股票 | 4 月 17 日 | 行情代理、選股因子與快取 |
| 豪享算命 | 6 月 21 日 | 排盤與運勢計算 |
| 背景工作 | 9 月 2 日 | 讀事件、跑排程 |
豪享看股票的服務還多了一個角色:代理。前端只跟自己的後端要資料;資料怎麼準備、多久更新,都由後端控管。
第一天之後,架構是遇到需求才一塊塊加上去的:
豪享生活的架構時間軸(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 步,中間有一道我把關的閘門:
豪享生活的發文流程:本機看過、我確認之後才上正式站
- 寫成資料夾:正文、設定檔與配圖放進同一個資料夾。
- 單篇預覽:把單篇 Markdown 轉成網頁,先看排版與配圖。
- 本機整套預覽:發到本機跑的網站,用和正式站同一套版型看。
- 我確認:看過沒問題、我說「發佈」才往下走;有問題就回到第 1 步修改。
- 配圖上 CDN:腳本把配圖傳到 R2,文章裡的圖片換成 CDN 網址。
- 發到正式站:站內連結換成網站網址,缺的分類才新建;沒有明確指定公開,就發成草稿。
- 逐篇驗證:發完逐篇檢查正式站的文章,確認沒有破圖。
為什麼發文腳本要能重跑?
發文腳本可以重複執行,同一篇文章不會發成兩篇。文章第一次發上去後,網站給的文章編號會記回設定檔;之後再跑,腳本看到編號,就改成更新那一篇。
這樣改錯字、換配圖,都是改完檔案再跑一次,不用進後台一篇篇手動改。
為什麼預設發成草稿?
腳本預設把文章發成草稿,草稿只有作者看得到。就算流程哪裡出錯,讀者也不會先看到還沒確認的版本。
一個人架站,我學到什麼?
回頭看,豪享生活不是一次架好的。從 2026 年 2 月底的三個專案,到現在的四個產品與一條發文流程,都是遇到問題、解決問題,一點一點長出來的。
- 先分清楚共用和專屬:身分、文章這類會被共用的,早點獨立;只屬於一個產品的,等要做時再開。
- 讓搜尋引擎讀得到:頁面在伺服器先畫好;robots.txt、網站地圖這類不是頁面的網址,也要一起測。
- 把部署環境當成另一台電腦:記憶體、網路位址與外部下載,都可能在雲端出問題。
- 內容當成檔案管:文章放在資料夾,腳本能重跑、預設發草稿,改錯也不怕。
如果你也想自己架網站,希望這些判斷和踩過的坑,能讓你少走一點冤枉路。
常見問題
Q1:一個人做網站,需要一開始就拆微服務嗎?
我第一天只拆兩個服務:管身分的主服務,和管文章的文章服務。其他產品等到要做時,才各自開服務;拆分的界線是會不會被其他產品共用。
Q2:Railway 部署失敗,要先檢查什麼?
先分清楚失敗在建置、啟動,還是健康檢查。我遇過的建置失敗,一次是記憶體不夠,一次是下載不到 Google Fonts;健康檢查失敗則是 IPv6 綁定的問題。
延伸閱讀
- 一人開發怎麼用AI團隊?Claude Code分工與上版審查:一個人怎麼用 Claude Code 組成 AI 團隊,從提案到上版審查
- 豪享生活部落格能做什麼?找文章、讀系列、收藏留言與RSS訂閱:架在這套架構上的部落格,讀者能用哪些功能
- 豪享看股票怎麼用?台股盤後總覽、排行榜、熱圖與策略選股:後端當代理的台股看盤工具
留言0