這是一個非常強大且現代的組合!當你使用 Cloudflare (小橘雲 Proxy) 加上 Kamal,Cloudflare 幫你處理了最麻煩的 SSL 憑證與防護,而 Kamal 則負責在 Ubuntu 上管理容器。
☁️ Cloudflare + Kamal:打造最省心的 Rails 部署方案
當你的網域指向 Cloudflare,並開啟 Proxy 模式(小橘雲)時,Cloudflare 其實成了你的「雲端反向代理」。這時候,你的 Ubuntu 伺服器只需要專心跑 Kamal 管理的 Docker 容器即可。
1. Cloudflare 後台關鍵設定
在開始 kamal deploy 之前,請先確認 Cloudflare 的 SSL/TLS 設定:
-
建議模式:Full (Strict) 或 Full
-
如果選 Flexible,Cloudflare 會用 HTTP 訪問你的伺服器。這常導致 Rails 因為
force_ssl = true而判斷「不安全」,又把請求導向 HTTPS,造成瀏覽器顯示「重新導向次數過多」。
-
-
Edge Certificates:確保 Always Use HTTPS 開啟。
2. 完美 deploy.yml 設定範本
在這種架構下,伺服器不需要裝 Nginx,Kamal 的 proxy 設定會直接接收來自 Cloudflare 的流量。
# config/deploy.yml
service: my-rails-app
image: your-docker-hub-user/my-rails-app
servers:
web:
- 123.123.123.123 # 你的伺服器 IP
proxy:
# 讓 Kamal 直接接管 80 埠
host_port: 80
app_port: 3000
env:
clear:
# 告訴 Rails 我們是在 HTTPS 後面
RAILS_FORCE_SSL: "true"
RAILS_SERVE_STATIC_FILES: "true"
secret:
- RAILS_MASTER_KEY
3. Rails 應用程式的「關鍵適配」
這是最容易被忽略的一步。因為請求經過了 Cloudflare,Rails 需要知道「誰是可信任的代理」以及「原本的域名是什麼」。
A. 設定 config.hosts
在 config/environments/production.rb 中,你必須允許你的網域,否則會看到 Blocked host 錯誤。
config.hosts << "your-domain.com"
config.hosts << "www.your-domain.com"
B. 處理 assume_ssl (重要)
如果 Cloudflare 用 HTTP 跟你的伺服器通訊(或是為了確保 Rails 正確辨識協議),請在 production.rb 加入:
# 讓 Rails 相信來自 Proxy 的 X-Forwarded-Proto Header
config.assume_ssl = true
4. 常見坑點排查 (Troubleshooting)
force_ssl (不建議)。
Invalid Authenticity Token
CSRF 檢查失敗,因為 Rails 不信任 Cloudflare 的 Header。
確保 config.assume_ssl = true 已開啟。
521 Web Server Is Down
伺服器防火牆擋住了 Cloudflare。
sudo ufw allow 80/tcp;進階者可設定只允許 Cloudflare IP 段。
502 Bad Gateway
Kamal 容器還沒啟動完成。
使用 kamal details 檢查容器狀態,確認 app_port 是否正確。
💡 為什麼這個組合很棒?
-
免維護 SSL:你不需要在 Ubuntu 裝 Certbot,Cloudflare 會幫你搞定證書。
-
節省效能:Nginx 的負擔移到了雲端,伺服器記憶體可以多留給 Rails 給 Sidekiq。
-
安全性:Cloudflare 幫你擋掉 DDoS 和惡意掃描,你的伺服器 IP 隱藏在小橘雲後面。
給讀者的技術建議:
如果你希望安全性更高,可以在 Ubuntu 上安裝
authenticated origin pull憑證,確保只有來自 Cloudflare 的請求能進入你的 80/443 埠。
這份範本結合了你目前的開發情境(Cloudflare + Kamal + Ubuntu),對於想簡化部署流程的人來說非常有參考價值。