server { listen 80; # Required explicitly: the nginx image's 10-listen-on-ipv6-by-default.sh # only patches the stock default.conf. We replace that file, so without # this line the container listens on IPv4 only while HEALTHCHECK wget # resolves localhost to ::1 and fails → Docker reports unhealthy. listen [::]:80; server_name _; root /usr/share/nginx/html; index index.html; # Vue Router uses history mode — every unmatched path must fall through # to index.html or a hard refresh on /alerts returns 404. location / { try_files $uri $uri/ /index.html; } # Hashed assets are immutable; index.html must never be cached or clients # keep loading the previous release's asset manifest. location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; } location = /index.html { add_header Cache-Control "no-cache, no-store, must-revalidate"; } gzip on; gzip_types text/css application/javascript application/json image/svg+xml; gzip_min_length 1024; }