Compare commits

...

15 Commits

Author SHA1 Message Date
fb3bbe212d removed datetime from docker log output
All checks were successful
/ build-docker-image (push) Successful in 50s
2025-01-28 19:56:01 +00:00
e79bfbf384 revision
All checks were successful
/ build-docker-image (push) Successful in 24s
2025-01-20 20:16:51 +00:00
11af5b8729 docker context revision
All checks were successful
/ build-docker-image (push) Successful in 1m21s
2024-09-16 20:30:10 +01:00
54fe3460b6 fix docker file
Some checks failed
/ build-docker-image (push) Failing after 12s
2024-09-16 19:53:11 +01:00
03c4aa8f83 fix CDI 2
Some checks failed
/ build-docker-image (push) Failing after 40s
2024-09-16 19:50:04 +01:00
2afc508157 fix ci
Some checks failed
/ build-docker-image (push) Failing after 10s
2024-09-16 19:48:39 +01:00
4b7d6b8cd4 continous integration
Some checks failed
/ build-docker-image (push) Failing after 12s
2024-09-16 19:45:00 +01:00
bc4b4c322e Update README.md 2024-04-01 15:12:01 +00:00
9d48fc6d2d docker log message revision 2024-03-16 23:57:45 +00:00
174b528899 added docker log 2024-03-16 23:39:58 +00:00
90e90d64a2 fix: message impr 2023-06-10 09:59:24 +01:00
feeaf2e9d5 feat: added INFLUXDB_CLIENT_HOSTNAME to influxdb report 2023-06-10 09:48:02 +01:00
6d6b30d934 fix: script error 2023-06-10 09:31:25 +01:00
a4e05c1f33 fix: encoding problems 2023-06-10 09:11:59 +01:00
94db5c16d7 fix: small fixes 2023-06-10 08:57:16 +01:00
13 changed files with 388 additions and 271 deletions

