Данный пост является продолжением серии статей о внедрении 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:

Продолжение следует…

Комментарии (0)