Installation DEB dans une VM Debian 13.4 : génération de PDF impossible (erreur) avec modèle Canoprof

Bonjour,
Compte tenu de l’arrêt programmée et définitif de Canoprof, je me suis monté un serveur SCENARIsuite-starter chez moi.
J’ai installé le .deb dans une VM Debian 13.4 (hôte Proxmox VE 9.1.9).
J’ai suivi la documentation pour l’installation (avec un peu d’aide de Claude).
J’ai un serveur fonctionnel, avec mon nom de domaine. J’ai mis les modèles documentaires suivants :


Et les skinpack :

J’ai créé un utilisateur non-admin avec lequel j’ai importé un de mes dépôts canoprof, le plus petit.
J’ai testé la génération web, pas de soucis.
Mais pour la génération PDF, c’est autre chose… ça ne veut pas…
J’ai une erreur :


Rapport complet :

Une erreur est survenue lors de la génération.

--- Admin details ---
<?xml version="1.0" encoding="UTF-8"?><trace>
	<start t="01/05/26 16:29:48"/>
	<l t="Error" d="01/05/26 16:29:48">
		<message type="Error" ts="1777645788628" appCtx="chain" user="Le-Prof" thread="ForkJoinPool-1-worker-3" desc="Error: An error occured on the CDP write stream">
			<details>Error: An error occured on the CDP write stream
    at Socket.&lt;anonymous&gt; (/opt/postscriptum-1.0/node_modules/@postscriptum.app/cli/dist/cdp.js:216:69)
    at Socket.emit (node:events:519:28)
    at emitErrorNT (node:internal/streams/destroy:170:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
  [cause]: Error: read ECONNRESET
      at Pipe.onStreamRead (node:internal/stream_base_commons:216:20) {
    errno: -104,
    code: 'ECONNRESET',
    syscall: 'read'
  }
</details>
		</message>
	</l>
	<l t="Warning" d="01/05/26 16:29:48">
		<message type="Warning" ts="1777645788628" appCtx="chain" user="Le-Prof" thread="ForkJoinPool-1-worker-3" desc="}"/>
	</l>
	<l t="Error" d="01/05/26 16:29:48">
		<message type="Error" ts="1777645788628" appCtx="chain" user="Le-Prof" thread="ForkJoinPool-1-worker-3" desc="Error: The browser process has been interrupted by the SIGTRAP signal">
			<details>Error: The browser process has been interrupted by the SIGTRAP signal
    at ChildProcess.&lt;anonymous&gt; (/opt/postscriptum-1.0/node_modules/@postscriptum.app/cli/dist/chromium.js:81:30)
    at ChildProcess.emit (node:events:519:28)
    at maybeClose (node:internal/child_process:1101:16)
    at ChildProcess._handle.onexit (node:internal/child_process:304:5)
</details>
		</message>
	</l>
	<l t="FatalError" d="01/05/26 16:29:48">
		<message type="FatalError" ts="1777645788628" appCtx="chain" user="Le-Prof" thread="ForkJoinPool-1-worker-3" desc="Generation failed.">
			<message type="Exception" ts="1777645788628" appCtx="chain" user="Le-Prof" thread="ForkJoinPool-1-worker-3" desc="Postscriptum could not produce the PDF.">
				<details>/var/lib/scenarisuite-starter6.4/working/prl-chain/resAsFile/canoprof.gen.print~fr-FR~2.2.0/print/ui.doss/build.xml:250: Postscriptum could not produce the PDF.
	at org.apache.tools.ant.taskdefs.Exit.execute(Exit.java:162)
	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:299)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
	at org.apache.tools.ant.Task.perform(Task.java:350)
	at org.apache.tools.ant.Target.execute(Target.java:449)
	at org.apache.tools.ant.Target.performTasks(Target.java:470)
	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1401)
	at org.apache.tools.ant.Project.executeTarget(Project.java:1374)
	at com.scenari.m.ge.generator.web.WebGenerator.xGenerate(WebGenerator.java:357)
	at eu.scenari.gen.GenStatic.generate(GenStatic.java:262)
	at eu.scenari.wsp.module.gen.ThreadGen.call(ThreadGen.java:181)
	at eu.scenari.wsp.module.gen.ThreadGen.run(ThreadGen.java:168)
	at eu.scenari.core.universe.Universe$2.run(Universe.java:472)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
</details>
			</message>
		</message>
	</l>
	<end t="01/05/26 16:29:48"/>
</trace>

