2022-01-02 11:11:36 -07: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-02 12:48:57 -07: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-02 11:11:36 -07:00
describing how to make `headscale` run properly in a server environment.
## Configure and run `headscale`
2022-01-02 12:48:57 -07:00
1. Download the latest [`headscale` binary from GitHub's release page ](https://github.com/juanfont/headscale/releases ):
2022-01-02 11:11:36 -07: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-02 12:53:49 -07:00
2. Make `headscale` executable:
2022-01-02 11:11:36 -07:00
```shell
chmod +x /usr/local/bin/headscale
```
2022-01-15 00:32:52 -07:00
3. Prepare a directory to hold `headscale` configuration and the [SQLite ](https://www.sqlite.org/ ) database:
2022-01-02 11:11:36 -07: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-16 15:56:57 -06:00
# or if you create a headscale user:
useradd -md /var/lib/headscale/ -rUs /usr/bin/nologin headscale
2022-01-02 11:11:36 -07:00
```
2022-01-15 00:32:52 -07:00
4. Create an empty SQLite database:
2022-01-02 11:11:36 -07:00
```shell
touch /var/lib/headscale/db.sqlite
```
2022-01-02 12:53:49 -07:00
5. Create a `headscale` configuration:
2022-01-02 11:11:36 -07:00
```shell
touch /etc/headscale/config.yaml
```
2022-01-29 23:34:51 -07:00
It is **strongly recommended** to copy and modify the [example configuration ](../config-example.yaml )
2022-01-02 11:11:36 -07:00
from the [headscale repository ](../ )
2022-01-02 12:53:49 -07:00
6. Start the headscale server:
2022-01-02 11:11:36 -07:00
```shell
2022-04-16 15:58:05 -06:00
headscale serve
2022-01-02 11:11:36 -07:00
```
This command will start `headscale` in the current terminal session.
2022-01-02 12:55:38 -07:00
---
2022-01-02 11:11:36 -07:00
To continue the tutorial, open a new terminal and let it run in the background.
2022-01-02 12:48:57 -07:00
Alternatively use terminal emulators like [tmux ](https://github.com/tmux/tmux ) or [screen ](https://www.gnu.org/software/screen/ ).
2022-01-02 11:11:36 -07:00
2022-01-02 12:48:57 -07: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-02 11:11:36 -07:00
2022-01-02 12:53:49 -07:00
7. Verify `headscale` is running:
2022-01-02 11:11:36 -07:00
Verify `headscale` is available:
```shell
2022-03-16 19:25:42 -06:00
curl http://127.0.0.1:9090/metrics
2022-01-02 11:11:36 -07:00
```
2022-01-02 12:53:49 -07:00
8. Create a namespace ([tailnet](https://tailscale.com/kb/1136/tailnet/)):
2022-01-02 11:11:36 -07: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 00:32:52 -07: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-02 11:11:36 -07: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-01 12:23:18 -07:00
Note that when running as the headscale user ensure that, either you add your current user to the headscale group:
2022-02-01 17:32:13 -07:00
2022-02-01 12:23:18 -07:00
```shell
usermod -a -G headscale current_user
```
2022-02-01 17:32:13 -07:00
2022-02-01 12:23:18 -07:00
or run all headscale commands as the headscale user:
```shell
su - headscale
```
2022-04-16 15:52:06 -06: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-02 11:11:36 -07:00
```yaml
unix_socket: /var/run/headscale/headscale.sock
```
2022-01-02 12:53:49 -07:00
3. Reload SystemD to load the new configuration file:
2022-01-02 11:11:36 -07:00
```shell
systemctl daemon-reload
```
2022-01-02 12:53:49 -07:00
4. Enable and start the new `headscale` service:
2022-01-02 11:11:36 -07:00
```shell
2022-04-16 15:52:06 -06:00
systemctl enable --now headscale
2022-01-02 11:11:36 -07:00
```
2022-01-02 12:53:49 -07:00
5. Verify the headscale service:
2022-01-02 11:11:36 -07:00
```shell
systemctl status headscale
```
Verify `headscale` is available:
```shell
2022-04-09 03:24:57 -06:00
curl http://127.0.0.1:9090/metrics
2022-01-02 11:11:36 -07:00
```
`headscale` will now run in the background and start at boot.