From 2c8beedc4bc886b952e73a30995b4e37d62cc763 Mon Sep 17 00:00:00 2001 From: dev Date: Sun, 13 Sep 2026 12:27:35 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B0=D0=BD=D1=82=D0=B8-=D1=81=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9=20(co?= =?UTF-8?q?oldown=20=D0=BF=D0=BE=20spam=5Finterval=5Fmin)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.html/index.js: экран подтверждения отправки с обратным отсчётом - локальный запрет повторной отправки через localStorage (по настройке spam_interval_min) - server.js: отдаём spam_interval_min в public-settings (default 30) - Dockerfile: timeout для apk add, чтобы сборка не зависала на недоступном зеркале - docker-compose.yml: отключаем cloudflared сервис (закомментирован) --- Dockerfile | 2 +- docker-compose.yml | 32 +++++++++++------------ public/index.html | 13 ++++++++++ public/js/index.js | 64 +++++++++++++++++++++++++++++++++++++++++++--- server.js | 5 ++-- 5 files changed, 93 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index dee6bb6..8cdc937 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN set -e; \ try_repo() { \ printf "%s/%s/main\n%s/%s/community\n" "$1" "$V" "$1" "$V" > /etc/apk/repositories; \ echo "Trying apk mirror: $1"; \ - apk add --no-cache openssl; \ + timeout 45 apk add --no-cache --timeout 20 openssl; \ }; \ if ! try_repo "https://dl-cdn.alpinelinux.org/alpine" && \ ! try_repo "https://mirrors.edge.kernel.org/alpine" && \ diff --git a/docker-compose.yml b/docker-compose.yml index e963b35..d6c8be2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,22 +72,22 @@ services: # если в wg/wg0.conf лежит конфиг — контейнер сначала поднимает VPN и # только потом запускает туннель (исход Cloudflare через VPN). Без конфига # туннель стартует сразу, как в базовой схеме. - cloudflared: - build: - context: . - dockerfile: Dockerfile.cloudflared - restart: unless-stopped - cap_add: - - NET_ADMIN - privileged: true - volumes: - - ./wg:/etc/wireguard:ro - environment: - TZ: Europe/Moscow - CLOUDFLARE_TUNNEL_URL: ${CLOUDFLARE_TUNNEL_URL:-http://app:3003} - WG_HANDSHAKE_TIMEOUT: ${WG_HANDSHAKE_TIMEOUT:-60} - depends_on: - - app + # cloudflared: + # build: + # context: . + # dockerfile: Dockerfile.cloudflared + # restart: unless-stopped + # cap_add: + # - NET_ADMIN + # privileged: true + # volumes: + # - ./wg:/etc/wireguard:ro + # environment: + # TZ: Europe/Moscow + # CLOUDFLARE_TUNNEL_URL: ${CLOUDFLARE_TUNNEL_URL:-http://app:3003} + # WG_HANDSHAKE_TIMEOUT: ${WG_HANDSHAKE_TIMEOUT:-60} + # depends_on: + # - app diff --git a/public/index.html b/public/index.html index dca458e..dec638b 100644 --- a/public/index.html +++ b/public/index.html @@ -63,6 +63,12 @@ textarea{resize:vertical;min-height:160px;font-family:inherit;line-height:1.5} .toast.show{opacity:1} .toast.error{background:#dc2626} +.sent-panel{width:100%;max-width:900px;margin:32px auto 0;background:var(--card);border:2px solid var(--accent);border-radius:var(--radius);padding:40px 32px;display:none;flex-direction:column;gap:20px;align-items:center;text-align:center;box-shadow:0 8px 24px rgba(37,99,235,.18)} +.sent-check{width:88px;height:88px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:2.6rem} +.sent-panel h2{font-size:1.6rem;font-weight:700;letter-spacing:-.02em;color:var(--text)} +.sent-panel p{font-size:1.05rem;color:var(--muted);max-width:520px} +.sent-timer{background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);padding:14px 20px;font-size:1rem;font-weight:600;color:var(--text)} + nav{position:fixed;top:16px;right:16px;display:flex;gap:8px} nav a{color:var(--muted);text-decoration:none;font-size:.8rem;padding:6px 12px;border-radius:8px;transition:color .15s} nav a:hover{color:var(--text)} @@ -132,6 +138,13 @@ nav a:hover{color:var(--text)} +
+
✓
+

Запись отправлена!

+

Спасибо! Твоя запись уже передана преподавателю.

+
+
+