--- category: - "[[Journal]]" type: - "[[Log]]" title: migrating to truenas, sanoid+syncoid backup created: 2026-05-17T11:29:26 date: 2026-05-17 tags: --- So I'm going to try running [[TrueNAS|truenas]] on my backup machine rather than [[Proxmox|proxmox]] with [[Sanoid and Syncoid|sandoid+synoid]]. here are my current config and scripts on the `/etc/sanoid/sanoid.conf` ``` ######################## # stanleypool datasets # ######################## [stanleypool/archive]     use_template = stanleypool-nightly     recursive = zfs     process_children_only = no [stanleypool/bobbie]     use_template = stanleypool-nightly     recursive = zfs     process_children_only = no [stanleypool/music]     use_template = stanleypool-nightly     recursive = zfs     process_children_only = no [stanleypool/photos]     use_template = stanleypool-nightly     recursive = zfs     process_children_only = no [stanleypool/video]     use_template = stanleypool-nightly     recursive = zfs     process_children_only = no ############# # templates # ############# [template_stanleypool-nightly]     frequently = 0     hourly = 0     daily = 90     weekly = 26     monthly = 24     yearly = 0     autosnap = no     autoprune = yes     prune_defer = 80 ``` `/usr/local/bin/zfs-nightly-backup.sh` ``` #!/bin/bash GLOBAL_TIMEOUT="6h" # --- CRASH SAFETY NET --- # If the script exits prematurely for ANY reason, run the shutdown function failure_cleanup() {     echo "$(date '+[%Y-%m-%d %H:%M:%S]') CRITICAL: Script terminated unexpectedly! Triggering safety shutdown."     ssh root@pve-shug9 "/sbin/shutdown +10 'Nightly backup crashed, shutting down in 10 minutes'"     /sbin/shutdown +10 "Nightly backup crashed, shutting down in 10 minutes" } # Trap standard exit signals (1 = General errors, 2 = Ctrl+C, 15 = Terminate) trap 'if [ "$EXIT_STATUS" != "0" ] && [ "$EXIT_STATUS" != "124" ]; then failure_cleanup; fi' EXIT run_backups() {     # pull existing snapshots from source (thinkstation)     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=pull --preserve-recordsize --preserve-properties root@pve-thinkstation:noggapool/bobbie stanleypool/bobbie     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=pull --preserve-recordsize --preserve-properties root@pve-thinkstation:noggapool/photos stanleypool/photos     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=pull --preserve-recordsize --preserve-properties root@pve-thinkstation:noggapool/archive stanleypool/archive     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=pull --preserve-recordsize --preserve-properties root@pve-thinkstation:noggapool/music stanleypool/music     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=pull --preserve-recordsize --preserve-properties root@pve-thinkstation:noggapool/video stanleypool/video     sleep 10     # push to remote (shug9)     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=push --preserve-recordsize --preserve-properties root@pve-shug9:bathpool/bobbie stanleypool/bobbie     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=push --preserve-recordsize --preserve-properties stanleypool/photos root@pve-shug9:bathpool/photos     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=push --preserve-recordsize --preserve-properties stanleypool/archive root@pve-shug9:bathpool/archive     sleep 10     /usr/sbin/syncoid --quiet -r --no-sync-snap --create-bookmark --use-hold --identifier=push --preserve-recordsize --preserve-properties stanleypool/music root@pve-shug9:bathpool/music     sleep 10     # only run the prune after successful transfers     ssh root@pve-shug9 "/usr/sbin/sanoid --quiet --prune-snapshots"     sleep 5     /usr/sbin/sanoid --quiet --prune-snapshots     sleep 5     echo "Backup script completed successfully." } # Export the function so the timeout subshell can see it export -f run_backups # Run the function wrapped in the timeout utility timeout "$GLOBAL_TIMEOUT" bash -c run_backups EXIT_STATUS=$? # --- EVALUATE EXIT STATE FOR LOGGING --- if [ $EXIT_STATUS -eq 124 ]; then     echo "$(date '+[%Y-%m-%d %H:%M:%S]') ERROR: Script exceeded global timeout of $GLOBAL_TIMEOUT. Aborting." elif [ $EXIT_STATUS -ne 0 ]; then     echo "$(date '+[%Y-%m-%d %H:%M:%S]') ERROR: Backup function failed with exit code $EXIT_STATUS." else     echo "$(date '+[%Y-%m-%d %H:%M:%S]') Success: All replication steps completed." fi # --- UNCONDITIONAL 10-MINUTE DELAYED SHUTDOWN --- # This runs normally for Success or Timeout states. # (General script crashes bypass this and hit the 'trap' function at the top). ssh root@pve-shug9 "/sbin/shutdown +10 'Nightly backup/replication sequence finished, shutting down in 10 minutes'" /sbin/shutdown +10 "Nightly backup/replication sequence finished, shutting down in 10 minutes" exit $EXIT_STATUS ```