Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent.
PeerTube is sponsored by Framasoft, a non-profit that promotes, spreads and develops free culture in general, and free-libre software in particular. If you want to support this project, please consider donating to them.Demonstration
Want to see it in action?- Demonstration servers:
- Video to see what the "decentralization feature" looks like
Why
We can't build a FOSS video streaming alternatives to YouTube, Dailymotion, Vimeo... with a centralized software. One organization alone may not have enough money to pay for bandwidth and video storage of its servers.So we need to have a decentralized network of servers seeding videos (as Diaspora for example). But it's not enough because one video could become famous and overload the server. It's the reason why we need to use a P2P protocol to limit the server load. Thanks to WebTorrent, we can make P2P (thus BitTorrent) inside the web browser, as of today.
Features
- Angular frontend
- Join the fediverse
- Follow other instances
- Unfollow an instance
- Get for the followers/following list
- Upload a video
- Seed the video
- Send the meta data with ActivityPub to followers
- Remove the video
- List the videos
- View the video in an HTML5 player with WebTorrent
- Admin panel
- OpenGraph tags
- OEmbed
- Update video
- Federated videos view counter
- Federated videos likes/dislikes
- Transcoding to different definitions
- Download file/torrent
- User video bytes quota
- User video channels
- NSFW warnings/settings
- Video description in markdown
- User roles (administrator, moderator)
- User registration
- Video privacy settings (public, unlisted or private)
- Signaling a video to the admin origin PeerTube instance
- Federated videos comments
- Update video thumbnails
- Support video uploader button
- Video imports (URL, Torrent, YouTube...)
- Advanced search
- Subtitles
- User playlist
- User subscriptions (by tags, author...)
- Add "DDOS" security
Front compatibility
- Firefox
- Chrome/Chromium
Dependencies
- nginx
- PostgreSQL
- Redis
- NodeJS >= 8.x
- yarn
- OpenSSL (cli)
- FFmpeg
Run using Docker
See the docker guideProduction
See the production guide.Contributing/Test
See the contributing guide to see how to test or contribute to PeerTube. Spoiler alert: you don't need to be a coder to help!API REST documentation
For now only on Github:- HTML version: /support/doc/api/html/index.html
- Swagger/OpenAPI schema: /support/doc/api/openapi.yaml
Tools
Architecture
See ARCHITECTURE.md for a more detailed explanation.Backend
- The backend is a REST API.
- Servers communicate with each others with Activity Pub.
- Each server has its own users who query it (search videos, query where the torrent URI of this specific video is...).
- If a user uploads a video, the server seeds it and sends its followers some metadata (name, short description, torrent URI...).
- A server is a tracker responsible for all the videos uploaded in it.
- Even if nobody watches a video, it is seeded by the server (through WebSeed protocol) where the video was uploaded.
PeerTube v3:终于支持直播功能啦
下面是我目前用在生产机器(debian10)上的整个部署步骤。
安装nodejs/yarn:
apt -y update apt -y install build-essential gnupg curl unzip curl -sL https://deb.nodesource.com/setup_10.x | bash - apt -y install nodejs npm i -g yarn
安装nginx/ffmpeg/postgresql/redis等需要用到的软件包:
apt -y install sudo git python-dev nginx ffmpeg postgresql postgresql-contrib redis-server
启动以及设置nginx/postgresql/redis的开机自启:
systemctl enable --now nginx postgresql redis-server
新建一个名为peertube的用户,注意这个用户的主目录路径最好保持和我下面的一样:
useradd -m -d /var/www/peertube -s /bin/bash peertube
再次提示:如果你把这个用户的主目录做了更改,后面的配置有很多地方都需要修改,如果你不知道后续如何更改这些配置,那么这里建议和我的保持一致。
修改这个用户的密码:
passwd peertube
创建一个postgresql用户和数据库:
sudo -u postgres createuser -P peertube sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
注:第一条命令执行后会提示要你盲输2次密码。如果报什么目录权限问题不用管它,忽视即可。
启用peertube需要用到的扩展:
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod
现在直接切到peertube这个用户下面:
su - peertube
准备需要用到的目录/下载解压peertube的源码:
mkdir config storage versions && cd versions wget https://github.com/Chocobozzz/PeerTube/releases/download/v3.0.0/peertube-v3.0.0.zip unzip peertube-v3.0.0.zip ln -s /var/www/peertube/versions/peertube-v3.0.0 ../peertube-latest
安装peertube:
cd ../peertube-latest yarn install --production --pure-lockfile
复制2份配置文件:
cp config/default.yaml /var/www/peertube/config/default.yaml cp config/production.yaml.example /var/www/peertube/config/production.yaml
编辑production.yaml:
nano /var/www/peertube/config/production.yaml
这里可以改动的配置很多很杂,我这里就只把必须改的配置说明一下,其他的配置可以在后续的web界面上更改:
webserver: https: true hostname: 'peertube.imlala.best' # 换成你的域名 port: 443 database: hostname: 'localhost' port: 5432 ssl: false suffix: '_prod' username: 'peertube' password: 'password' # 换成你的数据库用户密码 pool: max: 5 admin: email: 'admin@imlala.best' # 换成你的邮箱
现在切回root用户:
su - root
复制一份内核调优的配置文件:
cp /var/www/peertube/peertube-latest/support/sysctl.d/30-peertube-tcp.conf /etc/sysctl.d/
应用配置文件内的设置:
sysctl -p /etc/sysctl.d/30-peertube-tcp.conf
这里实际上就是开了个BBR,如果你的机器已经启用了BBR这里可以忽略。
复制一份nginx的站点配置文件:
cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/conf.d/peertube.conf
编辑peertube.conf:
nano /etc/nginx/conf.d/peertube.conf
由于这个配置文件里面的内容太多了,我就不全部贴上来了,这里只说一下要改动的地方,首先这里的域名:
server { listen 80; listen [::]:80; server_name peertube.imlala.best; # 换成你的域名
接着删除这段配置:
... location /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/certbot; }
然后这里的上游地址和端口改为下面所示的:
upstream backend { server 127.0.0.1:9000; }
这里和之前一样改域名:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name peertube.imlala.best; # 换成你的域名
最后把这一大段配置都删掉:
... ssl_certificate /etc/letsencrypt/live/${WEBSERVER_HOST}/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/${WEBSERVER_HOST}/privkey.pem; location ^~ '/.well-known/acme-challenge' { default_type "text/plain"; root /var/www/certbot; } ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; # add ECDHE-RSA-AES256-SHA if you want compatibility with Android 4 ssl_session_timeout 1d; # defaults to 5m ssl_session_cache shared:SSL:10m; # estimated to 40k sessions ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on;
测试nginx的配置是否正常:
nginx -t
正常的话,使用certbot签发ssl证书:
certbot --nginx
复制一份systemd的配置文件:
cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
启动以及设置peertube开机自启:
systemctl enable --now peertube
查看运行状态确保是Active:
systemctl status peertube
由于peertube默认的管理员密码保存在日志里面,不想看日志的话这里你可以直接使用下面的命令重置一下:
su - peertube cd peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root
现在打开你的网站,登录上去,在下图所示的地方可以启用直播功能:
OBS的设置看这个官方的文档:
https://docs.joinpeertube.org/use-create-upload-video?id=live-examples
更多关于管理员的指南:
https://docs.joinpeertube.org/admin-following-instances
-------------------
搭建易于访问的私人PeerTube
本文旨在描述如何通过虚拟主机与对象存储,配置易于私人使用的 PeerTube 实例。教程并不适用供大规模访问的网站架设。
虽然说只要 VPS 访问起来没有问题,不用对象存储也是没有问题的。但从经费的角度上,购买高带宽的对象存储总要比高带宽的 VPS 来的省钱。所以对于本文的目标读者,我还是建议使用对象存储。
事前准备
- 一台 VPS(本文以 Ubuntu/Debian 为例)
- 对象存储服务(本文以 Backblaze B2 为例)
- 个人域名或子域名
- 习惯使用 Linux 的大脑
配置对象存储
首先你需要配置一个供 PeerTube 保存其影片的对象存储池。PeerTube 支持 Amazon S3,或 Backblaze B2,你用哪个都行。
访问密钥
你需要从你选择的服务商建立一个访问用的 Key,并将:
- App Key ID
- App Key
记录下来以备稍后使用。
存储池
之后建立一个给 PeerTube 使用的池,并将池设置为公开(Public),记录下:
- 名字
- 终结点(Endpoint,即对象存储的主域名)
- 地区(只有 Amazon S3 需要)
配置 CORS
CORS 其实就是防盗链。你肯定不希望什么网站都外链你的视频出去播放。在上一步已经设置为公开的基础上,点击 “CORS Rules” 按钮进行配置。
选择:Share everything in this bucket with this one origin.
并在其下方写下你将会使用的域名。需包含 https://,端口号可以没有。
CORS 配置大概需要十分钟左右的时间来生效,正好可以来安装我们的网站。
安装 PeerTube
PeerTube 的安装是非常麻烦的,所以有很多人会选择使用 Docker 进行安装,但假如你对 Docker 并不熟悉,后续配置的时候可能会十分头疼。所以这里我们将直接进行安装。本文默认你在非 root 的 sudo user 下进行操作,其他情况请自行调整。
前置准备
安装 Node.js:
sudo apt install build-essential gnupg curl wget unzip
curl -sL https://deb.nodesource.com/setup_lts.x | sudo bash -
sudo apt install nodejs
sudo npm i -g yarn
安装其他包:
sudo apt install git python-dev ffmpeg postgresql postgresql-contrib redis-server
此处我们没有安装 nginx,因为我将会在后文使用 Caddy2 作为 Web 服务器。
启动数据库:
sudo systemctl enable --now postgresql redis-server
建立 PeerTube 用户并设置其密码:
sudo useradd -m -d /var/www/peertube -s /bin/bash peertube
sudo passwd peertube
配置 PostgreSQL 用户和数据库:
sudo -u postgres createuser -P peertube
sudo -u postgres createdb -O peertube -E UTF8 -T template0 peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod
此处第一条命令后你会被要求输入数据库的访问密码,后面我们会用到。
安装 PeerTube
首先进入到 peertube 用户下:
su - peertube
下载最新版的 PeerTube:
mkdir config storage versions && cd versions
wget https://github.com/Chocobozzz/PeerTube/releases/download/v4.0.0/peertube-v4.0.0.zip
unzip peertube-v4.0.0.zip
ln -s /var/www/peertube/versions/peertube-v4.0.0 ../peertube-latest
本文编写时 PeerTube 的最新版本是 4.0,其他版本可以从 GitHub 获取。
安装:
cd ../peertube-latest
yarn install --production --pure-lockfile
安装过程中可能会出现一些警告,不用管他。
调整配置文件
首先从模版创建新的配置文件并打开:
cp config/default.yaml /var/www/peertube/config/default.yaml
cp config/production.yaml.example /var/www/peertube/config/production.yaml
nano /var/www/peertube/config/production.yaml
此处使用的是 nano 编辑器,使用方法非常简单,99.9% 的时候都只用 Crtl+O 保存,Ctrl+X 退出。
需要改动的地方有以下几点:
webserver:
https: true
hostname: 'peertube.imlala.best' # 你的域名
port: 443
如果你希望使用 http 进行测试,可以暂时改为 80 端口。
database:
hostname: 'localhost'
port: 5432
ssl: false
suffix: '_prod'
username: 'peertube'
password: 'password' # 刚刚设置的数据库密码
pool:
max: 5
object_storage:
enabled: true # 改为启用
endpoint: 's3.us-west-002.backblazeb2.com' # 你的对象存储池终结点
# region: 'us-east-1' # 你的对象存储地区(如果需要的话)
credentials:
access_key_id: 'xxxxxx' # 你的 App Key ID
secret_access_key: 'xxxxxx' # 你的 App Key
max_upload_part: 2GB
streaming_playlists:
bucket_name: 'PeerTube' # 你的对象存储池名字
prefix: 'streaming-playlists:' # 串流子文件夹名,注意结尾的冒号
videos:
bucket_name: 'PeerTube' # 你的对象存储池名字
prefix: 'videos:' # 影片子文件夹名,注意结尾的冒号
可以根据自己的实际需要填写,如果你不准备用对象存储,这里可以不改。串流列表和影片的池可以不是一个,如果不是一个的话,可以将两行子文件夹名用井号注释掉,如果是一个则必须要有子文件夹名。
transcoding:
enabled: false # 关闭转码
如果你的 VPS 性能很强可以不改,一般的便宜 VPS 都不太带的动转码的工作,我建议你在自己的电脑上转好了再上传。确保视频格式为 H264 音频格式为 AAC。
tracker:
enabled: false ## 关闭 P2P
因为我们的实例是自用的,开着 P2P 没什么意义,所以关掉。P2P 还会影响从对象存储串流。这里的选项并没有办法完全关闭 WebTorrent,我们后面会继续讲。
最后不要忘了保存。
启动 PeerTube
这里先用 Exit
命令回到之前的用户下,之后启动 PeerTube 服务:
sudo systemctl enable --now peertube
检查一下运行有无问题:
sudo systemctl status peertube
我们还需要修改默认的管理员密码,回到 peertube 用户下操作:
su - peertube
cd peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root
注意此处因为要拉起 Node.js,到出现输入密码提示的速度非常慢,如果误操作多按了回车什么的,可以用 Crtl+C 取消重来。
完成后再次用 Exit
命令回到之前的用户下。
安装 Caddy
Caddy 是一款非常现代且易于配置的 Web 服务器,还可以自动从 Let's Encrypt 签发 HTTPS 证书,我也很推荐你在其他场合尝试使用 Caddy。
用以下命令添加 Caddy 的源并安装:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
编辑 Caddy 配置文件:
sudo nano /etc/caddy/Caddyfile
将文件的内容替换为以下内容并保存:
peertube.imlala.best { # 你的域名
reverse_proxy 127.0.0.1:9000
}
启动 Caddy 服务:
sudo systemctl enable --now caddy
检查运行有无问题:
sudo systemctl status caddy
此时如果出现端口被占用的问题,说明你可能在运行 nginx 一类的其他 Web 服务器。如果出现无法注册 HTTPS 证书一类的问题,可以检查一下防火墙和 CDN 配置,比如关掉 Cloudflare 的代理再试。
现在你可以打开你的网站试试看了,如果不出意外应该已经可以打开了。你可以用 root 和刚才设置的密码来登录。如果访问不了可以检查防火墙配置。
其他必要配置
在 PeerTube 的管理页面中我们可以对服务器做进一步的自定义。我这里挑选一些重要的来讲一下。
管理面板
首先我建议你安装 privacysettings 插件,它可以将新上传的影片锁定为站内访问,对一个自用的节点非常实用。
在 Configuration > Basic 下,你可以将 SEARCH 和 FEDERATION 里面的项目全部勾掉,来进一步提高自闭程度。记得点保存设置。
我的账户面板
还记得我们刚才提到的 P2P 影响对象存储访问的问题吗?我很怀疑这其实是一个 Bug,在 Tracker 已经被禁用的情况下,P2P 应该不可用才对,但 Web Torrent 却还在浏览器上运行。这基本上等于是把我们用来提速的对象给存储架空了。即便在不用对象存储的条件下,我依然发现它要比直连慢得多,对于私人使用来说怎么都是关掉为好。
我们需要在 “我的账户” 的 Settings 中找到 “帮助分享正在播放的视频” 勾掉。记得点保存设置。这一选项需要在每个用户的设置里面进行调整,非常的麻烦,不过因为我们是自己用,所以影响不是特别大。希望这一问题能在以后的版本中得到解决。
PeerTube 的中文翻译也不是很完整,有时候有有时候没有。
排错
在 PeerTube 的 “管理” 的 “系统” 菜单下的 Jobs 中可以看到正在执行的任务。如 “move-to-object-storage ” 就是将上传的视频移动到对象存储的任务,你可以在其报告中看到一些相关的错误提示。如果对象存储无法访问,可以检查 CORS 是否正确,极端情况下可以先改成允许所有网站访问进行测试。还有可能是因为对象存储没有设置为 Public。
如完全按照本教程配置,播放器应该会在播放时右下角显示 HTTP 字样(电脑版页面),而不是上传下载速度,否则请检查是否已关闭 “帮助分享正在播放的视频”。
参考资料
知乎 Xpitz PeerTube 安装教程:如何搭建视频分享平台(想要用 Docker 装的可以参考此文)
结语
我早就有想搭一个 PeerTube 的想法但是一直没有付诸实践,主要就是因为安装过于麻烦。这次教程用自用节点的角度尽可能细致的梳理了安装步骤,希望能够帮到有同样想法的朋友。
------------------------------
去中心化视频分享开源平台:PeerTube
PeerTube是一个视频上传与分享服务的开源平台,目标是打造一个去中心化版本的 YouTube,视频在用户之间共享,不依赖于一个中心化系统,类似BT下载的P2P协议,任何人都可以在服务器上搭建PeerTube,称作实例。实力支持用户注册,自由观看视频,选择现有的“实例”上传视频,每个实例可以通过Bittorent相互传输数据,即每个搭建的PeerTube可以和其他人搭建的PeerTube相互连接、传输数据,达到播放视频加速的效果。每个用户访问实例并播放视频的时候,每个用户都将变为一个节点,多个用户在观看同一部视频时,可相互连接、传输数据给对方,达到播放视频加速的效果。
[repo owner=”Chocobozzz” name=”PeerTube”]
No comments:
Post a Comment