mirror of
https://github.com/andrey271192/amnezia_web.git
synced 2026-09-20 14:41:59 +00:00
fix(ui): restore index.html; add Ozon to panel promo
Repair broken HTML merge. Extend /api/panel/footer with PANEL_FOOTER_OZON_URL (default Ozon СБП) and labels in strip+footer. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -66,7 +66,9 @@ cd /opt/amnezia-admin && chmod +x scripts/install.sh && sudo SKIP_DOWNLOAD=1 bas
|
||||
| `COMMUNITY_UPGRADE_PITCH` | _(текст по умолчанию в коде)_ | Текст под заголовком базовой версии |
|
||||
| `PANEL_FOOTER_DONATE_URL` | Как **`COMMUNITY_UPGRADE_URL`** | Ссылка «донат» в **шапке и подвале** веб‑панели (**не** добавляется на nginx‑лендинг пользователей). |
|
||||
| `PANEL_FOOTER_TELEGRAM_URL` | `https://t.me/lot_andrey` | Ссылка Telegram‑спонсора / канала (там же: только панель). |
|
||||
| `PANEL_FOOTER_OZON_URL` | Ссылка на **Ozon СБП** автора (дефолт в `server.js`) | Донат через Ozon — **шапка и подвал** панели с остальными ссылками. |
|
||||
| `PANEL_FOOTER_DONATE_LABEL` | `Поддержать проект` | Текст якоря доната |
|
||||
| `PANEL_FOOTER_OZON_LABEL` | `Донат · Ozon СБП` | Текст якоря Ozon |
|
||||
| `PANEL_FOOTER_TELEGRAM_LABEL` | `Telegram‑канал спонсора` | Текст якоря Telegram |
|
||||
| `PANEL_FOOTER_PROMO_SUBTITLE` | _(строка по умолчанию в коде)_ | Поясняющий текст в верхней полосе панели |
|
||||
| `SKIP_LANDING` | `0` | `1` — без лендинга на порту 80 |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "amnezia-admin",
|
||||
"version": "1.2.21",
|
||||
"version": "1.2.22",
|
||||
"private": true,
|
||||
"description": "amnezia_web — базовая панель AmneziaWG (FREE: просмотр и удаление клиентов; полная версия — PRO).",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -174,11 +174,15 @@ async function hydratePanelPromoFooter() {
|
||||
const strip = document.getElementById("panel-promo-strip");
|
||||
const sub = document.getElementById("panel-promo-subtitle");
|
||||
const aDonTop = document.getElementById("panel-strip-donate");
|
||||
const sepTop = document.getElementById("panel-strip-sep");
|
||||
const sepDO = document.getElementById("panel-strip-sep-donate-ozon");
|
||||
const aOzonTop = document.getElementById("panel-strip-ozon");
|
||||
const sepOT = document.getElementById("panel-strip-sep-ozon-tg");
|
||||
const aTgTop = document.getElementById("panel-strip-telegram");
|
||||
const gap1 = document.getElementById("footer-promo-gap1");
|
||||
const aDonF = document.getElementById("footer-promo-donate");
|
||||
const sepMid = document.getElementById("footer-promo-sep-mid");
|
||||
const fSepDO = document.getElementById("footer-promo-sep-donate-ozon");
|
||||
const aOzonF = document.getElementById("footer-promo-ozon");
|
||||
const fSepOT = document.getElementById("footer-promo-sep-ozon-tg");
|
||||
const aTgF = document.getElementById("footer-promo-telegram");
|
||||
|
||||
try {
|
||||
@@ -191,18 +195,25 @@ async function hydratePanelPromoFooter() {
|
||||
if (sub) sub.textContent = subtitle;
|
||||
|
||||
const okD = wirePanelPromoAnchor(aDonTop, j.donateUrl, j.donateLabel);
|
||||
const okO = wirePanelPromoAnchor(aOzonTop, j.ozonUrl, j.ozonLabel);
|
||||
const okT = wirePanelPromoAnchor(aTgTop, j.telegramUrl, j.telegramLabel);
|
||||
if (sepTop) sepTop.classList.toggle("hidden", !(okD && okT));
|
||||
|
||||
if (sepDO) sepDO.classList.toggle("hidden", !(okD && (okO || okT)));
|
||||
if (sepOT) sepOT.classList.toggle("hidden", !(okO && okT));
|
||||
|
||||
wirePanelPromoAnchor(aDonF, j.donateUrl, j.donateLabel);
|
||||
wirePanelPromoAnchor(aOzonF, j.ozonUrl, j.ozonLabel);
|
||||
wirePanelPromoAnchor(aTgF, j.telegramUrl, j.telegramLabel);
|
||||
|
||||
const footerD = aDonF && !aDonF.classList.contains("hidden");
|
||||
const footerO = aOzonF && !aOzonF.classList.contains("hidden");
|
||||
const footerT = aTgF && !aTgF.classList.contains("hidden");
|
||||
if (gap1) gap1.classList.toggle("hidden", !(footerD || footerT));
|
||||
if (sepMid) sepMid.classList.toggle("hidden", !(footerD && footerT));
|
||||
|
||||
if (strip && (okD || okT)) strip.classList.remove("hidden");
|
||||
if (gap1) gap1.classList.toggle("hidden", !(footerD || footerO || footerT));
|
||||
if (fSepDO) fSepDO.classList.toggle("hidden", !(footerD && (footerO || footerT)));
|
||||
if (fSepOT) fSepOT.classList.toggle("hidden", !(footerO && footerT));
|
||||
|
||||
if (strip && (okD || okO || okT)) strip.classList.remove("hidden");
|
||||
} catch {
|
||||
/* офлайн или сбой — блок остаётся скрытым */
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<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&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/styles.css?v=1.2.21">
|
||||
<link rel="stylesheet" href="/styles.css?v=1.2.22">
|
||||
<script>
|
||||
(function () {
|
||||
try {
|
||||
@@ -28,7 +28,9 @@
|
||||
<p id="panel-promo-subtitle" class="panel-promo-subtitle muted"></p>
|
||||
<div class="panel-promo-links">
|
||||
<a id="panel-strip-donate" class="panel-promo-a hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
<span id="panel-strip-sep" class="panel-promo-sep hidden" aria-hidden="true">·</span>
|
||||
<span id="panel-strip-sep-donate-ozon" class="panel-promo-sep hidden" aria-hidden="true">·</span>
|
||||
<a id="panel-strip-ozon" class="panel-promo-a hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
<span id="panel-strip-sep-ozon-tg" class="panel-promo-sep hidden" aria-hidden="true">·</span>
|
||||
<a id="panel-strip-telegram" class="panel-promo-a hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -159,7 +161,7 @@
|
||||
<div class="panel-fold-body">
|
||||
<p class="muted warp-intro mtproto-intro">
|
||||
<strong>В базовой панели (FREE).</strong> Отдельный Docker‑контейнер (образ Telegram), публикация порта на хосте VPS.
|
||||
Ссылка вида <code class="inline">tg://proxy?…</code> появляется, если задан <code class="inline">MTPRO_PUBLIC_HOST</code> или <code class="inline">CLIENT_CONFIG_ENDPOINT</code>
|
||||
Ссылка вида <code class="inline">tg://proxy?…</code> может появляться без env, если панель открыта по публичному IP/DNS; для фиксированного хоста задайте <code class="inline">MTPRO_PUBLIC_HOST</code> или <code class="inline">CLIENT_CONFIG_ENDPOINT</code>
|
||||
(переменные контейнера панели, см. install.sh README).
|
||||
Сохраните <strong>секрет</strong>, который показывается один раз после установки — в интерфейсе он маскируется.
|
||||
</p>
|
||||
@@ -264,13 +266,15 @@
|
||||
<strong class="support-title">amnezia_web</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 id="footer-promo-gap1" class="support-sep support-footer-promo-gap hidden" aria-hidden="true">·</span>
|
||||
<span id="footer-promo-gap1" class="support-sep hidden" aria-hidden="true">·</span>
|
||||
<a id="footer-promo-donate" class="support-promo-link hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
<span id="footer-promo-sep-mid" class="support-sep hidden" aria-hidden="true">·</span>
|
||||
<span id="footer-promo-sep-donate-ozon" class="support-sep hidden" aria-hidden="true">·</span>
|
||||
<a id="footer-promo-ozon" class="support-promo-link hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
<span id="footer-promo-sep-ozon-tg" class="support-sep hidden" aria-hidden="true">·</span>
|
||||
<a id="footer-promo-telegram" class="support-promo-link hidden" target="_blank" rel="noopener noreferrer"></a>
|
||||
</div>
|
||||
<p class="support-blurb">
|
||||
Базовая панель: AWG‑клиенты, статусы и MTProto‑прокси (Docker). Ссылки поддержки автора только в этом интерфейсе панели, не на отдельных пользовательских лендингах.
|
||||
Базовая панель: AWG‑клиенты, статусы и MTProto‑прокси (Docker). Ссылки поддержки (Boosty, Ozon СБП, Telegram) подставляются из настроек сервера — только в этом интерфейсе, не на пользовательских лендингах.
|
||||
</p>
|
||||
</footer>
|
||||
|
||||
@@ -308,6 +312,6 @@
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
<script src="/app.js?v=1.2.21" type="module"></script>
|
||||
<script src="/app.js?v=1.2.22" type="module"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -265,8 +265,8 @@ elif [[ -f "${INSTALL_DIR}/.amnezia-panel-edition" ]]; then
|
||||
echo "→ AMNEZIA_EDITION из ${INSTALL_DIR}/.amnezia-panel-edition: ${__PE}"
|
||||
fi
|
||||
fi
|
||||
for __ce_var in COMMUNITY_UPGRADE_URL COMMUNITY_UPGRADE_PITCH PANEL_FOOTER_DONATE_URL PANEL_FOOTER_TELEGRAM_URL \
|
||||
PANEL_FOOTER_DONATE_LABEL PANEL_FOOTER_TELEGRAM_LABEL PANEL_FOOTER_PROMO_SUBTITLE \
|
||||
for __ce_var in COMMUNITY_UPGRADE_URL COMMUNITY_UPGRADE_PITCH PANEL_FOOTER_DONATE_URL PANEL_FOOTER_OZON_URL PANEL_FOOTER_TELEGRAM_URL \
|
||||
PANEL_FOOTER_DONATE_LABEL PANEL_FOOTER_OZON_LABEL PANEL_FOOTER_TELEGRAM_LABEL PANEL_FOOTER_PROMO_SUBTITLE \
|
||||
ALLOW_COMMUNITY_GITHUB_ACTIVATION COMMUNITY_PRIVATE_INSTALL_SCRIPT_URL COMMUNITY_INSTALL_FETCH_MS PRIVATE_INSTALL_SCRIPT_MAX_BYTES COMMUNITY_DISABLE_DOCKER_CLI_HELPER COMMUNITY_SKIP_REMOVE_FREE_BEFORE_PRIVATE_PRO COMMUNITY_PRO_INSTALL_HELPER_IMAGE FREE_PANEL_CONTAINER_FOR_PRO_INSTALL FREE_LANDING_CONTAINER_FOR_PRO_INSTALL STALE_PRO_PANEL_CONTAINER_FOR_PRO_INSTALL COMMUNITY_INSTALL_LOG_TAIL_BYTES COMMUNITY_INSTALL_LOG_API_CHUNK_MAX COMMUNITY_HELPER_SKIP_PREPARE_TOOLS; do
|
||||
if [[ -n "${!__ce_var:-}" ]]; then
|
||||
RUN_ENV+=( -e "${__ce_var}=${!__ce_var}" )
|
||||
|
||||
14
server.js
14
server.js
@@ -70,6 +70,8 @@ const COMMUNITY_UPGRADE_PITCH =
|
||||
"В PRO: вкл/выкл клиентов, даты и расписание отключений, переименование, экспорт .conf, каскад, Cloudflare WARP, синхронизация времени хоста. В FREE: удаление клиента с сервера + отдельный раздел установки Telegram MTProto-прокси (Docker-контейнер). Полная сборка AWG-панели — приватный репозиторий amnezia_web-PRO; доступ по подписке Boosty.";
|
||||
|
||||
const PANEL_FOOTER_TELEGRAM_DEFAULT = "https://t.me/lot_andrey";
|
||||
const PANEL_FOOTER_OZON_DEFAULT =
|
||||
"https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798";
|
||||
|
||||
function sanitizeHttpsHttpUrl(raw) {
|
||||
const s = String(raw || "").trim();
|
||||
@@ -83,7 +85,7 @@ function sanitizeHttpsHttpUrl(raw) {
|
||||
return "";
|
||||
}
|
||||
|
||||
/** Донат + Telegram‑спонсор: только в админ‑панели (не пользовательские лендинги). Переопределяется через env контейнера. */
|
||||
/** Донат + Ozon СБП + Telegram‑спонсор: только в админ‑панели (не пользовательские лендинги). Переопределяется через env контейнера. */
|
||||
function panelPromoFooterPayload() {
|
||||
const donateResolved =
|
||||
sanitizeHttpsHttpUrl(
|
||||
@@ -93,18 +95,26 @@ function panelPromoFooterPayload() {
|
||||
sanitizeHttpsHttpUrl(
|
||||
process.env.PANEL_FOOTER_TELEGRAM_URL?.trim() || PANEL_FOOTER_TELEGRAM_DEFAULT,
|
||||
) || "";
|
||||
const ozonResolved =
|
||||
sanitizeHttpsHttpUrl(
|
||||
process.env.PANEL_FOOTER_OZON_URL?.trim() || PANEL_FOOTER_OZON_DEFAULT,
|
||||
) || "";
|
||||
|
||||
return {
|
||||
donateUrl: donateResolved,
|
||||
ozonUrl: ozonResolved,
|
||||
telegramUrl: telegramResolved,
|
||||
donateLabel:
|
||||
process.env.PANEL_FOOTER_DONATE_LABEL?.trim() || "Поддержать проект",
|
||||
ozonLabel:
|
||||
process.env.PANEL_FOOTER_OZON_LABEL?.trim() ||
|
||||
"Донат · Ozon СБП",
|
||||
telegramLabel:
|
||||
process.env.PANEL_FOOTER_TELEGRAM_LABEL?.trim() ||
|
||||
"Telegram‑канал спонсора",
|
||||
promoSubtitle:
|
||||
process.env.PANEL_FOOTER_PROMO_SUBTITLE?.trim() ||
|
||||
"Поддержите разработку и канал спонсора — ссылки есть вверху и внизу панели. На пользовательские сайты‑лендинги это не добавляется.",
|
||||
"Поддержите через Boosty (или вашу ссылку), Ozon СБП и Telegram — те же ссылки внизу панели. На пользовательские лендинги это не выводится.",
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user