Skip to content

Instantly share code, notes, and snippets.

@flandersen
Last active March 19, 2025 19:07
Show Gist options
  • Save flandersen/4b9a080445efa0b986f40c887ae00f5c to your computer and use it in GitHub Desktop.
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
#!/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