Automating Hetzner Snapshot Creation and Cleanup on Debian 12

Automating snapshot creation and cleanup is an essential task for server management, ensuring data safety and efficient resource usage. The following Bash script accomplishes this by creating snapshots of a server hosted on Hetzner Cloud and deleting snapshots older than two days. This guide explains the script step by step.


Before running the script, ensure you have:

  • A Hetzner Cloud account with API access.
  • jq installed on your Debian 12 server (sudo apt install jq).
  • curl installed on your Debian 12 server (sudo apt install curl).

The Script

Save the following script as


# Replace with your actual server ID and API token

# Log file location

# Function to create a snapshot
create_snapshot() {
    DATE=$(date '+%B-%d-%Y')

    echo "$(date '+%Y-%m-%d %H:%M:%S') - Creating snapshot for server ID $SERVER_ID with description: $DESCRIPTION" >> $LOG_FILE
    RESPONSE=$(curl -s -X POST \
    -H "Authorization: Bearer $API_TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"description\":\"$DESCRIPTION\",\"type\":\"snapshot\"}" \

    if echo "$RESPONSE" | grep -q '"error":'; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Error creating snapshot: $RESPONSE" >> $LOG_FILE
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Snapshot created successfully" >> $LOG_FILE

# Function to delete snapshots older than 2 days
delete_old_snapshots() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Deleting snapshots older than 2 days for server ID $SERVER_ID" >> $LOG_FILE
    IMAGES=$(curl -s -H "Authorization: Bearer $API_TOKEN" \
    "" | jq -r '.images[] | select('"$SERVER_ID"') | select(.created < "'$(date -d '2 days ago' --utc +%Y-%m-%dT%H:%M:%SZ)'") | .id')

    for IMAGE_ID in $IMAGES; do
        RESPONSE=$(curl -s -X DELETE \
        -H "Authorization: Bearer $API_TOKEN" \

        if echo "$RESPONSE" | grep -q '"error":'; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') - Error deleting snapshot ID $IMAGE_ID: $RESPONSE" >> $LOG_FILE
            echo "$(date '+%Y-%m-%d %H:%M:%S') - Snapshot ID $IMAGE_ID deleted successfully" >> $LOG_FILE

# Create a snapshot

# Delete old snapshots

How the Script Works

  1. Configuration: Replace YOURSERVERID and YOUR API TOKEN with your Hetzner Cloud server ID and API token respectively. These credentials allow the script to interact with the Hetzner Cloud API.
  2. Logging: The script logs its actions to /var/log/hetzner_backup.log. Ensure this file is writable by the user running the script.
  3. Snapshot Creation:
  • The create_snapshot function creates a snapshot with the current date as the description.
  • It uses the curl command to send a POST request to the Hetzner API, creating a snapshot of the specified server.
  • Responses are checked for errors, and the outcome is logged.
  1. Old Snapshot Deletion:
  • The delete_old_snapshots function retrieves a list of snapshots older than two days using curl and jq for JSON processing.
  • For each outdated snapshot, a DELETE request is sent to the Hetzner API to remove it.
  • The script logs the success or failure of each deletion attempt.

Running the Script

  1. Make the Script Executable: Set execute permissions for the script:
   chmod +x
  1. Schedule the Script: Use cron to schedule the script for periodic execution. For example, to run the script daily at midnight:
   crontab -e

Add the following line:

   0 0 * * * /path/to/


This script automates the process of creating and cleaning up snapshots on a Hetzner Cloud server. By scheduling it with cron, you can ensure regular backups and manage disk space efficiently by removing old snapshots. This approach enhances your server management and data safety practices, If you need to see what’s your server ID, click here.

Leave a Reply

Your email address will not be published. Required fields are marked *