Framework guides
Phoenix
Deploy Phoenix 1.8 with Ecto and PostgreSQL, migrations in a job, and LiveView over WebSockets.
How Elixir applications run on Sevalla
Every process (web, worker, cron job and job) runs from the same image, each with its own start command. See Processes.
Pin the Elixir version
Ingot builds on Elixir 1.20 with Erlang/OTP 29, its default line, unless the project sets a version. It takes the Elixir version from the first of these that’s set:- The
INGOT_ELIXIR_VERSIONenvironment variable, orversions.elixiriningot.json. - The
elixirline of.tool-versions, then mise’s configuration. The suffix of an asdf version such as1.20.4-otp-29names the Erlang/OTP release it was compiled for and doesn’t change the Elixir version. - The
elixirrequirement inmix.exs.
"~> 1.20" in mix.exs allows 1.20 and later 1.x lines: Ingot builds on its default line when the requirement allows it, otherwise on the newest maintained line that does. "~> 1.20.0" keeps the build on the 1.20 line. A line builds on the official image of its newest release, such as elixir:1.20-otp-29, so every new build picks up its fixes. An exact release, such as 1.20.4-otp-29 in .tool-versions, stays on that release, and the build log warns that its image won’t receive security rebuilds. The build plan’s Elixir row shows the version and where it came from.
The Erlang/OTP release comes with the Elixir image: the newest one that has an official image for that Elixir version. If you pin erlang in .tool-versions or mise’s configuration, or in the -otp- suffix, Ingot compares it with the image’s:
- An older release builds, with a warning such as
Erlang/OTP 28 is pinned in .tool-versions, but the Elixir 1.20 image comes with OTP 29. - A newer release fails the build, for example
Erlang/OTP 30 is pinned in .tool-versions, but the Elixir 1.20 image comes with OTP 29: require a newer Elixir or pin an older Erlang/OTP.
Build with a Dockerfile
A Dockerfile for an Elixir application on Sevalla builds the release in the officialelixir image of the line you develop with, then copies only the release into debian:trixie-slim, the Debian release that image is built on, with the libraries the Erlang runtime loads and a /bin/sh for start commands and the web terminal. Phoenix generates one with mix phx.gen.release --docker; the Phoenix guide shows it adapted for Sevalla, running as a numeric non-root user with the release’s script as process 1, which handles SIGTERM itself.