Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9936be03ad | ||
|
|
afb75b7cf7 | ||
|
|
abd4678e4a |
@@ -583,6 +583,7 @@ CLI больше не нужен.
|
||||
| `.env.sample` | Env template |
|
||||
| `Dockerfile` | Сборка |
|
||||
| `docker-compose.local.yml` | Dev |
|
||||
| `docker-compose.prod-test.yml` | Тестовый Prod |
|
||||
| `docker-compose.prod.yml` | Prod |
|
||||
| `config/nginx/hypn0-app--external-nginx.conf` | Nginx |
|
||||
| `.gitea/workflows/docker-publish.yaml` | CI/CD |
|
||||
|
||||
@@ -39,6 +39,11 @@ server {
|
||||
charset utf-8;
|
||||
client_max_body_size 10M; # Разрешаем загрузку не слишком больших картинок
|
||||
|
||||
# --- СЕТЕВЫЕ ОПТИМИЗАЦИИ И ЗАЩИТА ОТ ТАЙМАУТОВ ЧЕРЕЗ VPN (MTU/MSS) ---
|
||||
tcp_nopush on; # Отправляет заголовки и начало файла в одном TCP-пакете
|
||||
tcp_nodelay on; # Отключает задержку Nagle для быстрых интерактивных ответов
|
||||
ssl_buffer_size 4k; # Уменьшенный буфер TLS: решает зависания пакетов в VPN/WireGuard туннелях
|
||||
|
||||
# Логи (пути могут отличаться в зависимости от настроек сервера, здесь стандартные для Ubuntu)
|
||||
access_log /var/log/nginx/hypn0.access.log;
|
||||
error_log /var/log/nginx/hypn0.error.log;
|
||||
@@ -49,7 +54,7 @@ server {
|
||||
gzip_vary on; # Добавляет заголовок Vary: Accept-Encoding
|
||||
gzip_proxied any; # Сжимать ответы, даже если мы за прокси
|
||||
gzip_comp_level 6; # Оптимальный баланс скорость/сжатие
|
||||
gzip_min_length 1000; # Не сжимать совсем мелочь
|
||||
gzip_min_length 256; # Сжимать ответы от 256 байт
|
||||
# Типы файлов для сжатия (HTML сжимается автоматически, его писать не нужно)
|
||||
gzip_types
|
||||
text/plain
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!doctype html><html lang="ru" x-data="{darkMode:false}" x-init="darkMode=localStorage.getItem('darkMode')==='true';$watch('darkMode',
|
||||
val=>{if(val)document.documentElement.classList.add('dark');else document.documentElement.classList.remove('dark');})" x-bind:class="{'dark':darkMode}">
|
||||
<!--█████████████████████████████████████████████████████████████████████████████████████████████████--><head><meta charset="utf-8" /><!--
|
||||
{# <!--█████████████████████████████████████████████████████████████████████████████████████████████████--> #}<head><meta charset="utf-8" />{% comment %}<!--
|
||||
█░░░░░░░░░░░░░░█░░░░░░█████████░░░░░░███████████████░░░░░░░░░░░░░░█░░░░░░█████████░░░░░░░░░░░░░░█░░░░░░░░░░░░░░░░███░░░░░░░░██░░░░░░░░████
|
||||
█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░█████████░░▄▀░░███████████████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀▄▀░░██░░▄▀▄▀░░████
|
||||
█░░▄▀░░░░░░▄▀░░█░░▄▀░░█████████░░▄▀░░███████████████░░▄▀░░░░░░░░░░█░░▄▀░░█████████░░▄▀░░░░░░▄▀░░█░░▄▀░░░░░░░░▄▀░░███░░░░▄▀░░██░░▄▀░░░░████
|
||||
@@ -38,7 +38,7 @@ val=>{if(val)document.documentElement.classList.add('dark');else document.docume
|
||||
█░░▄▀░░██░░▄▀░░███████░░▄▀░░███████░░▄▀░░█████████░░▄▀░░██░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░░░░░▄▀░░█████░░▄▀░░█████░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░░░▄▀▄▀░░█░░░░░░█
|
||||
█░░▄▀░░██░░▄▀░░███████░░▄▀░░███████░░▄▀░░█████████░░▄▀░░██░░░░░░░░░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█████░░▄▀░░█████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀░░░░█░░▄▀░░█
|
||||
█░░░░░░██░░░░░░███████░░░░░░███████░░░░░░█████████░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█████░░░░░░█████░░░░░░░░░░░░░░█░░░░░░██░░░░░░█░░░░░░░░░░░░███░░░░░░█
|
||||
████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████-->{% load static %}
|
||||
████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████-->{% endcomment %}{% load static %}
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
@@ -146,6 +146,7 @@ val=>{if(val)document.documentElement.classList.add('dark');else document.docume
|
||||
{% block CONTENT %}{% endblock CONTENT %}
|
||||
</main>
|
||||
{# {% include "blocks/footer.jinja2" %} #}{% endblock BODY %}{% if not ALLOW_TRACKING %}{# Если клиент еще не согласился на отслеживание покажем ему уведомление #}{% include "block/allow-tracking.html" %}{% else %}{# Если согласился -- отслеживаем#}
|
||||
<script src="{% static 'js/analytics.js' %}"></script>{% endif %}
|
||||
<script src="{% static 'js/analytics.js' %}"></script>
|
||||
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5FVH3KMJ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>{% endif %}
|
||||
{% block ADD_JS1 %}{% endblock ADD_JS1 %}{% block ADD_JS2 %}{% endblock ADD_JS2 %}{% block ADD_JS3 %}{% endblock ADD_JS3 %}</body>
|
||||
</html>
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>400 — Сбой ментального протокола | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 400: Некорректный запрос к матрице HypnoSVG. Сервер не распознал структуру переданного сигнала." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>401 — Требуется ментальная идентификация | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 401: Доступ к закрытому узлу HypnoSVG требует прохождения авторизации." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>403 — Отказано бюрократом 24-го уровня | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 403: Доступ к ресурсу категорически запрещен протоколами безопасности HypnoSVG." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>404 — Векторная реальность не найдена | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 404: Запрашиваемая страница HypnoSVG не существует или стёрта волей Гипножабы." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>413 — Перегрузка сенсорных каналов | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 413: Загружаемый файл превышает допустимый размер ментального буфера HypnoSVG." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>429 — Слишком много мыслей в секунду | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 429: Превышен лимит запросов к генератору HypnoSVG. Сделайте ментальную паузу." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>500 — Критический перегрев неокортекса | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 500: Внутренний сбой сервера HypnoSVG. Ведутся ментальные восстановительные работы." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>502 — Контейнер потерял сознание | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 502: Прокси-сервер не получил ответа от бэкенда HypnoSVG." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>503 — Плановый сеанс гипнотерапии | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 503: Сервис HypnoSVG временно недоступен из-за технического обслуживания или пиковой нагрузки." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>504 — Разрыв астральной связи | HypnoSVG</title>
|
||||
<meta name="description" content="Ошибка 504: Превышено время ожидания ответа от вышестоящего сервера HypnoSVG." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<title>Реконструкция матрицы | HypnoSVG</title>
|
||||
<meta name="description" content="Сектор временно закрыт на квантовую реконструкцию и модернизацию алгоритмов HypnoSVG." />
|
||||
<meta name="robots" content="noindex, follow" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/img/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/media/_error/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/media/_error/favicon.ico" />
|
||||
<script>
|
||||
(function() {
|
||||
var saved = localStorage.getItem('darkMode');
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -1,26 +1,27 @@
|
||||
// analytics.js — Аналитика и счетчики посещений для hypn0.xyz
|
||||
// Версия: 1.0 | Дата: 2026-05-15
|
||||
// Содержит: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru
|
||||
// Версия: 1.2 | Дата: 2026-09-16
|
||||
// Содержит: Google Tag Manager, Yandex.Metrika
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// ============================================================================
|
||||
// Google Analytics 4 (GA4)
|
||||
// ID: GT-XXXXXXXX
|
||||
// Google Tag Manager (GTM)
|
||||
// ID: GTM-5FVH3KMJ
|
||||
// ============================================================================
|
||||
(function() {
|
||||
var script = document.createElement('script');
|
||||
script.async = true;
|
||||
script.src = 'https://www.googletagmanager.com/gtag/js?id=GT-XXXXXXXX';
|
||||
document.head.appendChild(script);
|
||||
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
window.gtag = gtag;
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'GT-XXXXXXXX');
|
||||
})();
|
||||
(function(w, d, s, l, i) {
|
||||
w[l] = w[l] || [];
|
||||
w[l].push({
|
||||
'gtm.start': new Date().getTime(),
|
||||
event: 'gtm.js'
|
||||
});
|
||||
var f = d.getElementsByTagName(s)[0],
|
||||
j = d.createElement(s),
|
||||
dl = l != 'dataLayer' ? '&l=' + l : '';
|
||||
j.async = true;
|
||||
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
|
||||
f.parentNode.insertBefore(j, f);
|
||||
})(window, document, 'script', 'dataLayer', 'GTM-5FVH3KMJ');
|
||||
|
||||
// ============================================================================
|
||||
// Yandex.Metrika (Яндекс.Метрика)
|
||||
@@ -49,50 +50,7 @@
|
||||
});
|
||||
})();
|
||||
|
||||
// ============================================================================
|
||||
// Top.Mail.Ru counter (Рейтинг@Mail.ru)
|
||||
// ID: 1234567
|
||||
// ============================================================================
|
||||
(function() {
|
||||
var _tmr = window._tmr || (window._tmr = []);
|
||||
_tmr.push({
|
||||
id: "1234567",
|
||||
type: "pageView",
|
||||
start: (new Date()).getTime()
|
||||
});
|
||||
|
||||
(function(d, w, id) {
|
||||
if (d.getElementById(id)) return;
|
||||
var ts = d.createElement("script");
|
||||
ts.type = "text/javascript";
|
||||
ts.async = true;
|
||||
ts.id = id;
|
||||
ts.src = "https://top-fwz1.mail.ru/js/code.js";
|
||||
|
||||
var f = function() {
|
||||
var s = d.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(ts, s);
|
||||
};
|
||||
|
||||
if (w.opera == "[object Opera]") {
|
||||
d.addEventListener("DOMContentLoaded", f, false);
|
||||
} else {
|
||||
f();
|
||||
}
|
||||
})(document, window, "tmr-code");
|
||||
|
||||
// Добавляем изображение для noscript
|
||||
if (!window.noScriptAdded) {
|
||||
window.noScriptAdded = true;
|
||||
var noscriptDiv = document.createElement('div');
|
||||
noscriptDiv.style.display = 'none';
|
||||
noscriptDiv.innerHTML = '<img src="https://top-fwz1.mail.ru/counter?id=1234567;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" />';
|
||||
document.body.appendChild(noscriptDiv);
|
||||
}
|
||||
})();
|
||||
|
||||
})();
|
||||
|
||||
// Экспортируем gtag в глобальный контекст для возможности использования в коде
|
||||
// window.gtag доступна через глобальную переменную
|
||||
// window.dataLayer доступна через глобальную переменную
|
||||
|
||||
|
||||
Reference in New Issue
Block a user