Mise à jour depuis la 3.0.1 vers la 7.0.0 (pb au passage à la 3.1.0)

Bonjour, bonsoir, et bonne année !

2025 signe l’arrêt de la procrastination et je me suis enfin décidé à mettre à jour ma bonne vieille instance (qui tourne depuis les beta) en 3.0.1 vers la 7.0.0 en y allant par étape. (version par version)

J’ai migré le serveur d’un vieux FreeBSD 12 sur une Debian 12 et mis à jour la base PostgreSQL en 9.6 vers la 17.
C’est fonctionnel.

Mais CF. Question : upgrade and migrate from 3.0.1 on FreeBSD 12 to 7.0.0 on Debian 12 (possible?) · Issue #6806 · Chocobozzz/PeerTube · GitHub

J’ai une erreur au lancement de la 3.1.0 :

[peertube.gegeweb.eu:443] 2025-01-03 21:45:18.048 error: Cannot install application. {
  "err": {
    "stack": "SequelizeUniqueConstraintError: n'a pas pu créer l'index unique « thumbnail_filename_type »\n    at Query.formatError (/var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/dialects/postgres/query.js:347:16)\n    at Query.run (/var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/dialects/postgres/query.js:87:18)\n    at processTicksAndRejections (node:internal/process/task_queues:94:5)\n    at async /var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/sequelize.js:619:16\n    at async PostgresQueryInterface.addIndex (/var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/dialects/abstract/query-interface.js:541:12)\n    at async Function.sync (/var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/model.js:1367:7)\n    at async Sequelize.sync (/var/www/peertube/versions/peertube-v3.1.0/node_modules/sequelize/lib/sequelize.js:793:35)\n    at async Promise.all (index 0)",
    "message": "n'a pas pu créer l'index unique « thumbnail_filename_type »",
    "name": "SequelizeUniqueConstraintError",
    "errors": {},
    "parent": {
      "stack": "error: n'a pas pu créer l'index unique « thumbnail_filename_type »\n    at Parser.parseErrorMessage (/var/www/peertube/versions/peertube-v3.1.0/node_modules/pg-protocol/dist/parser.js:278:15)\n    at Parser.handlePacket (/var/www/peertube/versions/peertube-v3.1.0/node_modules/pg-protocol/dist/parser.js:126:29)\n    at Parser.parse (/var/www/peertube/versions/peertube-v3.1.0/node_modules/pg-protocol/dist/parser.js:39:38)\n    at Socket.<anonymous> (/var/www/peertube/versions/peertube-v3.1.0/node_modules/pg-protocol/dist/index.js:10:42)\n    at Socket.emit (node:events:369:20)\n    at addChunk (node:internal/streams/readable:313:12)\n    at readableAddChunk (node:internal/streams/readable:288:9)\n    at Socket.Readable.push (node:internal/streams/readable:227:10)\n    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)",
      "message": "n'a pas pu créer l'index unique « thumbnail_filename_type »",
      "length": 283,
      "name": "error",
      "severity": "ERREUR",
      "code": "23505",
      "detail": "La clé (filename, type)=(2bf096f8-028c-484c-8cb6-e3418a161ecc.jpg, 1) est dupliquée.",
      "schema": "public",
      "table": "thumbnail",
      "constraint": "thumbnail_filename_type",
      "file": "tuplesortvariants.c",
      "line": "1550",
      "routine": "comparetup_index_btree_tiebreak",
      "sql": "CREATE UNIQUE INDEX \"thumbnail_filename_type\" ON \"thumbnail\" (\"filename\", \"type\")"
    },
    "sql": "CREATE UNIQUE INDEX \"thumbnail_filename_type\" ON \"thumbnail\" (\"filename\", \"type\")"
  }
}

Comment je peux m’en dépatouiller ?

Ensuite le mieux, version par version ?
Ou je peux passer les intermédiaire et faire directement 4 puis 5 puis 6… ?

C’est bon, j’ai éliminé les doublons.

Bon…

toujours un problème au passage de la 3.0.1 à la 3.1.0.

Voici l’erreur sur certaines vidéos locales, du coup écran noir et pas de description.
Ça ne le fait pas sur toutes les vidéos.

