2023-01-29 14:47:22 +00:00
|
|
|
server {
|
|
|
|
listen ${VIKUNJA_HTTP_PORT};
|
|
|
|
listen [::]:${VIKUNJA_HTTP_PORT};
|
2023-01-27 08:57:35 +00:00
|
|
|
## Needed when behind HAProxy with SSL termination + HTTP/2 support
|
2023-01-29 14:47:22 +00:00
|
|
|
listen ${VIKUNJA_HTTP2_PORT} default_server http2 proxy_protocol;
|
|
|
|
listen [::]:${VIKUNJA_HTTP2_PORT} default_server http2 proxy_protocol;
|
|
|
|
|
|
|
|
server_name _;
|
|
|
|
expires $expires;
|
|
|
|
root /usr/share/nginx/html;
|
|
|
|
access_log /dev/stdout ${VIKUNJA_LOG_FORMAT};
|
|
|
|
# security headers
|
|
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
|
|
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
|
|
|
add_header Content-Security-Policy "default-src 'self' http: https: ws: wss: data: blob: 'unsafe-inline'; frame-ancestors 'self';" always;
|
|
|
|
add_header Permissions-Policy "interest-cohort=()" always;
|
|
|
|
|
|
|
|
# . files
|
|
|
|
location ~ /\.(?!well-known) {
|
|
|
|
deny all;
|
|
|
|
}
|
|
|
|
|
|
|
|
# assume that everything else is handled by the application router, by injecting the index.html.
|
|
|
|
location / {
|
|
|
|
autoindex off;
|
|
|
|
expires off;
|
|
|
|
add_header Cache-Control "public, max-age=0, s-maxage=0, must-revalidate" always;
|
|
|
|
try_files $uri /index.html =404;
|
|
|
|
}
|
2023-02-22 11:18:46 +00:00
|
|
|
|
|
|
|
# Disable caching for sw
|
|
|
|
location = /sw.js {
|
|
|
|
autoindex off;
|
|
|
|
expires off;
|
|
|
|
add_header Cache-Control "public, max-age=0, s-maxage=0, must-revalidate" always;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Disable caching for webmanifest
|
|
|
|
location = /manifest.webmanifest {
|
|
|
|
autoindex off;
|
|
|
|
expires off;
|
|
|
|
add_header Cache-Control "public, max-age=0, s-maxage=0, must-revalidate" always;
|
|
|
|
}
|
2023-01-29 14:47:22 +00:00
|
|
|
|
|
|
|
# favicon.ico
|
|
|
|
location = /favicon.ico {
|
|
|
|
log_not_found off;
|
|
|
|
access_log off;
|
|
|
|
}
|
|
|
|
|
|
|
|
# robots.txt
|
|
|
|
location = /robots.txt {
|
|
|
|
log_not_found off;
|
|
|
|
access_log off;
|
|
|
|
expires -1; # no-cache
|
|
|
|
}
|
|
|
|
|
|
|
|
location = /ready {
|
|
|
|
return 200 "";
|
|
|
|
access_log off;
|
|
|
|
expires -1; # no-cache
|
|
|
|
}
|
|
|
|
|
|
|
|
# all assets contain hash in filename, cache forever
|
|
|
|
location ^~ /assets/ {
|
|
|
|
add_header Cache-Control "public, max-age=31536000, s-maxage=31536000, immutable";
|
|
|
|
try_files $uri =404;
|
|
|
|
}
|
|
|
|
|
|
|
|
# all workbox scripts are compiled with hash in filename, cache forever3
|
|
|
|
location ^~ /workbox- {
|
|
|
|
add_header Cache-Control "public, max-age=31536000, s-maxage=31536000, immutable";
|
|
|
|
try_files $uri =404;
|
|
|
|
}
|
|
|
|
|
|
|
|
# assets, media
|
|
|
|
location ~* .(txt|webmanifest|css|js|mjs|map|svg|jpg|jpeg|png|ico|ttf|woff|woff2|wav)$ {
|
|
|
|
try_files $uri $uri/ =404;
|
|
|
|
}
|
|
|
|
|
|
|
|
error_page 500 502 503 504 /50x.html;
|
|
|
|
location = /50x.html { }
|
|
|
|
|
|
|
|
}
|