手把手教你搭建机场(节点) VPS+Xboard+V2bX+Docker+Caddy+Cloudflare+域名配置 全图文 保姆级教程

前言 本文只做技术分享,禁止转载 本文分为两个章节进行讲解,这两个没有直接关系也没啥间接关系,但重复内容我就没有再复制粘贴了,需要的地方也有跳转提示,佬友根据自己情况进行查看 一、搭建自用节点(简单) 二、搭建机场(较复杂) 由于VPS选择+Cloudflare+域名配置跟我之前的文章有交叉,为了对...
手把手教你搭建机场(节点) VPS+Xboard+V2bX+Docker+Caddy+Cloudflare+域名配置 全图文 保姆级教程
手把手教你搭建机场(节点) VPS+Xboard+V2bX+Docker+Caddy+Cloudflare+域名配置 全图文 保姆级教程

前言

本文只做技术分享,禁止转载

本文分为两个章节进行讲解,这两个没有直接关系也没啥间接关系,但重复内容我就没有再复制粘贴了,需要的地方也有跳转提示,佬友根据自己情况进行查看
一、搭建自用节点(简单)
二、搭建机场(较复杂)

由于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米
这是两个图片拼接起来的,颜色不同的大框表示不同的图片,这两个图片的截取在同一个页面,下滑即可

image

2、购买完毕后进入控制台

这也是两张图片拼接起来的,颜色不同的大框表示不同的图片,上面黄框是腾讯云的主页的头部标签,下面红框是点击控制台后进入控制台的页面

image

3、查看服务器ip

也是由黄框和红框分别不同的图片
由于腾讯云默认安全组打开了22端口(SSH服务),这里就不进安全组了,后文有讲到如何配置安全组,这里不过多赘述

image

4、使用FinalShell连接到服务器

填写名称、主机ip、用户名和密码即可连接到我们的服务器
FinalShell的好处就是修改文件或者上传下载文件时是可视化的,不用一遍一遍敲命令行

image

域名配置(cf代理)

这里我使用的是cloudflare做的代理,所以我按cloudflare讲解,其他的云服务商配置也是大同小异
我买的顶级域名为(严格来说这是二级域名,我习惯说这是顶级域名):wudike.online

下文有两个地方需要使用到域名,一个是我们搭建机场(xboard服务)还有一个是配置自用节点(可不使用域名,且不使用域名更高效、安全)

1、使用 Cloudflare 的 DNS 代理我们的域名

这里的域名是我之前买的,在阿里云上的,所以我用阿里云作为演示,各个云服务商的操作都是大同小异的

