前言
可能最近大家都发现了,由于 Headscale 的版本更新修改了部分的API接口,再加上 Tailscale v1.50 版本及更新的客户端对大部分API进行了调整,导致互联网上大部分的 Headscale 搭建教程几乎接近于失效。
所以。。。经过我这几天不断的试错,总算是把它给部署起来了(
目前存在的问题
- 因为大部分 WebUI 的作者貌似没 更新/发行 支持新版本 Headscale 的 WebUI 界面,所以目前大部分操作需要命令行来完成
- 我现在在使用的是 GoodiesHQ 开发的 GoodiesHQ/headscale-admin: Admin Web Interface for juanfont/headscale (github.com) 项目作为我的Headscale的管理WebUI,目前 (截止于 2024-01-30 20:40)貌似还未完整支持到最新的 headscale 服务端发行版,有些操作将会不可用。
部署 Headscale
环境准备
- 一个 Linux 环境 (我这里使用的是 Debian Linux 12)
- 安装配置好的 Docker 容器环境,也需要Docker Compose组件可用
- 一个 Web 服务器(我这里使用的是 openresty)
- 一颗有耐心的心
准备文件
这里我使用的是 Docker 容器的方式部署 (虽然貌似官方不大推荐)
1. 创建安装目录并入
选一个你喜欢的位置,创建个文件夹用于存放 headscale 相关的配置文件~
我这里习惯把它们放在 /opt
目录下
root@ali-sh-aqu0713rea8:~# mkdir /opt/headscale && cd /opt/headscale
root@ali-sh-aqu0713rea8:/opt/headscale#
2. 创建相关文件
为了运行 headscale ,你可能需要创建一些文件
# 创建 compose 文件
root@ali-sh-aqu0713rea8:/opt/headscale# touch docker-compose.yml
# 创建 config 文件夹并创建 db.sqlite 文件
root@ali-sh-aqu0713rea8:/opt/headscale# mkdir config && touch ./config/db.sqlite
接下来需要去下载下 headscale 的样例配置文件到 config 目录了
# 如果你的服务器可以直接访问 Github
root@ali-sh-aqu0713rea8:/opt/headscale# wget -O ./config/config.yaml https://github.com/juanfont/headscale/raw/main/config-example.yaml
# 如果你的服务器不能直接访问 Github
root@ali-sh-aqu0713rea8:/opt/headscale# wget -O ./config/config.yaml https://mirror.ghproxy.com/https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml
然后使用你喜欢的方式向 docker-compose.yml
里写入下面这些内容
version: '3'
services:
headscale:
container_name: headscale-server
image: headscale/headscale:0.23.0-alpha3
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- 127.0.0.1:38371:38371
- 127.0.0.1:38372:38372
volumes:
- ./config:/etc/headscale/
networks:
- headscale
command: headscale serve
headscale-admin:
container_name: headscale-admin
restart: always
image: goodieshq/headscale-admin:latest
networks:
- headscale
ports:
- 127.0.0.1:38370:80
networks:
headscale:
external: false
到此,相关文件就准备完成啦!
3. 编辑配置文件
接下来我们就要开始设置你的 headscale 服务器了
使用你喜欢的方式打开你刚刚在 config 目录下下载的样例配置文件~
你将会看到很多东西,我们只需要修改一点点内容:
# 修改第13行的 server_url: http://127.0.0.1:8080 为你的 headscale 地址(子域名)
server_url: https://headscale.example.com
# 修改第19行的 listen_addr: 127.0.0.1:8080 成 listen_addr: 0.0.0.0:38371
listen_addr: 0.0.0.0:38371
# 修改第25行的 metrics_listen_addr: 127.0.0.1:9090 成 metrics_listen_addr: 0.0.0.0:38372
metrics_listen_addr: 0.0.0.0:38372
# 在第218行的位置加入国内的DNS地址(此处为阿里云公共DNS)
nameservers:
- 1.1.1.1
- 223.5.5.5
然后通过文本编辑器的替换功能,把文件中所有的 /var/lib/headscale/
替换成 /etc/headscale/
(因为容器中的 /var/lib/headscale/
路径是不可读写的,直接使用会导致容器报错无法启动)
部署服务
4. 启动容器
这一步非常简单,你只需要进入你的安装目录,执行一下 docker-compose up -d
命令就可以啦~
不过在进行下一步前,建议执行一次 docker ps
命令,看看 headscale-server
容器是不是正常运行中,如果有出现 "Restart" 字样说明你的容器运行状态不正常,请执行 docker-compose down
命令停止容器后检查下上面的配置是不是有问题?
如果没问题的话,我们就可以进行下一步啦
5. 配置Web服务器反向代理
熟悉部署的同学到这一应该非常熟悉怎么做了吧~
创建好一个网站配置,然后绑定你的 headscale 所用的域名。
然后把以下内容粘贴进去
location / {
proxy_pass http://127.0.0.1:38371;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_buffering off;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
proxy_http_version 1.1;
}
location /metrics {
proxy_pass http://127.0.0.1:38372;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Strict-Transport-Security "max-age=31536000";
add_header Cache-Control no-cache;
}
location ^~ /admin/ {
proxy_pass http://127.0.0.1:38370;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Strict-Transport-Security "max-age=31536000";
add_header Cache-Control no-cache;
}
打开浏览器,访问下你的 “headscale地址”+ /admin
,看看WebUI是不是能正常访问了?
没问题我们就进行到下一步!
6. 创建API密钥并应用至WebUI设置
回到终端,输入下面的命令创建一个时长 180天 的API密钥
root@ali-sh-aqu0713rea8:~# docker exec headscale-server headscale apikey create -e 180d
qwym-VLy-wPa_l0lrQyktZrZfuO1uSSLhOmN0bLkFR9UPydCeCUu64