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/ncOok 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
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. 🙂
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.
#!/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
========================================
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!
========================================
Mooi script met prettig log. Hoe heb je hem samengesteld? Met AI of op basis van een template?
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.