使用 PostgreSQL 的 Headscale docker-compose 配置

此配置适用于比我们基于 sqlite 的标准配置更大的安装。它往往更容易正确备份,对于更大的工作负载会更快。但是,它会消耗更多 RAM,特别是对于低工作负载安装,并且你在维护期间需要担心两个 docker 容器(尽管它们使用单个 docker-compose 实例管理)。我不建议使用共享的 postgres 服务器,尽管这当然是可能的。

首先,使用以下命令创建随机密码

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

docker-compose.yml 看起来像这样:

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

现在我们创建默认的 headscale 配置:

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

config/config.yaml 中我们需要做这些更改:

设置服务器 URL:

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

注释掉 sqlite 数据库(在每行前面添加 #):

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

并取消注释并配置 postgres:

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

确保所有这些都已取消注释,并且你从 .env 复制密码。在此处使用唯一密码非常重要,以防止来自非特权主机进程的攻击到 docker 容器。

我的建议是使用 traefiknginx 反向代理 headscale,而不是使用内置的 Let’s Encrypt / ACME 支持。这不仅允许与其他服务共享端口和 IP 地址,像 Traefik 和/或 nginx 这样的标准服务在暴露于互联网方面经过了更充分的测试,因此提供潜在的安全优势。此外,它们使以服务无关的方式管理证书变得更容易,并提供额外的调试等层。

你还可以配置自定义 IP 地址范围:

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

但这是可选的。

有关自动启动等的更多信息,请参阅如何使用 docker-compose 在 5 分钟内设置 headscale 服务器


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