自建服务器教程
不想用官方服务器、想数据自持时,用这份教程。两条路都通:A. 只填 frps(推荐,快),B. SSH 一键部署(完整,和官方体验一致)。
先选一条路
| 方式 A · 只填 frps | 方式 B · SSH 一键部署 | |
|---|---|---|
| 你需要的东西 | 一台能跑 frps 的服务器(或已有 frp 服务) | 一台 Linux 服务器 + SSH root 权限 |
| 耗时 | 5 分钟 | 10–20 分钟 |
| 效果 | 手机/外网可通过你 frps 的端口访问 | 完整 HTTPS 入口 + 设备信任 + App 配对 |
| 缺点 | 需要自己管入口(端口/HTTPS 可选) | 当前部署脚本针对 1Panel+OpenResty 布局,其他环境要微调(见下文) |
本机前置条件
- Windows + Python 3.10+;
frpc.exe已在仓库根(本机隧道二进制); - 克隆仓库后,
browserctl_secrets.example.json复制为browserctl_secrets.json。
方式 A · 只填 frps(推荐)
你的服务器只需要一个 frps(FRP 服务端),不用装 OpenResty、不用证书。
1. 在服务器上起 frps
下载 frp(https://github.com/fatedier/frp/releases),写 frps.toml:
bindPort = 17000 # frps 监听端口,记住它
auth.method = "token"
auth.token = "换成你自己的强随机 token" # 本机 frpc 要用同一个
allowPorts = [{ start = 17001, end = 17999 }] # 允许的远端端口范围,要覆盖你用的 remote port
启动:./frps -c frps.toml(建议配 systemd 守护)。
注意:本机隧道默认远端端口是17901(常量REMOTE_PORT)。要么把上面allowPorts含 17901,要么改本机browserctl.py里的REMOTE_PORT常量并保持一致。
2. 本机填配置
编辑 browserctl_secrets.json(只填隧道相关的三样,SSH 密码留空即可):
{
"ssh_host": "你的服务器地址或域名",
"ssh_user": "root",
"ssh_password": "",
"frp_token": "跟 frps.toml 里一样的 token",
"frp_server_port": 17000
}
地址用ssh_host字段统一承载:既是 frps 的serverAddr,也是以后要 SSH 部署时的主机。只跑隧道时它等于 frps 地址。
3. 启动
python browserctl.py start
隧道会把本机 3080 闸机映射到 你的服务器:17901。手机/外网直接访问:
http://你的服务器:17901/
- 想要 HTTPS,再用你的反代(Caddy/nginx/宝塔)给这个端口套一层证书即可;
- 第一次 SSH 相关功能会要求先
python browserctl.py ssh-trust固定主机指纹(只跑隧道不必须)。
方式 B · SSH 一键部署(完整入口)
适合想跟官方一样"手机打开一个 HTTPS 网址就用"的用户。前提:服务器是 Ubuntu/Debian,且用 1Panel 安装的 OpenResty 容器(当前部署脚本按此布局编写)。
1. 填完整配置
browserctl_secrets.json 里再补上 SSH 凭据(密码或私钥):
{
"ssh_host": "你的服务器",
"ssh_user": "root",
"ssh_password": "你的 root 密码,或用 ssh_key",
"ssh_key": "",
"frp_token": "你的 token",
"frp_server_port": 17000
}
2. 固定主机指纹(首次)
python browserctl.py ssh-trust
3. 部署网关 + 引导页
python browserctl.py nginx --remote-port 17901
这一步会 SSH 到服务器:
- 生成并写入 OpenResty 反代配置(校验 bc-gate Cookie HMAC + 设备注册表,
nginx -t通过才 reload,失败自动回滚); - 上传手机引导页
dsh-auth.html。
之后 python browserctl.py upload 可单独重新上传引导页(如轮换 DSH Cookie 后)。
4. 关于部署路径(自建需要微调的地方)
部署脚本用到的服务器路径/容器名是常量,位于 browserctl.py 顶部:
SERVER_CONF = "/ymz/1panel/www/conf.d/<你的站点>.conf" # OpenResty 配置落盘位置
SERVER_INDEX = "/ymz/1panel/www/sites/<你的站点>/index" # 引导页目录
OPENRESTY = "<你的 OpenResty 容器名>" # docker exec 目标容器
你的服务器若布局不同,把这几个常量改成你环境的实际值再跑 nginx 命令。
常见问题
- 启动后隧道没起来? 看
browserctl_frpc.log与browserctl_fwd.log;最常见是 token 不一致或allowPorts没覆盖远端端口。 - 远程端口被占用? 换一个端口,同步改本机
REMOTE_PORT常量、allowPorts以及访问 URL。 - SSH 连不上? 先
python browserctl.py ssh-trust;再确认ssh_host端口 22 可达、用 root 或已 sudo 用户。 - 只想局域网用,不想暴露公网? 也可以:frpc 不启动,直接访问本机
http://127.0.0.1:3080/(闸机仍在,2FA/设备管理照常)。 - 数据安全怎么保证? 见 安全说明。