feat(server): phoenix release with migrate/rollback helpers

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).
This commit is contained in:
Carsten 2026-04-22 08:41:04 +02:00
parent 2ea5dd4b54
commit b44ab86fdb
3 changed files with 32 additions and 1 deletions

View file

@ -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

View file

@ -0,0 +1,5 @@
#!/bin/sh
set -eu
cd -P -- "$(dirname -- "$0")"
exec ./server eval Server.Release.migrate

View file

@ -0,0 +1 @@
call "%~dp0\server" eval Server.Release.migrate