worker_processes 8; worker_rlimit_nofile 8192; events { worker_connections 132768; ## Default: 1024 } http { include /etc/nginx/mime.types; include /etc/nginx/proxy.conf; include /etc/nginx/fastcgi.conf; upstream backend_GET { least_conn; server localhost:4441; server localhost:4442; #server localhost:4443; #server localhost:4444; #server localhost:4445; #server localhost:4446; #server localhost:4447; #server localhost:4448; server 10.0.0.3:4441; server 10.0.0.3:4442; #server 134.209.69.251:80 backup; server 116.203.32.253:80 backup; #server 116.203.32.253:80; } upstream backend_POST { #server localhost:4441; #server localhost:4442; server 10.0.0.3:4441; #server 10.0.0.3:4442; } upstream backend_db { server localhost:4441; #server 10.0.0.3:4441; } proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m inactive=60m max_size=400m; proxy_cache_key "$scheme$request_method$host$request_uri"; add_header X-Cache $upstream_cache_status; server { server_name sponsor.ajay.app api.sponsor.ajay.app; error_page 404 /404.html; error_page 500 @myerrordirective_500; error_page 502 @myerrordirective_502; error_page 504 @myerrordirective_504; #location = /404 { # root /home/sbadmin/caddy/SponsorBlockSite/public-prod; # internal; #} #proxy_send_timeout 120s; location @myerrordirective_500 { return 400 "Internal Server Error"; } location @myerrordirective_502 { return 400 "Bad Gateway"; } location @myerrordirective_504 { return 400 "Gateway Timeout"; } location /news { return 301 https://blog.ajay.app/sponsorblock; } location /viewer { return 301 https://sb.ltn.fi; } location /test/ { proxy_pass http://localhost:4440/; #proxy_pass https://sbtest.etcinit.com/; } location /api/skipSegments { #return 200 "[]"; proxy_pass http://backend_$request_method; #proxy_cache CACHEZONE; #proxy_cache_valid 2m; } location /api/getTopUsers { proxy_pass http://backend_GET; proxy_cache CACHEZONE; proxy_cache_valid 20m; } location /api/getTotalStats { proxy_pass http://backend_GET; #return 200 ""; } location /api/getVideoSponsorTimes { proxy_pass http://backend_GET; } location /download/ { #alias /home/sbadmin/sponsor/docker/database-export/; return 307 https://cdnsponsor.ajay.app$request_uri; } location /database { proxy_pass http://backend_db; #return 200 "Disabled for load reasons"; } location = /database.db { #return 404 "Sqlite database has been replaced with csv exports at https://sponsor.ajay.app/database. Sqlite exports might come back soon, but exported at longer intervals."; #alias /home/sbadmin/sponsor/databases/sponsorTimes.db; alias /home/sbadmin/test-db/database.db; } #location = /database/sponsorTimes.csv { # alias /home/sbadmin/sponsorTimes.csv; #} #location /api/voteOnSponsorTime { # return 200 "Success"; #} #location /api/viewedVideoSponsorTime { # return 200 "Success"; #} location /api { proxy_pass http://backend_POST; } location / { root /home/sbadmin/SponsorBlockSite/public-prod; ### CORS if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE'; # # Custom headers and headers various browsers *should* be OK with but aren't # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; # # Tell client that this pre-flight info is valid for 20 days # add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } if ($request_method = 'DELETE') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } } listen 443 default_server ssl http2; # managed by Certbot #listen 443 http3 reuseport; #ssl_protocols TLSv1.2 TLSv1.3; #listen 80; ssl_certificate /etc/letsencrypt/live/sponsor.ajay.app-0001/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/sponsor.ajay.app-0001/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { server_name cdnsponsor.ajay.app; error_page 404 /404.html; #location /database/ { # alias /home/sbadmin/sponsor/docker/database-export/; #} location /download/ { alias /home/sbadmin/sponsor/docker/database-export/; } location / { root /home/sbadmin/SponsorBlockSite/public-prod; ### CORS if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # # Custom headers and headers various browsers *should* be OK with but aren't # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; # # Tell client that this pre-flight info is valid for 20 days # add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/sponsor.ajay.app-0001/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/sponsor.ajay.app-0001/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { access_log off; error_log /dev/null; if ($host = api.sponsor.ajay.app) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = sponsor.ajay.app) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name sponsor.ajay.app api.sponsor.ajay.app; return 404; # managed by Certbot } server { if ($host = cdnsponsor.ajay.app) { return 301 https://$host$request_uri; } # managed by Certbot server_name cdnsponsor.ajay.app; listen 80; return 404; # managed by Certbot }}