Phoenix und Elixir
Deploye Phoenix mit Postgres, ClickHouse oder Redis, Oban-Workers und Migrationen über den Release.
Schritt für Schritt: Phoenix auf DigitalOcean deployen · Phoenix auf Hetzner deployen · Phoenix auf Vultr deployen · Phoenix auf OVHcloud deployen · Phoenix auf Scaleway deployen · Phoenix auf UpCloud deployen
- Datenspeicher aus
mix.exs:ecto_sql/postgrex→ Postgres,ecto_ch/ch→ ClickHouse,redix→ Redis. - Migrationen:
mix ecto.migrate. Kompilierte Releases haben zur Laufzeit keinmix, daher findet Railyard den Release dort, wo das Image ihn ablegt, und führt dessen Migrator aus (bin/migrate, falls vorhanden, sonstbin/<app> eval).mix phx.serverwird genauso zubin/<app> start. - Variablen, die in
config/runtime.exsgelesen werden (BASE_URL,HTTP_PORT,LISTEN_IP,DATABASE_URL,CLICKHOUSE_DATABASE_URL…), werden automatisch verdrahtet;SECRET_KEY_BASEwird generiert. MIX_ENV=produndPHX_SERVER=truewerden gesetzt.
Background-Jobs brauchen meist keinen zweiten Prozess
Die meisten Elixir-Apps führen Jobs mit Oban aus — einer Postgres-basierten Queue, die aus demselben Supervision-Tree wie der Web-Endpunkt startet, läuft sie bereits in dem Moment, in dem web bootet, ohne einen separaten Worker zu deklarieren oder zu skalieren. Das ist trotzdem das 12-Factor-Modell: Der Job-Runner ist nur eine der Rollen, die dein einzelner OTP-Release bereits spielt, kein zweites Deployable, das mit dem ersten synchron gehalten werden muss.
Wenn du doch einen eigenen Worker-Node willst — um die Job-Verarbeitung auf einen eigenen Prozess auszulagern, damit eine langsame Queue keine Web-Requests ausbremsen kann — deklariere ihn in einem Procfile und lass deinen Release ein Flag oder eine Env-Variable lesen, um den Start des Endpunkts zu überspringen:
web: bin/my_app start
worker: bin/my_app eval "MyApp.Release.worker()"
Füge Prozesse im Workers-Tab der App hinzu oder bearbeite sie, ohne das Repo zu ändern, und skaliere beides über die CLI:
railyard scale my-app worker=2
Konfiguration und Secrets
Alles, was config/runtime.exs mit System.get_env/2 liest, ist eine einfache Variable: setze sie unter Variables, oder per railyard env:set my-app KEY=VALUE über die CLI, und derselbe kompilierte Release läuft unverändert von Staging bis Produktion — Dev/Prod-Parität statt eines eigenen Builds pro Umgebung. Verweise mit ${{redis.RAILYARD_PRIVATE_URL}} auf eine Datenbank, ein ClickHouse oder Redis, das als eigener Service auf dem Canvas läuft — wird pro Umgebung aufgelöst. Siehe Variablen und Secrets.
Deployen
- Aus einem Repo: füge die Git-URL ein, oder wähle es aus der Liste, sobald GitHub verbunden ist — Railyard liest
mix.exs, trägtecto.migrate, die bereitgestellte Datenbank undSECRET_KEY_BASEein und deployt bei jedem Push. - Über die CLI:
railyard create my-app https://github.com/me/my-app --addons postgres, oderrailyard git:remote && git push railyard mainim Repo. - Mit einem Klick: füge den Deploy-Button zu deiner README hinzu, oder veröffentliche im Template-Katalog, damit jeder es mit bereits ausgefüllten Addons und Variablen starten kann.