Scripts for Backup of a Django Site

How to backup a Django site regularly using shell script and cron
August 5, 2024 by
Scripts for Backup of a Django Site
Hamed Mohammadi
| No comments yet

While numerous tools and applications exist specifically designed to streamline the backup process for Django site administrators, this blog post explores a more hands-on approach. By leveraging the power of shell scripting and cron job scheduling, we'll demonstrate how to automate the creation of database and media file backups, providing granular control over the backup process and ensuring data integrity.

Understanding the Requirements

To safeguard a Django project, it's essential to protect two key components: the database and the media folder. The database stores critical application data, while the media folder houses uploaded files such as images, documents, and other user-generated content. While the Django project's codebase can typically be managed through version control systems like Git, ensuring regular backups of the database and media files is crucial to prevent data loss and maintain system integrity. Before starting to write the scripts, let's clarify the requirements:

  • Backup frequency: How often do you want to perform the backups? Daily, hourly, etc.?

  • Database type: What database are you using (e.g., PostgreSQL, MySQL, SQLite)?

  • Backup retention: How many backups do you want to keep?

  • Remote server details: What is the address of the remote server? What user and authentication method will be used for the sync?

  • Backup compression: Do you want to compress the backups to save space?


Script for Local Backup

Assuming you want to perform daily backups, use a PostgreSQL database, keep the last 7 backups, and don't compress the backups, here's a basic shell script to create a local backup:

#!/bin/bash

# Replace with your desired backup frequency and retention
BACKUP_DIR="/opt/mysite/backup"
BACKUP_RETENTION=7

# Create backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"

# Get current date for backup name
BACKUP_DATE=$(date +%Y-%m-%d)
BACKUP_FILE="$BACKUP_DIR/mysite-$BACKUP_DATE.sql.gz"

# Dump the database (replace with your database credentials and options)
pg_dump -U mysite_user mydatabase > "$BACKUP_FILE"

# Copy media folder
cp -r /opt/mysite/media "$BACKUP_DIR/media-$BACKUP_DATE"

# Remove old backups
find "$BACKUP_DIR" -type f -name "mysite-*.sql.gz" -mtime +$BACKUP_RETENTION -delete
find "$BACKUP_DIR" -type d -name "media-*" -mtime +$BACKUP_RETENTION -delete

Explanation:

  • The script creates a backup directory if it doesn't exist.

  • It generates a timestamped filename for the database backup.

  • It uses pg_dump to dump the database. Replace mysite_user and mydatabase with your actual credentials.

  • It copies the media folder to a timestamped directory.

  • It removes old backups based on the BACKUP_RETENTION variable.

Script for Remote Sync

Assuming you want to sync the backup directory to a remote server with the user backupuser and password backup_password (replace with your actual credentials), here's a basic script:

#!/bin/bash

# Replace with remote server details
REMOTE_SERVER="your_remote_server_ip"
REMOTE_USER="backupuser"
REMOTE_PASSWORD="backup_password"
BACKUP_DIR="/opt/mysite/backup"

# Use rsync to sync the backup directory
rsync -avz --password-file=/path/to/password_file "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_SERVER:/path/to/remote_backup_dir"

You can also set password-less login using ssh-keygen, ssh-copy-id commands, and in this case you don't need to provide password in the scrip.

Explanation:

  • The script uses rsync to synchronize the local backup directory to the remote server.

  • It uses password-based authentication. For security reasons, it's recommended to use key-based authentication instead.

  • Replace /path/to/password_file with the actual path to a file containing the password.


Important Notes:

  • Replace placeholders like mysite_user, mydatabase, BACKUP_RETENTION, remote server details, and credentials with your actual values.

  • Consider using compression for the database backup (e.g., gzip) if storage space is limited.

  • Implement proper error handling and logging in your scripts.

  • For increased security, consider using SSH keys for authentication instead of passwords.

  • Test the scripts thoroughly in a non-production environment before deploying them to production.

  • Explore using backup tools like borg or restic for more advanced features and reliability.



Scheduling the Scripts

To run these scripts regularly, you can use a cron job. For example, to run the local backup script daily at 2 AM:

0 2 * * * /path/to/your/local_backup_script.sh

And to run the remote sync script every hour:

0 * * * * /path/to/your/remote_sync_script.sh

Remember to adjust the cron expressions based on your desired backup frequency.

Cron is a time-based job scheduler in Linux. To edit cron jobs, you'll use the crontab command.

$ crontab -e

This will open your crontab file in a text editor (usually vi or nano). Add two lines above (with your actual script path) to crontab and save the file. The cron will do your backup process regularly as you defined in crontab.


Scripts for Backup of a Django Site
Hamed Mohammadi August 5, 2024
Share this post
Tags
Archive

Please visit our blog at:

https://zehabsd.com/blog

A platform for Flash Stories:

https://readflashy.com

A platform for Persian Literature Lovers:

https://sarayesokhan.com

Sign in to leave a comment