Spreed 独立信令服务器
该仓库包含可用于 Nextcloud Talk (https://apps.nextcloud.com/apps/spreed) 的独立信令服务器。
有关信令服务器 API 的更多信息,请参阅 https://nextcloud-spreed-signaling.readthedocs.io/en/latest/。
构建
构建信令服务器需要以下工具:
- git
- go >= 1.21
- make
通常支持 Go 的最新两个版本。这遵循 Go 的发布政策:https://go.dev/doc/devel/release#policy
从 .proto
文件生成代码还需要以下额外工具:
- protobuf-compiler >= 3
所有其他依赖项在构建过程中会自动获取。
$ make build
在 FreeBSD 上使用:
$ gmake build
之后,二进制文件将创建为 bin/signaling
。
配置
默认配置文件包含在 server.conf.in
中。将其复制为 server.conf
并根据本地设置进行必要的调整。请参阅文件中有关可以更改的不同参数的注释。
运行
信令服务器连接到 NATS 服务器 (https://nats.io/) 以在不同实例之间分发消息。请参阅 NATS 文档了解如何设置和运行服务器。
一旦 NATS 服务器运行(并且为信令服务器配置了 NATS 服务器的 URL),您就可以启动信令服务器。
$ ./bin/signaling
默认情况下,配置从当前目录中的 server.conf
加载,但可以通过 --config
选项传递不同的路径。
$ ./bin/signaling --config /etc/signaling/server.conf
作为守护进程运行
systemd
创建专用组和用户:
sudo groupadd --system signaling
sudo useradd --system \
--gid signaling \
--shell /usr/sbin/nologin \
--comment "Nextcloud Talk 的独立信令服务器。" \
signaling
将 server.conf.in
复制到 /etc/signaling/server.conf
并修复权限:
sudo chmod 600 /etc/signaling/server.conf
sudo chown signaling: /etc/signaling/server.conf
将 dist/init/systemd/signaling.service
复制到 /etc/systemd/system/signaling.service
(调整 ExecStart
中的绝对路径以匹配您的二进制文件位置!)
启用并启动服务:
systemctl enable signaling.service
systemctl start signaling.service
使用 Docker 运行
信令服务器和代理的官方 Docker 容器可在 Docker Hub 上获取:https://hub.docker.com/r/strukturag/nextcloud-spreed-signaling
有关详细信息,请参阅 docker
子文件夹中的 README.md
。
Docker Compose
根据服务器上的具体网络配置,您可能需要调整 Janus 命令行选项。请参阅 Janus 设置 和 Janus 文档以了解如何配置 Janus 服务器。
将 server.conf.in
复制到 server.conf
并根据需要进行调整。
如果您按原样使用 docker-compose.yml 配置,则必须将 MCU Url 设置为 ws://localhost:8188
,NATS Url 设置为 nats://localhost:4222
,TURN Servers 设置为 turn:localhost:3478?transport=udp,turn:localhost:3478?transport=tcp
。
docker-compose build
docker-compose up -d
请注意,构建需要 docker-compose v2,而大多数发行版会提供较旧的版本。您可以从 https://docs.docker.com/compose/install/ 下载最新版本。
NATS 服务器设置
有关如何安装和运行 NATS 服务器的详细说明,请参阅 https://docs.nats.io/running-a-nats-service/introduction
您可以使用 gnatsd.conf
文件作为 NATS 服务器配置的基础。
Janus 设置
可以使用 Janus 服务器(来自 https://github.com/meetecho/janus-gateway)作为 WebRTC 网关。有关如何配置和运行服务器的信息,请参阅 Janus 文档。至少必须启用 Janus 的 VideoRoom
插件和 websocket 传输。
信令服务器使用Janus的VideoRoom
插件来管理会话。所有网关细节对客户端都是隐藏的,所有消息都通过信令服务器发送。只有WebRTC媒体直接在网关和客户端之间交换。
编辑server.conf
,在[mcu]
部分的url
键中输入Janus的websocket端点URL。启动时,信令服务器将连接到Janus并记录网关信息。
每个发布流的最大带宽也可以在[mcu]
部分配置,请参见maxstreambitrate
和maxscreenbitrate
属性。
使用多个Janus服务器
为了扩展设置并增加高可用性,一个信令服务器可以连接到一个或多个代理服务器,每个代理服务器提供对单个Janus服务器的访问。
为此,将[mcu]
部分的type
键设置为proxy
,并将url
设置为运行代理服务器的URL列表(以空格分隔)。
每个连接到代理的信令服务器需要一个唯一的令牌ID和一个公钥/私钥RSA密钥对。令牌ID必须在[mcu]
部分配置为token_id
,私钥文件路径配置为token_key
。
代理服务器设置
代理服务器通过标准make命令make build
构建为bin/proxy
二进制文件。将proxy.conf.in
复制为proxy.conf
并编辑[tokens]
部分,列出允许的令牌ID和每个令牌ID的公钥文件名。其他配置选项请参见proxy.conf.in
中的注释。
当代理进程收到SIGHUP
信号时,允许的令牌ID/公钥列表将被重新加载。SIGUSR1
信号可用于在所有客户端断开连接后优雅地关闭代理进程。在这种情况下,不会接受新的发布者。
远程流(预览)
使用Janus 1.1.0或更新版本,支持远程流,即订阅者可以从任何服务器接收已发布的流。为此,您需要在代理配置中配置hostname
、token_id
和token_key
。每个代理服务器还支持配置最大incoming
和outgoing
带宽设置,这也将用于选择远程流。详细信息请参见proxy.conf.in
的app
部分。
集群
信令服务器支持集群模式,其中多个运行的服务器可以互连形成单个"虚拟"服务器。这可用于增加信令服务器的容量或提供故障转移设置。
为此,所有实例必须使用中央NATS服务器/集群。每个实例必须运行一个GRPC服务器(在grpc
部分启用listening
,并可选地设置证书、私钥和CA)。其他GRPC目标的列表必须在grpc
部分配置为targets
,或者可以从etcd集群中检索。配置详情请参见server.conf.in
的grpc
部分。
前端Web服务器设置
通常,独立信令服务器运行在Web服务器后面,该Web服务器处理SSL协议或作为多个信令服务器的负载均衡器。
以下配置示例假设预先配置了Web服务器(nginx或Apache),具有有效的HTTPS设置,并在托管独立信令服务器的服务器的外部接口上监听。
设置完成后,可以使用curl
测试配置:
$ curl -i https://myserver.domain.invalid/standalone-signaling/api/v1/welcome
HTTP/1.1 200 OK
Date: Thu, 05 Jul 2018 09:28:08 GMT
Server: nextcloud-spreed-signaling/1.0.0
Content-Type: application/json; charset=utf-8
Content-Length: 59
{"nextcloud-spreed-signaling":"Welcome","version":"1.0.0"}
nginx
Nginx可以作为独立信令服务器的前端使用,无需任何额外要求。
后端应单独配置,以便可以在单一位置更改,并允许从单个前端服务器使用多个后端。
假设独立信令服务器在本地接口上的端口8080
上运行,请将以下块添加到/etc/nginx/sites-enabled
中的nginx服务器定义中(就在server
定义之前):
upstream signaling {
server 127.0.0.1:8080;
}
要将所有独立信令的请求代理到正确的后端,必须在同一文件的server
定义内添加以下location
块:
location /standalone-signaling/ {
proxy_pass http://signaling/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /standalone-signaling/spreed { proxy_pass http://signaling/spreed; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
示例(例如 /etc/nginx/sites-enabled/default
):
upstream signaling { server 127.0.0.1:8080; }
server { listen 443 ssl http2; server_name myserver.domain.invalid;
# ... 其他现有配置 ...
location /standalone-signaling/ {
proxy_pass http://signaling/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /standalone-signaling/spreed {
proxy_pass http://signaling/spreed;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Apache
要将Apache网络服务配置为独立信令服务器的前端,必须启用 mod_proxy_http
和 mod_proxy_wstunnel
模块,以便可以代理WebSocket和API后端请求:
$ sudo a2enmod proxy $ sudo a2enmod proxy_http $ sudo a2enmod proxy_proxy_wstunnel
现在可以扩展Apache VirtualHost
配置,将请求转发到独立信令服务器(假设服务器在本地接口的8080端口上运行):
<VirtualHost *:443>
# ... 现有配置 ...
# 启用代理WebSocket请求到独立信令服务器。
ProxyPass "/standalone-signaling/" "ws://127.0.0.1:8080/"
RequestHeader set X-Real-IP %{REMOTE_ADDR}s
RewriteEngine On
# 来自客户端的WebSocket连接。
RewriteRule ^/standalone-signaling/spreed/$ - [L]
# 来自Nextcloud的后端连接。
RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P]
# ... 现有配置 ...
Caddy
v1
Caddy (v1) 配置:
myserver.domain.invalid {
proxy /standalone-signaling/ http://127.0.0.1:8080 {
without /standalone-signaling
transparent
websocket
}
}
v2
Caddy (v2) 配置:
myserver.domain.invalid {
route /standalone-signaling/* {
uri strip_prefix /standalone-signaling
reverse_proxy http://127.0.0.1:8080
header_up X-Real-IP {remote_host}
}
}
设置Nextcloud Talk
以管理员身份登录Nextcloud并打开附加设置页面。向下滚动到"Talk"部分,在"外部信令服务器"字段中输入独立信令服务器的基本URL。
请注意,如果您的Nextcloud也在 https
上运行,则必须使用 https
。通常,您应该输入 https://myhostname/standalone-signaling
作为URL。
"外部信令服务器的共享密钥"的值必须与 server.conf
文件中 backend
部分的 secret
属性相同。
如果您正在使用自签名证书进行开发,则需要取消选中"验证SSL证书"复选框,以便Nextcloud可以向信令服务器发送后端请求。
对服务器进行基准测试
存在一个简单的客户端用于对服务器进行基准测试。请注意,被测试的功能可能不涵盖全部功能,有关客户端的详细信息,请查看 src/client
中的实现。
为了验证新客户端连接到信令服务器,客户端在本地接口上启动一个虚拟身份验证处理程序,并在 hello
请求中传递URL。因此,应将信令服务器配置为允许所有后端主机(backend
部分中的 allowall
选项)。
默认情况下不编译客户端,但可以使用 client
目标进行编译:
$ make client
用法:
$ ./bin/client Usage of ./bin/client: -addr string http服务地址(默认为 "localhost:28080") -config string 要使用的配置文件(默认为 "server.conf") -maxClients int 客户端连接数(默认为 100)