name: 部署 description: Elixir/Phoenix 部署模式 - 发布版、Docker、Kubernetes、Fly.io。在生产环境部署时加载。
Elixir/Phoenix 部署参考
快速参考,用于部署 Elixir/Phoenix 应用程序。
铁律 — 永不违反
- 运行时配置,而非编译时配置 — 所有密钥在
runtime.exs中从环境变量获取 - 优雅关闭 ≥ 60 秒 — 让连接排空
- 健康检查必需 — 启动、存活、就绪端点
- 数据库 SSL 验证 —
ssl_opts: [verify: :verify_peer] - 不要设置 CPU 限制 — BEAM 调度器与 cgroups CPU 限制的问题
快速配置
runtime.exs(必需)
if config_env() == :prod do
database_url = System.get_env("DATABASE_URL") || raise "DATABASE_URL is required"
secret_key_base = System.get_env("SECRET_KEY_BASE") || raise "SECRET_KEY_BASE is required"
host = System.get_env("PHX_HOST") || raise "PHX_HOST is required"
config :my_app, MyApp.Repo,
url: database_url,
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
ssl: true,
ssl_opts: [verify: :verify_peer]
config :my_app, MyAppWeb.Endpoint,
url: [host: host, port: 443, scheme: "https"],
http: [ip: {0, 0, 0, 0}, port: String.to_integer(System.get_env("PORT") || "4000")],
secret_key_base: secret_key_base,
server: true
end
健康检查插件
def call(%{path_info: ["health", "readiness"]} = conn, _opts) do
case Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT 1", []) do
{:ok, _} -> send_resp(conn, 200, ~s({"status":"ok"})) |> halt()
{:error, _} -> send_resp(conn, 503, ~s({"status":"error"})) |> halt()
end
end
快速决策
平台选择
| 需求 | 使用 |
|---|---|
| 简单、托管 | Fly.io |
| 企业、现有 K8s | Kubernetes |
| 自定义基础设施 | Docker + 您的编排器 |
资源限制
| 资源 | 推荐 |
|---|---|
| CPU | 无限制(BEAM 调度器问题) |
| 内存 | 设置限制(通常 256Mi-512Mi) |
| 优雅关闭 | ≥ 60 秒 |
部署检查清单
- [ ] 所有密钥从环境变量在 runtime.exs 中
- [ ]
server: true在端点配置中 - [ ] 数据库连接的 SSL 验证
- [ ] 健康端点:/health/startup, /health/liveness, /health/readiness
- [ ] 优雅关闭周期 ≥ 60 秒
- [ ] 无 CPU 限制(仅内存限制)
- [ ] 部署过程中的迁移
资产管道说明
Phoenix 1.8 使用 esbuild + tailwind(无需 Node.js):
- 配置在
config/config.exs下:esbuild和:tailwind mix assets.deploy为生产构建mix assets.setup在首次运行时安装二进制文件- 自定义 JS 打包器:在
config/config.exs中配置
参考文献
关于详细模式,请参阅:
references/docker-config.md- 多阶段 Dockerfile,最佳实践references/kubernetes-config.md- 部署、探针、BEAM 特定references/flyio-config.md- fly.toml,集群,命令references/observability.md- 遥测、日志、Sentry、spanreferences/ci-templates.md- GitHub Actions 工作流,Claude Code 集成