Установка Keycloak в Docker Compose: пошаговая инструкция и конфигурация | AdminWiki

Полное руководство по установке Keycloak в Docker Compose: от базовой конфигурации до продакшн-сборки

18 декабря 2025 7 мин. чтения #devops #docker #docker compose #identity management #keycloak #sso #контейнеризация

Добро пожаловать в подробное руководство по развертыванию Keycloak — мощной системы управления идентификацией и доступом — с использованием Docker Compose. Если ты устал от сложных установок и хочешь получить готовое решение для аутентификации и авторизации в контейнерах, эта статья для тебя. Мы разберем все от базовой конфигурации до продвинутых настроек для продакшн-среды.

Что такое Keycloak и зачем он нужен в Docker Compose?

Keycloak — это open-source решение для Identity and Access Management (IAM), которое предоставляет Single Sign-On (SSO), авторизацию OAuth 2.0, OpenID Connect и многое другое. Установка Keycloak в Docker Compose дает несколько ключевых преимуществ:

  • Быстрое развертывание и масштабирование
  • Изоляция зависимостей и простое управление версиями
  • Воспроизводимость окружения (development, staging, production)
  • Упрощенное управление конфигурацией через YAML-файлы
Важно: Для работы этого руководства тебе понадобится установленный Docker и Docker Compose. Проверь версии командой docker --version и docker compose version.

Базовая установка Keycloak в Docker Compose

Давай начнем с минимальной рабочей конфигурации. Создай файл docker-compose.yml в отдельной директории.

yaml
version: '3.8'

services:
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    command: start-dev
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: password
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    networks:
      - keycloak-network

  postgres:
    image: postgres:15-alpine
    container_name: postgres
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - keycloak-network

volumes:
  postgres_data:

networks:
  keycloak-network:
    driver: bridge

Запуск и проверка установки

Выполни эти команды в директории с файлом docker-compose.yml:

bash
# Запуск контейнеров в фоновом режиме
docker compose up -d

# Проверка статуса контейнеров
docker compose ps

# Просмотр логов Keycloak
docker compose logs -f keycloak

После запуска открой браузер и перейди по адресу http://localhost:8080. Ты должен увидеть страницу приветствия Keycloak. Для входа в административную консоль используй:

  • URL: http://localhost:8080/admin
  • Логин: admin
  • Пароль: admin
Внимание: Конфигурация выше использует режим start-dev и простые пароли. Это подходит только для разработки! Для продакшн-среды нужно выполнить дополнительные настройки, которые мы рассмотрим дальше.

Продвинутая конфигурация для продакшн-среды

Для production-развертывания Keycloak в Docker Compose нужно учесть несколько важных аспектов: безопасность, производительность и отказоустойчивость.

1. Безопасная конфигурация с внешними секретами

Создай файл .env для хранения чувствительных данных:

bash
# .env файл
KEYCLOAK_ADMIN_PASSWORD=StrongPassword123!
POSTGRES_PASSWORD=DbSecurePass456!
KC_HOSTNAME=keycloak.yourdomain.com
KC_HTTPS_CERTIFICATE_FILE=/opt/keycloak/certs/tls.crt
KC_HTTPS_CERTIFICATE_KEY_FILE=/opt/keycloak/certs/tls.key

2. Продакшн-версия docker-compose.yml

yaml
version: '3.8'

services:
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak-prod
    command: start \
      --hostname-strict=false \
      --hostname-strict-https=false \
      --proxy=edge \
      --http-enabled=true
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
      KC_HOSTNAME: ${KC_HOSTNAME}
      KC_HOSTNAME_PORT: 443
      KC_PROXY: edge
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
      KC_LOG_LEVEL: INFO
      KC_CACHE: local
      KC_CACHE_STACK: kubernetes
    ports:
      - "8080:8080"
      - "8443:8443"
    volumes:
      - ./certs:/opt/keycloak/certs:ro
      - keycloak_data:/opt/keycloak/data
    depends_on:
      - postgres
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health/ready"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - keycloak-network

  postgres:
    image: postgres:15-alpine
    container_name: postgres-prod
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    command: >
      postgres 
      -c shared_buffers=256MB 
      -c max_connections=200
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U keycloak"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - keycloak-network

volumes:
  postgres_data:
  keycloak_data:

networks:
  keycloak-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

3. Настройка SSL/TLS сертификатов

Для работы с HTTPS нужно подготовить SSL сертификаты. Вот пример генерации самоподписанного сертификата для тестирования:

bash
mkdir -p certs
# Генерация самоподписанного сертификата (только для теста!)
openssl req -x509 -newkey rsa:4096 -keyout certs/tls.key -out certs/tls.crt \
  -days 365 -nodes -subj "/CN=keycloak.yourdomain.com"

# Установка правильных прав
chmod 600 certs/tls.key
chmod 644 certs/tls.crt

