130 lines
7.1 KiB
HTML
130 lines
7.1 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>Регистрация сервера — SHiNE Server Admin</title>
|
||
<link rel="stylesheet" href="styles.css" />
|
||
<style>
|
||
.pwd-wrap { display: flex; }
|
||
.pwd-wrap input { flex: 1; border-radius: var(--radius) 0 0 var(--radius); }
|
||
.btn-eye { border: 1px solid var(--border); border-left: none; background: #0d0d0d;
|
||
color: var(--text-muted); border-radius: 0 var(--radius) var(--radius) 0;
|
||
padding: 0 16px; cursor: pointer; font-size: 13px; }
|
||
.btn-eye:hover { color: var(--accent); border-color: var(--accent); }
|
||
.gen-msg { font-size: 12px; margin-top: 8px; padding: 8px 12px; border-radius: var(--radius); display: none; }
|
||
.gen-msg.ok { display:block; background:#1a2e1a; border:1px solid #2a4a2a; color:#7dcc7d; }
|
||
.gen-msg.err { display:block; background:#2e1a1a; border:1px solid #5a2a2a; color:#f08080; }
|
||
.kp-title { font-size:11px; font-weight:700; color:var(--accent); text-transform:uppercase; letter-spacing:.06em; margin-bottom:8px; }
|
||
.kp-row { display:flex; gap:8px; align-items:flex-start; margin-bottom:6px; }
|
||
.kp-row:last-child { margin-bottom:0; }
|
||
.kp-lbl { font-size:11px; color:var(--text-muted); min-width:60px; padding-top:10px; }
|
||
.kp-inp { flex:1; font-size:11px; font-family:monospace; padding:8px 10px; }
|
||
.kp-block { margin-bottom:14px; padding-bottom:14px; border-bottom:1px solid var(--border); }
|
||
.kp-block:last-child { border-bottom:none; margin-bottom:0; padding-bottom:0; }
|
||
.sec-lbl { font-size:11px; color:var(--text-muted); text-transform:uppercase; letter-spacing:.06em; margin:16px 0 10px; }
|
||
.sol-box { margin-top:14px; background:#0d1a0d; border:1px solid #2a4a2a; border-radius:var(--radius); padding:10px 14px; display:none; }
|
||
.sol-box.show { display:block; }
|
||
.sol-ttl { font-size:12px; font-weight:600; color:#7dcc7d; }
|
||
.sol-adr { font-family:monospace; font-size:12px; word-break:break-all; margin-top:4px; }
|
||
.sol-ht { font-size:11px; color:var(--text-muted); margin-top:4px; }
|
||
.sol-topup-btn { margin-top:10px; width:100%; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="container">
|
||
<div class="nav-links">
|
||
<a href="../server-ui.html">← Назад</a>
|
||
<a href="update-server-pda.html">Обновить PDA</a>
|
||
</div>
|
||
|
||
<h1>Регистрация серверного аккаунта</h1>
|
||
<p class="subtitle">Создаёт user_pda в Solana с флагом is_server=true</p>
|
||
|
||
<div class="card">
|
||
<h2>Параметры Solana</h2>
|
||
<div class="field">
|
||
<label>Solana Endpoint</label>
|
||
<input type="text" id="endpoint" value="https://api.devnet.solana.com" />
|
||
<div class="hint">devnet: https://api.devnet.solana.com · mainnet: https://api.mainnet-beta.solana.com</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Данные сервера</h2>
|
||
<div class="field">
|
||
<label>Логин сервера</label>
|
||
<input type="text" id="login" placeholder="shineupme" maxlength="20" />
|
||
<div class="hint">Только a-z, 0-9, _ · без точки · макс. 20 символов</div>
|
||
</div>
|
||
<div class="field">
|
||
<label>Адрес сервера (URL)</label>
|
||
<input type="text" id="serverAddress" placeholder="https://shineup.me/ws" />
|
||
</div>
|
||
<div class="field">
|
||
<label>Серверы синхронизации (sync_servers)</label>
|
||
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
|
||
</div>
|
||
<div class="field">
|
||
<label>Серверы доступа (access_servers, опционально)</label>
|
||
<textarea id="accessServers" placeholder="Обычно пусто для серверного PDA"></textarea>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Ключи сервера</h2>
|
||
|
||
<div class="field">
|
||
<label>Пароль</label>
|
||
<div class="pwd-wrap">
|
||
<input type="password" id="password" placeholder="Пароль аккаунта сервера" autocomplete="new-password" />
|
||
<button class="btn-eye" id="btnEye" type="button">Показать</button>
|
||
</div>
|
||
<div class="hint">Нажмите «Сгенерировать» — поля ниже заполнятся из логина + пароля (Argon2id).<br/>Или введите ключи вручную.</div>
|
||
</div>
|
||
|
||
<div class="btn-row">
|
||
<button class="btn-secondary" id="btnGen" type="button">Сгенерировать ключи</button>
|
||
</div>
|
||
<div class="gen-msg" id="genMsg"></div>
|
||
|
||
<div class="sec-lbl">Секрет (master secret, base58)</div>
|
||
<div class="field" style="margin-bottom:0">
|
||
<input type="text" id="masterSecret" placeholder="32-байтовый master secret в base58 (~44 символа)" />
|
||
</div>
|
||
|
||
<div class="sec-lbl">Ключевые пары (base58)</div>
|
||
|
||
<div class="kp-block">
|
||
<div class="kp-title">Root Key — подпись PDA-записи</div>
|
||
<div class="kp-row"><span class="kp-lbl">Публичный</span><input class="kp-inp" type="text" id="rootPub" placeholder="base58, ~44 символа" /></div>
|
||
<div class="kp-row"><span class="kp-lbl">Приватный</span><input class="kp-inp" type="text" id="rootPriv" placeholder="seed base58, ~44 символа" /></div>
|
||
</div>
|
||
<div class="kp-block">
|
||
<div class="kp-title">Blockchain Key — подпись LastBlockState</div>
|
||
<div class="kp-row"><span class="kp-lbl">Публичный</span><input class="kp-inp" type="text" id="bchPub" placeholder="base58, ~44 символа" /></div>
|
||
<div class="kp-row"><span class="kp-lbl">Приватный</span><input class="kp-inp" type="text" id="bchPriv" placeholder="seed base58, ~44 символа" /></div>
|
||
</div>
|
||
<div class="kp-block">
|
||
<div class="kp-title">Device Key — оплата транзакции Solana</div>
|
||
<div class="kp-row"><span class="kp-lbl">Публичный</span><input class="kp-inp" type="text" id="devPub" placeholder="base58, ~44 символа (= Solana-адрес)" /></div>
|
||
<div class="kp-row"><span class="kp-lbl">Приватный</span><input class="kp-inp" type="text" id="devPriv" placeholder="seed base58, ~44 символа" /></div>
|
||
<div class="sol-box" id="solBox">
|
||
<div class="sol-ttl">Положите SOL на этот адрес перед регистрацией:</div>
|
||
<div class="sol-adr" id="solAdr"></div>
|
||
<div class="sol-ht">Это Solana-адрес device-ключа (public key в base58 = Solana-адрес). С него оплачивается создание PDA.</div>
|
||
<button class="btn-secondary sol-topup-btn" id="btnTopupDevnet" type="button">Открыть пополнение DEVNET</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="btn-row">
|
||
<button class="btn-primary" id="btnCreate">Зарегистрировать сервер</button>
|
||
</div>
|
||
<div class="status" id="status"></div>
|
||
</div>
|
||
|
||
<script type="module" src="./js/create-server-pda-page.js"></script>
|
||
</body>
|
||
</html>
|