目录

模组介绍 - BetterCrewLink 近距离语音服务端搭建

作者:独角兽

格式化文档:FiveFireX

最后编辑日期:2022/8/19 15:21:05

版权申明:转载或用作其他用途(如视频制作等)请注明出处以及原作者。

BetterCrewLink-Server 的 GitHub 仓库地址 (opens new window),下文我们称之为 BCL-Server

# 前置要求

  1. 熟悉基本的 Linux 命令行操作
  2. 熟悉 Docker 使用方法
  3. 熟悉基本的 Vim 操作
  4. 具有 公网IP 的云服务器,至少10M上行带宽,并且有权限可以开启大量udp端口

# 默认配置下的 BCL-Server

关于 BCL-Server,在不进行配置文件更改的默认情况下只同步非语音的数据。

那什么是非语音数据呢?如下图所示:

如上图箭头所示,正在说话的状态数据,通过 BCL-Server 进行同步和传递,类似的还有会议中的发言边框高亮,如下图:

# 语音数据如何传输?

在服务端使用默认配置的情况下:

  1. 客户端不开启 NAT修复 此时,玩家之间会通过 Google 的 STUN 服务器获取对方的地址,以进行 P2P 语音通信,在国内家宽目前普遍没有公网 IP 的情况下,再加上各地 NAT 环境不一,使用这种方法进行语音通信效果无法保证。
  2. 客户端开启 NAT修复 此时,玩家之间通过 BCL客户端 原作者提供的 TURN 服务器进行通信,但由于服务器在境外,效果依然不理想。

我之前没有仔细看过 BCL 的源码,以为不开启 NAT修复P2P连接,开启 NAT修复 走 BCL-Server 的中继。直到我发现服务端上行带宽基本没有什么占用,以及最近一期动画区X美少女联动糟糕的语音质量,才让我下定决心去瞧一瞧 BCL 的源码,最终发现了这个问题。

# 如何愉快使用 BCL?

基于以上的分析,我们需要两个服务器,一个是 BCL 刚需的 Server 端,另一个是为了保证语音传输质量的 TURN 服务端。那么正式开始教程:

  1. 首先连接到你的服务器上,安装 Docker。
Windows安装

仅针对有图形界面的 Windows Server,版本需为 Windows Server 2016 或更新。需要其他 Windows 系统的安装教程请自行搜索。

  1. 右键开始按钮,选择应用与功能,选择启用或关闭 Windows 功能,并勾选 Hyper-V。 也可以在 Powershell 中启用:
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    
    1
  2. Docker 官网 (opens new window) 下载对应的 Docker Desktop,并安装。
  3. 创建开机自启:按下 Windows 徽标键 + R,输入 shell:startup 并回车,在打开的资源管理器窗口中,创建快捷方式,指向 Docker 安装目录。如果你没改的话应该是 C:\Program Files\Docker\Docker\Docker Desktop.exe
macOS安装

第一种方法仅支持还在 Homebrew 支持期的系统,第二种方法仅针对有图形界面的 macOS

有两种方法:

  1. brew install --cask --appdir=/Applications docker
    
    1
  2. 或者到 Docker 官网 (opens new window) 下载对应的 Docker Desktop,并安装。

还得添加开机启动项:前往 系统偏好设置,打开用户与群组,在登录项中添加 Docker

Linux安装

提供 DebianUbuntu 的安装示例,理论上 CentOS 也行,记得把 apt-get 换成 yum。 其他操作系统请自行搜索。

仅针对以下 Debian 版本:

  • Stretch 9
  • Buster 10
  • Bullseye 11

且仅针对以下架构:

  • x86_64
  • amd64
  • armhf
  • arm64

需要其他 Debian 版本的安装教程请自行搜索。

仅针对以下 Ubuntu 版本:

  • Xenial 16.04
  • Bionic 18.04
  • Cosmic 18.10
  • Disco 19.04
  • 以及任何更新的版本

且仅针对以下架构:

  • x86_64
  • amd64
  • armhf
  • arm64
  • s390x
  • ppc64le

需要其他 Ubuntu 版本的安装教程请自行搜索。

