作者簡介: 軟體工程師。秉持「不要以為自己已經懂了,持續學習到永遠」的信念,透過工作與個人開發雙軌精進技術。使用 AI 驅動開發,正在構築並營運多個個人開發應用程式。
👉 作品集: 作者首頁
這篇文章約可在 5 分鐘內讀完。
「個人開發因為有伺服器費用,所以沒辦法公開」 —— 你也這麼想嗎?
我目前把 3 個產品公開在網際網路上,而且每月營運成本完全是 0 元。這篇文章會把為了實現 0 元所做的技術選型,以及取捨判斷全部公開。
產品種類技術堆疊ユメハシ把夢想拆解成目標的應用程式Flutter Web / Drift(SQLite)/ RiverpodDefrago釋放腦中碎片化思緒的待辦管理Flutter Web / Drift(SQLite)/ RiverpodHomePage作品集網站Astro / TypeScript這 3 個都是在瀏覽器上運作的 Web 應用程式。
以前的我,即使能獨自做出應用程式,也沒有公開的方法。
因為覺得「架伺服器要花錢」「AWS 的計費方式太複雜又可怕」——抱著這樣的成見,我一直反覆做出只能在本機跑的應用程式,然後丟著不管。
轉捩點是遇見了 Claude Code。因為能一邊和 AI 對話一邊推進基礎設施建置,「架設伺服器」這個心理門檻一下子降低了。最後我走到的是以營運成本 0 元為前提的限制導向設計思維。
如果正常使用 AWS 或 Azure,幾乎就沒有技術上的限制了。但,那樣就不好玩了。
我對自己設下 0 元約束的理由有 3 個。
判斷重點無限制時的選擇0 元約束時的選擇取捨靜態網站EC2 / CloudFrontGitHub Pages無法執行自訂伺服器處理。乾脆採用 SSGSSR 應用程式ECS / FargateVercel Free每月 100GB 頻寬 / 100 小時 Serverless。對個人開發來說已經很足夠GitHub Pages 是可以直接從 GitHub 倉庫託管的免費服務。它和 Astro、Flutter Web 這類會把建置成果輸出成靜態檔案(HTML/CSS/JS)的框架相性極佳。
# .github/workflows/deploy.yml(使用 GitHub Actions 建置與部署)
name: Deploy to GitHub Pages
on:
push:
branches: [main]
schedule:
- cron: "0 21 * * *" # 每日批次(UTC 21:00 = JST 6:00)
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci && npm run build
- uses: actions/upload-pages-artifact@v3
with:
path: dist/
deploy:
needs: build
permissions:
pages: write
id-token: write
environment:
name: github-pages
runs-on: ubuntu-latest
steps:
- uses: actions/deploy-pages@v4
判斷重點無限制時的選擇0 元約束時的選擇取捨RDBRDS / Cloud SQLSupabase Free500MB / 50K MAU。要擴充就得付費輕量儲存DynamoDBDrift(瀏覽器內的 SQLite)資料存在瀏覽器內。裝置間同步需另外設計ユメハシ與 Defrago 使用 Drift(Flutter 用的 SQLite 函式庫),把所有資料都儲存在瀏覽器的 IndexedDB 中。由於不需要伺服器端資料庫,因此營運成本是 0 元。
┌──────────────────┐
使用者 ──────▶ │ Flutter Web App │
│ (GitHub Pages) │
└────────┬─────────┘
│
┌────────▼─────────┐
│ Drift (SQLite) │
│ on IndexedDB │ ← 在瀏覽器內完成
└──────────────────┘
取捨:無法進行裝置間同步。手機上輸入的資料無法在電腦上查看。不過我優先考慮的是「先讓使用者用起來」,因此把同步功能切分成未來付費使用者的功能。
判斷重點無限制時的選擇0 元約束時的選擇取捨認證基礎設施Cognito / Auth0NextAuth.js + 自行實作沒有代管服務的加成。安全性由自己負責簡易認證Firebase Auth不做認證(本機儲存)不需註冊即可立即使用。無法復原資料ユメハシ的 Web 體驗版是以不做認證來設計的。只要打開網址就能使用。這是基於「降低第一次使用的門檻」這個設計理念所做的判斷。
判斷重點無限制時的選擇0 元約束時的選擇取捨聯絡表單SES + LambdaFormspree(免費方案)每月 50 筆,對個人網站來說已足夠通知信件SendGridResend(免費方案)每月 3,000 封 / 1 網域### 批次處理
判斷重點無限制時的選擇0 元約束時的選擇取捨定期執行Lambda + EventBridgeGitHub Actions cron最小間隔 5 分鐘。精準度有些波動資料擷取Step Functions建置時 fetch沒有即時性。以每日更新來切分HomePage 透過 GitHub Actions 的 cron,實現部落格的預約發文與 Qiita 文章自動擷取。
// 預約發文的判斷(在建置時執行)
export function isPublished(entry: { data: { draft?: boolean; date: Date } }): boolean {
if (entry.data.draft) return false;
if (import.meta.env.DEV) return true; // 開發時顯示所有文章
// 以 JST 進行日期比較(GitHub Actions 以 UTC 運作)
const JST_OFFSET_MS = 9 * 60 * 60 * 1000;
const nowJST = new Date(Date.now() + JST_OFFSET_MS);
const todayJST = nowJST.toISOString().slice(0, 10);
const entryDate = entry.data.date.toISOString().slice(0, 10);
return entryDate <= todayJST;
}
重點:由於 GitHub Actions 是以 UTC 運作,如果不考慮 JST 的時差,就會發生「日本時間明明是今天,文章卻沒有公開」的 bug(這個我真的踩過)。
以下是用 AWS 建構相同功能時的概算比較。
服務AWS 架構(月費概算)0 元架構主機託管CloudFront + S3: ~$1GitHub Pages: $0資料庫RDS t3.micro: ~$15Drift(瀏覽器內): $0認證Cognito: ~$0(最多 5 萬 MAU)不做認證: $0批次Lambda + EventBridge: ~$0.5GitHub Actions: $0郵件SES: ~$0.1Formspree: $0**合計~$16.6/月(~$200/年)$0對個人開發的規模來說,就算使用 AWS 也不是什麼大錢,但「是 0 元」這件事本身就是持續下去的保險**。就算忙到半年沒碰,也不必擔心會產生費用,這種安心感非常大。
除了 0 元之外,另一個重要重點是維運方便。
個人開發最大的敵人是「營運上的麻煩」。需要手動部署、需要手動更新資料——這些營運負擔會直接導致動力下降。
我的產品把以下項目全部自動化了。
營運任務自動化方式頻率建置與部署GitHub Actions(push 觸發)每次 push預約發文公開GitHub Actions(cron)每日Qiita 文章擷取建置時 API fetch每日依賴套件更新Dependabot每週成本是零,維運也是零。 只要寫好文章並 push,後面就會全自動完成。
在營運成本 0 元的約束下持續開發後,我鍛鍊出了以下能力。
能力具體學習成本設計能精準掌握免費方案的上限與限制,並反映到設計中取捨判斷養成把「要放棄什麼、得到什麼」說清楚的習慣SSG 設計在無伺服器的限制內提供動態體驗的巧思CI/CD 設計只靠 GitHub Actions 就能組出批次處理、部署與通知的能力顧客視角提案能針對「想降低成本」的客戶需求,提出具體方案如果不是自由使用 AWS,這些能力原本不會學到。限制才是最好的教材。
層級可免費使用的服務限制主機託管GitHub Pages / Vercel / Cloudflare Pages靜態或 Serverless。不能常駐程序資料庫Supabase Free / 瀏覽器內 SQLite容量與連線數有上限認證NextAuth.js / Supabase Auth自行營運須自行負責批次GitHub Actions cron精準度有波動。最小 5 分鐘間隔郵件Formspree / Resend每月寄送數有上限如果你現在也覺得「做出來也沒辦法公開」,請一定要試試看這個架構。伺服器不需要花錢。公開的方法,比你想像中簡單得多。
只要踏出第一步,等著你的就不再是「做完就放著」,而是「做出來並送達」的截然不同風景。
📌 相關文章
原文出處:https://qiita.com/teppei19980914/items/3c744bb8fd71dc4550af