¿Porque queremos plataformas de video descentralizadas?

Hace algún tiempo algunas personas de la red gnusocial, empezaron a fomentar hooktube para enlazar videos de youtube indicando que esta plataforma actúa de «proxy» entre nuestro equipo y youtube y no le das las visitas a google. A priori parece buena idea, yo mismo lo he fomentado y lo he usado en varias ocasiones ¿pero estamos cambiando algo?

Realmente no como bien comento fanta y otras personas por gnusocial, porque aunque no estés dando las visitas a google, realmente al enlazarlo aunque sea a través de un intermediario, sigues fomentando su plataforma centralizada de videos, por lo que creo que el futuro de las comunicaciones en internet no es seguir poniendo capas de anonimato entre nosotros y las corporaciones, si no nuestra propia auto-gestión de las mismas, saliendo de sus nichos, creando estructuras y servicios nuevos, donde se ponga la atención en el contenido y que este este accesible para todo el mundo, mientras cooperamos por mantener la red del mismo de una forma colaborativa.

¿Que es peertube?

Peertube es una plataforma de video totalmente descentralizada, creada y mantenida con software libre, peertube funciona mediante un modelo de federación de nodos, donde cada nodo alberga su propio contenido pero puede federar con el resto(similar a gnusocial). La magia de peertube al igual que a otras redes feederadas y descentralizadas es que no depende de un solo servidor si no que cada persona que quiera puede montar su propio nodo y feederar con el resto de usuarios. Ademas peertube es totalmente p2p por lo que ofrece grandes posibilidades de distribución y velocidad de acceso a los videos.

Como curiosidad decir que la propia fundacion de blender monto hace poco un nodo de peertube que podéis ver en https://video.blender.org/

Consideraciones

Peertube desaconseja totalmente instalar su software en equipos de recursos limitados como raspi o con lineas de datos limitadas como ADSL y demás porque la federación seria demasiado lenta, yo lo he probado en un servidor local virtualizado con 1Gb de ram para funcionar con pruebas en local y va fluido pero si lo vais a usar en un servidor de producción creo que 4GB seria lo suyo.

Instalación dependencias

apt install nginx ffmpeg postgresql openssl g++ make redis-server git curl sudo unzip

Comprobación de versiones

Es muy importante que comprobemos que tenemos la version correcta ffmpeg y g++, para ello usamos los siguientes comandos para comprobarlo

ffmpeg -version # Tiene que ser >= 3.x g++ -v # Tiene que ser >= 5.x

Instalación de node 8x

Nos bajamos el repositorio de node y lo instalamos con apt-get

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - apt-get install -y nodejs

Instalación de yarn

sudo npm install yarn -g

Instalación de peertube

Para instalar peertube lo primero que vamos a hacer es crear un usuario, que tendra acceso a la BD y ejecutara la aplicacion:

useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube passwd peertube

Configuración de postgresql

Creamos el usuario peertube y la BD peertube_prod (es muy importante que uses este nombre porque es el que esta indicado en el fichero de configuración de la aplicación y si no no funcionara, si no modificas el fichero)

sudo -u postgres createuser -P peertube sudo -u postgres createdb -O peertube peertube_prod sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_prod sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_prod

Crear directorios

Creamos los siguientes directorios en nuestra ruta /var/www/ :

mkdir -p /var/www/peertube

Y dentro creamos tres directorios

mkdir config storage versions

Bajar y instalar peertube

Bajamos la ultima version de peertube disponible y descomprimimos en nuestra carpeta /var/www/peertube/versions

wget https://github.com/Chocobozzz/PeerTube/releases/download/v1.0.0-beta.9/peertube-v1.0.0-beta.9.zip unzip peertube-v1.0.0-beta.9.zip

Aplicamos permisos para el usuario peertube en el directorio de instalación de peertube

