After searching for a solution to automatically backup the TrueNAS config file I have created this script.
This is not my original work, it is heavily edited from the information posted in this thread by users 'NasKar' and 'engedics'.
Run this script as a CRON job to backup your config as often as you like. It even deletes old backups (if configured to).
There are 5 user configurable variables that you need to set before you run the script.
This definitely works on SCALE, not sure if it works on CORE.
And it's only just occurred to me that there should be no reason that it needs to even be run on the TrueNAS server, it should be able to be run on a remote server (that has access to the TrueNAS server obviously). In that case the "backuploc" variable would be a directory on the server running the script.
This is not my original work, it is heavily edited from the information posted in this thread by users 'NasKar' and 'engedics'.
Run this script as a CRON job to backup your config as often as you like. It even deletes old backups (if configured to).
There are 5 user configurable variables that you need to set before you run the script.
This definitely works on SCALE, not sure if it works on CORE.
And it's only just occurred to me that there should be no reason that it needs to even be run on the TrueNAS server, it should be able to be run on a remote server (that has access to the TrueNAS server obviously). In that case the "backuploc" variable would be a directory on the server running the script.
Code:
# Script to backup TrueNAS SCALE configuration file # WARNING: DOES NOT CHECK IF A VALID BACKUP IS ACTUALLY CREATED # # # Thanks to 'NasKar' and 'engedics' from this thread: https://www.truenas.com/community/threads/best-way-to-get-auto-config-backup.94537/ # # # If a valid backup file is not created then there is something wrong with the API call # Check that your URL and API Key are both correct # # # # # # # # # # # # # # # # # # USER CONFIGURABLE VARIABLES # # # # # # # # # # # # # # # # # # Server IP or URL (include http(s)://) serverURL="https://<SERVER IP OR URL>" # TrueNAS API key (Generate from 'User Icon' -> 'API Keys' in TrueNAS WebGUI) apiKey="<API KEY>" # Include Secret Seed (true| false) secSeed=true # Path on server to store backups backuploc="<PATH TO STORE BACKUPS>" # Max number of backups to keep (set as 0 to never delete anything) maxnrOfFiles=5 # # # # # # # # # # # # # # # # # # # END USER CONFIGURABLE VARIABLES # # # # # # # # # # # # # # # # # # # echo echo "Backing up current TrueNAS config" # Check current TrueNAS version number versiondir=`cat /etc/version | cut -d' ' -f1` # Set directory for backups to: 'path on server' / 'current version number' backupMainDir="${backuploc}/${versiondir}" # Create directory for for backups (Location/Version) mkdir -p $backupMainDir # Use appropriate extention if we are exporting the secret seed if [ $secSeed = true ] then fileExt="tar" echo "Secret Seed will be included" else fileExt="db" echo "Secret Seed will NOT be included" fi # Generate file name fileName=$(hostname)-TrueNAS-$(date +%Y%m%d%H%M%S).$fileExt # API call to backup config and include secret seed curl --no-progress-meter \ -X 'POST' \ $serverURL'/api/v2.0/config/save' \ -H 'Authorization: Bearer '$apiKey \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{"secretseed": '$secSeed'}' \ --output $backupMainDir/$fileName echo echo "Config saved to ${backupMainDir}/${fileName}" # # The next section checks for and deletes old backups # # Will not run if $maxnrOfFiles is set to zero (0) # if [ ${maxnrOfFiles} -ne 0 ] then echo echo "Checking for old backups to delete" echo "Number of files to keep: ${maxnrOfFiles}" # Get number of files in the backup directory nrOfFiles="$(ls -l ${backupMainDir} | grep -c "^-.*")" echo "Current number of files: ${nrOfFiles}" # Only do something if the current number of files is greater than $maxnrOfFiles if [ ${maxnrOfFiles} -lt ${nrOfFiles} ] then nFileToRemove="$((nrOfFiles - maxnrOfFiles))" echo "Removing ${nFileToRemove} file(s)" while [ $nFileToRemove -gt 0 ] do fileToRemove="$(ls -t ${backupMainDir} | tail -1)" echo "Removing file ${fileToRemove}" nFileToRemove="$((nFileToRemove - 1))" rm ${backupMainDir}/${fileToRemove} done fi # Inform the user that no files will be deleded if $maxnrOfFiles is set to zero (0) else echo echo "NOT deleting old backups because '\$maxnrOfFiles' is set to 0" fi #All Done echo echo "DONE!" echo