前言
本文只做技术分享,禁止转载
本文分为两个章节进行讲解,这两个没有直接关系也没啥间接关系,但重复内容我就没有再复制粘贴了,需要的地方也有跳转提示,佬友根据自己情况进行查看
一、搭建自用节点(简单)
二、搭建机场(较复杂)由于VPS选择+Cloudflare+域名配置跟我之前的文章有交叉,为了对小白友好,所以我就直接复制粘贴了,有了解的佬友可以自行选择需要的章节进行学习,右边有目录
本教程需要的技术(版本仅作为参考):
一、搭建自用节点(简单):
VPS(云服务器)(地区选择:硅谷,必须海外):2c2g(2个CPU核数2G的内存,1c1g即可)
v2ray-agent(八合一脚本):v3.5.18(latest)二、搭建机场(较复杂)
VPS(云服务器)(地区选择:硅谷,必须海外):2c2g(2个CPU核数2G的内存,必须2g内存)
Xboard(机场开源面板):master 分支最新开发版(2026-05-03 构建)(没有具体版本号)(latest)(既然做机场了,就不用SQLite,直接上mysql+redis,所以这里至少需要2g内存)
V2bX:v0.4.0(latest)
Caddy:v2.11.3(latest)
mysql:5.7
redis:8.6.3(latest)
docker:26.1.4
docker-compose:2.27.1本教程需要的工具:
FinalShell:SSH远程连接工具
v2rayN:代理工具
clash-verge-rev:代理工具
零、VPS选择+域名配置(cf代理)
我买了腾讯云的服务器用来做教学,全程可用国内网访问
有vps的佬可以跳过这一步了
VPS选择
1、活动页腾讯云最新活动
这个为新人优惠,2c2g一年99米
这是两个图片拼接起来的,颜色不同的大框表示不同的图片,这两个图片的截取在同一个页面,下滑即可
2、购买完毕后进入控制台
这也是两张图片拼接起来的,颜色不同的大框表示不同的图片,上面黄框是腾讯云的主页的头部标签,下面红框是点击控制台后进入控制台的页面
3、查看服务器ip
也是由黄框和红框分别不同的图片
由于腾讯云默认安全组打开了22端口(SSH服务),这里就不进安全组了,后文有讲到如何配置安全组,这里不过多赘述
4、使用FinalShell连接到服务器
填写名称、主机ip、用户名和密码即可连接到我们的服务器
FinalShell的好处就是修改文件或者上传下载文件时是可视化的,不用一遍一遍敲命令行
域名配置(cf代理)
这里我使用的是cloudflare做的代理,所以我按cloudflare讲解,其他的云服务商配置也是大同小异
我买的顶级域名为(严格来说这是二级域名,我习惯说这是顶级域名):wudike.online下文有两个地方需要使用到域名,一个是我们搭建机场(xboard服务)还有一个是配置自用节点(可不使用域名,且不使用域名更高效、安全)
1、使用 Cloudflare 的 DNS 代理我们的域名
(1、进入域名与网站这里的域名是我之前买的,在阿里云上的,所以我用阿里云作为演示,各个云服务商的操作都是大同小异的
(2、选择域名进行购买
查询之后下滑点击购买就可以了
域名这里买了之后要实名去备份,审核要几个工作日吧,有点忘记了
(3、登录Cloudflare,并交给Cloudflare托管
①、添加域名ps:Cloudflare右上角人物头像那可以切换语言
下面那个我已经注册了,上面已经有服务了,注销在注册太麻烦
②、跟着我的步骤点点就行了
上面四个步骤结束后我们得到了下面这个页面,需要去我们的云服务商重新配置一下DNS解析
③、我们去阿里云配置一下域名的解析
进入我们的工作台,点击域名就可以看到我们购买的域名了
进去之后我们就可以修改DNS代理了
注: 国际域名最少填写2个,最多填写13个,国内域名最多填写6个。
所以我们两个都要复制哦,把之前的替换掉
④、回到Cloudflare
下拉后,点击我已更新名称服务器
我们等十分钟后刷新一下
如果出现这样就代表成功了,由于我已经配置了一个域名,不想再去买一个配置了,下面这张图用的小黄大佬的图
一、搭建自用节点(简单)
1、安装v2ray-agent脚本
wget -P /root -N --no-check-certificate "https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh" && chmod 700 /root/install.sh && /root/install.sh
运行完上面代码我们就得到了下面的脚本执行命令
2、根据面板选择
2.1、Xray-core + VLESS + Reality + uTLS + Vision(简单、抗探测能力强、抗封锁能力强、传输速度快、资源占用率低、无域名、不可cdn代理,推荐)
不要以为无域名无代理就不安全了,恰恰相反这是最快最安全的(之一),唯一的缺点是无法套CDN,自用够够的了
从上至下执行命令
vasma # 执行脚本
2 # 任意组合安装
1 # Xray-core
7 # VLESS+Reality+uTLS+Vision[推荐]
# 后面回车即可,注意端口这里要开防火墙和安全组,所以手动填好一点
执行后就得到了下面三个字符串,最重要的是通用格式,复制通用格式的字符串
复制进我们的 v2rayN 代理工具中测试一下可使用了,文章后面我会讲如何导入clash
回车后选择自动配置系统代理即可使用
2.2、Xray-core + VLESS + TLS + WS(复杂、抗探测能力弱、抗封锁能力弱、传输速度一般、资源占用率低、有域名、可cdn代理,不推荐)
关掉代理在v2ray-agent脚本中配置域名会有 nginx 占用443端口,所以有服务使用了443端口,强烈不建议用这个
首先在cloudflare中配置域名时代理状态先关掉(变成灰色的云),脚本检测域名是否指向了本机
创建API令牌
这里是因为脚本需要通过我们的 api token 去获取SSL证书,所以我们需要先申请API token
搜索 API 令牌,点击创建令牌
使用编辑区域DNS模板,选择域名后一路确认到最后一步复制 API ,注意这里关闭后就无法找到了,记得保存
执行脚本
从上至下执行命令,我现在配置的域名为cdn.wudike.online
vasma # 执行脚本
2 # 任意组合安装
1 # Xray-core
1 # VLESS+TLS+WS[仅CDN推荐]
域名:cdn.wudike.online # 你自己的域名
端口:2053 # 因为cf的https有固定的几个端口不可乱填,可以填的端口:443、2053、2083、2087、2096、8443
是否使用DNS API申请证书[支持NAT]?[y/n]:y # 后面要用到我们上面 api token
请选择[回车]使用默认:1 # cloudflare[默认]
请输入API Token:**** # 星号就是我们复制的 api token
请选择[回车]使用默认:1 # letsencrypt[默认]
# 后面的操作无脑回车即可,也可以自己填,无所谓的
我们就得到了 vless 链接,注意要用ws的,使用方式如 2.1 所示
配置 cf 代理并测试
我们再去 cf 开启域名的代理,等10分钟后我们去测试
测试一下是否符合我们的预期,符合预期
PS:配置Clash
这里相当于就是把vless链接转为clash的yaml文件,为了佬友方便,我 vibe coding 了一个项目
源码放在这里了:clash-converter
也可以使用我部署的网站:Proxy ↔ Clash 双向转换器
二、搭建机场(较复杂)
1、创建文件
这里我们要创建单个文件,第一个是xboard的配置文件
.env、一个是docker-compose.yml启动文件、一个是Caddyfile(caddy的配置文件,之前的文章讲了nginx,这里就换个代理工具讲解)
mkdir -p /opt/xboard && touch /opt/xboard/{.env,Caddyfile,docker-compose.yml}
.env
包含
的参数是需要修改的,包含
的是可修改的,其他的可以照抄
APP_NAME=XBoard
APP_ENV=production
APP_KEY=base64:iH2lk8cdnIj0sLgeNzEzAa2GEhPCROrxsa5etAk35sI=
APP_DEBUG=false
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql # ❓选择mysql服务,看样子也可以使用postgresql,这个就交给各位实践了
DB_HOST=mysql # ⚠️mysql的服务名(docker-compose文件中的服务名)
DB_PORT=3306 # 用默认的就行了
DB_DATABASE=xboard # ❓数据库名
DB_USERNAME=root # 数据库用户名,用root就行了,其实该mysql也不对外,新不新增用户都行
DB_PASSWORD=123456 # ⚠️密码,就算不对外,这个还是设计的越安全越好的
REDIS_HOST=redis # ⚠️redis的服务名(docker-compose文件中的服务名)
REDIS_PASSWORD= # redis不要设置密码,也可以设置,主要是麻烦
REDIS_PORT=6379 # 用默认的就行了
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
MAIL_DRIVER=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=
MAILGUN_DOMAIN=
MAILGUN_SECRET=
# google cloud storage
ENABLE_AUTO_BACKUP_AND_UPDATE=false
GOOGLE_CLOUD_KEY_FILE=config/googleCloudStorageKey.json
GOOGLE_CLOUD_STORAGE_BUCKET=
# Prevent reinstallation
# 这里是初始化需要的参数,没有值的时候就说明是初始化,可以使用初始化脚本,初始化脚本执行完成后会修改这个值,所以不需要手动再次修改该文件
INSTALLED=
docker-compose.yml
包含
的参数是需要修改的,包含
的是可修改的,其他的可以照抄
services:
# ---------- Xboard 主应用 ----------
xboard: # 服务名
image: ghcr.io/cedar2025/xboard:latest # 镜像名
restart: unless-stopped # 重启策略
container_name: xboard # 容器名
# 移除 ports 映射,因为现在通过 Caddy 代理
# ports:
# - "9888:7001"
expose:
- "7001" # ⚠️只在内部网络暴露 希望保留给宿主机的话用上面的ports
depends_on: # mysql和redis检测到健康后再启动
mysql:
condition: service_healthy
redis:
condition: service_healthy
volumes: # 卷挂载
- ./.env:/www/.env # 挂载 .env 文件
- ./.docker/.data/:/www/.docker/.data
- ./storage/logs:/www/storage/logs
- ./storage/theme:/www/storage/theme
- ./plugins:/www/plugins
environment: # 环境参数
- RESOURCE_PROFILE=balanced # minimal | balanced | performance | auto
- ENABLE_HORIZON=true
- docker=true
networks: # docker网络
- xboard-net
# ---------- MySQL 数据库 ----------
mysql:
image: mysql:5.7
restart: unless-stopped
container_name: xboard-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456 # ⚠️密码改后记得后面操作还需要输入
MYSQL_DATABASE: xboard # ❓建议不改
volumes:
- mysql-data:/var/lib/mysql
networks:
- xboard-net
healthcheck: # 心跳检测机制
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p123456"]
timeout: 20s
retries: 10
# ---------- Redis 缓存 ----------
redis:
image: redis:latest
restart: unless-stopped
container_name: xboard-redis
command: redis-server --appendonly yes # 启用 AOF
volumes:
- redis-data:/data
networks:
- xboard-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
# ---------- Caddy 反向代理 ----------
caddy:
image: caddy:latest
restart: unless-stopped
container_name: xboard-caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro # ❓就是下面的Caddyfile文件建议不改
- caddy-data:/data # 存储证书
networks:
- xboard-net
depends_on:
- xboard
networks:
xboard-net:
driver: bridge # 桥接模式
volumes:
mysql-data: # MySQL 数据持久化
redis-data: # Redis 数据持久化(原有)
caddy-data: # 存储证书
Caddyfile
这里域名需要再cf中进行配置,具体参考本文目录中,
一、搭建自用节点(简单)中的2.2、Xray-core + VLESS + TLS + WS(复杂、抗探测能力弱、抗封锁能力弱、传输速度一般、资源占用率低、有域名、可cdn代理,不推荐),看一下就会配置域名了包含
的参数是需要修改的,包含
的是可修改的,其他的可以照抄
# 替换成你的实际域名
vpn.wudike.online { # ⚠️改成自己的域名
# 反向代理到 Xboard 容器
reverse_proxy xboard:7001 # ⚠️这里也是自己的服务名和端口
}
2、初始化
先让mysql和redis服务跑起来再初始化
docker compose up -d mysql redis
# 等个10s后执行下面脚本
docker compose run -it --rm -e ENABLE_REDIS= xboard php artisan xboard:install
下面是执行后的结果,供参考
包含的参数是需要修改的,包含
的是可修改的,
xxx是脱敏需要你们自己填,其他的可以照抄
[root@VM-0-16-centos xboard]# docker compose up -d mysql redis
[+] Running 6/6
✔ Network xboard_xboard-net Created 0.1s
✔ Volume "xboard_redis-data" Created 0.0s
✔ Volume "xboard_caddy-data" Created 0.0s
✔ Volume "xboard_mysql-data" Created 0.0s
✔ Container xboard-redis Started 0.5s
✔ Container xboard-mysql Started 0.5s
[root@VM-0-16-centos xboard]# docker compose run -it --rm -e ENABLE_REDIS= xboard php artisan xboard:install
[+] Creating 2/0
✔ Container xboard-mysql Running 0.0s
✔ Container xboard-redis Running 0.0s
[entrypoint] Auto-tune (profile=balanced): cpus=2 mem=1024MiB slots=9 -> octane=2 horizon(dp/biz/notif)=2/1/1 horizon_worker_mem=256MB
[entrypoint] Horizon supervisors use balance=auto with minProcesses=1, so they scale up to the cap on demand and back down when idle.
[entrypoint] Skipping xboard:update (not yet installed or running xboard:install).
[entrypoint] Starting services (caddy=true web=true horizon=true ws=true)...
__ __ ____ _
\ \ / /| __ ) ___ __ _ _ __ __| |
\ \/ / | __ \ / _ \ / _` | '__/ _` |
/ /\ \ | |_) | (_) | (_| | | | (_| |
/_/ \_\|____/ \___/ \__,_|_| \__,_|
┌ 请选择数据库类型 ────────────────────────────────────────────┐
│ MySQL │
└──────────────────────────────────────────────────────────────┘
┌ 请输入MySQL数据库地址 ───────────────────────────────────────┐
│ mysql # ⚠️这里是docker中mysql的服务名 │
└──────────────────────────────────────────────────────────────┘
┌ 请输入MySQL数据库端口 ───────────────────────────────────────┐
│ 3306 │
└──────────────────────────────────────────────────────────────┘
┌ 请输入MySQL数据库名 ─────────────────────────────────────────┐
│ xboard │
└──────────────────────────────────────────────────────────────┘
┌ 请输入MySQL数据库用户名 ─────────────────────────────────────┐
│ root │
└──────────────────────────────────────────────────────────────┘
┌ 请输入MySQL数据库密码 ───────────────────────────────────────┐
│ 123456 │
└──────────────────────────────────────────────────────────────┘
┌ 是否启用Docker内置的Redis ───────────────────────────────────┐
│ 不启用 │
└──────────────────────────────────────────────────────────────┘
┌ 请输入Redis地址 ─────────────────────────────────────────────┐
│ redis │
└──────────────────────────────────────────────────────────────┘
┌ 请输入Redis端口 ─────────────────────────────────────────────┐
│ 6379 │
└──────────────────────────────────────────────────────────────┘
┌ 请输入redis密码(默认: null) ─────────────────────────────────┐
│ # ❓redis本来就没有设置密码,这里回车就行了 │
└──────────────────────────────────────────────────────────────┘
┌ 请输入管理员账号 ────────────────────────────────────────────┐
│ xxxxxxxxxxxxxx # ⚠️管理员登录的账号 │
└──────────────────────────────────────────────────────────────┘
INFO Configuration cached successfully.
正在导入数据库请稍等...
🚀 开始执行流量重置任务...
🔧 修正模式 - 将重新计算next_reset_at为null的用户
✅ 没有发现next_reset_at为null的用户
✅ 任务完成!
📊 修正结果统计:
🔍 发现用户总数: 0
✅ 成功修正数量: 0
⏱️ 总执行时间: 0 秒
✨ 无错误发生
数据库导入完成
开始注册管理员账号
正在安装默认插件...
默认插件安装完成
🎉:一切就绪
管理员邮箱:xxxxxxxxxxxxxx # ⚠️之前输入的账号,这里改不了,加感叹号号是提示这里比较重要
管理员密码:xxx # ⚠️初始密码,后面可以改
访问 http(s)://你的站点/xxx 进入管理面板,你可以在用户中心修改你的密码。 # ⚠️/xxx 要带这个path才能访问管理员的面板
3、启动Xboard
cd /opt/xboard && docker compose up -d
访问我们的域名就可以看见项目已经启动部署成功了
4、配置我们的xboard(后台管理系统,跟path有关系,仔细看第二步的最后)
通过我们的域名+path登录到后台管理系统(
https://域名/path)
这里不会什么功能都讲,主要是把主流程给跑通
(1、修改名字
(2、添加节点(很重要)
在节点管理中添加节点
我们选择vless去配置就可以了,这里我把主要的以文字形式写出来,也可以直接看我的图片讲讲
协议:vless
节点名称:随意
自定义节点ID:很重要后面创建节点会用到
权限组:这个跟后面的套餐有关系,套餐又跟用户有关系,所以很重要,没有就添加一个
节点地址:ip地址
连接端口、服务端口:记得开服务端口的防火墙和安全组
安全性:Reality
伪装节点:找个大网站就行了
私钥、公钥:生成一下就行了
Short ID:生成一下就行了
uTLS:开启
传输协议:TCP
流控:xtls-rprx-vision
可以照着我的写
添加完之后记得打开显示开关
(3、套餐管理(其实还有一部权限组管理,但我们在节点里面也添加了一个权限,所以可以直接略过了)
有四个参数要填写,其他随意
名称:随意,不要和权限组管理名称重复,不好管理
服务器分组:就是我们之前填的权限组管理
流量、价格:记得设置,不然后续购买有问题
打开显示、新购、续费开关
(4、新增用户(为了后面方便测试)
(5、创建ApiKey(很重要)
在系统配置的节点配置中生成一个通讯秘钥
5、使用V2bX创建脚本
(1、环境准备# 修复 V2bX 必需文件(必须执行)
mkdir -p /etc/V2bX && echo "{}" > /etc/V2bX/sing_origin.json
(2、安装 V2bX
wget -N https://raw.githubusercontent.com/wyx2685/V2bX-script/master/install.sh && bash install.sh
# 执行到这里的时候选择n
检测到你为第一次安装V2bX,是否自动直接生成配置文件?(y/n): n
(3、修改/etc/V2bX/config.json文件
这里面有几个参数可以修改
ApiHost:你自己的域名
ApiKey:之前在系统管理里面生成的通讯秘钥
NodeID:之前在节点中自定义的节点ID
NodeType:我们之前创建节点的时候选择的Vless协议
{
"Log": {
"Level": "info"
},
"Cores": [
{
"Type": "sing",
"Log": {
"Level": "info"
},
"OriginalPath": "/etc/V2bX/sing_origin.json"
}
],
"Nodes": [
{
"Core": "sing",
"ApiHost": "https://这里改成你的域名",
"ApiKey": "这里是之前在系统管理里面生成的通讯秘钥",
"NodeID": 1001,
"NodeType": "Vless",
"Timeout": 30,
"ListenIP": "0.0.0.0",
"SendIP": "0.0.0.0",
"SniffEnabled": true
}
]
}
(4、启动服务
# 重启服务
systemctl restart V2bX
# 查看运行日志 如果在日志中看见 Nodes started 说明节点启动成功
journalctl -u V2bX.service -f
(5、查看Xboard中节点情况
可以看见这里变黄了,就是说待使用了,下一步我们就是让他变绿,接下来就是测试步骤了
6、测试
登录我们前台的系统(就是去掉path,管用域名登录(
https://域名))
这个页面使用过机场的佬友就很熟悉了
我用的就是之前创建的测试用户登录,给了一个100g的套餐所以直接就有一个100g的套餐
我们点一下一键订阅,并复制订阅地址到clash去试一下
去clash测试一下没有问题
去后台面板看看节点情况(
https://域名/path),变绿了,没有问题,完结撒花
ps:也可以去购买订阅中看一下,我在套餐那新增了两个套餐和提示词模板,这样就有模有样了
参考文章
V2bX 单节点(VLESS / Reality)部署指南 xboard | Limin Studio
6 个帖子 - 6 位参与者