iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
自我挑戰組

我獨自開發 - Supabase 打造全端應用系列 第 7

第七關 - Supabase 自部署:打造專屬的後端服務

  • 分享至 

  • xImage
  •  

封面

除了使用 Supabase 官方雲端平台,你也可以選擇在自己的伺服器上部署 Supabase!這就像是把整個 Supabase 搬到你自己家裡,完全由你掌控。今天要介紹如何使用 Docker 來自部署 Supabase,讓你擁有完整的控制權和隱私保護。

為什麼要選擇自部署?

在決定是否要自部署之前,讓我們先了解自部署的優缺點:

自部署的優勢

  • 完全控制權:你可以完全掌控資料和服務,不用擔心第三方平台的政策變更
  • 資料隱私:敏感資料完全保存在你自己的伺服器上
  • 成本考量:對於大型專案,自部署可能比雲端服務更經濟
  • 客製化需求:可以根據特殊需求調整設定和功能

需要考慮的挑戰

  • 技術門檻:需要一定的伺服器管理和 Docker 知識
  • 維護責任:系統更新、備份、監控都需要自己處理
  • 硬體成本:需要準備適當的伺服器硬體或雲端主機

系統需求

在開始之前,確保你的系統符合以下要求:

硬體需求

  • 記憶體:至少 4GB RAM(建議 8GB 以上)
  • 儲存空間:至少 20GB 可用空間
  • 處理器:現代多核心 CPU

軟體需求

  • Docker:版本 20.10 或更新
  • Docker Compose:版本 2.0 或更新
  • Git:用於下載 Supabase 原始碼

推薦

使用 Zeabur 服務,有提供 Supabase 一鍵部署的模板功能,可以更好理解運行機制,也可以參考 Zeabur 的教學:How to Deploy Supabase on Zeabur,而且 Zeabur 可以依照使用量付費,對於小型專案來說非常划算。我曾在群組提出成本問題,後來 CEO 貼文有相關資訊,可以參考這篇:成功把 Zeabur 的 Supabase 模板的成本打下來

1. 使用 Docker 部署 Supabase

步驟 1:下載 Supabase 原始碼

首先,我們需要從 GitHub 下載 Supabase 的官方原始碼:

# 下載 Supabase 原始碼
git clone --depth 1 https://github.com/supabase/supabase

# 進入 Docker 目錄
cd supabase/docker

步驟 2:設定環境變數

複製範例環境設定檔:

# 複製環境變數範例檔案
cp .env.example .env

編輯 .env 檔案,設定重要的環境變數:

# 編輯環境變數檔案
vi .env

步驟 3:重要環境變數說明

以下是一些關鍵的環境變數,你需要根據自己的需求進行調整:

資料庫設定

# PostgreSQL 資料庫密碼(請設定強密碼)
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password

# 資料庫連接埠
POSTGRES_PORT=5432

JWT 密鑰設定

# 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

步驟 4:啟動 Supabase

設定完成後,使用 Docker Compose 啟動所有服務:

# 拉取最新的 Docker 映像檔
docker compose pull

# 啟動所有 Supabase 服務
docker-compose up -d

這個指令會啟動以下服務:

  • PostgreSQL:資料庫服務
  • PostgREST:自動生成的 REST API
  • GoTrue:身份驗證服務
  • Realtime:即時功能服務
  • Storage:檔案儲存服務
  • Kong:API 閘道
  • Supabase Studio:管理介面

步驟 5:驗證部署

檢查所有服務是否正常運行:

# 查看所有容器狀態
docker-compose ps

# 查看服務日誌
docker-compose logs

如果一切正常,你應該能夠:

  • http://localhost:3000 存取 Supabase Studio 管理介面
  • http://localhost:8000 存取 API 端點

2. 身份驗證設定

基本身份驗證設定

編輯 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"

3. 即時功能設定

基本即時功能設定

編輯 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

4. 常見問題與解決方案

問題 1:容器啟動失敗

症狀:執行 docker-compose up 時某些容器無法啟動

解決方案

# 檢查日誌找出問題
docker-compose logs [服務名稱]

# 重新建立容器
docker-compose down
docker-compose up -d --force-recreate

問題 2:無法存取管理介面

症狀:無法開啟 http://localhost:3000

解決方案

  1. 檢查防火牆設定
  2. 確認連接埠沒有被其他服務佔用
  3. 檢查 .env 檔案中的 URL 設定

問題 3:資料庫連線問題

症狀:API 無法連接到資料庫

解決方案

# 檢查資料庫容器狀態
docker-compose ps db

# 檢查資料庫日誌
docker-compose logs db

# 測試資料庫連線
docker-compose exec db psql -U postgres

5. 生產環境部署建議

安全性設定

  1. 更改預設密碼:確保所有預設密碼都已更改
  2. 使用 HTTPS:在生產環境中務必使用 SSL 憑證
  3. 限制網路存取:使用防火牆限制不必要的連接埠存取
  4. 定期更新:保持 Docker 映像檔和系統的最新狀態

備份策略

# 資料庫備份
docker-compose exec db pg_dump -U postgres postgres > backup.sql

# 還原資料庫
docker-compose exec -T db psql -U postgres postgres < backup.sql

監控設定

建議設定以下監控:

  • 容器健康狀態監控
  • 資料庫效能監控
  • 磁碟空間監控
  • 記憶體使用監控

6. 更新和維護

更新 Supabase

# 停止服務
docker-compose down

# 更新原始碼
git pull origin main

# 更新 Docker 映像檔
docker-compose pull

# 重新啟動服務
docker-compose up -d

定期維護

  1. 清理未使用的 Docker 映像檔
docker system prune -a
  1. 監控磁碟空間
df -h
  1. 檢查容器日誌大小
docker-compose logs --tail=100

小結

自部署 Supabase 讓你擁有完整的控制權和隱私保護,但也需要承擔更多的技術責任。透過 Docker 的容器化技術,部署過程變得相對簡單,但仍需要注意安全性、備份和監控等重要面向。

選擇自部署還是雲端服務,主要取決於你的技術能力、資源預算和特殊需求。如果你有足夠的技術背景和維護能力,自部署可以為你帶來更大的靈活性和控制權。

... to be continued

有任何想討論歡迎留言,或需要指正的地方請鞭大力一點,歡迎訂閱、按讚加分享,分享給想要提升開發效率的朋友~


上一篇
第六關 - Supabase CLI 常用指令大全
系列文
我獨自開發 - Supabase 打造全端應用7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言