Как стать автором
Обновить

Развертывание 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. Надеюсь, эта статья была полезной! Если у вас возникли вопросы или предложения, пишите в ЛС.

Исходный код доступен по ссылке.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.