3.8 KiB
Running headscale
-
Download the Headscale binary https://github.com/juanfont/headscale/releases, and place it somewhere in your PATH or use the docker container
docker pull headscale/headscale:x.x.x
-
(Optional, you can also use SQLite) Get yourself a PostgreSQL DB running
docker run --name headscale -e POSTGRES_DB=headscale -e \ POSTGRES_USER=foo -e POSTGRES_PASSWORD=bar -p 5432:5432 -d postgres
-
Set some stuff up (headscale Wireguard keys & the config.json file)
wg genkey > private.key wg pubkey < private.key > public.key # not needed # Postgres cp config.json.postgres.example config.json # or # SQLite cp config.json.sqlite.example config.json
-
Create a namespace (a namespace is a 'tailnet', a group of Tailscale nodes that can talk to each other)
headscale namespaces create myfirstnamespace
or docker:
the db.sqlite mount is only needed if you use sqlite
touch db.sqlite docker run -v $(pwd)/private.key:/private.key -v $(pwd)/config.json:/config.json -v $(pwd)/derp.yaml:/derp.yaml -v $(pwd)/db.sqlite:/db.sqlite -p 127.0.0.1:8080:8080 headscale/headscale:x.x.x headscale namespaces create myfirstnamespace
or if your server is already running in docker:
docker exec <container_name> headscale create myfirstnamespace
-
Run the server
headscale serve
or docker:
the db.sqlite mount is only needed if you use sqlite
docker run -v $(pwd)/private.key:/private.key -v $(pwd)/config.json:/config.json -v $(pwd)/derp.yaml:/derp.yaml -v $(pwd)/db.sqlite:/db.sqlite -p 127.0.0.1:8080:8080 headscale/headscale:x.x.x headscale serve
-
If you used tailscale.com before in your nodes, make sure you clear the tailscald data folder
systemctl stop tailscaled rm -fr /var/lib/tailscale systemctl start tailscaled
-
Add your first machine
tailscale up --login-server YOUR_HEADSCALE_URL
-
Navigate to the URL you will get with
tailscale up
, where you'll find your machine key. -
In the server, register your machine to a namespace with the CLI
headscale -n myfirstnamespace nodes register YOURMACHINEKEY
or docker:
docker run -v $(pwd)/private.key:/private.key -v $(pwd)/config.json:/config.json -v $(pwd)/derp.yaml:/derp.yaml headscale/headscale:x.x.x headscale -n myfirstnamespace nodes register YOURMACHINEKEY
or if your server is already running in docker:
docker exec <container_name> headscale -n myfirstnamespace nodes register YOURMACHINEKEY
Alternatively, you can use Auth Keys to register your machines:
-
Create an authkey
headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
or docker:
docker run -v $(pwd)/private.key:/private.key -v $(pwd)/config.json:/config.json -v$(pwd)/derp.yaml:/derp.yaml -v $(pwd)/db.sqlite:/db.sqlite headscale/headscale:x.x.x headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
or if your server is already running in docker:
docker exec <container_name> headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
-
Use the authkey from your machine to register it
tailscale up --login-server YOUR_HEADSCALE_URL --authkey YOURAUTHKEY
If you create an authkey with the --ephemeral
flag, that key will create ephemeral nodes. This implies that --reusable
is true.
Please bear in mind that all the commands from headscale support adding -o json
or -o json-line
to get a nicely JSON-formatted output.