(1、进入域名与网站

image

(2、选择域名进行购买

查询之后下滑点击购买就可以了
域名这里买了之后要实名去备份,审核要几个工作日吧,有点忘记了

image

(3、登录Cloudflare,并交给Cloudflare托管

ps:Cloudflare右上角人物头像那可以切换语言

①、添加域名

下面那个我已经注册了,上面已经有服务了,注销在注册太麻烦

image

②、跟着我的步骤点点就行了

image

上面四个步骤结束后我们得到了下面这个页面,需要去我们的云服务商重新配置一下DNS解析

image

③、我们去阿里云配置一下域名的解析

进入我们的工作台,点击域名就可以看到我们购买的域名了

image

进去之后我们就可以修改DNS代理了
注: 国际域名最少填写2个,最多填写13个,国内域名最多填写6个。
所以我们两个都要复制哦,把之前的替换掉

image

④、回到Cloudflare

下拉后,点击我已更新名称服务器

image

我们等十分钟后刷新一下

image

如果出现这样就代表成功了,由于我已经配置了一个域名,不想再去买一个配置了,下面这张图用的小黄大佬的图

image

一、搭建自用节点(简单)

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

运行完上面代码我们就得到了下面的脚本执行命令

image

2、根据面板选择

2.1、Xray-core + VLESS + Reality + uTLS + Vision(简单、抗探测能力强、抗封锁能力强、传输速度快、资源占用率低、无域名、不可cdn代理,推荐)

不要以为无域名无代理就不安全了,恰恰相反这是最快最安全的(之一),唯一的缺点是无法套CDN,自用够够的了
从上至下执行命令

vasma # 执行脚本
2 # 任意组合安装
1 # Xray-core
7 # VLESS+Reality+uTLS+Vision[推荐]

# 后面回车即可,注意端口这里要开防火墙和安全组,所以手动填好一点

执行后就得到了下面三个字符串,最重要的是通用格式,复制通用格式的字符串

image

复制进我们的 v2rayN 代理工具中测试一下可使用了,文章后面我会讲如何导入clash

image

回车后选择自动配置系统代理即可使用

image

2.2、Xray-core + VLESS + TLS + WS(复杂、抗探测能力弱、抗封锁能力弱、传输速度一般、资源占用率低、有域名、可cdn代理,不推荐)

在v2ray-agent脚本中配置域名会有 nginx 占用443端口,所以有服务使用了443端口,强烈不建议用这个

首先在cloudflare中配置域名时代理状态先关掉(变成灰色的云),脚本检测域名是否指向了本机

关掉代理

image

创建API令牌

这里是因为脚本需要通过我们的 api token 去获取SSL证书,所以我们需要先申请API token
搜索 API 令牌,点击创建令牌

image

使用编辑区域DNS模板,选择域名后一路确认到最后一步复制 API ,注意这里关闭后就无法找到了,记得保存

image

执行脚本

从上至下执行命令,我现在配置的域名为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 所示

image

配置 cf 代理并测试

我们再去 cf 开启域名的代理,等10分钟后我们去测试

image

测试一下是否符合我们的预期,符合预期

image

PS:配置Clash

这里相当于就是把vless链接转为clash的yaml文件,为了佬友方便,我 vibe coding 了一个项目
源码放在这里了:clash-converter
也可以使用我部署的网站:Proxy ↔ Clash 双向转换器

image

二、搭建机场(较复杂)

1、创建文件

这里我们要创建单个文件,第一个是xboard的配置文件.env、一个是docker-compose.yml启动文件、一个是Caddyfile(caddy的配置文件,之前的文章讲了nginx,这里就换个代理工具讲解)

mkdir -p /opt/xboard && touch /opt/xboard/{.env,Caddyfile,docker-compose.yml}

.env

包含:warning:的参数是需要修改的,包含:red_question_mark:的是可修改的,其他的可以照抄

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

包含:warning:的参数是需要修改的,包含:red_question_mark:的是可修改的,其他的可以照抄

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代理,不推荐),看一下就会配置域名了

包含:warning:的参数是需要修改的,包含:red_question_mark:的是可修改的,其他的可以照抄

# 替换成你的实际域名  
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

下面是执行后的结果,供参考
包含:warning:的参数是需要修改的,包含:red_question_mark:的是可修改的,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

访问我们的域名就可以看见项目已经启动部署成功了

image

4、配置我们的xboard(后台管理系统,跟path有关系,仔细看第二步的最后)

通过我们的域名+path登录到后台管理系统(https://域名/path
这里不会什么功能都讲,主要是把主流程给跑通

(1、修改名字

image

(2、添加节点(很重要)

在节点管理中添加节点

image

我们选择vless去配置就可以了,这里我把主要的以文字形式写出来,也可以直接看我的图片讲讲
协议:vless
节点名称:随意
自定义节点ID:很重要后面创建节点会用到
权限组:这个跟后面的套餐有关系,套餐又跟用户有关系,所以很重要,没有就添加一个
节点地址:ip地址
连接端口、服务端口:记得开服务端口的防火墙和安全组
安全性:Reality
伪装节点:找个大网站就行了
私钥、公钥:生成一下就行了
Short ID:生成一下就行了
uTLS:开启
传输协议:TCP
流控:xtls-rprx-vision
可以照着我的写

image

添加完之后记得打开显示开关

image

(3、套餐管理(其实还有一部权限组管理,但我们在节点里面也添加了一个权限,所以可以直接略过了)

有四个参数要填写,其他随意
名称:随意,不要和权限组管理名称重复,不好管理
服务器分组:就是我们之前填的权限组管理
流量、价格:记得设置,不然后续购买有问题

image

打开显示、新购、续费开关

image

(4、新增用户(为了后面方便测试)

image

(5、创建ApiKey(很重要)

在系统配置的节点配置中生成一个通讯秘钥

image

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中节点情况

可以看见这里变黄了,就是说待使用了,下一步我们就是让他变绿,接下来就是测试步骤了

image

6、测试

登录我们前台的系统(就是去掉path,管用域名登录(https://域名))
这个页面使用过机场的佬友就很熟悉了
我用的就是之前创建的测试用户登录,给了一个100g的套餐所以直接就有一个100g的套餐
我们点一下一键订阅,并复制订阅地址到clash去试一下

image

去clash测试一下没有问题

image

去后台面板看看节点情况(https://域名/path),变绿了,没有问题,完结撒花:cherry_blossom:

image

ps:也可以去购买订阅中看一下,我在套餐那新增了两个套餐和提示词模板,这样就有模有样了

image

参考文章

:hammer_and_wrench: V2bX 单节点(VLESS / Reality)部署指南 xboard | Limin Studio

6 个帖子 - 6 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文