v0.1.28: email-идентичность — детерминированные креды из email, credentials-эндпоинт, UI модалка
This commit is contained in:
+27
-11
@@ -347,7 +347,7 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
|
||||
<div>Admin API: <span style="font-family:monospace">POST /admin/tenants</span> (Bearer token)</div>
|
||||
<div>Realm: <span style="font-family:monospace">iot-naeel</span> · Persistence: Managed Redis</div>
|
||||
<div>Версия: <span id="svc-version" style="font-family:monospace">—</span></div>
|
||||
<div>Образ: <span style="font-family:monospace">naeel/shared-sqs:v0.1.27</span></div>
|
||||
<div>Образ: <span style="font-family:monospace">naeel/shared-sqs:v0.1.28</span></div>
|
||||
<div style="margin-top:8px;color:var(--warning)">Статус: тестирование</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -396,10 +396,18 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
|
||||
<!-- ===== CREDENTIALS MODAL ===== -->
|
||||
<div id="modal-creds" class="modal-overlay hidden" onclick="if(event.target===this)closeCredsModal()">
|
||||
<div class="modal">
|
||||
<h2>Тенант создан</h2>
|
||||
<p style="color:var(--warning);font-size:13px;margin-bottom:16px">
|
||||
⚠ Сохраните credentials — Secret Key показывается только один раз.
|
||||
<h2>Credentials</h2>
|
||||
<p style="color:var(--warning);font-size:13px;margin-bottom:12px">
|
||||
⚠ Сохраните ключи — это креды вашего тенанта для AWS CLI/SDK.
|
||||
</p>
|
||||
<div style="font-size:12px;color:var(--text-secondary);background:var(--bg-page);border:1px solid var(--border);border-radius:4px;padding:10px 12px;margin-bottom:16px;line-height:1.8;word-break:break-all">
|
||||
<strong>Зачем:</strong> приложения подключаются к SQS API по протоколу AWS
|
||||
(подпись Signature V4). Токен входа в консоль для этого не подходит.<br>
|
||||
<strong>Что делать:</strong><br>
|
||||
<code>export AWS_ACCESS_KEY_ID=<Access Key></code><br>
|
||||
<code>export AWS_SECRET_ACCESS_KEY=<Secret Key></code><br>
|
||||
<code>aws sqs list-queues --endpoint-url https://sqs.containerk8s.dev.nubes.ru --region us-east-1</code>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Access Key</label>
|
||||
<input id="creds-ak" readonly onclick="copyField(this)">
|
||||
@@ -647,7 +655,6 @@ function renderDashboard(health, tenants) {
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Имя</th>
|
||||
<th>Access Key</th>
|
||||
<th>Макс. очередей</th>
|
||||
<th>Статус</th>
|
||||
<th>Создан</th>
|
||||
@@ -657,7 +664,6 @@ function renderDashboard(health, tenants) {
|
||||
${(tenants || []).map(t => `
|
||||
<tr onclick="showTenant('${esc(t.id)}')">
|
||||
<td><strong>${esc(t.name)}</strong></td>
|
||||
<td style="font-family:monospace;font-size:12px">${esc(t.access_key)}</td>
|
||||
<td>${t.max_queues}</td>
|
||||
<td>${t.active
|
||||
? '<span class="badge badge-active">active</span>'
|
||||
@@ -665,7 +671,7 @@ function renderDashboard(health, tenants) {
|
||||
<td style="font-size:12px;color:var(--text-secondary)">${fmtDate(t.created_at)}</td>
|
||||
</tr>
|
||||
`).join('')}
|
||||
${(!tenants || tenants.length === 0) ? '<tr><td colspan="5" style="text-align:center;color:var(--text-secondary);padding:32px">Tenant не найден</td></tr>' : ''}
|
||||
${(!tenants || tenants.length === 0) ? '<tr><td colspan="4" style="text-align:center;color:var(--text-secondary);padding:32px">Tenant не найден</td></tr>' : ''}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -717,16 +723,13 @@ function renderTenant(tenant, queues) {
|
||||
<div class="stat-value">${tenant.max_queues}</div>
|
||||
<div class="stat-label">Лимит очередей</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" style="font-size:20px;font-family:monospace">${esc(tenant.access_key)}</div>
|
||||
<div class="stat-label">Access Key</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="toolbar">
|
||||
<h2>Очереди</h2>
|
||||
<div style="display:flex;gap:12px;align-items:center">
|
||||
<div class="auto-refresh"><span>⟳ 10с</span></div>
|
||||
<button class="btn btn-primary btn-sm" onclick="showCredentials()">Credentials</button>
|
||||
<button class="btn btn-primary btn-sm" onclick="openCreateQueueModal('${esc(tenant.id)}')" >+ Очередь</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -817,6 +820,19 @@ function closeCredsModal() {
|
||||
document.getElementById('modal-creds').classList.add('hidden');
|
||||
}
|
||||
|
||||
// showCredentials — запрашивает ключи тенанта и показывает их в модалке
|
||||
function showCredentials() {
|
||||
api('/credentials')
|
||||
.then(data => {
|
||||
document.getElementById('creds-ak').value = data.access_key || '';
|
||||
document.getElementById('creds-sk').value = data.secret_key || '';
|
||||
document.getElementById('modal-creds').classList.remove('hidden');
|
||||
})
|
||||
.catch(err => {
|
||||
alert('Не удалось получить credentials: ' + err.message);
|
||||
});
|
||||
}
|
||||
|
||||
// deleteTenant — DELETE /tenants/{id} с подтверждением
|
||||
function deleteTenant(id, name) {
|
||||
if (!confirm('Удалить тенанта "' + name + '"?\nВсе его очереди будут удалены.')) return;
|
||||
|
||||
Reference in New Issue
Block a user