Backupscript Nextcloud - Betriebsmodell docker inkl. mariadb + redis

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Hallo zusammen,

nachdem ich am Wochenende meine native Nexcloud-Instanz erfolgreich in das Betriebsmodell docker umgezogen habe, möchte ich dem Forum gerne mein angepasstest Backup-Script zur Verfügung stellen. Ich verwende ein Nextcloud-Image von Linuxserver inkl. mariadb und redis. Hintergrund dafür ist ein docker-Problem "random-number-generator".

Da ich sowas hier noch nicht gemacht habe, hoffe ich, dass ich diese </> Funktion des Forums richtig verwende.

Bei Interesse kann ich gerne auch eine rudimentäre Anleitung des Umzugs bereitstellen.

cheers,
abrocksi

Bash:
#!/bin/bash

#
# Bash script for creating backups of Nextcloud.
#

#
# IMPORTANT
# You have to customize this script (directories, users, etc.) for your actual environment.
# All entries which need to be customized are tagged with "TODO".
#

# Variables
currentDate=$(date +"%Y%m%d_%H%M%S")
# TODO: The directory where you store the Nextcloud backups
backupMainDir="/volume1/NextcloudDockerBackups"
# The actual directory of the current backup - this is is subdirectory of the main directory above with a timestamp
backupdir="${backupMainDir}/${currentDate}/"
# TODO: The directory of your Nextcloud installation
nextcloudFileDir="/volume1/docker/nextcloud/app"
# TODO: The directory of your Nextcloud data directory
# If your data directory is located under Nextcloud's file directory, the data directory should not be a separate part of the backup
nextcloudDataDir="/volume1/docker/nextcloud/data"
# TODO: Nextcloud container_name; not the image name
nextcloudContainerApp="Nextcloud-APP"
nextcloudContainerDB="Nextcloud-DB"
# TODO: Nextcloud
MAINTENANCE_COMMAND_ON="occ maintenance:mode --on"
MAINTENANCE_COMMAND_OFF="occ maintenance:mode --off"
# TODO: Your Nextcloud database name
nextcloudDatabase="xxxxxdatabase_namexxxxxx"
# TODO: Your Nextcloud database user
dbUser="xxxxxxxxxx"
# TODO: The password of the Nextcloud database user
dbPassword="xxxxxxxxxxxxxxxxxx"
# TODO: Your web server user; depends on nextcloud image; could be http, abc or www-
webserverUser="xxxx"
# TODO: The maximum number of backups to keep (when set to 0, all backups are kept)
maxNrOfBackups=3

# File names for backup files
# If you prefer other file names, you'll also have to change the NextcloudRestore.sh script.
fileNameBackupFileDir="nextcloud-filedir.tar.gz"
fileNameBackupDataDir="nextcloud-datadir.tar.gz"
fileNameBackupDb="nextcloud-db.sql"

# Function for error messages
errorecho() { cat <<< "$@" 1>&2; }

#
# Check for root
#
if [ "$(id -u)" != "0" ]
then
    errorecho "ERROR: This script has to be run as root!"
    exit 1
fi

#
# Check if backup dir already exists
#
if [ ! -d "${backupdir}" ]
then
    mkdir -p "${backupdir}"
else
    errorecho "ERROR: The backup directory ${backupdir} already exists!"
    exit 1
fi

#
# Set maintenance mode
#
echo "Set maintenance mode for Nextcloud..."
echo $(date +"%Y%m%d_%H%M%S")
docker exec --env COLUMNS=80 "${nextcloudContainerApp}" sh -c "${MAINTENANCE_COMMAND_ON}"
#sudo -u "${webserverUser}" occ maintenance:mode --on
echo "Done"
echo

sleep 60

#
# Backup file and data directory
#
echo "Creating backup of Nextcloud file directory..."
echo $(date +"%Y%m%d_%H%M%S")
tar -cpzf "${backupdir}/${fileNameBackupFileDir}" -C "${nextcloudFileDir}" .
echo "Done"
echo

echo "Creating backup of Nextcloud data directory..."
echo $(date +"%Y%m%d_%H%M%S")
tar -cpzf "${backupdir}/${fileNameBackupDataDir}"  -C "${nextcloudDataDir}" .
echo "Done"
echo

