@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
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