[deploy · Elixir · Phoenix · LiveView · OTP]

Deploy Elixir / Phoenix LiveView to AWS in 5 minutes.

Push a Phoenix repo to Lander. Phoenix releases compile to a self-contained tarball, deploy to per-customer Fargate, LiveView WebSockets work out-of-the-box on Pro+.
$ deploy now →see pricingfree plan · no credit card · commercial use OK
[walkthrough · 5 minutes]
01

Generate a Phoenix release

`mix phx.gen.release --docker` creates a working Dockerfile + release config. The release runs without Erlang installed — just the compiled BEAM artifacts.
# in your Phoenix project root
mix phx.gen.release --docker
git add Dockerfile bin/server
git commit -m "Add release Dockerfile"
02

Set release env vars

Phoenix releases need: SECRET_KEY_BASE, DATABASE_URL, PHX_HOST, PHX_SERVER=true, PORT=80. Generate SECRET_KEY_BASE with `mix phx.gen.secret`.
03

Provision Postgres

Set LANDER_NEEDS_DB=1; Lander provisions RDS and exposes DATABASE_URL. Update your release migration command to run on each deploy via Lander's `release_command` env var.
04

Push and deploy

First deploy ~6 minutes (Erlang/OTP compile is slow). Subsequent deploys ~2 minutes thanks to CodeBuild layer caching.
[why · lander vs vercel · railway · render]
  • BEAM's per-process isolation + Lander's per-customer VPC = nested isolation. Compelling for compliance.
  • ARM64 Graviton2 — Erlang/OTP runs natively, perf is excellent.
  • WAF blocks WebSocket-targeted attacks at the ALB before Phoenix sees them.
[gotchas]
  • ·Phoenix LiveView needs sticky sessions on the ALB. Lander auto-enables this for Phoenix apps detected by /lib/_web/endpoint.ex.
  • ·If you use Oban for background jobs, the worker runs in the same Fargate task by default. For high-throughput, request a sidecar worker (Pro+).
  • ·DNS clusters across multiple Fargate tasks need libcluster — single-task deploys (Hobby) skip this.

5 minutes from clone to live URL.

no credit card · push from GitHub · real AWS underneath$ deploy now → lander.host