Оптимизация производительности Keycloak в Docker

Для высоконагруженных систем важно правильно настроить ресурсы. Добавь эти параметры в сервис Keycloak:

yaml
services:
  keycloak:
    # ... остальная конфигурация ...
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '2'
        reservations:
          memory: 1G
          cpus: '1'
    environment:
      # Оптимизация JVM для Keycloak
      JAVA_OPTS: >
        -Xms1g 
        -Xmx2g 
        -XX:MetaspaceSize=96M 
        -XX:MaxMetaspaceSize=256m
        -Djava.awt.headless=true 
        -Dfile.encoding=UTF-8
      # Настройки кэширования
      KC_CACHE_CONFIG_FILE: /opt/keycloak/conf/cache-ispn.xml
    volumes:
      - ./conf/cache-ispn.xml:/opt/keycloak/conf/cache-ispn.xml:ro

Частые проблемы и их решения

Проблема 1: Keycloak не подключается к PostgreSQL

Симптомы: В логах Keycloak ошибки подключения к базе данных.

Решение: Убедись, что PostgreSQL полностью запущен перед стартом Keycloak. Добавь healthcheck и используй depends_on с условием:

yaml
depends_on:
  postgres:
    condition: service_healthy

Проблема 2: Ошибки с прокси и hostname

Симптомы: Неправильные URL в редиректах или ошибки "Invalid parameter: redirect_uri".

Решение: Правильно настрой параметры прокси и hostname:

yaml
environment:
  KC_PROXY: edge  # или reencrypt/none в зависимости от инфраструктуры
  KC_HOSTNAME: your-real-domain.com
  KC_HOSTNAME_STRICT: false
  KC_HOSTNAME_STRICT_HTTPS: false

Сравнение режимов запуска Keycloak

Режим Команда Использование Производительность
Development start-dev Локальная разработка, тестирование Низкая
Production (Auto-build) start Продакшн с автоматической сборкой Высокая
Production (Optimized) (pre-built образ) Продакшн с предварительной сборкой Максимальная

FAQ: Ответы на частые вопросы

Как сделать бэкап данных Keycloak в Docker Compose?

Для бэкапа используй стандартные инструменты Docker. Бэкап базы данных PostgreSQL:

bash
# Бэкап базы данных
docker compose exec postgres pg_dump -U keycloak keycloak > backup_$(date +%Y%m%d).sql

# Бэкап томов Docker
docker run --rm -v keycloak_data:/data -v $(pwd):/backup alpine tar czf /backup/keycloak_data_$(date +%Y%m%d).tar.gz -C /data .

Как обновить версию Keycloak в Docker Compose?

Обновление происходит в несколько шагов:

  1. Сделай полный бэкап данных
  2. Измени тег образа в docker-compose.yml на новую версию
  3. Выполни docker compose pull для загрузки нового образа
  4. Останови и пересобери контейнеры: docker compose down && docker compose up -d
  5. Проверь логи на наличие ошибок миграции

Как настроить кластеризацию Keycloak в Docker Compose?

Для кластеризации нужно использовать общее хранилище сессий и настроить discovery. Пример минимальной конфигурации для 2 нод:

yaml
environment:
  KC_CACHE: local  # Используй 'ispn' для кластеризации
  KC_CACHE_STACK: kubernetes
  JGROUPS_DISCOVERY_PROTOCOL: kubernetes.KUBE_PING
  JGROUPS_DISCOVERY_PROPERTIES: namespace=default
  # Или для Docker без Kubernetes:
  # JGROUPS_DISCOVERY_PROTOCOL: dns.DNS_PING
  # JGROUPS_DISCOVERY_PROPERTIES: dns_query=keycloak

Заключение и лучшие практики

Установка Keycloak в Docker Compose — это мощный и гибкий способ развертывания системы управления идентификацией. Вот ключевые моменты, которые стоит запомнить:

  • Всегда используй отдельные файлы .env для хранения секретов
  • Настрой healthcheck для всех сервисов
  • Используй тома Docker для сохранения данных
  • Для продакшна обязательно настрой SSL/TLS
  • Мониторь логи и метрики Keycloak (доступны по /metrics и /health)
  • Регулярно обновляй образы и делай бэкапы
Совет от ментора: Начни с базовой конфигурации, протестируй ее в development-среде, а затем постепенно добавляй production-настройки. Не пытайся сразу настроить все сложные опции — двигайся итеративно.

Теперь у тебя есть полное руководство по установке Keycloak в Docker Compose. Ты можешь начать с простой конфигурации для тестирования и постепенно перейти к полноценной production-среде. Помни, что Keycloak — сложная система, и ее настройка требует понимания принципов аутентификации и авторизации. Удачи в реализации!

Поделиться:
Сохранить гайд? В закладки браузера