不要把 macOS 當 production host
$ architecture --target production-lite
✓ Mac mini M4
└─ Ubuntu 24.04 LTS ARM64 VM
├─ Docker Engine
├─ Coolify
├─ Next.js standalone container
├─ Supabase self-host stack
└─ cloudflared tunnel
! Do not expose:
- Postgres 5432
- Supabase Studio
- Coolify admin
- service_role key
✓ Recommended edge:
Cloudflare Tunnel + Access
pfSense for VLAN / firewallMac mini M4 可以跑這套架構,但服務層應該放在 Ubuntu VM 裡。macOS 保留作為硬體宿主與開發環境,不直接承擔 production Docker workload。
Mac mini M4
└── Ubuntu 24.04 LTS ARM64 VM
├── Docker Engine
├── Coolify
├── Next.js app
├── Supabase self-host
└── cloudflared / reverse proxyCore Decision
對外入口
第一階段用 Cloudflare Tunnel。它不需要開 80/443 inbound,也不需要固定 IP,適合家用或工作室網路。
Security
內網治理
pfSense 負責 VLAN、防火牆、固定 IP、server-to-LAN 限制,不一定要做 public reverse proxy。
Runtime
Next.js
使用 standalone Docker output,透過 Coolify 從 GitHub 自動 build / deploy。
Database
Supabase
自架後你要自己負責 Postgres、備份、還原、升級、監控與安全設定。
推薦架構
把 public edge、app runtime、database、admin surface 分層。不要把所有東西直接暴露在 WAN。
Cloudflare
DNS · WAF · Access · Tunnel
cloudflared
Outbound-only connection from Ubuntu VM
Coolify Proxy
Route app / API / admin services
Next.js
Standalone production container
Supabase
Kong · Auth · Storage · Postgres
Public
app.domain.com
Next.js app。這是唯一真正面向使用者的前端入口。
API
api.domain.com
Supabase API / Kong。前端只使用 publishable key,不使用 service_role。
Protected
studio / coolify
Supabase Studio 與 Coolify Admin 應加 Cloudflare Access、VPN 或 IP allowlist。
Mac mini M4 資源配置
M4 性能不是主要問題。真正的限制是 RAM、SSD、備份、網路穩定性、斷電處理。
| 項目 | 最低可跑 | 建議配置 | 判斷 |
|---|---|---|---|
| RAM | 16GB | 24GB / 32GB+ | 16GB 可跑,但 Supabase + Coolify + build 會緊。 |
| VM CPU | 2 cores | 4–6 cores | Next.js build 與 Supabase container 會吃 CPU。 |
| VM RAM | 8GB | 12–20GB | Supabase 自架不適合極限壓 RAM。 |
| Disk | 80GB | 150–300GB SSD | Postgres、Storage、Docker images、backup 都會成長。 |
| OS | Ubuntu ARM64 | Ubuntu 24.04 LTS ARM64 | Coolify 應跑在 Linux VM,不建議直接用 macOS Docker Desktop。 |
pfSense vs Cloudflare Tunnel
不是二選一。最實際是 Cloudflare Tunnel 對外,pfSense 管內網。
Cloudflare Tunnel
Best for first stage
適合沒有固定 IP、CGNAT、想快速上線、想避免開 inbound port 的情境。
不需要公開 80/443 inbound
Origin IP 不直接暴露
可用 Cloudflare Access 保護管理介面
適合小型 SaaS、demo、內部工具、AI app prototype
pfSense Reverse Proxy
For controlled edge
適合你有固定 public IP,且願意自己維護 HAProxy、ACME、NAT、Firewall rules。
入口流量完全由你控制
可整合 VLAN、內網分區、防火牆策略
不依賴 Cloudflare Tunnel
適合更長期、可控的 network edge
Domain 規劃
每個面向用獨立 hostname,權限與防護才清楚。
| Hostname | 用途 | 公開程度 | 防護 |
|---|---|---|---|
| app.domain.com | Next.js Web App | 公開 | Cloudflare WAF / cache rules / rate limits |
| api.domain.com | Supabase API / Kong | 公開但受控 | RLS、JWT、CORS、API rules |
| studio.domain.com | Supabase Studio | 不公開 | Cloudflare Access / VPN / IP allowlist |
| coolify.domain.com | Coolify Admin | 不公開 | Cloudflare Access / VPN / IP allowlist |
Claude Code 工作流
Claude Code 放在開發端,不直接碰 production server。所有變更透過 Git、PR、commit、Coolify deploy。
本機開發
Claude Code 修改 Next.js、SQL migration、Dockerfile、README、CLAUDE.md。
Git Review
所有變更 commit 到 GitHub。schema change 必須以 SQL migration 呈現。
Coolify Deploy
Coolify 從 GitHub build / deploy Next.js container,不讓 AI 直接 SSH 改 production。
# CLAUDE.md 建議規則
- Framework: Next.js App Router + TypeScript
- Styling: Tailwind CSS
- Backend: Self-hosted Supabase
- Do not expose service_role key to client code
- Use server actions or route handlers for privileged operations
- All schema changes must be written as SQL migrations
- Do not modify production secrets
- Do not run destructive database commands without explicit reviewSupabase 自架注意事項
自架 Supabase 的代價不是安裝,而是維運。尤其是 Postgres、backup、restore、RLS。
Production 基本要求
Must have
所有 table 啟用 RLS
service_role 僅 server-side 使用
自訂 SMTP
Auth redirect URL 正確設定
每日備份,且離機保存
還原流程要實測
最小可行部署 Checklist
照這個順序做,先跑穩,再擴充。
- 未完成:
Mac mini 安裝 Ubuntu ARM64 VM:VM 固定 CPU、RAM、Disk,不把 production service 直接跑在 macOS。
- 未完成:
VM 固定 LAN IP:用 pfSense DHCP static lease 或直接固定 IP。
- 未完成:
安裝 Docker Engine + Compose:不要用 snap 版 Docker。
- 未完成:
安裝 Coolify:用來部署 Next.js app 與管理服務容器。
- 未完成:
建立 Cloudflare Tunnel:將 app、api、studio、coolify 對應到不同 hostname。
- 未完成:
部署 Supabase self-host stack:修改所有 secrets、JWT、dashboard password、Postgres password。
- 未完成:
部署 Next.js app:使用 standalone output 與 Dockerfile,透過 Coolify 從 GitHub 部署。
- 未完成:
保護管理介面:studio.domain.com 與 coolify.domain.com 加 Cloudflare Access / VPN / allowlist。
- 未完成:
設定備份與還原演練:Postgres backup 不只要產生檔案,還要確認能 restore。
- 未完成:
加監控:監控 uptime、disk、memory、container restart、backup status。
最終建議
這是目前最適合你的成本、風險、維護負擔平衡點。
Cloudflare Tunnel 對外,pfSense 管內網,Coolify 管部署,Supabase 獨立維運。
Cloudflare
├── app.domain.com → Tunnel → Coolify → Next.js
├── api.domain.com → Tunnel → Supabase Kong/API
├── studio.domain.com → Cloudflare Access → Supabase Studio
└── coolify.domain.com → Cloudflare Access → Coolify
pfSense
├── Server VLAN
├── Admin device allowlist
├── Block inbound WAN
├── Allow outbound cloudflared
└── Restrict server-to-LAN traffic
Mac mini M4
└── Ubuntu VM
├── Coolify
├── Next.js container
├── Supabase compose stack
├── backup script
└── monitoringStatic HTML architecture guide · Mac mini M4 self-host stack · Generated for direct local use.