Headscale + embedded DERP Docker Compose one-click installer.
本仓库用于一键安装 Headscale 自建控制服务器,并启用 Headscale embedded DERP。客户端只需要连接 Headscale 域名,DERP map 由 Headscale 自动下发。
Headscale-scripts/
├── install.sh
├── uninstall.sh
├── update.sh
├── docker-compose.yml
├── .env.example
├── Caddyfile
├── README.md
├── LICENSE
├── scripts/
│ ├── healthcheck.sh
│ ├── genkey.sh
│ ├── backup.sh
│ ├── manage.sh
│ ├── onboard.sh
│ └── cleanup.sh
├── config/
│ ├── config.yaml
│ ├── derp.yaml
│ └── acl.hujson
└── docs/
├── CLIENTS.md
├── TROUBLESHOOT.md
└── ARCHITECTURE.md
Before installing:
- Point your domain to the server, for example
hs.example.com. - Open TCP
80and443. - Open UDP
3478.
Run:
curl -fsSL https://raw.githubusercontent.com/frui85/Headscale-scripts/main/install.sh \
| sudo bash -s -- --domain hs.example.com --email admin@example.com --user defaultDefault install directory:
/opt/docker-compose.d/headscale-server
Caddy automatically requests HTTPS certificates for the domain passed to --domain. Certificate data is mounted under:
/opt/docker-compose.d/headscale-server/certs
git clone https://github.com/frui85/Headscale-scripts.git
cd Headscale-scripts
sudo bash install.sh --domain hs.example.com --email admin@example.com --user defaultUseful options:
sudo bash install.sh \
--domain hs.example.com \
--email admin@example.com \
--user default \
--base-domain tailnet.example.com \
--install-dir /opt/docker-compose.d/headscale-server \
--headscale-version 0.27.1 \
--authkey-expiration 24h \
--derp-ipv4 203.0.113.10Use --include-official-derp if you want Tailscale's official DERP network as fallback. Without it, only the embedded DERP region is published.
cd /opt/docker-compose.d/headscale-server
docker compose ps
docker compose logs -f headscale
docker compose logs -f caddy
./scripts/healthcheck.sh
./scripts/manage.sh user list
./scripts/manage.sh node list
./scripts/onboard.sh --user default
./scripts/cleanup.sh
./scripts/genkey.sh --user default
./scripts/backup.shUser and node CRUD helper:
./scripts/manage.sh user create fr-mbp
./scripts/manage.sh user list
./scripts/manage.sh user rename --name fr-mbp fr-macbook
./scripts/manage.sh user delete --name fr-macbook --force
./scripts/manage.sh node list
./scripts/manage.sh node register --key <REGISTER_KEY> --user fr-mbp
./scripts/manage.sh node rename --id 2 fr-mbp
./scripts/manage.sh node move --id 2 --user default
./scripts/manage.sh node expire --id 2 --force
./scripts/manage.sh node delete --id 2 --forceOnboarding and cleanup:
# Generate a single-use onboarding package. The client joins automatically with the auth key.
./scripts/onboard.sh --user fr-mbp --expiration 24h
# Use an ephemeral key for short-lived clients; logout removes the node faster.
./scripts/onboard.sh --user temp-iphone --ephemeral --expiration 2h
# Dry-run cleanup first, then apply.
./scripts/cleanup.sh --expired --delete-empty-users
./scripts/cleanup.sh --apply --expired --delete-empty-usersUpdate:
sudo bash update.sh --headscale-version 0.27.1Uninstall but keep data:
sudo bash uninstall.shUninstall and delete config, data, certs, and backups:
sudo bash uninstall.sh --purgeUse the Headscale URL, not a DERP URL:
https://hs.example.com
Linux:
sudo tailscale up --login-server https://hs.example.com --authkey <AUTH_KEY>Windows:
tailscale login --login-server https://hs.example.commacOS:
tailscale login --login-server=https://hs.example.comAndroid and iOS: add a custom or alternate control server and enter https://hs.example.com.
This installer does not ask for a separate DERP domain by default.
The default deployment uses one domain for both Headscale and the embedded DERP service:
https://hs.example.com
Clients log in to that Headscale URL. Headscale then sends a DERP map that contains the embedded headscale DERP region. For a single-server install, you only need:
- TCP
443for HTTPS and DERP relay traffic - UDP
3478for STUN server_urlset tohttps://hs.example.comderp.server.enabled: true
A separate DERP domain is only needed when you run DERP independently from Headscale, deploy DERP on another server, build multi-region DERP such as derp-hk.example.com and derp-sg.example.com, or intentionally separate the control plane from relay traffic.
More detail: