Данный пост является продолжением серии статей о внедрении Keycloak в большой enterprise проект.
Основной практической темой данного поста является настройка стенда для локальной разработки, который в дальнейшем можно будет использовать и в CI для выполнения тестов.
Ниже я приведу compose файл, который у меня получился и дам ряд комментариев.
version: "3.9"
services:
keycloak-postgres:
image: library/postgres:${KC_POSTGRES_IMAGE_TAG:-14}
container_name: ${POSTGRES_CONTAINER_NAME:-postgres}
restart: on-failure
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
healthcheck:
test: pg_isready -d postgres
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
ports:
- ${KC_POSTGRES_PORT_MAPPING:-5435}:5432
deploy:
resources:
limits:
memory: 256M
keycloak:
image: quay.io/keycloak/keycloak:20.0.2
container_name: keycloak
command:
- start --auto-build --db postgres --hostname-strict-https false --hostname-strict false --proxy edge --http-enabled true --import-realm --spi-user-profile-legacy-user-profile-read-only-attributes *_RES_ACCESS_MODE
environment:
KC_DB_URL: jdbc:postgresql://keycloak-postgres:5432/postgres
KC_DB_USERNAME: postgres
KC_DB_PASSWORD: postgres
KC_DB_SCHEMA: public
KC_FEATURES: preview
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
volumes:
- type: bind
source: ./src/main/resources/keycloak/import/realm-export.json
target: /opt/keycloak/data/import/realm-export.json
read_only: true
- type: bind
source: ./src/main/resources/keycloak/scripts/custom-scripts.jar
target: /opt/keycloak/providers/custom-scripts.jar
read_only: true
ports:
- 8282:8080
depends_on:
keycloak-postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://0.0.0.0:8080/realms/master"]
start_period: 10s
interval: 30s
retries: 3
timeout: 5s
Данный compose-файл позволяет запустить keycloak в продуктивном режиме с реляционной базой данных.
Так как SSO это как правило отдельный микросервис, то под него имеет смысл выделять собственную БД.
Данный файл содержит ряд place-holder’ов для более гибкой конфигурации через .env файлы (в дальнейшем нам это пригодится для CI).
Пройдемся подробнее по конфигурации сервиса keycloak:
Все начинается с команды запуска:
start --auto-build --db postgres --hostname-strict-https false --hostname-strict false --proxy edge --http-enabled true --import-realm
Если мы посмотрим DockerFile [https://www.keycloak.org/server/containers ] из которого собирается наш образ Keycloak, то увидим, что entrypoint там стоит ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] (скрипт запуска Keycloak в standalone режиме). Команда start запускает приложение в production режиме.
Теперь пройдемся по опциям:
auto-build – собирает наш экземпляр со всеми зависимостями и кастомизациями
db – указывает, какую БД мы будем использовать, чтобы выбрать соответствующий драйвер
hostname-strict-https разрешаем/запрещаем фронту и бэку keycloak общаться по HTTP
proxy устанавливает режим reverse-proxy
hostname-strict вкл/выкл динамического имени хоста из заголовков запросов
http-enabled разрешаем взаимодействие по http
import-realm включаем импортирование realms из файлов конфигураций
После запуска данной конфигурации командой docker-compose up -d
у вас будет готовый стенд Keycloak, который можно использовать для разработки и прогона тестов, Главная страница будет доступна по адресу http://localhost:8282.
Войдя по admin:admin мы окажемся на странице master realm:
Продолжение следует…