Project Icon

nextcloud-spreed-signaling

为 Nextcloud Talk 设计的开源 WebRTC 信令服务器

nextcloud-spreed-signaling 是一个为 Nextcloud Talk 开发的独立信令服务器。它支持集群模式以增强可扩展性,能与 NATS 和 Janus WebRTC 网关集成。项目提供了完整的构建和部署文档,包括 Docker 支持,方便搭建实时通信基础设施。

Spreed 独立信令服务器

构建状态 覆盖率状态 文档状态 Go 报告

该仓库包含可用于 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]部分配置,请参见maxstreambitratemaxscreenbitrate属性。

使用多个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或更新版本,支持远程流,即订阅者可以从任何服务器接收已发布的流。为此,您需要在代理配置中配置hostnametoken_idtoken_key。每个代理服务器还支持配置最大incomingoutgoing带宽设置,这也将用于选择远程流。详细信息请参见proxy.conf.inapp部分。

集群

信令服务器支持集群模式,其中多个运行的服务器可以互连形成单个"虚拟"服务器。这可用于增加信令服务器的容量或提供故障转移设置。

为此,所有实例必须使用中央NATS服务器/集群。每个实例必须运行一个GRPC服务器(在grpc部分启用listening,并可选地设置证书、私钥和CA)。其他GRPC目标的列表必须在grpc部分配置为targets,或者可以从etcd集群中检索。配置详情请参见server.conf.ingrpc部分。

前端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_httpmod_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)

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号