这篇教程源于我最近的一次从零搭建 Xboard 面板、Caddy HTTPS、Hysteria2 节点、订阅域名、SMTP 邮件和上线收口的完整过程。
适合你的场景是:你有一台公网 Linux 服务器部署 Xboard 面板,再用一台或多台 Linux VPS 作为节点。当然 Xboard 部署在本地也不是大问题,但至少要有一台海外服务器承接节点。
开工前,建议先把下面这些东西准备齐:
80/tcp 和 443/tcp。8443/udp,或者后续使用端口跳跃时开放 20000-29999/udp。curl、wget、git、ufw,以及后续要安装的 Docker、Caddy、certbot。本文示例域名如下:
面板域名:v.shishishi3.com
订阅域名:474769754.xyz
香港节点:hk.474769754.xyz
美国节点:us.474769754.xyz
实际使用时替换成你自己的域名。
本文采用直接的 Linux 部署方式:
用户 -> 域名 HTTPS -> Linux 服务器 Caddy -> Xboard 容器
用户 -> HY2 节点域名 UDP -> Linux 节点服务器 xboard-node
推荐把域名职责拆开:
v.shishishi3.com
用途:Xboard 主面板、后台登录、管理员操作
474769754.xyz
用途:订阅分发入口
hk.474769754.xyz
用途:香港节点域名
us.474769754.xyz
用途:美国节点域名
不建议用同一个域名同时做后台、订阅和节点。分开之后排错和风控都清爽很多,同时也能降低某一项业务出问题后连带影响其他业务的风险。
如果你打算把订阅入口单独拆出来,买一个纯数字域名通常就够用了,一般不会超过 ¥10。
面板服务器建议:
系统:Ubuntu 22.04 / 24.04 或 Debian 12
内存:1GB 起,2GB 更稳
端口:80/tcp, 443/tcp
节点服务器建议:
系统:Ubuntu 22.04 / 24.04 或 Debian 12
协议:Hysteria2
端口:8443/udp,或端口跳跃 20000-29999/udp
先更新系统:
sudo apt-get update
sudo apt-get install -y curl wget ca-certificates git ufw
如果这里因为之前安装过 Ookla speedtest 源报错卡住,直接跳到 系统 apt 源报错。
Cloudflare DNS 示例:
A v 面板服务器 IP DNS only
A @ 面板服务器 IP DNS only
A hk 香港节点 IP DNS only
A us 美国节点 IP DNS only
重点:
474769754.xyz 的主机名要填 @,不是填 474769754。DNS only,不要橙云。验证:
nslookup 474769754.xyz 1.1.1.1
nslookup hk.474769754.xyz 1.1.1.1
nslookup us.474769754.xyz 1.1.1.1
如果你本机开了代理或 TUN,看到了 198.18.x.x 这种 fake-ip,跳到 DNS 被 fake-ip 干扰。
如果服务器还没有 Docker:
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now docker
docker --version
docker compose version
Xboard 官方 compose 分支提供了 Docker Compose 模板,默认把容器 7001 暴露到宿主机 7001。
cd /opt
sudo git clone -b compose --depth 1 https://github.com/cedar2025/Xboard Xboard
cd /opt/Xboard
确认 compose.yaml 里有类似配置:
services:
xboard:
image: ghcr.io/cedar2025/xboard:latest
restart: unless-stopped
ports:
- "7001:7001"
volumes:
- ./.env:/www/.env
- ./.docker/.data/:/www/.docker/.data
- ./storage/logs:/www/storage/logs
- ./storage/theme:/www/storage/theme
- ./plugins:/www/plugins
- redis-data:/data
初始化安装,推荐 SQLite + 内置 Redis,简单好维护:
sudo docker compose run --rm \
-e ENABLE_SQLITE=true \
-e ENABLE_REDIS=true \
-e ADMIN_ACCOUNT=admin@example.com \
xboard php artisan xboard:install
安装完成后会输出:
管理员邮箱
管理员密码
后台路径
保存好这些信息,然后启动长期服务:
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs -f
测试本机访问:
curl -I http://127.0.0.1:7001
正常应返回:
HTTP/1.1 200 OK
安装 Caddy:
sudo apt-get install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt-get update
sudo apt-get install -y caddy
写入 /etc/caddy/Caddyfile:
v.shishishi3.com {
reverse_proxy 127.0.0.1:7001
}
474769754.xyz {
handle /s/* {
reverse_proxy 127.0.0.1:7001
}
handle /api/v1/client/subscribe* {
reverse_proxy 127.0.0.1:7001
}
respond "Not Found" 404
}
解释:
v.shishishi3.com
完整反代 Xboard 面板。
474769754.xyz
只开放订阅路径,不暴露后台。
这里的 /s/* 很重要。Xboard 实际订阅链接可能是:
https://474769754.xyz/s/xxxxxxxxxxxxxxxx
如果只放行 /api/v1/client/subscribe*,客户端导入订阅会被 Caddy 拦截。这种情况直接跳到 订阅 404。
验证并重载 Caddy:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo journalctl -u caddy -f
测试:
curl -I https://v.shishishi3.com
curl -I https://474769754.xyz
预期:
https://v.shishishi3.com -> 200
https://474769754.xyz -> 404
数字域名根路径返回 404 是正常的,因为我们故意不暴露面板。
如果这里出现 unexpected eof while reading,跳到 Caddy TLS EOF。
进入后台后先改:
站点名称:xxx
站点 URL: 此处应为您的域名或子域名(例如 https://v.shishishi3.com)
订阅 URL:此处应为您的域名或子域名(例如 https://474769754.xyz)
安全建议:
后台路径:改成随机路径
开放注册:上线前再开(自用的话可以不开放)
邮箱验证:开启
登录验证码:开启
注册验证码:开启
订阅防盗:开启
如果只有一个 URL 字段,就填:
https://v.shishishi3.com
如果有单独订阅 URL,填:
https://474769754.xyz
Cloudflare Email Routing 只能收信和转发,不能作为 SMTP 发信服务器。
推荐用 Brevo 免费 SMTP:
SMTP 主机:smtp-relay.brevo.com
SMTP 端口:587
加密方式:TLS
SMTP 用户名:Brevo 给你的 SMTP Login
SMTP 密码:Brevo SMTP Key
发件人地址:noreply@474769754.xyz
注意:
587 对应 TLS/STARTTLS,不要选 SSL/TLS。ac96b9001@smtp-brevo.com 这类地址是 SMTP 登录用户名,不是发件人地址。noreply@474769754.xyz,但必须在 Brevo 验证。noreply@474769754.xyz 的验证邮件。Cloudflare DNS 里 SPF 只能有一条。如果 Cloudflare 已有:
v=spf1 include:_spf.mx.cloudflare.net ~all
Brevo 又要求:
v=spf1 include:spf.brevo.com ~all
要合并成:
v=spf1 include:_spf.mx.cloudflare.net include:spf.brevo.com ~all
如果发验证码收不到,先看 Xboard 日志:
cd /opt/Xboard
sudo docker compose logs --tail=160 xboard
sudo grep -R "SMTP\|Brevo\|SendEmailJob\|Unauthorized" storage/logs/
如果日志里出现 525 5.7.1 Unauthorized IP address,直接跳到 邮件验证码收不到。
请根据您的实际节点机器和情况来,以下为我的套餐示例:
如果美国节点有较大流量,香港节点只有少量流量,建议这样定位:
美国圣何塞:主力节点,1x
香港节点:备用节点,5x / 8x / 10x
低价套餐示例:
套餐名:Vela Basic
月付:3.9 元
年付:36 元
流量:50GB/月
限速:300Mbps
设备数:3
US:1x
HK:5x 或更高
如果定价是:
月付:3 元
年付:30 元
建议:
流量:40GB/月
限速:200Mbps
设备数:2
HK:8x
套餐描述模板:
## 套餐详情
- 流量:{{transfer}} GB
- 速度限制:{{speed}} Mbps
- 同时在线设备:{{devices}} 台
- 主力节点:美国西岸圣何塞
- 备用节点:香港高倍率节点
## 服务说明
1. 流量{{reset_method}}重置
2. 支持多平台使用,适配常见 iOS、Android、Windows、macOS 客户端
3. 美国圣何塞节点为主力线路,万兆带宽接入,实际可用峰值约 1.8Gbps - 6Gbps
4. 香港节点为备用线路,因月流量有限采用高倍率计费,适合临时切换或低延迟访问
5. 适合日常浏览、社交媒体、AI 工具访问与轻度流媒体使用
6. 禁止 BT/PT、挖矿、扫描攻击、垃圾邮件及长时间占满带宽等滥用行为
7. 7×24小时技术支持
在 Xboard 后台创建节点,类型选择:
Hysteria

示例 HK 节点:
节点名称:HK-HY2-01
基础倍率:5
流量限制:0
标签:HK, HY2
权限组:Default
节点地址:hk.474769754.xyz
连接端口:8443
服务端口:8443
协议版本:V2
混淆:开启
混淆实现:Salamander
混淆密码:随机生成
SNI:hk.474769754.xyz
允许不安全:关闭
ECH:关闭
上行带宽:按真实带宽填
下行带宽:按真实带宽填
绑定服务器:独立部署或绑定对应机器
示例 US 节点:
节点名称:US-HY2-01
基础倍率:1
节点地址:us.474769754.xyz
连接端口:8443
服务端口:8443
SNI:us.474769754.xyz
注意:
reverse_proxy 代理普通 HY2 UDP 流量。下面这张图对应的是连接端口、服务端口、混淆、SNI 和 ECH 这些传输层相关配置:

如果你要配置端口跳跃和绑定服务器,可以参考下面这张对应界面:

您可以直接到 Xboard 的管理后台 -> 节点管理 -> 添加服务器 获取安装 xboard-node 的相关代码,然后将命令在服务器中执行,等待下载完成即可。

在完成安装后可以看到面板的服务器显示在线以及负载等信息

HY2 必须有 TLS 证书。
如果你已经看到 protocol "hysteria" requires TLS certificate files,直接跳到 服务器在线但节点未运行。
先申请证书。节点服务器上如果没有 Web 服务占用 80,可以直接:
sudo apt-get install -y certbot
sudo certbot certonly --standalone \
-d hk.474769754.xyz \
--agree-tos \
-m admin@474769754.xyz \
--non-interactive
如果同机有 Caddy 或 nginx 占用 80,先停服务,申请后再启动:
sudo systemctl stop caddy
sudo certbot certonly --standalone -d hk.474769754.xyz --agree-tos -m admin@474769754.xyz --non-interactive
sudo systemctl start caddy
证书路径:
/etc/letsencrypt/live/hk.474769754.xyz/fullchain.pem
/etc/letsencrypt/live/hk.474769754.xyz/privkey.pem
复制到 Xboard-Node 目录:
sudo mkdir -p /etc/xboard-node/certs
sudo install -m 0644 /etc/letsencrypt/live/hk.474769754.xyz/fullchain.pem \
/etc/xboard-node/certs/hk.fullchain.pem
sudo install -m 0600 /etc/letsencrypt/live/hk.474769754.xyz/privkey.pem \
/etc/xboard-node/certs/hk.privkey.pem
编辑配置:
sudo nano /etc/xboard-node/config.yml
顶层加入:
cert:
cert_mode: file
domain: hk.474769754.xyz
cert_file: /etc/xboard-node/certs/hk.fullchain.pem
key_file: /etc/xboard-node/certs/hk.privkey.pem
注意 cert: 必须是顶层配置,不要缩进到 panel: 或 machine: 下面。
重启:
sudo systemctl restart xboard-node
sudo journalctl -u xboard-node --since "2 minutes ago" --no-pager
验证 UDP 监听:
sudo ss -lunp | grep 8443
正常应该看到 8443/udp。
US 节点同理,把域名和文件名换成:
us.474769754.xyz
/etc/xboard-node/certs/us.fullchain.pem
/etc/xboard-node/certs/us.privkey.pem
面板服务器开放:
80/tcp
443/tcp
22/tcp
节点服务器开放:
8443/udp
22/tcp
如果使用端口跳跃:
20000-29999/udp
ufw 示例:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8443/udp
sudo ufw enable
sudo ufw status
如果云厂商有安全组,也必须放行对应 UDP。只开系统防火墙不够。
Hysteria2 支持端口跳跃。推荐范围:
20000-29999/udp
Xboard 节点配置:
连接端口:20000-29999
服务端口:8443
Hop 间隔:30
节点服务器把端口范围转发到实际监听端口:
sudo iptables -t nat -A PREROUTING -p udp --dport 20000:29999 -j REDIRECT --to-ports 8443
保存规则:
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save
检查:
sudo iptables -t nat -S PREROUTING | grep 8443
sudo ss -lunp | grep 8443
稳定前建议同时保留:
8443/udp
20000-29999/udp
稳定后可以只保留端口跳跃范围。
如果你担心 ss 看不到端口范围,跳到 无法看到 UDP 端口范围。
用户创建流程:
创建套餐 -> 创建用户 -> 给用户绑定套餐 -> 复制订阅链接 -> 客户端导入
如果客户端导入后只有 DIRECT,没有节点,常见原因:
直接看订阅内容:
curl -L "https://474769754.xyz/s/你的token"
如果输出里没有:
hysteria
hy2
hk.474769754.xyz
US-HY2-01
说明 Xboard 没把节点发出来,优先查套餐和权限组。
如果输出里有节点,但客户端不显示,换支持 HY2 的客户端或换订阅类型,例如 sing-box、Clash Meta、Mihomo。
建议上线前确认:
SMTP 测试邮件成功
邮箱验证开启
注册验证码开启
登录验证码开启
后台路径已改随机
订阅域名只放行 /s/*
套餐权限组配置正确
节点倍率配置正确
HK 节点倍率较高
云安全组只开放必要端口
试用策略建议:
注册送套餐:关闭
或 1GB / 1 天
低价套餐不要开放过多 HK 流量
最终建议端口:
面板服务器:
80/tcp
443/tcp
22/tcp
节点服务器:
22/tcp
20000-29999/udp
如果不用端口跳跃:
22/tcp
8443/udp
Caddy 只暴露:
面板域名完整反代
订阅域名只放行 /s/* 和必要 API
后台设置:
开放注册:按需开启
邮箱验证:开启
验证码:开启
后台路径:随机
试用额度:极低或关闭
节点策略:
US 主力,1x
HK 备用,5x / 8x / 10x
这样就能从测试态进入公开上线态。
如果遇到这个错误:
E: The repository 'https://packagecloud.io/ookla/speedtest-cli/ubuntu noble Release' does not have a Release file.
说明 Ookla speedtest 的 apt 源不支持当前系统版本,先禁用它:
grep -R "packagecloud.io/ookla" /etc/apt/sources.list /etc/apt/sources.list.d/
假设输出是:
/etc/apt/sources.list.d/ookla_speedtest-cli.list
禁用:
sudo mv /etc/apt/sources.list.d/ookla_speedtest-cli.list \
/etc/apt/sources.list.d/ookla_speedtest-cli.list.disabled
sudo apt-get update
这是我们实际踩过的坑。安装脚本里只要跑 apt-get update,这个坏源就会把整套流程卡住。
如果你本机开了代理或 TUN,可能会看到 198.18.x.x 这种 fake-ip。这时用公共 DNS 或临时关闭代理排查。
现象:
curl: (35) TLS connect error: unexpected eof while reading
排查:
nslookup 域名 1.1.1.1
sudo caddy validate --config /etc/caddy/Caddyfile
sudo journalctl -u caddy -f
常见原因:
如果响应头是:
HTTP/2 404
server: Caddy
content-length: 9
说明 Caddy 拦了。确认 Caddyfile 放行:
handle /s/* {
reverse_proxy 127.0.0.1:7001
}
看日志:
sudo grep -R "SendEmailJob\|SMTP\|Unauthorized" /opt/Xboard/storage/logs/
如果有:
525 5.7.1 Unauthorized IP address
这表示 Brevo 拒绝了发信出口 IP。查 Xboard 容器出口 IP:
cd /opt/Xboard
sudo docker compose exec -T xboard curl -s https://ifconfig.me
把返回的 IP 加到 Brevo 的 Authorized IP addresses 里。
看日志:
sudo journalctl -u xboard-node -n 120 --no-pager
如果有:
requires TLS certificate files
说明 HY2 缺证书配置,按第 11 节补 cert:。
这是正常状态,表示节点已经启动,只是当前没有客户端连接。
检查:
sudo ss -lunp | grep 8443
如果使用端口跳跃,ss 不显示 20000-29999 是正常的,因为程序实际监听的是 8443。要看 iptables:
sudo iptables -t nat -S PREROUTING | grep 20000
同时别忘了云厂商安全组也要放行 20000-29999/udp。
如果提示“该订阅下存在订单无法删除”,不要硬删。
推荐:
禁用套餐
隐藏套餐
关闭购买
改名 Test-Deprecated
生产系统里保留历史订单引用是正常设计。
ghcr.io/cedar2025/xboard:latest 镜像:https://github.com/cedar2025/Xboard/tree/compose7001 映射到容器 7001:https://raw.githubusercontent.com/cedar2025/Xboard/compose/compose.yamlhttps://github.com/cedar2025/Xboard-Nodehttps://v2.hysteria.network/docs/advanced/Port-Hopping/https://developers.cloudflare.com/email-service/get-started/https://help.brevo.com/hc/en-us/articles/7924908994450-Send-transactional-emails-using-Brevo-SMTP