mirror of
https://github.com/Such-Software/wowcheckout.git
synced 2026-10-17 05:51:45 +02:00
Previously nginx resolved service names (api, ui) to IPs once at startup and cached them forever. When the api container is rebuilt (e.g. for a code fix) Docker assigns it a new IP and nginx keeps hitting the old dead one, returning 502 Bad Gateway on every request until nginx is manually restarted. Actual impact tonight: after deploying the Wownero 10^11 decimals fix, wowcheckout-api-1 came up at 172.20.0.6 but nginx kept trying 172.20.0.9. Medusa's provider.authorizePayment call via the LAN URL 502'd. Medusa treated that as 'payment not authorized', refused to create the order, and the customer's WOW payment silently vanished even though the reconciler detected it correctly on the xmrcheckout side. Use 'resolver 127.0.0.11 valid=10s' + 'set $api_upstream …' so nginx re-resolves via Docker's internal DNS every ~10s. Stale-IP window is now bounded to 10s max.
58 lines
1.7 KiB
Plaintext
58 lines
1.7 KiB
Plaintext
limit_req_zone $binary_remote_addr zone=global_rate_limit:10m rate=50r/s;
|
|
|
|
# Docker's embedded DNS (127.0.0.11) lets nginx re-resolve upstream service
|
|
# hostnames. Without `resolver` + a variable-based proxy_pass, nginx resolves
|
|
# `api` / `ui` to an IP once at startup and caches it forever — if the api
|
|
# container is rebuilt and Docker gives it a new IP, nginx keeps hitting the
|
|
# old one and every request returns 502 Bad Gateway until nginx is manually
|
|
# restarted. `valid=10s` bounds the stale window to ~10 seconds.
|
|
resolver 127.0.0.11 valid=10s ipv6=off;
|
|
|
|
server {
|
|
listen 80;
|
|
server_name wowcheckout.such.software localhost;
|
|
|
|
limit_req zone=global_rate_limit burst=200 nodelay;
|
|
|
|
if ($request_uri ~* "//+") {
|
|
return 308 $scheme://$host$uri$is_args$args;
|
|
}
|
|
|
|
location /api/ {
|
|
set $api_upstream "api";
|
|
proxy_pass http://$api_upstream:8000/api/;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
location /api {
|
|
return 301 /api/;
|
|
}
|
|
|
|
location = /openapi.json {
|
|
set $api_upstream "api";
|
|
proxy_pass http://$api_upstream:8000/openapi.json;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
location /qr/ {
|
|
alias /qr/;
|
|
add_header Cache-Control "public, max-age=31536000, immutable";
|
|
try_files $uri =404;
|
|
}
|
|
|
|
location / {
|
|
set $ui_upstream "ui";
|
|
proxy_pass http://$ui_upstream:3000/;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
}
|