Created
September 16, 2025 09:59
-
-
Save vooon/85a84f226af2d1d3add983a22b898e8a to your computer and use it in GitHub Desktop.
Backup Paperless-ngx data to Proxmox Backup Server on NixOS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { config, pkgs, ... }: | |
| let | |
| pbs_sh = pkgs.writeShellScriptBin "pbs.sh" '' | |
| set -o pipefail | |
| backup_log="$(mktemp -u -t pbs-backup.log.XXXXXX)" | |
| atexit() { | |
| rm -f "$backup_log" | |
| } | |
| trap atexit EXIT | |
| if [ -z "$HOSTNAME" ]; then | |
| export HOSTNAME="$(uname -n)" | |
| fi | |
| . /etc/pbs.env | |
| : "''${PBS_BACKUP_NAME:=rootfs}" | |
| : "''${PBS_PREFIX:=/}" | |
| ${pkgs.proxmox-backup-client}/bin/proxmox-backup-client backup --ns "$PBS_NAMESPACE" "''${PBS_BACKUP_NAME}.pxar:''${PBS_PREFIX}" "$@" 2>&1 | tee "$backup_log" | |
| rc=$? | |
| if [ -z "$GOTIFY_URL" ]; then | |
| exit $rc | |
| fi | |
| if [ $rc -ne 0 ]; then | |
| stat="failed rc=$rc" | |
| prio=9 | |
| else | |
| stat="successful" | |
| prio=1 | |
| fi | |
| ${pkgs.curl}/bin/curl "$GOTIFY_URL/message" -H "X-Gotify-Key: $GOTIFY_APP_TOKEN" -X POST \ | |
| -F "title=$HOSTNAME $PBS_BACKUP_NAME backup: $stat" \ | |
| -F "$(printf 'message=```\n%s\n```\n' "$(cat $backup_log)")" \ | |
| -F "priority=$prio" | |
| rc2=$? | |
| [ $rc -ne 0 ] && exit $rc | |
| exit $rc2 | |
| ''; | |
| in | |
| { | |
| environment.etc."pbs.env".text = '' | |
| # see https://pbs.proxmox.com/docs-1/backup-client.html#environment-variables | |
| export PBS_REPOSITORY="paperless@[email protected]:pbs-zpool" | |
| export PBS_PASSWORD="secret" | |
| export PBS_FINGERPRINT="5d:f4:b0..." | |
| # addon | |
| export PBS_NAMESPACE="cephfs" | |
| export PBS_BACKUP_NAME="data" | |
| export PBS_PREFIX="${config.services.paperless.dataDir}" | |
| # gotify | |
| export GOTIFY_URL="https://notify.example.com" | |
| export GOTIFY_APP_TOKEN="Asecret" | |
| ''; | |
| environment.systemPackages = with pkgs; [ | |
| pbs_sh | |
| ]; | |
| systemd.timers.pbs-paperless-data-backup = { | |
| description = "Backup Paperless data dir"; | |
| wantedBy = [ "timers.target" ]; | |
| timerConfig = { | |
| OnCalendar = "*-*-* 02:00:00"; | |
| Persistent = true; | |
| }; | |
| }; | |
| systemd.services.pbs-paperless-data-backup = { | |
| description = "Backup Paperless data dir"; | |
| unitConfig.RequiresMountsFor = [ "${config.services.paperless.dataDir}" ]; | |
| serviceConfig = { | |
| Type = "oneshot"; | |
| ExecStart = "${pbs_sh}/bin/pbs.sh"; | |
| RemainAfterExit = true; | |
| }; | |
| }; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment