From b44ab86fdb2cb6f540564b32778cd83d286a8ce8 Mon Sep 17 00:00:00 2001 From: Carsten Date: Wed, 22 Apr 2026 08:41:04 +0200 Subject: [PATCH] feat(server): phoenix release with migrate/rollback helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extended Server.Release with migrate/0 and rollback/2 so 'bin/server eval Server.Release.migrate' works from a released binary. Removed the phx.gen.release-generated rel/overlays/bin/server wrapper that hardcoded 'start' — it collided with the mix-release default dispatcher, blocking 'server version', 'server eval', etc. The 'migrate' overlay is kept (bin/migrate calls server eval under the hood). --- server/lib/server/release.ex | 27 ++++++++++++++++++++++++++- server/rel/overlays/bin/migrate | 5 +++++ server/rel/overlays/bin/migrate.bat | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100755 server/rel/overlays/bin/migrate create mode 100755 server/rel/overlays/bin/migrate.bat diff --git a/server/lib/server/release.ex b/server/lib/server/release.ex index 2ea8cf7..9e178e7 100644 --- a/server/lib/server/release.ex +++ b/server/lib/server/release.ex @@ -1,8 +1,12 @@ defmodule Server.Release do - @moduledoc "Convenience functions for IEx and future release tasks." + @moduledoc "Convenience functions for IEx and release-stage admin tasks." + + @app :server @doc "Create a host and print the plaintext token once." def register_host(name) do + load_app!() + case Server.Hosts.create_host(name) do {:ok, {host, token}} -> IO.puts("Host '#{host.name}' registered (id=#{host.id}).") @@ -15,4 +19,25 @@ defmodule Server.Release do {:error, cs} end end + + @doc "Run pending migrations. Invoke via: bin/server eval 'Server.Release.migrate()'" + def migrate do + load_app!() + + for repo <- repos() do + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true)) + end + end + + @doc "Roll back one step per repo." + def rollback(repo, version) do + load_app!() + {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version)) + end + + defp repos, do: Application.fetch_env!(@app, :ecto_repos) + + defp load_app! do + Application.load(@app) + end end diff --git a/server/rel/overlays/bin/migrate b/server/rel/overlays/bin/migrate new file mode 100755 index 0000000..a40d6cb --- /dev/null +++ b/server/rel/overlays/bin/migrate @@ -0,0 +1,5 @@ +#!/bin/sh +set -eu + +cd -P -- "$(dirname -- "$0")" +exec ./server eval Server.Release.migrate diff --git a/server/rel/overlays/bin/migrate.bat b/server/rel/overlays/bin/migrate.bat new file mode 100755 index 0000000..2522c2a --- /dev/null +++ b/server/rel/overlays/bin/migrate.bat @@ -0,0 +1 @@ +call "%~dp0\server" eval Server.Release.migrate