This commit is contained in:
2026-10-13 14:16:35 +07:00
parent 716da35142
commit c7ce0195ba
4 changed files with 43 additions and 14 deletions
+9 -5
View File
@@ -93,8 +93,10 @@ make venue
``` ```
Сайт доступен по `https://evening-detective.crabs-games.art`; API и материалы Сайт доступен по `https://evening-detective.crabs-games.art`; API и материалы
обслуживаются тем же прокси. Для подключения по LAN задайте постоянный IP ноутбука обслуживаются тем же прокси. Интерфейс и API также можно открыть без локального
в `VENUE_BIND_IP` в `venue/.env` и настройте локальный DNS, как описано ниже. DNS по `http://<VENUE_BIND_IP>:<VENUE_PORT>`. Ссылки на материалы, QR-коды и
билеты при этом остаются на прежнем HTTPS-домене. Для подключения по LAN задайте
постоянный IP ноутбука в `VENUE_BIND_IP` в `venue/.env`.
Приложение, база и RustFS подключены только к внутренней Docker-сети. Приложение, база и RustFS подключены только к внутренней Docker-сети.
Прокси дополнительно подключён к сети публикации порта. Прокси дополнительно подключён к сети публикации порта.
@@ -261,7 +263,8 @@ localStorage создаёт новое устройство. История по
двух доменов должны приходить на локальный DNS, а клиенты — достигать ноутбука. двух доменов должны приходить на локальный DNS, а клиенты — достигать ноутбука.
Скрипты проекта не меняют роутер и не прошивают его. Скрипты проекта не меняют роутер и не прошивают его.
5. В `venue/.env` задайте `VENUE_BIND_IP=<постоянный-IP-ноутбука>` и разрешите 5. В `venue/.env` задайте `VENUE_BIND_IP=<постоянный-IP-ноутбука>` и разрешите
входящие TCP 80/443 и TCP/UDP 53 из LAN в межсетевом экране ноутбука. входящие TCP 80/443, TCP `VENUE_PORT` и TCP/UDP 53 из LAN в межсетевом экране
ноутбука.
`VENUE_BIND_IP` должен быть конкретным IPv4-адресом ноутбука, не `0.0.0.0`: `VENUE_BIND_IP` должен быть конкретным IPv4-адресом ноутбука, не `0.0.0.0`:
он используется и для публикации портов, и для DNS-ответов. Порты должны быть свободны. он используется и для публикации портов, и для DNS-ответов. Порты должны быть свободны.
Для HTTPS менять `APP_BASE_URL` в `.env` не нужно: Compose-дополнение задаёт Для HTTPS менять `APP_BASE_URL` в `.env` не нужно: Compose-дополнение задаёт
@@ -280,8 +283,9 @@ localStorage создаёт новое устройство. История по
Интерфейс открывается по `https://evening-detective.crabs-games.art`, API — по Интерфейс открывается по `https://evening-detective.crabs-games.art`, API — по
`https://evening-detective-api.crabs-games.art`. Интерфейс использует свой `/api/`; `https://evening-detective-api.crabs-games.art`. Интерфейс использует свой `/api/`;
прежний API-домен также обслуживается локально. HTTP на портах 80 и прежнем прежний API-домен также обслуживается локально. На `VENUE_PORT` интерфейс и API
`VENUE_PORT` перенаправляется на HTTPS с сохранением пути и параметров. доступны по IP через HTTP без редиректа; запросы по доменным именам на порту 80
перенаправляются на HTTPS с сохранением пути и параметров.
CoreDNS публикуется только на `VENUE_BIND_IP:53` по UDP/TCP. Оба домена получают CoreDNS публикуется только на `VENUE_BIND_IP:53` по UDP/TCP. Оба домена получают
этот IPv4 локально; AAAA-запросы не получают внешние адреса. Для них интернет этот IPv4 локально; AAAA-запросы не получают внешние адреса. Для них интернет
+1 -1
Submodule prod updated: f827e32809...1400500d50
+2
View File
@@ -236,6 +236,8 @@ with tempfile.TemporaryDirectory(prefix="venue-https-") as directory:
assert request(domain, "/api/games/import", method="POST", body=b"test ZIP") == (200, None, "api:/api/games/import") assert request(domain, "/api/games/import", method="POST", body=b"test ZIP") == (200, None, "api:/api/games/import")
assert request(ui, "/team-story/1?password=test") == (200, None, "spa:/team-story/1?password=test") assert request(ui, "/team-story/1?password=test") == (200, None, "spa:/team-story/1?password=test")
assert request(api, "/docs/") == (200, None, "api:/docs/") assert request(api, "/docs/") == (200, None, "api:/docs/")
assert request("192.0.2.10", "/api/test/ping?value=1", tls=False) == (200, None, "api:/api/test/ping?value=1")
assert request("192.0.2.10", "/team-story/1?password=test", tls=False) == (200, None, "spa:/team-story/1?password=test")
run("docker", "restart", proxy) run("docker", "restart", proxy)
run("docker", "exec", proxy, "nginx", "-t") run("docker", "exec", proxy, "nginx", "-t")
assert request(ui, "/games") == (200, None, "spa:/games") assert request(ui, "/games") == (200, None, "spa:/games")
+30 -7
View File
@@ -9,15 +9,38 @@ proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s; proxy_read_timeout 120s;
server { server {
listen 80; listen 80 default_server;
server_name evening-detective.crabs-games.art; server_name _;
return 308 https://evening-detective.crabs-games.art$request_uri;
if ($host ~ ^(evening-detective\.crabs-games\.art|evening-detective-api\.crabs-games\.art)$) {
return 308 https://$host$request_uri;
} }
server { location = /api/games/import {
listen 80; client_max_body_size 1g;
server_name evening-detective-api.crabs-games.art; client_body_timeout 1800s;
return 308 https://evening-detective-api.crabs-games.art$request_uri; proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_request_buffering off;
proxy_pass http://evening_detective_server:8090;
}
location ~ ^/api/games/[0-9]+/results-package/(apply|download)$ {
client_max_body_size 1g;
client_body_timeout 1800s;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_request_buffering off;
proxy_pass http://evening_detective_server:8090;
}
location /api/ {
proxy_pass http://evening_detective_server:8090;
}
location / {
proxy_pass http://evening_detective_frontend:8080;
}
} }
server { server {