A Script for Backing Up Nextcloud to an FTP Server

#!/bin/bash

# ==== CONFIGURATION ====
NEXTCLOUD_PATH="/var/www/html"
DATA_PATH="/var/www/html/data"
BACKUP_PATH="/var/backups/nextcloud"

DB_USER="nextcloud"
DB_PASS="dbpassword"
DB_NAME="nextcloud"

FTP_HOST="yourftphost.com"
FTP_USER="yourftpuser"
FTP_PASS="yourftppassword"
FTP_DIR="/path/to/save/file"

DATE=$(date +"%Y-%m-%d_%H-%M")
ARCHIVE_NAME="nextcloud-backup-$DATE.tar.gz"

MAX_LOCAL_BACKUPS=3

# ==== START BACKUP ====
echo "Starting streamed Nextcloud backup..."

mkdir -p "$BACKUP_PATH"

# Export database (small file)
DB_DUMP="/tmp/db_$DATE.sql"
mysqldump --no-tablespaces -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$DB_DUMP"

# === Stream tar directly to FTP ===
echo "Creating and streaming archive directly to FTP..."

tar -czf - \
--exclude="$DATA_PATH/appdata_*/preview" \
--exclude="$NEXTCLOUD_PATH/updater-*" \
--exclude="$NEXTCLOUD_PATH/data/tmp" \
-C / \
"${NEXTCLOUD_PATH#/}" \
"${DATA_PATH#/}" \
"$DB_DUMP" \
| curl --ftp-pasv -T - "ftp://$FTP_HOST$FTP_DIR/$ARCHIVE_NAME" --user "$FTP_USER:$FTP_PASS"

# Remove temp database dump
rm -f "$DB_DUMP"

# Optional: keep a few local backups (not needed for streamed uploads)
echo "Cleaning up old local backups..."
cd "$BACKUP_PATH" || exit
ls -1t nextcloud-backup-*.tar.gz 2>/dev/null | tail -n +$((MAX_LOCAL_BACKUPS + 1)) | xargs -r rm -f --

echo "Backup complete: streamed directly to FTP as $ARCHIVE_NAME"

Leave a Reply

Your email address will not be published. Required fields are marked *