PlugMaintenance

An Elixir plug that returns a service unavailable response during maintenance.

Installation

  1. Add plug_maintenance to your list of dependencies in mix.exs:
  def deps do
    [{:plug_maintenance, "~> 0.1.0"}]
  end
  1. Ensure plug_maintenance is started before your application:
  def application do
    [applications: [:plug_maintenance]]
  end

Usage

pipeline :api do
  plug :accepts, ["json"]
  plug Maintenance
end
scope "/" do
  pipe_through :api
  get "/v1/foo/bar, FooController, :bar
end
plug Maintenance, monitor: {MyApp.MaintenanceMonitor, :check, []}, renderer: {MyApp.MaintenanceRenderer, :render, []}

Custom monitor can be written like this.

defmodule MyApp.MaintenanceMonitor do
  def check(conn, _opts) do
    # Returning true will result in maintenance mode
    # Write the logic for your environment
    Redix.command(~w(GET maintenance)) == {:ok, "true"}
  end
end

For Phoenix, renderer can be written like this.

defmodule MyApp.MaintenanceRenderer do
  use MyApp.Web, :view
  import Plug.Conn

  def render(conn, _opts) do
    conn
    |> put_status(:service_unavailable)
    |> put_view(__MODULE__)
    |> render("index.html", layout: {MyApp.LayoutView, "maintenance.html"})
    |> halt
  end
end
plug Maintenance
plug Maintenance when action in [:index, :show:, :update]
plug Maintenance, [monitor: {MyMonitor, :check, []}, renderer: {MyRenderer, :render, []}] when action in [:index, :show:, :update]