檢視原始碼 部署簡介

一旦我們有了一個工作中的應用程式,我們就可以部署它。如果你尚未完成你的應用程式,不用擔心。只要照著啟動與執行指南創建一個基本的應用程式即可用來使用。

準備應用程式用於部署時,共有三個步驟

  • 處理應用程式的秘密
  • 編譯應用程式資產
  • 在執行環境中啟動伺服器

在本指南中,我們將學習如何在本地執行執行環境。你可以在本指南中使用相同的技術來在執行環境中執行應用程式,不過依據你的部署基礎架構,可能會需要額外的步驟。

我們在指南中也討論了四種不同的方法,說明部署到其他基礎架構的範例:使用Elixir 的版本搭配mix release使用 Gigalixir使用 Fly使用 Heroku。我們也在社群部署指南中放入了在其他平台上部署 Phoenix 的連結。最後,版本指南有一個你可以使用的範例 Dockerfile,如果你偏好使用容器技術進行部署的話。

讓我們一個一個來探索這些步驟。

處理應用程式的秘密

所有 Phoenix 應用程式都有必須保密的資料,例如執行環境資料庫的使用者名稱和密碼,以及 Phoenix 用來簽署和加密重要資訊的秘密。一般的建議是將這些資料保存在環境變數中,並將其載入到你的應用程式中。這是在config/runtime.exs 中完成的(以前為config/prod.secret.exsconfig/releases.exs),它負責從環境變數中載入秘密和組態。

因此,你需要確定在執行環境中設定了適當的相關變數

$ mix phx.gen.secret
REALLY_LONG_SECRET
$ export SECRET_KEY_BASE=REALLY_LONG_SECRET
$ export DATABASE_URL=ecto://USER:PASS@HOST/database

不要直接複製這些值,請根據mix phx.gen.secret的結果設定 SECRET_KEY_BASE 並根據你的資料庫位址設定DATABASE_URL

如果你出於某種原因不想依賴環境變數,你可以直接在你的config/runtime.exs中設定秘密,但請務必不要將檔案提交到你的版本控制系統中。

您的機密資訊安全妥善後,現在就來設定資源吧!

在執行這個步驟之前,我們需要做一些準備。由於我們將為生產環境做好所有準備,我們需要在該環境中執行一些設定,取得我們的相依套件並進行編譯。

$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

編譯您的應用程式資源

如果您有可編譯的資源,例如 JavaScript 和樣式表,才需要執行此步驟。預設情況下,Phoenix 使用 esbuild,但所有內容都封裝在 mix.exs 中定義的單一 mix assets.deploy 任務中。

$ MIX_ENV=prod mix assets.deploy
Check your digested files at "priv/static".

而這就結束了!Mix 任務會在預設情況下建置資源,然後使用快取明細檔產生摘要,好讓 Phoenix 能在生產環境中快速提供資源服務。

注意:如果您在您的本機電腦中執行上述任務,它會在 priv/static 中產生許多已摘要的資源。您可以透過執行 mix phx.digest.clean --all 來修剪它們。

請記住,如果您不小心忘記執行上述步驟,Phoenix 會顯示錯誤訊息。

$ PORT=4001 MIX_ENV=prod mix phx.server
10:50:18.732 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com
10:50:18.735 [error] Could not find static manifest at "my_app/_build/prod/lib/foo/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".

錯誤訊息很明確:它表示 Phoenix 無法找到一個靜態明細檔。只需執行上述指令修正它或者,如果您沒有在提供任何資源服務或是一點也不關心資源,您可以從您的設定檔中移除 cache_static_manifest 設定。

在生產環境中啟動您的伺服器

若要在生產環境中執行 Phoenix,我們需要在呼叫 mix phx.server 時設定 PORTMIX_ENV 環境變數。

$ PORT=4001 MIX_ENV=prod mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com

若要在分離模式中執行,讓 Phoenix 伺服器不斷執行,即使您關閉終端機。

$ PORT=4001 MIX_ENV=prod elixir --erl "-detached" -S mix phx.server

如果您收到錯誤訊息,請仔細閱讀並開啟一個錯誤回報,如果還是不清楚如何處理。

您也可以在互動式殼牌中執行您的應用程式

$ PORT=4001 MIX_ENV=prod iex -S mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com

將所有內容組合在一起

前面幾節說明了部署 Phoenix 應用程式所需的主要步驟。在實際操作中,您最終也會新增您自己的步驟。例如,如果您正在使用資料庫,您也會想要在啟動伺服器之前執行 mix ecto.migrate 來確保您的資料庫是最新的。

以下是一個您可以用作起點的腳本

# Initial setup
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

# Compile assets
$ MIX_ENV=prod mix assets.deploy

# Custom tasks (like DB migrations)
$ MIX_ENV=prod mix ecto.migrate

# Finally run the server
$ PORT=4001 MIX_ENV=prod mix phx.server

而這就結束了。接著,您可以使用我們的其中一個正式指南來部署

  • 使用 Elixir 的發布
  • 到 Gigalixir,一個以 Elixir 為主的服務平台(PaaS)。
  • Fly.io,一個 PaaS 可將伺服器部署在靠近您使用者的位置,並內建支援分散式功能
  • 以及 Heroku,其中一個最受歡迎的 PaaS。

社群部署指南

  • Render 提供一級支援給 Phoenix 應用程式。有許多說明文件可用於搭配 Mix 發行版、蒸餾器以及分布式 Elixir 叢集來主機 Phoenix。