2024-12-12 15:31:54 +01:00
2024-12-12 15:31:54 +01:00
2024-12-12 15:31:54 +01:00
2024-12-12 15:31:54 +01:00

caddy-incus-upstreams

Status: HIGHLY experimental, patches welcome 🚩

Incus dynamic upstreams for Caddy v2+ 🧨

Usage

Set the following config on your Incus instance.

incus config set <instance-name> user.caddyserver.http.enable=true
incus config set <instance-name> user.caddyserver.http.matchers.host=<domain>
incus config set <instance-name> user.caddyserver.http.upstream.port=<port>

Build a fresh caddy with this plugin.

xcaddy build \
  --with git.coopcloud.tech/decentral1se/caddy-incus-upstreams

Wire up a Caddyfile based on this example.

example.com {
  reverse_proxy {
    dynamic incus
  }
}

Notes

The plugin responds to the following Incus events:

  • api.EventLifecycleInstanceCreated
  • api.EventLifecycleInstanceRestarted
  • api.EventLifecycleInstanceResumed
  • api.EventLifecycleInstanceStarted

It currently only matches against the upstream ipv4 addresses of instances.

Hackin'

Install xcaddy and Incus.

Create this Caddyfile in the root of the project repository.

{
  debug
  http_port 6565
}

http://foo.localhost {
  reverse_proxy {
    dynamic incus
  }
}

Then create a new instance and assign the relevant config.

incus launch images:alpine/3.20 foo
incus config set foo user.caddyserver.http.enable=true
incus config set foo user.caddyserver.http.matchers.host=foo.localhost
incus config set foo user.caddyserver.http.upstream.port=80

Serve something from your instance.

incus shell foo
apk add python3
python3 -m http.server 80

Run Caddy with the plugin baked in.

xcaddy run

And finally, route a request to the instance via Caddy.

curl -X GET http://foo.localhost:6565

🧨

ACK

License

Description
Incus dynamic upstreams for Caddy v2+ 🧨
Readme 198 KiB
Languages
Go 100%