Preview:
def generate_database_backup():
    host = os.environ.get("DATABASE_HOST")  # Database host
    port = os.environ.get("DATABASE_PORT")  # Database port
    db_name = os.environ.get("POSTGRES_DB")  # Database name
    db_username = os.environ.get("POSTGRES_USER")  # Database username
    db_password = os.environ.get("POSTGRES_PASSWORD")  # Database password
    current_datetime = datetime.now()
    date_folder = current_datetime.strftime("%Y-%m-%d")  # Date folder
    download_sql_file = f'db_backup_{db_name}_{current_datetime.strftime("%Y-%m-%d_%H:%M")}.sql'  # SQL file name
    compressed_sql_file = f"{download_sql_file}.zip"  # Compressed SQL file name
    # zip_file_name = f'backup_{db_name}_{current_datetime.strftime("%H:%M")}.zip'  # Zip file name
    s3_bucket_name = settings.AWS_STORAGE_BUCKET_NAME  # Name of your S3 bucket
    s3_key = f"dailyDataBaseBackup/{date_folder}/{compressed_sql_file}"  # Key (path) under which the file will be stored in S3
    aws_access_key_id = settings.AWS_ACCESS_KEY_ID
    aws_secret_access_key = settings.AWS_SECRET_ACCESS_KEY

    # Calculate the date 1 month ago from today in UTC
    one_month_ago = datetime.now(timezone.utc) - timedelta(days=30)

    # Upload the backup file to S3
    s3 = boto3.client(
        "s3",
        aws_access_key_id=aws_access_key_id,
        aws_secret_access_key=aws_secret_access_key,
    )

    # List objects in the S3 bucket
    objects = s3.list_objects_v2(Bucket=s3_bucket_name)["Contents"]

    # Iterate through the objects and delete backup files older than 1 month
    for obj in objects:
        key = obj["Key"]
        last_modified = obj["LastModified"]

        # Check if the key represents a compressed SQL backup file and if it's older than 1 month
        if (
            key.startswith("dailyDataBaseBackup/")
            and key.endswith(".sql.gz")
            and last_modified < one_month_ago
        ):
            s3.delete_object(Bucket=s3_bucket_name, Key=key)

    # Command to create a database backup file
    backup_command = f"export PGPASSWORD='{db_password}' && pg_dump -h {host} -p {port} -U {db_username} {db_name} -w --clean > {download_sql_file}"

    print(f"Running command: {backup_command}")
    exit_code = subprocess.call(backup_command, shell=True)

    if exit_code == 0:

        # Compress the SQL backup file using gzip
        
        # Create a zip archive of the compressed SQL file
        with zipfile.ZipFile(compressed_sql_file, "w", zipfile.ZIP_DEFLATED) as zipf:
            zipf.write(compressed_sql_file, os.path.basename(compressed_sql_file))

        # Upload the new backup file to S3
       
    
        with open(compressed_sql_file, "rb") as file:
            s3.upload_fileobj(file, s3_bucket_name, s3_key)

            # Remove the files from the project folder
        os.remove(compressed_sql_file)
        os.remove(download_sql_file)
        # os.remove(zip_file_name)

        # db_backup_{db_name}_2023-10-11_11:00.sql.gz

        # Get the full S3 file path
        s3_file_path = f"https://{s3_bucket_name}.s3.amazonaws.com/{s3_key}"

        sender_email = settings.DEFAULT_FROM_EMAIL
        password = settings.EMAIL_HOST_PASSWORD
        receiver_email = "devteam@hikartech.in"
        context = ssl.create_default_context()
        msg = MIMEMultipart("alternative")
        msg["Subject"] = "Database Backup For Hikemm"
        msg["From"] = sender_email
        msg["To"] = receiver_email
        body = f"""

        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>Link to S3 File</title>
        </head>
        <body>
            <h1>Link to S3 File</h1>
            <p>Dear all,</p>
            <p>I hope this email finds you well. I wanted to share a link to an S3 file that you might find useful:</p>
            <p><a href="{s3_file_path}"> S3 File URL</a> </p>
            <p>You can click on the link above to access the file. If you have any trouble accessing it or need further assistance, please don't hesitate to reach out to me.</p>
            <p>Thank you, and have a great day!</p>
            <p>Best regards</p>
        </body>
        </html>



        
"""

        html_part = MIMEText(body, "html")
        msg.attach(html_part)
        message = msg.as_bytes()
        email_client = boto3.client(
            "ses",
            aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
            aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
            region_name="ap-south-1",
        )
        response = email_client.send_raw_email(
            Source=sender_email,
            Destinations=[receiver_email],
            RawMessage={"Data": message},
        )
        message_id = response["MessageId"]
        logger.error(f"Email sent successfully {message_id}")




RUN apt-get update && apt-get install -y postgresql-client  # add this in docker file 
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter