Bonjour,
Après le passage en v8 sous docker je m’aperçois que les vinettes des vidéos ont disparues.
J’ai essayé la commande : « docker compose exec -u peertube peertube npm run regenerate-thumbnails »
Mais sans succès. Les logs montrent des erreur de fichiers introuvables :
Cannot process video 5. Error: Thumbnail /data/thumbnails/c0151008-55b5-470c-91ab-5097563bb199.jpg does not exist on disk
at processThumbnails (file:///app/dist/scripts/regenerate-thumbnails.js:54:15)
at async processVideo (file:///app/dist/scripts/regenerate-thumbnails.js:36:5)
Cannot process video 17. Error: Thumbnail /data/thumbnails/6dcf3f9a-9925-4196-ba81-e268287c2fa5.jpg does not exist on disk
at processThumbnails (file:///app/dist/scripts/regenerate-thumbnails.js:54:15)
at async processVideo (file:///app/dist/scripts/regenerate-thumbnails.js:36:5)
…
La sortie commence par :
~/apps/peertube7# more /tmp/update.log
peertube@8.3.2 regenerate-thumbnails
node ./dist/scripts/regenerate-thumbnails.js
[monserveur.org:443 uploadx] 2026-11-09 11:45:47.414 debug: provided options: {
directory: ‹ /data/tmp/resumable-uploads ›,
expiration: { maxAge: undefined, rolling: true },
maxMetadataSize: ‹ 10MB ›,
userIdentifier: [Function: userIdentifier],
filename: [Function: filename],
baseUrl: ‹ https://monserveur.org ›
} {
« options »: {
« directory »: « /data/tmp/resumable-uploads »,
« expiration »: {
« rolling »: true
},
« maxMetadataSize »: « 10MB »,
« baseUrl »: « https://monserveur.org »
}
}
[monserveur.org:443 uploadx] 2026-11-09 11:45:47.420 debug: registered handlers: DELETE, GET, OPTIONS, PATCH, POST, PUT
[monserveur.org:443] 2026-11-09 11:45:48.821 debug: Executed SQL request - Executing (default): SELECT 1 FROM pg_available_extensions WHERE name = ‹ pg_trgm › AND installed_version IS NOT NULL;
[monserveur.org:443] 2026-11-09 11:45:48.825 debug: Executed SQL request - Executing (default): SELECT 1 FROM pg_available_extensions WHERE name = ‹ unaccent › AND installed_version IS NOT NULL;
[monserveur.org:443] 2026-11-09 11:45:48.840 debug: Executed SQL request - Executing (default): CREATE OR REPLACE FUNCTION immutable_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent(‹ public.unaccent ›, $1::text)
$func$ LANGUAGE sql IMMUTABLE;
[monserveur.org:443] 2026-11-09 11:45:48.847 debug: Executed SQL request - Executing (default): CREATE OR REPLACE FUNCTION video_search_vector(name text, description text)
RETURNS tsvector AS
$func$
SELECT setweight(to_tsvector(‹ simple ›, immutable_unaccent(coalesce(name, ‹ ›))), ‹ A ›) ||
setweight(to_tsvector(‹ simple ›, immutable_unaccent(left(coalesce(description, ‹ ›), 1000))), ‹ B ›)
$func$ LANGUAGE sql IMMUTABLE;
[monserveur.org:443] 2026-11-09 11:45:48.944 debug: Executed SQL request - Executing (default): SELECT « id » FROM « video » AS « VideoModel » WHERE « VideoModel ».« remote » = false;
[monserveur.org:443] 2026-11-09 11:45:49.136 debug: Executed SQL request - Executing (default): SELECT « video ».*, « ThumbnailsJSON ».« thumbnails » AS « ThumbnailsJSON », « VideoBlacklist ».« id » AS « VideoB
lacklist.id », « VideoBlacklist ».« reason » AS « VideoBlacklist.reason », « VideoBlacklist ».« unfederated » AS « VideoBlacklist.unfederated », « VideoChannel ».« id » AS « VideoChannel.id », « VideoChannel ».« name » A
S « VideoChannel.name », « VideoChannel ».« description » AS « VideoChannel.description », « VideoChannel ».« accountId » AS « VideoChannel.accountId », « VideoChannel ».« publicEmail » AS « VideoChannel.publicEmail »
, « VideoChannel ».« support » AS « VideoChannel.support », « VideoChannel ».« createdAt » AS « VideoChannel.createdAt », « VideoChannel ».« updatedAt » AS « VideoChannel.updatedAt », « VideoChannel->Actor ».« id » AS "
VideoChannel.Actor.id", « VideoChannel->Actor ».« preferredUsername » AS « VideoChannel.Actor.preferredUsername », « VideoChannel->Actor ».« url » AS « VideoChannel.Actor.url », « VideoChannel->Actor ».« serverId
" AS « VideoChannel.Actor.serverId », « VideoChannel->Actor ».« accountId » AS « VideoChannel.Actor.accountId », « VideoChannel->Actor ».« videoChannelId » AS « VideoChannel.Actor.videoChannelId », « VideoChannel
->Actor ».« type » AS « VideoChannel.Actor.type », « VideoChannel->Actor ».« followersCount » AS « VideoChannel.Actor.followersCount », « VideoChannel->Actor ».« followingCount » AS « VideoChannel.Actor.followingC
ount », « VideoChannel->Actor ».« inboxUrl » AS « VideoChannel.Actor.inboxUrl », « VideoChannel->Actor ».« outboxUrl » AS « VideoChannel.Actor.outboxUrl », « VideoChannel->Actor ».« sharedInboxUrl » AS « VideoChanne
l.Actor.sharedInboxUrl », « VideoChannel->Actor ».« followersUrl » AS « VideoChannel.Actor.followersUrl », « VideoChannel->Actor ».« followingUrl » AS « VideoChannel.Actor.followingUrl », « VideoChannel->Actor ».
« remoteCreatedAt » AS « VideoChannel.Actor.remoteCreatedAt », « VideoChannel->Actor ».« createdAt » AS « VideoChannel.Actor.createdAt », « VideoChannel->Actor ».« updatedAt » AS « VideoChannel.Actor.updatedAt »,
« VideoChannel->Actor->AvatarsJSON ».« Avatars » AS « VideoChannel.Actor.AvatarsJSON », « VideoChannel->Actor->Server ».« id » AS « VideoChannel.Actor.Server.id », « VideoChannel->Actor->Server ».« host » AS « Vide
oChannel.Actor.Server.host », « VideoChannel->Account ».« id » AS « VideoChannel.Account.id », « VideoChannel->Account ».« name » AS « VideoChannel.Account.name », « VideoChannel->Account ».« description » AS « Vide
oChannel.Account.description », « VideoChannel->Account ».« userId » AS « VideoChannel.Account.userId », « VideoChannel->Account ».« createdAt » AS « VideoChannel.Account.createdAt », « VideoChannel->Account ».« u
pdatedAt » AS « VideoChannel.Account.updatedAt », « VideoChannel->Account->Actor ».« id » AS « VideoChannel.Account.Actor.id », « VideoChannel->Account->Actor ».« preferredUsername » AS « VideoChannel.Account.Ac
tor.preferredUsername », « VideoChannel->Account->Actor ».« url » AS « VideoChannel.Account.Actor.url », « VideoChannel->Account->Actor ».« serverId » AS « VideoChannel.Account.Actor.serverId », « VideoChannel->
Account->Actor ».« accountId » AS « VideoChannel.Account.Actor.accountId », « VideoChannel->Account->Actor ».« videoChannelId » AS « VideoChannel.Account.Actor.videoChannelId », « VideoChannel->Account->Actor »
.« type » AS « VideoChannel.Account.Actor.type », « VideoChannel->Account->Actor ».« followersCount » AS « VideoChannel.Account.Actor.followersCount », « VideoChannel->Account->Actor ».« followingCount » AS « Vid
eoChannel.Account.Actor.followingCount », « VideoChannel->Account->Actor ».« inboxUrl » AS « VideoChannel.Account.Actor.inboxUrl », « VideoChannel->Account->Actor ».« outboxUrl » AS « VideoChannel.Account.Acto
r.outboxUrl », « VideoChannel->Account->Actor ».« sharedInboxUrl » AS « VideoChannel.Account.Actor.sharedInboxUrl », « VideoChannel->Account->Actor ».« followersUrl » AS « VideoChannel.Account.Actor.followersU
rl », « VideoChannel->Account->Actor ».« followingUrl » AS « VideoChannel.Account.Actor.followingUrl », « VideoChannel->Account->Actor ».« remoteCreatedAt » AS « VideoChannel.Account.Actor.remoteCreatedAt », « V
ideoChannel->Account->Actor ».« createdAt » AS « VideoChannel.Account.Actor.createdAt », « VideoChannel->Account->Actor ».« updatedAt » AS « VideoChannel.Account.Actor.updatedAt », « VideoChannel->Account->Act
or->AvatarsJSON ».« Avatars » AS « VideoChannel.Account.Actor.AvatarsJSON », « VideoChannel->Account->Actor->Server ».« id » AS « VideoChannel.Account.Actor.Server.id », « VideoChannel->Account->Actor->Server »
.« host » AS « VideoChannel.Account.Actor.Server.host », « Tags ».« id » AS « Tags.id », « Tags ».« name » AS « Tags.name », « Tags->VideoTagModel ».« videoId » AS « Tags.VideoTagModel.videoId », « Tags->VideoTagModel ». »
tagId" AS « Tags.VideoTagModel.tagId », « Tags->VideoTagModel ».« createdAt » AS « Tags.VideoTagModel.createdAt », « Tags->VideoTagModel ».« updatedAt » AS « Tags.VideoTagModel.updatedAt », « ScheduleVideoUpdate »
.« id » AS « ScheduleVideoUpdate.id », « ScheduleVideoUpdate ».« updateAt » AS « ScheduleVideoUpdate.updateAt », « ScheduleVideoUpdate ».« privacy » AS « ScheduleVideoUpdate.privacy », « ScheduleVideoUpdate ».« video
Id » AS « ScheduleVideoUpdate.videoId », « ScheduleVideoUpdate ».« createdAt » AS « ScheduleVideoUpdate.createdAt », « ScheduleVideoUpdate ».« updatedAt » AS « ScheduleVideoUpdate.updatedAt », « VideoLive ».« id » AS
« VideoLive.id », « VideoLive ».« streamKey » AS « VideoLive.streamKey », « VideoLive ».« saveReplay » AS « VideoLive.saveReplay », « VideoLive ».« permanentLive » AS « VideoLive.permanentLive », « VideoLive ».« dvrWind
ow » AS « VideoLive.dvrWindow », « VideoLive ».« latencyMode » AS « VideoLive.latencyMode », « VideoLive ».« videoId » AS « VideoLive.videoId », « VideoLive ».« replaySettingId » AS « VideoLive.replaySettingId », « Vide
oLive ».« createdAt » AS « VideoLive.createdAt », « VideoLive ».« updatedAt » AS « VideoLive.updatedAt », « VideoLive->VideoLiveSchedules ».« id » AS « VideoLive.VideoLiveSchedules.id », « VideoLive->VideoLiveSchedu
les ».« startAt » AS « VideoLive.VideoLiveSchedules.startAt », « VideoLive->VideoLiveSchedules ».« createdAt » AS « VideoLive.VideoLiveSchedules.createdAt », « VideoLive->VideoLiveSchedules ».« updatedAt » AS « Vi
deoLive.VideoLiveSchedules.updatedAt », « VideoCaptions ».« id » AS « VideoCaptions.id », « VideoCaptions ».« language » AS « VideoCaptions.language », « VideoCaptions ».« fileUrl » AS « VideoCaptions.fileUrl », « Vid
eoCaptions ».« storage » AS « VideoCaptions.storage », « VideoCaptions ».« filename » AS « VideoCaptions.filename », « VideoCaptions ».« automaticallyGenerated » AS « VideoCaptions.automaticallyGenerated », « VideoC
aptions ».« m3u8Filename » AS « VideoCaptions.m3u8Filename », « VideoCaptions ».« m3u8Url » AS « VideoCaptions.m3u8Url », « Storyboard ».« id » AS « Storyboard.id », « Storyboard ».« filename » AS « Storyboard.filename »
, « Storyboard ».« totalHeight » AS « Storyboard.totalHeight », « Storyboard ».« totalWidth » AS « Storyboard.totalWidth », « Storyboard ».« spriteHeight » AS « Storyboard.spriteHeight », « Storyboard ».« spriteWidth »
AS « Storyboard.spriteWidth », « Storyboard ».« spriteDuration » AS « Storyboard.spriteDuration », « Storyboard ».« fileUrl » AS « Storyboard.fileUrl », « Storyboard ».« cached » AS « Storyboard.cached », « Storyboard »
.« videoId » AS « Storyboard.videoId », « Storyboard ».« createdAt » AS « Storyboard.createdAt », « Storyboard ».« updatedAt » AS « Storyboard.updatedAt » FROM (SELECT * FROM « video » WHERE « video ».id = 5 LIMIT 1)
AS « video » LEFT JOIN LATERAL ( SELECT json_agg( jsonb_build_object( ‹ id ›, « id », ‹ filename ›, « filename », ‹ fileUrl ›, « fileUrl », ‹ width ›, « width », ‹ height ›, « height », ‹ aspectRatio ›, « aspect
Ratio », ‹ cached ›, « cached », ‹ automaticallyGenerated ›, « automaticallyGenerated », ‹ videoId ›, « videoId », ‹ videoPlaylistId ›, « videoPlaylistId », ‹ createdAt ›, « createdAt », ‹ updatedAt ›, « updatedAt » )
) AS « thumbnails » FROM « thumbnail » WHERE « videoId » = « video ».« id ») AS « ThumbnailsJSON » ON TRUE LEFT OUTER JOIN « videoBlacklist » AS « VideoBlacklist » ON « video ».« id » = « VideoBlacklist ».« videoId » INNE
R JOIN « videoChannel » AS « VideoChannel » ON « video ».« channelId » = « VideoChannel ».« id » INNER JOIN « actor » AS « VideoChannel->Actor » ON « VideoChannel ».« id » = « VideoChannel->Actor ».« videoChannelId » LEFT
OUTER JOIN « server » AS « VideoChannel->Actor->Server » ON « VideoChannel->Actor ».« serverId » = « VideoChannel->Actor->Server ».« id » LEFT JOIN LATERAL (SELECT json_agg( jsonb_build_object( ‹ id ›, « id »
, ‹ width ›, « width », ‹ filename ›, « filename », ‹ type ›, « type », ‹ fileUrl ›, « fileUrl », ‹ cached ›, « cached », ‹ createdAt ›, « createdAt », ‹ updatedAt ›, « updatedAt », ‹ height ›, « height », ‹ width ›, « width », 'type
', « type » )) AS « Avatars » FROM « actorImage » WHERE « actorId » = « VideoChannel->Actor ».« id » AND « type » = 1) AS « VideoChannel->Actor->AvatarsJSON » ON TRUE INNER JOIN « account » AS « VideoChannel->Accoun
t » ON « VideoChannel ».« accountId » = « VideoChannel->Account ».« id » INNER JOIN « actor » AS « VideoChannel->Account->Actor » ON « VideoChannel->Account ».« id » = « VideoChannel->Account->Actor ».« accountId » LEF
T OUTER JOIN « server » AS « VideoChannel->Account->Actor->Server » ON « VideoChannel->Account->Actor ».« serverId » = « VideoChannel->Account->Actor->Server ».« id » LEFT JOIN LATERAL (SELECT json_agg( jsonb
_build_object( ‹ id ›, « id », ‹ width ›, « width », ‹ filename ›, « filename », ‹ type ›, « type », ‹ fileUrl ›, « fileUrl », ‹ cached ›, « cached », ‹ createdAt ›, « createdAt », ‹ updatedAt ›, « updatedAt », ‹ height ›, « heig
ht », ‹ width ›, « width », ‹ type ›, « type » )) AS « Avatars » FROM « actorImage » WHERE « actorId » = « VideoChannel->Account->Actor ».« id » AND « type » = 1) AS « VideoChannel->Account->Actor->AvatarsJSON » ON TRUE
LEFT OUTER JOIN (« videoTag » AS « Tags->VideoTagModel » INNER JOIN « tag » AS « Tags » ON « Tags ».« id » = « Tags->VideoTagModel ».« tagId ») ON « video ».« id » = « Tags->VideoTagModel ».« videoId » LEFT OUTER JOIN « s
cheduleVideoUpdate » AS « ScheduleVideoUpdate » ON « video ».« id » = « ScheduleVideoUpdate ».« videoId » LEFT OUTER JOIN « videoLive » AS « VideoLive » ON « video ».« id » = « VideoLive ».« videoId » LEFT OUTER JOIN « vi
deoLiveSchedule » AS « VideoLive->VideoLiveSchedules » ON « VideoLive->VideoLiveSchedules ».« liveVideoId » = « VideoLive ».« id » LEFT JOIN « videoCaption » AS « VideoCaptions » ON « video ».« id » = « VideoCaptions »
.« videoId » LEFT OUTER JOIN « storyboard » AS « Storyboard » ON « video ».« id » = « Storyboard ».« videoId » ORDER BY « Tags ».« name » ASC
[monserveur.org:443] 2026-11-09 11:45:49.139 debug: Executed SQL request - Executing (default): SELECT « video ».« id », « VideoFiles ».« id » AS « VideoFiles.id », « VideoFiles ».« createdAt » AS « VideoFiles.cr
eatedAt », « VideoFiles ».« updatedAt » AS « VideoFiles.updatedAt », « VideoFiles ».« resolution » AS « VideoFiles.resolution », « VideoFiles ».« size » AS « VideoFiles.size », « VideoFiles ».« extname » AS « VideoFiles.e
xtname », « VideoFiles ».« filename » AS « VideoFiles.filename », « VideoFiles ».« fileUrl » AS « VideoFiles.fileUrl », « VideoFiles ».« torrentFilename » AS « VideoFiles.torrentFilename », « VideoFiles ».« torrentUrl »
AS « VideoFiles.torrentUrl », « VideoFiles ».« fps » AS « VideoFiles.fps », « VideoFiles ».« metadataUrl » AS « VideoFiles.metadataUrl », « VideoFiles ».« videoStreamingPlaylistId » AS « VideoFiles.videoStreamingPlay
listId », « VideoFiles ».« videoId » AS « VideoFiles.videoId », « VideoFiles ».« width » AS « VideoFiles.width », « VideoFiles ».« height » AS « VideoFiles.height », « VideoFiles ».« formatFlags » AS « VideoFiles.formatFl
ags », « VideoFiles ».« streams » AS « VideoFiles.streams », « VideoFiles ».« storage » AS « VideoFiles.storage », « VideoFiles->InfohashJSON ».« infoHash » AS « VideoFiles.InfohashJSON » FROM « video » LEFT JOIN « vide
oFile » AS « VideoFiles » ON « VideoFiles ».« videoId » = « video ».« id » LEFT JOIN LATERAL (SELECT json_agg(ENCODE(« infohash », ‹ hex ›)) AS « infoHash » FROM « videoInfohash » WHERE « videoFileId » = « VideoFiles »."
id") AS « VideoFiles->InfohashJSON » ON TRUE WHERE « video ».id = 5
(et pleins d’autres requete analogues)
Processing playlist Watch later.
Processing playlist Watch later.
Processing playlist Watch later.
Processing playlist Watch later.
Processing playlist Watch later.
Processing playlist Watch later.
Une idée ?
PS: Le répertoire /data/thumbnails contient d’autres fichiers jpg que ceux indiqués comme introuvable.
Merci,