diff --git a/package.json b/package.json index bdbe530..c7a7072 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "main": "src/backend/server.js", "scripts": { "start": "node src/backend/server.js", + "build": "cd src/frontend && npm install && npm run build", "dev": "nodemon src/backend/server.js", "migrate": "node src/backend/database/migrate.js", "test": "jest", diff --git a/railway.json b/railway.json new file mode 100644 index 0000000..daf15c7 --- /dev/null +++ b/railway.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://railway.app/railway.schema.json", + "build": { + "builder": "NIXPACKS", + "buildCommand": "npm run build" + }, + "deploy": { + "startCommand": "npm start", + "healthcheckPath": "/health", + "healthcheckTimeout": 30, + "restartPolicyType": "ON_FAILURE", + "restartPolicyMaxRetries": 3 + } +} diff --git a/src/backend/server.js b/src/backend/server.js index 7ac730e..bcebda6 100644 --- a/src/backend/server.js +++ b/src/backend/server.js @@ -47,11 +47,9 @@ app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); -// Serve Astro build as main site -app.use(express.static(path.join(__dirname, '../../astro-site/dist'))); - -// Serve React app at /app -app.use('/app', express.static(path.join(__dirname, '../frontend/dist'))); +// Serve React frontend build +const frontendPath = path.join(__dirname, '../frontend/dist'); +app.use(express.static(frontendPath)); // API routes app.use('/api/passport/domain', domainRoutes); @@ -63,12 +61,16 @@ app.use('/api/calls', callRoutes); const io = socketService.initialize(httpServer); app.set('io', io); // Make io available in routes -// 404 handler -app.use((req, res) => { - res.status(404).json({ - success: false, - error: 'Endpoint not found' - }); +// SPA fallback - serve index.html for all non-API routes (React Router) +app.get('*', (req, res) => { + // Don't serve index.html for API routes + if (req.path.startsWith('/api/')) { + return res.status(404).json({ + success: false, + error: 'Endpoint not found' + }); + } + res.sendFile(path.join(__dirname, '../frontend/dist/index.html')); }); // Error handler