diff --git a/kopia_backup/kopia-backup-scipt.ps1 b/kopia_backup/kopia-backup-scipt.ps1 deleted file mode 100644 index 7198699..0000000 --- a/kopia_backup/kopia-backup-scipt.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -$REPOSITORY_PATH = 'C:\Backup' -$BACKUP_THIS = 'C:\Users' -$KOPIA_PASSWORD='aaa' - -kopia policy set $BACKUP_THIS --before-folder-action "powershell -WindowStyle Hidden C:\win_vss_before.ps1" -kopia policy set $BACKUP_THIS --after-folder-action "powershell -WindowStyle Hidden C:\win_vss_after.ps1" - -kopia repository connect filesystem --path $REPOSITORY_PATH --password $KOPIA_PASSWORD -kopia snapshot create $BACKUP_THIS -kopia repository disconnect - diff --git a/kopia_backup/kopia_cli_deploy_win/DEPLOY.cmd b/kopia_backup/kopia_cli_deploy_win/DEPLOY.cmd new file mode 100644 index 0000000..41d6a4f --- /dev/null +++ b/kopia_backup/kopia_cli_deploy_win/DEPLOY.cmd @@ -0,0 +1,49 @@ +@echo off + +:: checking if the script is run as administrator +net session >nul 2>&1 +if %errorLevel% == 0 ( + echo - Success: Administrative permissions confirmed. +) else ( + echo - RUN AS ADMINISTRATOR + pause + exit /B +) + +echo - powershell ExecutionPolicy changing to Bypass +powershell.exe Set-ExecutionPolicy -ExecutionPolicy Bypass + +echo - copying kopia.exe in to system32 +robocopy "%~dp0\" "C:\Windows\System32" "kopia.exe" /NDL /NJH /NJS +echo. + +echo - checking if C:\Kopia folder exists, creating it if not +if not exist "C:\Kopia\" ( + mkdir C:\Kopia +) + +if exist "C:\Kopia\kopia_backup_scipt.ps1" ( + echo - C:\Kopia\kopia_backup_scipt.ps1 exists, renaming it with random suffix + ren "C:\Kopia\kopia_backup_scipt.ps1" "kopia_backup_scipt_%random%.ps1" +) + +echo - copying files to C:\Kopia +robocopy "%~dp0\" "C:\Kopia" "kopia_backup_scipt.ps1" /NDL /NJH /NJS +robocopy "%~dp0\" "C:\Kopia" "win_vss_before.ps1" /NDL /NJH /NJS +robocopy "%~dp0\" "C:\Kopia" "win_vss_after.ps1" /NDL /NJH /NJS +echo. + +if exist C:\Windows\System32\Tasks\kopia_backup_schedule ( + echo - scheduled task with that name already exists, skipping + echo - delete the task in taskschd.msc if you want fresh import +) else ( + echo - importing scheduled task kopia_backup_schedule + schtasks.exe /Create /XML "%~dp0\kopia_backup_schedule.xml" /tn "kopia_backup_schedule" +) + +echo. +echo -------------------------------------------------------------- +echo. +echo DEPLOYMENT DONE, RUN THE FOLLOWING COMMAND TO INITIALIZE A REPO +echo kopia repo create filesystem --path C:\kopia_repo --password aaa +pause diff --git a/kopia_backup/kopia/kopia.exe b/kopia_backup/kopia_cli_deploy_win/kopia.exe similarity index 100% rename from kopia_backup/kopia/kopia.exe rename to kopia_backup/kopia_cli_deploy_win/kopia.exe diff --git a/kopia_backup/kopia_cli_deploy_win/kopia_backup_schedule.xml b/kopia_backup/kopia_cli_deploy_win/kopia_backup_schedule.xml new file mode 100644 index 0000000..bf34151 Binary files /dev/null and b/kopia_backup/kopia_cli_deploy_win/kopia_backup_schedule.xml 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 new file mode 100644 index 0000000..4884844 --- /dev/null +++ b/kopia_backup/kopia_cli_deploy_win/kopia_backup_scipt.ps1 @@ -0,0 +1,38 @@ +# Before using this script, initiate the repo +# kopia repo create filesystem --path C:\kopia_repo --password aaa + +# useful commands +# kopia repo connect filesystem --path C:\kopia_repo -p aaa +# 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 +# net use - shows path that can be pasted to explorer or browser +# \\127.0.0.1@51295\DavWWWRoot + +# logs location when run as task scheduler +# C:\Windows\System32\config\systemprofile\AppData + +# config +# example of $BACKUP_THIS with multiple paths +# [array]$BACKUP_THIS = 'C:\Test','C:\Test2','C:\Test3' + +$REPOSITORY_PATH = 'C:\kopia_repo' +$KOPIA_PASSWORD='aaa' +[array]$BACKUP_THIS = 'C:\Test' +$USE_SHADOW_COPY = $false + +# ---------------------------------------------------------------------------- + +kopia repository connect filesystem --path $REPOSITORY_PATH --password $KOPIA_PASSWORD --enable-actions + +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" + kopia policy set $BACKUP_THIS --after-folder-action "powershell -WindowStyle Hidden C:\Kopia\win_vss_after.ps1" + } + kopia snapshot create $path --file-log-level=info +} + +kopia repository disconnect + diff --git a/kopia_backup/kopia/win_vss_after.ps1 b/kopia_backup/kopia_cli_deploy_win/win_vss_after.ps1 similarity index 100% rename from kopia_backup/kopia/win_vss_after.ps1 rename to kopia_backup/kopia_cli_deploy_win/win_vss_after.ps1 diff --git a/kopia_backup/kopia/win_vss_before.ps1 b/kopia_backup/kopia_cli_deploy_win/win_vss_before.ps1 similarity index 100% rename from kopia_backup/kopia/win_vss_before.ps1 rename to kopia_backup/kopia_cli_deploy_win/win_vss_before.ps1 diff --git a/kopia_backup/kopia_server_deploy_win/DEPLOY.cmd b/kopia_backup/kopia_server_deploy_win/DEPLOY.cmd new file mode 100644 index 0000000..e66a7ac --- /dev/null +++ b/kopia_backup/kopia_server_deploy_win/DEPLOY.cmd @@ -0,0 +1,50 @@ +@echo off + +:: checking if the script is run as administrator +net session >nul 2>&1 +if %errorLevel% == 0 ( + echo - Success: Administrative permissions confirmed. +) else ( + echo - RUN AS ADMINISTRATOR + pause + exit /B +) + +echo - powershell ExecutionPolicy changing to Bypass +powershell.exe Set-ExecutionPolicy -ExecutionPolicy Bypass + +echo - checking if C:\Kopia folder exists, creating it if not +if not exist "C:\Kopia\" ( + mkdir C:\Kopia +) + +if exist "C:\Kopia\kopia_server_start.cmd" ( + echo - C:\Kopia\kopia_server_start.cmd exists, renaming it with random suffix + ren "C:\Kopia\kopia_server_start.cmd" "kopia_backup_scipt_%random%.ps1" +) + +echo - copying files to C:\Kopia +robocopy "%~dp0\" "C:\Kopia" "kopia.exe" /NDL /NJH /NJS +robocopy "%~dp0\" "C:\Kopia" "kopia_server_start.cmd" /NDL /NJH /NJS +robocopy "%~dp0\" "C:\Kopia" "win_vss_before.ps1" /NDL /NJH /NJS +robocopy "%~dp0\" "C:\Kopia" "win_vss_after.ps1" /NDL /NJH /NJS +echo. + +if exist C:\Windows\System32\Tasks\kopia_server_backup_start ( + echo - scheduled task with that name already exists, skipping + echo - delete the task in taskschd.msc if you want fresh import +) else ( + echo - importing scheduled task that starts Kopia Server on boot + schtasks /Create /XML "%~dp0\kopia_server_backup_start.xml" /tn "kopia_server_backup_start" +) + +echo - starting Kopia Server +schtasks /run /tn kopia_server_backup_start + +echo. +echo -------------------------------------------------------------- +echo. +echo DEPLOYMENT DONE +echo KOPIA SERVER CAN NOW BE FIND AT WEB PAGE: localhost:51515 +echo. +pause diff --git a/kopia_backup/kopia_server_deploy_win/kopia.exe b/kopia_backup/kopia_server_deploy_win/kopia.exe new file mode 100644 index 0000000..3878b58 Binary files /dev/null and b/kopia_backup/kopia_server_deploy_win/kopia.exe differ diff --git a/kopia_backup/kopia_server_deploy_win/kopia_server_backup_start.xml b/kopia_backup/kopia_server_deploy_win/kopia_server_backup_start.xml new file mode 100644 index 0000000..5b092aa Binary files /dev/null and b/kopia_backup/kopia_server_deploy_win/kopia_server_backup_start.xml differ diff --git a/kopia_backup/kopia_server_deploy_win/kopia_server_start.cmd b/kopia_backup/kopia_server_deploy_win/kopia_server_start.cmd new file mode 100644 index 0000000..5c385d4 --- /dev/null +++ b/kopia_backup/kopia_server_deploy_win/kopia_server_start.cmd @@ -0,0 +1,2 @@ +chdir /d C:\Kopia +start /B kopia server start --insecure --address=127.0.0.1:51515 --server-username=admin --server-password=aaa diff --git a/kopia_backup/kopia_server_deploy_win/win_vss_after.ps1 b/kopia_backup/kopia_server_deploy_win/win_vss_after.ps1 new file mode 100644 index 0000000..01c9fb8 --- /dev/null +++ b/kopia_backup/kopia_server_deploy_win/win_vss_after.ps1 @@ -0,0 +1,18 @@ +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_server_deploy_win/win_vss_before.ps1 b/kopia_backup/kopia_server_deploy_win/win_vss_before.ps1 new file mode 100644 index 0000000..e3692b1 --- /dev/null +++ b/kopia_backup/kopia_server_deploy_win/win_vss_before.ps1 @@ -0,0 +1,30 @@ +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/readme.md b/kopia_backup/readme.md index 5e6d3f5..bc19fb7 100644 --- a/kopia_backup/readme.md +++ b/kopia_backup/readme.md @@ -17,51 +17,47 @@ Backups. Kopia is a new open source backup utility with basicly **all** modern features.
Cross-platform, deduplication, encryption, compression, multithreaded speed, -native cloud storage support, GUI versions, repository replication, snapshots mounting,... +native cloud storage support, repository replication, snapshots mounting, +GUI versions, server version,... Written in golang. -In this setup kopia cli is used to backup docker containers and the host, -but general use and concepts are universal.
- # Some aspects of Kopia -* Kopia configuraiton uses term policies to apply to various - - global policy, from which repos inherit settings - - repos policy created on repo creation -* Backup configuration is stored in a repository where backups are stored.
-* You connect to a repository before using it, and disconnect afterwards.
- Only one repository can be connected at the time(at least for cli version). -* Currently to ignore a folder - `CACHEDIR.TAG` file can be placed inside, - with specific [content](https://bford.info/cachedir/) - and set policy: `--ignore-cache-dirs true` +There are 3 ways to go about running kopia + +* **cli** - Command line.
+ You call the binary passing some commands, it executes stuff, done.
+ Requires extra work - scripts with configs, scheduling. +* **KopiaUI** - GUI version of kopia.
+ Easier managment, takes uppon itself scheduling.
+ Drawback is that it runs under one user and only when logged in. +* **Kopia Server** - running kopia and its webserver in the background
+ Managment through web browser at an url, can run as a docker container. + +[Official Getting Started Guide](https://kopia.io/docs/getting-started/)
+[Official Features](https://kopia.io/docs/features/) + +* Kopia is a single ~35MB binary file. +* Backups are stored in a **repository** that needs to be created first, + and is always encrypted - requires password. + * Before any action, Kopia needs to connecto to a repo. +* **Snapshot**, appart from typical meaning, kopia also uses it to for + targets(paths) to be backed up. +* **Policy** is a term used to define behaviour of the backup/repo, + like backups retention, what to ignore, logging, scheduling(server/UI), + actions before and after backup,... +* **Policies** are stored inside a repo and can apply at various levels and + can inherit from each other + - global policy, the default that comes predefined during repo creation + - per user policy and per machine policy + - snapshot level policy, only applying for that one path * Maintence is automatic * .. -# Files and directory structure +# Kopia on a linux machine -``` -/home/ -│ └── ~/ -│ └── docker/ -│ ├── container-setup #2 -│ ├── container-setup #1 -│ ├── ... -│ -/mnt/ -│ └── mirror/ -│ └── KOPIA/ -│ └── arch_docker_host/ -│ -/opt/ - └── kopia-backup-home-etc.sh -``` - -only the script `kopia-backup-home-etc.sh` in /opt is created
-uf, systemd unit files too, but I am not "drawing" /etc/systemd/system/ up there... -even this will probably get deleted - -# The setup +cli version of kopia will be used, with a script and systemd-timers for scheduling. ### install kopia @@ -69,8 +65,14 @@ for arch linux, kopia is on AUR `yay kopia-bin` ### the initial steps +General use of sudo so that kopia has access everywhere. -use of sudo so that kopia has access everywhere
+* **repo creation** + +`mkdir -p /mnt/mirror/KOPIA/docker_host_kopia`
+`sudo kopia repo create filesystem --path /mnt/mirror/KOPIA/docker_host_kopia`
+`sudo kopia repo connect filesystem --path /mnt/mirror/KOPIA/docker_host_kopia`
+`sudo kopia repo status`
* **the policy info and change** @@ -78,13 +80,6 @@ use of sudo so that kopia has access everywhere
`sudo kopia policy list`
`sudo kopia policy set --global --ignore-cache-dirs true --keep-annual 1 --keep-monthly 6 --keep-weekly 4 --keep-daily 14 --keep-hourly 0 --keep-latest 14`
-* **repo creation** - -`mkdir -p /mnt/mirror/KOPIA/docker_host_kopia`
-`sudo kopia repository create filesystem --path /mnt/mirror/KOPIA/docker_host_kopia`
-`sudo kopia repository connect filesystem --path /mnt/mirror/KOPIA/docker_host_kopia`
-`sudo kopia repository status`
- * **manual run** `sudo kopia snapshot create /home/spravca/docker /etc`
@@ -92,17 +87,18 @@ use of sudo so that kopia has access everywhere
* **mounting a backup** -`sudo kopia snapshot list`
+`sudo kopia mount all /mnt/tmp &` - mounts all snapshots
+`sudo kopia snapshot list`
`sudo kopia mount k7e2b0a503edd7604ff61c68655cd5ad7 /mnt/tmp &`
`sudo umount /mnt/tmp`
-### the backup script +### The backup script `/opt/kopia-backup-home-etc.sh` ```bash #!/bin/bash -#sudo kopia policy set --global --ignore-cache-dirs true --keep-annual 1 --keep-monthly 6 --keep-weekly 4 --keep-daily 14 --keep-hourly 0 --keep-latest 14 +#sudo kopia policy set --global --keep-annual 1 --keep-monthly 6 --keep-weekly 4 --keep-daily 14 --keep-hourly 0 --keep-latest 14 REPOSITORY_PATH='/mnt/mirror/KOPIA/docker_host_kopia' BACKUP_THIS='/home /etc' @@ -112,6 +108,8 @@ kopia repository connect filesystem --path $REPOSITORY_PATH --password $KOPIA_PA kopia snapshot create $BACKUP_THIS kopia repository disconnect ``` +make the script executable
+`sudo chmod +x /opt/kopia-backup-home-etc.sh` ### Scheduled backups using systemd @@ -119,9 +117,11 @@ Usually cron is used, but systemd provides better logging and control, so better get used to using it.
[Heres](https://github.com/kopia/kopia/issues/2685#issuecomment-1384524828) some discussion on unit files.
-[ntfy](https://github.com/binwiederhier/ntfy) is used for notifications, +[ntfy](https://github.com/binwiederhier/ntfy) can be used for notifications, more info [here](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/gotify-ntfy-signal#linux-systemd-unit-file-service) +* `sudo micro /etc/systemd/system/kopia-home-etc.service` + ```kopia-home-etc.service``` ```ini [Unit] @@ -147,6 +147,7 @@ Environment="HOME=/root" ExecStart=/opt/kopia-backup-home-etc.sh ``` +* `sudo micro /etc/systemd/system/kopia-home-etc.timer` ```kopia-home-etc.timer``` ```ini @@ -162,6 +163,10 @@ Persistent=true WantedBy=timers.target ``` +* `sudo systemctl enable --now kopia-home-etc.timer` +* `systemctl status kopia-home-etc.timer` +* `journalctl -u kopia-home-etc.timer` - see history + # Mounting network storage using systemd * files are placed in `/etc/systemd/system` @@ -206,18 +211,53 @@ WantedBy=multi-user.target # Kopia in Windows -While GUI version seems like a way to go.. its not there yet. -The way the schedule is running - it uses is running only under a user, theres no certainty it will run. +## Kopia Server on Windows -So here goes cli version +* download this repo, delete shit, keep `kopia_server_deploy` folder +* run `DEPLOY.cmd`, it will + * Removes powershell scripts restriction. + * Creates folder `C:\Kopia` and kopies files there + * imports a task schedule that will start Kopia Server at boot +* visit in browser `localhost:51515` +* setup repo +* setup what to backup and schedule +* edit the `kopia_backup_scipt.ps1`, set what to backup and where +* for the same repo location execute
+ `sudo kopia repository create filesystem --path C:\Backup` +* run the script -* [download](https://github.com/kopia/kopia/releases/) latest named kopia-X.XX.X-windows-x64.zip -, \~11MB -* extract, move to `C:\kopia` -* download `win_vss_before.ps1` and `win_vss_after.ps1` from this repo, - or crete them from - [here](https://kopia.io/docs/advanced/actions/#windows-shadow-copy) -* kopia-backup-home-etc.sh +## Kopia cli on Windows + + +While GUI version seems like a way to go.. IMO its not there yet. +The schedule seems to be dependant on user logging in... +and general weird feeling of poor GUI quality. + +So here goes cli version. As after some hands-on experience with cli version +the GUI version might click in better too, later. + +* download this repo, delete shit, keep `kopia-deploy` folder +* run `DEPLOY.cmd`, it will + * Removes powershell scripts restriction. + * Install scoop, sudo, kopia. + * Creates folder `C:\Kopia` and kopies there
+ `kopia_backup_scipt.ps1` and the VSS ps1 before and after files. + * imports a task schedule +* edit the `kopia_backup_scipt.ps1`, set what to backup and where +* for the same repo location execute
+ `sudo kopia repository create filesystem --path C:\Backup` +* run the script + +To do the above things manualy: + +* install kopia using scoop + * open terminal as admin + * `Set-ExecutionPolicy RemoteSigned` + * `iex "& {$(irm get.scoop.sh)} -RunAsAdmin"` + * `scoop install sudo --global` + * `sudo scoop install kopia --global` +* download this repo, extract to `c:\kopia` +* edit kopia-backup-home-etc.sh as see fit * powershell as as administrator * --enable-actions @@ -227,3 +267,7 @@ So here goes cli version kopia policy set --before-folder-action "powershell -WindowStyle Hidden \before.ps1" kopia policy set --after-folder-action "powershell -WindowStyle Hidden \after.ps1" + + + +