Skip to main content

rclone wrapper for Django database and media file backups

Project description

django-rclone

Django database and media backup management commands, powered by rclone.

django-rclone bridges Django's database layer with rclone's file transfer layer. You get native database dumps piped directly to any of rclone's 70+ supported cloud storage backends -- no temp files, no intermediate archives, no Python reimplementations of what rclone already does.

Why rclone instead of Django Storages?

django-dbbackup is a mature and well-regarded backup solution. It wraps Django Storages for upload, implements GPG encryption in Python, handles gzip compression, and parses filenames with regex to manage backups.

django-rclone takes a different approach: delegate everything that isn't Django-specific to rclone.

Concern django-dbbackup django-rclone
Storage backends Django Storages (S3, GCS, etc.) rclone (70+ backends natively)
Encryption GPG subprocess wrapper in Python rclone crypt remote
Compression gzip in Python rclone compress remote or --compress flag
Media backup Tar archive, then upload rclone sync (incremental, no archiving)
Backup listing Filename regex parsing rclone lsjson (structured JSON)
Temp files SpooledTemporaryFile None -- pipes directly via rclone rcat
DB passwords Passed via CLI args (visible in ps) Env vars for PostgreSQL/MySQL (PGPASSWORD, MYSQL_PWD)

The result is significantly less code doing significantly less work. Storage abstraction, encryption, compression, and incremental sync are all rclone's problem -- django-rclone only owns what Django must own: database connectors, management commands, and signals.

Requirements

  • Python 3.13+
  • Django 4.2+
  • rclone installed and configured

Installation

pip install django-rclone

Add to your INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    "django_rclone",
]

Configure your rclone remote (see rclone docs):

rclone config

Then point django-rclone at it:

DJANGO_RCLONE = {
    "REMOTE": "myremote:backups",
}

Usage

Database backup and restore

# Backup the default database
python manage.py dbbackup

# Backup a specific database
python manage.py dbbackup --database analytics

# Backup and clean old backups beyond retention count
python manage.py dbbackup --clean

# Restore from the latest backup
python manage.py dbrestore

# Restore a specific backup
python manage.py dbrestore --input-path default-2024-01-15-120000.dump

# Non-interactive restore (for automation)
python manage.py dbrestore --noinput --input-path default-2024-01-15-120000.dump

Media backup and restore

# Sync MEDIA_ROOT to remote (incremental -- only changed files transfer)
python manage.py mediabackup

# Sync remote back to MEDIA_ROOT
python manage.py mediarestore

List backups

# List all database backups
python manage.py listbackups

# Filter by database
python manage.py listbackups --database default

# List media files on remote
python manage.py listbackups --media

Configuration

All settings live under the DJANGO_RCLONE dict in your Django settings:

DJANGO_RCLONE = {
    # Required -- rclone remote and base path
    "REMOTE": "myremote:backups",

    # Optional -- rclone binary and config
    "RCLONE_BINARY": "rclone",             # Path to rclone binary
    "RCLONE_CONFIG": None,                 # Path to rclone.conf (None uses default)
    "RCLONE_FLAGS": [],                    # Extra flags for every rclone call

    # Database backup settings
    "DB_BACKUP_DIR": "db",                 # Subdirectory for DB backups
    "DB_FILENAME_TEMPLATE": "{database}-{datetime}.{ext}",  # Must start with {database}
    "DB_DATE_FORMAT": "%Y-%m-%d-%H%M%S",
    "DB_CLEANUP_KEEP": 10,                 # Keep N most recent backups per database

    # Media backup settings
    "MEDIA_BACKUP_DIR": "media",           # Subdirectory for media backups

    # Database connector overrides
    "CONNECTORS": {},                      # Per-database connector class overrides
    "CONNECTOR_MAPPING": {},               # Engine-to-connector class overrides
}

Encryption and compression

django-rclone does not implement encryption or compression. Instead, configure these at the rclone level where they belong:

Encryption -- use a crypt remote:

rclone config create myremote-crypt crypt remote=myremote:backups password=your-password

Then set "REMOTE": "myremote-crypt:" in your Django settings.

Compression -- use a compress remote:

rclone config create myremote-compressed compress remote=myremote:backups

Or pass --compress-level via RCLONE_FLAGS.

Supported databases

Database Connector Dump tool Format
PostgreSQL PgDumpConnector pg_dump / pg_restore Custom (binary)
PostGIS PgDumpGisConnector pg_dump / pg_restore Custom (binary)
MySQL / MariaDB MysqlDumpConnector mysqldump / mysql SQL text
SQLite SqliteConnector sqlite3 .dump SQL text
MongoDB MongoDumpConnector mongodump / mongorestore Archive (binary)

GIS backends (postgis, spatialite, gis/mysql) and django-prometheus wrappers are also mapped automatically. See connectors documentation for the full engine mapping table.

Signals

django-rclone sends Django signals before and after each operation:

from django_rclone.signals import pre_db_backup, post_db_backup

@receiver(post_db_backup)
def notify_on_backup(sender, database, path, **kwargs):
    logger.info("Database %s backed up to %s", database, path)

Available signals: pre_db_backup, post_db_backup, pre_db_restore, post_db_restore, pre_media_backup, post_media_backup, pre_media_restore, post_media_restore.

Architecture

Management Commands (dbbackup, dbrestore, mediabackup, mediarestore, listbackups)
        |                           |
   DB Connectors              rclone.py
   (pg, mysql, sqlite,    (subprocess wrapper)
    mongodb)
        |                           |
   Database binary              rclone binary
                          (70+ storage backends)

Database dumps stream directly from the dump process into rclone rcat via Unix pipes. No intermediate files are written. Restores work in reverse: rclone cat streams into the database restore process.

Media backups use rclone sync, which is incremental by default -- only changed files are transferred.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_rclone-0.1.0.tar.gz (39.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_rclone-0.1.0-py3-none-any.whl (19.7 kB view details)

Uploaded Python 3

File details

Details for the file django_rclone-0.1.0.tar.gz.

File metadata

  • Download URL: django_rclone-0.1.0.tar.gz
  • Upload date:
  • Size: 39.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for django_rclone-0.1.0.tar.gz
Algorithm Hash digest
SHA256 304d9046c47f8f0130db082d2594e2a27f26f16e5a65871bfc4525b5e25bc224
MD5 4b2e1b79b7643aeeb969b98d5fcf0d63
BLAKE2b-256 5f779725d0b0ef7025c911bba03a4da271087cc8e17207c3fea8464747039c6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_rclone-0.1.0.tar.gz:

Publisher: publish.yml on kjnez/django-rclone

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_rclone-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: django_rclone-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for django_rclone-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 aa8dd930c0ffad775452c7b3bd0de82cea8a842923b6ac9735c8bb09e8c009df
MD5 345bef786632eaccdda7509538f01783
BLAKE2b-256 38740c0a91272a3328cf33b9b7d67002a563d80276b246f1655ee5e0129421e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_rclone-0.1.0-py3-none-any.whl:

Publisher: publish.yml on kjnez/django-rclone

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page