Mettre à jour Peertube depuis la version 5.2.0 vers 7.2.2

Mettre à jour Peertube depuis la version 5.2.0 vers 7.2.2

Introduction

Les mises à jour sont toujours un moment stressant. Celles de PeerTube sont plutôt bien faites et faciles à exécuter… si vous suivez les releases. Dans ce cas, nous avons un peu laissé traîner… quelques années.

Préparation

Vous aurez besoin de patience (et donc de temps), de minutie, et d’une bonne dose de courage pour sauter le pas. Mais ne vous inquiétez pas, cela n’est pas si difficile que ça en a l’air.

Au fait, vous avez vérifié l’espace disque ? Vous en aurez besoin pour les sauvegardes et la mise à jour de PeerTube.

C’est parti…

Mise à jour du système

Le système étant plutôt récent, nous effectuons une mise à jour de routine afin de nous assurer que les derniers paquets sont disponibles. Normalement, vous devriez prendre le temps de vérifier chaque étape afin de ne louper aucun problème qui pourrait apparaître ; mais dans notre cas, nous savons que le système est à jour : en effet, seule la dernière commande nous invite à retirer un kernel inutilisé.

# apt update && apt upgrade -y && apt autoremove

Mise à jour de NodeJS

Là c’est plus compliqué : car notre système est suffisamment ancien pour que la dernière mise à jour de Node version 20 soit incompatible avec la version 7.2.2 de Peertube. Aussi nous devons réinstaller NodeJS depuis Nodesource afin de passer outre l’obsolescence de notre source.

Mise à jour du dépôt NodeJS

Debian Systems

Remove Old Repository Configurations:

# Remove the GPG keyring file associated with the old repository
sudo rm /etc/apt/keyrings/nodesource.gpg
# Remove the old repository's list file
sudo rm /etc/apt/sources.list.d/nodesource.list

Initialize the New Repository:

# Define the desired Node.js major version
NODE_MAJOR=20
# Update local package index
sudo apt-get update
# Install necessary packages for downloading and verifying new repository information
sudo apt-get install -y ca-certificates curl gnupg
# Create a directory for the new repository's keyring, if it doesn't exist
sudo mkdir -p /etc/apt/keyrings
# Download the new repository's GPG key and save it in the keyring directory
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
# Add the new repository's source list with its GPG key for package verification
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Install Node.js:

# Update local package index to recognize the new repository
sudo apt-get update
# Install Node.js from the new repository
sudo apt-get install -y nodejs

Nous avons à présent la bonne clé GPG, la bonne version de NodeJS et surtout la source mise à jour pour Node 20 (note : la version LTS de Node est à la version 22, mais pour l’instant la version 20 est toujours recommandée pour Peertube.)

Lancement de la mise à jour de Peertube

# cd /var/www/peertube
# sudo -H -u peertube /var/www/peertube/peertube-latest/scripts/upgrade.sh

Bingo! Si vous recevez une erreur de version de NodeJS, voir le point ci-dessus. :wink:

Mise en conformité de la configuration

C’est là que le bât blesse : nous devons repasser au travers de tous les CHANGELOG depuis la version 5.2.0…

:warning: Lisez tout l’article une fois jusqu’au bout avant de revenir ici et de faire les changements… :warning:

  1. La version 6 contient de nombreuses modifications dont
  • :warning: Modifier la configuration (config/production.yaml) pour utiliser 127.0.0.1 au lieu de localhost pour listen.hostname, database.hostname et redis.hostname
  • l’abandon du Webtorrent et le renommage de videos en web_videos à plusieurs endroits de la configuration…
  • des changements de routes dans la configuration Nginx (voir la section suivante)…

Prendre le temps de faire ces changements !

  1. La version 7 comporte également quelques changements importants :

Si vous loupez une étape, vous êtes dans la panade : vous avez bien fait votre sauvegarde ?

Nginx

Alors, entendons-nous bien, la configuration de Nginx change beaucoup entre les version 5 et 7, aussi vous devez faire très attention de ne pas le prendre à la légère.

Voici mon diff -u:

diff -u nginx-5.2.conf nginx-7.2.conf
--- nginx-5.2.conf       2025-07-16 20:23:28.344133134 +0200
+++ nginx-7.2.conf   2025-07-16 20:23:23.339917353 +0200
@@ -1,3 +1,5 @@
+# Configuration for Peertube
+
 # Minimum Nginx version required:  1.13.0 (released Apr 25, 2017)
 # Please check your Nginx installation features the following modules via 'nginx -V':
 # STANDARD HTTP MODULES: Core, Proxy, Rewrite.
@@ -49,7 +51,7 @@
   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; # add ECDHE-RSA-AES256-SHA if you want compatibility with Android 4
   ssl_session_timeout       1d; # defaults to 5m
-  ssl_session_cache         shared:SSL:10m; # estimated to 40k sessions
+  ssl_session_cache         shared:SSL:50m; # estimated to 200k sessions
   ssl_session_tickets       off;
   # HSTS (https://hstspreload.org), requires to be copied in 'location' sections that have add_header directives
   #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
@@ -60,7 +62,7 @@
 
   location @api {
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-    proxy_set_header Host            $host;
+    proxy_set_header Host            $http_host;
     proxy_set_header X-Real-IP       $remote_addr;
 
     client_max_body_size  100k; # default is 1M
@@ -77,24 +79,36 @@
     try_files /dev/null @api;
   }
 
