lib/caddy.ex

defmodule Caddy do
  @moduledoc """
  # Caddy
  Start Caddy HTTP Server in supervisor tree
  """
  require Logger

  use Supervisor

  @spec start() :: :ignore | {:error, any()} | {:ok, pid()}
  def start() do
    caddy_bin = System.find_executable("caddy")
    start_link(caddy_bin: caddy_bin)
  end

  @spec stop(term()) :: :ok
  def stop(reason \\ :normal) do
    Supervisor.stop(__MODULE__, reason)
  end

  @spec start_link(Keyword.t()) :: :ignore | {:error, any()} | {:ok, pid()}
  def start_link(args) do
    Supervisor.start_link(__MODULE__, args, name: __MODULE__)
  end

  @impl true
  def init(args) do
    children = [
      {Caddy.Config, args},
      Caddy.Bootstrap,
      Caddy.Logger.Buffer,
      Caddy.Logger.Store,
      Caddy.Server,
      Caddy.Admin
    ]

    opts = [strategy: :rest_for_one, name: __MODULE__]

    Supervisor.init(children, opts)
  end
end