server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # Disable caching for all responses during debugging add_header Cache-Control "no-cache, no-store, must-revalidate" always; add_header Pragma "no-cache" always; add_header Expires "0" always; # Favicon location = /favicon.ico { try_files /favicon.ico =204; access_log off; log_not_found off; } # Serve shared JS and CSS directories at root location /js/ { try_files $uri =404; } location /css/ { try_files $uri =404; } # Custom 404 page error_page 404 /404.html; location = /404.html { internal; } # Enable clean URLs without .html extension location / { # Try the exact URI, then with .html, then as directory with index.html, then 404 try_files $uri $uri.html $uri/ =404; } location = /index.html { try_files /index.html =404; } # Proxy API requests to plato.lan (192.168.1.74) location /api/plato/ { proxy_pass http://192.168.1.74:8080/v1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Proxy API requests to stoic.lan (192.168.1.159) location /api/stoic/ { proxy_pass http://192.168.1.159:8081/v1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Proxy API requests to ollama (192.168.1.159:8081) location /api/ollama/ { proxy_pass http://192.168.1.159:8081/v1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Default /api/ points to plato for backwards compatibility location /api/ { proxy_pass http://192.168.1.74:8080/v1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Cache static assets with content hash - minimal caching location ~* \.(js|css)$ { expires 1s; # 1 second for rapid iteration add_header Cache-Control "public, max-age=1, must-revalidate" always; } # Cache images and icons - short caching location ~* \.(ico|png|svg|jpg|jpeg|gif|webp)$ { expires 5s; # 5 seconds, adjust as needed add_header Cache-Control "public, max-age=5, must-revalidate" always; } # Gzip compression for better performance gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; }