writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
phoenix-opsPhoenix operations and deployment: releases, runtime configuration, clustering, libcluster, telemetry/logging, secrets, assets, background jobs, and production hardening on the BEAM.
Independent GitHub snapshot · Automated classification · Original documentation governs
Production-ready Phoenix apps rely on releases, runtime configuration, telemetry, clustering, and secure endpoints. The BEAM enables rolling restarts and supervision resilience when configured correctly.
MIX_ENV=prod PHX_SERVER=true mix assets.deploy
MIX_ENV=prod mix release
_build/prod/rel/my_app/bin/my_app eval "IO.puts(:os.type())"
_build/prod/rel/my_app/bin/my_app start
config/runtime.exs for env-driven settings:
config :my_app, MyApp.Repo,
url: System.fetch_env!("DATABASE_URL"),
pool_size: String.to_integer(System.get_env("POOL_SIZE", "10")),
ssl: true
config :my_app, MyAppWeb.Endpoint,
url: [host: System.fetch_env!("PHX_HOST"), port: 443, scheme: "https"],
http: [ip: {0,0,0,0}, port: String.to_integer(System.get_env("PORT", "4000"))],
secret_key_base: System.fetch_env!("SECRET_KEY_BASE"),
server: true
Secrets
SECRET_KEY_BASE with mix phx.gen.secret.Add libcluster for automatic node discovery:
# mix.exs deps
{:libcluster, "~> 3.3"},
{:phoenix_pubsub, "~> 2.1"},
# application.ex
topologies = [
dns_poll: [
strategy: Cluster.Strategy.DNSPoll,
config: [poll_interval: 5_000, query: "my-app.internal"],
connect: {:net_adm, :ping}
]
]
children = [
{Cluster.Supervisor, [topologies, [name: MyApp.ClusterSupervisor]]},
{Phoenix.PubSub, name: MyApp.PubSub},
MyAppWeb.Endpoint
]
Guidelines
secret_key_base across nodes for consistent session signing.opentelemetry_phoenix and opentelemetry_ecto for traces/metrics.Plug.Telemetry and LoggerJSON or structured logging.:telemetry_poller for VM stats (reductions, memory, schedulers).LOGGER_LEVEL=info in prod; use :debug only for troubleshooting.force_ssl), HSTS, secure cookies (same_site, secure), and proper content_security_policy.cors_plug for API origins.:max_request_line_length, :max_header_value_length).mix assets.deploy runs npm/tailwind/esbuild and digests assets.cache-control headers set in Endpoint.application.ex.mix deps.get --only prod, mix compile, mix assets.deploy, then mix release.Environment= secrets; add Restart=on-failure./health and /ready endpoints (Repo check + PubSub/Presence check).:telemetry_poller for scheduler utilization and memory.PHX_SERVER=true (endpoint won’t start).config/runtime.exs; relying on compile-time config for secrets.secret_key_base or per-node keys → invalid sessions after deploy.