chown peertube:peertube /var/www/peertube/versions/peertube-v1.0.0-beta.9/*

Instalamos via yarn

sudo -H -u peertube yarn install --production --pure-lockfile

Configuración

Copiamos un ejemplo del fichero de configuración a nuestro directorio

sudo -u peertube cp config/production.yaml.example config/production.yaml

Cerbot

Para generar los certificados necesarios podemos usar la guia de letsencrypt

https://certbot.eff.org/lets-encrypt/debianstretch-nginx

Configuracion nginx

Nos copiamos el fichero de conf de nginx a nuestro directorio de nginx

cp /var/www/peertube/peertube-v1.0.0-beta.9/support/nginx/peertube /etc/nginx/sites-available/peertube

Editamos el el fichero de nginx, añadiendo nuestros datos y nuestra configuración de dominio,certificados,rutas,etc.. como en el siguiente ejemplo(ojo debes modificar lo apropiado para tu configuración, es importante que cambies el server_name, alias y certificados por los adecuados para tu instalacion):

server { listen 80; listen [::]:80; server_name peertube.example.com; access_log /var/log/nginx/peertube.example.com.access.log; error_log /var/log/nginx/peertube.example.com.error.log; location /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/certbot; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name peertube.example.com; # For example with certbot (you need a certificate to run https) ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; # Security hardening (as of 11/02/2018) ssl_protocols TLSv1.2; # TLSv1.3, TLSv1.2 if nginx >= 1.13.0 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'; # ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0, not compatible with import-videos script ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 #ssl_stapling on; # Requires nginx >= 1.3.7 #ssl_stapling_verify on; # Requires nginx => 1.3.7 # Configure with your resolvers # resolver $DNS-IP-1 $DNS-IP-2 valid=300s; # resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; access_log /var/log/nginx/peertube.example.com.access.log; error_log /var/log/nginx/peertube.example.com.error.log; location ^~ '/.well-known/acme-challenge' { default_type "text/plain"; root /var/www/certbot; } location ~ ^/client/(.*\.(js|css|woff2|otf|ttf|woff|eot))$ { add_header Cache-Control "public, max-age=31536000, immutable"; alias /var/www/peertube/versions/peertube-v1.0.0-beta9/client/dist/$1; } location ~ ^/static/(thumbnails|avatars)/(.*)$ { add_header Cache-Control "public, max-age=31536000, immutable"; alias /var/www/peertube/storage/$1/$2; } location / { proxy_pass http://localhost:9000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Hard limit, PeerTube does not support videos > 4GB client_max_body_size 4G; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; } # Bypass PeerTube webseed route for better performances location /static/webseed { # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client limit_rate 800k; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; # Don't spam access log file with byte range requests access_log off; } alias /var/www/peertube/storage/videos; } # Websocket tracker location /tracker/socket { # Peers send a message to the tracker every 15 minutes # Don't close the websocket before this time proxy_read_timeout 1200s; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://localhost:9000; } }

Habilitamos el sitio en nginx

sudo ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube

Systemd

peertube corre bajo servicio en systemd, para ello podemos uar el fichero de configuracion que trae por defecto

cp /var/www/peertube/peertube-v1.0.0-beta.9/support/systemd/peertube.service /etc/systemd/system

Cargamos el fichero de systemd sudo systemctl daemon-reload

Habilitamos que se inicie al arranque

sudo systemctl enable peertube

Y iniciamos peertube

sudo systemctl start peertube

Con esto ya tendremos nuestro nodo montado, ahora solo queda llenarlo de contenido(la password del usuario esta en los logs de instalación del mismo)

Errores que me he encontrado:

Al instalar yarn error en libpivs. Este error se da en arquitecturas de x86 para solventarlo hay que compilar a mano bosh

Al compilar con yarn error en modulos de node: borrar la carpeta node_modules y volver a lanzar yarn

El script de instalacion de node dice que que nuestra version de debian no esta soportado:Modificamos el script y cambiamos la linea DISTRO=$(lsb_release -c -s)

por