# Adjust window size $host.UI.RawUI.WindowSize = New-Object Management.Automation.Host.Size(80, 40) $host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size(80, 3000) # Configuration $sevenZip = "C:\Program Files\7-Zip\7z.exe" $sourceDir = "$env:USERPROFILE\.n8n" $destination = "X:\Storage\.n8n\backup.zip" $timestampFile = "$env:USERPROFILE\.n8n\backup_timestamps.txt" $password = $env:SEVENZIP_PASSWORD # Check if n8n is running $n8nProcesses = Get-WmiObject Win32_Process | Where-Object { $_.CommandLine -like "*npx*" -and $_.CommandLine -like "*n8n*" -and $_.CommandLine -notlike "*powershell*" } if ($n8nProcesses) { Write-Host "n8n is currently running. Backup will not proceed." exit 0 } # Check if 7-Zip exists if (!(Test-Path -Path $sevenZip)) { Write-Error "7-Zip is not installed or the path is incorrect." exit 1 } # Check if the password is set if ([string]::IsNullOrEmpty($password)) { Write-Error "Backup password is not set. Please set the SEVENZIP_PASSWORD environment variable." exit 1 } # Retrieve last backup timestamps $lastTimestamps = @{} if (Test-Path -Path $timestampFile) { Get-Content -Path $timestampFile | ForEach-Object { $parts = $_.Split(" ", 2) if ($parts.Count -eq 2) { $lastTimestamps[$parts[0]] = [long]$parts[1] } else { Write-Error "Timestamp file format is incorrect." exit 1 } } } # Initialize current timestamps hashtable $currentTimestamps = @{} # Get current timestamps foreach ($file in "config", "database.sqlite") { $filePath = Join-Path -Path $sourceDir -ChildPath $file if (Test-Path -Path $filePath) { try { $currentTimestamps[$file] = (Get-Item -Path $filePath).LastWriteTimeUtc.ToFileTimeUtc() } catch { Write-Error "Failed to get LastWriteTimeUtc for file: $file" exit 1 } } else { Write-Error "Source file '$file' does not exist in the directory '$sourceDir'." exit 1 } } # Compare timestamps and decide if backup is needed $needBackup = $false foreach ($file in $currentTimestamps.Keys) { if (!($lastTimestamps.ContainsKey($file)) -or $currentTimestamps[$file] -gt $lastTimestamps[$file]) { $needBackup = $true break } } # Perform backup if needed if ($needBackup) { Write-Host "Backing up files..." try { & $sevenZip a -tzip -p$password $destination (Join-Path -Path $sourceDir -ChildPath "database.sqlite") (Join-Path -Path $sourceDir -ChildPath "config") # Check if the backup was created successfully if (!(Test-Path -Path $destination)) { throw "Backup creation failed." } # Update timestamp file $output = @() foreach ($file in $currentTimestamps.Keys) { $output += "$file $($currentTimestamps[$file])" } Set-Content -Path $timestampFile -Value $output Write-Host "Backup completed." } catch { Write-Error "An error occurred during the backup process: $_" exit 1 } } else { Write-Host "No backup needed. Files are up-to-date." } Start-Sleep -Seconds 4