The BEAM changes the hosting math
Elixir runs on the BEAM (the Erlang VM), and that changes what you want from a host. Phoenix LiveView keeps a WebSocket open per user, so you need infrastructure that's comfortable with many long-lived connections. Distributed Elixir clustering wants nodes that can discover and talk to each other. And because the BEAM is so good at concurrency, a single modest instance can serve a lot — but scale-to-zero is actively bad for stateful, connection-heavy apps.
What matters for Elixir/Phoenix
- WebSocket support with no aggressive idle timeouts (LiveView depends on it).
- Stable, long-running instances — scale-to-zero kills LiveView sessions.
- Clustering support if you use distributed Elixir, libcluster, or Phoenix PubSub across nodes.
- Releases support (
mix release) for clean, self-contained deploys.
The options
| Platform | WebSockets | Clustering | Scale-to-zero impact | Notes |
|---|---|---|---|---|
| Fly.io | Yes | Good (private net) | Auto-stop optional | Popular Elixir choice |
| Gigalixir | Yes | Yes (hot upgrades) | No | Elixir-specific PaaS |
| Render / Railway | Yes | Limited | Varies | Easy deploys |
| AWS/GCP/Azure | Yes | DIY | Some | Full control |
| PandaStack | Yes | Single-node simple | Avoid on free tier | GKE + managed DB |
Gigalixir and Fly.io
Gigalixir is built for Elixir, supporting clustering and even hot code upgrades — the most BEAM-aware host available. Fly.io is hugely popular in the Elixir community thanks to easy private networking for clustering and good docs for Phoenix. If clustering and LiveView at scale are central to your app, start with one of these.
Where PandaStack fits
PandaStack deploys Phoenix from a Dockerfile (a mix release in a multi-stage build), runs it on GKE, and serves WebSockets through Kong ingress — so LiveView works. A managed Postgres is wired in via DATABASE_URL, which Ecto reads directly.
FROM elixir:1-otp-27 AS build
ENV MIX_ENV=prod
WORKDIR /app
RUN mix local.hex --force && mix local.rebar --force
COPY mix.exs mix.lock ./
RUN mix deps.get --only prod && mix deps.compile
COPY . .
RUN mix release
FROM debian:bookworm-slim
WORKDIR /app
COPY --from=build /app/_build/prod/rel/myapp ./
ENV PORT=4000
CMD ["bin/myapp", "start"]The important honesty here: do not run a LiveView app on free-tier scale-to-zero. Our free tier uses KEDA scale-to-zero on spot nodes, which is great for stateless HTTP but wrong for Phoenix's persistent connections — idling to zero would drop every LiveView socket. For Phoenix, run on a paid tier with a warm, always-on instance.
Also honest: PandaStack is oriented toward single-instance app deployments with horizontal scaling, not BEAM distributed clustering with node discovery. If your architecture relies on libcluster, multi-node Phoenix PubSub, or hot upgrades, Gigalixir or a hand-managed Fly cluster will serve you better. PandaStack is a great fit for the very common case: a single (or horizontally scaled, stateless-PubSub-via-Redis) Phoenix app that needs a managed Postgres, WebSockets, custom domains, and SSL without infra work.
Tip: use Redis PubSub for multi-instance
If you scale Phoenix horizontally on a platform without BEAM clustering, swap the PubSub adapter to Redis so broadcasts reach all instances:
config :myapp, MyApp.PubSub,
adapter: Phoenix.PubSub.Redis,
url: System.get_env("REDIS_URL")PandaStack offers managed Redis, which makes this straightforward.
Decision guide
- Clustering + hot upgrades → Gigalixir.
- LiveView at scale with private networking → Fly.io.
- Single/stateless-scaled Phoenix + managed Postgres/Redis → PandaStack (paid tier, warm instance).
References
- Phoenix Framework: https://hexdocs.pm/phoenix/
- Elixir releases: https://hexdocs.pm/mix/Mix.Tasks.Release.html
- libcluster: https://hexdocs.pm/libcluster/
- Phoenix.PubSub: https://hexdocs.pm/phoenix_pubsub/
- Fly.io Elixir guide: https://fly.io/docs/elixir/
---
Running a single Phoenix app that needs WebSockets, a managed Postgres, and Redis PubSub? PandaStack handles all three — run it warm on a paid tier. Explore the free tier first at https://dashboard.pandastack.io