Files
gotelegram_pro/admin-web/static/index.html
2026-04-25 12:01:31 +03:00

324 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>goTelegram Pro Admin</title>
<script>
(function () {
var stored = localStorage.getItem("gotelegram-theme");
var theme = stored || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light");
document.documentElement.dataset.theme = theme;
}());
</script>
<link rel="stylesheet" href="/styles.css?v=2.5.0-admin6">
</head>
<body>
<div class="app-shell">
<aside class="sidebar" id="sidebar">
<div class="brand">
<div class="brand-mark">GT</div>
<div>
<strong>goTelegram Pro</strong>
<span data-i18n="brandSubtitle">Local Admin</span>
</div>
</div>
<nav class="nav-tabs" aria-label="Admin sections" data-i18n-aria-label="ariaAdminSections">
<button type="button" class="nav-item active" data-nav="dashboard"><span class="nav-icon"></span><span data-i18n="navDashboard">Dashboard</span></button>
<button type="button" class="nav-item" data-nav="traffic"><span class="nav-icon"></span><span data-i18n="navTraffic">Traffic</span></button>
<button type="button" class="nav-item" data-nav="keys"><span class="nav-icon"></span><span data-i18n="navKeys">Keys</span></button>
<button type="button" class="nav-item" data-nav="backups"><span class="nav-icon"></span><span data-i18n="navBackups">Backups</span></button>
<button type="button" class="nav-item" data-nav="logs"><span class="nav-icon"></span><span data-i18n="navLogs">Logs</span></button>
<button type="button" class="nav-item" data-nav="settings"><span class="nav-icon"></span><span data-i18n="navSettings">Settings</span></button>
</nav>
<div class="sidebar-foot">
<span id="sidebarVersion">v--</span>
<span id="sidebarBind">127.0.0.1:1984</span>
</div>
</aside>
<div class="workspace">
<header class="topbar">
<button id="menuBtn" class="icon-btn mobile-only" type="button" aria-label="Menu" data-i18n-aria-label="ariaMenu"></button>
<div class="title-block">
<p class="eyebrow" id="pageKicker">Local Admin</p>
<h1 id="pageTitle">Dashboard</h1>
<small id="lastRefresh">--</small>
</div>
<div class="top-actions">
<select id="languageSelect" class="language-select" aria-label="Language" data-i18n-aria-label="ariaLanguage">
<option value="en">EN</option>
<option value="ru">RU</option>
</select>
<button id="themeToggle" class="ghost" type="button">Theme</button>
<button id="refreshBtn" type="button" data-i18n="refresh">Refresh</button>
</div>
</header>
<main class="content">
<section class="page-panel active" data-page="dashboard">
<section class="visual-overview">
<div>
<p class="eyebrow">goTelegram Pro</p>
<h2 id="visualTitle">Port 443</h2>
<p id="visualText">Website, MTProxy and local admin status in one operational view.</p>
</div>
<div class="port-map" id="port443Map">
<div class="port-map-head">
<span>443</span>
<strong id="port443Summary">--</strong>
</div>
<div id="port443List" class="port-list"></div>
</div>
</section>
<div class="metric-grid">
<article class="metric-card accent-blue">
<span data-i18n="metricMode">Mode</span>
<strong id="metricMode">--</strong>
<small id="metricDomain">--</small>
<small id="siteStatus" class="metric-status">--</small>
</article>
<article class="metric-card accent-green">
<span data-i18n="metricKeys">Keys</span>
<strong id="metricUsers">0</strong>
<small data-i18n="configuredUsers">configured users</small>
</article>
<article class="metric-card accent-violet">
<span data-i18n="metricProxyTraffic">Proxy Traffic</span>
<strong id="metricProxyTraffic">0 B</strong>
<small id="metricProxyPackets">0 packets</small>
</article>
<article class="metric-card accent-amber">
<span data-i18n="metricSiteTraffic">Site Traffic</span>
<strong id="metricSiteTraffic">0 B</strong>
<small id="metricSitePackets">0 packets</small>
</article>
</div>
<div class="grid-two">
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="servicesEyebrow">Services</p>
<h2 class="with-help"><span data-i18n="servicesTitle">Service health</span><span class="info-hint" tabindex="0" data-i18n-title="servicesHelp" title="Service health">?</span></h2>
</div>
</div>
<div class="service-grid" id="services"></div>
</section>
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="runtimeEyebrow">Runtime</p>
<h2 class="with-help"><span data-i18n="runtimeTitle">telemt summary</span><span class="info-hint" tabindex="0" data-i18n-title="runtimeHelp" title="Runtime data">?</span></h2>
</div>
</div>
<div id="runtimeCards" class="runtime-grid"></div>
<div id="runtimeIssues" class="issue-list"></div>
</section>
</div>
</section>
<section class="page-panel" data-page="traffic">
<div class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="trafficEyebrow">Traffic</p>
<h2 data-i18n="trafficTitle">History</h2>
</div>
<div class="panel-actions">
<span id="statsHealth" class="status-pill">--</span>
<button id="collectStatsBtn" class="ghost" type="button" data-i18n="collectStats" data-i18n-title="collectStatsHelp">Collect</button>
<button id="repairStatsBtn" type="button" data-i18n="repairStats" data-i18n-title="repairStatsHelp">Restart collector</button>
</div>
</div>
<div class="traffic-summary">
<article>
<span data-i18n="collector">Collector</span>
<strong id="collectorState">--</strong>
</article>
<article>
<span data-i18n="lastPoint">Last point</span>
<strong id="lastStatsPoint">--</strong>
</article>
<article>
<span data-i18n="historyRows">History rows</span>
<strong id="historyRows">0</strong>
</article>
</div>
<div class="traffic-controls">
<div class="segmented" id="trafficRange" aria-label="Traffic range" data-i18n-aria-label="ariaTrafficRange">
<button type="button" data-traffic-range="15m" data-i18n="range15m">15 min</button>
<button type="button" data-traffic-range="1h" data-i18n="range1h">1 hour</button>
<button type="button" data-traffic-range="24h" data-i18n="range24h">24 hours</button>
<button type="button" data-traffic-range="month" data-i18n="rangeMonth">Month</button>
</div>
<div class="segmented" id="trafficView" aria-label="Traffic view" data-i18n-aria-label="ariaTrafficView">
<button type="button" data-traffic-view="chart" data-i18n="viewChart">Chart</button>
<button type="button" data-traffic-view="table" data-i18n="viewRows">Rows</button>
</div>
</div>
<div id="trafficChart" class="traffic-chart"></div>
<div class="table-wrap" id="trafficTableWrap">
<table>
<thead>
<tr>
<th data-i18n="tablePeriod">Period</th>
<th data-i18n="tableProxyDelta">Proxy delta</th>
<th data-i18n="tableSiteDelta">Site delta</th>
<th data-i18n="tableProxyTotal">Proxy total</th>
<th data-i18n="tableSiteTotal">Site total</th>
</tr>
</thead>
<tbody id="historyTable"></tbody>
</table>
</div>
</div>
</section>
<section class="page-panel" data-page="keys">
<div class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="keysEyebrow">Access</p>
<h2 data-i18n="keysTitle">User keys</h2>
</div>
<form id="addUserForm" class="inline-form">
<input id="userName" autocomplete="off" placeholder="client-name" data-i18n-placeholder="userPlaceholder">
<button type="submit" data-i18n="addKey">Add key</button>
</form>
</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th data-i18n="tableUser">User</th>
<th data-i18n="tableStatus">Status</th>
<th data-i18n="tableSecret">Secret</th>
<th data-i18n="tableLink">Link</th>
<th data-i18n="tableActions">Actions</th>
</tr>
</thead>
<tbody id="usersTable"></tbody>
</table>
</div>
</div>
</section>
<section class="page-panel" data-page="backups">
<div class="grid-two">
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="backupsEyebrow">Snapshots</p>
<h2 data-i18n="backupsTitle">Backups</h2>
</div>
<button id="createBackupBtn" type="button" data-i18n="createBackup">Create backup</button>
</div>
<div id="backupsList" class="backup-list"></div>
</section>
<aside class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="eventsEyebrow">Events</p>
<h2 data-i18n="eventsTitle">Activity</h2>
</div>
</div>
<div id="events" class="events-list"></div>
</aside>
</div>
</section>
<section class="page-panel" data-page="logs">
<div class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="logsEyebrow">Journal</p>
<h2 data-i18n="logsTitle">Logs</h2>
</div>
<div class="inline-form">
<select id="logService">
<option value="telemt">telemt</option>
<option value="nginx">nginx</option>
<option value="gotelegram-bot">bot</option>
<option value="gotelegram-stats">stats</option>
<option value="gotelegram-admin">admin</option>
</select>
<button id="loadLogsBtn" type="button" data-i18n="loadLogs">Load</button>
</div>
</div>
<div id="logsMeta" class="logs-meta"></div>
<pre id="logsBox" class="logs"></pre>
</div>
</section>
<section class="page-panel" data-page="settings">
<div class="grid-two">
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="settingsEyebrow">Settings</p>
<h2 data-i18n="settingsTitle">Panel preferences</h2>
</div>
</div>
<div class="settings-list">
<div>
<span data-i18n="panelLanguage">Panel language</span>
<strong id="settingsLanguage">--</strong>
</div>
<div>
<span data-i18n="theme">Theme</span>
<strong id="settingsTheme">--</strong>
</div>
<div>
<span data-i18n="bindAddress">Bind address</span>
<strong id="settingsBind">127.0.0.1:1984</strong>
</div>
</div>
</section>
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow" data-i18n="configEyebrow">Config</p>
<h2 data-i18n="configTitle">Installation state</h2>
</div>
</div>
<div id="configList" class="settings-list"></div>
</section>
</div>
</section>
</main>
</div>
</div>
<div id="toast" class="toast"></div>
<div id="promoModal" class="promo-modal" hidden>
<div class="promo-card" role="dialog" aria-modal="true" aria-labelledby="promoTitle">
<button id="promoClose" class="icon-btn ghost" type="button" aria-label="Close" data-i18n-aria-label="ariaClose">×</button>
<p class="eyebrow" data-i18n="promoEyebrow">Promo</p>
<h2 id="promoTitle" data-i18n="promoTitle">Support goTelegram Pro</h2>
<div class="promo-grid">
<a href="https://vk.cc/ct29NQ" target="_blank" rel="noreferrer">
<strong data-i18n="promoHosting1">Hosting #1</strong>
<span>OFF60 · antenka20 · antenka6</span>
</a>
<a href="https://vk.cc/cUxAhj" target="_blank" rel="noreferrer">
<strong data-i18n="promoHosting2">Hosting #2</strong>
<span>OFF60</span>
</a>
<a href="https://pay.cloudtips.ru/p/7410814f" target="_blank" rel="noreferrer">
<strong data-i18n="promoTips">Tips</strong>
<span>CloudTips</span>
</a>
</div>
</div>
</div>
<script src="/app.js?v=2.5.0-admin6" type="module"></script>
</body>
</html>