Copy DB to backup storage to speed up desaster restore on another computer? Blocksize on restore?

Solution to copy the DB to the target storage after a successful job execution:

  • Create file: “/root/.config/Duplicati/duplicati-post.sh” with content:
#!/bin/bash
#
# Command line.
## bash /root/.config/Duplicati/duplicati-post.sh
#
# Unit test.
## clear; bash /root/.config/Duplicati/duplicati-post.sh debug
#
# Purpose
## Copy duplicati job database to target storage.
#
# Runtime Variables.
DEBUG_MODE="0"
if [ "${1}" = "debug" ]; then
	DEBUG_MODE="1"
fi
#
# Validate env vars.
if  [ -z "${DUPLICATI__backup_name}" ]; then
	export DUPLICATI__backup_name="API_ERR"
fi
#
if  [ -z "${DUPLICATI__PARSED_RESULT}" ]; then
	export DUPLICATI__PARSED_RESULT="API_ERR"
fi
#
if  [ -z "${DUPLICATI__EVENTNAME}" ]; then
	export DUPLICATI__EVENTNAME="API_ERR"
fi
#
if  [ -z "${DUPLICATI__OPERATIONNAME}" ]; then
	export DUPLICATI__OPERATIONNAME="API_ERR"
fi
#
if  [ -z "${DUPLICATI__REMOTEURL}" ]; then
	export DUPLICATI__REMOTEURL="API_ERR"
fi
#
if  [ -z "${DUPLICATI__dbpath}" ]; then
	export DUPLICATI__dbpath="API_ERR"
fi
#
if [ "${DEBUG_MODE}" = "1" ]; then
	# env | grep "DUPLICATI__" > "/tmp/duplicati-post-env.txt"
	#
	STORAGE_IP="192.168.1.200"
	STORAGE_PORT="22"
	STORAGE_USER="admin"
	STORAGE_PWD="xx"
	STORAGE_PATH="/duplicati/test"
	STORAGE_SSH_FP=""
	export DUPLICATI__REMOTEURL="ssh://${STORAGE_IP}:${STORAGE_PORT}/${STORAGE_PATH}?auth-username=${STORAGE_USER}&auth-password=${STORAGE_PWD}&ssh-fingerprint=${STORAGE_SSH_FP}"
	export DUPLICATI__dbpath="/root/.config/Duplicati/MJPPEEFGCM.sqlite"
	#
	STORAGE_PORT="21"
	export DUPLICATI__REMOTEURL="aftp://${STORAGE_IP}:${STORAGE_PORT}/${STORAGE_PATH}/?auth-username=${STORAGE_USER}&auth-password=${STORAGE_PWD}"
fi
#
#
# ===============
# FUNCTIONS START
# ===============
ftpUpload () {
	#
	# Syntax
	## ftpUpload
	#
	curl -s --max-time 600 --user "${REMOTE_USER}:${REMOTE_PWD}" --upload-file "${DUPLICATI__dbpath}" "ftp://${REMOTE_IP}:${REMOTE_PORT}/${REMOTE_PATH}/" 
	FTP_RESULT="$?"
	if [ ${FTP_RESULT} -eq 0 ]; then
		echo "[INFO] ftpUpload SUCCEEDED."
	else
		echo "[ERROR] ftpUpload FAILED, code ${FTP_RESULT}."
	fi
	return ${FTP_RESULT}
}


sshUpload () {
	#
	# Syntax
	## sshUpload
	#
	# grep -q "${REMOTE_SSH_FP}" "/root/.ssh/known_hosts" 2>/dev/null || echo "${REMOTE_SSH_FP}" >> "/root/.ssh/known_hosts"
	sshpass -p "${REMOTE_PWD}" scp -o StrictHostKeyChecking=no -P "${REMOTE_PORT}" "${DUPLICATI__dbpath}" "${REMOTE_USER}@${REMOTE_IP}:/${REMOTE_PATH}/"
	SCP_RESULT="$?"
	if [ ${SCP_RESULT} -eq 0 ]; then
		echo "[INFO] sshUpload SUCCEEDED."
	else
		echo "[ERROR] sshUpload FAILED, code ${SCP_RESULT}."
	fi
	return ${SCP_RESULT}
}


function urldecode () { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
# ===============
# FUNCTIONS END
# ===============
#
# Parse DUPLICATI__REMOTEURL.
REMOTE_PROTO="$(echo "${DUPLICATI__REMOTEURL}" | grep -o "^.*://")"
REMOTE_IP="$(echo "${DUPLICATI__REMOTEURL}" | sed -n -e 's~^.*://\([^:/]*\)[:/].*~\1~p')"
REMOTE_PORT="$(echo "${DUPLICATI__REMOTEURL}" | sed -n -e 's~^.*://[^/]*:\([^/]*\)/.*~\1~p')"
REMOTE_USER="$(echo "${DUPLICATI__REMOTEURL}" | sed -n -e 's/^.*auth-username=\([^&]*\)&.*/\1/p')"
REMOTE_PWD="$(urldecode "$(echo "${DUPLICATI__REMOTEURL}&" | sed -n -e 's/^.*auth-password=\([^&]*\)&.*/\1/p')")"
REMOTE_PATH="$(echo "${DUPLICATI__REMOTEURL}" | sed -n -e 's~^.*://[^/]*/\([^&]*\)?.*~\1~p')"
REMOTE_SSH_FP="$(echo "${DUPLICATI__REMOTEURL}" | sed -n -e 's/^.*ssh-fingerprint=\([^&]*\)$/\1/p')"
#
if [ "${DEBUG_MODE}" = "1" ]; then
	echo "[INFO] REMOTE_PROTO=[${REMOTE_PROTO}]"
	echo "[INFO] REMOTE_IP=[${REMOTE_IP}]"
	echo "[INFO] REMOTE_PORT=[${REMOTE_PORT}]"
	echo "[INFO] REMOTE_USER=[${REMOTE_USER}]"
	echo "[INFO] REMOTE_PWD=[${REMOTE_PWD}]"
	echo "[INFO] REMOTE_PATH=[${REMOTE_PATH}]"
	echo "[INFO] REMOTE_SSH_FP=[${REMOTE_SSH_FP}]"
fi
#
#
if ( echo "${REMOTE_PROTO}" | grep -q "^ftp://\|aftp://" ); then
	if ( ! which curl >/dev/null 2>&1 ); then
		echo "[ERROR] curl is missing. Please run: apt-get -y install curl"
		exit 99
	fi
	#
	if [ -z "${REMOTE_PORT}" ]; then
		REMOTE_PORT="21"
	fi
	#
	ftpUpload
elif [ "${REMOTE_PROTO}" = "ssh://" ]; then
	if ( ! which sshpass >/dev/null 2>&1 ); then
		echo "[ERROR] sshpass is missing. Please run: apt-get -y install sshpass"
		exit 99
	fi
	#
	if [ -z "${REMOTE_PORT}" ]; then
		REMOTE_PORT="22"
	fi
	#
	sshUpload
else
	echo "[ERROR] Unknown protocol [${REMOTE_PROTO}]. Stop."
	exit 99
fi
#
exit 0


In the Duplicati job itself, add the following expert option during config step 5:

run-script-after
/root/.config/Duplicati/duplicati-post.sh

Works fine for me. Currently supported protocols: FTP, AFTP, SSH

1 Like

fyi: I’ve updated the above script to urldecode special chars in the password.