#
# Backup DB
#
echo "Backup Nextcloud database..."
echo $(date +"%Y%m%d_%H%M%S")
docker exec --env COLUMNS=80 "${nextcloudContainerDB}" mysqldump -u xxxxxxx -pxxxxxxxxxxxxxxx xxxxxdatabase_namexxxxxx > "${backupdir}/${fileNameBackupDb}"
echo "Done"
echo

#
# Disable maintenance mode
#
echo "Switching off maintenance mode..."
echo $(date +"%Y%m%d_%H%M%S")
docker exec --env COLUMNS=80 "${nextcloudContainerApp}" sh -c "${MAINTENANCE_COMMAND_OFF}"
echo "Done"
echo

#
# Delete old backups
#
if [ ${maxNrOfBackups} != 0 ]
then
    nrOfBackups=$(ls -l ${backupMainDir} | grep -c ^d)
 
    if [  ${maxNrOfBackups} > ${nrOfBackups} ]
    then
        echo "Removing old backups..."
        ls -t ${backupMainDir} | tail -$(( nrOfBackups - maxNrOfBackups )) | while read dirToRemove; do
        echo "${dirToRemove}"
        rm -r ${backupMainDir}/${dirToRemove}
        echo "Done"
        echo
    done
    fi
fi

echo
echo "DONE!"
echo "Backup created: ${backupdir}"
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Auf den ersten Blick sehr schön und tolle Arbeit. Übersichtlich und gut strukturiert! (y)
Rein aus Interesse würde ich gerne wissen, weshalb hier eine Wartezeit von 60 Sekunden sleep 60 eingebaut wurde.
Welchen Zweck erfüllt es?

Sobald der Wartungsmodus gesetzt ist kann doch sofort mit dem Backup begonnen werden.
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Hi luddi,

danke für die Lorbeeren. Ich weise aber daraufhin, dass ich nicht der ursprüngliche Autor des Scripts, sondern nur der "Anpasser" für die docker-Variante bin. Habe es lange Jahre für die native Nextcloud-Instanz genutzt (seit NC12). Auch ein "Restore"-Script hat mir gute Dienste geleistet.

Bzgl. 60-Sekunden-Schlaf: hatte beobachtet, dass wenn ich am Rechner sitze und das Script starte, der Windows-Sync noch eine Weile auf "grün" steht. Wollte also nur sichergehen, das kein Client da noch was hochlädt. Aber vermutlich kann man es weglassen.

cheers,
abrocksi
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
dass wenn ich am Rechner sitze und das Script starte, der Windows-Sync noch eine Weile auf "grün" steht.
Die Client-Verbindung hat damit nichts zu tun. Der Client wird sicher etwas verzögert mitbekommen, dass der Server nicht erreichbar ist.

Wollte also nur sichergehen, das kein Client da noch was hochlädt.
Selbst wenn ein Client da etwas hochladen sollte, sobald man den Server in den Wartungsmodus versetzt hat kann auch niemand mehr etwas hochladen geschweige denn bestehende Verbindungen werden sofort unterbrochen.

Also schmeiß die Wartezeit aus dem Script ;)
 
  • Like
Reaktionen: abrocksi

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Ok @Tuxnet, schaffe ich aber erst nach dem Wochenende
 
  • Like
Reaktionen: Tuxnet

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Zuletzt bearbeitet:

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48
Konnte bis dato leider noch nicht dein Script testen. Momentan ist die nc im dauereinsatz.

