diff --git a/docker/resume/nginx.conf b/docker/resume/nginx.conf index 0c34369..f9f319d 100644 --- a/docker/resume/nginx.conf +++ b/docker/resume/nginx.conf @@ -1,56 +1,51 @@ -server { - listen 8080 http2; - listen 8080 quic reuseport; - http3_max_concurrent_streams 128; - - root /usr/share/nginx/html; - index index.html; - - server_name colinknapp.com www.colinknapp.com; - - # Security Headers - add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; - add_header X-Frame-Options "DENY" always; - add_header X-Content-Type-Options "nosniff" always; - add_header Referrer-Policy "no-referrer" always; - add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()" always; - - # Content Security Policy (CSP) - add_header Content-Security-Policy " - default-src 'self'; - script-src 'self' https://matomo.nixc.us/js/tracker.js https://colinknapp.com/scripts/some-script.js; - style-src 'self' 'unsafe-inline' https://colinknapp.com/styles/main.css; - img-src 'self' https://colinknapp.com/icons data:; - connect-src 'self' https://matomo.nixc.us; - font-src 'self' fonts.gstatic.com; - base-uri 'self'; - form-action 'self'; - " always; - - # Rate Limiting +http { + # Rate limiting zone defined at the top-level 'http' block limit_req_zone $binary_remote_addr zone=default:10m rate=20r/s; - limit_req_status 429; - # Cache headers for JavaScript, CSS, and HTML - location ~* \.(js|css|html)$ { - expires 1y; - add_header Cache-Control "public, max-age=31536000, immutable"; + server { + listen 8080 http2; + listen [::]:8080 http2; + listen 8080 quic reuseport; + listen [::]:8080 quic reuseport; + http3_max_concurrent_streams 128; + + root /usr/share/nginx/html; + index index.html; + + server_name colinknapp.com www.colinknapp.com; + + # Security headers + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header X-Frame-Options "DENY" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()" always; + + # Content Security Policy (CSP) + add_header Content-Security-Policy " + default-src 'self'; + script-src 'self' https://matomo.nixc.us/js/tracker.js https://colinknapp.com/scripts/some-script.js; + style-src 'self' 'unsafe-inline' https://colinknapp.com/styles/main.css; + img-src 'self' https://colinknapp.com/icons data:; + connect-src 'self' https://matomo.nixc.us; + font-src 'self' fonts.gstatic.com; + base-uri 'self'; + form-action 'self'; + " always; + + # Enable long-term caching for JavaScript, CSS, and HTML files + location ~* \.(js|css|html)$ { + expires 1y; + add_header Cache-Control "public, max-age=31536000, immutable"; + } + + # Apply rate limiting within the server block + location / { + limit_req zone=default burst=30; + try_files $uri $uri/ =404; + } + + # HTTP/3 advertisement header + add_header Alt-Svc 'h3-29=":8080"; ma=86400'; } - - # Global Rate Limit and Caching for all requests - location / { - limit_req zone=default burst=30; - try_files $uri $uri/ =404; - } - - # Admin Route with IP Whitelisting and Rate Limit - location /admin/ { - allow 192.168.1.0/24; # Trusted IP range - deny all; - limit_req zone=default burst=10; - try_files $uri $uri/ =404; - } - - # HTTP/3 advertisement header - add_header Alt-Svc 'h3-29=":8080"; ma=86400'; }