En un artículo anterior mencioné la plataforma Peertube, en este artículo les mostraré cómo montar un nodo propio. Los requisitos son:
- Tener un servidor dedicado con 2GB de RAM o más (los servidores virtualizados suelen dar problemas, ya que en ocasiones la CPU del servidor puede estar trabajando al 100% durante horas)
- Un proveedor de internet que no nos limite la cantidad de ancho de banda que podemos usar al mes ni de problemas al utilizar bittorrent (en caso de usar un hosting se debe revisar que la política de uso aceptable no prohiba el uso de torrents, ya que nuestra instancia de peertube actuará como un tracker)
- Una cantidad suficiente de almacenamiento
- Capacidad de procesamiento proporcional a la cantidad de usuarios que permitiremos que publiquen contenido en nuestro servidor (los vídeos nuevos se codifican a las resoluciones establecidas por el usuario)
- Tener Ubuntu 20.04 o Debian 10
- Un servidor de correo
- Tener una instancia PostgreSQL en nuestro servidor o en un servidor cercano (en caso de no tener una la montaremos en este tutorial)
Lo primero es instalar PostgreSQL en caso de no tenerlo ya
sudo apt install postgresql postgresql-contrib
Ahora creamos una base de datos para Peertube en nuestra instancia de PostgreSQL
sudo su - postgres
createuser peertube -d -P -R
createdb -O peertube peertube
psql -c "CREATE EXTENSION pg_trgm;" peertube
psql -c "CREATE EXTENSION unaccent;" peertube
exit
Instalamos algunas dependencias
sudo apt install curl
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -E -
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install unzip xz-utils nodejs yarn ffmpeg postgresql-client g++ make redis-server
Creamos una cuenta de sistema para Peertube
sudo useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
Descargamos la última versión estable de Peertube
sudo su peertube
cd ~
VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
mkdir -p config storage versions etc var/log/apache2
cd versions
VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4)
wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.tar.xz"
tar -xJf peertube-${VERSION}.tar.xz
rm -f peertube-${VERSION}.tar.xz
cd ../
ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest
Instalamos el software
yarn install --production --pure-lockfile
cp ./config/production.yaml.example ../../config/production.yaml
Editamos el archivo de configuraión de Peertube según nuestras necesidades
nano $HOME/config/production.yaml
exit
Ponemos en marcha el servicio
sudo cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable peertube
sudo systemctl start peertube
Establecemos la contraseña de administrador
sudo su peertube
cd ~/peertube-latest
NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root
Habilitamos los siguientes módulos de apache
sudo a2enmod proxy proxy_http proxy_wstunnel ssl http2 rewrite headers
Editamos el archivo de configuración de nuestro host virtual
sudo nano /etc/apache2/sites-enabled/peertube.asgardius.company-le-ssl.conf
Debería quedar parecido a esto
<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot /var/www/peertube
ServerName peertube.asgardius.company
<Directory /var/www/peertube>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>
# HSTS (mod_headers is required) (63072000 seconds = 2 years) (only activate it knowingly)
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Content-Type-Options nosniff
Header always set X-Robots-Tag none
Header always set X-XSS-Protection "1; mode=block"
# Activate http/2
Protocols h2 h2c http/1.1
H2Push on
H2PushPriority * after
H2PushPriority text/css before
H2PushPriority image/jpeg after 32
H2PushPriority image/png after 32
H2PushPriority application/javascript interleaved
# Hard limit, PeerTube does not support videos > 4GB
LimitRequestBody 4294967294
# Set caching on assets for 1 year
<FilesMatch ^/client/(.*\.(js|css|woff2|otf|ttf|woff|eot))$>
Header append Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
AliasMatch ^/client/(.*\.(js|css|woff2|otf|ttf|woff|eot))$ /var/www/peertube.aukfood.net/peertube-latest/client/dist/$1
# Set caching on image files for 1 year
<FilesMatch ^/static/(thumbnails|avatars)/(.*)$>
Header append Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
AliasMatch ^/static/(thumbnails|avatars)/(.*)$ /var/www/peertube.aukfood.net/storage/$1/$2
# Bypass PeerTube webseed route for better performances
Alias /static/webseed /var/www/peertube.aukfood.net/storage/videos
<Location /static/webseed>
# Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 800
SetEnvIf Request_Method "GET" GETMETH=1
Header set Access-Control-Allow-Origin "*" env=GETMETH
Header set Access-Control-Allow-Headers "Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type" env=GETMETH
Header set Access-Control-Allow-Methods "GET, OPTIONS" env=GETMETH
Header set toto "foo" env=GETMETH
SetEnvIf GETMETH "1" dontlog
SetEnvIf Request_Method "OPTIONS" OPTIONSMETH=1
Header set Access-Control-Allow-Origin "*" env=OPTIONSMETH
Header set Access-Control-Allow-Headers "Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type" env=OPTIONSMETH
Header set Access-Control-Allow-Methods "GET, OPTIONS" env=OPTIONSMETH
Header set Access-Control-Max-Age "1000" env=OPTIONSMETH
Header set Content-Type "text/plain charset=UTF-8" env=OPTIONSMETH
Header set Content-Length "0" env=OPTIONSMETH
</Location>
<Location /videos/embed>
Header unset X-Frame-Options
</Location>
ProxyPreserveHost On
ProxyRequests On
ProxyTimeout 600
# Websocket tracker
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:9000/$1 [P,L]
<Location />
ProxyPass http://127.0.0.1:9000/
</Location>
SSLCertificateFile /etc/letsencrypt/live/peertube.asgardius.company/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/peertube.asgardius.company/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Reiniciamos el servidor Apache
sudo systemctl restart apache2
Nuestra instancia de Peertube debería estar lista para usarse
Referencias:
https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md