--- Context ---
reg: {"envKeys":["itemType","securityCtx"],"parent":{"envKeys":["wsp","securityCtx","uiRoot","place","infoBroker","wedSearchCoord","histoEditMgr"],"parent":{"envKeys":["resolver","universe","securityCtx"],"parent":{"envKeys":["resolver","noAuthentication","remoteAuthentications","embeddedAuthentication","universe","securityCtx"]}}}}
uiContext: undefined
wsp: undefined
shortDesc: {"srcUri":"/Acoustique-Ondes-Signaux/D-01-Les_Ondes_Sonores/ESSAI.activite","srcSt":1,"srcDt":1777645784498,"srcRi":511,"srcRoles":["gsCreateWsp","main:manager","depotRead","publicWsp"],"srcId":"id:0E1s83AdBcZ9kPYgwsgNLD","srcStamp":"ihQZPygnFcZgl4jYOP6Wh2dmDl5FZ0FKFD7VcosvbBo=","srcUser":"Le-Prof","itTi":"Activité n°3 (Exp.) : Mesure de la longueur d’onde - [Chap. Les ondes sonores]","itSt":1,"itSgn":"@cp_textActivity#Xml#Map","itModel":"cp_textActivity"}
pubNode: {"ch":[{},{},{}],"showRefreshBtn":true}
genInfo: {"codeGenStack":"print","title":"Génération PDF","status":"failed","lastGen":1777645788623,"uriPub":"/001s83AdBcZ9kPYgwsgNLD/5S1MN6/PQVT8K/46TFF1/4DK7LT/R4/print/","uriTraces":"/001s83AdBcZ9kPYgwsgNLD/5S1MN6/PQVT8K/46TFF1/4DK7LT/R4/print/meta/~Traces.xml","skin":"default","user":"Le-Prof","storedProps":{"lineheight@stored":"100","annexes-comp@stored":"false","include-index@stored":"true","view-prof@stored":"false","view-corr@stored":"false","fontsize@stored":"100","lowres@stored":"false","view-stdt@stored":"true","plan-stdt@stored":"false","coloredLines@stored":"false","annexes-none@stored":"true","annexes-resu@stored":"false","compact@stored":"true"},"skins":[{"code":"blue","title":"Bleu","hasIllus":true},{"code":"default","title":"Canoprof","hasIllus":true},{"code":"educ","title":"Educ","hasIllus":true},{"code":"~smonsarrBoldToTextStrokeBlue","title":"Emojis - Bleu"},{"code":"~smonsarrBoldToTextStrokeCanoprof","title":"Emojis - Canoprof"},{"code":"~smonsarrBoldToTextStrokeEduc","title":"Emojis - Educ"},{"code":"~smonsarrBoldToTextStrokePink","title":"Emojis - Rose"},{"code":"~smonsarrBoldToTextStrokePurple","title":"Emojis - Violet"},{"code":"pink","title":"Rose","hasIllus":true},{"code":"purple","title":"Violet","hasIllus":true}]}
genProps: undefined
customDestPath: undefined
cidInfo: null

--- App context ---
url: https://scenari.ndd.ovh/contenus/~~static/fr-FR//home.xhtml#(wsp'001s83AdBcZ9kPYgwsgNLD'srcRef'id%3A0E1s83AdBcZ9kPYgwsgNLD'),
timestamp: 01/05/2026 16:35:00
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0

edit : j’ai oublié de dire qu’avec Opale, je n’ai pas de souci pour générer un PDF… le problème est avec Canoprof…

J’ai vraiment besoin de cette exportation PDF.
Quelqu’un pourrait-il m’aider à résoudre ce souci ?

Merci par avance.
Pierrick

Bonsoir,

Je viens faire un retour d’expérience sur l’installation de SCENARIsuite-starter 6.4.5 sur une VM Debian 13 Trixie (Proxmox), concernant la génération PDF avec Canoprof.

Symptôme

La génération PDF échouait systématiquement avec le message suivant :

Error: An error occured on the CDP write stream
Error: The browser process has been interrupted by the SIGTRAP signal
Postscriptum could not produce the PDF.

Cela se produisait avec le modèle Canoprof, quel que soit le contenu du document (même un document vide).

Environnement

  • SCENARIsuite-starter 6.4.5
  • Debian 13 Trixie sur VM Proxmox
  • Postscriptum 1.0 installé (paquet postscriptum-1.0-app)
  • Jetty 9 / OpenJDK 21

Diagnostic

Après investigation approfondie, le SIGTRAP venait du binaire Chromium bundlé avec Postscriptum 1.0, qui échouait à initialiser son allocateur mémoire interne (partition_alloc) via le syscall PR_SET_VMA_ANON_NAME. Ce syscall requiert CONFIG_ANON_VMA_NAME=y dans le kernel, option absente du kernel Proxmox/Debian 13.

Mais ce n’était pas la vraie cause racine.

Cause réelle

Le build.xml de la chaîne d’impression Canoprof 2.2.0 référence explicitement Postscriptum 0.13 (postscriptum-0-13), pas Postscriptum 1.0. Il cherche le binaire dans cet ordre : /opt/postscriptum-0.13/, /opt/postscriptum/, /usr/local/bin/postscriptum, /usr/bin/postscriptum.

Or la documentation d’installation ne mentionne pas clairement la coexistence nécessaire des deux versions selon le modèle documentaire :

  • Canoprof → nécessite postscriptum-0.13-app
  • Opale → utilise postscriptum-1.0-app

Solution

apt install postscriptum-0.13-app

Après installation, la génération PDF fonctionne immédiatement pour Canoprof, sans aucune autre modification. Opale continuait de son côté à utiliser Postscriptum 1.0 via son propre build.xml.

Suggestion

