#!/bin/bash set -e # Environment variables # # CONTAINER - name of the container where the database is running # NOTIFY_URL - optional, URL to send notification to # TARGET_DIR - directory where to store the backup # HISTORY - number of backups to keep (default: 3) if [ -z "$CONTAINER" ]; then echo "CONTAINER environment variable is not set." exit 1 fi if [ -z "$TARGET_DIR" ]; then echo "TARGET_DIR environment variable is not set." exit 1 fi if [ -z "$HISTORY" ]; then HISTORY=3 fi docker info > /dev/null 2>&1 if [ ! $? -eq 0 ]; then echo "Docker is not available." exit 1 fi if [ ! -d "$TARGET_DIR" ]; then echo "TARGET_DIR does not exist. Creating it..." exit 2 fi echo "Starting backup for container: $CONTAINER" if [ `docker exec -i $CONTAINER test -e /usr/bin/mariadb-dump && echo "yes" || echo "no"` = "yes" ]; then DBTYPE="mariadb" FILENAME=`date +"%Y%m%d_%H%M%S"`_$DBTYPE_$CONTAINER.sql.zst docker exec -i $CONTAINER mariadb-dump \ --all-databases \ --user=root \ --password=$MARIADB_ROOT_PASSWORD \ --add-drop-trigger \ --add-drop-table \ --add-drop-database \ --hex-blob \ --compress \ --events \ --routines \ --single-transaction \ --triggers | zstd -1 > $TARGET_DIR/$FILENAME.tmp mv $TARGET_DIR/$FILENAME.tmp $TARGET_DIR/$FILENAME elif [ `docker exec -i $CONTAINER test -e /usr/bin/pg_dump && echo "yes" || echo "no"` = "yes" ]; then DBTYPE="pgsql" FILENAME=`date +"%Y%m%d_%H%M%S"`_$DBTYPE_$CONTAINER.sql.zst docker exec -i $CONTAINER pg_dumpall --username=$DB_USER --password=$PGPASSWORD | zstd -1 > $TARGET_DIR/$FILENAME.tmp mv $TARGET_DIR/$FILENAME.tmp $TARGET_DIR/$FILENAME else echo "Unsupported database type or database client not found in the container." exit 1 fi echo "Backup completed successfully." # Remove old backups echo "Removing old backups, keeping last $HISTORY backups..." cd $TARGET_DIR ls -1t *_$DBTYPE_$CONTAINER.sql.zst | tail -n +$((HISTORY + 1)) | xargs -r rm -- cd - echo "Old backups removed." if [ -n "$NOTIFY_URL" ]; then curl $NOTIFY_URL fi