Added following additions: Ability to send notifications to Discord webhook. Ability to disable NTFY and Discord notifications if not needed. BACKUP_FILE_LOCATION variable to change the location when the backup files are located on the Home Assistant server.

This commit is contained in:
Phil 2024-11-27 21:16:36 +00:00
parent 8af78dc249
commit e6b7068fe5

View File

@ -1,6 +1,7 @@
#!/bin/bash
set -x
### Global Settings ###
# Set your Home Assistant SSH credentials
HA_SSH_KEY="SSH_PRIVATE_KEY" # Replace with your SSH Private key for HomeAssistant
HA_SSH_USER="SSH_USER" # Replace with your HomeAssistant server username (Default is root)
@ -10,23 +11,59 @@ HA_SSH_PORT="SSH_PORT" # Replace with your HomeAssistant server port
# Set the backup destination path
BACKUP_DEST="BACKUP_FILE_DESTINATION" # Replace with the location for the backup files
# Set your ntfy topic and URL
NTFY_TOPIC="NTFY_TOPIC" # Replace with your ntfy topic
# ntfy settings
NTFY_ENABLED=false # Set to 'true' to enable ntfy notifications
NTFY_SERVER="NTFY_SERVER_FQDN_ADDRESS" # Replace with your ntfy server address
NTFY_TOPIC="NTFY_TOPIC" # Replace with your ntfy topic
# Discord webhook settings
DISCORD_ENABLED=false # Set to 'true' to enable Discord notifications
DISCORD_WEBHOOK_URL="DISCORD_WEBHOOK_URL" # Replace with your Discord webhook URL
# Set clean up old backups (adjust the number of days to keep)
BACKUP_FILE_CLEANUP="90" # Set the number of days that backup files will be kept for (Default 90 days)
# Set the location of the Home Assistant backups (Set to default location /backup)
# If you have a custom install, using the likes of Supervised
# this location should normally be /usr/share/hassio/backup
BACKUP_FILE_LOCATION="/backup"
### Script ###
### Function for sending notifications ###
send_ntfy_notification() {
local message=$1
if [ "$NTFY_ENABLED" = true ]; then
curl -X POST -d "$message" $NTFY_URL
fi
}
send_discord_notification() {
local message=$1
if [ "$DISCORD_ENABLED" = true ]; then
curl -X POST -H "Content-Type: application/json" -d '{"content": "'"$message"'"}' $DISCORD_WEBHOOK_URL
fi
}
# ntfy URL setup
NTFY_URL="$NTFY_SERVER/$NTFY_TOPIC"
# Timestamp variable for consistent naming
TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S')
# Start the timer
START_TIME=$(date +%s)
# Send notification that backup has started
curl -X POST -d "Backup process started at $TIMESTAMP" $NTFY_URL
send_ntfy_notification "Backup process started at $TIMESTAMP"
send_discord_notification "Backup process started at $TIMESTAMP"
# Create a backup on the Home Assistant server and extract the slug
BACKUP_OUTPUT=$(ssh -i "$HA_SSH_KEY" -p "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST" "ha backup new --name=auto_backup_$TIMESTAMP")
if [ $? -ne 0 ]; then
# Send notification if backup creation fails
curl -X POST -d "Error: Failed to create backup on Home Assistant server." $NTFY_URL
send_ntfy_notification "Error: Failed to create backup on Home Assistant server."
send_discord_notification "Error: Failed to create backup on Home Assistant server."
echo "Error: Failed to create backup on Home Assistant server."
exit 1
fi
@ -35,43 +72,62 @@ fi
BACKUP_SLUG=$(echo "$BACKUP_OUTPUT" | awk '/slug:/ {print $2}' | tr -d '\r')
if [ -z "$BACKUP_SLUG" ]; then
# Send notification if backup slug extraction fails
curl -X POST -d "Error: Failed to extract backup slug." $NTFY_URL
send_ntfy_notification "Error: Failed to extract backup slug."
send_discord_notification "Error: Failed to extract backup slug."
echo "Error: Failed to extract backup slug."
exit 1
fi
# Send notification that backup was created
curl -X POST -d "Backup created successfully with slug: $BACKUP_SLUG" $NTFY_URL
send_ntfy_notification "Backup created successfully with slug: $BACKUP_SLUG"
send_discord_notification "Backup created successfully with slug: $BACKUP_SLUG"
# Create a filename for the backup
BACKUP_FILE="$BACKUP_DEST/${TIMESTAMP}_${BACKUP_SLUG}.tar"
# Copy the backup file from Home Assistant to your local machine
scp -i "$HA_SSH_KEY" -P "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST:/usr/share/hassio/backup/${BACKUP_SLUG}.tar" "$BACKUP_FILE"
scp -i "$HA_SSH_KEY" -P "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST:$BACKUP_FILE_LOCATION/${BACKUP_SLUG}.tar" "$BACKUP_FILE"
if [ $? -ne 0 ]; then
# Send notification if backup copy fails
curl -X POST -d "Error: Failed to copy backup to local machine." $NTFY_URL
send_ntfy_notification "Error: Failed to copy backup to local machine."
send_discord_notification "Error: Failed to copy backup to local machine."
echo "Error: Failed to copy backup to local machine."
exit 1
fi
# Send notification that backup file was copied successfully
curl -X POST -d "Backup file successfully copied to: $BACKUP_FILE" $NTFY_URL
# Get the size of the backup file
BACKUP_FILE_SIZE=$(stat -c %s "$BACKUP_FILE")
if [ $? -ne 0 ]; then
send_ntfy_notification "Error: Failed to get backup file size."
send_discord_notification "Error: Failed to get backup file size."
echo "Error: Failed to get backup file size."
exit 1
fi
# Clean up old backups if needed (adjust the number of days to keep)
find "$BACKUP_DEST" -name '*.tar' -mtime +90 -exec rm {} \;
if [ $? -ne 0 ]; then
# Send notification if cleanup fails
curl -X POST -d "Error: Failed to clean up old backups." $NTFY_URL
send_ntfy_notification "Error: Failed to clean up old backups."
send_discord_notification "Error: Failed to clean up old backups."
echo "Error: Failed to clean up old backups."
exit 1
fi
# Send notification that the cleanup was successful
curl -X POST -d "Old backups cleaned up successfully." $NTFY_URL
send_ntfy_notification "Old backups cleaned up successfully."
send_discord_notification "Old backups cleaned up successfully."
# Success message
echo "Backup completed successfully: $BACKUP_FILE"
# Send notification that the backup was completed
curl -X POST -d "Backup completed successfully: $BACKUP_FILE" $NTFY_URL
send_ntfy_notification "Backup completed successfully: $BACKUP_FILE"
send_discord_notification "Backup completed successfully: $BACKUP_FILE"
# Get the total time taken by the script
END_TIME=$(date +%s)
RUNTIME=$((END_TIME - START_TIME))
# Send notification with backup file size and script runtime
send_ntfy_notification "Backup file size: $BACKUP_FILE_SIZE bytes. Script runtime: $RUNTIME seconds."
send_discord_notification "Backup file size: $BACKUP_FILE_SIZE bytes. Script runtime: $RUNTIME seconds."