Headscale docker-compose-Konfiguration mit PostgreSQL

English Deutsch

Diese Konfiguration ist für größere Installationen gedacht als unsere SQLite-basierte Standardkonfiguration. Sie lässt sich etwas leichter korrekt sichern und ist bei größeren Arbeitslasten schneller. Allerdings verbraucht sie mehr RAM, insbesondere bei Installationen mit geringer Arbeitslast, und du hast zwei Docker-Container, die du bei Wartungsarbeiten berücksichtigen musst (obwohl sie über eine einzige docker-compose-Instanz verwaltet werden). Ich empfehle nicht, einen gemeinsamen Postgres-Server zu verwenden, obwohl dies durchaus möglich ist.

Erstelle zuerst ein zufälliges Passwort mit

headscale_generate_env.sh
echo POSTGRES_PASSWORD=$(pwgen 30 1) > .env

Die docker-compose.yml sieht so aus:

docker-compose.yml
services:
  headscale:
    image: headscale/headscale:latest
    volumes:
      - ./config:/etc/headscale/
      - ./data:/var/lib/headscale
    ports:
      - 27896:8080
    command: serve
    restart: unless-stopped
    depends_on:
      - postgres
  postgres:
    image: postgres
    restart: unless-stopped
    volumes:
      - ./pg_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=headscale
      - POSTGRES_USER=headscale

Nun erstellen wir die Standard-Headscale-Konfiguration:

headscale_fetch_config.sh
mkdir -p ./config
curl https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml -o ./config/config.yaml

In config/config.yaml müssen wir diese Änderungen vornehmen:

Server-URL setzen:

headscale_server_url_snippet.sh
server_url: https://headscale.mydomain.com

Kommentiere die SQLite-Datenbank aus (füge # am Anfang jeder Zeile hinzu):

headscale_disable_sqlite_snippet.sh
# SQLite config
# db_type: sqlite3
# db_path: /var/lib/headscale/db.sqlite

Und kommentiere Postgres ein und konfiguriere es:

headscale_postgres_config.yml
# Postgres config
db_type: postgres
db_host: postgres
db_port: 5432
db_name: headscale
db_user: headscale
db_pass: ohngooFaciice2hooGoo1Ahvif3ahl

Stelle sicher, dass all diese auskommentiert sind und du das Passwort aus .env kopierst. Es ist extrem wichtig, dass du hier ein einzigartiges Passwort verwendest, um Angriffe von unprivilegierten Host-Prozessen auf die Docker-Container zu verhindern.

Meine Empfehlung ist, Headscale über traefik oder nginx als Reverse Proxy zu betreiben, anstatt die eingebaute Let’s Encrypt / ACME-Unterstützung zu verwenden. Dies ermöglicht nicht nur die gemeinsame Nutzung von Port & IP-Adresse mit anderen Diensten, sondern Standard-Dienste wie Traefik und/oder nginx sind auch wesentlich besser im Hinblick auf die Exposition gegenüber dem Internet getestet und bieten daher einen potenziellen Sicherheitsvorteil. Außerdem erleichtern sie die serviceunabhängige Verwaltung von Zertifikaten und bieten eine zusätzliche Ebene für Debugging usw.

Du kannst auch benutzerdefinierte IP-Adressbereiche konfigurieren:

headscale_ip_prefixes.yml
ip_prefixes:
  - fd5d:7b60:4742::/48
  - 100.64.0.0/10

aber dies ist optional.

Weitere Informationen zum Autostart etc. findest du unter How to setup headscale server in 5 minutes using docker-compose


Check out similar posts by category: Headscale, Networking, VPN