7
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,7 @@
FROM duplicati/duplicati
RUN apt update && \
apt install -y default-mysql-client && \
rm -rf /var/lib/apt/lists/*
EXPOSE 8200

View File

@@ -0,0 +1,38 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu
{
"name": "duplicati_dev-container",
"build": {
// Path is relative to the devcontainer.json file.
"dockerfile": "Dockerfile"
},
"features": {
"ghcr.io/devcontainers/features/git:1": {
"ppa": true,
"version": "latest"
},
"ghcr.io/prulloac/devcontainer-features/gitlint:1": {}
},
"containerEnv": {}
//"features": {
// "ghcr.io/wxw-matt/devcontainer-features/command_runner:0": {},
// "ghcr.io/wxw-matt/devcontainer-features/script_runner:0": {},
// "ghcr.io/devcontainers-extra/features/act:1": {}
// }
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "uname -a",
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}

View File

@@ -0,0 +1,31 @@
on:
push:
paths:
- "docker/**"
- ".gitea/**"
- "scripts/**"
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Log in to git.limbosolutions.com docker registry
uses: docker/login-action@v3
with:
registry: git.limbosolutions.com
username: ${{ secrets.GITLIMBO_DOCKER_REGISTRY_USERNAME }}
password: ${{ secrets.GITLIMBO_DOCKER_REGISTRY_PASSWORD }}
- name: Build and push Docker images
id: push
uses: docker/build-push-action@v6
with:
context: ${{gitea.workspace}}
file: ${{gitea.workspace}}/docker/Dockerfile
push: true
tags: git.limbosolutions.com/kb/duplicati:latest

12
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly

19
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,19 @@
{
"docker.commands.composeUpSubset": [
{
"label": "Compose Up",
"template": "${composeCommand} ${profileList} ${configurationFile} up ${detached} ${build} ${serviceList}"
}
],
"docker.commands.composeUp": [
{
"label": "Compose Up",
"template": "${composeCommand} ${configurationFile} up ${detached} ${build}"
}
],
"docker.contexts.showInStatusBar": true
} // {
// "docker.commands.build": "${containerCommand} build --pull --rm -f \"${dockerfile}\" -t ${tag} . --progress=plain"
// }

View File

@@ -1,30 +1,36 @@
# Duplicati
- [Docker](#docker)
- [Duplicati/mySql Client - image](#duplicatimysql-client---image)
- [Scripts](#scripts)
- [mysql - dump backup](#mysql---dump-backup)
- [Influxdb Reporting](#influxdb-reporting)
- [Docker log](#docker-log)
- [Environment Variables](#environment-variables)
- [Exit Codes](#exit-codes)
- [cli](#cli)
- [Send Mail](#send-mail)
- [Settings](#settings)
- [Send Email](#send-email)
- [nginx](#nginx)
## Docker
### Duplicati/mySql Client - image
Image contains all scripts
[+ Information](docker/mysqlclient/README.md)
[+ Information](docker/README.md)
## Scripts
_Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_
Source: <https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh>
### Backup mySql Database
### mysql - dump backup
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/duplicati-mysql-backup
[script](scripts/duplicati-mysql-backup)
Duplicati options set `run-script-before-required` to [duplicati-mysql-backup](scripts/duplicati-mysql-backup).
```bash
#/etc/default/duplicati-mysql
MYSQL_HOST="mysqlserver"
MYSQL_USER="msqluser"
MYSQL_PASSWORD="msqlpassord"
@@ -40,16 +46,24 @@ INFLUXDB_SERVER=http://influxdb01.lan:8086
INFLUXDB_BUCKET=bucketname
INFLUXDB_ORG=orgname
INFLUXDB_TOKEN=influxdbname
#by default it uses client hostname in measurement field host
#to override uncomment
#INFLUXDB_CLIENT_HOSTNAME=xxx
```
Add [script](scripts/duplicati-influxdb-notify) to default settings.
Example:
--run-script-after=/root/repos/duplicate/scripts/duplicati-influxdb-notify
--run-script-after=duplicati-influxdb-notify
### Docker log
Add [script](docker/scripts/dockerlog) to default settings.
Example:
--run-script-after=dockerlog
### Environment Variables
Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh_
Source: <https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Modules/Builtin/run-script-example.sh>_
- DUPLICATI__EVENTNAME
@@ -77,7 +91,6 @@ Source: https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Mod
### Exit Codes
The following exit codes are supported:
- 0: OK, run operation
@@ -88,10 +101,6 @@ The following exit codes are supported:
- 5: Error don't run operation
- other: Error don't run operation
## cli
## Send Mail
@@ -101,7 +110,6 @@ The following exit codes are supported:
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
@@ -119,3 +127,20 @@ duplicati-cli send-mail --send-mail-password="pass" --send-mail-to="target@mail.
--send-mail-username=user@mail.lan
```
## nginx
Example running on _duplicati sub folder
```bash
location /_duplicati/ {
proxy_pass http://<duplicatiserver>:8200/;
proxy_redirect ~^/(.*) $scheme://$http_host/_duplicati/$1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Url-Scheme $scheme;
}
```

17
docker/Dockerfile Normal file
View File

@@ -0,0 +1,17 @@
FROM duplicati/duplicati
RUN apt update && \
apt install -y default-mysql-client && \
rm -rf /var/lib/apt/lists/*
#repo root scripts
COPY /docker/scripts /usr/local/bin
#docker scripts
COPY ./scripts /usr/local/bin
RUN \
chmod +x /usr/local/bin/duplicati-influxdb-notify; \
chmod +x /usr/local/bin/duplicati-mysql-backup; \
chmod +x /usr/local/bin/dockerlog
EXPOSE 8200

34
docker/README.md Normal file
View File

@@ -0,0 +1,34 @@
# Duplicati / mySql Client
- [Docker Compose](#docker-compose)
- [Development](#development)
- [Docker Build](#docker-build)
## Docker Compose
```yaml
version: "3"
services:
duplicati:
image: git.limbosolutions.com/kb/duplicati:mysql-latest
environment:
- MYSQL_HOST=${MYSQL_HOST}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- INFLUXDB_SERVER=${INFLUXDB_SERVER}
- INFLUXDB_BUCKET=${INFLUXDB_BUCKET}
- INFLUXDB_ORG=${INFLUXDB_ORG}
- INFLUXDB_TOKEN=${INFLUXDB_TOKEN}
- INFLUXDB_CLIENT_HOSTNAME=${INFLUXDB_CLIENT_HOSTNAME}
volumes:
- duplicati-data:/data
- db-dumps:/db-dumps
ports:
- 8200:8200
restart: unless-stopped
volumes:
duplicati-data:
db-dumps:
```

View File

@@ -1,10 +0,0 @@
FROM duplicati/duplicati
RUN apt update && apt install -y default-mysql-client && rm -rf /var/lib/apt/lists/*
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

View File

@@ -1,71 +0,0 @@
# Duplicati / mySql Client
```bash
#Executed on repository root folder
docker build -t duplicati-mysqlclient:latest -f docker/mysqlclient/Dockerfile .
```
```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
Images -> Build a new Image -> URL
**Name:** duplicati-mysqlclient:latest
**URL:** https://git.limbosolutions.com/kb/duplicati.git
**Dockerfile path:** docker/mysqlclient/Dockerfile
## Docker Compose
```yaml
version: "3"
services:
duplicati:
image: duplicati-mysqlclient
environment:
- MYSQL_HOST=${MYSQL_HOST}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- INFLUXDB_SERVER=${INFLUXDB_SERVER}
- INFLUXDB_BUCKET=${INFLUXDB_BUCKET}
- INFLUXDB_ORG=${INFLUXDB_ORG}
- INFLUXDB_TOKEN=:{INFLUXDB_TOKEN}
volumes:
- duplicati-data:/data
- db-dumps:/db-dumps
ports:
- 8200:8200
restart: unless-stopped
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

10
docker/scripts/dockerlog Normal file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
#printf $(date '+%Y-%m-%d') >> /proc/1/fd/1;
#printf " " >> /proc/1/fd/1;
#printf $(date '+%H:%M:%S') >> /proc/1/fd/1;
printf "INFO:" >> /proc/1/fd/1;
printf " %s" $DUPLICATI__OPERATIONNAME >> /proc/1/fd/1;
printf " %s" $DUPLICATI__PARSED_RESULT >> /proc/1/fd/1;
printf " %s" $DUPLICATI__backup_name >> /proc/1/fd/1;
printf " %s" $DUPLICATI__LOCALPATH >> /proc/1/fd/1;
printf "\n" >> /proc/1/fd/1

View File

@@ -20,13 +20,18 @@ escape_tag_str () {
ESCAPED=${UNSCAPED//[ ]/\\ }
}
if [[ ! -z "$HOSTNAME" ]]; then
UNSCAPED=$HOSTNAME
if [[ ! -z "$INFLUXDB_CLIENT_HOSTNAME" ]]; then
UNSCAPED=$INFLUXDB_CLIENT_HOSTNAME
escape_tag_str
TAGS="${TAGS},host=${ESCAPED}"
MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${HOSTNAME}"
MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE}${INFLUXDB_CLIENT_HOSTNAME} "
else
if [[ ! -z "$HOSTNAME" ]]; then
UNSCAPED=$HOSTNAME
escape_tag_str
TAGS="${TAGS},host=${ESCAPED}"
MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE}${HOSTNAME} "
fi
fi
if [[ ! -z "$DUPLICATI__EVENTNAME" ]]; then
@@ -39,21 +44,21 @@ if [[ ! -z "$DUPLICATI__OPERATIONNAME" ]]; then
UNSCAPED=$DUPLICATI__OPERATIONNAME
escape_tag_str
TAGS="${TAGS},operationName=${ESCAPED}"
MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE} ${DUPLICATI__OPERATIONNAME}"
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}"
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}"
MESSAGE_FIELD_VALUE="${MESSAGE_FIELD_VALUE}${DUPLICATI__PARSED_RESULT} "
fi
if [[ ! -z "$DUPLICATI__RESULTFILE" ]]; then
@@ -68,7 +73,7 @@ if [[ ! -z "$DUPLICATI__LOCALPATH" ]]; then
TAGS="${TAGS},localPath=${ESCAPED}"
fi
FIELDS="message=\"Duplicati ${MESSAGE_FIELD_VALUE}\""
FIELDS="message=\"${MESSAGE_FIELD_VALUE}\""
#echo $TAGS
curl --request POST \

View File

@@ -31,7 +31,7 @@ else
exit
fi
if [[-z "$MYSQL_BACKUP_FOLDER" ]]; then
if [ -z "$MYSQL_BACKUP_FOLDER" ]; then
MYSQL_BACKUP_FOLDER="/var/db-dumps"
fi