Instalar Peertube en Ubuntu 20.04 con Apache como servidor web

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

https://www.aukfood.fr/peertube-sur-debian-10-avec-apache/

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *