Automatisiertes Workflow-System mit Anmeldeinformationen für selbstgehostete Umgebungen
Dies ist ein Content Creation, Multimodal AI-Bereich Automatisierungsworkflow mit 17 Nodes. Hauptsächlich werden If, Code, EmailSend, StopAndError, ManualTrigger und andere Nodes verwendet. Automatisierte Arbeitsabläufe und Anmeldeinformationen-Wiederherstellungssystem in selbst gehosteten Umgebungen
- •Keine besonderen Voraussetzungen, sofort nach Import nutzbar
Verwendete Nodes (17)
Kategorie
{
"meta": {
"instanceId": "",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "Notizzettel1-0",
"name": "Notizzettel1",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-704
],
"parameters": {
"color": 3,
"width": 1152,
"height": 256,
"content": "## 1. Restore Credentials from Disk"
},
"typeVersion": 1
},
{
"id": "Start-Restore-1",
"name": "Start Restore",
"type": "n8n-nodes-base.manualTrigger",
"notes": "CRED 1 WF 0",
"position": [
-368,
-320
],
"parameters": {},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "Notizzettel2-2",
"name": "Notizzettel2",
"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": "Notizzettel3-3",
"name": "Notizzettel3",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-112
],
"parameters": {
"color": 7,
"width": 384,
"height": 224,
"content": ""
},
"typeVersion": 1
},
{
"id": "Notizzettel-4",
"name": "Notizzettel",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-416
],
"parameters": {
"color": 5,
"width": 1152,
"height": 272,
"content": "## 2. Restore Workflows from Disk"
},
"typeVersion": 1
},
{
"id": "SUCCESS-email-5",
"name": "SUCCESS email",
"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": "List-Bkp-Folders-6",
"name": "List Bkp Folders",
"type": "n8n-nodes-base.executeCommand",
"position": [
80,
-320
],
"parameters": {
"command": "=ls -1 {{ $json.customConfig.backupFolder }}"
},
"typeVersion": 1
},
{
"id": "Restore-Credentials-7",
"name": "Restore Credentials",
"type": "n8n-nodes-base.executeCommand",
"position": [
784,
-608
],
"parameters": {
"command": "=n8n import:credentials --separate --input={{ $('Find Last Backup').item.json.credentialsFullBackupPath }}"
},
"typeVersion": 1
},
{
"id": "SUCCESS-email-Workflows-8",
"name": "SUCCESS email 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": "Exclude-Current-Workflow-From-Selection-9",
"name": "Exclude Current Workflow From Selection",
"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": "Restore-Workflows-10",
"name": "Restore 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": "Restore-Credentials--12",
"name": "Restore Credentials?",
"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": "Restore-Workflows--13",
"name": "Restore 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": "Delete-TEMP-Folder-14",
"name": "Delete TEMP Folder",
"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": "ERROR-Find-Most-Recent-Bkp-Folder-15",
"name": "ERROR: Find Most Recent Bkp Folder",
"type": "n8n-nodes-base.stopAndError",
"position": [
560,
-64
],
"parameters": {
"errorMessage": "={{ $json.error }}"
},
"typeVersion": 1
},
{
"id": "Find-Last-Backup-16",
"name": "Find Last Backup",
"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": "List-Bkp-Folders-6",
"type": "main",
"index": 0
}
]
]
},
"Start-Restore-1": {
"main": [
[
{
"node": "Init-11",
"type": "main",
"index": 0
}
]
]
},
"Find-Last-Backup-16": {
"main": [
[
{
"node": "Restore-Credentials--12",
"type": "main",
"index": 0
},
{
"node": "Restore-Workflows--13",
"type": "main",
"index": 0
}
],
[
{
"node": "ERROR-Find-Most-Recent-Bkp-Folder-15",
"type": "main",
"index": 0
}
]
]
},
"List-Bkp-Folders-6": {
"main": [
[
{
"node": "Find-Last-Backup-16",
"type": "main",
"index": 0
}
]
]
},
"Restore-Workflows-10": {
"main": [
[
{
"node": "Delete-TEMP-Folder-14",
"type": "main",
"index": 0
}
]
]
},
"Delete-TEMP-Folder-14": {
"main": [
[
{
"node": "SUCCESS-email-Workflows-8",
"type": "main",
"index": 0
}
]
]
},
"Restore-Workflows--13": {
"main": [
[
{
"node": "Exclude-Current-Workflow-From-Selection-9",
"type": "main",
"index": 0
}
]
]
},
"Restore-Credentials-7": {
"main": [
[
{
"node": "SUCCESS-email-5",
"type": "main",
"index": 0
}
]
]
},
"Restore-Credentials--12": {
"main": [
[
{
"node": "Restore-Credentials-7",
"type": "main",
"index": 0
}
]
]
},
"Exclude-Current-Workflow-From-Selection-9": {
"main": [
[
{
"node": "Restore-Workflows-10",
"type": "main",
"index": 0
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Experte - Content-Erstellung, Multimodales KI
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Florent
@florentIT Business Analyst for 8+ years, I am finding joy in developping again, with the help of n8n and AIs 🤗
Diesen Workflow teilen