defmodule MessageServer.Application do use Application require Logger @impl true def start(_type, _args) do server_id = get_server_id() port = get_port() servers = parse_servers() Logger.info("Starting MessageServer #{server_id} on port #{port}") Logger.info("Known servers: #{inspect(servers)}") children = [ {MessageServer.Storage, server_id} ] opts = [strategy: :one_for_one, name: MessageServer.Supervisor] Supervisor.start_link(children, opts) end @spec get_server_id() :: String.t() def get_server_id() do System.get_env("SERVER_ID") || raise "SERVER_ID is required" end @spec get_port() :: integer() def get_port() do System.get_env("PORT", "4000") |> String.to_integer() end @spec parse_servers() :: map() defp parse_servers() do System.get_env("SERVERS", "") |> String.split(",") |> Enum.reject(&(&1 == "")) |> Enum.into(%{}, fn server_string -> [id, host, port] = String.split(server_string, ":") {id, %{host: host, port: String.to_integer(port)}} end) end end