diff --git a/.gitignore b/.gitignore
index 52ca7bd1f29c7c9da49984e56829dfbe46a63636..f412b94b9cd58f30e8949d594ca48ce468b4cb52 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
 keycloak_db/
 themes/*
 !themes/custom-theme-template
+backups/*
diff --git a/backup.sh b/backup.sh
new file mode 100644
index 0000000000000000000000000000000000000000..cddb14275c26ef3bcbe4765f7719eb6b98333f95
--- /dev/null
+++ b/backup.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+echo "Backing up Keycloak DB and config"
+
+
+DIR=$(realpath $(dirname $0))
+
+if [ ! -e $DIR/.env ]
+then
+    echo ".env file do not exist"
+    exit 1
+fi
+
+. $DIR/.env
+
+if [ -z "$MARIADB_PASS" ]; then
+  echo "Error: the MARIADB_PASS variable is not set or is empty."
+  exit 1
+fi
+
+mkdir -p $DIR/backups
+
+out="$DIR/backups/keycloak_$(date +%Y%m%d_%H%M).tar.gz"
+
+if command -v docker-compose &> /dev/null; then
+    DOCKER_COMPOSE="docker-compose"
+elif docker compose version &> /dev/null; then
+    DOCKER_COMPOSE="docker compose"
+else
+    echo "'docker compose' and 'docker-compose' not found"
+    exit 1
+fi
+
+$DOCKER_COMPOSE exec -T mariadb mysqldump --all-databases -u root -p"$MARIADB_PASS" --default-character-set=utf8 | gzip > "$out"
+
+ls -lh $out
+echo "Done"
diff --git a/docker-compose.yml b/docker-compose.yml
index 13fa03d86593e80243b6eb071d13072f6a76ca0a..b6793e4d0ba2724c593aaffa08683abf421fc499 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -21,7 +21,7 @@ services:
 
     mariadb:
         image: mariadb:latest
-        container_name: mariadb
+        container_name: keycloak_mariadb
         volumes:
             - "./keycloak_db:/var/lib/mysql:rw"
         environment: