This tutorial covers how to backup your ROMs, BIOS and SAVE-games of your Batocera machine to a Cloud Storage. This allows you to recover your data easily to a previous state in case of data loss or restore data on a new installation.
Some small words at the beginning: What is rclone? Copying files can be done with numerous user interfaces, but rclone is a command-line tool specifically designed for copying files between cloud servers and another server or workstation. With simple tools, an interruption in service stops the file synchronization and copying processes. The rclone tool can recover if the connection between the workstation and server is interrupted.
Several notable cloud services support rclone including Amazon S3 buckets, Microsoft OneDrive, Dropbox, Google Cloud Storage, Google Drive, Microsoft Azure Blob and File Storage, and several other providers. Administrators use rclone for unidirectional file synchronization, meaning that files are copied from a source to a destination only.
Up to now (06/2025) these providers are supported:
1Fichier, Akamai Netstorage, Amazon S3 (or S3 compatible), Backblaze B2, Box, Citrix ShareFile, Cloudinary, Dropbox, Enterprise File Fabric, Files.com, FTP, Gofile, Google Cloud Storage, Google Drive, Google Photos, HDFS, HiDrive, HTTP, iCloud Drive, Internet Archive, Jottacloud, Koofr, Linkbox, Mail.ru Cloud, Mega, Memory, Microsoft Azure Blob Storage, Microsoft Azure Files Storage, Microsoft OneDrive, OpenDrive, OpenStack Swift, Oracle Object Storage, pCloud, PikPak, Pixeldrain, premiumize.me, put.io, Proton Drive, QingStor, Quatrix by Maytech, Seafile, SFTP, Sia, SMB, SugarSync, Storj, Uloz.to, Uptobox, WebDAV, Yandex Disk, Zoho WorkDrive, The local filesystem
The bold marked entries suggest that rclone can be used with really any Provider or network system. But consider then that for local FS it would be better to use rsync for example
You can always take a look here for a supported cloud storages
Now we want to setup rclone from Batocera. These instructions only work for Koofr, please visit
rclone config No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n
nbackup or your provider name yourCloudProvideryourCloudProvider rclone-------------------- [yourProvider] type = yourCloudProvider provider = yourCloudProvider user = USERNAME password = *** ENCRYPTED *** -------------------- y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y
y and everything is set and ready, wen need to make some test nowIt's worth the matter but please … we can't provide information for every usecase.
Remeber which name you entered? backup or yourCloudProvider?
List directories in top level of your yourCloudProvider
rclone lsd yourCloudProvider:
List all the files in your yourCloudProvider
rclone ls yourCloudProvider:
To copy a local directory to a directory called backup
rclone copy /home/source yourCloudProvider:backup
A fellow user created a nice service script that will hit the purpose. So thank you Peter Boszo for your nice service script
Be aware this script syncs only to the storage. So if you fire up this on a new installation, all your files will be overwritten.
This is caused by the –sync flag.
For preservatoin purposes it is included into this wiki as well with a nice addition that the name of the setted Provider can be changed.
#!/bin/bash # ------------------------------- CONFIG BEGIN -------------------------------- # The location of Batocera data on your cloud storage. destDir=/Batocera # Waiting time between two backups in seconds. # The below configuration means that the service will do a backup every minute. waitSeconds=60 # Change name setted from rclone config as name, default is backup rcloneName=backup # If set to true, logs from all runs of the service are preserved. # If set to false, only logs since the last start of the service are kept. keepLogs=false # -------------------------------- CONFIG END --------------------------------- runFile=/var/run/backup-service logFile=/var/log/backup-service.log # This needs to be set explicitly, because $HOME is not set when the service is started by Batocera. export RCLONE_CONFIG=/userdata/system/.config/rclone/rclone.conf manual() { echo "> CONFIG sync" ------------------------------------------------------------------------------------ rclone sync /userdata/system/batocera.conf ${rcloneName}:${destDir}/system --progress echo "> SAVES sync" ------------------------------------------------------------------------------------- rclone sync /userdata/saves ${rcloneName}:${destDir}/saves --exclude "flatpak/**" --progress echo "> ROMS sync" -------------------------------------------------------------------------------------- rclone sync /userdata/roms ${rcloneName}:${destDir}/roms --exclude "flatpak/**" --progress echo "> BIOS sync" -------------------------------------------------------------------------------------- rclone sync /userdata/bios ${rcloneName}:${destDir}/bios --progress } start() { touch ${runFile} if [ "$keepLogs" = false ]; then rm -f ${logFile} fi timeStamp="$(date)" echo -e "\n--- SERVICE START - [${timeStamp}] ---\n" >>${logFile} while test -e ${runFile}; do sleep ${waitSeconds} rclone sync /userdata/saves ${rcloneName}:${destDir}/saves --exclude "flatpak/**" --log-file ${logFile} --log-level INFO done } stop() { rm -f ${runFile} } status() { if test -e ${runFile}; then echo "Backup service is running. Logs: ${logFile}" else echo "Backup service is not running." fi } case "$1" in manual) manual ;; start) start & ;; stop) stop ;; status) status ;; *) echo "Usage: https://gitlab.com/peterbozso/batocera-backup-service" ;; esac