# Framework M production nginx template # Replace placeholders before use: # ${APP_NAME} e.g. crm # ${STATIC_ROOT} e.g. /srv/crm/frontend/dist # ${BACKEND_UPSTREAM} e.g. 127.0.0.1:8000 server { listen 80; server_name ${APP_NAME}.example.com; # Optional: redirect root to Desk location = / { return 302 /desk/; } # SPA base path location = /desk { return 301 /desk/; } # Serve prebuilt frontend static (SPA) location /desk/ { alias ${STATIC_ROOT}/; try_files $uri $uri/ /desk/index.html; } # Cache immutable build assets aggressively location /desk/assets/ { alias ${STATIC_ROOT}/assets/; expires 30d; add_header Cache-Control "public, immutable"; try_files $uri =404; } # API proxy to Framework M backend location /api/ { proxy_pass http://${BACKEND_UPSTREAM}; proxy_http_version 1.1; 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; } # WebSocket proxy (live updates) location /api/v1/stream { proxy_pass http://${BACKEND_UPSTREAM}; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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_read_timeout 300s; } }