A Nextcloud backup needs both the files on disk and the database that tracks users, shares, apps, and file metadata. Copying only the web root or only the data directory leaves a restore with missing configuration or missing records, so a manual backup run should capture the complete server state while writes are paused.
For a manual server installation, the required set includes the config folder, custom apps if any are installed, the data directory, themes, and a database dump. The file backup and SQL dump should land in the same dated directory so the backup set can be inspected and restored together.
Maintenance mode blocks new logins and locks active sessions until it is disabled. Schedule the run during a maintenance window, keep the database password out of shell history, and store the finished backup outside the Nextcloud server after the local copy has been inspected.
Related: How to restore Nextcloud from backup
Web root: /var/www/nextcloud Data directory: /var/www/nextcloud/data Backup directory: ~/nextcloud-backup/2026-06-29 Database host: localhost Database name: nextcloud Database user: nextcloud HTTP user: www-data
Read the real datadirectory, dbname, dbuser, and dbhost values from /var/www/nextcloud/config/config.php when the server uses different paths or a remote database.
$ cd /var/www/nextcloud
Use the directory that contains the occ file.
$ mkdir -p ~/nextcloud-backup/2026-06-29
$ sudo -E -u www-data php occ maintenance:mode --on Maintenance mode enabled
Maintenance mode interrupts active browser sessions and prevents new logins until it is turned off.
Related: How to enable Nextcloud maintenance mode
Related: How to run Nextcloud occ commands
$ sudo -E -u www-data php occ status - installed: true - version: 34.0.0.12 - versionstring: 34.0.0 - edition: - maintenance: true - needsDbUpgrade: false - productname: Nextcloud - extendedSupport: false
$ rsync -Aavx --exclude "data/" /var/www/nextcloud/ ~/nextcloud-backup/2026-06-29/nextcloud/ sending incremental file list created directory /home/admin/nextcloud-backup/2026-06-29/nextcloud ./ config/ config/config.php custom_apps/ custom_apps/calendar/ custom_apps/calendar/appinfo.txt themes/ themes/example/ themes/example/theme.txt sent 635 bytes received 166 bytes 1,602.00 bytes/sec total size is 54 speedup is 0.07
Run the command with sudo when the current shell user cannot read the installation files. Remove the --exclude only when the data directory is intentionally being backed up as part of the same web-root copy.
$ rsync -Aavx /var/www/nextcloud/data/ ~/nextcloud-backup/2026-06-29/data/ sending incremental file list created directory /home/admin/nextcloud-backup/2026-06-29/data ./ ada/ ada/files/ ada/files/budget.txt sent 302 bytes received 88 bytes 780.00 bytes/sec total size is 19 speedup is 0.05
Use the real datadirectory from /config/config.php. Backing up the wrong directory can produce a SQL dump with no matching user files.
$ mariadb-dump --single-transaction --host=localhost --user=nextcloud --password nextcloud > ~/nextcloud-backup/2026-06-29/nextcloud.sql Enter password:
--single-transaction keeps InnoDB tables consistent during the dump. Add --default-character-set=utf8mb4 when the database uses MariaDB or MySQL 4-byte support.
$ ls -lh ~/nextcloud-backup/2026-06-29 total 12K drwxr-x--- 3 admin admin 4.0K Jun 29 10:18 data drwxr-xr-x 5 admin admin 4.0K Jun 29 10:18 nextcloud -rw------- 1 admin admin 5.2K Jun 29 10:18 nextcloud.sql
The directory should contain the file backup, the data backup, and the database dump before the server leaves maintenance mode.
$ sudo -E -u www-data php occ maintenance:mode --off Maintenance mode disabled
$ sudo -E -u www-data php occ status - installed: true - version: 34.0.0.12 - versionstring: 34.0.0 - edition: - maintenance: false - needsDbUpgrade: false - productname: Nextcloud - extendedSupport: false