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)} +
Спасибо! Твоя запись уже передана преподавателю.
+ +