Articles - Logiciel & scripts

Peertube - Uploader de très gros fichiers

  |   274  |  Commentaires (3)  |  Logiciel & scripts

Procédure d'upload de gros fichiers sur Peertube suprérieurs à 8Go - 'The hard way'.


Perso même après avoir bidouillé nginx dans tous les sens je n'arrive à rien. Une fois bien configuré (client_max_body_size, client_body_temp_path, augmentation des timeout), nginx récupère bien et stocke le fichier envoyé dans son espace d'upload en intégralité. Ayant la fibre j'ai pu tester des fichiers jusqu'à 32Go et cela ne pose pas de problème. nginx n'a rien à voir dans l'histoire pour moi.

Code TEXT :
client_max_body_size 32G;
proxy_connect_timeout       2400;
proxy_send_timeout          2400;
proxy_read_timeout          2400;
send_timeout                2400;
client_body_temp_path /peerstor/uploads/; 


Il y a de la place !

Code BASH :
df -h /peerstor/uploads/
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/md8           1,8T     74G  1,8T   5% /peerstor


Le problème c'est quand Peertube arrive derrière pour le copier dans son répertoire temporaire et y faire ses affaires, la copie ne se fait pas entièrement et bloque à un stade de manière aléatoire au bout de quelques Go de copie (souvent 2Go pile). J'ai l'impression que la copie est faite en dure par Peertube lui-même plutôt que faite par le système (simple copie système, du genre avec mv). Il s'en suit une erreur 503 ou 502 "backend" sur l'IHM d'upload sur Firefox ou Chrome. Le formulaire d'upload est remis à zéro. J'ai laché l'affaire.

Plus d'infos : http://burogu.makotoworkshop.org/index.php?post/2018/12/08/bigfilepeertube

Cette procédure de contournement est un filoutage qui nécessite un accès SSH/admin sur l'instance. C'est lourdingue mais bon, on fait comme on peut hein. Heureusement que Chocobuzz a prévu quelques petits scripts bien utiles, dont un qui justement permet de contourner le système d'upload HTTP et à prendre un fichier directement déjà présent sur le serveur.

  • Importer un fichier vidéo bidon (1080p) de quelques secondes à peine via l'interface navigateur. Penser à mettre la vidéo en privée 😉. Laissez le transcodage se faire normalement (720p et 480p dans mon cas).
  • Récupérer l'ID généré de la vidéo uploadée (dans les URL). Par exemple : e9a72892-f5f1-46af-a126-70e0c9fefb90
  • Supprimer (avec pgAdmin3/psql) dans la table "videoFile" les n enregistrements liés aux résolutions inférieures à la vidéo source (clé étrangère videoId). Une ligne par résolution.
  • Supprimer (rm) aussi les fichiers vidéos associés à ces résolutions inférieures (e9a72892-f5f1-46af-a126-70e0c9fefb90-720.mp4 et e9a72892-f5f1-46af-a126-70e0c9fefb90-480.mp4).
  • Uploader le gros fichier vidéo sur le serveur par un autre moyen que HTTP/HTTPS, par exemple via SSH.
  • Remplacer la vidéo existante :
    • Lancer le script d'import (create-import-video-file-job.js) :
      Code BASH :
      cd /var/www/peertube/peertube-latest
      sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-import-video-file-job -- -v e9a72892-f5f1-46af-a126-70e0c9fefb90 -i /peerstor/videos/maVraieVideoQuiRemplaceLaVideoBidon.mp4
    • Aller dans les jobs en se connectant root sur l'IHM Peertube (Administration > Système > Travaux)
    • Attendre que son état devienne "completed". Cela peut être long (copie + calcul du infoHash).
    • Le fichier e9a72892-f5f1-46af-a126-70e0c9fefb90-1080.mp4 sera remplacé par une copie de maVraieVideoQuiRemplaceLaVideoBidon.mp4 (ils auront la même taille, on peut éventuellement vérifier par md5sum/sha512sum).
  • Supprimer le fichier vidéo source devenu inutile /peerstor/videos/maVraieVideoQuiRemplaceLaVideoBidon.mp4 (rm).
  • A ce stade seul le fichier 1080p a été substitué, il faut ensuite explicitement demander à re-encoder tout et générer les résolutions inférieures :
    • Lancer le script de transcodage (create-transcoding-job.js) pour :
      Code BASH :
      cd /var/www/peertube/peertube-latest
      sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-transcoding-job -- -v e9a72892-f5f1-46af-a126-70e0c9fefb90
    • Aller dans les jobs en se connectant root sur l'IHM Peertube (Administration > Système > Travaux)
    • Attendre que son état devienne "completed".
  • Modifier manuellement avec pgAdmin3/psql la durée de la vidéo (car elle n'est pas mis à jour par les scripts), il s'agit de la colonne "duration" de la table "video". La valeur est un integer qui représente des secondes. Commande pour avoir la valeur à mettre :
    Code BASH :
    expr `mediainfo --Inform="General;%Duration%" e9a72892-f5f1-46af-a126-70e0c9fefb90-1080.mp4` / 1000
  • Tester la vidéo, vérifier que tout est OK dans toutes les résolutions.
  • Passer la vidéo en statut public.


That's it !

Toutes ces manipulations sont scriptables si on y met un peu de volonté. Perso cela ne concerne qu'a peine quelques vidéos très longues chez moi, donc je le fait manuellement, ça ne vaut pas le coup. Un pgadmin3 lancé en SSH avec affichage à distance c'est hyper pratique pour faire des petites modfications rapidement à la souris sans avoir à taper du SQL.