除了使用 Supabase 官方雲端平台,你也可以選擇在自己的伺服器上部署 Supabase!這就像是把整個 Supabase 搬到你自己家裡,完全由你掌控。今天要介紹如何使用 Docker 來自部署 Supabase,讓你擁有完整的控制權和隱私保護。
在決定是否要自部署之前,讓我們先了解自部署的優缺點:
在開始之前,確保你的系統符合以下要求:
使用 Zeabur 服務,有提供 Supabase 一鍵部署的模板功能,可以更好理解運行機制,也可以參考 Zeabur 的教學:How to Deploy Supabase on Zeabur,而且 Zeabur 可以依照使用量付費,對於小型專案來說非常划算。我曾在群組提出成本問題,後來 CEO 貼文有相關資訊,可以參考這篇:成功把 Zeabur 的 Supabase 模板的成本打下來。
首先,我們需要從 GitHub 下載 Supabase 的官方原始碼:
# 下載 Supabase 原始碼
git clone --depth 1 https://github.com/supabase/supabase
# 進入 Docker 目錄
cd supabase/docker
複製範例環境設定檔:
# 複製環境變數範例檔案
cp .env.example .env
編輯 .env
檔案,設定重要的環境變數:
# 編輯環境變數檔案
vi .env
以下是一些關鍵的環境變數,你需要根據自己的需求進行調整:
# PostgreSQL 資料庫密碼(請設定強密碼)
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password
# 資料庫連接埠
POSTGRES_PORT=5432
# JWT 密鑰(用於身份驗證,請使用強密鑰)
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
# ANON 金鑰(匿名存取金鑰)
ANON_KEY=your-anon-key
# SERVICE ROLE 金鑰(服務角色金鑰,具有完整權限)
SERVICE_ROLE_KEY=your-service-role-key
設定完成後,使用 Docker Compose 啟動所有服務:
# 拉取最新的 Docker 映像檔
docker compose pull
# 啟動所有 Supabase 服務
docker-compose up -d
這個指令會啟動以下服務:
檢查所有服務是否正常運行:
# 查看所有容器狀態
docker-compose ps
# 查看服務日誌
docker-compose logs
如果一切正常,你應該能夠:
http://localhost:3000
存取 Supabase Studio 管理介面http://localhost:8000
存取 API 端點編輯 config/auth.yml
檔案來設定身份驗證:
# config/auth.yml
site_url: "http://localhost:3000"
uri_allow_list: ["http://localhost:3000"]
# JWT 設定
jwt_secret: "your-super-secret-jwt-token"
jwt_exp: 3600
# 密碼設定
password_min_length: 6
# 電子郵件設定
enable_signup: true
enable_email_confirmations: false
enable_email_autoconfirm: true
如果你想要啟用 Google、GitHub 等社交登入,需要在 config/auth.yml
中新增:
# Google OAuth 設定
external:
google:
enabled: true
client_id: "your-google-client-id"
secret: "your-google-client-secret"
redirect_uri: "http://localhost:8000/auth/v1/callback"
# GitHub OAuth 設定
github:
enabled: true
client_id: "your-github-client-id"
secret: "your-github-client-secret"
redirect_uri: "http://localhost:8000/auth/v1/callback"
如果你想要啟用電子郵件功能(如註冊確認、密碼重設),需要設定 SMTP:
# SMTP 設定
smtp:
host: "smtp.gmail.com"
port: 587
user: "your-email@gmail.com"
pass: "your-app-password"
admin_email: "admin@yourcompany.com"
sender_name: "Your App Name"
編輯 config/realtime.yml
來設定即時功能:
# config/realtime.yml
db_host: "db"
db_port: 5432
db_name: "postgres"
db_user: "postgres"
db_password: "your-postgres-password"
# 即時功能設定
max_connections: 100
jwt_secret: "your-super-secret-jwt-token"
# WebSocket 設定
websocket_timeout: 60000
# 廣播設定
broadcast:
enabled: true
max_channels: 100
# Presence 設定
presence:
enabled: true
max_users: 1000
# 資料庫變更監聽
postgres_changes:
enabled: true
max_changes: 100
症狀:執行 docker-compose up
時某些容器無法啟動
解決方案:
# 檢查日誌找出問題
docker-compose logs [服務名稱]
# 重新建立容器
docker-compose down
docker-compose up -d --force-recreate
症狀:無法開啟 http://localhost:3000
解決方案:
.env
檔案中的 URL 設定症狀:API 無法連接到資料庫
解決方案:
# 檢查資料庫容器狀態
docker-compose ps db
# 檢查資料庫日誌
docker-compose logs db
# 測試資料庫連線
docker-compose exec db psql -U postgres
# 資料庫備份
docker-compose exec db pg_dump -U postgres postgres > backup.sql
# 還原資料庫
docker-compose exec -T db psql -U postgres postgres < backup.sql
建議設定以下監控:
# 停止服務
docker-compose down
# 更新原始碼
git pull origin main
# 更新 Docker 映像檔
docker-compose pull
# 重新啟動服務
docker-compose up -d
docker system prune -a
df -h
docker-compose logs --tail=100
自部署 Supabase 讓你擁有完整的控制權和隱私保護,但也需要承擔更多的技術責任。透過 Docker 的容器化技術,部署過程變得相對簡單,但仍需要注意安全性、備份和監控等重要面向。
選擇自部署還是雲端服務,主要取決於你的技術能力、資源預算和特殊需求。如果你有足夠的技術背景和維護能力,自部署可以為你帶來更大的靈活性和控制權。
... to be continued
有任何想討論歡迎留言,或需要指正的地方請鞭大力一點,歡迎訂閱、按讚加分享,分享給想要提升開發效率的朋友~