Skip to main content

examples/full_host.exs

use HostKit.DSL, providers: [HostKit.Providers.Caddy]

project :prod do
  host :app, at: "app.example.com" do
    ssh do
      user("root")
      identity_file(Path.expand("~/.ssh/id_ed25519"))
      accept_hosts(true)
      retry(attempts: 3)
    end
  end

  provider :caddy, HostKit.Providers.Caddy do
    set(:sites_dir, "/etc/caddy/sites")
  end

  bootstrap do
    package(:ca_certificates)
    package(:build_essential, as: "build-essential", update: true)

    mise do
      tool(:erlang, "29.0.2")
      tool(:elixir, "1.20.1")
    end
  end

  service :api do
    account(system: true)
    storage(:data, mode: 0o750)

    env :runtime do
      set(:mix_env, :prod)
      secret(:database_url, env: "DATABASE_URL")
    end

    daemon do
      description("API service")
      env(:runtime)
      exec(["/opt/api/bin/server"])

      # Container-like isolation without a Docker daemon.
      isolate do
        memory_max("512M")
        writable(:data)
        network(:loopback)
      end

      listen(:http, port: 4000)
    end

    caddy_site "api.example.com" do
      encode([:zstd, :gzip])
      reverse_proxy(:http)
    end
  end
end