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 @@ + + +
+ + + + + +Сайт временно недоступен — мы уже чиним. Загляните через минутку.
+