Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7c1ba32d2 | ||
|
|
117aa66430 | ||
|
|
01a38f893a | ||
|
|
a840f5ae04 | ||
|
|
387390759d |
35
CHANGELOG.md
35
CHANGELOG.md
@@ -1,14 +1,39 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [1.3](https://github.com/kmwoley/restic-windows-backup/tree/HEAD)
|
## [1.4](https://github.com/kmwoley/restic-windows-backup/tree/1.4) (2021-02-24)
|
||||||
|
[Full Changelog](https://github.com/kmwoley/restic-windows-backup/compare/1.3...HEAD)
|
||||||
|
|
||||||
[Full Changelog](https://github.com/kmwoley/restic-windows-backup/compare/1.2.1...HEAD)
|
Moved to using Restic's inbuilt filesystem shadow copy creation (VSS).
|
||||||
|
|
||||||
|
## Breaking Change
|
||||||
|
`local.exclude` file changes that previously referenced the `resticVSS` directory will need to be changed to `C:\` or the relevant root drive letter.
|
||||||
|
|
||||||
|
## Other enhancements
|
||||||
|
- Future snapshot grouping (and cleanup) will be better since the root-level folders included in the backup won't change (instead, the script targets the root drive letter instead of a list of folders under the drive letter).
|
||||||
|
- Added the ability to set prune parameters via `.\config.ps1`, and defaulted the settings to `--group-by host` to clean up the aforementioned snapshot grouping & pruning.
|
||||||
|
- Updated the `windows.exclude` to include additional directories (most notably, the Recycle Bin is no longer backed up)
|
||||||
|
|
||||||
|
**Closed issues:**
|
||||||
|
|
||||||
|
- Remove VSS Operations, Switch to `--use-fs-snapshot` [\#32](https://github.com/kmwoley/restic-windows-backup/issues/32)
|
||||||
|
- powershell execution policy is blocking the scheduled task [\#27](https://github.com/kmwoley/restic-windows-backup/issues/27)
|
||||||
|
- VSS Cleanup Upon Errors [\#8](https://github.com/kmwoley/restic-windows-backup/issues/8)
|
||||||
|
|
||||||
|
**Merged pull requests:**
|
||||||
|
|
||||||
|
- Release 1.4 [\#33](https://github.com/kmwoley/restic-windows-backup/pull/33) ([kmwoley](https://github.com/kmwoley))
|
||||||
|
|
||||||
|
## [1.3](https://github.com/kmwoley/restic-windows-backup/tree/1.3) (2021-02-23)
|
||||||
|
|
||||||
|
[Full Changelog](https://github.com/kmwoley/restic-windows-backup/compare/1.2.1...1.3)
|
||||||
|
|
||||||
Improvements for Restic 0.12 and additional error logging.
|
Improvements for Restic 0.12 and additional error logging.
|
||||||
|
|
||||||
**Closed issues:**
|
**Closed issues:**
|
||||||
|
|
||||||
|
- backup errors after update to restic 0.12.0 due to --quiet and --verbose being used simultaneously [\#29](https://github.com/kmwoley/restic-windows-backup/issues/29)
|
||||||
- Restic + rclone errors [\#26](https://github.com/kmwoley/restic-windows-backup/issues/26)
|
- Restic + rclone errors [\#26](https://github.com/kmwoley/restic-windows-backup/issues/26)
|
||||||
|
- E-Mail sending errors are not logged [\#25](https://github.com/kmwoley/restic-windows-backup/issues/25)
|
||||||
- FYI: Restic now has built-in VSS support [\#23](https://github.com/kmwoley/restic-windows-backup/issues/23)
|
- FYI: Restic now has built-in VSS support [\#23](https://github.com/kmwoley/restic-windows-backup/issues/23)
|
||||||
- SFTP backup [\#22](https://github.com/kmwoley/restic-windows-backup/issues/22)
|
- SFTP backup [\#22](https://github.com/kmwoley/restic-windows-backup/issues/22)
|
||||||
- Dirrectory/Folder Backup [\#21](https://github.com/kmwoley/restic-windows-backup/issues/21)
|
- Dirrectory/Folder Backup [\#21](https://github.com/kmwoley/restic-windows-backup/issues/21)
|
||||||
@@ -16,6 +41,12 @@ Improvements for Restic 0.12 and additional error logging.
|
|||||||
- Filtering out errors before deciding to retry ? [\#19](https://github.com/kmwoley/restic-windows-backup/issues/19)
|
- Filtering out errors before deciding to retry ? [\#19](https://github.com/kmwoley/restic-windows-backup/issues/19)
|
||||||
- Backup task stucked [\#18](https://github.com/kmwoley/restic-windows-backup/issues/18)
|
- Backup task stucked [\#18](https://github.com/kmwoley/restic-windows-backup/issues/18)
|
||||||
|
|
||||||
|
**Merged pull requests:**
|
||||||
|
|
||||||
|
- Release 1.4 [\#31](https://github.com/kmwoley/restic-windows-backup/pull/31) ([kmwoley](https://github.com/kmwoley))
|
||||||
|
- Add '-ExecutionPolicy Bypass' to the task scheduler arguments to avoi… [\#28](https://github.com/kmwoley/restic-windows-backup/pull/28) ([scelfo](https://github.com/scelfo))
|
||||||
|
- Fix URI parsing [\#24](https://github.com/kmwoley/restic-windows-backup/pull/24) ([Phlogi](https://github.com/Phlogi))
|
||||||
|
|
||||||
## [1.2.1](https://github.com/kmwoley/restic-windows-backup/tree/1.2.1) (2020-06-08)
|
## [1.2.1](https://github.com/kmwoley/restic-windows-backup/tree/1.2.1) (2020-06-08)
|
||||||
|
|
||||||
[Full Changelog](https://github.com/kmwoley/restic-windows-backup/compare/1.1...1.2.1)
|
[Full Changelog](https://github.com/kmwoley/restic-windows-backup/compare/1.1...1.2.1)
|
||||||
|
|||||||
48
backup.ps1
48
backup.ps1
@@ -76,7 +76,7 @@ function Invoke-Maintenance {
|
|||||||
# prune (remove) data from the backup step. Running this separate from `forget` because
|
# prune (remove) data from the backup step. Running this separate from `forget` because
|
||||||
# `forget` only prunes when it detects removed snapshots upon invocation, not previously removed
|
# `forget` only prunes when it detects removed snapshots upon invocation, not previously removed
|
||||||
Write-Output "[[Maintenance]] Start pruning..." | Tee-Object -Append $SuccessLog
|
Write-Output "[[Maintenance]] Start pruning..." | Tee-Object -Append $SuccessLog
|
||||||
& $ResticExe prune 3>&1 2>> $ErrorLog | Tee-Object -Append $SuccessLog
|
& $ResticExe prune $SnapshotPrunePolicy 3>&1 2>> $ErrorLog | Tee-Object -Append $SuccessLog
|
||||||
if(-not $?) {
|
if(-not $?) {
|
||||||
Write-Output "[[Maintenance]] Prune operation completed with errors" | Tee-Object -Append $ErrorLog | Tee-Object -Append $SuccessLog
|
Write-Output "[[Maintenance]] Prune operation completed with errors" | Tee-Object -Append $ErrorLog | Tee-Object -Append $SuccessLog
|
||||||
$maintenance_success = $false
|
$maintenance_success = $false
|
||||||
@@ -127,29 +127,17 @@ function Invoke-Backup {
|
|||||||
$starting_location = Get-Location
|
$starting_location = Get-Location
|
||||||
ForEach ($item in $BackupSources.GetEnumerator()) {
|
ForEach ($item in $BackupSources.GetEnumerator()) {
|
||||||
|
|
||||||
$ShadowPath = Join-Path $item.Key 'resticVSS'
|
# Get the source drive letter and set as the root path
|
||||||
|
$root_path = $item.Key
|
||||||
|
|
||||||
# check for existance of previous, orphaned VSS directory (and remove it) before creating the shadow copy
|
# Avoid storing the drive letter in the backup path if only backing up a single drive
|
||||||
if(Test-Path $ShadowPath) {
|
# FIXME: this doesn't really work. "C:\" still gets stored
|
||||||
Write-Output "[[Backup]] VSS directory exists: '$ShadowPath' - removing. Past script failure?" | Tee-Object -Append $ErrorLog | Tee-Object -Append $SuccessLog
|
|
||||||
cmd /c rmdir $ShadowPath
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create the shadow copy
|
|
||||||
$s1 = (Get-WmiObject -List Win32_ShadowCopy).Create($item.Key, "ClientAccessible")
|
|
||||||
$s2 = Get-WmiObject -Class Win32_ShadowCopy | Where-Object { $_.ID -eq $s1.ShadowID }
|
|
||||||
|
|
||||||
# Create a symbolic link to the shadow copy
|
|
||||||
$device = $s2.DeviceObject + "\"
|
|
||||||
cmd /c mklink /d $ShadowPath "$device" 3>&1 2>> $ErrorLog | Tee-Object -Append $SuccessLog
|
|
||||||
|
|
||||||
# Build the new list of folders
|
|
||||||
$root_path = $ShadowPath
|
|
||||||
if($drive_count -eq 1) {
|
if($drive_count -eq 1) {
|
||||||
|
Set-Location $root_path
|
||||||
$root_path = "."
|
$root_path = "."
|
||||||
Set-Location $ShadowPath
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Build the new list of folders from settings (if there are any)
|
||||||
$folder_list = New-Object System.Collections.Generic.List[System.Object]
|
$folder_list = New-Object System.Collections.Generic.List[System.Object]
|
||||||
ForEach ($path in $item.Value) {
|
ForEach ($path in $item.Value) {
|
||||||
$p = Join-Path $root_path $path
|
$p = Join-Path $root_path $path
|
||||||
@@ -157,30 +145,20 @@ function Invoke-Backup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# backup everything in the root if no folders are provided
|
# backup everything in the root if no folders are provided
|
||||||
# note this won't select items with hidden attributes (a good thing to avoid)
|
|
||||||
if (-not $folder_list) {
|
if (-not $folder_list) {
|
||||||
ForEach ($path in Get-ChildItem $ShadowPath) {
|
$folder_list.Add($root_path)
|
||||||
$p = Join-Path $root_path $path
|
|
||||||
$folder_list.Add($p)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Launch Restic
|
# Launch Restic
|
||||||
& $ResticExe backup $folder_list --exclude-file=$WindowsExcludeFile --exclude-file=$LocalExcludeFile 3>&1 2>> $ErrorLog | Tee-Object -Append $SuccessLog
|
& $ResticExe backup $folder_list --use-fs-snapshot --exclude-file=$WindowsExcludeFile --exclude-file=$LocalExcludeFile 3>&1 2>> $ErrorLog | Tee-Object -Append $SuccessLog
|
||||||
if(-not $?) {
|
if(-not $?) {
|
||||||
Write-Output "[[Backup]] Completed with errors" | Tee-Object -Append $ErrorLog | Tee-Object -Append $SuccessLog
|
Write-Output "[[Backup]] Completed with errors" | Tee-Object -Append $ErrorLog | Tee-Object -Append $SuccessLog
|
||||||
$return_value = $false
|
$return_value = $false
|
||||||
}
|
}
|
||||||
|
|
||||||
# Delete the shadow copy and remove the symbolic link
|
|
||||||
if($drive_count -eq 1) {
|
|
||||||
Set-Location $starting_location
|
|
||||||
}
|
|
||||||
$s2.Delete()
|
|
||||||
cmd /c rmdir $ShadowPath
|
|
||||||
|
|
||||||
Write-Output "[[Backup]] End $(Get-Date)" | Tee-Object -Append $SuccessLog
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set-Location $starting_location
|
||||||
|
Write-Output "[[Backup]] End $(Get-Date)" | Tee-Object -Append $SuccessLog
|
||||||
|
|
||||||
return $return_value
|
return $return_value
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ $GlobalRetryAttempts = 4
|
|||||||
|
|
||||||
# maintenance configuration
|
# maintenance configuration
|
||||||
$SnapshotMaintenanceEnabled = $true
|
$SnapshotMaintenanceEnabled = $true
|
||||||
$SnapshotRetentionPolicy = @("--keep-daily", "30", "--keep-weekly", "52", "--keep-monthly", "24", "--keep-yearly", "10")
|
$SnapshotRetentionPolicy = @("--group-by", "host", "--keep-daily", "30", "--keep-weekly", "52", "--keep-monthly", "24", "--keep-yearly", "10")
|
||||||
|
$SnapshotPrunePolicy = @("--max-unused", "1%")
|
||||||
$SnapshotMaintenanceInterval = 7
|
$SnapshotMaintenanceInterval = 7
|
||||||
$SnapshotMaintenanceDays = 30
|
$SnapshotMaintenanceDays = 30
|
||||||
$SnapshotDeepMaintenanceDays = 90;
|
$SnapshotDeepMaintenanceDays = 90;
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
# default excludes
|
# default excludes
|
||||||
# examples https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Utility/FilterGroups.cs
|
# examples https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Utility/FilterGroups.cs
|
||||||
# note, because we're using a VSS directory, we can use that as the root dir for exclude rules (i.e. resticVSS)
|
C:\hiberfil.sys
|
||||||
resticVSS\hiberfil.sys
|
C:\pagefile.sys
|
||||||
resticVSS\pagefile.sys
|
C:\swapfile.sys
|
||||||
resticVSS\swapfile.sys
|
C:\$Recycle.Bin
|
||||||
resticVSS\$Recycle.Bin
|
C:\autoexec.bat
|
||||||
resticVSS\autoexec.bat
|
C:\Config.Msi
|
||||||
resticVSS\Config.Msi
|
C:\Documents and Settings
|
||||||
resticVSS\Documents and Settings
|
C:\Recycled
|
||||||
resticVSS\Recycled
|
C:\Recycler
|
||||||
resticVSS\Recycler
|
C:\$$Recycle.Bin
|
||||||
resticVSS\System Volume Information
|
C:\System Volume Information
|
||||||
resticVSS\Recovery
|
C:\Recovery
|
||||||
resticVSS\Program Files
|
C:\Program Files
|
||||||
resticVSS\Program Files (x86)
|
C:\Program Files (x86)
|
||||||
resticVSS\ProgramData
|
C:\ProgramData
|
||||||
resticVSS\PerfLogs
|
C:\PerfLogs
|
||||||
resticVSS\Windows
|
C:\Windows
|
||||||
resticVSS\Windows.old
|
C:\Windows.old
|
||||||
|
C:\$$WINDOWS.~BT
|
||||||
|
C:\$$WinREAgent
|
||||||
Microsoft\Windows\Recent
|
Microsoft\Windows\Recent
|
||||||
Microsoft\**\RecoveryStore*
|
Microsoft\**\RecoveryStore*
|
||||||
Microsoft\**\Windows\*.edb
|
Microsoft\**\Windows\*.edb
|
||||||
@@ -32,7 +34,7 @@ UsrClass.dat
|
|||||||
Dropbox
|
Dropbox
|
||||||
AppData\Local\Google\Drive
|
AppData\Local\Google\Drive
|
||||||
Google Drive\.tmp.drivedownload
|
Google Drive\.tmp.drivedownload
|
||||||
resticVSS\OneDriveTemp
|
C:\OneDriveTemp
|
||||||
|
|
||||||
# browsers
|
# browsers
|
||||||
Google\Chrome
|
Google\Chrome
|
||||||
|
|||||||
Reference in New Issue
Block a user