Last active
March 19, 2025 19:07
-
-
Save flandersen/4b9a080445efa0b986f40c887ae00f5c to your computer and use it in GitHub Desktop.
Backup script for Paperless-ngx to be run e.g. in a Portainer Edge-Job
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Backup Script for Paperless-ngx | |
# This script creates a backup of the Paperless-ngx Docker stack. It performs the following steps: | |
# 1. Creates a temporary folder to store the files. | |
# 2. Stops the running Docker containers. | |
# 3. Copies the files to the temporary folder. | |
# 4. Restarts the Docker containers. | |
# 5. Creates a compressed archive of the copied files. | |
# 6. Uploads the backup archive using rclone. | |
# 7. Cleans up the temporary files. | |
# Define variables | |
dockerstack="paperless" | |
folder="paperless" | |
src1="/srv/$folder" | |
src2="/var/lib/docker/volumes/paperless_pgdata/_data" | |
src3="/var/lib/docker/volumes/paperless_redisdata/_data" | |
# zipfile1="$(date +"%Y-%m-%d")_paperless.zip" | |
zipfile1="paperless_backup.zip" | |
zipfile2="paperless_pgdata.zip" | |
zipfile3="paperless_redisdata.zip" | |
rclone_target="Consume:/paperless_backup" | |
tempfolder="$(uuidgen)" | |
# Function to create a temporary folder | |
create_temp_folder() { | |
mkdir -p "/tmp/$tempfolder" | |
if [ ! -d "/tmp/$tempfolder" ]; then | |
echo "Temp folder not found: /tmp/$tempfolder" >&2 | |
return 1 | |
fi | |
echo "Temporary folder created: /tmp/$tempfolder" | |
} | |
# Function to stop Docker containers | |
stop_containers() { | |
containers=$(docker ps -q --filter "name=$dockerstack") | |
if [ -z "$containers" ]; then | |
echo "No running containers found for the stack: $dockerstack" >&2 | |
return 1 | |
fi | |
echo "Stopping containers..." | |
docker stop $containers | |
} | |
# Function to start Docker containers | |
start_containers() { | |
docker start $containers | |
if [ $? -ne 0 ]; then | |
echo "Failed to start containers." >&2 | |
return 1 | |
fi | |
} | |
# Function to create an archive from the copied files | |
create_archive() { | |
src=$1 | |
zipfile=$2 | |
zip -r "$zipfile" "$src" | |
# tar czf "$zipfile" "$folder" # Alternative method to create a tarball instead of a zip file | |
if [ $? -ne 0 ]; then | |
echo "Failed to create archive $zipfile from $src." >&2 | |
return 1 | |
fi | |
} | |
# Function to upload the backup archive using rclone | |
upload_backup() { | |
zipfile=$1 | |
target=$2 | |
rclone copy "$zipfile" "$target" | |
if [ $? -ne 0 ]; then | |
echo "Failed to upload backup $zipfile." >&2 | |
return 1 | |
fi | |
echo "Backup uploaded successfully." | |
} | |
# Function to clean up temporary files | |
cleanup() { | |
rm -R "/tmp/$tempfolder" | |
echo "Cleanup completed." | |
} | |
# Main script execution | |
echo "Backup process started at $(date)" >&1 | |
create_temp_folder || exit 1 | |
stop_containers || exit 1 | |
start_containers || exit 1 | |
cd "/tmp/$tempfolder" | |
create_archive $src1 $zipfile1 || exit 1 | |
create_archive $src2 $zipfile2 || exit 1 | |
create_archive $src3 $zipfile3 || exit 1 | |
upload_backup $zipfile1 $rclone_target || exit 1 | |
upload_backup $zipfile2 $rclone_target || exit 1 | |
upload_backup $zipfile3 $rclone_target || exit 1 | |
cleanup | |
echo "Backup process completed at $(date)" >&1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment