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