Jellyfin Forum
Automated backup solution - Printable Version

+- Jellyfin Forum (https://forum.jellyfin.org)
+-- Forum: Off Topic (https://forum.jellyfin.org/f-off-topic)
+--- Forum: Self-hosting & Homelabs (https://forum.jellyfin.org/f-self-hosting-homelabs)
+--- Thread: Automated backup solution (/t-automated-backup-solution)



Automated backup solution - tim0502 - 2025-03-06

When using the following script you can automaticly create a backup and upload it to a remote location using rclone.
You need to have rclone configured before you can use this script.
Before use you need to edit to script to be used with your system.

#!/bin/bash

# Variables
BACKUP_DIRS=("/var/lib/jellyfin" "/etc/jellyfin")  # Directories to back up
DEST_DIR="/mnt/data/backup-temp"  # Local temp storage for ZIPs
ONEDRIVE_FOLDER="Backup/Jellyfin"  # Folder name in OneDrive
MAX_BACKUPS=3  # Maximum number of backups to keep
JELLYFIN_SERVICE="jellyfin"  # Jellyfin service name

# Timestamp format YYYYMMDD_HHMMSS
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
ZIP_FILE="$DEST_DIR/Jellyfin_backup_$TIMESTAMP.zip"

# Ensure destination directory exists
mkdir -p "$DEST_DIR"

# Stop Jellyfin before backup
echo "Stopping Jellyfin service..."
sudo systemctl stop "$JELLYFIN_SERVICE"

# Create a ZIP archive
echo "Creating backup archive..."
if zip -r "$ZIP_FILE" "${BACKUP_DIRS[@]}"; then
    echo "Backup created successfully: $ZIP_FILE"
else
    echo "Backup creation failed!"
    sudo systemctl start "$JELLYFIN_SERVICE"
    exit 1
fi

# Start Jellyfin after backup
echo "Starting Jellyfin service..."
sudo systemctl start "$JELLYFIN_SERVICE"

# Upload to OneDrive using rclone
export RCLONE_CONFIG=/home/tim/.config/rclone/rclone.conf
echo "Uploading backup to OneDrive..."
if rclone copy "$ZIP_FILE" onedrive:"$ONEDRIVE_FOLDER" --progress; then
    echo "Upload successful."
    rm "$ZIP_FILE"  # Remove local ZIP after upload
else
    echo "Upload failed!"
    exit 1
fi

# Delete oldest backups if more than $MAX_BACKUPS exist
echo "Checking for old backups to delete..."
BACKUPS_ON_ONEDRIVE=$(rclone lsf onedrive:"$ONEDRIVE_FOLDER" | sort | head -n -$MAX_BACKUPS)

for FILE in $BACKUPS_ON_ONEDRIVE; do
    echo "Deleting old backup: $FILE"
    rclone delete onedrive:"$ONEDRIVE_FOLDER/$FILE"
done