🇫🇷Un environnement n8n prêt pour de la monté en charge: installation et configuration sur Clever Cloud
n8n, qu'est-ce que c'est ?
Connaissez-vous des logiciels comme IFTTT ou Zapier ? Ce sont des moteurs de workflow qui enchaînent des tâches les unes après les autres pour atteindre un résultat final. Ils vous permettent d'automatiser des tâches en fonction des événements qui se présentent. En résumé, lorsque vous effectuez une action, votre moteur de workflow réagit en conséquence.
n8n est également l'un de ces moteurs.
Contrairement à IFTTT et Zapier, il s'agit d'un logiciel Open Source que vous pouvez installer sur l'un de vos serveurs.
Le principal obstacle pour moi avec ce logiciel, c'est qu'il n'était pas facile à configurer pour gérer une forte demande.
Mis à part le fait de pouvoir le scaler verticalement, lancer plusieurs instances simultanément posait quelques problèmes avec la base de données, et il fallait gérer le partage des fichiers sur un système de stockage de blocs (block storage) de manière distribuée. Ce n'était pas aisé.
Heureusement, les personnes de chez n8n.io ont résolu le problème en introduisant la notion de travailleur (worker) :
Comme l'indique cette illustration, vous avez une instance principale qui se charge de l'interface utilisateur, de la création de vos workflows et de l'écoute des webhooks entrants. Ensuite, elle envoie les ordres d'exécution des workflows aux instances worker via un système de bus de messages. Ici, c'est l'excellent Redis qui a été choisi pour remplir ce rôle. Notez qu'il est également possible d'avoir des instances webhooks qui seront à l'écoute des événements, mais cet article ne traite pas de cette fonctionnalité. Je prévois de rédiger un article sur cette fonctionnalité dans les mois à venir.
Dans la suite de cet article, je vous propose de déployer sur le PaaS de Clever Cloud, une instance principale et trois instances workers. Nous verrons que ce sont uniquement les workers qui s'occuperont d'exécuter nos workflows.
Prérequis
clever-tools
Assurez-vous d'avoir installé clever-tools
sur votre workstation : Doc
Génération d'une clé d'exécution
Nous allons devoir générer une clé qui sera utilisée par l'instance primaire de n8n ainsi que par les workers. Utilisez la commande suivante pour la générer et notez-la afin de l'utiliser au moment venu :
uuidgen
J'y ferai référence sous le terme <VOTRE_CLE_EXECUTION>
.
Instance primaire
Création du fichier package.json et du script run.sh
mkdir /var/tmp/n8n
cd /var/tmp/n8n
git init
Créez le fichier package.json
:
{
"name": "n8n",
"version": "0.221.1",
"engines": {
"node": "16.9"
},
"dependencies": {
"n8n": "0.221.1"
}
}
Créez le fichier run.sh
:
#!/bin/bash
set -x
./node_modules/.bin/n8n start
Ajoutez les deux fichiers au repository git :
chmod a+x run.sh
git add package.json run.sh
git commit -m "Init n8n launch"
Création de l'instance primaire
clever create cc-n8n --type node --org <YOUR_ORGA_ID> --region par
clever config update --enable-force-https
clever scale --alias cc-n8n --flavor XS
clever scale --alias cc-n8n --build-flavor S
clever addon create redis-addon cc-n8n-redis-queue --link cc-n8n --org <YOUR_ORGA_ID> --region par --plan s_mono --yes
clever addon create postgresql-addon cc-n8n-db --link cc-n8n --org <YOUR_ORGA_ID> --region par --plan xs_sml --yes
clever addon create fs-bucket n8n-fs-data --plan s --link cc-n8n --org <YOUR_ORGA_ID> --region par --yes
clever env set PORT 8080
clever env set N8N_VERSION 0.221.1
clever env set N8N_PORT `clever env | grep -w PORT| awk -F = '/PORT/ { print $2}'|sed s/\"//g`
clever env set N8N_PROTOCOL https
clever env set N8N_HOST `clever domain|awk '{print $1}'`
clever env set WEBHOOK_TUNNEL_URL "https://`clever domain|awk '{print $1}'`/"
clever env set VUE_APP_URL_BASE_APP "https://`clever domain|awk '{print $1}'`/"
clever env set N8N_ENCRYPTION_KEY <VOTRE_CLE_EXECUTION>
clever env set EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS true
clever env set EXECUTIONS_DATA_SAVE_ON_ERROR all
clever env set N8N_USER_FOLDER /app/n8n-data/
clever env set EXECUTIONS_MODE queue
clever env set QUEUE_HEALTH_CHECK_ACTIVE true
clever env set QUEUE_BULL_REDIS_HOST `clever env | awk -F = '/REDIS_HOST/ { print $2}'|sed s/\"//g`
clever env set QUEUE_BULL_REDIS_PORT `clever env | awk -F = '/REDIS_PORT/ { print $2}'|sed s/\"//g`
clever env set QUEUE_BULL_REDIS_PASSWORD `clever env | awk -F = '/REDIS_PASSWORD/ { print $2}'|sed s/\"//g`
clever env set DB_TYPE postgresdb
clever env set DB_POSTGRESDB_DATABASE `clever env | awk -F = '/POSTGRESQL_ADDON_DB/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_HOST `clever env | awk -F = '/POSTGRESQL_ADDON_HOST/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_PORT `clever env | awk -F = '/POSTGRESQL_ADDON_PORT/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_USER `clever env | awk -F = '/POSTGRESQL_ADDON_USER/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_PASSWORD `clever env | awk -F = '/POSTGRESQL_ADDON_PASSWORD/ { print $2}'|sed s/\"//g`
clever env set GENERIC_TIMEZONE "Europe/Paris"
clever env set CC_FS_BUCKET /n8n-data:`clever env | awk -F = '/BUCKET_HOST/ { print $2}'|sed s/\"//g`
clever env set CC_RUN_COMMAND "./run.sh"
Déploiement de l'application
Lancez la commande de déploiement :
clever deploy
Instances worker
Nous allons déployer 3 instances workers de n8n afin de distribuer la charge sur cet ensemble de workers.
Création du fichier package.json et du script run.sh
mkdir /var/tmp/n8n-worker
cd /var/tmp/n8n-worker
git init
Créez le fichier package.json
:
{
"name": "n8n-worker",
"version": "0.221.1",
"engines": {
"node": "16.9"
},
"dependencies": {
"n8n": "0.221.1"
}
}
Créez le fichier run.sh
:
#!/bin/bash
set -x
./node_modules/.bin/n8n worker
Ajoutez les deux fichiers au repository git :
chmod a+x run.sh
git add package.json run.sh
git commit -m "Init n8n worker launch"
Création de l'instance worker
clever create cc-n8n-worker --type node --org <YOUR_ORGA_ID> --region par
clever config update --enable-force-https
clever scale --alias cc-n8n-worker --flavor XS --min-instances 3 --max-instances 3
clever scale --alias cc-n8n-worker --build-flavor S
clever service link-addon cc-n8n-db
clever service link-addon cc-n8n-redis-queue
clever service link-addon n8n-fs-data
clever env set PORT 8080
clever env set N8N_VERSION 0.221.1
clever env set QUEUE_HEALTH_CHECK_PORT `clever env | grep -w PORT| awk -F = '/PORT/ { print $2}'|sed s/\"//g`
clever env set N8N_HOST `clever domain|awk '{print $1}'`
clever env set N8N_USER_FOLDER /app/n8n-data/
clever env set N8N_ENCRYPTION_KEY <VOTRE_CLE_EXECUTION>
clever env set EXECUTIONS_MODE queue
clever env set QUEUE_HEALTH_CHECK_ACTIVE true
clever env set QUEUE_BULL_REDIS_HOST `clever env | awk -F = '/REDIS_HOST/ { print $2}'|sed s/\"//g`
clever env set QUEUE_BULL_REDIS_PORT `clever env | awk -F = '/REDIS_PORT/ { print $2}'|sed s/\"//g`
clever env set QUEUE_BULL_REDIS_PASSWORD `clever env | awk -F = '/REDIS_PASSWORD/ { print $2}'|sed s/\"//g`
clever env set DB_TYPE postgresdb
clever env set DB_POSTGRESDB_DATABASE `clever env | awk -F = '/POSTGRESQL_ADDON_DB/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_HOST `clever env | awk -F = '/POSTGRESQL_ADDON_HOST/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_PORT `clever env | awk -F = '/POSTGRESQL_ADDON_PORT/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_USER `clever env | awk -F = '/POSTGRESQL_ADDON_USER/ { print $2}'|sed s/\"//g`
clever env set DB_POSTGRESDB_PASSWORD `clever env | awk -F = '/POSTGRESQL_ADDON_PASSWORD/ { print $2}'|sed s/\"//g`
clever env set GENERIC_TIMEZONE "Europe/Paris"
clever env set CC_FS_BUCKET /n8n-data:`clever env | awk -F = '/BUCKET_HOST/ { print $2}'|sed s/\"//g`
clever env set CC_RUN_COMMAND "./run.sh"
Déploiement de l'application
Lancez la commande de déploiement :
clever deploy
Jouons un peu
Voici une courte vidéo pour illustrer la répartition d'une tâche sur l'ensemble des workers.
Références
TITRE | URL |
Article de Loic Tosser: N8N on Clever Cloud | https://blog.kalvad.com/n8n-on-clever-cloud |
Repo Git: n8n-example | https://github.com/CleverCloud/n8n-example |
n8n Documentation: Queue mode | https://docs.n8n.io/hosting/scaling/queue-mode/ |