2022-01-03 02:11:36 +08:00
# Running headscale on Linux
## Goal
This documentation has the goal of showing a user how-to set up and run `headscale` on Linux.
2022-01-03 03:48:57 +08:00
In additional to the "get up and running section", there is an optional [SystemD section ](#running-headscale-in-the-background-with-systemd )
2022-01-03 02:11:36 +08:00
describing how to make `headscale` run properly in a server environment.
## Configure and run `headscale`
2022-01-03 03:48:57 +08:00
1. Download the latest [`headscale` binary from GitHub's release page ](https://github.com/juanfont/headscale/releases ):
2022-01-03 02:11:36 +08:00
```shell
wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v< HEADSCALE VERSION > /headscale_< HEADSCALE VERSION > _linux_< ARCH >
```
2022-01-03 03:53:49 +08:00
2. Make `headscale` executable:
2022-01-03 02:11:36 +08:00
```shell
chmod +x /usr/local/bin/headscale
```
2022-01-15 15:32:52 +08:00
3. Prepare a directory to hold `headscale` configuration and the [SQLite ](https://www.sqlite.org/ ) database:
2022-01-03 02:11:36 +08:00
```shell
# Directory for configuration
mkdir -p /etc/headscale
# Directory for Database, and other variable data (like certificates)
mkdir -p /var/lib/headscale
2022-04-17 05:56:57 +08:00
# or if you create a headscale user:
2022-04-21 17:00:17 +08:00
useradd \
--create-home \
--home-dir /var/lib/headscale/ \
--system \
--user-group \
--shell /usr/bin/nologin \
headscale
2022-01-03 02:11:36 +08:00
```
2022-01-15 15:32:52 +08:00
4. Create an empty SQLite database:
2022-01-03 02:11:36 +08:00
```shell
touch /var/lib/headscale/db.sqlite
```
2022-01-03 03:53:49 +08:00
5. Create a `headscale` configuration:
2022-01-03 02:11:36 +08:00
```shell
touch /etc/headscale/config.yaml
```
2022-01-30 14:34:51 +08:00
It is **strongly recommended** to copy and modify the [example configuration ](../config-example.yaml )
2022-01-03 02:11:36 +08:00
from the [headscale repository ](../ )
2022-01-03 03:53:49 +08:00
6. Start the headscale server:
2022-01-03 02:11:36 +08:00
```shell
2022-04-17 05:58:05 +08:00
headscale serve
2022-01-03 02:11:36 +08:00
```
This command will start `headscale` in the current terminal session.
2022-01-03 03:55:38 +08:00
---
2022-01-03 02:11:36 +08:00
To continue the tutorial, open a new terminal and let it run in the background.
2022-01-03 03:48:57 +08:00
Alternatively use terminal emulators like [tmux ](https://github.com/tmux/tmux ) or [screen ](https://www.gnu.org/software/screen/ ).
2022-01-03 02:11:36 +08:00
2022-01-03 03:48:57 +08:00
To run `headscale` in the background, please follow the steps in the [SystemD section ](#running-headscale-in-the-background-with-systemd ) before continuing.
2022-01-03 02:11:36 +08:00
2022-01-03 03:53:49 +08:00
7. Verify `headscale` is running:
2022-01-03 02:11:36 +08:00
Verify `headscale` is available:
```shell
2022-03-17 09:25:42 +08:00
curl http://127.0.0.1:9090/metrics
2022-01-03 02:11:36 +08:00
```
2022-01-03 03:53:49 +08:00
8. Create a namespace ([tailnet](https://tailscale.com/kb/1136/tailnet/)):
2022-01-03 02:11:36 +08:00
```shell
headscale namespaces create myfirstnamespace
```
### Register a machine (normal login)
On a client machine, execute the `tailscale` login command:
```shell
tailscale up --login-server YOUR_HEADSCALE_URL
```
Register the machine:
```shell
headscale --namespace myfirstnamespace nodes register --key < YOU_ + MACHINE_KEY >
```
### Register machine using a pre authenticated key
Generate a key using the command line:
```shell
headscale --namespace myfirstnamespace preauthkeys create --reusable --expiration 24h
```
This will return a pre-authenticated key that can be used to connect a node to `headscale` during the `tailscale` command:
```shell
tailscale up --login-server < YOUR_HEADSCALE_URL > --authkey < YOUR_AUTH_KEY >
```
## Running `headscale` in the background with SystemD
2022-01-15 15:32:52 +08:00
This section demonstrates how to run `headscale` as a service in the background with [SystemD ](https://www.freedesktop.org/wiki/Software/systemd/ ).
2022-01-03 02:11:36 +08:00
This should work on most modern Linux distributions.
1. Create a SystemD service configuration at `/etc/systemd/system/headscale.service` containing:
```systemd
[Unit]
Description=headscale controller
After=syslog.target
After=network.target
[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5
# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale
[Install]
WantedBy=multi-user.target
```
2022-02-02 03:23:18 +08:00
Note that when running as the headscale user ensure that, either you add your current user to the headscale group:
2022-02-02 08:32:13 +08:00
2022-02-02 03:23:18 +08:00
```shell
usermod -a -G headscale current_user
```
2022-02-02 08:32:13 +08:00
2022-02-02 03:23:18 +08:00
or run all headscale commands as the headscale user:
```shell
su - headscale
```
2022-04-17 05:52:06 +08:00
2. In `/etc/headscale/config.yaml` , override the default `headscale` unix socket with path that is writable by the `headscale` user or group:
2022-01-03 02:11:36 +08:00
```yaml
unix_socket: /var/run/headscale/headscale.sock
```
2022-01-03 03:53:49 +08:00
3. Reload SystemD to load the new configuration file:
2022-01-03 02:11:36 +08:00
```shell
systemctl daemon-reload
```
2022-01-03 03:53:49 +08:00
4. Enable and start the new `headscale` service:
2022-01-03 02:11:36 +08:00
```shell
2022-04-17 05:52:06 +08:00
systemctl enable --now headscale
2022-01-03 02:11:36 +08:00
```
2022-01-03 03:53:49 +08:00
5. Verify the headscale service:
2022-01-03 02:11:36 +08:00
```shell
systemctl status headscale
```
Verify `headscale` is available:
```shell
2022-04-09 17:24:57 +08:00
curl http://127.0.0.1:9090/metrics
2022-01-03 02:11:36 +08:00
```
`headscale` will now run in the background and start at boot.