From a618f3fca6cd256b180a746403b8d77c781cc138 Mon Sep 17 00:00:00 2001 From: John Coffey Date: Sat, 5 Sep 2026 22:44:25 -0700 Subject: [PATCH] Compress the bundle in the nginx example The Caddy example has `encode zstd gzip`; the nginx one had nothing, so a deployment following it shipped every asset uncompressed. Measured against the built app that is 915 KB on the wire where 307 KB would do -- the difference falls entirely on first load, and silently, since nothing about it is visible without inspecting response headers. `text/javascript` is listed explicitly. The server sends scripts with that type rather than `application/javascript`, so a conventional gzip_types list compresses the stylesheet and leaves the 647 KB script alone -- which is what happened on the first attempt at this change. text/event-stream is deliberately not listed. Compressing or buffering the push stream would break it; proxy_buffering is already off below for the same reason. Verified that /api/events still delivers a StateChange event through the proxy, as plain text, while assets come back gzipped with Vary set. --- nginx.example.conf | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/nginx.example.conf b/nginx.example.conf index 50b8989..79984c0 100644 --- a/nginx.example.conf +++ b/nginx.example.conf @@ -6,6 +6,26 @@ server { client_max_body_size 60m; + # ihasmail serves its bundle uncompressed and leaves this to the proxy, so + # without these directives the browser downloads about 915 KB where 307 KB + # would do. text/event-stream is deliberately absent from gzip_types: the + # push stream must not be compressed or buffered. + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 5; + gzip_min_length 1024; + # ihasmail serves scripts as text/javascript, so listing only + # application/javascript silently leaves the largest asset uncompressed. + gzip_types + application/javascript + application/json + application/manifest+json + image/svg+xml + text/css + text/javascript + text/plain; + location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1;