events {} http { include mime.types; default_type application/octet-stream; client_max_body_size 0; server { listen 8040; root /var/www/html; index index.html; # Add CORS headers to all responses add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; location /rss/ { # Rewrite /rss/123 to /api/feed/123 rewrite ^/rss/(\d+)(?:/(\d+))?$ /api/feed/$1$2 last; proxy_pass http://localhost:8032; 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_set_header Api-Key $arg_api_key; # Pass the api_key query param as a header # RSS-specific headers add_header Content-Type "application/rss+xml; charset=utf-8"; expires 1h; add_header Cache-Control "public, no-transform"; } location / { # Handle OPTIONS requests for CORS preflight if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } try_files $uri $uri/ /index.html; } location /api { # Add CORS headers for /api responses add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; proxy_pass http://localhost:8032; 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; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } } # Route all gpodder API requests to the Go service location ~ ^/(api/2|auth|subscriptions|devices|updates|episodes|settings|lists|favorites|sync-devices|search|suggestions|toplist|tag|tags|data)/ { proxy_pass http://127.0.0.1:8042; 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; # Add CORS headers add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; # Handle OPTIONS requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } # Increase timeouts for longer operations proxy_read_timeout 300; proxy_send_timeout 300; } # Special route for gpodder.net protocol support location /api/gpodder { # Add CORS headers for /api/gpodder responses add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; proxy_pass http://localhost:8032; 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; # Increase timeouts for potentially longer operations proxy_read_timeout 300; proxy_send_timeout 300; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Api-Key,Authorization' always; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } } location /ws/api/data/ { proxy_pass http://localhost:8032; # Pass the WebSocket connection to your backend # WebSocket headers 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; # Optionally increase the timeout values for long-running WebSocket connections proxy_read_timeout 86400; proxy_send_timeout 86400; } location /ws/api/tasks/ { proxy_pass http://localhost:8032; # Pass the WebSocket connection to your backend # WebSocket headers 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; # Optionally increase the timeout values for long-running WebSocket connections proxy_read_timeout 86400; proxy_send_timeout 86400; } # location = /api/data/restore_server { # client_max_body_size 0; # proxy_pass http://localhost:8032; # 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; # # You may not need the CORS headers specifically for this endpoint # # unless you're expecting to call it directly from client-side JavaScript # # in a browser. If it's called server-side or from a tool like Postman, # # these CORS headers might be unnecessary. Adjust as needed. # add_header 'Access-Control-Allow-Origin' '*' always; # add_header 'Access-Control-Allow-Methods' 'POST' always; # add_header 'Access-Control-Allow-Headers' 'Content-Type, Api-Key' always; # } # Correct MIME type for WebAssembly files location ~* \.wasm$ { types { application/wasm wasm; } } } }