Add initial Keycloak setup with custom theme and Docker configuration

- Created .env.example for environment variable configuration.
- Added .gitignore to exclude .env files.
- Introduced docker-compose files for Keycloak and Postgres services.
- Implemented custom Keycloak theme 'drill-luxe' with associated templates and styles.
- Updated README with deployment instructions and repository details.
This commit is contained in:
Первов Артем
2026-04-06 00:26:59 +03:00
commit af41f66bbe
12 changed files with 759 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
<!DOCTYPE html>
<html class="${properties.kcHtmlClass!}" lang="${lang}">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Drill View Login</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 120'%3E%3Crect width='120' height='120' rx='28' fill='%230f1115'/%3E%3Cpath d='M32 89L54 24h12l22 65h-12l-4-13H48l-4 13H32zm19-23h18L60 38 51 66z' fill='%23d4a574'/%3E%3C/svg%3E" />
<#if properties.styles?has_content>
<#list properties.styles?split(' ') as style>
<link href="${url.resourcesPath}/${style}" rel="stylesheet" />
</#list>
</#if>
</head>
<body class="drill-login">
<main class="drill-login__shell">
<section class="drill-login__brand">
<div class="drill-login__brand-mark">D</div>
<div class="drill-login__brand-copy">
<span class="drill-login__eyebrow">Greact Drill</span>
<h1>Премиальный доступ к Drill View</h1>
<p>
Единая точка входа для операторов, инженеров и аналитиков. Безопасный вход в среду мониторинга,
документов и схем в фирменной бронзово-графитовой палитре Drill.
</p>
</div>
<div class="drill-login__feature-grid">
<article>
<span>01</span>
<strong>Единая сессия</strong>
<p>Один realm Keycloak для Drill View, Cloud API и встроенных приложений.</p>
</article>
<article>
<span>02</span>
<strong>Защищённый доступ</strong>
<p>Токены проверяются на backend, а браузер получает только актуальную сессию.</p>
</article>
<article>
<span>03</span>
<strong>Фирменный стиль</strong>
<p>Визуальная система синхронизирована с интерфейсом Drill View.</p>
</article>
</div>
</section>
<section class="drill-login__panel">
<div class="drill-login__panel-head">
<span class="drill-login__eyebrow">Secure Sign In</span>
<h2>Вход в систему</h2>
<p>Используйте корпоративную учётную запись Keycloak.</p>
</div>
<#if message?has_content>
<div class="drill-login__alert drill-login__alert--${message.type}">
${kcSanitize(message.summary)?no_esc}
</div>
</#if>
<form id="kc-form-login" class="drill-login__form" action="${url.loginAction}" method="post">
<div class="drill-login__field">
<label for="username">Логин</label>
<input
id="username"
name="username"
type="text"
value="${(login.username!'')}"
autocomplete="username"
autofocus
placeholder="Введите логин"
/>
</div>
<div class="drill-login__field">
<div class="drill-login__field-row">
<label for="password">Пароль</label>
<#if realm.resetPasswordAllowed>
<a href="${url.loginResetCredentialsUrl}">Не удаётся войти?</a>
</#if>
</div>
<input
id="password"
name="password"
type="password"
autocomplete="current-password"
placeholder="Введите пароль"
/>
</div>
<#if realm.rememberMe && !usernameEditDisabled??>
<label class="drill-login__remember">
<input id="rememberMe" name="rememberMe" type="checkbox" <#if login.rememberMe??>checked</#if> />
<span>Запомнить меня</span>
</label>
</#if>
<button class="drill-login__submit" name="login" id="kc-login" type="submit">
<span>Войти в Drill View</span>
</button>
</form>
<div class="drill-login__footer">
<span>Realm: ${realm.name}</span>
<span>Client: ${client.clientId!'drill-view-frontend'}</span>
</div>
</section>
</main>
</body>
</html>