fix(site): export preview/download and restore GeoExport deploy

Restore site/ mirror, patch export fetch for empty API responses and
Keenetic format, add Telegram bot card, and switch install.sh back to
geoexport-site systemd + nginx on port 4173.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-24 21:54:23 +03:00
parent 35e815641e
commit afc2d5470e
14 changed files with 442 additions and 68 deletions

View File

@@ -0,0 +1,28 @@
(function () {
const CARD =
'<div class="rounded-2xl border border-slate-200 dark:border-slate-800 bg-white/80 dark:bg-slate-900/40 shadow-sm p-4 text-sm text-slate-700 dark:text-slate-300">' +
'<div class="font-medium text-slate-900 dark:text-slate-100 mb-1">Telegram-бот для поиска доменов</div>' +
'<p class="text-xs leading-relaxed mb-2">' +
"Если удобнее с телефона или нужен быстрый поиск без браузера — попробуйте " +
'<a href="https://t.me/domain_searchPro_bot" target="_blank" rel="noopener noreferrer" class="font-mono text-blue-600 dark:text-blue-400 hover:underline">@domain_searchPro_bot</a>. ' +
"Тот же смысл: найти домен, посмотреть IP и выгрузить списки, только в Telegram." +
"</p>" +
'<a href="https://t.me/domain_searchPro_bot" target="_blank" rel="noopener noreferrer" ' +
'class="inline-flex items-center gap-1 text-xs px-3 py-1.5 rounded-xl bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white">' +
"Открыть бота →</a></div>";
function inject() {
if (document.querySelector("[data-telegram-bot-card]")) return;
const host = document.querySelector(".max-w-3xl.mx-auto");
if (!host) return;
const wrap = document.createElement("div");
wrap.setAttribute("data-telegram-bot-card", "");
wrap.className = "mt-4 mb-2";
wrap.innerHTML = CARD;
host.appendChild(wrap);
}
const obs = new MutationObserver(() => inject());
obs.observe(document.body, { childList: true, subtree: true });
inject();
})();