The Tailscale extension implementsDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/universeclouddev/Universe/llms.txt
Use this file to discover all available pages before exploring further.
TemplateVariableProvider and makes your node’s Tailscale network addresses available as %TAILSCALE_*% placeholder variables during instance deployment. This lets instances bind to and advertise their Tailscale IP, giving proxies and clients a stable address that works across any Tailscale-connected machine — regardless of public IP, NAT, or firewall configuration.
When to Use This
- You run Universe nodes on different machines, VPS instances, or home servers and need them to communicate reliably.
- You want instances to be reachable via Tailscale’s encrypted mesh network without configuring port forwarding.
- You already use Tailscale for Zero Trust networking and want Universe to participate naturally.
How It Works
On load, the extension spawns thetailscale CLI with tailscale status --json and parses the JSON response to extract the local node’s addresses. Results are cached in memory for 30 seconds and refreshed on the next variable resolution. The following variables are injected during every instance deployment:
| Variable | Example value | Description |
|---|---|---|
%TAILSCALE_IP% | 100.64.1.1 | IPv4 address on the tailnet |
%TAILSCALE_IP6% | fd7a:115c:a1e0::1 | IPv6 address on the tailnet |
%TAILSCALE_HOSTNAME% | my-server | Machine hostname as seen in Tailscale |
%TAILSCALE_MAGIC_DNS% | my-server.tail12345.ts.net | Full MagicDNS FQDN for the node |
%TAILSCALE_ADDRESS% | 100.64.1.1 | Alias for %TAILSCALE_IP% |
Docker Compose Setup
The Tailscale CLI is a thin client that talks to thetailscaled daemon over a UNIX socket. When running Universe inside a container, mount both the binary and the daemon socket directory from the host:
Configuration
Create./extensions/tailscale/config.json:
| Field | Default | Description |
|---|---|---|
binaryPath | "tailscale" | Path to the tailscale binary. Change if it is not on PATH |
timeoutMs | 5000 | Maximum wait time in milliseconds for tailscale status --json to respond |
warnIfUnavailable | true | Log a warning on startup if Tailscale is not running or unreachable |
socketPath | null | Path to the tailscaled daemon socket. Required in Docker when the socket is mounted at a non-standard path. Passed to the CLI as --socket <path>. Common values: /var/run/tailscale/tailscaled.sock, /run/tailscale/tailscaled.sock |
Usage Examples
Setting hostAddress to the Tailscale IP
100.64.1.1:25565 over the encrypted Tailscale tunnel.
In fileModifications (template variable replacement)
In environmentVariables
Fallback Behaviour
If Tailscale is not running or the binary is missing when Universe starts:- All
%TAILSCALE_*%variables resolve to empty strings. - The configuration’s
hostAddressfalls back to its literal value (which will contain%TAILSCALE_IP%unreplaced if that was set). - If
warnIfUnavailableistrue, the extension logs a startup warning.
Troubleshooting
"No Tailscale IP detected" warning on startup
"No Tailscale IP detected" warning on startup
Check that Verify the socket is accessible from inside the container:If the socket is present but the command hangs, check that
tailscaled is running on the host machine:socketPath in config.json matches the actual socket path."Permission denied" on the daemon socket
"Permission denied" on the daemon socket
The container user does not have read access to the socket file. To fix this either:
- Run
tailscaledas root on the host so the socket is world-readable, or - Relax the socket permissions:
sudo chmod g+r /var/run/tailscale/tailscaled.sock
Binary not found
Binary not found
If
tailscale is not on the system PATH inside the container, set binaryPath to the absolute path of the mounted binary: