Развертывание Keycloak на VPS с использованием Docker-compose, Nginx, Certbot и SSL
Всем привет!
В этой статье я бы хотел поделиться, как развернуть Keycloak на VPS с использованием Docker-compose, Nginx, Certbot и SSL.
Ключевые моменты:
Keycloak v.25.0.1
SSL защита для Keycloak
Certbot v.2.11.0 для получения и обновления сертификатов SSL
Nginx v.1.27.0 в качестве reverse proxy
Postgres v.14 для использования вместо стандартной внутренней H2 БД Keycloak
Автоматический импорт рилмов во время деплоя
docker-compose для автоматизации деплоя
.env файл для управления переменными системного окружения
Если кто-то вдруг не сталкивался что странно, Keycloak — это мощная система управления доступом с поддержкой SSO, которая может значительно упростить управление пользователями и их аутентификацией.
Желание развернуть свой Keycloak может возникнуть как для экспериментов со своими проектами, так и при разборе своих обычных рабочих бэкэндерских задач. Так случилось и у меня. Решил убить двух зайцев одним выстрелом. Но всеобъемлющей инструкции найти не удалось. Локально мне Keycloak конечно не нужен. Но вот поднять его на отдельном и всегда доступном сервере, да еще и с бэкапом, а также с возможностью экспорта/импорта рилмов и тп - это отлично. Плюс автоматизирован сам процесс развертывания, что облегчит и переход к другому VPS провайдеру.
Мотивация у всех своя, но ближе к делу.
Введение
Что такое Keycloak?
Keycloak — это решение для управления идентификацией и доступом с открытым исходным кодом. Оно предоставляет такие функции, как SSO (Single Sign-On), управление пользователями, аутентификация и авторизация.
Почему Docker-compose?
Docker-compose позволяет легко управлять многокомпонентными приложениями, такими как Keycloak, и упрощает процесс развертывания и масштабирования. В данной инструкции используются контейнеры с Keycloak, Certbot, Nginx, а также с БД Postgres.
Зачем нужен Nginx и Certbot?
Nginx будет выступать в роли reverse proxy, обеспечивая безопасность и производительность, а Certbot поможет получить и автоматически обновлять SSL-сертификаты от Let's Encrypt и позволит нам эконоимить пару тысяч рублей на сертификатах для нашего домена, что приятно.
Начнем!
Шаг 1: Подготовка окружения
Клонирование репозитория
Для начала клонируем на наш VPS репозиторий с готовыми конфигурациями, который я уже заботливо для вас подготовил. В нем лежит docker-compose.yml для управления развертыванием, конфиги для nginx и файл с переменными окружения, который нужен будет для docker-compose
git clone git@github.com:s-rb/keycloak-dockerized-ssl-nginx.git
cd keycloak-dockerized-ssl-nginx
Редактирование файла .env
Откройте файл .env
и отредактируйте следующие переменные:
KEYCLOAK_ADMIN_PASSWORD
- пароль админа для доступа в Keycloak,KC_DB_PASSWORD
- Пароль для доступа сервиса кейклоак в БД Postgres (должен быть равен POSTGRES_PASSWORD если не создан отдельный пользователь),POSTGRES_PASSWORD
- пароль админа для Postgres
Замените password
на свои значения, если конечно не хотите чтобы к вам мог подключиться кто угодно ;)
Пример полного файла с переменными:
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=password
PROXY_ADDRESS_FORWARDING=true
KC_PROXY=edge
KC_DB=postgres
KC_DB_URL=jdbc:postgresql://keycloak-postgres:5432/keycloak
KC_DB_USERNAME=keycloak
KC_DB_PASSWORD=password
POSTGRES_DB=keycloak
POSTGRES_USER=keycloak
POSTGRES_PASSWORD=password
Шаг 2: Регистрация домена и настройка DNS
Данный пункт может выполняться и до первого шага - он никак не зависит от него. Далее в инструкции полагаем что у вас будет зарегистрирован свой домен (напримерsurkoff.com)
и мы хотим чтобы Keycloak был бы доступен по my-keycloak.surkoff.com
Регистрация домена
Зарегистрируйте домен у любого регистратора, например у REG.RU.
Создание записи A для поддомена
Создайте запись A
, указывающую на IP вашего сервера. Например, для поддомена my-keycloak.surkoff.com
укажите IP вашего сервера.

Проверка записи DNS
Убедитесь, что DNS запись корректно настроена:
ping my-keycloak.surkoff.com
В ответе должен быть указан IP адрес вашего сервера.
Шаг 3: Настройка Nginx
Конфигурация Nginx
В конфигах nginx - default.conf_with_ssl, default.conf_without_ssl указываем свой домен:
В секции
server_name
В пути к сертификату
ssl_certificate
В пути к ключу
ssl_certificate_key
Пример конфигурации с SSL:
server {
listen 80;
server_name my-keycloak.surkoff.com;
location /.well-known/acme-challenge/ {
root /data/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name my-keycloak.surkoff.com;
ssl_certificate /etc/letsencrypt/live/my-keycloak.surkoff.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-keycloak.surkoff.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://keycloak:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
}
Шаг 4: Получение SSL-сертификата
Получение тестового сертификата
Используйте конфигурацию без SSL:
cp nginx/conf.d/default.conf_without_ssl nginx/conf.d/default.conf
docker-compose up -d
Получите тестовый сертификат (заменить домен и email на свои):
docker exec certbot certbot certonly --webroot --webroot-path=/data/letsencrypt -d my-keycloak.surkoff.com --email your_email@gmail.com --agree-tos --no-eff-email --staging

Проверяем наличие сертификата
docker exec certbot certbot certificates
Удаление тестового сертификата (заменить домен на свой)
docker exec certbot certbot delete --cert-name my-keycloak.surkoff.com
Получение реального сертификата (заменить email и домен на свои)
docker exec certbot certbot certonly --webroot --webroot-path=/data/letsencrypt -d my-keycloak.surkoff.com --email your_email@gmail.com --agree-tos --no-eff-email
Шаг 5: Финальная настройка и запуск
Обновление конфигурации Nginx для использования SSL
docker-compose down
cp nginx/conf.d/default.conf_with_ssl nginx/conf.d/default.conf
docker-compose up -d
Проверка доступа к Keycloak
Откройте браузер и перейдите по адресу my-keycloak.surkoff.com
(ваш домен).
Вы должны увидеть вход в админку, куда вы можете попасть используя логин и пароль которые вы указали в системных переменных файла .env

По настройке Keyckloak есть интересные статьи на Хабре и на других ресурсах, в рамках данной публикации этой темы касаться не будем.
Автоматическое обновление сертификатов
Чтобы автоматически обновлять сертификаты и перезапускать Nginx, создаем скрипт renew_and_reload.sh
(уже имеется в репозиторие):
#!/bin/bash
# Обновление сертификатов
docker exec certbot certbot renew --webroot --webroot-path=/data/letsencrypt
# Перезапуск Nginx
docker restart nginx
Делаем скрипт исполняемым:
chmod +x renew_and_reload.sh
Добавляем его в crontab для регулярного выполнения:
crontab -e
Добавляем строку в crontab, не забывая указать путь к скрипту:
0 0 1 * * /path/to/renew_and_reload.sh
Импорт рилмов
Если хотите импортировать на старте рилм, то можно положить его в папку keycloak/config/my-realm.json и он будет импортирован при старте приложения.
Заключение
На этом все! Теперь у вас есть развернутый Keycloak с SSL на вашем VPS. Надеюсь, эта статья была полезной! Если у вас возникли вопросы или предложения, пишите в ЛС.
Исходный код доступен по ссылке.