From 6d75b4c13030f89d5af55ce95ac3e9ef2ae21590 Mon Sep 17 00:00:00 2001 From: NotBigGhost Date: Fri, 26 Jun 2026 18:14:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=84=D1=84=D0=BB=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?-=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B0=D0=B9=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/vps/Caddyfile | 21 ++++++++++++ deploy/vps/README.md | 16 ++++++++-- deploy/vps/maintenance.html | 64 +++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 deploy/vps/maintenance.html diff --git a/deploy/vps/Caddyfile b/deploy/vps/Caddyfile index e7f360b..678927f 100644 --- a/deploy/vps/Caddyfile +++ b/deploy/vps/Caddyfile @@ -11,6 +11,25 @@ # # SSE (/api/events): отдельный handle БЕЗ encode и с flush_interval -1 — иначе сжатие/ # буферизация задержат поток событий (реал-тайм перестанет работать). +# +# Туннель лёг (апстрим недоступен) → reverse_proxy отдаёт 502/503/504, и сниппет +# (offline) подменяет ответ на свою страницу-заглушку (/etc/caddy/maintenance/maintenance.html), +# вместо «зависшей загрузки» SPA. Файл заглушки — deploy/vps/maintenance.html. + +# Заглушка «сайт недоступен» при недоступности апстрима. Импортируется в каждый сайт. +(offline) { + handle_errors { + @down expression `{http.error.status_code} in [502, 503, 504]` + handle @down { + root * /etc/caddy/maintenance + rewrite * /maintenance.html + header Cache-Control "no-store" + file_server { + status 503 + } + } + } +} forbiddenstars.ru { tls /etc/caddy/certs/forbiddenstars.ru/fullchain.pem /etc/caddy/certs/forbiddenstars.ru/privkey.pem @@ -24,6 +43,7 @@ forbiddenstars.ru { encode zstd gzip reverse_proxy 127.0.0.1:9000 } + import offline } forbidden-stars.ru { @@ -38,4 +58,5 @@ forbidden-stars.ru { encode zstd gzip reverse_proxy 127.0.0.1:9001 } + import offline } diff --git a/deploy/vps/README.md b/deploy/vps/README.md index a546449..06307bb 100644 --- a/deploy/vps/README.md +++ b/deploy/vps/README.md @@ -85,16 +85,26 @@ rm -rf /root/certs-tmp > как «промежуточную» часть. Если дал один файл, где leaf и chain уже вместе, — это и есть > `fullchain.pem` (склейка не нужна). -## 6. Caddyfile -Скопируй `deploy/vps/Caddyfile` из репозитория в `/etc/caddy/Caddyfile`, затем: +## 6. Caddyfile + страница-заглушка +Скопируй `deploy/vps/Caddyfile` из репозитория в `/etc/caddy/Caddyfile` и положи страницу +«сайт недоступен» (показывается, когда туннель к хосту лежит — вместо зависшей «Загрузки» SPA): ```bash +mkdir -p /etc/caddy/maintenance +# с локальной машины: +scp deploy/vps/maintenance.html root@186.246.51.17:/etc/caddy/maintenance/maintenance.html +# на VPS: caddy validate --config /etc/caddy/Caddyfile systemctl reload caddy ``` +> Заглушка живёт в сниппете `(offline)` Caddyfile: при ответе апстрима 502/503/504 +> Caddy отдаёт `/etc/caddy/maintenance/maintenance.html` со статусом 503 и `Cache-Control: no-store`. +> Правки текста/вида — в `deploy/vps/maintenance.html`, затем повтори `scp` (reload Caddy не нужен, +> файл читается на каждый запрос). ## 7. Проверка 1. Подними туннель прода на Pi (см. `deploy/pi/README.md`) и/или dev/test на ПК (`run.ps1` при `LOCAL_PUBLIC=vps`). 2. Открой `https://forbiddenstars.ru` и `https://forbidden-stars.ru`. -3. Пока соответствующий туннель не поднят — Caddy отдаёт `502`, это ожидаемо. +3. Пока соответствующий туннель не поднят — Caddy отдаёт страницу-заглушку «Технические шоколадки» + (HTTP 503), это ожидаемо. Логи Caddy: `journalctl -u caddy -f`. diff --git a/deploy/vps/maintenance.html b/deploy/vps/maintenance.html new file mode 100644 index 0000000..d6a71fe --- /dev/null +++ b/deploy/vps/maintenance.html @@ -0,0 +1,64 @@ + + + + + + + + + Сайт недоступен — Forbidden Stars + + + +
+
🍫
+

Технические шоколадки

+

Сайт временно недоступен — мы уже чиним. Загляните через минутку.

+
Страница обновится сама, как только всё заработает
+
+ +