# BrevyScribe is a static site: the build produces plain files and the app does
# all its work in the browser, so nginx serves it directly - there is no
# application server, no socket and nothing to proxy to.
#
# Install as /etc/nginx/sites-available/scribe.luxick.de, symlink it into
# sites-enabled, then `nginx -t && systemctl reload nginx`.

server {
	listen 80;
	listen [::]:80;
	server_name scribe.luxick.de;

	# Let certbot answer the challenge, send everything else to HTTPS.
	location /.well-known/acme-challenge/ {
		root /var/www/certbot;
	}
	location / {
		return 301 https://$host$request_uri;
	}
}

server {
	# The `http2 on;` directive only exists from nginx 1.25.1; on older builds
	# (Debian bookworm ships 1.22, Ubuntu 22.04 ships 1.18) it is an unknown
	# directive and the config will not load. This form works everywhere, at the
	# price of a deprecation warning on 1.25.1+.
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name scribe.luxick.de;

	ssl_certificate /etc/letsencrypt/live/scribe.luxick.de/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/scribe.luxick.de/privkey.pem;

	# `certbot certonly` issues the certificate and stops there - unlike the nginx
	# plugin it never writes an `options-ssl-nginx.conf` include, so the protocol
	# and session settings have to live here.
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_prefer_server_ciphers off;
	ssl_session_cache shared:SSL:10m;
	ssl_session_timeout 1d;

	root /var/www/brevyscribe;
	index index.html;

	gzip on;
	gzip_types text/css application/javascript image/svg+xml application/xml;
	gzip_min_length 1024;

	# Vite gives these content-hashed filenames, so they can never go stale.
	location /assets/ {
		expires 1y;
		add_header Cache-Control "public, immutable";
	}

	# The example rosters and the fonts keep their names across builds, so they
	# get a short cache rather than an immutable one.
	location ~* \.(rosz|woff2)$ {
		expires 1h;
		add_header Cache-Control "public";
	}

	# index.html names the hashed assets, so it must never be cached: a stale copy
	# would point at a bundle that no longer exists.
	location = /index.html {
		add_header Cache-Control "no-cache";
	}

	# A single page app with no router, but serving index.html for an unknown path
	# is friendlier than a bare 404.
	location / {
		try_files $uri $uri/ /index.html;
	}
}
