¿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"
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.
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.
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.
Interesante, en cuanto modernice mi placa madre, me uniré.