125 lines
3.5 KiB
JavaScript
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);
|
|
});
|