M4 Mac mini · Coolify · Supabase · Next.js

Mac mini M4 自架 App Server 架構指南

用 Mac mini 跑 Coolify、部署 Next.js、搭配 Claude Code 開發,並自架 Supabase。核心決策是:用 Linux VM 承載服務,用 Cloudflare Tunnel 對外,用 pfSense 管內網安全。

$ 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 / firewall
Recommended

不要把 macOS 當 production host

Mac 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 proxy
Core 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 管內網。

Best for first stage

Cloudflare Tunnel

適合沒有固定 IP、CGNAT、想快速上線、想避免開 inbound port 的情境。

  • 不需要公開 80/443 inbound
  • Origin IP 不直接暴露
  • 可用 Cloudflare Access 保護管理介面
  • 適合小型 SaaS、demo、內部工具、AI app prototype
  • 依賴 Cloudflare 帳號、Tunnel、DNS 與 Access 設定
  • Debug 會多一層代理路徑
For controlled edge

pfSense Reverse Proxy

適合你有固定 public IP,且願意自己維護 HAProxy、ACME、NAT、Firewall rules。

  • 入口流量完全由你控制
  • 可整合 VLAN、內網分區、防火牆策略
  • 不依賴 Cloudflare Tunnel
  • 適合更長期、可控的 network edge
  • 需要開 inbound port
  • 需要自行處理 WAF、rate limit、掃描、防護

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。

01

本機開發

Claude Code 修改 Next.js、SQL migration、Dockerfile、README、CLAUDE.md。

02

Git Review

所有變更 commit 到 GitHub。schema change 必須以 SQL migration 呈現。

03

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 review

Supabase 自架注意事項

自架 Supabase 的代價不是安裝,而是維運。尤其是 Postgres、backup、restore、RLS。

Must have

Production 基本要求

  • 所有 table 啟用 RLS
  • service_role 僅 server-side 使用
  • 自訂 SMTP
  • Auth redirect URL 正確設定
  • 每日備份,且離機保存
  • 還原流程要實測
Do not expose

不能公開的東西

  • Postgres 5432
  • Supabase Studio
  • Coolify Admin
  • service_role key
  • .env.example 預設密碼
  • Docker socket

最小可行部署 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 └── monitoring