From f5c52389e6a6638fa2f96455bf5e7e3a93bcb0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Fernandes?= Date: Sat, 10 Jun 2023 05:02:31 +0100 Subject: [PATCH 1/4] . --- README.md | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 24f35c6..08266be 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # Duplicati + +## Scripts + + + ## Custom Docker Images ### Duplicati with mySql Client @@ -32,24 +37,6 @@ duplicati-cli send-mail --send-mail-password="pass" --send-mail-to="target@mail. ``` ## Scripts -### Transfer To another system -1. Copy docker compose and execute on another system -2. Check volumes and service started succesfully -3. Stop all compose services -4. Change volume on duplicati service to user a temporary volume example (duclicati_tmpdata) -5. Check if all volumes are writable on duplication service -6. Start only the duplicati service (with temporary volume) on target system -7. On source system Stop app services on docker compose except duplicati -8. Execute a full backup ou source system -9. On target system execute a manual restore to original destination -10. Stop duplicati -11. Change duplicati to use original volume -12. And change volumes on duplicati to RO -13. Start all services -14. Check everything ok - -### Environment Variables - _Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_ - DUPLICATI__EVENTNAME -- 2.49.1 From 1b8e7fde9b288fd5814072627f7239132f196819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Fernandes?= Date: Sat, 10 Jun 2023 05:02:55 +0100 Subject: [PATCH 2/4] . --- docker/mysqlclient/Dockerfile | 11 ++- docker/mysqlclient/README.md | 17 ++++ scripts/duplicati-influxdb-notify | 94 +++++++++++++++++++ .../duplicati-mysql-backup | 0 4 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 scripts/duplicati-influxdb-notify rename docker/mysqlclient/scripts/backupdb.sh => scripts/duplicati-mysql-backup (100%) diff --git a/docker/mysqlclient/Dockerfile b/docker/mysqlclient/Dockerfile index 33d7bae..33013b3 100644 --- a/docker/mysqlclient/Dockerfile +++ b/docker/mysqlclient/Dockerfile @@ -1,9 +1,10 @@ #check ../README.md for more information - FROM duplicati/duplicati RUN apt update && apt install -y default-mysql-client && rm -rf /var/lib/apt/lists/* -RUN mkdir duplicati-mysqlclient -RUN mkdir duplicati-mysqlclient/scripts -COPY /docker/mysqlclient/scripts/* /duplicati-mysqlclient/scripts/ -RUN chmod +x /duplicati-mysqlclient/scripts/* + + +COPY /scripts/* /usr/local/bin +RUN chmod +x /usr/local/bin/duplicati-influxdb-notify +RUN chmod +x /usr/local/bin/duplicati-mysql-backup + EXPOSE 8200 \ No newline at end of file diff --git a/docker/mysqlclient/README.md b/docker/mysqlclient/README.md index 7b89966..979bc3f 100644 --- a/docker/mysqlclient/README.md +++ b/docker/mysqlclient/README.md @@ -58,3 +58,20 @@ volumes: duplicati-data: db-dumps: ```` +### Transfer To another system +1. Copy docker compose and execute on another system +2. Check volumes and service started succesfully +3. Stop all compose services +4. Change volume on duplicati service to user a temporary volume example (duclicati_tmpdata) +5. Check if all volumes are writable on duplication service +6. Start only the duplicati service (with temporary volume) on target system +7. On source system Stop app services on docker compose except duplicati +8. Execute a full backup ou source system +9. On target system execute a manual restore to original destination +10. Stop duplicati +11. Change duplicati to use original volume +12. And change volumes on duplicati to RO +13. Start all services +14. Check everything ok + +### Environment Variables \ No newline at end of file diff --git a/scripts/duplicati-influxdb-notify b/scripts/duplicati-influxdb-notify new file mode 100644 index 0000000..dd70c92 --- /dev/null +++ b/scripts/duplicati-influxdb-notify @@ -0,0 +1,94 @@ +#!/bin/bash + +#/etc/default/influxdb-connection example +#INFLUDB_SERVER=http://192.168.1.201:8086 +#INFLUDB_BUCKET=bucketname +#INFLUDB_ORG=orgname +#INFLUDB_TOKEN=Token xxxx +if [ -f "/etc/default/duplicati-influxdb" ]; then +export $(cat /etc/default/duplicati-influxdb) +fi + +if [ -f "~/.config/duplicati-influxdb" ]; then +export $(cat ~/default/duplicati-influxdb) +fi + +#duplicati +#DUPLICATI__EVENTNAME="zbf dc fbz" +#DUPLICATI__OPERATIONNAME="yy" +#DUPLICATI__PARSED_RESULT="p gfh uasd" +#DUPLICATI__backup_name="puggb" +#DUPLICATI__RESULTFILE="sd gasd" +#DUPLICATI__LOCALPATH="sagd" +# + +TAGS="" +MESSAGE_FIELD_VALUE="" + + +UNSCAPED="" +ESCAPED="" + +escape_tag_str () { + ESCAPED=${UNSCAPED//[ ]/\\ } +} + + + +if [[ ! -z "$HOSTNAME" ]]; then + UNSCAPED=$HOSTNAME + escape_tag_str + TAGS="${TAGS},host=${ESCAPED}" + MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${HOSTNAME}" +fi + +if [[ ! -z "$DUPLICATI__EVENTNAME" ]]; then + UNSCAPED=$DUPLICATI__EVENTNAME + escape_tag_str + TAGS="${TAGS},eventName=\"${ESCAPED}\"" +fi + +if [[ ! -z "$DUPLICATI__OPERATIONNAME" ]]; then + UNSCAPED=$DUPLICATI__OPERATIONNAME + escape_tag_str + TAGS="${TAGS},operationName=${ESCAPED}" + MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${DUPLICATI__OPERATIONNAME}" +fi + +if [[ ! -z "$DUPLICATI__backup_name" ]]; then + UNSCAPED=$DUPLICATI__backup_name + escape_tag_str + TAGS="${TAGS},backupName=${ESCAPED}" + MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${DUPLICATI__backup_name}" +fi + +if [[ ! -z "$DUPLICATI__PARSED_RESULT" ]]; then + UNSCAPED=$DUPLICATI__PARSED_RESULT + escape_tag_str + TAGS="${TAGS},status=${ESCAPED}" + MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${DUPLICATI__PARSED_RESULT}" +fi + +if [[ ! -z "$DUPLICATI__RESULTFILE" ]]; then + UNSCAPED=$DUPLICATI__RESULTFILE + escape_tag_str + TAGS="${TAGS},resultFile=${ESCAPED}" +fi + +if [[ ! -z "$DUPLICATI__LOCALPATH" ]]; then + UNSCAPED=$DUPLICATI__LOCALPATH + escape_tag_str + TAGS="${TAGS},localPath=${ESCAPED}" +fi + +FIELDS="message=\"Duplicati ${MESSAGE_FIELD_VALUE}\"" +#echo $TAGS + +curl --request POST \ +"$INFLUXDB_SERVER/write?db=$INFLUXDB_BUCKET&ORG=$INFLUXDB_ORG" \ + --header "Authorization: Token $INFLUXDB_TOKEN" \ + --header "Content-Type: text/plain; charset=utf-8" \ + --header "Accept: application/json" \ + --data-raw "duplicati${TAGS} ${FIELDS}" > /dev/null 2>&1 + +exit 0 diff --git a/docker/mysqlclient/scripts/backupdb.sh b/scripts/duplicati-mysql-backup similarity index 100% rename from docker/mysqlclient/scripts/backupdb.sh rename to scripts/duplicati-mysql-backup -- 2.49.1 From 734a6b99e02a9a1fa78a262173f533a7f2a679b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Fernandes?= Date: Sat, 10 Jun 2023 07:38:17 +0100 Subject: [PATCH 3/4] . --- README.md | 97 +++++++++++++++++++++---------- docker/mysqlclient/Dockerfile | 2 +- docker/mysqlclient/README.md | 23 +++----- scripts/duplicati-influxdb-notify | 15 +---- scripts/duplicati-mysql-backup | 1 + 5 files changed, 77 insertions(+), 61 deletions(-) mode change 100644 => 100755 scripts/duplicati-influxdb-notify mode change 100644 => 100755 scripts/duplicati-mysql-backup diff --git a/README.md b/README.md index 08266be..5dc3c9e 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,46 @@ # Duplicati +## Docker -## Scripts - - - -## Custom Docker Images - -### Duplicati with mySql Client +### Duplicati/mySql Client - image [+ Information](docker/mysqlclient/README.md) -## Send Mail - -```bash -#for testing -duplicati-cli send-mail --send-mail-password="pass" --send-mail-to="target@mail.lan" --send-mail-username="suer@mail.lan" --send-mail-url="smtp://serveraddress:25" -``` - - -### Global Settings - -```bash - ---send-mail-any-operation=true ---send-mail-body=%RESULT% ---send-mail-level=all ---send-mail-subject=Duplicati %OPERATIONNAME% report for -> %backup-name% ---send-mail-to=destination@mail.lan ---send-http-result-output-format=Duplicati ---send-mail-url=smtp://serveraddress:25 ---send-mail-password=password ---send-mail-username=user@mail.lan - -``` ## Scripts _Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_ +### Backup mySql Database + + +Using option run-script-before-required on duplicati job set value to [script](scripts/duplicati-mysql-backup). +And job will create a database dump configured using environment variables +Example: +--run-script-after=/root/repos/duplicate/scripts/uplicati-mysql-backup + +[script](scripts/duplicati-mysql-backup) + + +### Influxdb Reporting + +```bash +#/etc/default/duplicati-influxdb +INFLUXDB_SERVER=http://influxdb01.lan:8086 +INFLUXDB_BUCKET=bucketname +INFLUXDB_ORG=orgname +INFLUXDB_TOKEN=influxdbname +``` + +Add [script](scripts/duplicati-influxdb-notify) to default settings. +Example: +--run-script-after=/root/repos/duplicate/scripts/duplicati-influxdb-notify + + +### Environment Variables + +Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_ + - DUPLICATI__EVENTNAME Eventname is BEFORE if invoked as --run-script-before, and AFTER if invoked as --run-script-after. This value cannot be changed by writing it back! @@ -65,8 +67,7 @@ _Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Mo ### Exit Codes -_Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_ - + The following exit codes are supported: - 0: OK, run operation @@ -76,3 +77,35 @@ The following exit codes are supported: - 4: Error, run operation - 5: Error don't run operation - other: Error don't run operation + + + + + +## cli + +## Send Mail + +```bash +#for testing +duplicati-cli send-mail --send-mail-password="pass" --send-mail-to="target@mail.lan" --send-mail-username="suer@mail.lan" --send-mail-url="smtp://serveraddress:25" +``` + + +## Settings + +### Send Email + +```bash + +--send-mail-any-operation=true +--send-mail-body=%RESULT% +--send-mail-level=all +--send-mail-subject=Duplicati %OPERATIONNAME% report for -> %backup-name% +--send-mail-to=destination@mail.lan +--send-http-result-output-format=Duplicati +--send-mail-url=smtp://serveraddress:25 +--send-mail-password=password +--send-mail-username=user@mail.lan + +``` diff --git a/docker/mysqlclient/Dockerfile b/docker/mysqlclient/Dockerfile index 33013b3..cc4b6fb 100644 --- a/docker/mysqlclient/Dockerfile +++ b/docker/mysqlclient/Dockerfile @@ -1,4 +1,4 @@ -#check ../README.md for more information + FROM duplicati/duplicati RUN apt update && apt install -y default-mysql-client && rm -rf /var/lib/apt/lists/* diff --git a/docker/mysqlclient/README.md b/docker/mysqlclient/README.md index 979bc3f..c14d3a5 100644 --- a/docker/mysqlclient/README.md +++ b/docker/mysqlclient/README.md @@ -1,28 +1,20 @@ # Duplicati / mySql Client -Using option run-script-before-required on duplicati job set value to /duplicati-mysqlclient/scripts/backupdb.sh. -And job will create a database dump configured using docker environment variables - -## Build Image - -### docker - ```bash #Executed on repository root folder docker build -t duplicati-mysqlclient:latest -f docker/mysqlclient/Dockerfile . ``` -### tar ```bash + #Executed on repository root folder sudo docker build -t duplicati-mysqlclient:latest -f docker/mysqlclient/Dockerfile --output type=tar,dest=build/duplicati-mysqlclient.tar . - ``` -### Portainer +## Portainer Images -> Build a new Image -> URL @@ -33,9 +25,8 @@ Images -> Build a new Image -> URL **Dockerfile path:** docker/mysqlclient/Dockerfile -## Run Container -### Docker Compose +## Docker Compose ```yaml version: "3" @@ -48,6 +39,10 @@ services: - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - DESTINATION=/db-dumps + - INFLUXDB_SERVER=${INFLUXDB_SERVER} + - INFLUXDB_BUCKET=${INFLUXDB_BUCKET} + - INFLUXDB_ORG=${INFLUXDB_ORG} + - INFLUXDB_TOKEN=:{INFLUXDB_TOKEN} volumes: - duplicati-data:/data - db-dumps:/db-dumps @@ -57,7 +52,8 @@ services: volumes: duplicati-data: db-dumps: -```` +``` + ### Transfer To another system 1. Copy docker compose and execute on another system 2. Check volumes and service started succesfully @@ -74,4 +70,3 @@ volumes: 13. Start all services 14. Check everything ok -### Environment Variables \ No newline at end of file diff --git a/scripts/duplicati-influxdb-notify b/scripts/duplicati-influxdb-notify old mode 100644 new mode 100755 index dd70c92..67712e5 --- a/scripts/duplicati-influxdb-notify +++ b/scripts/duplicati-influxdb-notify @@ -1,10 +1,6 @@ #!/bin/bash -#/etc/default/influxdb-connection example -#INFLUDB_SERVER=http://192.168.1.201:8086 -#INFLUDB_BUCKET=bucketname -#INFLUDB_ORG=orgname -#INFLUDB_TOKEN=Token xxxx + if [ -f "/etc/default/duplicati-influxdb" ]; then export $(cat /etc/default/duplicati-influxdb) fi @@ -13,15 +9,6 @@ if [ -f "~/.config/duplicati-influxdb" ]; then export $(cat ~/default/duplicati-influxdb) fi -#duplicati -#DUPLICATI__EVENTNAME="zbf dc fbz" -#DUPLICATI__OPERATIONNAME="yy" -#DUPLICATI__PARSED_RESULT="p gfh uasd" -#DUPLICATI__backup_name="puggb" -#DUPLICATI__RESULTFILE="sd gasd" -#DUPLICATI__LOCALPATH="sagd" -# - TAGS="" MESSAGE_FIELD_VALUE="" diff --git a/scripts/duplicati-mysql-backup b/scripts/duplicati-mysql-backup old mode 100644 new mode 100755 index 3d9cd78..3e7346a --- a/scripts/duplicati-mysql-backup +++ b/scripts/duplicati-mysql-backup @@ -1,4 +1,5 @@ #!/bin/bash + # mysql database backup. # executed by duplicati run-script-before-required # required environment variables: -- 2.49.1 From 9c5f9e8d301a6771e4c0bd5209829f60b3b7f2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Fernandes?= Date: Sat, 10 Jun 2023 07:57:39 +0100 Subject: [PATCH 4/4] . --- README.md | 14 ++++++++++++-- docker/mysqlclient/README.md | 1 - scripts/duplicati-mysql-backup | 28 +++++++++++++++++++--------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5dc3c9e..74b072d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ ### Duplicati/mySql Client - image +Image contains all scripts + [+ Information](docker/mysqlclient/README.md) @@ -15,12 +17,20 @@ _Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Mo Using option run-script-before-required on duplicati job set value to [script](scripts/duplicati-mysql-backup). -And job will create a database dump configured using environment variables +And job will create a database dump configured using environment variables. Example: ---run-script-after=/root/repos/duplicate/scripts/uplicati-mysql-backup +--run-script-after=/root/repos/duplicate/scripts/duplicati-mysql-backup [script](scripts/duplicati-mysql-backup) +```bash +#/etc/default/duplicati-mysql +MYSQL_HOST="mysqlserver" +MYSQL_USER="msqluser" +MYSQL_PASSWORD="msqlpassord" +MYSQL_DATABASE="msqlpassword" +MYSQL_BACKUP_FOLDER="/var/db-dumps" +``` ### Influxdb Reporting diff --git a/docker/mysqlclient/README.md b/docker/mysqlclient/README.md index c14d3a5..95f7517 100644 --- a/docker/mysqlclient/README.md +++ b/docker/mysqlclient/README.md @@ -38,7 +38,6 @@ services: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - - DESTINATION=/db-dumps - INFLUXDB_SERVER=${INFLUXDB_SERVER} - INFLUXDB_BUCKET=${INFLUXDB_BUCKET} - INFLUXDB_ORG=${INFLUXDB_ORG} diff --git a/scripts/duplicati-mysql-backup b/scripts/duplicati-mysql-backup index 3e7346a..2d386e5 100755 --- a/scripts/duplicati-mysql-backup +++ b/scripts/duplicati-mysql-backup @@ -3,15 +3,25 @@ # mysql database backup. # executed by duplicati run-script-before-required # required environment variables: -# DESTINATION + # MYSQL_HOST # MYSQL_USER # MYSQL_PASSWORD # MYSQL_DATABASE +# MYSQL_BACKUP_FOLDER #any error must stop execution set -e +if [ -f "/etc/default/duplicati-mysql" ]; then +export $(cat /etc/default/duplicati-mysql) +fi + +if [ -f "~/.config/duplicati-mysql" ]; then +export $(cat ~/default/duplicati-mysql) +fi + + if [ $DUPLICATI__OPERATIONNAME == "Backup" ] then echo "Backup Job!!" @@ -21,12 +31,12 @@ else exit fi +if [[-z "$MYSQL_BACKUP_FOLDER" ]]; then + MYSQL_BACKUP_FOLDER="/var/db-dumps" +fi -if [ -z ${DESTINATION} ] -then - echo "\$DESTINATION environment variable cannot be empty empty" - #5: Error don't run operation - exit 5 +if [ ! -d $MYSQL_BACKUP_FOLDER ]; then + mkdir -p $MYSQL_BACKUP_FOLDER; fi TARGETFILENAME=${MYSQL_DATABASE}_dump_$(date -d "today" +"%Y%m%d%H%M%S").sql @@ -41,10 +51,10 @@ fi mysqldump -h ${MYSQL_HOST} --user=${MYSQL_USER} -p"${MYSQL_PASSWORD}" ${MYSQL_DATABASE} > /tmp/${TARGETFILENAME} -if [ x$(find "$DESTINATION" -prune -empty) = x"$DESTINATION" ]; then +if [ x$(find "$MYSQL_BACKUP_FOLDER" -prune -empty) = x"$MYSQL_BACKUP_FOLDER" ]; then echo "folder is empty... ignoring clean db dump folder" else - rm -r ${DESTINATION}/* + rm -r ${MYSQL_BACKUP_FOLDER}/* fi -mv /tmp/${TARGETFILENAME} ${DESTINATION}/${TARGETFILENAME} +mv /tmp/${TARGETFILENAME} ${MYSQL_BACKUP_FOLDER}/${TARGETFILENAME} -- 2.49.1