搭建基于peertube的私人视频分享平台(上)

本文最后更新于 292 天前,其中的信息可能已经有所发展或是发生改变,如有失效可到评论区留言。

前言

前阵子,我写过一篇文章:docker系列 搭建基于wordpress+minio的简易视频画廊,但是始终觉得不得劲,一来,播放方面体验不是很好,直接点击图片不能播放,必须点击文字链接;二来,上传一个视频也颇折腾,还要手动指定缩略图。。总之越来越感觉:颇low!所以我想了下,干脆单独部署一个视频分享平台来存放视频得了。

经过一番研究,选择了peertube。PeerTube是一个开源、分布式、可互联的视频平台,类似于youtube,但却是去中心化,并且通过WebTorrent(第一个运行在浏览器的Torrent客户端)技术实现p2p网络来减少单一服务器的负载。任何人都可以在服务器上搭建 PeerTube,共享上传的视频。

准备工作

peertube部署有点复杂,其依赖于PostgreSQL( >= 9.6)和Redis(>=2.8.18),所以要先准备好PostgreSQL和Redis。PostgreSQL又需要初始化,这次我就不再采用docker compose的方式了,不然难道以后拉无数个PostgreSQL?这次就用docker run命令进行部署,同时也是为了便于以后利旧。初始化的文件.env官方已经提供,链接如下:官方env文件,这个文件里同时包含了PostgreSQL的初始化信息以及peertube的初始信息,因为我不用docker compose命令,所以只能自己翻译成docker run的命令,官方提供的docker-compose的yml文件链接如下:官方yml文件,不过这上面的参数说明不够完整,完整的可以减:官方完整自定义参数说明,有需要大家可以自行下载。

创建bridge

因为下面要用到一个名为public-net的bridge,所以需要提前创建:

docker network create public-net

部署PostgreSQL

创建目录:

mkdir -p /docker/postgres/data

创建postgres容器:

docker run --name postgres -d --restart=always --net=public-net \    -p 5432:5432 \  #映射宿主机端口5432到容器的5432端口    -e POSTGRES_USER=root \ #设置postgres的登录用户名    -e POSTGRES_PASSWORD=123456 \ #设置postgres的登录密码    -e POSTGRES_DB=peertube \ #添加peertube对应的库    -e PGDATA=/var/lib/postgresql/data/pgdata \ #指定包含数据的子目录    -v /docker/postgres/data:/var/lib/postgresql/data \ #指定容器数据目录在宿主机的实际挂载路径    postgres:15.4

以上命令使用的时候请大家自行删除#后面的注释内容。
-e PGDATA
官方说明:“这个可选变量可用于定义数据库文件的其他位置(如子目录)。默认位置是 /var/lib/postgresql/data。如果使用的数据卷是一个文件系统挂载点(如 GCE 持久磁盘),或者是无法由 postgres 用户拥有的远程文件夹(如某些 NFS 挂载),或者包含文件夹/文件(如lost+found),Postgres initdb 需要在挂载点内创建一个包含数据的子目录。”

说人话就是-v参数不能直接将容器内的/var/lib/postgresql/data文件映射出去,必须要先指定其下的一个子目录作为数据目录。这个把我坑惨了,容器开始一直起不来,看了官方参数半天才试出来的。

部署redis

创建目录:

mkdir -p /docker/redis/data

创建redis容器:

docker run --name redis -d --restart=always --net=public-net \-p 6379:6379 \ #映射宿主机6379端口到容器的6379端口-v /docker/redis/data:/data #指定容器数据目录在宿主机的实际挂载路径redis

创建目录:

mkdir -p /docker/redis/data

创建peertube:

