Keycloak
Свой SSO-сервер и провайдер идентификации: единый вход для всех приложений по OpenID Connect, OAuth2 и SAML, федерация LDAP/AD, соц-логин и MFA. Развернули актуальную версию в боевом режиме, замерили и проверили: вход администратора и админ-консоль работают вживую.
Вердикт
- нужен единый вход (SSO) для нескольких своих приложений по OIDC/OAuth2/SAML
- важна федерация пользователей из LDAP/Active Directory и соц-логин
- нужен зрелый корпоративный стандарт, под который написаны интеграции у сотен продуктов
- нужен просто логин для одного небольшого приложения - тяжело для задачи
- жалко RAM: JVM прожорливее легких Go/Node-аналогов, комфортно от 4 ГБ
- хочется максимально простого IdP - authentik легче в освоении
Что это и какую задачу решает
Keycloak - open-source сервер управления доступом (IAM) и единого входа (SSO) под крылом CNCF, исторически от Red Hat. Вы поднимаете его один раз, и все ваши приложения перестают хранить пароли у себя: они аутентифицируют пользователей через Keycloak по стандартным протоколам - OpenID Connect (OIDC), OAuth 2.0 и SAML 2.0. Один вход, один каталог пользователей, одна точка для MFA и политик.
Из коробки: единый вход между приложениями, брокеринг внешних провайдеров и социальный логин (Google, GitHub, Microsoft и другие), федерация пользователей из LDAP и Active Directory, многофакторная аутентификация (TOTP/WebAuthn), самостоятельная регистрация, роли и тонкая авторизация, мультиарендность через realms. Это приватная self-hosted замена облачным Okta, Auth0 и Microsoft Entra ID: учетные записи остаются на вашем сервере, без оплаты за активных пользователей.
Чем отличается от облачных и от соседей
Сравнение с облачными IdP и с тем, что у нас уже есть в каталоге.
| Параметр | Keycloak (self-hosted) | Облачный IdP (Okta/Auth0) |
|---|---|---|
| Где данные | на вашем сервере | в облаке вендора |
| Протоколы | OIDC + OAuth2 + SAML разом | есть, часть - в платных планах |
| Федерация LDAP/AD | встроена | обычно платно |
| Цена | свой сервер, без оплаты за MAU | подписка за активных пользователей |
| Зрелость / интеграции | де-факто стандарт | высокая |
Если сравнивать внутри self-host: authentik - легче и проще в освоении, хорош для небольших установок; FreeIPA - про идентификацию Linux-хостов (Kerberos/LDAP/CA), другой слой. Keycloak - самый тяжелый из трех, но это корпоративный эталон app-SSO с максимумом протоколов и федерации.
Тех-стек и архитектура
Сервер Keycloak работает на Quarkus (со времен v17 старая сборка на WildFly убрана). Для боевого режима нужна база данных - здесь PostgreSQL 16 (встроенная H2 - только для dev и не переживает рестарт). Мы разворачиваем не start-dev, а именно start --optimized с преднастроенным под Postgres образом - это правильный прод-путь.
Наружу приложение слушает только localhost (порт 8080), health и метрики - на отдельном management-порту 9000. Публичный доступ - через Caddy обратным прокси с авто-TLS. Все realms, пользователи, клиенты и роли лежат в томе PostgreSQL.
Минимальная конфигурация
Реальные требования против официального минимума.
| Минимум (из-за JVM) | CPU4-RAM8-DISK100 |
| Реально в простое (весь стек) | ~0.64 GB RAM (keycloak 574 + postgres 49 + caddy 15 MiB) |
| Образы на диске | ~1.49 GB рантайм (keycloak 761 + postgres 642 + caddy 89 MB) |
| Рекомендуем тариф | CPU4-RAM8-DISK100 |
Важно: Keycloak на JVM прожорливее Go/Node-аналогов и дольше стартует. На 2 ГБ RAM он будет тесниться - берите от 4 ГБ. Первый старт дольше обычного: сборка оптимизированного образа плюс миграции базы.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS, правильно настроенный за прокси Keycloak и вход администратора паролем сервера.
Рекомендуемая конфигурация: CPU4-RAM8-DISK100
Развертывание на Fatmetal
Базовый путь - Cloud Server + Ubuntu 24.04 + Docker в боевом режиме за Caddy.
Создать VM
Ubuntu 24.04 с Docker. Тариф CPU4-RAM8 - JVM Keycloak любит память.
Задать переменные под прокси
KC_HOSTNAME=https://ваш-домен KC_HTTP_ENABLED=true KC_PROXY_HEADERS=xforwarded KC_DB=postgresKC_HOSTNAMEобязан совпадать с публичным адресом, иначе редиректы входа сломаются - это главная грабля.Собрать оптимизированный образ и поднять стек
kc.sh build # под Postgres docker compose up -d # keycloak + postgresПроверка готовности:
curl localhost:9000/health/readyдолжен вернутьstatus: UP.Закрыть TLS
Caddy обратным прокси на :8080 - автоматический сертификат Let's Encrypt на ваш домен.
Что измерили после запуска
Цифры со свежей установки в боевом режиме, весь стек без нагрузки.
| Контейнеров | 3 (keycloak + postgres + Caddy) |
| RAM в простое (весь стек) | ~0.64 GB (keycloak ~574 MiB) |
| Образы на диске | ~1.49 GB рантайм |
| Health-check | :9000/health/ready -> {status: UP} |
| Внешний отклик | https 302 -> /admin/, валидный Let's Encrypt |
Вход проверили предметно: запросили токен у master-realm через OIDC token endpoint (grant_type=password, client_id=admin-cli, логин admin) - сервер отдал Bearer access_token. То есть админ-вход паролем сервера действительно пускает в консоль, а не просто отдает страницу входа.
Проверено на версии 26.7.0, август 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли Keycloak за прокси, на которые спотыкаются все.
Причина. Не задан или неверен KC_HOSTNAME: Keycloak строит абсолютные URL по нему, и за прокси они уезжают на внутренний адрес.
Решение. Задайте KC_HOSTNAME=https://ваш-домен, включите KC_HTTP_ENABLED=true и KC_PROXY_HEADERS=xforwarded, перезапустите. В карте маркетплейса это уже настроено.
KC 26 сменил опции. Старое KC_PROXY=edge убрано - теперь KC_PROXY_HEADERS=xforwarded. Первый админ задается через KC_BOOTSTRAP_ADMIN_USERNAME/PASSWORD (старые KEYCLOAK_ADMIN* переименованы). Гайды под старые версии вводят в заблуждение.
Health не на 8080. В KC 26 /health/ready отвечает на management-порту 9000, а не на порту приложения. Проверяйте готовность именно там.
Безопасность и обновления
Сразу после входа смените пароль администратора и заведите постоянного админа (Keycloak сам подсказывает это баннером про временного bootstrap-админа). Для своих приложений работайте в отдельном realm, а не в master. Порт 8080 наружу не публикуйте - только через обратный прокси с TLS. Включите MFA для админов.
Обновление - смена тега образа и пересборка оптимизированного образа:
docker compose pull && docker compose up -d --build
Бэкап - том PostgreSQL (это все ваши realms, пользователи и клиенты):
docker exec keycloak-postgres-1 pg_dump -U keycloak keycloak > kc-backup.sql
Перед продом закройте: смену пароля админа и постоянного администратора, MFA, TLS на прокси, отдельный realm под приложения и регулярный бэкап тома PostgreSQL.
Связь с другими стеками
- Ваши приложения - подключаете как OIDC/SAML-клиентов, единый вход между ними.
- LDAP / Active Directory - федерация существующего каталога пользователей.
- Обратный прокси - Caddy или Nginx Proxy Manager для TLS и единого домена.
- Мониторинг - Prometheus и Grafana по метрикам Keycloak и контейнеров.
Когда это НЕ ваш выбор
Одно небольшое приложение
Если нужен просто логин для одного сервиса, Keycloak - из пушки по воробьям. Проще встроенная авторизация приложения или легкий authentik.
Жалко памяти
JVM прожорлив: комфортно от 4 ГБ RAM. На совсем маленьком сервере под кучей сервисов Keycloak будет тесно.
Нужен максимально простой IdP
Порог входа у Keycloak выше. Если важна простота настройки и современный UI без глубины энтерпрайза - посмотрите authentik.
Частые вопросы
Почему у меня админка ведет на localhost?
Не задан или неверен KC_HOSTNAME. Укажите его как публичный https-адрес и включите KC_PROXY_HEADERS=xforwarded. В карте маркетплейса это уже настроено.
Какие протоколы поддерживает?
OpenID Connect (OIDC), OAuth 2.0 и SAML 2.0. Плюс брокеринг внешних провайдеров и соц-логин.
Хватит ли 2 GB RAM?
Впритык. Из-за JVM Keycloak комфортно чувствует себя от 4 ГБ - берите CPU4-RAM8.
Чем отличается от authentik?
Keycloak - корпоративный эталон, тяжелее, максимум протоколов и федерации. authentik легче и проще в освоении. Ниши разные по аудитории.
Можно в продакшен?
Да. Мы разворачиваем боевой режим start --optimized с PostgreSQL и TLS. Останется сменить пароль админа, включить MFA и настроить бэкап.
Как делать бэкап?
Дампьте базу PostgreSQL (pg_dump) или бэкапьте том pgdata - там все realms, пользователи и клиенты.
Какие ограничения лицензии?
Лицензия Apache-2.0 - свободное использование, в том числе коммерческое. Ограничений на хостинг нет.
Итог
Keycloak - зрелый и мощный способ вынести аутентификацию из приложений в один SSO-сервер под своим контролем: OIDC, OAuth2 и SAML разом, федерация LDAP/AD, соц-логин и MFA, под Apache-2.0. Весь стек в простое ест около 0.64 GB, вход администратора проверили вживую. Плата за мощь - JVM и чуть более высокий порог входа, а также обязательный правильный KC_HOSTNAME за прокси, который мы закрыли в карте из коробки.
Этот стек у нас запущен на тарифе CPU4-RAM8. Нашли баг в гайде - напишите, поправим в течение дня.