在公网部署PION-ION实时音视频通话(含腾讯免费云服务器申请使用教程)

腾讯云服务免费获取

通过访问https://cloud.tencent.com/act/free?from=12639的“轻量应用服务器”,获取免费服务器。

腾讯云提供了非常具体的一步步教你云开发的教程,详细的可以查看各种实验室https://cloud.tencent.com/developer/labs/gallery?from=10680

首次申请需要实名认证,扫微信即可。稍等一段时间会建立好服务器,先进入后台重置一下密码,这样就可以远程登录了。

远程登录教程https://cloud.tencent.com/document/product/1207/44578

 1元钱购域名+云解析+SSL证书活动

https://cloud.tencent.com/act/domainsales?from=dnspodqcloud&_ga=1.73497554.1575153990.1605548464

域名购买后要实名认证等一阵子,域名网址在https://console.cloud.tencent.com/domain

不弄域名的话不能启用https访问的功能。

域名解析在https://console.cloud.tencent.com/cns,我们要在这里配置解析,具体见下面的图片,输入你的服务器ip即可

ssl证书在https://console.cloud.tencent.com/ssl

安装方法https://cloud.tencent.com/document/product/400/4143

本项目使用caddy服务器,跟上面还不太一样,对应安装方法见后面章节。

在访问服务器之前设置一下腾讯云的防火墙规则,暴露全部端口方便调试(这里只是为了确保能访问,这样很危险,生产环境不要这样

调试结束后只保留默认的端口即可,即tcp的80和443,udp的5300-5500(这是我的sfu暴露出来的端口,也是docker-compose.yml定义的)

云服务器安装docker

参考https://www.cnblogs.com/feige1314/p/6958420.html

官方教程https://cloud.tencent.com/developer/labs/lab/10414/console

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令(炒鸡快啊啊啊):

yum install docker-io -y

直接yum安装,安装成功后查看版本

docker -v

启动docker

systemctl enable docker
service docker start

设置开机启动

chkconfig docker on
因为 Docker 的默认源不在国内,导致拉取镜像时时常会很慢。于是,我们可以添加镜像加速器。
编辑并覆盖以下内容到
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

(x) 我也是后来才知道的,之前是这么操作的(贼慢):https://docs.docker.com/engine/install/centos/

安装docker-compose

(官方的这个教程有问题)首先我们需要先安装并升级 pip

yum install python-pip -y
pip install --upgrade pip
然后通过 pip 安装 Docker Compose
pip install docker-compose --ignore-installed
通过一下命令可以检查 Docker Compose 是否安装正确
docker-compose -v

反正我会报错SyntaxError: invalid syntax,如果你也是,那就用使用pip3安装:

yum install -y python3 python3-pip
sudo pip3 install -U pip
sudo pip3 install docker-compose

如果你还是报错SyntaxError: invalid syntax,请卸载掉之前python2.7版本的pip安装的docker-compose

pip uninstall docker-compose

到这里docker-compose已经安装成功了,你可以输入docker-compose -v试试

在云服务器运行PION-ION

官方教程是用git的。

下载ion相关代码运行

a) 安装服务端
1) git clone https://github.com/pion/ion.git
2) docker network create ionnet
3) cd ion && docker-compose up --build,启动后log会输出到当前屏幕上,按ctrl+c停止,如果希望放到后台运行,执行 “docker-compose up --build -d ”
b) 安装客户端web
1)git clone https://github.com/pion/ion-app-web.git
2)cd ion-app-web && docker-compose up --build

如果git clone下载太慢,参考这个解决方法https://www.cnblogs.com/rxbook/p/11869835.html

当然也可以本地先下载解压后上传,我就是使用docker的方式云部署的

a) 安装服务端
1)下载 https://sf6-dycdn-tos.pstatp.com/obj/eden-cn/nuhpeuhdlo/class/ion_all.tar
2)建立一个空的文件夹,将上述文件下载到新文件夹中,解压后,加载所有镜像 docker load --input xxxx.tar,加载完所有镜像后执行docker-compose up,启动应用
b) 安装客户端web
1)下载 https://sf6-dycdn-tos.pstatp.com/obj/eden-cn/nuhpeuhdlo/class/ion_app_web.tar
2)建立一个空的文件夹,将上述文件下载到新文件夹中,解压后,加载所有镜像 docker load --input xxxx.tar,加载完所有镜像后执行docker-compose up,启动应用

解压后通过scp命令上传,本地cmd进入放有ion_all和ion_app_web两个文件夹的ion文件夹,然后把ion文件夹发送到服务器,下面的xx.xx.xx.xx就是你远端服务器的ip,第一个root是用户名,第二个root是目录

scp -r ion root@xx.xx.xx.xx:/root

上传完了之后分别进入对应的文件夹load一下

cd /root/ion/ion_all
docker load --input gcr.io_etcd-development_etcd_v3.4.9.tar
docker load --input nats_latest.tar
docker load --input pionwebrtc_ion-avp_latest.tar
docker load --input pionwebrtc_ion-biz_latest.tar
docker load --input pionwebrtc_ion-islb_latest.tar
docker load --input pionwebrtc_ion-sfu_latest.tar
docker load --input redis_5.0.9.tar
cd /root/ion/ion_app_web docker load --input ion-app-web_web_latest.tar

如果出现报错

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

应该是没有开启docker服务,需要 service docker start 

load了之后分别进入两个文件夹开启docker-compose,需要注意的是每一次up开启后不会接收之后的指令,所以需要开两个终端,分别up

cd /root/ion/ion_all
sudo docker-compose up -d
cd /root/ion/ion_app_web
sudo docker-compose up -d

