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