Files
pedwfrontend/server.js
T

125 lines
3.5 KiB
JavaScript

const next = require("next");
const { createServer: createHttpServer } = require("http");
const { createServer: createHttpsServer } = require("https");
const fs = require("fs");
const path = require("path");
const appInsights = require("applicationinsights");
const initAppInsights = (instrumentationKey) => {
if (!instrumentationKey) {
console.log("App Insights not configured.");
return false;
}
appInsights
.setup(instrumentationKey)
.setAutoCollectConsole(true, true)
.setSendLiveMetrics(true)
.start();
console.log("App Insights enabled.");
return true;
};
const startServer = async (config) => {
const serverOptions = {
dev: config.env === "development",
dir: ".",
quiet: false,
};
const app = next(serverOptions);
await app.prepare();
const handleNextRequests = app.getRequestHandler();
const httpsOptions = {
key: fs.readFileSync(
path.join(__dirname, "certificates", "cert-key.pem")
),
cert: fs.readFileSync(path.join(__dirname, "certificates", "cert.pem")),
};
// HTTPS server on port 3000
const httpsServer = createHttpsServer(httpsOptions, (req, res) => {
if (config.useAppInsights) {
appInsights.defaultClient.trackNodeHttpRequest({
request: req,
response: res,
});
}
handleNextRequests(req, res);
});
// HTTP server on port 3001 for redirect
const httpServer = createHttpServer((req, res) => {
const host = req.headers.host?.split(":")[0] || "localhost";
res.writeHead(301, {
Location: `https://${host}:3000${req.url}`,
});
res.end();
});
await new Promise((resolve, reject) => {
httpsServer.on("error", reject);
httpsServer.on("listening", () => {
console.log(`HTTPS server listening on port ${config.port}`);
resolve();
});
httpsServer.listen(config.port, config.hostname);
});
await new Promise((resolve, reject) => {
httpServer.on("error", reject);
httpServer.on("listening", () => {
console.log(
`HTTP server listening on port ${config.httpPort} (redirecting to HTTPS)`
);
resolve();
});
httpServer.listen(config.httpPort, config.hostname);
});
process.on("SIGTERM", () => {
console.log("Received SIGTERM, shutting down gracefully...");
httpsServer.close(() => {
httpServer.close(() => {
console.log("Servers closed.");
process.exit(0);
});
});
});
return app;
};
const startTime = Date.now();
const serverConfig = {
hostname: "0.0.0.0",
port: 3000, // HTTPS port
httpPort: 3001, // HTTP redirect port
env: process.env.APP_ENV || process.env.NODE_ENV || "production",
useAppInsights: initAppInsights(
process.env.NEXT_PUBLIC_APPINSIGHTS_INSTRUMENTATIONKEY
),
};
startServer(serverConfig)
.then(() => {
console.log(
`Server ready on https://${serverConfig.hostname}:${serverConfig.port} [${serverConfig.env}]`
);
if (serverConfig.useAppInsights) {
const duration = Date.now() - startTime;
appInsights.defaultClient.trackMetric({
name: "Server Startup Time",
value: duration,
});
}
})
.catch((err) => {
console.error("Server failed to start:", err);
process.exit(1);
});