记一次新版本Headscale和Derp中继服务的部署&搭建

前言

可能最近大家都发现了,由于 Headscale 的版本更新修改了部分的API接口,再加上 Tailscale v1.50 版本及更新的客户端对大部分API进行了调整,导致互联网上大部分的 Headscale 搭建教程几乎接近于失效。

所以。。。经过我这几天不断的试错,总算是把它给部署起来了(

目前存在的问题

  1. 因为大部分 WebUI 的作者貌似没 更新/发行 支持新版本 Headscale 的 WebUI 界面,所以目前大部分操作需要命令行来完成
  2. 我现在在使用的是 GoodiesHQ 开发的 GoodiesHQ/headscale-admin: Admin Web Interface for juanfont/headscale (github.com) 项目作为我的Headscale的管理WebUI,目前 (截止于 2024-01-30 20:40)貌似还未完整支持到最新的 headscale 服务端发行版,有些操作将会不可用。

部署 Headscale

环境准备

  1. 一个 Linux 环境 (我这里使用的是 Debian Linux 12)
  2. 安装配置好的 Docker 容器环境,也需要Docker Compose组件可用
  3. 一个 Web 服务器(我这里使用的是 openresty)
  4. 一颗有耐心的心

准备文件

这里我使用的是 Docker 容器的方式部署 (虽然貌似官方不大推荐)

1. 创建安装目录并入

选一个你喜欢的位置,创建个文件夹用于存放 headscale 相关的配置文件~

我这里习惯把它们放在 /opt 目录下

shell
root@ali-sh-aqu0713rea8:~# mkdir /opt/headscale && cd /opt/headscale
root@ali-sh-aqu0713rea8:/opt/headscale#

2. 创建相关文件

为了运行 headscale ,你可能需要创建一些文件

shell
# 创建 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 目录了

shell
# 如果你的服务器可以直接访问 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 里写入下面这些内容

yaml
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 目录下下载的样例配置文件~

你将会看到很多东西,我们只需要修改一点点内容:

yaml
# 修改第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 所用的域名。

然后把以下内容粘贴进去

nginx
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密钥

shell
root@ali-sh-aqu0713rea8:~# docker exec headscale-server headscale apikey create -e 180d
qwym-VLy-wPa_l0lrQyktZrZfuO1uSSLhOmN0bLkFR9UPydCeCUu64

未完待续…

给群晖7.2的登录界面小卡片加上毛玻璃效果