docker run --name peertube -d --restart=always --net=public-net \    -p 1935:1935 -p 9500:9000 \ #映射宿主机的1935端口和9500端口到容器的1935和9000,大家根据自己的实际情况修改即可,1395端口是rmtp协议的默认端口    -e PEERTUBE_DB_HOSTNAME=postgres \ #指定postgres数据库的地址    -e PEERTUBE_DB_USERNAME=root \ #指定postgres数据库的登录用户名    -e PEERTUBE_DB_PASSWORD=123456 \ #指定postgres数据库的登录用户名密码    -e PEERTUBE_DB_NAME=peertube \ #指定peertube在postgres数据库上使用的库名字    -e PEERTUBE_DB_SSL=false \ #指定连接数据库是否使用SSL    -e PEERTUBE_DB_PORT=5432 \ #指定连接数据库使用的端口    -e PEERTUBE_REDIS_HOSTNAME=redis \ #指定redis数据库地址    -e PEERTUBE_REDIS_PORT=6379 \ #指定连接redis数据库使用的端口    -e PEERTUBE_WEBSERVER_HOSTNAME=video.example.com \ #指定peertube发布使用的域名,这个必须在开始部署之前就确定,一旦指定了就不能更改,最好是备过案的有443端口的域名,如果没备案的云主机或者是家庭宽带,就只能使用非标端口了    -e PEERTUBE_WEBSERVER_PORT=55555 \ #指定客户端访问peertube的实际端口,例如通过有公网IP的家宽非标准端口发布而直接访问,就是路由器上的映射端口(比如本文中的55555);如果是像我一样,家宽作为源站,实际放在CDN上,则这里就要改成443端口    -e PEERTUBE_WEBSERVER_HTTPS=true \ #指定发布是否使用https    -v /docker/peertube/data:/data \ #指定容器目录在宿主机真实路径的挂载点    -v /docker/peertube/config:/config \    -v assets:/app/client/dist \    -e PEERTUBE_SECRET=xxxxxxx \ #找个linux主机在终端里运行openssl rand -hex 32获取    -e PEERTUBE_SMTP_USERNAME=abc \ #主要不要加邮箱后缀,后面其他SMTP的设置按照你使用的邮件供应商的实际信息填写即可    -e PEERTUBE_SMTP_PASSWORD=xxxxx \ #你的邮件提供商生成的授权码,非邮箱登录密码    -e PEERTUBE_SMTP_HOSTNAME=smtp.163.com \     -e PEERTUBE_SMTP_PORT=25 \     -e PEERTUBE_SMTP_FROM=abc@163.com \     -e PEERTUBE_SMTP_TLS=false \     -e PEERTUBE_SMTP_DISABLE_STARTTLS=false \    -e PEERTUBE_ADMIN_EMAIL=abc@g163.com \ #指定管理员邮箱地址,这个很重要    -e PEERTUBE_SIGNUP_ENABLED=true \ #是否支持注册    chocobozzz/peertube:v5.2.1-bullseye

(可选)与COS系统配合使用

前面我写了一篇文章:docker系列 搭建基于minio的视频COS分享平台,这里刚好可以用上,结合peertube可以将上传的视频直接存放在自己搭建的COS系统里,这比直接传到peertube里逼格上又要高了一筹,大家有兴趣可以试试。

-e PEERTUBE_OBJECT_STORAGE_ENABLED=true #是否支持对象存储COS-e PEERTUBE_OBJECT_STORAGE_ENDPOINT= #对象存储的网址,只填域名,默认为https-e PEERTUBE_OBJECT_STORAGE_REGION= #对象存储的区域,有则填,没以后则不填-e PEERTUBE_OBJECT_STORAGE_CREDENTIALS_ACCESS_KEY_ID=xxxx #对象存储的access-key-id-e PEERTUBE_OBJECT_STORAGE_CREDENTIALS_SECRET_ACCESS_KEY=xxxxx #对象存储的secret-key-e PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_BUCKET_NAME= #串流对象存放的桶名称-e PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_PREFIX=streaming #串流存放的桶子目录,如果这个和上传视频存放位置不是一个桶,则可以不填-e PEERTUBE_OBJECT_STORAGE_VIDEOS_BUCKET_NAME=  #上传视频存放的桶名称-e PEERTUBE_OBJECT_STORAGE_VIDEOS_PREFIX=  #上传视频存放的桶子目录,如果和串流存放的不是一个桶,这个可以不填