Il serait utile que la documentation d’installation précise explicitement quelle version de Postscriptum est requise selon le modèle documentaire utilisé, en particulier pour les installations sur Linux récent (Debian 12/13).

@xah @sam Ne sachant pas qui contacter, je vous cite ici. Pourriez-vous faire remonter ceci pour une mise à jour de la documentation d’installation (celle via ce lien)

J’espère que ce retour pourra aider d’autres utilisateurs qui auto-hébergent SCENARIsuite sur Proxmox ou Debian 13.

Cordialement
Pierrick

1 « J'aime »

Hello et merci pour ce feedback complet :slight_smile:

1 « J'aime »

Bonjour,
Juste pour dire que j’ai pu basculer l’installation dans un conteneur LXC Debian 13.4 (Proxmox), non privilégié.

J’ai rédigé une documentation d’installation assez exhaustive (avec Claude.ai) pour ceux qui veulent :wink:

Merci Pierrick pour ce retour, Dans votre doc, vous dites :

La documentation officielle Scenari n’est pas encore entièrement mise à jour — il faut récupérer la clé directement depuis deb.scenari.software et non depuis le keyserver Ubuntu.

Où avez-vous trouvé une référence au keyserver Ubuntu dans la documentation d’installation de SCENARIsuite-starer ?

Dans la rubrique Sécurisation des fichiers sensibles vous ajoutez des chmod et chown sur des fichiers qui sont déjà en 600 et appartiennent à root directement dans le DEB.

Dans la rubrique 15.4 — Symlink Postscriptum Vous semblez dire qu’il est nécessaire de créer un symlink pour que Opale 25 trouve Postscriptum. Ceci est inexact, Le modèle Opale 25 (qui est un modèle SCENARI 6.4) cherche Postscriptum (en ordre) dans /opt/postscriptum-1.0/bin, /opt/postscriptum/bin, /usr/local/bin et enfin /usr/bin. Dès lors que Postscriptum 1 est installé, Les publications PDF de Opale 25 fonctionneront.
Par ailleurs Postscriptum utilise update-alternatives pour gérer la version qui sera utilisée par défaut (plus pour une utilisation en ligne de commande), ajouter des symlinks à la main n’est donc pas une bonne idée.
Canoprof 2.2 (qui est un modèle SCENARI 6.2) cherche Postscriptum (en ordre) dans /opt/postscriptum-0.13/bin, /opt/postscriptum/bin, /usr/local/bin et enfin /usr/bin.
Donc Si Postscriptum 0.13 n’est pas installé Canoprof va tenter d’utiliser Postscriptum 1 qui en effet échoue.

Dans la rublique 15.3 — Override systemd Jetty Vous dites qu’il faut absolument désactiver le sandbox Chromium. Cela est en effet lié à une particularité dans votre configuration. Dans une installation bare metal ou dans Virtualbox sous Debian 13, l’ajout de kernel.unprivileged_userns_clone=1 est bien suffisant.

Bonjour @sam

Merci pour ces retours très précis et constructifs !

Ce guide a été rédigé de manière itérative, en documentant au fil de l’eau les essais – y compris les fausses pistes. Certaines sections reflétaient donc des contournements explorés lors de sessions de diagnostic, plutôt que la procédure optimale.

J’ai corrigé le document en tenant compte de vos remarques :

  • La référence au keyserver Ubuntu a été supprimée – la clé est bien récupérée directement depuis deb.scenari.software
  • Les chmod/chown ont été remplacés par une simple note indiquant que les permissions sont déjà correctement positionnées par le paquet .deb
  • La section sur le symlink Postscriptum pour Opale a été supprimée – Opale trouve Postscriptum via ses chemins de recherche natifs, et créer des symlinks manuellement est effectivement une mauvaise idée avec update-alternatives
  • La section PS_NO_CHROMIUM_SANDBOX est désormais présentée comme optionnelle et spécifique à certains environnements (VM Proxmox), et non comme systématiquement nécessaire
  • La description de l’échec Canoprof a été corrigée : sans postscriptum-0.13-app, Canoprof tente d’utiliser Postscriptum 1.0 qui est incompatible – ce n’est pas un SIGTRAP immédiat comme je l’avais initialement décrit

Merci encore pour la qualité du retour – ce type de précision est exactement ce qui manque souvent dans les guides communautaires.

Je précise que ce guide a été rédigé avec Claude.ai tout le long des mes recherches pour avoir un serveur fonctionnel.

1 « J'aime »

Merci pour les corrections et bravo à toi pour ton installation.

Bravo pour ce tuto @Pilou_spc
Un petit détail :

Indispensable pour les chaînes Opale, Topaze, Canoprof, Rubis — tout ce qui génère des formules mathématiques/scientifiques ou des publications PDF."

Rubis n’existe plus en tant que tel. Ses fonctionnalités sont intégrées dans Opale (c’est « tutoriel » ou « exerciseur » je ne sais plus)

@Pilou_spc j’ai ajouté ton tuto sur la page wiki de tutos : [wiki] Recensement de tutoriels et auto-formations sur Scenari

Je viens de corriger ça.
Merci.

Merci également :innocent: