Forum

Nextcloud Backup Sc...
 
Notifications
Clear all

Nextcloud Backup Script v2.0

Lantern
(@lantern)
Illustrious Member Admin

Nou dat mijn NC al een tijd draait onder Docker had ik nog steeds geen Backup draaien. Ik heb het via Rsync ingesteld naar mijn NAS.

Eerst heb ik een mount gemaakt naar mijn NAS

Mount Info NC <> NAS

mount.cifs //x.x.x.x/NCBackup /mnt/share/nc/ -o user={USER},pass={PASSWORD}

 Vervolgens een Rsync Command Line die verwijst naar de juiste volume in mijn Docker omgeving:

 

rsync -av /var/lib/docker/volumes/{NAAM_VOLUME}/_data/data /mnt/share/nc

Ook bij deze back-up heb ik voor nu alleen gekozen voor de data en nog niet de gehele NC omgeving. Met een periodieke database dump van users/rechten etc. kom ik nu al een heel eind.

Om de Backup automatisch te laten draaien op bepaald tijdsinterval heb ik een crontab job aangemaakt.

#crontab -e

gekozen voor optie 1 om de file te maken met nano met de volgende inhoud
Cronjob : (elke maandag om 04:00)

* * * * 1 rysnc -av /var/lib/docker/volumes/{NAAM_VOLUME}/_data/data /mnt/share/nc

 


This topic was modified 2 weeks ago by Lantern
Quote
Topic starter Posted : 12/05/2025 3:39 pm
Abib
 Abib
(@abib)
Noble Member

Wanneer je NAS NFS ondersteunt, kan dat een betere optie zijn voor rsync. Kan ook passwordloos op basis van source IP (van de PI dus). 

Rsync is een synchronisatie van data, dus een tweede locatie, maar niet een backup als historisch archief. Vanuit Linux kun je daar ook tar voor gebruiken (werkt ook invrementeel). 

wanneer je van je NAS een backup draait kan een rsync uiteraard wel prima voldoen. 🙂


ReplyQuote
Posted : 29/05/2025 11:13 am
Lantern
(@lantern)
Illustrious Member Admin

Ik ga dit script ook aanpassen want het blijkt dat de backup stopt zodra mijn raspberry pi herstart. Het zit in hem in het auto mounten naar me NAS. Hopelijk van het weekend even aanpassen.


This post was modified 3 weeks ago by Lantern
ReplyQuote
Topic starter Posted : 27/02/2026 3:03 pm
Lantern
(@lantern)
Illustrious Member Admin
#!/bin/bash
set -euo pipefail

############################
# CONFIG
############################

APP_CONTAINER="[JOUW NC CONTAINERNAAM]"
DB_CONTAINER="[JOUW NC DATABASE CONTAINERNAAM]"

DB_NAME="[NAAM VAN JE DATABASE]"
DB_USER="root"

DATA_VOLUME="/var/lib/docker/volumes/[pad naar je NC data]"

BACKUP_BASE="/mnt/share/nc"

DATE=$(date +%F_%H-%M)
BACKUP_DIR="$BACKUP_BASE/backup-$DATE"
LOGFILE="$BACKUP_BASE/backup.log"

############################
# LOGGING
############################

exec > >(tee -a "$LOGFILE") 2>&1

echo "========================================"
echo "Nextcloud backup start: $DATE"
echo "========================================"

############################
# CHECKS
############################

if ! mountpoint -q "$BACKUP_BASE"; then
    echo "ERROR: Backup location is not mounted!"
    exit 1
fi

if ! docker ps --format '{{.Names}}' | grep -q "^${APP_CONTAINER}$"; then
    echo "ERROR: Nextcloud container not running!"
    exit 1
fi

if ! docker ps --format '{{.Names}}' | grep -q "^${DB_CONTAINER}$"; then
    echo "ERROR: Database container not running!"
    exit 1
fi

############################
# GET DB PASSWORD
############################

echo "Reading database credentials..."

DB_ROOT_PASSWORD=$(docker exec "$DB_CONTAINER" printenv MYSQL_ROOT_PASSWORD || true)

if [ -z "$DB_ROOT_PASSWORD" ]; then
    echo "ERROR: Could not read root DB password!"
    exit 1
fi

############################
# CREATE BACKUP DIR
############################

mkdir -p "$BACKUP_DIR"

############################
# MAINTENANCE MODE ON
############################

echo "Enable maintenance mode..."
docker exec -u www-data "$APP_CONTAINER" php occ maintenance:mode --on

############################
# DATABASE DUMP
############################

echo "Database dump..."

docker exec "$DB_CONTAINER" \
    mysqldump -u root -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
    > "$BACKUP_DIR/database.sql"

############################
# DATA BACKUP
############################

echo "Data sync..."

rsync -Aax --delete \
    --no-perms --no-owner --no-group \
    --exclude='*.sock' \
    "$DATA_VOLUME/" "$BACKUP_DIR/data/"

############################
# MAINTENANCE MODE OFF
############################

echo "Disable maintenance mode..."
docker exec -u www-data "$APP_CONTAINER" php occ maintenance:mode --off

############################
# CLEAN OLD BACKUPS
############################

echo "Cleaning old backups..."

find "$BACKUP_BASE" -maxdepth 1 -type d -name "backup-*" -mtime +7 -exec rm -rf {} \;

echo "========================================"
echo "Backup completed successfully!"
echo "========================================"

 

Dit script doet het volgende:

⭐ Hoofdpunten van wat dit script doet

✅ Zet Nextcloud in maintenance mode
✅ Maakt een database backup
✅ Maakt een bestandsbackup met rsync
✅ Voert veiligheidschecks uit voordat het start
✅ Zet Nextcloud weer online na backup
Verwijdert oude backups (ouder dan 7 dagen)
Logt alles naar een logfile


 


ReplyQuote
Topic starter Posted : 28/02/2026 12:50 pm
Lantern
(@lantern)
Illustrious Member Admin

========================================
Starting verbose Nextcloud backup
Date: 2026-02-28_13-57
========================================
[1/7] Checking backup location...
✔ Backup location OK
[2/7] Checking containers...
✔ Containers running
[3/7] Reading DB password...
✔ DB password loaded
[4/7] Creating backup directory...
Backup directory: /mnt/share/nc/backup-2026-02-28_13-57
[5/7] Enabling maintenance mode...
Maintenance mode enabled
[6/7] Database dump starting...
✔ Database backup completed
[7/7] Syncing data files...

✔ File backup completed
Disabling maintenance mode...
Maintenance mode disabled
Cleaning old backups...
========================================
Backup finished successfully!
========================================


ReplyQuote
Topic starter Posted : 28/02/2026 4:11 pm
Abib
 Abib
(@abib)
Noble Member

Mooi script met prettig log. Hoe heb je hem samengesteld? Met AI of op basis van een template?


ReplyQuote
Posted : 28/02/2026 6:19 pm
Lantern
(@lantern)
Illustrious Member Admin

Posted by: @abib

Mooi script met prettig log. Hoe heb je hem samengesteld? Met AI of op basis van een template?

AI 🤖 gegenereerd maar wel met aanpassingen door AI vanwege issues die je tijdens testen tegen komt. 

 


ReplyQuote
Topic starter Posted : 01/03/2026 10:47 am