Headscale-Server in 5 Minuten mit docker-compose einrichten
Dieses Headscale-Setup verwendet sqlite – mit einem deutlich geringeren Speicher- & CPU-Fußabdruck als PostgreSQL für einfache Anwendungsfälle. Ich empfehle dies für fast jede Installation: Headscale muss nicht so viele Anfragen verwalten und die Verwendung von sqlite3 ist für alle bis auf die anspruchsvollsten Setups ausreichend.
Zuerst das Verzeichnis erstellen, in dem Headscale und alle Daten liegen sollen (in diesem Beispiel verwenden wir /opt/headscale).
sudo mkdir -p /opt/headscaleNun das folgende Skript in /opt/headscale ausführen, um die Dateien und Verzeichnisse zu initialisieren, die Headscale benötigt:
mkdir -p ./config
touch ./config/db.sqlite
curl https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml -o ./config/config.yamldocker-compose-Konfiguration
Hinweis: Es gibt eine alternative docker-compose-Konfiguration für die Verwendung mit Traefik als Reverse-Proxy, siehe Headscale docker-compose-Konfiguration für Traefik HTTPS-Reverse-Proxy
Nun ist es Zeit, /opt/headscale/docker-compose.yml zu erstellen:
services:
headscale:
image: headscale/headscale:latest
volumes:
- ./config:/etc/headscale/
- ./data:/var/lib/headscale
ports:
- 27896:8080
command: headscale serve
restart: unless-stoppedDies konfiguriert Headscale so, dass sein HTTP-Server auf Port 27896 läuft. Dieser Port kann per Reverse-Proxy auf die Domain der Wahl weitergeleitet werden.
Konfiguration
Nun sollte der Servername in config/config.yaml bearbeitet werden:
server_url: https://headscale.mydomain.comBeachten, dass tailscale nach jeder Änderung neu gestartet werden muss
Als Nächstes siehe Namespace auf Headscale-Server erstellen für Details zum Erstellen eines Namespace. Sobald ein Namespace erstellt wurde (vergleichbar mit einem Konto beim kommerziellen Tailscale-Dienst), können Clients verbunden werden (die Client-Software heißt tailscale), siehe z.B. Tailscale mit Headscale-Server auf Linux verbinden
Autostart
Mit der in unserem vorherigen Beitrag Systemd-Service für ein docker-compose-Projekt in 10 Sekunden erstellen beschriebenen Methode richten wir nun den Autostart beim Booten für Headscale mit systemd ein. Dieser Befehl startet es auch sofort:
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdinLogs ansehen
Diesen Befehl verwenden, um die Logs anzuzeigen und zu verfolgen:
docker-compose logs -fBeispielausgabe:
headscale_1 | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
headscale_1 |
headscale_1 | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
headscale_1 | - using env: export GIN_MODE=release
headscale_1 | - using code: gin.SetMode(gin.ReleaseMode)
headscale_1 |
headscale_1 | [GIN-debug] GET /metrics --> github.com/zsais/go-gin-prometheus.prometheusHandler.func1 (4 handlers)
headscale_1 | [GIN-debug] GET /health --> github.com/juanfont/headscale.(*Headscale).Serve.func2 (4 handlers)
headscale_1 | [GIN-debug] GET /key --> github.com/juanfont/headscale.(*Headscale).KeyHandler-fm (4 handlers)
headscale_1 | [GIN-debug] [GIN-debug] GET /register --> github.com/juanfont/headscale.(*Headscale).RegisterWebAPI-fm (4 handlers)
headscale_1 | [GIN-debug] POST /machine/:id/map --> github.com/juanfont/headscale.(*Headscale).PollNetMapHandler-fm (5 handlers)
headscale_1 | [GIN-debug] POST /machine/:id --> github.com/juanfont/headscale.(*Headscale).RegistrationHandler-fm (5 handlers)
headscale_1 | [GIN-debug] GET /oidc/register/:mkey --> github.com/juanfont/headscale.(*Headscale).RegisterOIDC-fm (5 handlers)
headscale_1 | [GIN-debug] GET /oidc/callback --> github.com/juanfont/headscale.(*Headscale).OIDCCallback-fm (5 handlers)
headscale_1 | [GIN-debug] GET /apple --> github.com/juanfont/headscale.SwaggerUI (4 handlers)
headscale_1 | [GIN-debug] GET /apple/:platform --> github.com/juanfont/headscale.(*Headscale).AppleMobileConfig-fm (4 handlers)
headscale_1 | [GIN-debug] GET /swagger --> github.com/juanfont/headscale.SwaggerUI (4 handlers)
headscale_1 | [GIN-debug] GET /swagger/v1/openapiv2.json --> github.com/juanfont/headscale.SwaggerAPIv1 (4 handlers)
headscale_1 | [GIN-debug] GET /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] POST /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] PUT /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] PATCH /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] HEAD /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] OPTIONS /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] DELETE /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] CONNECT /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | [GIN-debug] TRACE /api/v1/*any --> github.com/gin-gonic/gin.WrapF.func1 (5 handlers)
headscale_1 | 2022-01-16T19:04:04Z WRN Listening without TLS but ServerURL does not start with http://
headscale_1 | 2022-01-16T19:04:04Z INF listening and serving (multiplexed HTTP and gRPC) on: 0.0.0.0:8080
headscale_1 | 2022-01-16T19:04:04Z INF Setting up a DERPMap update worker frequency=86400000
headscale_1 | 2022-01-16T19:04:04Z INF listening and serving (multiplexed HTTP and gRPC) on: 0.0.0.0:8080
headscale_1 | 2022-01-16T19:04:04Z INF Setting up a DERPMap update worker frequency=86400000