server { listen 80; server_name _; # Backend API (FastAPI on port 8080) under /api, prefix stripped location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect ~^(https?://[^/]+)/(.*)$ $1/api/$2; client_max_body_size 0; proxy_request_buffering off; proxy_read_timeout 3600s; } # WebSocket tunnel for gliss desktop streaming location = /api/tunnel { proxy_pass http://127.0.0.1:8080/tunnel; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket connections can be long-lived proxy_read_timeout 86400s; proxy_send_timeout 86400s; } # Frontend (React app on port 3000) — catch-all location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }