diff --git a/kopia_backup/kopia_cli_deploy_win/kopia.exe b/kopia_backup/kopia_cli_deploy_win/kopia.exe
index 3878b58..81fd9f8 100644
Binary files a/kopia_backup/kopia_cli_deploy_win/kopia.exe and b/kopia_backup/kopia_cli_deploy_win/kopia.exe differ
diff --git a/kopia_backup/kopia_cli_deploy_win/kopia_backup_scipt.ps1 b/kopia_backup/kopia_cli_deploy_win/kopia_backup_scipt.ps1
index e77b9d9..4b31b70 100644
--- a/kopia_backup/kopia_cli_deploy_win/kopia_backup_scipt.ps1
+++ b/kopia_backup/kopia_cli_deploy_win/kopia_backup_scipt.ps1
@@ -1,12 +1,14 @@
+# v0.2
# Before using this script, create a repo, note the setting of a password
-# kopia repo create filesystem --path C:\kopia_repo --password aaa --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
+# kopia repo create filesystem --path C:\kopia_repo --password aaa
# for backblaza b2
# kopia repository create b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0 --password aaa
# useful commands:
+# - kopia repo status
# - kopia repo connect filesystem --path C:\kopia_repo -p aaa
-# - kopia snap list -all
+# - kopia snap list --all
# - kopia mount all K:
# mounting should be used as non-admin user, weird windows thing
# or one does not see the drive, in that case:
@@ -17,28 +19,31 @@
# if it was not manually set then it would be
# C:\Windows\System32\config\systemprofile\AppData
-#
+
# to backup multiple targets/paths:
# - [array]$BACKUP_THIS = 'C:\Test','C:\users','C:\blabla'
$REPOSITORY_PATH = 'C:\kopia_repo'
$KOPIA_PASSWORD = 'aaa'
[array]$BACKUP_THIS = 'C:\Test'
+$LOG_PATH = 'C:\Kopia\Kopia_Logs'
$USE_SHADOW_COPY = $false
# ----------------------------------------------------------------------------
-kopia repository connect filesystem --path $REPOSITORY_PATH --password $KOPIA_PASSWORD --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
+$Env:KOPIA_LOG_DIR = $LOG_PATH
+
+kopia repository connect filesystem --path $REPOSITORY_PATH --password $KOPIA_PASSWORD
# kopia repository connect b2 --bucket=kopia-repo-rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0
-kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=8 --keep-daily=14 --keep-hourly=0 --keep-latest=3 --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
+kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=0 --keep-daily=14 --keep-hourly=0 --keep-latest=3
-foreach ($path in $BACKUP_THIS) {
- if ($USE_SHADOW_COPY) {
- kopia policy set $BACKUP_THIS --before-folder-action "powershell -WindowStyle Hidden C:\Kopia\win_vss_before.ps1" --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
- kopia policy set $BACKUP_THIS --after-folder-action "powershell -WindowStyle Hidden C:\Kopia\win_vss_after.ps1" --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
- }
- kopia snapshot create $path --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
+if ($USE_SHADOW_COPY) {
+ kopia policy set --global --enable-volume-shadow-copy=when-available
}
-kopia repository disconnect --file-log-level=info --log-dir=C:\Kopia\Kopia_Logs
+foreach ($path in $BACKUP_THIS) {
+ kopia snapshot create $path --file-log-level=info
+}
+
+kopia repository disconnect
diff --git a/kopia_backup/kopia_cli_deploy_win/win_vss_after.ps1 b/kopia_backup/kopia_cli_deploy_win/win_vss_after.ps1
deleted file mode 100644
index 01c9fb8..0000000
--- a/kopia_backup/kopia_cli_deploy_win/win_vss_after.ps1
+++ /dev/null
@@ -1,18 +0,0 @@
-if ($args.Length -eq 0) {
- $kopiaSnapshotId = $env:KOPIA_SNAPSHOT_ID
-} else {
- $kopiaSnapshotId = $args[0]
-}
-
-if (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
- $mountPoint = Get-Item "${PSScriptRoot}\${kopiaSnapshotId}"
- $mountedVolume = $mountPoint.Target
-
- cmd /c rmdir $mountPoint
- Get-CimInstance -ClassName Win32_ShadowCopy | Where-Object { "$($_.DeviceObject)\" -eq "\\?\${mountedVolume}" } | Remove-CimInstance
-} else {
- Start-Process 'powershell' '-f', $MyInvocation.MyCommand.Path, $kopiaSnapshotId -Verb RunAs -WindowStyle Hidden -Wait
- if ($proc.ExitCode) {
- exit $proc.ExitCode
- }
-}
diff --git a/kopia_backup/kopia_cli_deploy_win/win_vss_before.ps1 b/kopia_backup/kopia_cli_deploy_win/win_vss_before.ps1
deleted file mode 100644
index e3692b1..0000000
--- a/kopia_backup/kopia_cli_deploy_win/win_vss_before.ps1
+++ /dev/null
@@ -1,30 +0,0 @@
-if ($args.Length -eq 0) {
- $kopiaSnapshotId = $env:KOPIA_SNAPSHOT_ID
- $kopiaSourcePath = $env:KOPIA_SOURCE_PATH
-} else {
- $kopiaSnapshotId = $args[0]
- $kopiaSourcePath = $args[1]
-}
-
-$sourceDrive = Split-Path -Qualifier $kopiaSourcePath
-$sourcePath = Split-Path -NoQualifier $kopiaSourcePath
-# use Kopia snapshot ID as mount point name for extra caution for duplication
-$mountPoint = "${PSScriptRoot}\${kopiaSnapshotId}"
-
-if (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
- $shadowId = (Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{ Volume = "${sourceDrive}\" }).ShadowID
- $shadowDevice = (Get-CimInstance -ClassName Win32_ShadowCopy | Where-Object { $_.ID -eq $shadowId }).DeviceObject
- if (-not $shadowDevice) {
- # fail the Kopia snapshot early if shadow copy was not created
- exit 1
- }
-
- cmd /c mklink /d $mountPoint "${shadowDevice}\"
-} else {
- $proc = Start-Process 'powershell' '-f', $MyInvocation.MyCommand.Path, $kopiaSnapshotId, $kopiaSourcePath -PassThru -Verb RunAs -WindowStyle Hidden -Wait
- if ($proc.ExitCode) {
- exit $proc.ExitCode
- }
-}
-
-Write-Output "KOPIA_SNAPSHOT_PATH=${mountPoint}${sourcePath}"
diff --git a/kopia_backup/kopia_server_deploy_service_win/kopia.exe b/kopia_backup/kopia_server_deploy_service_win/kopia.exe
index 3878b58..81fd9f8 100644
Binary files a/kopia_backup/kopia_server_deploy_service_win/kopia.exe and b/kopia_backup/kopia_server_deploy_service_win/kopia.exe differ
diff --git a/kopia_backup/readme.md b/kopia_backup/readme.md
index d5d4c67..d5e1681 100644
--- a/kopia_backup/readme.md
+++ b/kopia_backup/readme.md
@@ -56,7 +56,7 @@ Embedded webGUI for server mode is done in React. KopiaUI comes packaged with el
# Some aspects of Kopia
[Official Getting Started Guide](https://kopia.io/docs/getting-started/)
-[Official Features](https://kopia.io/docs/features/)
+[Features](https://kopia.io/docs/features/)
[Advanced Topics](https://kopia.io/docs/advanced/)
The above linked documentation is well written and worth a look
@@ -84,17 +84,20 @@ if planning serious use.
Web GUI versions have button for it, cli version can do `sudo kopia mount all /mnt/temp &`
* **Tasks** section in gui gets wiped when Kopia closes, info on snapshots run
history and duration then has to be find in logs
-* **Logs** rotate with max age 30 days or max 1000 log files, 5000 content log files
- Useful to search in cli-logs are the terms `kopia/server snapshotting` and
- `kopia/server finished`
+* **Logs** are creted on every execution of kopia binary.
+ They rotate by default with max age 30 days, but still can grow hundreds of MB.
* [Compression](https://kopia.io/docs/advanced/compression/) is good and
should be set before backup starts. My go-to is `zstd-fastest`. If backups
feel slow `s2-default` is less cpu heavy but with worse compression.
Useful command: `kopia content stats`
* During snapshots Kopia uses local **cache**, location varies depending on the OS.
- Default max size is 5GB, but it gets swept periodically every few minutes.
- Useful commands are `kopia cache info` and `kopia cache clear`
-* ..
+ Default max size is 5GB. Cache gets swept periodically every few minutes.
+ Useful commands are `kopia cache info` and `kopia cache clear`.
+* Increase [considerably the max cache size](https://github.com/kopia/kopia/issues/3059#issuecomment-1663479603)
+ if planning to use cloud storage as the maintenance could eat into egress cost
+ when kopia redownloads files.
+* ...
+
# Kopia in Linux
@@ -125,7 +128,7 @@ After creation the repo is connected, so connnect command is just demonstration.
`sudo kopia policy list`
`sudo kopia policy show --global`
-`sudo kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=8 --keep-daily=14 --keep-hourly=0 --keep-latest=3`
+`sudo kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=0 --keep-daily=14 --keep-hourly=0 --keep-latest=3`
* **manual backup run**
@@ -151,13 +154,14 @@ So both `/home` and `/etc` are set to be backed up.
```bash
#!/bin/bash
+# v0.2
# initialize repository
# sudo kopia repo create filesystem --path /mnt/mirror/KOPIA/docker_host_kopia
# for cloud like backblaze
# sudo kopia repository create b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0
# sudo kopia repository connect b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0
# adjust global policy
-# sudo kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=8 --keep-daily=14 --keep-hourly=0 --keep-latest=3
+# sudo kopia policy set --global --compression=zstd-fastest --keep-annual=0 --keep-monthly=12 --keep-weekly=0 --keep-daily=14 --keep-hourly=0 --keep-latest=3
REPOSITORY_PATH='/mnt/mirror/KOPIA/docker_host_kopia'
BACKUP_THIS='/home /etc'
@@ -167,10 +171,11 @@ kopia repository connect filesystem --path $REPOSITORY_PATH
kopia snapshot create $BACKUP_THIS
kopia repository disconnect
+# -------------- ERROR EXIT CODES --------------
# kopia does not interupts its run with an error if target or repository are missing
-# this makes systemd OnSuccess OnFailure not behaving as they should
-# below are checks for paths, that results in immediate error exit code if they do not exist
-# they are at the end because some backup might get done even another is missing something
+# this makes systemd OnSuccess OnFailure not behaving as one might expect
+# below are checks for paths, that result in immediate error exit code if they do not exist
+# they are at the end because some backup might get done even if another is missing something
# we just want the error exit code
IFS=' ' read -ra paths <<< "$BACKUP_THIS"
@@ -368,6 +373,8 @@ Also use of [nssm](https://nssm.cc/) is popular.
![windows_scoop_install_kopia](https://i.imgur.com/UPZFImh.png)
+At the moment **cli is the only way to use VSS snapshots**.
+
All relevant files are in `C:\Kopia`, from binaries, `repository.config`, to logs.
A scheduled task is imported that executes a powershell script
`C:\Kopia\kopia_backup_scipt.ps1` at 21:19.
@@ -375,28 +382,26 @@ The script connects to a set repo and backup set targets.
This approach is bit more hands on than having a gui, but for daily use one
can easily get by with the commands: `kopia snap list -all` and `kopia mount all K:`
-Note that mount command should be executed in non admin terminal. Weird
-windows thing.
-
-Also at the moment cli is the only way I know how to make kopia actions work,
-so that VSS snapshots can be used.
+Note that if mount command is not working, try executing it in non admin terminal. Weird
+windows thing. Or you need to enable/install `WebClient` service.
* [Download this repo](https://github.com/DoTheEvo/selfhosted-apps-docker/archive/refs/heads/master.zip),
delete everything except `kopia_cli_deploy_win` folder.
* Run `DEPLOY.cmd`
* Removes powershell scripts restriction.
* Creates folder `C:\Kopia` and kopies there
- `kopia.exe`, `kopia_backup_scipt.ps1` and the VSS ps1 before and after files.
+ `kopia.exe`, `kopia_backup_scipt.ps1`.
* Adds `C:\Kopia` to the system env variable PATH.
- * imports a task schedule
+ * imports a scheduled task.
* Read `kopia_backup_scipt.ps1` and follow the instructions there.
Which should be to just to create repo before running the script.
* edit the scheduled task to the prefered time, default is daily at 21:19
* run scheduled task manually
* check if it worked
+ * `kopia repo status`
* `kopia snap list --all`
-The script is set to save logs in to `C:\Kopia`.
+The script is set to save logs in to `C:\Kopia\Kopia_Logs\`.
### VSS snapshots
@@ -408,11 +413,13 @@ This is what allows backup of open files that are in use.
To make use of this feature edit `kopia_backup_scipt.ps1` changing
`$USE_SHADOW_COPY = $false` to `$USE_SHADOW_COPY = $true`
-Note the use of `--enable-actions` which is required for before/after actions
-to work.
+To check if it's set: `kopia policy show --global`,
+should see there: *OS-level snapshot support: Volume Shadow Copy: when-available*
-To test if its working, one can execute command `vssadmin list shadows`
-to see current VSS snapshots and then execute it again during the backup.
+Can also check log files, any named snapshot-creat in cli folder, and see
+entries about *volume shadow copy*. Or also one might execute command
+`vssadmin list shadows` to see current VSS snapshots and then execute
+it again during the backup.
### Kopia install using scoop, machine-wide
@@ -632,7 +639,7 @@ For cli just follow [the official documentation.](https://kopia.io/docs/reposito
The example of commands:
* `kopia repository create b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0 --password aaa`
-* `kopia repository connect b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0 --password aaa --enable-actions`
+* `kopia repository connect b2 --bucket=rakanishu --key-id=001496285081a7e0000000003 --key=K0016L8FAMRp/F+6ckbXIYpP0UgTky0 --password aaa`
The backup script contains example commands, just commented out.