Configuration des bibliothèques Python sur n8n auto-hébergé

Décrivez le problème/l’erreur/la question

Salut les gars !
Mes collègues et moi avons du mal à configurer les bibliothèques Python qui peuvent être utilisées avec le nœud de code dans nos workflows.
Nous utilisons Docker sur une machine Ubuntu.
Le docker-compose.yml, task-runners.json et Dockerfile sont déjà configurés par mon collègue qui a utilisé uniquement des nœuds de requête HTTP. Il n’a pas utilisé le nœud de code avec des bibliothèques Python/JS personnalisées.
Localement sur mon PC, j’ai installé Docker Desktop, configuré le docker-compose.yml, task-runners.json et Dockerfile et tout a fonctionné correctement. Quand j’ai essayé de reproduire cela en production, j’ai eu des erreurs. Je vais coller les erreurs ci-dessous.
D’abord nous avons essayé de configurer la bibliothèque JS pdf-lib, puis nous avons essayé de configurer la bibliothèque pypdf.
Pouvez-vous s’il vous plaît nous aider à résoudre ce problème.
Comment pouvons-nous configurer des bibliothèques JS/Python personnalisées ?
Quelles sont les meilleures pratiques (concernant la configuration des conteneurs) si plusieurs utilisateurs vont créer des workflows dans n8n ?

Quel est le message d’erreur (le cas échéant) ?

Message d’erreur dans le terminal : root@n8nsvrp01:~/n8n-docker# sudo docker compose up -d --build task-runners
WARN[0000] Docker Compose est configuré pour construire en utilisant Bake, mais buildx n’est pas installé
[+] Construction 0.8s (7/7) TERMINÉE docker:default
=> [task-runners internal] charger la définition de construction de runner.Dockerfile 0.0s
=> => transférer dockerfile : 399B 0.0s
=> [task-runners internal] charger les métadonnées pour Docker Hub Container Image Library | App Containerization 0.5s
=> [task-runners internal] charger .dockerignore 0.0s
=> => transférer le contexte : 2B 0.0s
=> [task-runners 1/4] FROM Docker Hub Container Image Library | App Containerization 0.0s
=> => résoudre Docker Hub Container Image Library | App Containerization 0.0s
=> EN CACHE [task-runners 2/4] WORKDIR /build 0.0s
=> EN CACHE [task-runners 3/4] RUN npm init -y && npm install pdf-lib 0.0s
=> ERREUR [task-runners 4/4] RUN cd /opt/runners/task-runner-python && VIRTUAL_ENV=/opt/runners/task-runner-python/.venv uv pip install --python /opt/runners/task-runner-python/.venv/bin/python pypdf && chown -R runner 0.2s

[task-runners 4/4] RUN cd /opt/runners/task-runner-python && VIRTUAL_ENV=/opt/runners/task-runner-python/.venv uv pip install --python /opt/runners/task-runner-python/.venv/bin/python pypdf && chown -R runner /opt/runners/task-runner-python/.venv:
0.183 /bin/sh: cd: ligne 0 : impossible d’accéder à /opt/runners/task-runner-python : Aucun fichier ou répertoire de ce type


échec de la résolution : le processus “/bin/sh -c cd /opt/runners/task-runner-python && VIRTUAL_ENV=/opt/runners/task-runner-python/.venv uv pip install --python /opt/runners/task-runner-python/.venv/bin/python pypdf && chown -R runner /opt/runners/task-runner-python/.venv” ne s’est pas terminé correctement : code de sortie 2

Veuillez partager votre workflow

Partagez le résultat renvoyé par le dernier nœud

Impossible de trouver le module « pako » Pile de require : - /opt/runners/task-runner-javascript/node_modules/@pdf-lib/standard-fonts/lib/utils.js - /opt/runners/task-runner-javascript/node_modules/@pdf-lib/standard-fonts/lib/Font.js - /opt/runners/task-runner-javascript/node_modules/@pdf-lib/standard-fonts/lib/index.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/utils/objects.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/utils/index.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/core/errors.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/core/index.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/objects.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/operators.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/colors.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/operations.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/form/appearances.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/form/index.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/api/index.js - /opt/runners/task-runner-javascript/node_modules/pdf-lib/cjs/index.js - /opt/runners/task-runner-javascript/dist/js-task-runner/require-resolver.js - /opt/runners/task-runner-javascript/dist/js-task-runner/js-task-runner.js - /opt/runners/task-runner-javascript/dist/start.js

Informations sur votre configuration n8n

  • Version n8n : 2.17.8.
  • Base de données (par défaut : SQLite) : Postgre : 15
  • Paramètre EXECUTIONS_PROCESS de n8n (par défaut : own, main) :
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) : Docker
  • Système d’exploitation : Ubuntu 26.04

