Instalar un nodo de peertube en Debian Stretch

¿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

  DISTRO="stretch"

3 Comments

  1. genial post! me he fijado en una cosa, que se nota quien quiere de verdad explicar las cosas (trasmitir) al escribir y puppet tú lo haces, además se nota que sabes alimentarte de lo bueno de otros blogs, de verdad es que al leerlo se nota muchísimo.Gracias por el curre. Quizás sería buena idea montarlo.

  2. Genial Puppet, pero aquí estoy como siempre para ser la mosca molesta :)

    No es correcto decir que si usamos un proxy como hooktube no le damos visitas a youtube, si, las reproducciones cuentan en las estadísticas de youtube, solo que el equipo e IP demandantes son las del proxy y no las del usuario final, más allá de eso ¿sirve de algo usar un proxy si no es nuestro o confiamos mucho en sus administradores? Y observando algunos detalles de hooktube se ve cierta alianza con goolge, por ejemplo la plataforma https://invidio.us/ con el cual están reemplazando hoktoube (de los mismos desarrolladores) ofrece loguerse y una de las posibilidades es hacerlo mediante una cuenta de google. ¿es medianamente normal eso en una plataforma cuyo principal objetivo se supone que es la privacidad? Y siendo que tienen como única descripción “hace lo que debería hacer youtube” pues….

    Pienso que si el proxy es gratis y administrado por desconocidos de dudosa confianza, no somos usuarios, hay un gran riesgo de ser la mercadería e incluso de ser las moscas a atrapar, una buena forma de tener todas juntitas a las personas que en particular buscan privacidad, por lo tanto puede ser peor el remedio que la enfermedad y eso me parece mucho más grave que lo de inflarle las estadísticas a youtube, que como ya dije, de todos modos un proxy no arregla eso.

    Por lo tanto un artículo muy oportuno.

  3. plas plas plas Puppetmaster. Me puse hace unas semanas a montar esto pero no terminé de dar con la receta.
    Gracias por compartir y saludos cordiales.

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax