人生就是不斷學習,調整與更新持續前進。

Linux Ubuntu設置技巧 - Cloudflare+Rails Kamal V1

這是一個非常強大且現代的組合!當你使用 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 的流量。

YAML
 
# 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 錯誤。

Ruby
 
config.hosts << "your-domain.com"
config.hosts << "www.your-domain.com"

B. 處理 assume_ssl (重要)

如果 Cloudflare 用 HTTP 跟你的伺服器通訊(或是為了確保 Rails 正確辨識協議),請在 production.rb 加入:

Ruby
 
# 讓 Rails 相信來自 Proxy 的 X-Forwarded-Proto Header
config.assume_ssl = true

4. 常見坑點排查 (Troubleshooting)

現象 原因 解決方法 ERR_TOO_MANY_REDIRECTS Cloudflare SSL 設為 Flexible,但 Rails 強制導向 HTTPS。 將 Cloudflare SSL 設為 Full,或在 Rails 關閉 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 是否正確。

💡 為什麼這個組合很棒?

  1. 免維護 SSL:你不需要在 Ubuntu 裝 Certbot,Cloudflare 會幫你搞定證書。

  2. 節省效能:Nginx 的負擔移到了雲端,伺服器記憶體可以多留給 Rails 給 Sidekiq。

  3. 安全性:Cloudflare 幫你擋掉 DDoS 和惡意掃描,你的伺服器 IP 隱藏在小橘雲後面。


給讀者的技術建議:

如果你希望安全性更高,可以在 Ubuntu 上安裝 authenticated origin pull 憑證,確保只有來自 Cloudflare 的請求能進入你的 80/443 埠。


這份範本結合了你目前的開發情境(Cloudflare + Kamal + Ubuntu),對於想簡化部署流程的人來說非常有參考價值。