deploy
Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs,
它会碰到什么
这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。
技能内容
Elixir/Phoenix Deployment Reference
Quick reference for deploying Elixir/Phoenix applications.
Iron Laws — Never Violate These
- Config at runtime, not compile time — Secrets in
config.exsget baked into the release binary. Useruntime.exswith env vars so secrets are resolved at boot - Graceful shutdown ≥ 60 seconds — Shorter timeouts kill in-flight requests and WebSocket connections mid-operation, causing data loss for users
- Health checks required — Without startup/liveness/readiness endpoints, orchestrators can't distinguish a booting node from a dead one, leading to cascading restarts
- SSL verification for database — Skipping
verify: :verify_peerallows MITM attacks between your app and database; production data traverses the connection - No CPU limits — The BEAM scheduler assumes it owns all cores; cgroups CPU limits cause scheduler collapse where the VM thinks it has more cores than it can use, leading to latency spikes
- Guard optional service credentials —
runtime.exsruns whenever a
release boots, including eval-based migration commands. Only require S3,
Redis, and similar credentials when that integration is enabled
Quick Configuration
runtime.exs (Essential)
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
Guard Optional Services
Keep core boot secrets such as DATABASE_URL and SECRET_KEY_BASE required.
Gate credentials for optional integrations behind the same feature switch that
enables the integration:
s3_config =
if System.get_env("STORAGE_BACKEND") == "s3" do
[
access_key_id:
System.get_env("S3_ACCESS_KEY") ||
raise("S3_ACCESS_KEY is required when STORAGE_BACKEND=s3"),
secret_access_key:
System.get_env("S3_SECRET_KEY") ||
raise("S3_SECRET_KEY is required when STORAGE_BACKEND=s3")
]
else
[]
end
config :my_app, :s3_config, s3_config
This lets release tasks that do not use S3 start without S3 credentials while
still failing fast when S3 is selected.
Health Check Plug
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
Quick Decisions
Platform Choice
| Need | Use |
|------|-----|
| Simple, managed | Fly.io |
| Enterprise, existing K8s | Kubernetes |
| Custom infrastructure | Docker + your orchestrator |
Resource Limits
| Resource | Recommendation |
|----------|----------------|
| CPU | NO LIMITS (BEAM scheduler issues) |
| Memory | Set limits (256Mi-512Mi typical) |
| Graceful shutdown | ≥ 60 seconds |
Deployment Checklist
- [ ] All secrets from environment variables in runtime.exs
- [ ] Optional service credentials required only when their integration is enabled
- [ ]
server: truein endpoint config - [ ] SSL verification for database connections
- [ ] Health endpoints: /health/startup, /health/liveness, /health/readiness
- [ ] Graceful shutdown period ≥ 60 seconds
- [ ] No CPU limits (memory limits only)
- [ ] Migrations in deploy process
Asset Pipeline Notes
Phoenix 1.8 uses esbuild + tailwind (no Node.js required):
- Config in
config/config.exsunder:esbuildand:tailwind mix assets.deploybuilds for productionmix assets.setupinstalls binaries on first run- Custom JS bundlers: configure in
config/config.exs
References
For detailed patterns, see:
references/docker-config.md- Multi-stage Dockerfile, best practicesreferences/flyio-config.md- fly.toml, clustering, commands
想直接用这个技能?
本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。
同名技能的其他版本
有 6 个不同仓库或目录里都有叫 deploy 的技能。它们内容并不相同,别混用:
- oliver-kriska/claude-elixir-phoenix — Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs, mix release, rel/
- oliver-kriska/claude-elixir-phoenix — Elixir/Phoenix deployment patterns — Dockerfile, fly.toml; Use when configuring
- oliver-kriska/claude-elixir-phoenix — Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs,
- oliver-kriska/claude-elixir-phoenix — Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs,
- oliver-kriska/claude-elixir-phoenix — Elixir/Phoenix deployment patterns — Dockerfile, fly.toml, runtime.exs,