이제껏 DB를 따로 생성하지 않아도 Realm, Client, User를 생성하고 저장할 수 있었던 이유는, Keycloak내의 내부 DB(h2)를 사용하고 있었기 때문입니다.
하지만 보통 운영 단계에서는 외부 DB를 사용하는 경우가 많으므로 Keycloak 내부 DB에서 외부 DB로 변경해보겠습니다.
설치 DB는 Mysql입니다. 저는 Docker Compose로 설치해보겠습니다.
Mysql 5버전 설치
# docker-compose.yml
version: "3.8"
services:
mysql_5:
image: mysql:5.7.38
container_name: mysql_5
environment:
- MYSQL_DATABASE=keycloak5
- MYSQL_USER=jerry
- MYSQL_PASSWORD=password
- MYSQL_ROOT_PASSWORD=root_password
ports:
- "3305:3306" # 포트는 3305번으로 생성하겠습니다.
healthcheck:
test: "mysqladmin ping -u root -p$${MYSQL_ROOT_PASSWORD}"
Mysql 8버전 설치
# docker-compose.yml
version: "3.8"
services:
mysql_8:
image: mysql:8.0.29
container_name: mysql_8
environment:
- MYSQL_DATABASE=keycloak8
- MYSQL_USER=jerry
- MYSQL_PASSWORD=password
- MYSQL_ROOT_PASSWORD=root_password
ports:
- "3308:3306" # 포트는 3308번으로 생성하겠습니다.
healthcheck:
test: "mysqladmin ping -u root -p$${MYSQL_ROOT_PASSWORD}"
이제 다음 커맨드를 입력하여 실행해 줍니다.
$ docker-compose up -d
Realm 백업
여태 작업 한 내용들이 아까우니, 백업을 해줍시다.
Export 메뉴로 들어가 Export를 하면 SampleRealm의 백업파일인 realm-export.json 파일이 다운로드 됩니다.
외부 DB 설정
17버전을 기준으로 변경되었습니다. 복잡했던 16버전에 비해, 17 이후 버전은 설정이 간편해졌습니다.
keycloak이 설치된 폴더안에 conf 폴더 내 keycloak.conf 파일을 수정하겠습니다.
다음 커맨드로 keycloak.conf파일에 접근합니다.
$ vi ./conf/keycloak.conf
keycloak.conf 파일을 아래와 같이 설정했습니다.
# Basic settings for running in production. Change accordingly before deploying the server.
# Port
# 기존 8080이었던 keycloak 포트를 9090으로 변경
http-port=9090
# Database
# The database vendor.
db=mysql
# The username of the database user.
db-username=jerry
# The password of the database user.
db-password=password
# The full database JDBC URL. If not provided, a default URL is set based on the selected database vendor.
db-url=jdbc:mysql://localhost:3308/keycloak8
이후 keycloak을 재 실행 시켜줍니다.
$ sh ./bin/kc.sh start-dev
그럼 아래와 같이 keycloak8 데이터베이스에 테이블이 92개가 생성된 것을 확인 할 수 있습니다.
따로 테이블 생성이 필요 없는 이유는 keycloak이 실행되면서 liquibase가 실행되기 때문입니다.
# Keycloak 실행시 아래와 같은 로그가 발생하는데, jpa-changelog-master.xml 정보로 데이터베이스를 업데이트 한다는 것을 확인 할 수 있습니다.
2022-06-29 13:46:21,750 INFO [org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
이제 http://localhost:9090 에 접속해 보면 아래와 같은 화면이 나옵니다. admin 계정을 생성해주세요.
이제 Export 했던 Realm 설정을 Import 하겠습니다.
Import 메뉴에서 Import를 하면 에러가 발생합니다.
그래서 위와 같이 Add realm 버튼을 누른 후 Select file을 클릭하여 백업해 두었던 realm-export.json파일을 선택합니다.
정상적으로 Realm이 생성되고, 외부 DB에서도 Realm이 생성된 것을 확인 할 수 있습니다.
수고하셨습니다.