- Add Express server with vite-express for combined frontend/API serving - Create modular API route structure (server/api/) - Implement Claude API proxy with proper header injection - Support split deployment via API_ONLY and ALLOWED_ORIGINS env vars - Remove Claude proxy from Vite config (now handled by Express) - Add migration plan documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
42 lines
1.1 KiB
JavaScript
42 lines
1.1 KiB
JavaScript
import express from "express";
|
|
import ViteExpress from "vite-express";
|
|
import cors from "cors";
|
|
import dotenv from "dotenv";
|
|
import apiRoutes from "./server/api/index.js";
|
|
|
|
// Load .env.local first, then fall back to .env
|
|
dotenv.config({ path: '.env.local' });
|
|
dotenv.config();
|
|
|
|
const app = express();
|
|
|
|
// CORS configuration for split deployment
|
|
// In combined mode, same-origin requests don't need CORS
|
|
const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(",") || [];
|
|
if (allowedOrigins.length > 0) {
|
|
app.use(cors({
|
|
origin: allowedOrigins,
|
|
credentials: true,
|
|
}));
|
|
}
|
|
|
|
app.use(express.json());
|
|
|
|
// API routes
|
|
app.use("/api", apiRoutes);
|
|
|
|
// Check if running in API-only mode (split deployment)
|
|
const apiOnly = process.env.API_ONLY === "true";
|
|
|
|
if (apiOnly) {
|
|
// API-only mode: no static file serving
|
|
app.listen(process.env.PORT || 3000, () => {
|
|
console.log(`API server running on port ${process.env.PORT || 3000}`);
|
|
});
|
|
} else {
|
|
// Combined mode: Vite handles static files + SPA
|
|
ViteExpress.listen(app, process.env.PORT || 3001, () => {
|
|
console.log(`Server running on port ${process.env.PORT || 3001}`);
|
|
});
|
|
}
|