Skip to main content
An Elixir application runs on Sevalla as an application: Sevalla builds a Mix release from your Git repository, a self-contained folder with the compiled code and its own copy of the Erlang runtime, and runs it as processes. The web process serves HTTP with Phoenix or Plug, background workers run job queues, and jobs run Ecto migrations before each deployment.

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:
  1. The INGOT_ELIXIR_VERSION environment variable, or versions.elixir in ingot.json.
  2. The elixir line of .tool-versions, then mise’s configuration. The suffix of an asdf version such as 1.20.4-otp-29 names the Erlang/OTP release it was compiled for and doesn’t change the Elixir version.
  3. The elixir requirement in mix.exs.
A requirement such as "~> 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.
Version files are read from the build path, then from each folder above it up to the repository root. See Set the language version.

Build with a Dockerfile

A Dockerfile for an Elixir application on Sevalla builds the release in the official elixir 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.