Migrate a Keycloak Embedded Database to a Database Service (Linux)
We recommend migrating the embedded database Keycloak comes with to a database service for Linux. For more information on the supported databases, refer to Supported databases for the new Keycloak store.
To migrate a PoolParty realm-specific Keycloak embedded database to a database service for Linux, do the following:
Stop the PoolParty service if it's running at
/path/to/poolparty/bin/poolparty.Do a complete backup of data at
/path/to/poolparty.Go to the
/path/to/poolparty/binfolder.Put the script into this folder. The script is called
migrate-keycloak-to-dbin this example and you can find it below.Make the
migrate-keycloak-to-dbfile executable with chmod +x /path/to/poolparty/bin/migrate-keycloak-to-db.Edit the
migrate-keycloak-to-dbfile and define the following:DB_VENDORDB_USERNAMEDB_PASSWORDDB_HOSTDB_PORTDB_NAME
Here is an example screenshot:

Execute ./migrate-keycloak-to-db to migrate to the defined database service.
Tip
If something goes wrong (for example you have provided a wrong database password), you can either recover the installation from the backup created in step 2 or execute ./migrate-keycloak-to-db rollback.
Caution
It is important to run the rollback before redoing the migration with changed settings.
Here is the script to migrate an embedded Keycloak database to a Linux database service.
#!/bin/bash
DB_VENDOR=<ENTER DB VENDOR HERE> # postgres, mariadb, mssql, mysql, oracle, postgres
DB_USERNAME=<ENTER
DB USER HERE>
DB_PASSWORD=<ENTER
DB PASSWORD HERE>
DB_HOST=<ENTER
DB HOST HERE>
DB_PORT=<ENTER
DB PORT HERE>
DB_NAME=<ENTER
DB NAME HERE>
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
KC_CONF_DIR="$SCRIPT_DIR/../auth_service/keycloak/conf"
KC_BIN_DIR="$SCRIPT_DIR/../auth_service/keycloak/bin"
BACKUP_DATE=`date "+%Y%M%d%H%M%S"`
BACKUP_DIR="$SCRIPT_DIR/backup-before-migrating-to-postgres"
LOG_FILE="$SCRIPT_DIR/migrate-keycloak-to-db.log"
case $1 in
migrate)
# stop services
echo "Stopping PoolParty Services..."
$SCRIPT_DIR/poolparty stop >> $LOG_FILE 2>&1
# backup existing config files
mkdir -p $BACKUP_DIR
touch $BACKUP_DIR/$BACKUP_DATE
cp $KC_CONF_DIR/keycloak.conf $BACKUP_DIR
cp $SCRIPT_DIR/poolparty $BACKUP_DIR
# backup realm
echo "Exporting keycloak data..."
$KC_BIN_DIR/kc.sh export --file $BACKUP_DIR/keycloak.json >> $LOG_FILE 2>&1
cp $BACKUP_DIR/keycloak.conf $BACKUP_DIR/keycloak.conf.new
# comment any db setting echo "Configuring keycloak..."
sed -e '/db/ s/^#*/#/' -i $BACKUP_DIR/keycloak.conf.new
echo "" >> $BACKUP_DIR/keycloak.conf.new
echo "# DB settings shipped by $0" >> $BACKUP_DIR/keycloak.conf.new
echo "db=$DB_VENDOR" >> $BACKUP_DIR/keycloak.conf.new
echo "db-username=$DB_USERNAME" >> $BACKUP_DIR/keycloak.conf.new
echo "db-password=$DB_PASSWORD" >> $BACKUP_DIR/keycloak.conf.new
echo "db-url-host=$DB_HOST" >> $BACKUP_DIR/keycloak.conf.new
echo "db-url-port=$DB_PORT" >> $BACKUP_DIR/keycloak.conf.new
echo "db-url-database=$DB_NAME" >> $BACKUP_DIR/keycloak.conf.new
# all configuration done # now copy new config to kc/conf folder
cp $BACKUP_DIR/keycloak.conf.new $KC_CONF_DIR/keycloak.conf
# build keycloak echo "Building keycloak..."
$KC_BIN_DIR/kc.sh build >> $LOG_FILE 2>&1
echo "Importing keycloak data..."
$KC_BIN_DIR/kc.sh import --file $BACKUP_DIR/keycloak.json >> $LOG_FILE 2>&1
echo "Migrated to database: $DB_VENDOR - please start poolparty" ;; rollback)
# stop services echo "Stopping PoolParty Services..."
$SCRIPT_DIR/poolparty stop >> $LOG_FILE 2>&1
echo "Rolling back keycloak config..."
cp $BACKUP_DIR/keycloak.conf $KC_CONF_DIR/keycloak.conf
echo "Building keycloak..."
$KC_BIN_DIR/kc.sh build >> $LOG_FILE 2>&1
echo "Rollback completed" ;; *)
echo "Usage" echo "$0 migrate|rollback"
;;esac