Kannst du mal bitte deine yaml posten, teste das gerne mal per Docker
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
YAML:
version: '3.9'
services:
  mariadb:
    container_name: Nextcloud-DB
    image: mariadb:10.5
    network_mode: bridge
    restart: always
    security_opt:
      - no-new-privileges:true
    user: 1024:100
    command: --transaction-isolation=READ-COMMITTED --log-bin=ROW
    healthcheck:
     test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-pxxxxxxxxxxxxxxxxxxxxxxxx"]
     interval: 300s
     timeout: 5s
     retries: 20
    volumes:
      - /volume1/docker/nextcloud/db:/var/lib/mysql:rw
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxxxxxxxxxxxxxxx
      - MYSQL_USER=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
      - MYSQL_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxx
      - MYSQL_DATABASE=nextcloud25
      - TZ=Europe/Berlin
      
  redis:
    container_name: Nextcloud-REDIS
    image: redis
    network_mode: bridge
    restart: always
    user: 1024:100
    volumes:
      - /volume1/docker/nextcloud/redis:/data:rw
    environment:
      - TZ=Europe/Berlin
      
  nextcloud:
    container_name: Nextcloud-APP
    image: lscr.io/linuxserver/nextcloud:amd64-27.1.2
    network_mode: bridge
    links:
      - mariadb
      - redis
    restart: always
    ports:
      - 8082:80
    depends_on:
      - mariadb
      - redis
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 300s
      timeout: 15s
      retries: 2
    environment:
      - REDIS_HOST=Nextcloud-REDIS
      - MYSQL_USER=xxxxxxxxxxxxxxxxxxxxxxxxx
      - MYSQL_PASSWORD=xxxxxxxxxxxxxxxxxxxxx
      - MYSQL_DATABASE=nextcloud25
      - MYSQL_HOST=mariadb
      - PHP_MEMORY_LIMIT=2G
      - PHP_UPLOAD_LIMIT=2G
      - MEMORY_LIMIT=2048M
      - PUID=1024
      - PGID=100
      - TZ=Etc/UTC
    volumes:
      - /volume1/docker/nextcloud/data:/data:rw
#      - /volume1/cloud/data:/data:rw
      - /volume1/docker/nextcloud/app/config:/config/www/nextcloud/config:rw
      - /volume1/docker/nextcloud/app/apps:/config/www/nextcloud/apps:rw

  nextcloud-nc-backup:
    container_name: Nextcloud_backup
    image: waja/calcardbackup
    network_mode: bridge
    links:
      - mariadb
      - nextcloud
    environment:
      - CRON_TIME=35 22 * * *
      - INIT_BACKUP=yes
      - CALCARD_OPTS=-i -r 20
      - NC_DIR=/nextcloud
      - NC_HOST=192.168.178.xx
      - NC_PORT=8082
      - DB_HOST=mariadb
    depends_on:
      - mariadb
      - nextcloud
    restart: unless-stopped
    volumes:
      - /volume1/docker/nextcloud/backup/calcardbackup:/backup
      - /volume1/docker/nextcloud/app/config:/nextcloud/config
      - /etc/localtime:/etc/localtime:ro
 

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48
Ich as muss ich den eintragen ?

test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-pxxxxxxxxxxxxxxxxxxxxxxxx"]
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Ich as muss ich den eintragen ?

test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-pxxxxxxxxxxxxxxxxxxxxxxxx"]
Also das Root-Passwort anstelle der xxxx oder Du kommentierst die Zeile ganz aus. Ist nur der Healthcheck für die MariaDB. Unkritisch.
 

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48
Perfekt,ich bekomme aber einiges an Fehlern.

kannstdu mal bitte deine nextcloud.conf posten ?
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
Derzeit leider nicht. Bin im Urlaub.
 

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48
Ich wünsche dir einen schönen Urlaub ich warte so lange
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
@Tuxnet: Hilf mir nochmal: Was genau möchtest Du machen/erreichen?

Ursprünglich ging es ja in diesem Post um ein Backup-Script, welches ich so angepasst hatte, dass es auch bei einem Nextcloud-Betrieb mittels Docker funktioniert.

cheers,
abrocksi
 

Tuxnet

Benutzer
Mitglied seit
02. Jan 2019
Beiträge
586
Punkte für Reaktionen
68
Punkte
48
Guten Morgen, ich teste dein Script im Docker betrieb, wenn alles funktioniert geht es an die Firmen nextcloud. Ich habe leider sehr viel Fehler in dem Docker. Kannst du mir bitte mal deine nextcloud Config posten ?
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
240
Punkte für Reaktionen
79
Punkte
28
@Tuxnet: habe Dir eine PN geschickt
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat