diff --git a/docs/docs/start/backup.md b/docs/docs/start/backup.md index 8cab613b4a..42178ce5e7 100644 --- a/docs/docs/start/backup.md +++ b/docs/docs/start/backup.md @@ -8,6 +8,9 @@ Backup functionality is provided natively using the [django-dbbackup library](ht Note that a *backup* operation is not the same as [migrating data](./migrate.md). While data *migration* exports data into a database-agnostic JSON file, *backup* exports a native database file and media file archive. +!!! warning "Database Version" + When performing backup and restore operations, it is *imperative* that you are running from the same installed version of InvenTree. Different InvenTree versions may have different database schemas, which render backup / restore operations incompatible. + ## Configuration The following configuration options are available for backup: @@ -22,22 +25,31 @@ The following configuration options are available for backup: If you want to use an external storage provider, extra configuration is required. As a starting point, refer to the [django-dbbackup documentation](https://django-dbbackup.readthedocs.io/en/master/storage.html). -Specific storage configuration options are specified using the `backup_options` dict (in the [configuration file](./config.md)). +Specific storage configuration options are specified using the `backup_options` dict (in the [configuration file](./config.md#backup-file-storage)). ## Perform Backup #### Manual Backup -To perform a manual backup operation, run the following command from the shell: +To perform a basic manual backup operation, run the following command from the shell: ``` invoke backup ``` +This will perform backup operation with the default parameters. To see all available backup options, run: + +``` +invoke backup --help +``` + ### Backup During Update When performing an update of your InvenTree installation - via either [docker](./docker.md) or [bare metal](./install.md) - a backup operation is automatically performed. +!!! info "Skip Backup Step" + You can opt to skip the backup step during the update process by adding the `--skip-backup` option. + ### Daily Backup If desired, InvenTree can be configured to perform automated daily backups. The run-time setting to control this is found in the *Server Configuration* tab. @@ -56,3 +68,16 @@ To restore from a previous backup, run the following command from the shell (wit ``` invoke restore ``` + +To see all available options for restore, run: + +``` +invoke restore --help +``` + +## Advanced Usage + +Not all functionality of the db-backup library is exposed by default. For advanced usage (not covered by the documentation above), refer to the [django-dbbackup commands documentation](https://django-dbbackup.readthedocs.io/en/master/commands.html). + +!!! warning "Advanced Users Only" + Any advanced usage assumes some underlying knowledge of django, and is not documented here. diff --git a/tasks.py b/tasks.py index c36b2750f5..22f32f9edf 100644 --- a/tasks.py +++ b/tasks.py @@ -360,22 +360,73 @@ def translate(c, ignore_static=False, no_frontend=False): static(c) -@task -def backup(c): +@task( + help={ + 'clean': 'Clean up old backup files', + 'path': 'Specify path for generated backup files (leave blank for default path)', + } +) +def backup(c, clean=False, path=None): """Backup the database and media files.""" print('Backing up InvenTree database...') - manage(c, 'dbbackup --noinput --clean --compress') + + cmd = '--noinput --compress -v 2' + + if path: + cmd += f' -O {path}' + + if clean: + cmd += ' --clean' + + manage(c, f'dbbackup {cmd}') print('Backing up InvenTree media files...') - manage(c, 'mediabackup --noinput --clean --compress') + manage(c, f'mediabackup {cmd}') -@task -def restore(c): +@task( + help={ + 'path': 'Specify path to locate backup files (leave blank for default path)', + 'db_file': 'Specify filename of compressed database archive (leave blank to use most recent backup)', + 'media_file': 'Specify filename of compressed media archive (leave blank to use most recent backup)', + 'ignore_media': 'Do not import media archive (database restore only)', + 'ignore_database': 'Do not import database archive (media restore only)', + } +) +def restore( + c, + path=None, + db_file=None, + media_file=None, + ignore_media=False, + ignore_database=False, +): """Restore the database and media files.""" - print('Restoring InvenTree database...') - manage(c, 'dbrestore --noinput --uncompress') - print('Restoring InvenTree media files...') - manage(c, 'mediarestore --noinput --uncompress') + base_cmd = '--no-input --uncompress -v 2' + + if path: + base_cmd += f' -I {path}' + + if ignore_database: + print('Skipping database archive...') + else: + print('Restoring InvenTree database') + cmd = f'dbrestore {base_cmd}' + + if db_file: + cmd += f' -i {db_file}' + + manage(c, cmd) + + if ignore_media: + print('Skipping media restore...') + else: + print('Restoring InvenTree media files') + cmd = f'mediarestore {base_cmd}' + + if media_file: + cmd += f' -i {media_file}' + + manage(c, cmd) @task(post=[rebuild_models, rebuild_thumbnails])