diff --git a/README.md b/README.md index 8a9b391..de79215 100644 --- a/README.md +++ b/README.md @@ -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 | diff --git a/package.json b/package.json index d212929..92aebbc 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/public/app.js b/public/app.js index 9124e1a..1687f78 100644 --- a/public/app.js +++ b/public/app.js @@ -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 { /* офлайн или сбой — блок остаётся скрытым */ } diff --git a/public/index.html b/public/index.html index 0e92d5d..611c41a 100644 --- a/public/index.html +++ b/public/index.html @@ -7,7 +7,7 @@ - + + diff --git a/scripts/install.sh b/scripts/install.sh index 9b89ef1..44f4511 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -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}" ) diff --git a/server.js b/server.js index cb028fc..b06a0a8 100644 --- a/server.js +++ b/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 — те же ссылки внизу панели. На пользовательские лендинги это не выводится.", }; }