[peertube.gegeweb.eu:443] 2025-01-04 10:50:40.593 error: Error in controller. {
  "err": "TypeError [ERR_INVALID_ARG_TYPE]: The \"path\" argument must be of type string. Received null\n    at new NodeError (node:internal/errors:329:5)\n    at validateString (node:internal/validators:129:11)\n    at Object.join (node:path:1081:7)\n    at VideoFileModel.getFileStaticPath (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-file.js:187:27)\n    at VideoFileModel.getFileUrl (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-file.js:182:53)\n    at /var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-format-utils.js:158:32\n    at Array.map (<anonymous>)\n    at videoFilesModelToFormattedJSON (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-format-utils.js:144:10)\n    at /var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-format-utils.js:119:23\n    at Array.map (<anonymous>)\n    at streamingPlaylistsModelToFormattedJSON (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-format-utils.js:115:10)\n    at Object.videoModelToFormattedDetailsJSON (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video-format-utils.js:89:32)\n    at self.toFormattedDetailsJSON (/var/www/peertube/versions/peertube-v3.1.0/dist/server/models/video/video.js:998:37)\n    at /var/www/peertube/versions/peertube-v3.1.0/dist/server/controllers/api/videos/index.js:290:31\n    at Generator.next (<anonymous>)\n    at fulfilled (/var/www/peertube/versions/peertube-v3.1.0/node_modules/tslib/tslib.js:114:62)\n    at runMicrotasks (<anonymous>)\n    at processTicksAndRejections (node:internal/process/task_queues:94:5)"
}

Donc retour en 3.0.1 le temps de trouver d’où provient le problème.
Mais la je sèche.

je passe de node v12 à node v15 entre les deux.
Et posgresql a été upgradé en 17 avant.
Tout fonctionne avec la 3.0.1…

Bref, je sèche un peu.
Je vais aller aussi commenter sur le github.

Bon, je pense que ceci devrait aider à résoudre le problème, du moins croisons les doigts !

Oui mais non…

peertube_prod=> UPDATE "videoFile" SET filename = t.uuid || '-' || t.resolution || t.extname, "torrentFilename" = t.uuid || '-' || t.resolution || '.torrent' FROM (SELECT "videoFile".id, "video".uuid, "videoFile".resolution, "videoFile".extname FROM video INNER JOIN "videoFile" ON "videoFile"."videoId" = video.id) AS t WHERE t.id = "videoFile"."id" AND "filename" IS NULL;
UPDATE 113691
peertube_prod=> UPDATE "videoFile" SET filename = t.uuid || '-' || t.resolution || '-fragmented' || t.extname, "torrentFilename" = t.uuid || '-' || t.resolution || '-hls.torrent' FROM (SELECT "videoFile".id, "video".uuid, "videoFile".resolution, "videoFile".extname FROM video INNER JOIN "videoStreamingPlaylist" ON "videoStreamingPlaylist"."videoId" = video.id INNER JOIN "videoFile" ON "videoFile"."videoStreamingPlaylistId" = "videoStreamingPlaylist".id) AS t WHERE t.id = "videoFile"."id" AND "filename" IS NULL;
ERREUR:  la valeur d'une clé dupliquée rompt la contrainte unique « video_file_torrent_filename »
DÉTAIL : La clé « ("torrentFilename")=(2bf096f8-028c-484c-8cb6-e3418a161ecc-2160-hls.torrent) » existe déjà.

Probable que ce soir un ersast de précédentes tentatives de migration avortées sans avoir réintégré le backup de la BDD avant le retour à la 3.0.1.

Car les colonnes existent déjà et avec des valeurs pour certains enregistrement dans la table.

Bref… pas gagné l’histoire !
Je comprend pourquoi j’avais abdiqué et procrastiné à l’époque.

Si quelqu’un sait faire un miracle ! Je lui en serais reconnaissant ! :wink:

Épilogue du monologue, mais si ça peut servir à quelqu’un…
Il y a de fortes chances que à l’époque la mise à jour vers la 3.1.0 ait effectivement échoué et ait été avorté à cause de la version de PostgeSQL (9.6) et que je sois revenu à la 3.0.1 mais… sans réintégrer le backup de la BDD précédent la procédure. Joueur…
Et donc les colonnes en question étaient déjà en BDD, avec des valeurs de l’époque (je n’ai pas noté la référence, mais une discussion sur le sujet indiquait que ces colonnes n’existaient pas dans la 3.0.1), d’où le fait que certaines vidéos (celles existante à l’époque) n’étaient pas impacté puisque les bonnes valeurs en BDD.
Après avoir étudié le contenu de dist/server/initializers/migrations/ j’en ai déduit que 0585-video-file-names.js avait été effectué mais que ce n’était pas allé jusque 0600-duplicate-video-files.js et probablement l’index pas créé à ce moment.
Avant la procédure d’upgrade v3.0.1 > 3.1.0 l’index en question n’existait effectivement pas encore en BDD.

J’ai donc exécuté ces deux requêtes (celle effectuée après création des colonnes par 0585-video-file-names.js) avant de relancer l’upgrade.

Et bingo ! \o/

Bon je doute qu’il y a beaucoup de procrastineuses ou procrastineurs dans mon cas mais si jamais ça peut être utile…

Désormais en 4.0.0 et on poursuit tranquillement de version en version pour éviter un trop gros saut.
Si tout va bien on sera en 7.0.0 en fin de matinée.

1 « J'aime »