Skip to content

Instantly share code, notes, and snippets.

@vooon
Created September 16, 2025 09:59
Show Gist options
  • Select an option

  • Save vooon/85a84f226af2d1d3add983a22b898e8a to your computer and use it in GitHub Desktop.

Select an option

Save vooon/85a84f226af2d1d3add983a22b898e8a to your computer and use it in GitHub Desktop.
Backup Paperless-ngx data to Proxmox Backup Server on NixOS
{ 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