/libcluster_tailscale

A libcluster strategy for discovering and connecting Elixir nodes over Tailscale

Primary LanguageElixirMIT LicenseMIT

libcluster_tailscale

This library adds a libcluster strategy for discovering and connecting Elixir nodes over Tailscale.

See this blog post for a detailed walkthrough.

Installation

The package can be installed by adding libcluster_tailscale to your list of dependencies in mix.exs:

def deps do
  [
    {:libcluster_tailscale, "~> 0.1.0"}
  ]
end

Config

Configure your libcluster topology with the following config.

config :libcluster,
  topologies: [
    tailscale: [
      strategy: Cluster.Strategy.Tailscale,
      config: [
        authkey: "tskey-api-xxx-yyy",
        tailnet: "example.com",
        hostname: "app.example.com",
        appname: "app"
      ]
    ]
  ]

Example Phoenix Application

Let us say we're deploying a phoenix application called hello.

When you bring your tailscale service up on your node, provide a hostname that is consistent across your cluster and this strategy can then find all the IP addresses on your Tailnet belonging to that service and automatically cluster them together.

tailscale up --authkey=${TAILSCALE_AUTHKEY} --hostname=hello-app

Configure your release to use the tailscale IP address as part of the node name:

ip=$(tailscale ip --4)
export RELEASE_DISTRIBUTION=name
export RELEASE_NODE=<%= @release.name %>@$ip

Then configure your cluster as follows

config :libcluster,
  topologies: [
    tailscale: [
      strategy: Cluster.Strategy.Tailscale,
      config: [
        authkey: "tskey-api-xxx-yyy",
        tailnet: "example.com",
        hostname: "hello-app",
        appname: "hello"
      ]
    ]
  ]