Fixed the crash loop issue caused by Vite trying to watch too many files (including node_modules) in Kubernetes environment. Problem: - Vite dev server was starting successfully - But then container would crash with "too many open files" - This caused infinite restart loop (CrashLoopBackOff) - Error: "failed to create fsnotify watcher: too many open files" Root Cause: - Vite's file watcher was monitoring ALL files including node_modules - In Kubernetes, this exceeded inotify limits - Each restart would hit the same limit Solution: - Added 'ignored' patterns to vite.config.ts server.watch - Excluded: node_modules, dist, .git, coverage, .cache - Vite will only watch actual source files in src/ - Dramatically reduces number of watched files Changes: - frontend/vite.config.ts: Added server.watch.ignored array Benefits: - Container stays running without crashes - Faster hot reload (fewer files to watch) - Lower resource usage - Dev server remains stable in Kubernetes Testing: - Tilt will auto-rebuild container with new config - Container should start and stay running - Vite dev server will be accessible - Hot reload will still work for src/ files
65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
import { defineConfig } from 'vite';
|
|
import react from '@vitejs/plugin-react';
|
|
import path from 'path';
|
|
|
|
export default defineConfig({
|
|
plugins: [
|
|
react(),
|
|
// PWA plugin temporarily disabled to avoid service worker conflicts
|
|
// VitePWA can be re-enabled later for production PWA features
|
|
],
|
|
resolve: {
|
|
alias: {
|
|
'@': path.resolve(__dirname, './src'),
|
|
'@components': path.resolve(__dirname, './src/components'),
|
|
'@pages': path.resolve(__dirname, './src/pages'),
|
|
'@hooks': path.resolve(__dirname, './src/hooks'),
|
|
'@stores': path.resolve(__dirname, './src/stores'),
|
|
'@services': path.resolve(__dirname, './src/services'),
|
|
'@utils': path.resolve(__dirname, './src/utils'),
|
|
'@types': path.resolve(__dirname, './src/types'),
|
|
},
|
|
},
|
|
server: {
|
|
host: '0.0.0.0', // Important for Docker
|
|
port: 3000,
|
|
watch: {
|
|
usePolling: true, // Important for Docker file watching
|
|
// Ignore these directories to prevent "too many open files" error in Kubernetes
|
|
ignored: [
|
|
'**/node_modules/**',
|
|
'**/dist/**',
|
|
'**/.git/**',
|
|
'**/coverage/**',
|
|
'**/.cache/**',
|
|
],
|
|
},
|
|
proxy: {
|
|
'/api': {
|
|
target: process.env.VITE_API_URL !== undefined
|
|
? (process.env.VITE_API_URL || '') // Use value or empty string
|
|
: (process.env.NODE_ENV === 'development' && process.env.KUBERNETES_SERVICE_HOST
|
|
? 'http://gateway-service:8000' // Kubernetes internal service
|
|
: 'http://localhost:8000'), // Local development
|
|
changeOrigin: true,
|
|
rewrite: (path) => path.replace(/^\/api/, ''),
|
|
},
|
|
},
|
|
},
|
|
build: {
|
|
outDir: 'dist',
|
|
sourcemap: true,
|
|
rollupOptions: {
|
|
external: ['/runtime-config.js'], // Externalize runtime config to avoid bundling
|
|
output: {
|
|
manualChunks: {
|
|
vendor: ['react', 'react-dom', 'react-router-dom'],
|
|
ui: ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
|
|
charts: ['recharts'],
|
|
forms: ['react-hook-form', 'zod'],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|