J2897 icon

Scheduled n8n Backups

J2897 | PRO | 08/04/24 10:48:39 AM UTC (Edited) | 0 ⭐ | 14003 👁️ | Never ⏰ | []
Batch |

3.68 KB

|

None

|

0 👍

/

0 👎

@echo off
setlocal
 
REM Backup Script for n8n Configuration and Database Files
 
:: This will automate the process of backing up the 'config' and 'database.sqlite' files 
:: from n8n's main folder to a specified destination as a password-protected 'backup.zip' file.
:: The backup is performed only if either of these files have been modified since the last backup.
:: 
:: The script uses 7-Zip for compression and encryption, and PowerShell for file timestamp retrieval.
:: 
:: Key Features:
:: - Checks if 7-Zip and PowerShell are installed.
:: - Retrieves and compares the last modification timestamps of the files.
:: - Performs a backup only if the files have been modified since the last backup.
:: - Writes human-readable timestamps to the backup timestamps file.
:: 
:: Configuration:
:: - SEVENZIP: Path to the 7-Zip executable.
:: - SOURCE_DIR: Directory containing the files to back up.
:: - DESTINATION: Path to the backup ZIP file.
:: - TIMESTAMP_FILE: File to store the last backup timestamps.
:: - PASSWORD: Password for the encrypted ZIP file.
 
:: Configuration
set "SEVENZIP=C:\Program Files\7-Zip\7z.exe"
set "SOURCE_DIR=%USERPROFILE%\.n8n"
set "DESTINATION=X:\Storage\.n8n\backup.zip"
set "TIMESTAMP_FILE=%USERPROFILE%\.n8n\backup_timestamps.txt"
set "PASSWORD=password123" || REM Set the 7-Zip password to encrypt the backups
 
:: Check if 7-Zip exists
if not exist "%SEVENZIP%" (
    echo 7-Zip is not installed or the path is incorrect.
    exit /b 1
)
 
:: Check if PowerShell is installed
powershell -Command "Write-Host 'PowerShell is working'" >nul 2>&1
if errorlevel 1 (
    echo PowerShell is not installed or not accessible.
    exit /b 1
)
 
:: Retrieve last backup timestamps
if exist "%TIMESTAMP_FILE%" (
    for /f "tokens=1,*" %%A in (%TIMESTAMP_FILE%) do (
        if "%%A"=="config" set LAST_CONFIG_TIMESTAMP_HUMAN=%%B
        if "%%A"=="database.sqlite" set LAST_DATABASE_TIMESTAMP_HUMAN=%%B
    )
)
 
:: Debug output to verify last timestamps
echo Last config timestamp (human-readable): %LAST_CONFIG_TIMESTAMP_HUMAN%
echo Last database.sqlite timestamp (human-readable): %LAST_DATABASE_TIMESTAMP_HUMAN%
 
:: Get current timestamps using PowerShell
for %%F in (config database.sqlite) do (
    echo Fetching timestamp for %%F
    for /f "delims=" %%T in ('powershell -Command "Get-Item \"%SOURCE_DIR%\%%F\" | Select-Object -ExpandProperty LastWriteTime | ForEach-Object { $_.ToString('yyyy-MM-dd HH:mm:ss') }"') do (
        set "CURRENT_%%F_TIMESTAMP_HUMAN=%%T"
    )
)
 
:: Debug output to verify current timestamps
echo Current config timestamp (human-readable): %CURRENT_config_TIMESTAMP_HUMAN%
echo Current database.sqlite timestamp (human-readable): %CURRENT_database.sqlite_TIMESTAMP_HUMAN%
 
:: Compare timestamps and decide if backup is needed
set NEED_BACKUP=0
 
if not defined LAST_CONFIG_TIMESTAMP_HUMAN (
    set NEED_BACKUP=1
) else (
    if "%CURRENT_config_TIMESTAMP_HUMAN%" gtr "%LAST_CONFIG_TIMESTAMP_HUMAN%" (
        set NEED_BACKUP=1
    )
)
 
if not defined LAST_DATABASE_TIMESTAMP_HUMAN (
    set NEED_BACKUP=1
) else (
    if "%CURRENT_database.sqlite_TIMESTAMP_HUMAN%" gtr "%LAST_DATABASE_TIMESTAMP_HUMAN%" (
        set NEED_BACKUP=1
    )
)
 
:: Perform backup if needed
if "%NEED_BACKUP%"=="1" (
    echo Backing up files...
    "%SEVENZIP%" a -tzip -p%PASSWORD% "%DESTINATION%" "%SOURCE_DIR%\database.sqlite" "%SOURCE_DIR%\config"
 
    :: Update timestamp file
    > "%TIMESTAMP_FILE%" (
        echo config %CURRENT_config_TIMESTAMP_HUMAN%
        echo database.sqlite %CURRENT_database.sqlite_TIMESTAMP_HUMAN%
    )
    echo Backup completed.
) else (
    echo No backup needed. Files are up-to-date.
)
 
endlocal

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