Système automatisé de restauration de workflows et d'identifiants pour les auto-hébergés
Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 17 nœuds.Utilise principalement des nœuds comme If, Code, EmailSend, StopAndError, ManualTrigger. Système automatisé de récupération de mots de passe et d'informations d'identification pour les environnements auto-hébergés
- •Aucun prérequis spécial, prêt à l'emploi après importation
Nœuds utilisés (17)
Catégorie
{
"meta": {
"instanceId": "",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "Note-adh-sive-1-0",
"name": "Note adhésive 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-704
],
"parameters": {
"color": 3,
"width": 1152,
"height": 256,
"content": "## 1. Restore Credentials from Disk"
},
"typeVersion": 1
},
{
"id": "D-marrer-la-restauration-1",
"name": "Démarrer la restauration",
"type": "n8n-nodes-base.manualTrigger",
"notes": "CRED 1 WF 0",
"position": [
-368,
-320
],
"parameters": {},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "Note-adh-sive-2-2",
"name": "Note adhésive 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-432,
-1120
],
"parameters": {
"color": 4,
"width": 912,
"height": 976,
"content": "## Start here\n### ⚠ Warnings ⚠\n• In case of full restore, restore Credentials first!\n• Any already existing credential or workflow will be overwritten…\n\n### Instructions\n• Optionnally re-create your SMTP credential.\n• Manually copy this workflow to your new n8n instance.\n• Launch it and restore everything!\n\nCan be used to move your workflows to another instance 👍🏻\n\n### Configure the \"Start Restore\" JSON according to your need\n```\n[\n {\n \"credentials\": true,\n \"worflows\": false\n }\n]\n```\n(and modify the \"notes\" too!).\n\n### Configure the \"Init\" node\n```\nconst BACKUP_FOLDER = $env.N8N_BACKUP_FOLDER || '/files/n8n-backups';\nconst workflows_temp_folder = '_restore_temp';\nconst credentials = \"n8n-credentials\";\n```"
},
"typeVersion": 1
},
{
"id": "Note-adh-sive-3-3",
"name": "Note adhésive 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-112
],
"parameters": {
"color": 7,
"width": 384,
"height": 224,
"content": ""
},
"typeVersion": 1
},
{
"id": "Note-adh-sive-4",
"name": "Note adhésive",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-416
],
"parameters": {
"color": 5,
"width": 1152,
"height": 272,
"content": "## 2. Restore Workflows from Disk"
},
"typeVersion": 1
},
{
"id": "Email-SUCC-S-5",
"name": "Email SUCCÈS",
"type": "n8n-nodes-base.emailSend",
"disabled": true,
"position": [
1008,
-608
],
"webhookId": "58bbbcb4-a98a-4432-a617-7df665a42e61",
"parameters": {
"text": "=Credential restore from Disk has been successfully executed 🥳\n\nexitCode: {{ $json.exitCode }}\nstderr: {{ $json.stderr || \"no error\"}}\n\nSteps:\n\n1. Find Last Backup: {{ $('Find Last Backup').item.json.credentialsFullBackupPath }}\n\n2. Restore credentials:\n{{ $json.stdout }}",
"options": {},
"subject": "=n8n SUCCESS: {{ $workflow.name }}",
"toEmail": "={{ $env.N8N_ADMIN_EMAIL }}",
"fromEmail": "admin <admin@example.com>",
"emailFormat": "text"
},
"typeVersion": 2.1
},
{
"id": "Lister-les-dossiers-de-sauvegarde-6",
"name": "Lister les dossiers de sauvegarde",
"type": "n8n-nodes-base.executeCommand",
"position": [
80,
-320
],
"parameters": {
"command": "=ls -1 {{ $json.customConfig.backupFolder }}"
},
"typeVersion": 1
},
{
"id": "Restaurer-les-identifiants-7",
"name": "Restaurer les identifiants",
"type": "n8n-nodes-base.executeCommand",
"position": [
784,
-608
],
"parameters": {
"command": "=n8n import:credentials --separate --input={{ $('Find Last Backup').item.json.credentialsFullBackupPath }}"
},
"typeVersion": 1
},
{
"id": "Email-SUCC-S-Workflows-8",
"name": "Email SUCCÈS Workflows",
"type": "n8n-nodes-base.emailSend",
"disabled": true,
"position": [
1456,
-320
],
"webhookId": "",
"parameters": {
"text": "=Workflows' restore from Disk has been successfully executed 🥳\n\nexitCode: {{ $json.exitCode }}\nstderr: {{ $json.stderr || \"no error\"}}\n\nSteps:\n\n1. Find Last Backup: {{ $('Find Last Backup').item.json.workflowsFullBackupPath }}\n\n2. Exclude current workflow:\n{{ $('Exclude Current Workflow From Selection').item.json.stdout }}\n\n3. Restore workflows:\n{{ $('Restore Workflows').item.json.stdout }}\n\n4. Delete temporary folder:\n{{ $json.stdout }}",
"options": {
"appendAttribution": false
},
"subject": "=n8n SUCCESS: {{ $workflow.name }}",
"toEmail": "={{ $env.N8N_ADMIN_EMAIL }}",
"fromEmail": "admin <admin@example.com>",
"emailFormat": "text"
},
"typeVersion": 2.1
},
{
"id": "Exclure-le-workflow-actuel-de-la-s-lection-9",
"name": "Exclure le workflow actuel de la sélection",
"type": "n8n-nodes-base.executeCommand",
"notes": "Copy to TEMP",
"position": [
784,
-320
],
"parameters": {
"command": "=#!/bin/bash\n\n# Exclude current workflow from server restoration\n# This script creates a temporary copy of all workflows EXCEPT the current one\n\n# Get workflow info\nWORKFLOW_NAME=\"{{ $workflow.name }}\"\nBACKUP_FOLDER=\"{{ $('Find Last Backup').first().json.backupFolder }}\"\nPROJECT_ROOT_PATH=\"{{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}\"\nBACKUP_DATE=\"{{ $('Find Last Backup').first().json.latestBackupDate }}\"\nWORKFLOWS_TEMP_FOLDER=\"{{ $('Init').first().json.customConfig.workflows_temp_folder }}\"\n\n# Source is the backup folder with date\nSOURCE_FOLDER=\"${BACKUP_FOLDER}/${BACKUP_DATE}\"\n\n# Destination is inside the project root path with backup date\nTEMP_RESTORE_FOLDER=\"${PROJECT_ROOT_PATH}/${BACKUP_DATE}_restore_temp\"\n\n# Clean the workflow name (same logic as Clean Filename node)\nCLEANED_NAME=$(echo \"$WORKFLOW_NAME\" | sed 's/[<>:\"/\\\\|?*[:cntrl:]]/_/g' | sed 's/[[:space:].]\\+/_/g' | sed 's/_\\+/_/g' | sed 's/^_\\+//;s/_\\+$//')\n\necho \"🔍 Current workflow: $WORKFLOW_NAME\"\necho \"🧹 Cleaned name: $CLEANED_NAME\"\necho \"💾 Backup folder: $BACKUP_FOLDER\"\necho \"📅 Backup date: $BACKUP_DATE\"\necho \"📂 Source folder: $SOURCE_FOLDER\"\necho \"📂 Project root: $PROJECT_ROOT_PATH\"\necho \"📂 Temp restore folder: $TEMP_RESTORE_FOLDER\"\n\n# Create temporary restore folder\nmkdir -p \"$TEMP_RESTORE_FOLDER\"\necho \"✅ Created temporary restore folder\"\n\n# Count total workflows in source\nTOTAL_COUNT=$(ls -1 \"$SOURCE_FOLDER\"/*.json 2>/dev/null | wc -l)\necho \"📊 Total workflows in source: $TOTAL_COUNT\"\n\n# Copy all workflows EXCEPT the current one\nCOPIED_COUNT=0\nSKIPPED_CURRENT=false\n\nfor file in \"$SOURCE_FOLDER\"/*.json; do\n if [ -f \"$file\" ]; then\n filename=$(basename \"$file\")\n \n # Check if this is the current workflow\n if [ \"$filename\" = \"${CLEANED_NAME}.json\" ]; then\n echo \"⏭️ Skipping current workflow: $filename\"\n SKIPPED_CURRENT=true\n else\n cp \"$file\" \"$TEMP_RESTORE_FOLDER/\"\n COPIED_COUNT=$((COPIED_COUNT + 1))\n fi\n fi\ndone\n\n# Display summary\necho \"\"\necho \"📊 COPY SUMMARY:\"\necho \" Total workflows: $TOTAL_COUNT\"\necho \" Copied: $COPIED_COUNT\"\necho \" Skipped (current): $([ \"$SKIPPED_CURRENT\" = true ] && echo \"1\" || echo \"0\")\"\necho \"\"\n\nif [ \"$COPIED_COUNT\" -eq 0 ]; then\n echo \"⚠️ No workflows to restore (only current workflow found)\"\n # Clean up empty temp folder\n rmdir \"$TEMP_RESTORE_FOLDER\"\n exit 0\nfi\n\necho \"✅ Ready for import from: $TEMP_RESTORE_FOLDER\"\necho \"💡 Use this folder path in the next Import Workflows node\""
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "Restaurer-les-workflows-10",
"name": "Restaurer les workflows",
"type": "n8n-nodes-base.executeCommand",
"position": [
1008,
-320
],
"parameters": {
"command": "=n8n import:workflow --separate --input={{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}/{{ $('Find Last Backup').first().json.latestBackupDate }}{{ $('Init').first().json.customConfig.workflows_temp_folder }}"
},
"typeVersion": 1
},
{
"id": "Init-11",
"name": "Init",
"type": "n8n-nodes-base.code",
"position": [
-144,
-320
],
"parameters": {
"jsCode": "// ==========================================\n// 📅 LOCAL DATE/TIME INITIALIZATION\n// ==========================================\n\nconst now = new Date();\n\n// ==========================================\n// 🌍 USER-DEFINED TIMEZONE CONFIGURATION\n// ==========================================\n// ⚠️ IMPORTANT: This code runs on the n8n SERVER, not in your browser!\n// ⚠️ Configure the timezone where you want executions to be scheduled,\n// regardless of where your n8n server is physically located.\n//\n// 📍 Common timezone examples:\n// - 'Europe/Paris' → Central European Time (CET/CEST)\n// - 'America/New_York' → Eastern Time (EST/EDT)\n// - 'America/Chicago' → Central Time (CST/CDT)\n// - 'America/Los_Angeles'→ Pacific Time (PST/PDT)\n// - 'Asia/Tokyo' → Japan Standard Time (JST)\n// - 'Asia/Shanghai' → China Standard Time (CST)\n// - 'Australia/Sydney' → Australian Eastern Time (AET)\n// - 'UTC' → Coordinated Universal Time\n//\n// 🔧 TO CONFIGURE FOR YOUR USE CASE:\n// 1. Uncomment and edit the lines below with your desired timezone\n// 2. Comment out the automatic detection line\n//\n// To use user-defined timezone instead, UNCOMMENT these lines:\n// const USER_TIMEZONE = 'Europe/Paris'; // 👈 EDIT THIS for your location\n// const LOCAL_TIMEZONE = USER_TIMEZONE; // 👈 EDIT THIS for your location\n//\n// 🕘 Automatic detection (uses server timezone or environment variable):\nconst LOCAL_TIMEZONE = $env.GENERIC_TIMEZONE || 'Europe/Paris'; // 🟢 Default fallback\n// To use user-defined timezone instead, comment out the above line\n\n// Local datetime in YYYY-MM-DD_HH-MM-SS format\nconst localDateTime = now.toLocaleString('sv-SE', { \n timeZone: LOCAL_TIMEZONE,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n}).replace(' ', '_').replace(/:/g, '-');\n\n// Local formatted time for display\nconst localDateTimeFormatted = now.toLocaleString('sv-SE', { \n timeZone: LOCAL_TIMEZONE,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n});\n\n// Local time HH:MM:SS format\nconst localTimeFormatted = now.toLocaleString('sv-SE', { \n timeZone: LOCAL_TIMEZONE,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n});\n\n// Local date in YYYY-MM-DD format\nconst localDate = now.toLocaleDateString('sv-SE', { timeZone: LOCAL_TIMEZONE });\n\n// Local time in French format\nconst localTimeFR = now.toLocaleString('sv-SE', { \n timeZone: LOCAL_TIMEZONE,\n hour: '2-digit',\n minute: '2-digit'\n}).replace(/:/g, 'h').replace(/^0(\\d)h/, '$1h');\n\nconsole.log('🚀 USER-DEFINE TIMEZONE VARIABLES INITIALISED (Local timezone):');\nconsole.log(` 🌍 Timezone: ${LOCAL_TIMEZONE}`);\nconsole.log(` ✨ Now (UTC): ${now}`);\nconsole.log(` 📅 Local date/time: ${localDateTime}`);\nconsole.log(` 🕐 Local time: ${localDateTimeFormatted}`);\nconsole.log(` 🕐 Local time: ${localTimeFormatted}`);\nconsole.log(` 📅 Local date: ${localDate}`);\nconsole.log(` 📅 Local time (FR): ${localTimeFR}`);\n\n// Create structure for time data output\nconst timeData = {\n localTimeZone:LOCAL_TIMEZONE,\n nowDateUTC: now,\n nowUTCstring: now.toISOString(), // UTC for calculations\n localDateTime: localDateTime, // YYY-MM-DD_HH-MM-SS format\n localDateTimeFormatted: localDateTimeFormatted, // Human readable\n localTimeFormatted: localTimeFormatted, // Human readable\n localDate: localDate, // YYYY-MM-DD format\n localTime: localTimeFR // HHhMM format (FR)\n}\n\n// ==========================================\n// 📝 WORKFLOW STANDARD CONFIGURATION\n// ==========================================\n\nconst N8N_ADMIN_EMAIL = $env.N8N_ADMIN_EMAIL || 'youremail@example.com';\nconst WORKFLOW_NAME = $workflow.name;\nconst N8N_PROJECTS_DIR = $env.N8N_PROJECTS_DIR || '/files/n8n-projects-data'; // ⚠️ Your projects' ROOT folder here\n// projects-root-folder/\n// └── Your-project-folder-name/\n// ├── logs/\n// ├── reports/\n// ├── ...\n// └── [other project files]\nconst PROJECT_FOLDER_NAME = \"Workflow-backups\"; // ⚠️ Your project folder\nconst PROJECT_ROOT_PATH = `${N8N_PROJECTS_DIR}/${PROJECT_FOLDER_NAME}`;\n\nconst LOGS_PATH = `${PROJECT_ROOT_PATH}/logs`;\nconst logFileName = `${localDateTime}-backup_logs.json`; // ⚠️ Your log file name\nconst logPathFileName = `${LOGS_PATH}/${logFileName}`;\n\n// Configuration for report generation\nconst REPORTS_PATH = `${PROJECT_ROOT_PATH}/reports`;\nconst reportFileName = `${localDateTime}-report.txt`;\nconst reportPathFileName = `${REPORTS_PATH}/${reportFileName}`;\n\n// Console output\nconsole.log('🧾 STANDARD WORKFLOW VARIABLES INITIALISED:');\nconsole.log(` 📁 Admin email: ${N8N_ADMIN_EMAIL}`);\nconsole.log(` 📁 Workflow name: ${WORKFLOW_NAME}`);\nconsole.log(` 📁 Projects folder: ${N8N_PROJECTS_DIR}`);\nconsole.log(` 📁 Project folder name: ${PROJECT_FOLDER_NAME}`);\nconsole.log(` 📁 Project root path: ${PROJECT_ROOT_PATH}`);\nconsole.log(` 📁 Log path: ${LOGS_PATH}`);\nconsole.log(` 📁 Log file name: ${logFileName}`);\nconsole.log(` 📁 Log file path: ${logPathFileName}`);\nconsole.log(` 📁 Reports path: ${REPORTS_PATH}`);\nconsole.log(` 📁 Report file name: ${reportFileName}`);\nconsole.log(` 📁 Report file path: ${reportPathFileName}`);\n\n// Create structure for workflow configuration output\nconst workflowConfig = {\n workflowStep: 'init',\n N8N_ADMIN_EMAIL,\n WORKFLOW_NAME,\n N8N_PROJECTS_DIR,\n PROJECT_FOLDER_NAME,\n PROJECT_ROOT_PATH,\n LOGS_PATH,\n logFileName,\n logPathFileName,\n REPORTS_PATH,\n reportFileName,\n reportPathFileName\n}\n\n// ==========================================\n// 📝 WORKFLOW CUSTOM CONFIGURATION\n// ==========================================\n// ⚠️ INSERT HERE: your workflow custom configuration variables\n\n// Base backup path using your Docker volume configuration (folder must exist)\nconst BACKUP_FOLDER = $env.N8N_BACKUP_FOLDER || '/files/n8n-backups'; // ⚠️ Change the default value for your n8n backup folder\nconst workflows_temp_folder = '_restore_temp';\n\nconst credentials = \"n8n-credentials\";\n\n// Console output\nconsole.log('🧾 CUSTOM WORKFLOW VARIABLES INITIALISED:');\nconsole.log(` 💾 Backup folder: ${BACKUP_FOLDER}`);\nconsole.log(' File prefix:', localDate);\nconsole.log(' Timestamp (UTC):', now);\n\nconst customConfig = {\n backupFolder: BACKUP_FOLDER,\n workflows_temp_folder,\n credentials\n}\n\n// ==========================================\n// 📊 OUTPUT DATA\n// ==========================================\n\nconst initData = {\n timeData,\n workflowConfig,\n customConfig\n};\n\nreturn [{ json: initData }];"
},
"typeVersion": 2
},
{
"id": "Restaurer-les-identifiants--12",
"name": "Restaurer les identifiants ?",
"type": "n8n-nodes-base.if",
"position": [
560,
-608
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $('Start Restore').item.json.credentials }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "Restaurer-les-workflows--13",
"name": "Restaurer les workflows ?",
"type": "n8n-nodes-base.if",
"position": [
560,
-320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $('Start Restore').item.json.workflows }}",
"rightValue": ""
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "Supprimer-le-dossier-TEMP-14",
"name": "Supprimer le dossier TEMP",
"type": "n8n-nodes-base.executeCommand",
"position": [
1232,
-320
],
"parameters": {
"command": "=# Clean up temporary restore folder\nTEMP_FOLDER=\"{{ $('Init').first().json.workflowConfig.PROJECT_ROOT_PATH }}/{{ $('Find Last Backup').first().json.latestBackupDate }}{{ $('Init').first().json.customConfig.workflows_temp_folder }}\"\n\nif [ -d \"$TEMP_FOLDER\" ]; then\n rm -rf \"$TEMP_FOLDER\"\n echo \"✅ Cleaned up temporary restore folder: $TEMP_FOLDER\"\nelse\n echo \"ℹ️ Temporary folder already removed or not found\"\nfi"
},
"typeVersion": 1
},
{
"id": "ERREUR-Trouver-le-dossier-de-sauvegarde-le-plus-r-cent-15",
"name": "ERREUR : Trouver le dossier de sauvegarde le plus récent",
"type": "n8n-nodes-base.stopAndError",
"position": [
560,
-64
],
"parameters": {
"errorMessage": "={{ $json.error }}"
},
"typeVersion": 1
},
{
"id": "Trouver-la-derni-re-sauvegarde-16",
"name": "Trouver la dernière sauvegarde",
"type": "n8n-nodes-base.code",
"onError": "continueErrorOutput",
"position": [
304,
-320
],
"parameters": {
"jsCode": "// ==========================================\n// 🔍 FIND LATEST BACKUP FOLDER\n// ==========================================\n\n// Extract init data from previous node\nconst initData = $('Init').first().json;\nconst { timeData, workflowConfig, customConfig } = initData;\n\n// Configuration\nconst BACKUP_FOLDER = customConfig.backupFolder;\nconst credentials = customConfig.credentials;\n\nconsole.log(`🔍 Searching for latest backup in: ${BACKUP_FOLDER}`);\nconsole.log(`📁 Target credentials folder: ${credentials}`);\n\ntry {\n // Use Execute Command node before this one with: ls -1 /files/n8n-backups\n \n // If you have the directory list from previous node:\n const inputData = $input.first().json;\n \n // Assuming previous Execute Command node returns directory names\n let directories;\n \n if (inputData.stdout) {\n // Parse stdout from Execute Command node\n directories = inputData.stdout\n .split('\\n')\n .filter(line => line.trim());\n } else {\n throw new Error('No directory listing found in input. Please use Execute Command node before this one.');\n }\n \n console.log(`📂 Found directories: ${directories.join(', ')}`);\n \n if (directories.length === 0) {\n throw new Error('No date-formatted directories found in backup folder');\n }\n \n // Sort directories by date (newest first)\n const sortedDirectories = directories.sort((a, b) => {\n // Convert YYYY-MM-DD to comparable format\n const dateA = new Date(a.trim());\n const dateB = new Date(b.trim());\n return dateB - dateA; // Descending order (newest first)\n });\n \n console.log(`📅 Sorted directories (newest first): ${sortedDirectories.join(', ')}`);\n \n // Get the most recent directory\n const latestBackupDate = sortedDirectories[0];\n const credentialsFullBackupPath = `${BACKUP_FOLDER}/${latestBackupDate}/${credentials}`;\n const workflowsFullBackupPath = `${BACKUP_FOLDER}/${latestBackupDate}/`;\n \n console.log(`✅ Latest backup date: ${latestBackupDate}`);\n console.log(`✅ Credentials' Full backup path: ${credentialsFullBackupPath}`);\n console.log(`✅ Workflows' Full backup path: ${workflowsFullBackupPath}`);\n \n // Return result\n const result = {\n backupFolder: BACKUP_FOLDER,\n credentialsFolder: credentials,\n latestBackupDate,\n credentialsFullBackupPath,\n workflowsFullBackupPath\n };\n \n return [{ json: result }];\n \n} catch (error) {\n \n console.error(`❌ Error finding latest backup: ${error.message}`);\n throw new Error(`❌ Error finding latest backup: ${error.message}`);\n \n}"
},
"typeVersion": 2
}
],
"pinData": {
"Start Restore": [
{
"worflows": false,
"credentials": true
}
]
},
"connections": {
"Init-11": {
"main": [
[
{
"node": "Lister-les-dossiers-de-sauvegarde-6",
"type": "main",
"index": 0
}
]
]
},
"D-marrer-la-restauration-1": {
"main": [
[
{
"node": "Init-11",
"type": "main",
"index": 0
}
]
]
},
"Trouver-la-derni-re-sauvegarde-16": {
"main": [
[
{
"node": "Restaurer-les-identifiants--12",
"type": "main",
"index": 0
},
{
"node": "Restaurer-les-workflows--13",
"type": "main",
"index": 0
}
],
[
{
"node": "ERREUR-Trouver-le-dossier-de-sauvegarde-le-plus-r-cent-15",
"type": "main",
"index": 0
}
]
]
},
"Lister-les-dossiers-de-sauvegarde-6": {
"main": [
[
{
"node": "Trouver-la-derni-re-sauvegarde-16",
"type": "main",
"index": 0
}
]
]
},
"Restaurer-les-workflows-10": {
"main": [
[
{
"node": "Supprimer-le-dossier-TEMP-14",
"type": "main",
"index": 0
}
]
]
},
"Supprimer-le-dossier-TEMP-14": {
"main": [
[
{
"node": "Email-SUCC-S-Workflows-8",
"type": "main",
"index": 0
}
]
]
},
"Restaurer-les-workflows--13": {
"main": [
[
{
"node": "Exclure-le-workflow-actuel-de-la-s-lection-9",
"type": "main",
"index": 0
}
]
]
},
"Restaurer-les-identifiants-7": {
"main": [
[
{
"node": "Email-SUCC-S-5",
"type": "main",
"index": 0
}
]
]
},
"Restaurer-les-identifiants--12": {
"main": [
[
{
"node": "Restaurer-les-identifiants-7",
"type": "main",
"index": 0
}
]
]
},
"Exclure-le-workflow-actuel-de-la-s-lection-9": {
"main": [
[
{
"node": "Restaurer-les-workflows-10",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Création de contenu, IA Multimodale
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Florent
@florentIT Business Analyst for 8+ years, I am finding joy in developping again, with the help of n8n and AIs 🤗
Partager ce workflow