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