2021-10-19 18:59:33 +00:00
# Running headscale
2021-10-24 12:09:07 +00:00
## Server configuration
2021-11-13 08:11:55 +00:00
2021-10-21 18:54:29 +00:00
1. Download the headscale binary https://github.com/juanfont/headscale/releases, and place it somewhere in your $PATH or use the docker container
2021-10-19 18:59:33 +00:00
```shell
docker pull headscale/headscale:x.x.x
```
<!--
or
```shell
docker pull ghrc.io/juanfont/headscale:x.x.x
``` -->
2021-10-24 12:09:07 +00:00
2. When running headscale in a docker container, prepare a directory to hold all configuration
2021-10-19 18:59:33 +00:00
2021-10-24 12:09:07 +00:00
```shell
mkdir config
```
2021-11-13 08:11:55 +00:00
2021-10-24 12:09:07 +00:00
3. Get yourself a DB
2021-11-09 16:23:36 +00:00
a) Get a Postgres DB running in Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-10-21 18:57:18 +00:00
docker run --name headscale \
2021-10-21 19:01:52 +00:00
-e POSTGRES_DB=headscale
2021-10-21 18:57:18 +00:00
-e POSTGRES_USER=foo \
-e POSTGRES_PASSWORD=bar \
-p 5432:5432 \
-d postgres
2021-10-19 18:59:33 +00:00
```
2021-11-09 16:23:36 +00:00
or b) Prepare a SQLite DB file:
2021-11-15 23:19:06 +00:00
2021-10-24 12:09:07 +00:00
```shell
touch config/db.sqlite
```
2021-10-19 18:59:33 +00:00
2021-10-24 12:09:07 +00:00
4. Create a WireGuard private key, headscale configuration, and a DERP map file. Refer to [tailscale sample ](https://raw.githubusercontent.com/tailscale/tailscale/main/net/dnsfallback/dns-fallback-servers.json ) for more guidance.
2021-10-19 18:59:33 +00:00
```shell
2021-10-24 12:09:07 +00:00
wg genkey > config/private.key
2021-10-19 18:59:33 +00:00
2021-10-24 12:09:07 +00:00
cp config.yaml.[sqlite|postgres].example config/config.yaml
2021-11-13 08:11:55 +00:00
2021-10-24 12:09:07 +00:00
cp derp-example.yaml config/derp.yaml
2021-10-19 18:59:33 +00:00
```
2021-10-24 12:09:07 +00:00
5. Create a namespace
2021-10-19 18:59:33 +00:00
```shell
headscale namespaces create myfirstnamespace
```
2021-11-09 16:23:36 +00:00
or Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-10-19 21:22:56 +00:00
docker run \
2021-10-24 12:09:07 +00:00
-v $(pwd)/config:/etc/headscale/ \
2021-10-19 21:22:56 +00:00
-p 127.0.0.1:8080:8080 \
headscale/headscale:x.x.x \
2021-11-09 16:23:36 +00:00
headscale namespaces create myfirstnamespace
2021-10-19 18:59:33 +00:00
```
2021-11-09 16:23:36 +00:00
or if your server is already running in Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-11-09 16:23:36 +00:00
docker exec < container_name > \
headscale namespaces create myfirstnamespace
2021-10-19 18:59:33 +00:00
```
2021-10-24 12:09:07 +00:00
6. Run the server
2021-10-19 18:59:33 +00:00
```shell
headscale serve
```
2021-11-09 16:23:36 +00:00
or Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-10-19 21:22:56 +00:00
docker run \
2021-10-24 12:09:07 +00:00
-v $(pwd)/config:/etc/headscale/ \
2021-10-19 21:22:56 +00:00
-p 127.0.0.1:8080:8080 \
2021-11-07 18:57:37 +00:00
headscale/headscale:x.x.x \
2021-11-09 16:23:36 +00:00
headscale serve
2021-10-19 18:59:33 +00:00
```
2021-11-09 16:23:36 +00:00
2021-10-24 12:09:07 +00:00
## Nodes configuration
2021-10-19 18:59:33 +00:00
2021-10-24 12:09:07 +00:00
If you used tailscale.com before in your nodes, make sure you clear the tailscaled data folder
2021-10-19 18:59:33 +00:00
2021-11-13 08:11:55 +00:00
```shell
systemctl stop tailscaled
rm -fr /var/lib/tailscale
systemctl start tailscaled
```
2021-11-07 18:57:37 +00:00
2021-10-24 12:09:07 +00:00
### Adding node based on MACHINEKEY
2021-11-07 18:57:37 +00:00
2021-10-24 12:09:07 +00:00
1. Add your first machine
2021-10-19 18:59:33 +00:00
```shell
tailscale up --login-server YOUR_HEADSCALE_URL
```
2021-10-24 12:09:07 +00:00
2. Navigate to the URL returned by `tailscale up` , where you'll find your machine key.
2021-10-19 18:59:33 +00:00
2021-10-24 12:09:07 +00:00
3. In the server, register your machine to a namespace with the CLI
2021-11-15 23:19:06 +00:00
2021-10-19 18:59:33 +00:00
```shell
2021-10-28 13:30:41 +00:00
headscale -n myfirstnamespace nodes register -k YOURMACHINEKEY
2021-10-19 18:59:33 +00:00
```
2021-11-15 23:19:06 +00:00
or Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-10-19 21:22:56 +00:00
docker run \
2021-10-24 12:09:07 +00:00
-v $(pwd)/config:/etc/headscale/ \
2021-10-19 21:22:56 +00:00
headscale/headscale:x.x.x \
2021-11-09 16:23:36 +00:00
headscale -n myfirstnamespace nodes register -k YOURMACHINEKEY
2021-10-19 18:59:33 +00:00
```
2021-11-15 23:19:06 +00:00
2021-11-09 16:23:36 +00:00
or if your server is already running in Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-11-07 18:57:37 +00:00
docker exec < container_name > \
2021-11-09 16:23:36 +00:00
headscale -n myfirstnamespace nodes register -k YOURMACHINEKEY
2021-10-19 18:59:33 +00:00
```
2021-10-24 12:09:07 +00:00
### Alternative: adding node with AUTHKEY
2021-10-19 18:59:33 +00:00
1. Create an authkey
```shell
headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
```
2021-11-15 23:19:06 +00:00
or Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-10-19 21:22:56 +00:00
docker run \
2021-10-24 12:09:07 +00:00
-v $(pwd)/config:/etc/headscale/ \
2021-10-19 21:22:56 +00:00
headscale/headscale:x.x.x \
2021-11-09 16:23:36 +00:00
headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
2021-10-19 18:59:33 +00:00
```
2021-11-09 16:23:36 +00:00
or if your server is already running in Docker:
2021-10-19 18:59:33 +00:00
```shell
2021-11-07 18:57:37 +00:00
docker exec < container_name > \
2021-11-09 16:23:36 +00:00
headscale -n myfirstnamespace preauthkeys create --reusable --expiration 24h
2021-10-19 18:59:33 +00:00
```
2021-11-09 16:23:36 +00:00
2. Use the authkey on your node to register it:
2021-10-19 18:59:33 +00:00
```shell
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.
2021-10-21 19:01:52 +00:00
Please bear in mind that all headscale commands support adding `-o json` or `-o json-line` to get nicely JSON-formatted output.
2021-11-13 22:16:37 +00:00
## Debugging headscale running in Docker
The `headscale/headscale` Docker container is based on a "distroless" image that does not contain a shell or any other debug tools. If you need to debug your application running in the Docker container, you can use the `-debug` variant, for example `headscale/headscale:x.x.x-debug` .
### Running the debug Docker container
To run the debug Docker container, use the exact same commands as above, but replace `headscale/headscale:x.x.x` with `headscale/headscale:x.x.x-debug` (`x.x.x` is the version of headscale). The two containers are compatible with each other, so you can alternate between them.
### Executing commands in the debug container
The default command in the debug container is to run `headscale` , which is located at `/bin/headscale` inside the container.
Additionally, the debug container includes a minimalist Busybox shell.
To launch a shell in the container, use:
```
docker run -it headscale/headscale:x.x.x-debug sh
```
You can also execute commands directly, such as `ls /bin` in this example:
```
docker run headscale/headscale:x.x.x-debug ls /bin
```
Using `docker exec` allows you to run commands in an existing container.