如果要配合反向代理使用并启用https,需要提前做好相应的配置,使得能用https://video.example.com:55555访问peertube,具体配置反向代理的方法可以参考我的另2篇文章:linux面板系列 配置反向代理并使用非443端口进行发布docker系列 使用docker基于NPM搭建自己的反向代理,记得修改nginx配置里的参数client_max_body_size 50m,默认50兆,你上传的视频就不能超过50兆大小,改成你需要的数值。


发个闹骚,这真是我遇到过的最复杂的容器部署了,如果是用docker compose来部署就要简单得多了,因为其实上面很多环境变量是有默认值的,比如redis,我因为部署peertube一直不成功,只能去官网上找完整参数并用排除法找是哪个变量的问题,所以才写这么多的。。现在理解官方为啥根本不提用docker run方式运行的命令了,估计也是懒得说了,所以直接提供一个env环境文件在yml文件里同时用于几个容器。只是因为我想一个txt文件就写下所有,才不得不自己慢慢试,估计全网就我一个人用docker run来干这事。

由于peertube完整功能的链条里还需要网站、ssl证书、邮件等功能,所以官方提供的docker-complse.yml里还有webserver、certbot、postfix容器,只不过如果你有现成的反向代理,证书,邮箱,都可以直接用上面的环境变量来代替。

最坑的环境变量是PEERTUBE_OBJECT_STORAGE_MAX_UPLOAD_PARTPEERTUBE_TRUST_PROXY=,这2个参数只要加上容器就起不来,最后只能不加了,用docker compose的时候估计没问题吧,大家有兴趣可以试试。

虽然过程很折腾,但是吧,我觉得,如果大家只需要搭建起来就好,不在意技术细节,用docker compose的方式就行了;但是如果想技术细节上有所得,不妨多用用docker run命令,毕竟,用docker run命令有个好处,就是只需要一个txt文件就能备份所有容器,懒人必备,哇哈哈。


配置peertube

登录

不要直接使用http://宿主机IP:9500端口的方式访问,否则会出现报错:
 

image.png

Cannot retrieve OAuth Client credentials: Getting client tokens for host 192.168.10.99:9500 is forbidden. Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.
报错的原因是我已经在环境变量里告诉peertube会使用video.example.com和端口55555以及https的方式访问,所以正确的打开方式是使用https://video.example.com:55555登录。

获取root密码

有3种方式获取root密码,这里主要介绍2种。

1、从宿主机挂载路径获取

使用vim打开如下文件(如果有图形界面直接用文本编辑器打开也行):

vim /docker/peertube/data/logs/peertube.log

直接输入"/root",然后回车,搜索root字样:
 

image.png

其中"password":后面的引号内的马赛克字段就是root密码。

2、使用邮箱找回密码

如果前面配置的邮件供应商的信息正确,可以直接在login页面点击红框中的"I forgot my password":
 

image.png

输入前面创建容器时候用"PEERTUBE_ADMIN_EMAIL"变量设置的管理员邮箱地址,然后点击reset:

image.png

然后会收到来自peertube的邮件:

image.png

直接点击上图中红框中的链接,出现如下界面:

image.png

输入新密码,然后点击上图红框中的按钮即可重置密码。


注:如果reset密码的时候报错,请在反向代理配置里加入如下代码:

proxy_set_header X-Forwarded-Protocol https;proxy_redirect http:// https://; 

我在部署chevereto的时候也遇到过类似过类似问题,也是用这种方式解决的,这仍然是后端用http,前端用https导致的问题。具体的问题现象可参看:docker系列 解决chevereto部署在反向代理后工作异常的问题


使用root账号登入系统

点击左上角login按钮并使用root账号(也可以用管理员邮箱地址)和密码登录进入系统之后,出现如下界面:
image.png

接下来即可开始配置你的peertube。