feat: nginx landing on :80 with Kaskad support footer; sync admin footer text

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-14 15:51:52 +03:00
parent 1ab5739ad0
commit 5a5fc8b240
9 changed files with 256 additions and 14 deletions

3
landing/Dockerfile Normal file
View File

@@ -0,0 +1,3 @@
FROM nginx:1.27-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY index.html styles.css admin-port.js /usr/share/nginx/html/

1
landing/admin-port.js Normal file
View File

@@ -0,0 +1 @@
window.__AMNEZIA_ADMIN_PORT__ = "8080";

59
landing/index.html Normal file
View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Сервер · AmneziaWG</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
</head>
<body class="page">
<main class="landing-main">
<p class="eyebrow">Этот сервер</p>
<h1>Управление AmneziaWG</h1>
<p class="lead">
Здесь установлена админ-панель для клиентов VPN. Перейдите по ссылке ниже (порт задаётся при установке, по умолчанию <strong>8080</strong>).
</p>
<p class="admin-row" id="admin-row"></p>
</main>
<footer class="support-footer">
<div class="support-line">
<strong class="support-title">Kaskad WebUI</strong>
<span class="support-sep" aria-hidden="true">·</span>
<a href="https://github.com/andrey271192/Amnezia_web" target="_blank" rel="noopener noreferrer">⭐ GitHub</a>
<span class="support-sep" aria-hidden="true">·</span>
<a href="https://boosty.to/andrey27/donate" target="_blank" rel="noopener noreferrer">💖 Boosty</a>
<span class="support-sep" aria-hidden="true">·</span>
<a href="https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798" target="_blank" rel="noopener noreferrer">💳 Ozon&nbsp;СБП</a>
<span class="support-sep" aria-hidden="true">·</span>
<a href="https://t.me/lot_andrey" target="_blank" rel="noopener noreferrer">✉️ Telegram&nbsp;@lot_andrey</a>
</div>
<p class="support-blurb">
Поддержать проект — поставь звезду на GitHub И донат. Связаться с автором — Telegram.
</p>
</footer>
<script src="admin-port.js"></script>
<script>
(function () {
var port =
(typeof window.__AMNEZIA_ADMIN_PORT__ !== "undefined" && window.__AMNEZIA_ADMIN_PORT__) || "8080";
var h = location.hostname || "";
var proto = location.protocol || "http:";
var url = proto + "//" + h + ":" + port + "/";
var el = document.getElementById("admin-row");
if (el) {
el.innerHTML =
'<a class="admin-btn" href="' +
url +
'">Открыть админ-панель</a> <span class="muted-inline">' +
url +
"</span>";
}
})();
</script>
</body>
</html>

20
landing/nginx.conf Normal file
View File

@@ -0,0 +1,20 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_types text/css text/plain application/json application/javascript;
add_header X-Content-Type-Options nosniff always;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.css$ {
expires 1h;
add_header Cache-Control "public, max-age=3600";
}
}

124
landing/styles.css Normal file
View File

@@ -0,0 +1,124 @@
:root {
--bg: #070b10;
--card: #111722;
--line: rgba(255, 255, 255, 0.08);
--text: #f4f7ff;
--muted: #94a3b8;
--accent: #7dd3fc;
font-family: "DM Sans", system-ui, sans-serif;
}
* {
box-sizing: border-box;
}
body.page {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
background: radial-gradient(circle at 20% 20%, rgba(125, 211, 252, 0.08), transparent 35%),
radial-gradient(circle at 80% 0%, rgba(94, 234, 212, 0.06), transparent 40%),
var(--bg);
color: var(--text);
}
.landing-main {
flex: 1;
max-width: 560px;
margin: 0 auto;
padding: clamp(2rem, 6vw, 4rem) 1.25rem;
}
.eyebrow {
letter-spacing: 0.18em;
text-transform: uppercase;
font-size: 0.72rem;
color: var(--accent);
margin: 0 0 0.5rem;
}
.landing-main h1 {
margin: 0 0 1rem;
font-size: clamp(1.5rem, 4vw, 1.85rem);
font-weight: 700;
}
.lead {
margin: 0 0 1.25rem;
line-height: 1.6;
color: var(--muted);
}
.admin-row {
margin: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.5rem;
}
.admin-btn {
display: inline-block;
padding: 0.55rem 1rem;
border-radius: 11px;
font-weight: 600;
text-decoration: none;
background: linear-gradient(135deg, #38bdf8, #22d3ee);
color: #041018;
}
.admin-btn:hover {
filter: brightness(1.05);
}
.muted-inline {
font-size: 0.82rem;
color: var(--muted);
word-break: break-all;
}
.support-footer {
flex-shrink: 0;
margin-top: auto;
padding: 1.25rem clamp(1rem, 3vw, 1.5rem) 1.5rem;
border-top: 1px solid var(--line);
background: rgba(10, 15, 22, 0.92);
}
.support-line {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.5rem;
font-size: 0.92rem;
color: var(--muted);
}
.support-title {
color: var(--text);
font-weight: 700;
}
.support-sep {
opacity: 0.55;
user-select: none;
}
.support-line a {
color: var(--accent);
text-decoration: none;
white-space: nowrap;
}
.support-line a:hover {
text-decoration: underline;
}
.support-blurb {
margin: 0.65rem 0 0;
font-size: 0.82rem;
line-height: 1.45;
color: var(--muted);
max-width: 62rem;
}