-  location = /api/v1/users/me/avatar/pick {
-    limit_except POST HEAD { deny all; }
+  location ~ ^/api/v1/videos/(upload-resumable|([^/]+/source/replace-resumable))$ {
+    client_max_body_size    0;
+    proxy_request_buffering off;
+
+    try_files /dev/null @api;
+  }
 
-    client_max_body_size                      2M; # default is 1M
-    add_header            X-File-Maximum-Size 2M always; # inform backend of the set value in bytes
+  location ~ ^/api/v1/users/[^/]+/imports/import-resumable$ {
+    client_max_body_size    0;
+    proxy_request_buffering off;
 
     try_files /dev/null @api;
   }
 
-  location = /api/v1/videos/upload {
+  location ~ ^/api/v1/videos/(upload|([^/]+/studio/edit))$ {
     limit_except POST HEAD { deny all; }
 
     # This is the maximum upload size, which roughly matches the maximum size of a video file.
     # Note that temporary space is needed equal to the total size of all concurrent uploads.
     # This data gets stored in /var/lib/nginx by default, so you may want to put this directory
     # on a dedicated filesystem.
-    client_max_body_size                      8G; # default is 1M
-    add_header            X-File-Maximum-Size 8G always; # inform backend of the set value in bytes
+    client_max_body_size                      12G; # default is 1M
+    add_header            X-File-Maximum-Size 8G always; # inform backend of the set value in bytes before mime-encoding (x * 1.4 >= client_max_body_size)
+
+    try_files /dev/null @api;
+  }
+
+  location ~ ^/api/v1/(videos|video-playlists|video-channels|users/me) {
+    client_max_body_size                      12M; # default is 1M
+    add_header            X-File-Maximum-Size 8M always; # inform backend of the set value in bytes before mime-encoding (x * 1.4 >= client_max_body_size)
 
     try_files /dev/null @api;
   }
@@ -106,7 +120,7 @@
   location @api_websocket {
     proxy_http_version 1.1;
     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
-    proxy_set_header   Host            $host;
+    proxy_set_header   Host            $http_host;
     proxy_set_header   X-Real-IP       $remote_addr;
     proxy_set_header   Upgrade         $http_upgrade;
     proxy_set_header   Connection      "upgrade";
@@ -126,6 +140,11 @@
     try_files /dev/null @api_websocket;
   }
 
+  # Plugin websocket routes
+  location ~ ^/plugins/[^/]+(/[^/]+)?/ws/ {
+    try_files /dev/null @api_websocket;
+  }
+
   ##
   # Performance optimizations
   # For extra performance please refer to https://github.com/denji/nginx-tuning
@@ -155,6 +174,7 @@
   keepalive_timeout         10s; # default is 75
   resolver_timeout          10s; # default is 30
   reset_timedout_connection on;
+  proxy_ignore_client_abort on;
 
   tcp_nopush                on; # send headers in one piece
   tcp_nodelay               on; # don't buffer data sent, good for small data bursts in real time
@@ -165,7 +185,7 @@
 
   # Bypass PeerTube for performance reasons. Optional.
   # Should be consistent with client-overrides assets list in /server/controllers/client.ts
-  location ~ ^/client/(assets/images/(icons/icon-36x36\.png|icons/icon-48x48\.png|icons/icon-72x72\.png|icons/icon-96x96\.png|icons/icon-144x144\.png|icons/icon-192x192\.png|icons/icon-512x512\.png|logo\.svg|favicon\.png))$ {
+  location ~ ^/client/(assets/images/(icons/icon-36x36\.png|icons/icon-48x48\.png|icons/icon-72x72\.png|icons/icon-96x96\.png|icons/icon-144x144\.png|icons/icon-192x192\.png|icons/icon-512x512\.png|logo\.svg|favicon\.png|default-playlist\.jpg|default-avatar-account\.png|default-avatar-account-48x48\.png|default-avatar-video-channel\.png|default-avatar-video-channel-48x48\.png))$ {
     add_header Cache-Control "public, max-age=31536000, immutable"; # Cache 1 year
 
     root /var/www/peertube;
@@ -202,6 +222,18 @@
     try_files $uri @api;
   }
 
+  location ~ ^(/static/(webseed|web-videos|streaming-playlists/hls)/private/)|^/download {
+    # We can't rate limit a try_files directive, so we need to duplicate @api
+
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header Host            $http_host;
+    proxy_set_header X-Real-IP       $remote_addr;
+
+    proxy_limit_rate 5M;
+
+    proxy_pass http://backend;
+  }
+
   # Bypass PeerTube for performance reasons. Optional.
   location ~ ^/static/(webseed|redundancy|streaming-playlists)/ {
     limit_rate_after            5M;
@@ -233,9 +265,6 @@
       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;
     }
 
     # Enabling the sendfile directive eliminates the step of copying the data into the buffer

Redémarrage de Peertube

  • vous avec vos backups sous la main
  • vous avez mis à jour la configuration de PeerTube
  • vous avez bougé les vidéos et ajouté les répertoires manquants
  • vous avez mis à jour la configuration de Nginx
  • vous avez relancé Nginx

OK, relancez Nginx :slight_smile:

Test de Peertube

Lancer les logs :

journalctl -fe -u peertube -u nginx

Pointer le navigateur vers votre PeerTube…

Si c’est bon, ouf, ne ratez pas la prochaine mise à jour !

Sinon, le forum PeerTube est là pour vous aider.

Après la mise à jour

La documentation conseille de faire le ménage : certains artefacts inutilisés ont pu rester sur le disque et occuper de la place pour rien (notamment dans vos sauvegardes) :

cd /var/www/peertube/peertube-latest
sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run prune-storage

Conclusion

PeerTube est un logiciel bien conçu avec une mise à jour largement automatisée et qui prend en compte les sauvegardes préalables. La vérification est recommandée mais en pratique, l’ensemble des mises à jour est vraiment solide.