|
const express = require("express"); |
|
const cors = require("cors"); |
|
const compression = require("compression"); |
|
const path = require("path"); |
|
const serveStatic = require("serve-static"); |
|
const { createProxyMiddleware } = require("http-proxy-middleware"); |
|
|
|
const app = express(); |
|
const port = process.env.PORT || 7860; |
|
const apiPort = process.env.INTERNAL_API_PORT || 7861; |
|
|
|
|
|
app.use(cors()); |
|
|
|
|
|
app.use(compression()); |
|
|
|
|
|
app.use( |
|
"/api", |
|
createProxyMiddleware({ |
|
target: `http://127.0.0.1:${apiPort}`, |
|
changeOrigin: true, |
|
onError: (err, req, res) => { |
|
console.error("Proxy Error:", err); |
|
res.status(500).json({ error: "Proxy Error", details: err.message }); |
|
}, |
|
}) |
|
); |
|
|
|
|
|
app.use( |
|
express.static(path.join(__dirname, "build"), { |
|
|
|
setHeaders: (res, path) => { |
|
if (path.endsWith(".html")) { |
|
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); |
|
res.setHeader("Pragma", "no-cache"); |
|
res.setHeader("Expires", "0"); |
|
} else { |
|
|
|
res.setHeader("Cache-Control", "public, max-age=31536000"); |
|
} |
|
}, |
|
}) |
|
); |
|
|
|
|
|
app.use((req, res, next) => { |
|
|
|
if (req.url.startsWith("/api")) { |
|
return next(); |
|
} |
|
|
|
|
|
req.originalUrl = req.url; |
|
next(); |
|
}); |
|
|
|
|
|
app.get("*", (req, res) => { |
|
|
|
if (req.url.startsWith("/api")) { |
|
return next(); |
|
} |
|
|
|
|
|
res.set({ |
|
"Cache-Control": "no-cache, no-store, must-revalidate", |
|
Pragma: "no-cache", |
|
Expires: "0", |
|
}); |
|
|
|
|
|
res.sendFile(path.join(__dirname, "build", "index.html")); |
|
}); |
|
|
|
app.listen(port, "0.0.0.0", () => { |
|
console.log( |
|
`Frontend server is running on port ${port} in ${ |
|
process.env.NODE_ENV || "development" |
|
} mode` |
|
); |
|
console.log(`API proxy target: http://127.0.0.1:${apiPort}`); |
|
}); |
|
|