Salut @Todor_n8n, en attendant une réponse, voici quelques ressources qui pourraient t’aider :

Ressources suggérées

Automatiquement associées à ta question.

Documentation :

Forum :

@salmansolutions, @MehranZ, @Miquel_Colomer - vous avez déjà aidé sur des problèmes similaires, pouvez-vous jeter un coup d’œil ?

Suggéré automatiquement par le bot communautaire de n8n. C’est un projet pilote - veuillez partager vos commentaires ici.

Merci beaucoup Lopez pour ta réponse rapide et détaillée !
Nous allons essayer de faire les corrections.

Cordialement,

Todor

Salut @Todor_n8n ,
c’est un classique « presque le bon Dockerfile, mauvais répertoire ». J’ai eu exactement ces deux erreurs.

La compilation Python échoue parce que /opt/runners/task-runner-python n’existe pas dans l’image que tu construis. Ce dossier n’existe que sur n8nio/runners, et le tag doit correspondre à n8n (2.17.8). Si FROM est n8nio/n8n, une image Node, ou une image personnalisée JS uniquement, cd échoue immédiatement. Saute aussi la danse WORKDIR /build + npm init -y — ça crée un tout nouveau projet que le nœud Code ne consulte jamais.

Pour JS, le runner a déjà son propre arborescence de paquets à /opt/runners/task-runner-javascript, et il utilise pnpm, pas npm. pdf-lib apparaissant alors que pako manque, c’est ce que tu obtiens quand npm installe dans un autre dossier (ou ne copie que le package de haut niveau). pako est une dépendance imbriquée, et le résolveur require du runner est assez pointilleux sur l’endroit où il cherche.

Voici le modèle qui marche vraiment :
```FROM n8nio/runners:2.17.8

USER root
RUN cd /opt/runners/task-runner-javascript && pnpm add pdf-lib
RUN cd /opt/runners/task-runner-python && uv pip install pypdf
COPY n8n-task-runners.json /etc/n8n-task-runners.json
USER runner```

Ensuite ajoute-les à la liste d’autorisation dans n8n-task-runners.json — NODE_FUNCTION_ALLOW_EXTERNAL pour JS, N8N_RUNNERS_EXTERNAL_ALLOW pour Python. Installer le paquet n’est pas suffisant ; la liste d’autorisation est un portail séparé. Pour JS tu voudras aussi pako sur cette liste, ou * pendant que tu débogues encore.

Sur le « ça marchait sur mon laptop, ça a explosé sur Ubuntu » : ton log montre déjà la couche npm comme CACHED, et Compose se plaint que Bake/buildx n’est pas installé. Une fois que tu auras corrigé le Dockerfile, recompile avec --no-cache, et installe docker-buildx-plugin pour ne pas te battre avec le builder en plus de tout le reste.

Pour une instance partagée, je garderais une seule image runners personnalisée avec un petit ensemble de libs convenu, épingle les tags n8n + runners ensemble, et traite l’ajout d’un paquet comme une recompilation — pas quelque chose que les gens font à l’intérieur d’un conteneur en cours d’exécution. Les listes d’autorisation jokers vont bien pendant que tu figures ça ; en production je listerais les paquets explicitement.

Si tu peux coller la ligne FROM du Dockerfile et le service task-runners de compose, c’est généralement évident en dix secondes pourquoi ce chemin Python manque.

Salut @Todor_n8n Bienvenue !
n8n refuse par défaut toutes les importations de la bibliothèque standard Python. Une fois l’image construite, import pypdf échoue toujours sur les importations internes de pypdf comme zlib, struct et hashlib. Définissez le flag des importations transitives dans le bloc python de n8n-task-runners.json, ce qui permet aux importations propres d’un package autorisé de contourner la liste d’autorisation :

{
  "runner-type": "python",
  "env-overrides": {
    "PYTHONPATH": "/opt/runners/task-runner-python",
    "N8N_RUNNERS_EXTERNAL_ALLOW": "pypdf",
    "N8N_RUNNERS_ALLOW_TRANSITIVE_IMPORTS": "true",
    "N8N_RUNNERS_STDLIB_ALLOW": "io,base64"
  }
}

Ce que vous importez vous-même dans le nœud Code est toujours vérifié par rapport à la liste d’autorisation, donc N8N_RUNNERS_STDLIB_ALLOW doit lister les modules stdlib que votre script utilise.

Merci Anatoly de prendre le temps de répondre à mes questions !
Je vais jeter un coup d’œil et je vous tiendrai au courant.

Cordialement,

Todor

Merci Anshul de m’avoir aidé avec les problèmes que notre équipe a rencontrés !
Je vais jeter un coup d’œil et te tenir au courant.

Cordialement,

Todor

C’est un plaisir, tu utilises WhatsApp ? Je serais intéressé de collaborer avec toi.