_____ ____
| __ \ | _ \
| |__) |_____ _____ _ __| |_) |_ __ _____ _____ ___ _ __ ___
| _ // _ \ \ / / _ \ '__| _ <| '__/ _ \ \ /\ / / __|/ _ \ '__/ __|
| | \ \ __/\ V / __/ | | |_) | | | (_) \ V V /\__ \ __/ | \__ \
|_| \_\___| \_/ \___|_| |____/|_| \___/ \_/\_/ |___/\___|_| |___/
>> Reverse Browserless Tunneling System | Powered by Bun.js <<
这是一个基于 Bun + Puppeteer + Browserless 的反向连接方案。
[ USER ] [ CLOUD HUB ] [ LOCAL BRIDGE ] [ BROWSER ]
| | | |
| --- connect ---> | | |
| | <--- register ---- | |
| | (tunnel) | |
| | | |
| ==== START SESSION (Pairing Slot) ====== | |
| | | |
| --- CDP Cmd ---> | --- Forward ----> | |
| | | --- Connect ---> |
| | | --- CDP Cmd ---> |
| | | |
| <--- Data ------ | <--- Forward ---- | <--- Data ------ |
| | | |
| ==== CLOSE SESSION (Auto Cleanup) ====== | |
| | | |
| x-- disconnect --x| x--- disconnect ---x | x-- kill tab --x |
核心特点:
browserless可以部署在本地机器、局域网服务器或内网集群中- 浏览器节点主动向中心
server发起反向连接,不需要为每个节点暴露公网入口 - 用户侧只需要连接中心
server,不需要直接访问具体的browserless实例 - 中心
server会校验token,防止未授权的节点注册和 Puppeteer 盗连 - 适合把多个本地
browserless节点组织成一个可调度的浏览器集群
相比直接暴露远程 Chromium WebSocket,这种方式的优势是:
- 浏览器执行环境可以留在本地或内网,安全边界更清晰
- 不依赖公网暴露端口,也不要求给每台浏览器机器配置外网地址
- 更容易横向扩容,本地新增节点后只要连接中心
server即可加入集群
运行顺序如下:
- 部署
browserless - 启动
server - 运行
test
- 已安装
Bun - 已安装
Docker和Docker Compose
安装根目录依赖:
bun install整体链路如下:
Puppeteer/Test -> server -> 反向连接槽位 -> 本地 browserless
其中:
server.ts是中心调度器,负责维护空闲槽位和分配会话browserless/connect.ts是反向连接客户端,启动后会主动连到server- 本地
browserless容器只在内网提供能力,不需要直接对外开放
这意味着你可以把 browserless 部署在本机、旁路机、局域网机器,甚至多台机器组成的本地集群中,只要这些节点能访问中心 server,就能对外统一提供浏览器能力。
进入 browserless 目录:
cd browserless复制环境变量文件:
cp .env.example .env修改 .env 中的关键配置:
TOKEN=secret-token-changeme
SERVER_URL=ws://<你的服务器IP>:8080/register
CONCURRENT=10
TIMEOUT=0说明:
SERVER_URL需要指向运行server.ts的机器地址TOKEN需要和本地 Browserless 容器保持一致CONCURRENT表示预创建的可用槽位数量- 这里的
browserless可以部署在本机或内网环境,不要求公网可访问 - 如果有多台本地机器,可以分别部署多个
browserless + frp-client实例,共同组成集群
启动容器:
docker compose up -d --build如需查看状态:
docker compose ps
docker compose logs -f回到项目根目录后启动调度服务:
cd ..
TOKEN=secret-token-changeme bun run server.ts默认监听端口为 8080,提供两个 WebSocket 入口:
ws://<server-ip>:8080/register?token=<TOKEN>ws://<server-ip>:8080/puppeteer?token=<TOKEN>
其中:
/register供本地browserless节点反向注册槽位/puppeteer供用户侧Puppeteer或test.ts连接使用- 两个入口都会校验
token,未授权请求会被401拒绝
在项目根目录新开一个终端,执行:
TOKEN=secret-token-changeme bun run test.tstest.ts 当前会连接:
ws://localhost:8080/puppeteer?token=<TOKEN>
因此默认要求:
test.ts和server.ts运行在同一台机器上- 如果
server不在本机,可以通过BROWSER_WS_ENDPOINT指定对应地址 test.ts启动时必须提供TOKEN,否则不会发起连接
# 项目根目录
bun install
# 终端 1:部署 browserless
cd browserless
cp .env.example .env
docker compose up -d --build
# 终端 2:启动 server
cd /path/to/buyin-web-agent
TOKEN=secret-token-changeme bun run server.ts
# 终端 3:运行测试
cd /path/to/buyin-web-agent
TOKEN=secret-token-changeme bun run test.ts