有两种方法:

  1. 使用安装脚本一键安装:

    # 这是官方的
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    # 这是国内 daocloud 的
    curl -sSL https://get.daocloud.io/docker | sh
    
    1
    2
    3
    4
  2. 手动安装:

    1. 卸载旧版本:
      sudo apt-get remove docker docker-engine docker.io containerd runc
      
      1
    2. 开始安装:
    # 更新包索引
    sudo apt-get update
    # 安装依赖包
    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    # 添加 GPG 密钥
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # 验证密钥是否存在指纹
    sudo apt-key fingerprint 密钥后八位不含空格
    # 安装 Docker
    sudo apt-get install docker-ce docker-ce-cli containerd.io
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

别忘了添加开机启动项:

# 开机自启 Docker
systemctl enable docker
# 启动 Docker
systemctl start docker
1
2
3
4
  1. 将 BCL-Server 镜像拉取到服务器本地,建议提前添加 Docker 国内源加快拉取速度。
docker pull ohmyguus/bettercrewlink-server:latest
1
  1. 启动 BCL-Server
docker run -d \ # -d后台启动
--network=host \ # 和宿主机公用网络
--name=BCL-Server \ # 容器名称
--restart=always \ # 总是自动重启
ohmyguus/bettercrewlink-server:latest # 镜像名称
1
2
3
4
5

此时,我们可以打开浏览器,输入 服务器公网IP:9736,例如 19.19.8.10:9736(注意用英文冒号),可以看到如下图所示内容:

但是此时,我们并不能愉快的使用 BCL,因为我们还有最重要的 TURN服务器 没有搭建。幸运的是 BCL-Server 自带了一个轻量的 TURN服务器,我们需要通过配置文件来启动它!

首先,找一个你喜欢的地方新建一个 peerConfig.yml 文件,然后将以下内容复制到里面:

# 内建 TURN 服务器配置文件
forceRelayOnly: true
integratedRelay:
  enabled: true # Use the-built in relay server if you run a small-scale server for private use.
  #relayIps: ['192.0.2.1'] # 这俩可以自动检测到,可以不用填
  #listeningIps: ['192.0.2.1']
  externalIps: { 'default': '这里填入你的公网IP' }
  minPort: 49152  # 这里记得在防火墙开启范围udp端口
  maxPort: 65535
  listeningPort: 3478
  # Can be one of: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL
  debugLevel: 'INFO'
  defaultUsername: 'M9DRVaByiujoXeuYAAAG'
  defaultPassword: 'TpHR9HQNZ8taxjb3'
# If you run into performance issues, you may want to look into offloading relay duties to a native TURN/STUN
# implementation. You can configure them below.

# Custom TURN/STUN servers
iceServers:
  - urls: 'turn:你的公网IP(externalIPs):listeningPort'
    username: 'defaultUsername'
    credential: 'defaultPassword'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

注意

YAML格式的文件缩进非常严格,填写的时候请注意!

填写完配置文件后保存,并且记住文件路径,我们需要重新启动一个Docker容器,为了不产生冲突,我们将之前的容器停止并且删除:

docker stop BCL-Server
docker rm BCL-Server
1
2

新启动一个带有完整配置文件的容器:

docker run -d \
--network=host \
--name=BCL-Server \
--restart=always \
-v /path/peerConfig.yml/:/app/config/peerConfig.yml \ # 将前面/path/换成你自己的路径
ohmyguus/bettercrewlink-server:latest
1
2
3
4
5
6

# 测试 TURN服务器 连通性

打开 STUN 和 TURN 测试网站 (opens new window),在最下方的 TURN 框内填入刚才搭建好的 TURN服务器 并填写用户名和密码,并且点击 Add TURN,如下图所示:

添加完服务器后,点击网页上方的 START TEST,当出现如下图所示的 relay 时说明 TURN服务器 搭建成功!

# 最后

打开 BCL,更改服务器地址为 http://你的公网IP:9736,服务器会自动同步 TURN服务器 信息到客户端。此外,还要记得关闭 NAT修复 选项,以免连接到境外 TURN服务器。

<img src="/bcl/image-20220819141648604.png" style="zoom:50%;" /> <img src="/bcl/image-20220819141727109.png" style="zoom:50%;" />