架构认知:为什么要分离节点?

架构认知:为什么要分离节点?

翼龙采用经典的前后端分离架构。Panel 负责Web界面和权限管理,而 Wings(Go编写的守护进程)才是直接操作 Docker Daemon 的"包工头"。这种设计的核心优势在于多节点横向扩展——你可以在国内云厂商A的轻量应用服务器部署Panel,而在海外独立服务器部署Wings节点,通过 gRPC 安全通信实现跨地域游戏服管理。

节点部署硬核路径

1. 环境准备:Docker 的"国内特供"配置

Wings 强依赖 Docker CE。对于国内服务器,不配置镜像加速器就等着在 docker pull 阶段卡到 timeout 吧。编辑 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2"
}

关键细节native.cgroupdriver=systemd 在 Ubuntu 22.04+ 或 RHEL 系发行版上是必选项,否则 Wings 启动容器时会报 cgroup 挂载错误。

2. Wings 二进制部署 vs Docker-in-Docker

官方提供两种部署方式:直接运行 Wings 二进制文件(推荐),或通过 Docker 跑 Wings 容器。对于生产环境,强烈建议二进制部署。Docker-in-Docker 方案会增加一层网络命名空间,导致你在 Wings 里配置 SFTP over SSH(默认2022端口)时,端口映射逻辑变得异常诡异。

二进制部署流程:

mkdir -p /etc/pterodactyl /var/lib/pterodactyl/volumes /var/log/pterodactyl
cd /usr/local/bin
curl -L -o wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64"
chmod u+x wings

随后创建 systemd 服务单元 /etc/systemd/system/wings.service

[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service

[Service]
User=root
WorkingDirectory=/etc/pterodactyl
LimitNOFILE=4096
ExecStart=/usr/local/bin/wings
Restart=on-failure
StartLimitInterval=180
StartLimitBurst=30

[Install]
WantedBy=multi-user.target

3. 网络层:SSL/TLS 与反向代理的陷阱

Wings 与 Panel 之间通过 HTTPS(gRPC)通信。在配置 Wings 的 config.yml 时,remote 部分的 ssl 配置必须与 Panel 分配的 FQDN(完全限定域名)严格匹配,包括证书链的完整性

如果你在内网部署且使用自签名证书,必须在 Wings 配置中设置 ssl.enabled: true 并挂载 CA 证书到系统信任库。否则你会在 Wings 日志中看到 transport: authentication handshake failed: x509: certificate signed by unknown authority 的循环报错。

对于反向代理,不要用 Nginx 的 gRPC 模块去代理 Wings 的 8080 端口(Wings 默认监听端口)。Wings 本身已经是一个 HTTP/2 gRPC 服务器,前端 Nginx 只需做简单的 TCP 透传或 SSL 终结:

stream {
    server {
        listen 443 ssl;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        proxy_pass wings_backend:8080;
        proxy_ssl off;
    }
}

4. 存储后端:本地 vs 对象存储

Wings 默认使用本地存储(/var/lib/pterodactyl/volumes)。但对于需要多节点热迁移或备份的场景,建议配置 S3 兼容存储(如 MinIO、阿里云 OSS)。

config.yml 中配置 system.s3 时,注意 endpoint 必须包含协议头(https://),且 bucket 需预先创建并赋予 PutObjectGetObjectDeleteObject 权限。Wings 在上传备份时会生成预签名 URL,如果时钟不同步(超过 15 分钟偏差)会导致签名验证失败。

踩坑实录:那些官方文档没说的

  1. 时区地狱:Wings 容器默认使用 UTC 时间,而游戏服日志通常依赖本地时区。务必在 config.ymldocker 部分设置 timezone: Asia/Shanghai,并在 Panel 的 .env 中同步 APP_TIMEZONE
  2. SELinux 防火墙:在 CentOS/RHEL 上,SELinux 会阻止 Wings 访问 Docker socket。执行 setsebool -P httpd_can_network_connect 1 或临时关闭 SELinux 进行测试。
  3. 内存溢出的 OOM:Wings 默认不限制容器内存。对于 Java 类服务器(如 Minecraft),务必在 Panel 的"启动参数"中设置 -Xmx-Xms,并在 Wings 的 config.yml 中启用 swap 限制,防止节点宿主机因内存耗尽而触发 OOM Killer。

结语

翼龙面板的节点部署本质上是一次容器编排的工程化实践。它考验的不是你对某个 Web 面板的熟悉度,而是对 Docker 网络、Linux 系统安全、分布式存储的综合理解。当你成功让 Wings 节点在异地下稳定上报心跳,并通过 SFTP 成功上传 mod 文件的那一刻,你掌握的早已不止是一个游戏管理工具,而是一套可复用的云原生运维范式。

你在部署 Wings 节点时遇到过哪些诡异的网络或权限问题?欢迎在评论区分享你的排障日志,我们一起深挖底层原理。

Licensed under CC BY-NC-SA 4.0