This workflow corresponds to n8n.io template #9154 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-704
],
"parameters": {
"color": 3,
"width": 1152,
"height": 256,
"content": "## 1. Restore Credentials from Disk"
},
"typeVersion": 1
},
{
"id": "",
"name": "Start Restore",
"type": "n8n-nodes-base.manualTrigger",
"notes": "CRED 1 WF 0",
"position": [
-368,
-320
],
"parameters": {},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-432,
-1120
],
"parameters": {
"color": 4,
"width": 912,
"height": 976,
"content": "## Start here\n### \u26a0 Warnings \u26a0\n\u2022 In case of full restore, restore Credentials first!\n\u2022 Any already existing credential or workflow will be overwritten\u2026\n\n### Instructions\n\u2022 Optionnally re-create your SMTP credential.\n\u2022 Manually copy this workflow to your new n8n instance.\n\u2022 Launch it and restore everything!\n\nCan be used to move your workflows to another instance \ud83d\udc4d\ud83c\udffb\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": "",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-112
],
"parameters": {
"color": 7,
"width": 384,
"height": 224,
"content": ""
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-416
],
"parameters": {
"color": 5,
"width": 1152,
"height": 272,
"content": "## 2. Restore Workflows from Disk"
},
"typeVersion": 1
},
{
"id": "",
"name": "SUCCESS email",
"type": "n8n-nodes-base.emailSend",
"disabled": true,
"position": [
1008,
-608
],
"parameters": {
"text": "=Credential restore from Disk has been successfully executed \ud83e\udd73\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": "",
"name": "List Bkp Folders",
"type": "n8n-nodes-base.executeCommand",
"position": [
80,
-320
],
"parameters": {
"command": "=ls -1 {{ $json.customConfig.backupFolder }}"
},
"typeVersion": 1
},
{
"id": "",
"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": "",
"name": "SUCCESS email Workflows",
"type": "n8n-nodes-base.emailSend",
"disabled": true,
"position": [
1456,
-320
],
"parameters": {
"text": "=Workflows' restore from Disk has been successfully executed \ud83e\udd73\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": "",
"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 \"\ud83d\udd0d Current workflow: $WORKFLOW_NAME\"\necho \"\ud83e\uddf9 Cleaned name: $CLEANED_NAME\"\necho \"\ud83d\udcbe Backup folder: $BACKUP_FOLDER\"\necho \"\ud83d\udcc5 Backup date: $BACKUP_DATE\"\necho \"\ud83d\udcc2 Source folder: $SOURCE_FOLDER\"\necho \"\ud83d\udcc2 Project root: $PROJECT_ROOT_PATH\"\necho \"\ud83d\udcc2 Temp restore folder: $TEMP_RESTORE_FOLDER\"\n\n# Create temporary restore folder\nmkdir -p \"$TEMP_RESTORE_FOLDER\"\necho \"\u2705 Created temporary restore folder\"\n\n# Count total workflows in source\nTOTAL_COUNT=$(ls -1 \"$SOURCE_FOLDER\"/*.json 2>/dev/null | wc -l)\necho \"\ud83d\udcca 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 \"\u23ed\ufe0f 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 \"\ud83d\udcca 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 \"\u26a0\ufe0f 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 \"\u2705 Ready for import from: $TEMP_RESTORE_FOLDER\"\necho \"\ud83d\udca1 Use this folder path in the next Import Workflows node\""
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "",
"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": "",
"name": "Init",
"type": "n8n-nodes-base.code",
"position": [
-144,
-320
],
"parameters": {
"jsCode": "// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83d\udcc5 LOCAL DATE/TIME INITIALIZATION\n// YOUR_AWS_SECRET_KEY_HERE==\n\nconst now = new Date();\n\n// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83c\udf0d USER-DEFINED TIMEZONE CONFIGURATION\n// YOUR_AWS_SECRET_KEY_HERE==\n// \u26a0\ufe0f IMPORTANT: This code runs on the n8n SERVER, not in your browser!\n// \u26a0\ufe0f Configure the timezone where you want executions to be scheduled,\n// regardless of where your n8n server is physically located.\n//\n// \ud83d\udccd Common timezone examples:\n// - 'Europe/Paris' \u2192 Central European Time (CET/CEST)\n// - 'America/New_York' \u2192 Eastern Time (EST/EDT)\n// - 'America/Chicago' \u2192 Central Time (CST/CDT)\n// - 'America/Los_Angeles'\u2192 Pacific Time (PST/PDT)\n// - 'Asia/Tokyo' \u2192 Japan Standard Time (JST)\n// - 'Asia/Shanghai' \u2192 China Standard Time (CST)\n// - 'Australia/Sydney' \u2192 Australian Eastern Time (AET)\n// - 'UTC' \u2192 Coordinated Universal Time\n//\n// \ud83d\udd27 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'; // \ud83d\udc48 EDIT THIS for your location\n// const LOCAL_TIMEZONE = USER_TIMEZONE; // \ud83d\udc48 EDIT THIS for your location\n//\n// \ud83d\udd58 Automatic detection (uses server timezone or environment variable):\nconst LOCAL_TIMEZONE = $env.GENERIC_TIMEZONE || 'Europe/Paris'; // \ud83d\udfe2 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('\ud83d\ude80 USER-DEFINE TIMEZONE VARIABLES INITIALISED (Local timezone):');\nconsole.log(` \ud83c\udf0d Timezone: ${LOCAL_TIMEZONE}`);\nconsole.log(` \u2728 Now (UTC): ${now}`);\nconsole.log(` \ud83d\udcc5 Local date/time: ${localDateTime}`);\nconsole.log(` \ud83d\udd50 Local time: ${localDateTimeFormatted}`);\nconsole.log(` \ud83d\udd50 Local time: ${localTimeFormatted}`);\nconsole.log(` \ud83d\udcc5 Local date: ${localDate}`);\nconsole.log(` \ud83d\udcc5 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// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83d\udcdd WORKFLOW STANDARD CONFIGURATION\n// YOUR_AWS_SECRET_KEY_HERE==\n\nconst N8N_ADMIN_EMAIL = $env.N8N_ADMIN_EMAIL || 'user@example.com';\nconst WORKFLOW_NAME = $workflow.name;\nconst N8N_PROJECTS_DIR = $env.N8N_PROJECTS_DIR || '/files/n8n-projects-data'; // \u26a0\ufe0f Your projects' ROOT folder here\n// projects-root-folder/\n// \u2514\u2500\u2500 Your-project-folder-name/\n// \u251c\u2500\u2500 logs/\n// \u251c\u2500\u2500 reports/\n// \u251c\u2500\u2500 ...\n// \u2514\u2500\u2500 [other project files]\nconst PROJECT_FOLDER_NAME = \"Workflow-backups\"; // \u26a0\ufe0f 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`; // \u26a0\ufe0f 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('\ud83e\uddfe STANDARD WORKFLOW VARIABLES INITIALISED:');\nconsole.log(` \ud83d\udcc1 Admin email: ${N8N_ADMIN_EMAIL}`);\nconsole.log(` \ud83d\udcc1 Workflow name: ${WORKFLOW_NAME}`);\nconsole.log(` \ud83d\udcc1 Projects folder: ${N8N_PROJECTS_DIR}`);\nconsole.log(` \ud83d\udcc1 Project folder name: ${PROJECT_FOLDER_NAME}`);\nconsole.log(` \ud83d\udcc1 Project root path: ${PROJECT_ROOT_PATH}`);\nconsole.log(` \ud83d\udcc1 Log path: ${LOGS_PATH}`);\nconsole.log(` \ud83d\udcc1 Log file name: ${logFileName}`);\nconsole.log(` \ud83d\udcc1 Log file path: ${logPathFileName}`);\nconsole.log(` \ud83d\udcc1 Reports path: ${REPORTS_PATH}`);\nconsole.log(` \ud83d\udcc1 Report file name: ${reportFileName}`);\nconsole.log(` \ud83d\udcc1 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// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83d\udcdd WORKFLOW CUSTOM CONFIGURATION\n// YOUR_AWS_SECRET_KEY_HERE==\n// \u26a0\ufe0f 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'; // \u26a0\ufe0f 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('\ud83e\uddfe CUSTOM WORKFLOW VARIABLES INITIALISED:');\nconsole.log(` \ud83d\udcbe 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// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83d\udcca OUTPUT DATA\n// YOUR_AWS_SECRET_KEY_HERE==\n\nconst initData = {\n timeData,\n workflowConfig,\n customConfig\n};\n\nreturn [{ json: initData }];"
},
"typeVersion": 2
},
{
"id": "",
"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": "",
"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": "",
"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 \"\u2705 Cleaned up temporary restore folder: $TEMP_FOLDER\"\nelse\n echo \"\u2139\ufe0f Temporary folder already removed or not found\"\nfi"
},
"typeVersion": 1
},
{
"id": "",
"name": "ERROR: Find Most Recent Bkp Folder",
"type": "n8n-nodes-base.stopAndError",
"position": [
560,
-64
],
"parameters": {
"errorMessage": "={{ $json.error }}"
},
"typeVersion": 1
},
{
"id": "",
"name": "Find Last Backup",
"type": "n8n-nodes-base.code",
"onError": "continueErrorOutput",
"position": [
304,
-320
],
"parameters": {
"jsCode": "// YOUR_AWS_SECRET_KEY_HERE==\n// \ud83d\udd0d FIND LATEST BACKUP FOLDER\n// YOUR_AWS_SECRET_KEY_HERE==\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(`\ud83d\udd0d Searching for latest backup in: ${BACKUP_FOLDER}`);\nconsole.log(`\ud83d\udcc1 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(`\ud83d\udcc2 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(`\ud83d\udcc5 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(`\u2705 Latest backup date: ${latestBackupDate}`);\n console.log(`\u2705 Credentials' Full backup path: ${credentialsFullBackupPath}`);\n console.log(`\u2705 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(`\u274c Error finding latest backup: ${error.message}`);\n throw new Error(`\u274c Error finding latest backup: ${error.message}`);\n \n}"
},
"typeVersion": 2
}
],
"connections": {
"Init": {
"main": [
[
{
"node": "List Bkp Folders",
"type": "main",
"index": 0
}
]
]
},
"Start Restore": {
"main": [
[
{
"node": "Init",
"type": "main",
"index": 0
}
]
]
},
"Find Last Backup": {
"main": [
[
{
"node": "Restore Credentials?",
"type": "main",
"index": 0
},
{
"node": "Restore Workflows?",
"type": "main",
"index": 0
}
],
[
{
"node": "ERROR: Find Most Recent Bkp Folder",
"type": "main",
"index": 0
}
]
]
},
"List Bkp Folders": {
"main": [
[
{
"node": "Find Last Backup",
"type": "main",
"index": 0
}
]
]
},
"Restore Workflows": {
"main": [
[
{
"node": "Delete TEMP Folder",
"type": "main",
"index": 0
}
]
]
},
"Delete TEMP Folder": {
"main": [
[
{
"node": "SUCCESS email Workflows",
"type": "main",
"index": 0
}
]
]
},
"Restore Workflows?": {
"main": [
[
{
"node": "Exclude Current Workflow From Selection",
"type": "main",
"index": 0
}
]
]
},
"Restore Credentials": {
"main": [
[
{
"node": "SUCCESS email",
"type": "main",
"index": 0
}
]
]
},
"Restore Credentials?": {
"main": [
[
{
"node": "Restore Credentials",
"type": "main",
"index": 0
}
]
]
},
"Exclude Current Workflow From Selection": {
"main": [
[
{
"node": "Restore Workflows",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Perfect for disaster recovery or migrating between environments, this workflow automatically identifies your most recent backup and provides a manual restore capability that intelligently excludes the current workflow to prevent conflicts. Works seamlessly with date-organized…
Source: https://n8n.io/workflows/9154/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Perfect for disaster recovery or migrating between environments, this workflow automatically identifies your most recent FTP backup and provides a manual restore capability that intelligently excludes
Complete backup solution that saves both workflows and credentials to local/server disk with optional FTP upload for off-site redundancy.
This template is a hands-on, practical exam designed to help you master n8n Expressions—the key to accessing and manipulating data in your workflows.
This template is a hands-on, practical exam designed to test your understanding of the fundamental JSON data types. It's the perfect way to solidify your knowledge after learning the basics.
Prevent concurrent workflow runs using Redis. Uses executeWorkflowTrigger, manualTrigger, stickyNote, executeWorkflow. Event-driven trigger; 43 nodes.