sozsoft-platform/ui/nginx/default.conf

73 lines
2.5 KiB
Text
Raw Permalink Normal View History

2026-10-17 18:51:10 +00:00
# Sözsoft Platform UI konteyneri (nginx).
#
# Hash'li chunk'lar `/srv/assets` altından servis edilir: imajın `dist/assets` içeriği +
# önceki sürümlerin arşivi (bkz. nginx/40-archive-assets.sh). Deploy sonrası açık sekmeler
# kendi sürümlerinin chunk'larını bulmaya devam eder; "eksik js" hatası oluşmaz.
#
# Sürüm kapısı olan dosyalar (index.html, sw.js, warmup.json, manifest) her istekte sunucudan
# doğrulanır; hash'li dosyalar bir yıl değişmez kabul edilir. `${API_URL}` build sırasında
# `.env.{ENV}` dosyasındaki VITE_API_URL ile doldurulur (Dockerfile).
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/css application/javascript application/json application/manifest+json image/svg+xml text/plain application/wasm;
# Hash'li dosyalar: ad değişmeden içerik değişmez.
location /assets/ {
root /srv;
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}
# Sürüm kapısı: tarayıcı ve service worker bu dosyaları her zaman sunucudan alır.
location = /index.html {
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
location = /sw.js {
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
location = /warmup.json {
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
location = /manifest.webmanifest {
# nginx'in mime.types dosyasında .webmanifest yoktur; tarayıcı doğru tipi ister.
types { application/manifest+json webmanifest; }
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
# DevExtreme temaları hash'sizdir; service worker stale-while-revalidate ile tazeler.
location /css/ {
add_header Cache-Control "public, max-age=86400";
}
location /img/ {
add_header Cache-Control "public, max-age=604800";
}
# Arama motoru dosyaları API tarafından üretilir (SeoController); sitenin kökünden yayınlanır.
location = /sitemap.xml {
proxy_pass ${API_URL}/sitemap.xml;
proxy_ssl_server_name on;
}
location = /robots.txt {
proxy_pass ${API_URL}/robots.txt;
proxy_ssl_server_name on;
}
# SPA: fiziksel dosya yoksa index.html (iç yönlendirme `= /index.html` bloğuna düşer,
# no-store başlıkları oradan gelir).
location / {
try_files $uri /index.html;
}
}