加-d是detach,在后台运行。可以随时在对应的目录输入 docker-compose logs 返回查看log界面

如果出现了报错

-bash: docker-compose: command not found

是docker-compose安装失败或者未建立链接,参照前面的步骤重新用pip3安装,或者运行

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 开放默认的端口即可访问服务器的服务了,即tcp的80和443,udp的5300-5500(这是我的sfu暴露出来的端口,也是docker-compose.yml定义的)

caddy服务器的证书安装

如何确定自己服务器类型?在终端输入

curl -I https://localhost:9090 -k

其中的-k我也是根据提示改的,是关闭了curl的验证机制。

会告诉你server是什么,本项目是caddy。

caddy从当前目录的Caddyfile(默认)文件中读取配置,本项目中的位置在/root/ion/ion_app_web/configs/caddy/local.Caddyfile

由于在web的Dockerfile中有这么一句话 COPY configs/certs/ /app/certs/ 表明把configs/certs/挂载到了docker中的/app/certs/目录下

原本的local.Caddyfile关于tls的位置是这么写的

  tls /app/certs/cert.pem /app/certs/key.pem

所以我们只需要把证书放到/root/ion/ion_app_web/configs/certs/文件夹中,然后把Caddyfile改成,crt和key文件是你的Apache版本的ssl证书

  tls /app/certs/2_xxx.top.crt /app/certs/3_xxx.top.key

同时还需要在/root/ion/ion_app_web/docker-compose.yml文件中挂载一下certs目录(好像主要是这个操作起作用)

    volumes:
      - "./configs/certs/:/app/certs/"

这时候再返回/root/ion/ion_app_web/目录就可以运行容器了,打开浏览器访问https://xx.xx.xx.xx.top:9090不会再提示证书不可信了,变成了小绿锁。

等到DNS解析和SSL证书都准备好后,我们只需要把Caddyfile里面的所有的localhost改成我们的域名,即可从外部访问了!(https://xx.xx.xx.xx.top:9090)

关于ssl证书

 

完善网站部署

现在我们知道了,web镜像的docker-compose.yml中规定了容器可以被访问的端口,而local.Caddyfile规定了访问每个端口具体会展示一些什么。

在前面我们都是通过端口访问的,并且还只能是网址中带有https的访问,光这样我们当然不太满意,我们可以使用redir将http访问重定向为https访问,并且把暴露的端口修改为80和443(http和https),这样无论外部怎么访问我们的域名,都会被重定向为https链接。

我们将带有端口的localhost直接换为了域名,就是规定了访问域名会展示什么样的页面,其中reverse_proxy为反向代理,反向代理到了我们的biz服务中,其端口在另一个ion_all的docker-compose.yml中规定了。

下面是我们的local.Caddyfile,对应的网页端的docker-compose.yml中只暴露了80和443端口。

 1 www.你的域名 {
 2     redir https://你的域名{url}
 3 }
 4 
 5 你的域名 {
 6   root * /app/dist
 7   file_server
 8 
 9   tls /app/certs/2_你的域名.crt /app/certs/3_你的域名.key
10 
11   reverse_proxy /ws biz:8443 {
12     header_up Sec-WebSocket-Protocol {>Sec-WebSocket-Protocol}
13   }
14 }

ION的级联SFU的功能

ION-SFU架构https://zhuanlan.zhihu.com/p/256366999?utm_source=wechat_session

jitsi meet实现SFU级联https://webrtc.org.cn/20181125-webrtc-sfu-video/

Licode实现SFU级联方案https://www.pianshen.com/article/23471978231/

SFU是星形拓扑的结构,大家都通过SFU获取其他推流的信息,但是不同地区的用户距离SFU的距离不一样,会有很大的体验上的差异。

解决办法就是用户选择从最近的SFU上传和获取内容,SFU之间通过级联的方式传递这些内容。

关于sfu<->sfu relay,可以查看这些issue下的讨论

https://github.com/pion/ion/pull/344

https://github.com/pion/ion/pull/350

源码中写了目前还不支持此功能

# islb relay isn't finished yet, so only 1 sfu is supported
# when relay is ready, we'll switch to DaemonSet (1 pod per node)
# so the connections will be spread across the cluster

+ Only 1 SFU is currently supported (pending ISLB Relay Feature)
+ SFU is currently configured as a Deployment(scale=1); this will be changed to a DaemonSet (1 pod per node) once Relay is supported

Bonus:创建@自己的域名结尾的邮箱账户

参考https://cloud.tencent.com/document/product/613/46023

企业邮箱不都是有自己的@后缀嘛,实际上可以通过腾讯云的域名解析实现。

访问https://exmail.qq.com/cgi-bin/readtemplate?t=new_index/versionCmp开通基础版企业邮箱,注册企业微信。

绑定自己的微信账号之后可以通过https://exmail.qq.com/login登陆你的管理员或者成员账号。

登陆管理员账号,可以修改自己成员账号的名称,只支持修改一次,我修改为了master。

打开右上角的“我的企业”,在“企业信息”中添加“企业域名”,添加自有域名,对于腾讯云购买的域名,可以通过方法1自动跳转到验证界面,如果不能可以通过下面的方法来进行。

访问https://console.cloud.tencent.com/cns查看你的域名,点击解析,然后添加邮箱模板。

Bonus2:构建可大规模扩展的多方视频应用程序

Jitsi Meet - Secure, Simple and Scalable Video Conferences

https://github.com/jitsi/jitsi-meet

https://jitsi.org/jitsi-videobridge/

原文地址:https://www.cnblogs.com/smileglaze/p/13991905.html