use publicIP on Auth and Billing

This commit is contained in:
Benjamin Palko 2024-10-15 17:43:18 -04:00
parent 84ea133e57
commit 72d5d41c18

View file

@ -1,35 +1,35 @@
// Load environment variables // Load environment variables
const env = require('./utils/env'); const env = require("./utils/env");
// Import modules // Import modules
const express = require('express'); const express = require("express");
const helmet = require('helmet'); const helmet = require("helmet");
const cors = require('cors'); const cors = require("cors");
const compression = require('compression'); const compression = require("compression");
const rateLimit = require('express-rate-limit'); const rateLimit = require("express-rate-limit");
const expressWinston = require('express-winston'); const expressWinston = require("express-winston");
const moment = require('moment-timezone'); const moment = require("moment-timezone");
const { logger } = require('./utils/logger'); const { logger } = require("./utils/logger");
const path = require('path'); const path = require("path");
// Import routes // Import routes
const authRouter = require('./routes/auth'); const authRouter = require("./routes/auth");
const billingRouter = require('./routes/billing'); const billingRouter = require("./routes/billing");
const gatewayRouter = require('./routes/gateway'); const gatewayRouter = require("./routes/gateway");
const loginRouter = require('./routes/launcher/login'); const loginRouter = require("./routes/launcher/login");
const registerRouter = require('./routes/launcher/register'); const registerRouter = require("./routes/launcher/register");
const codeVerificationRouter = require('./routes/launcher/codeVerification'); const codeVerificationRouter = require("./routes/launcher/codeVerification");
const passwordResetEmailRouter = require('./routes/launcher/passwordResetEmail'); const passwordResetEmailRouter = require("./routes/launcher/passwordResetEmail");
const passwordChangeRouter = require('./routes/launcher/changePassword'); const passwordChangeRouter = require("./routes/launcher/changePassword");
const verificationEmailRouter = require('./routes/launcher/verificationEmail'); const verificationEmailRouter = require("./routes/launcher/verificationEmail");
const launcherUpdaterRouter = require('./routes/launcher/launcherUpdater'); const launcherUpdaterRouter = require("./routes/launcher/launcherUpdater");
const onlineCountRouter = require('./routes/onlineCount'); const onlineCountRouter = require("./routes/onlineCount");
// Set up rate limiter // Set up rate limiter
const limiter = rateLimit({ const limiter = rateLimit({
windowMs: 60 * 1000, // 1 minute windowMs: 60 * 1000, // 1 minute
max: 60, // limit each IP to 60 requests per minute max: 60, // limit each IP to 60 requests per minute
message: 'Too many requests from this IP, please try again later' message: "Too many requests from this IP, please try again later",
}); });
const app = express(); const app = express();
@ -42,103 +42,122 @@ const middleware = [
express.urlencoded({ extended: false }), express.urlencoded({ extended: false }),
]; ];
if (process.env.ENABLE_HELMET === 'true') { if (process.env.ENABLE_HELMET === "true") {
middleware.unshift(helmet()); middleware.unshift(helmet());
} }
app.use(...middleware); app.use(...middleware);
const port = process.env.PORT || 3000;
const publicIP = process.env.PUBLIC_IP || "0.0.0.0";
const authPort = process.env.AUTH_PORT || 8070; const authPort = process.env.AUTH_PORT || 8070;
const billingPort = process.env.BILLING_PORT || 8080; const billingPort = process.env.BILLING_PORT || 8080;
// Set up routes // Set up routes
app.use('/serverApi/auth', limiter, authRouter).listen(authPort, '127.0.0.1'); app.use("/serverApi/auth", limiter, authRouter).listen(authPort, publicIP);
app.use('/serverApi/billing', limiter , billingRouter).listen(billingPort, '127.0.0.1'); app
app.use('/serverApi/gateway', limiter , gatewayRouter); .use("/serverApi/billing", limiter, billingRouter)
app.use('/accountApi/register', limiter , registerRouter); .listen(billingPort, publicIP);
app.use('/accountApi/login', limiter , loginRouter); app.use("/serverApi/gateway", limiter, gatewayRouter);
app.use('/accountApi/codeVerification', limiter , codeVerificationRouter); app.use("/accountApi/register", limiter, registerRouter);
app.use('/accountApi/sendPasswordResetEmail', limiter , passwordResetEmailRouter); app.use("/accountApi/login", limiter, loginRouter);
app.use('/accountApi/changePassword', limiter , passwordChangeRouter); app.use("/accountApi/codeVerification", limiter, codeVerificationRouter);
app.use('/accountApi/sendVerificationEmail', limiter , verificationEmailRouter); app.use(
app.use('/launcherApi/launcherUpdater', launcherUpdaterRouter); "/accountApi/sendPasswordResetEmail",
app.use('/serverApi/onlineCount', limiter , onlineCountRouter); limiter,
passwordResetEmailRouter,
);
app.use("/accountApi/changePassword", limiter, passwordChangeRouter);
app.use("/accountApi/sendVerificationEmail", limiter, verificationEmailRouter);
app.use("/launcherApi/launcherUpdater", launcherUpdaterRouter);
app.use("/serverApi/onlineCount", limiter, onlineCountRouter);
// Serve static files from public folder // Serve static files from public folder
app.use(express.static('../public')); app.use(express.static("../public"));
// Serve static files for the launcher // Serve static files for the launcher
app.get('/launcher/news', (req, res) => { app.get("/launcher/news", (req, res) => {
res.sendFile(path.join(__dirname, '../public/launcher/news/news-panel.html')); res.sendFile(path.join(__dirname, "../public/launcher/news/news-panel.html"));
}); });
app.get('/launcher/agreement', (req, res) => { app.get("/launcher/agreement", (req, res) => {
res.sendFile(path.join(__dirname, '../public/launcher/news/agreement.html')); res.sendFile(path.join(__dirname, "../public/launcher/news/agreement.html"));
}); });
app.get('/favicon.ico', (req, res) => { app.get("/favicon.ico", (req, res) => {
res.sendFile(path.join(__dirname, '../public/launcher/news/favicon.ico')); res.sendFile(path.join(__dirname, "../public/launcher/news/favicon.ico"));
}); });
app.use('/launcher/news/images', express.static(path.join(__dirname, '../public/launcher/news/images'))); app.use(
app.use('/launcher/news', express.static(path.join(__dirname, '../public/launcher/news'))); "/launcher/news/images",
app.use('/launcher/patch', express.static(path.join(__dirname, '../public/launcher/patch'))); express.static(path.join(__dirname, "../public/launcher/news/images")),
app.use('/launcher/client', express.static(path.join(__dirname, '../public/launcher/client'))); );
app.use(
"/launcher/news",
express.static(path.join(__dirname, "../public/launcher/news")),
);
app.use(
"/launcher/patch",
express.static(path.join(__dirname, "../public/launcher/patch")),
);
app.use(
"/launcher/client",
express.static(path.join(__dirname, "../public/launcher/client")),
);
// Set up error handling middleware // Set up error handling middleware
app.use((err, req, res, next) => { app.use((err, req, res, next) => {
if (env.LOG_LEVEL && env.LOG_LEVEL === 'error') { if (env.LOG_LEVEL && env.LOG_LEVEL === "error") {
logger.error(err.stack); logger.error(err.stack);
} else { } else {
logger.info(err.stack); logger.info(err.stack);
} }
res.status(500).send('A error ocurred. Try again later.'); res.status(500).send("A error ocurred. Try again later.");
}); });
// Node.js version // Node.js version
const nodeVersion = process.version; const nodeVersion = process.version;
// timezone // timezone
const timezone = process.env.TZ || new Date().toLocaleString('en-US', { timeZoneName: 'short' }); const timezone =
process.env.TZ ||
new Date().toLocaleString("en-US", { timeZoneName: "short" });
const offsetInMinutes = moment.tz(timezone).utcOffset(); const offsetInMinutes = moment.tz(timezone).utcOffset();
const offsetHours = Math.floor(Math.abs(offsetInMinutes) / 60); const offsetHours = Math.floor(Math.abs(offsetInMinutes) / 60);
const offsetMinutes = Math.abs(offsetInMinutes) % 60; const offsetMinutes = Math.abs(offsetInMinutes) % 60;
const offsetSign = offsetInMinutes >= 0 ? '+' : '-'; const offsetSign = offsetInMinutes >= 0 ? "+" : "-";
const offsetString = `${offsetSign}${offsetHours.toString().padStart(2, '0')}:${offsetMinutes.toString().padStart(2, '0')}`; const offsetString = `${offsetSign}${offsetHours.toString().padStart(2, "0")}:${offsetMinutes.toString().padStart(2, "0")}`;
const memoryUsage = process.memoryUsage(); const memoryUsage = process.memoryUsage();
// Function to format bytes as human-readable string // Function to format bytes as human-readable string
function formatBytes(bytes) { function formatBytes(bytes) {
const units = ['B', 'KB', 'MB', 'GB', 'TB']; const units = ["B", "KB", "MB", "GB", "TB"];
if (bytes === 0) { if (bytes === 0) {
return '0 B'; return "0 B";
} }
const i = Math.floor(Math.log2(bytes) / 10); const i = Math.floor(Math.log2(bytes) / 10);
return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${units[i]}`; return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${units[i]}`;
} }
// Start server // Start server
const port = process.env.PORT || 3000;
const publicIP = process.env.PUBLIC_IP || '0.0.0.0';
console.log('--------------------------------------------------'); console.log("--------------------------------------------------");
console.log(`Rusty Hearts API Version: 1.2`) console.log(`Rusty Hearts API Version: 1.2`);
console.log(`Node.js Version: ${nodeVersion}`); console.log(`Node.js Version: ${nodeVersion}`);
console.log(`Timezone: ${timezone} (${offsetString})`); console.log(`Timezone: ${timezone} (${offsetString})`);
console.log('Memory Usage:'); console.log("Memory Usage:");
console.log(` RSS: ${formatBytes(memoryUsage.rss)}`); console.log(` RSS: ${formatBytes(memoryUsage.rss)}`);
console.log(` Heap Total: ${formatBytes(memoryUsage.heapTotal)}`); console.log(` Heap Total: ${formatBytes(memoryUsage.heapTotal)}`);
console.log(` Heap Used: ${formatBytes(memoryUsage.heapUsed)}`); console.log(` Heap Used: ${formatBytes(memoryUsage.heapUsed)}`);
console.log(` External: ${formatBytes(memoryUsage.external)}`); console.log(` External: ${formatBytes(memoryUsage.external)}`);
console.log(` Array Buffers: ${formatBytes(memoryUsage.arrayBuffers)}`); console.log(` Array Buffers: ${formatBytes(memoryUsage.arrayBuffers)}`);
console.log('--------------------------------------------------'); console.log("--------------------------------------------------");
// Function to log memory usage // Function to log memory usage
function logMemoryUsage() { function logMemoryUsage() {
const now = new Date(); const now = new Date();
const formattedDateTime = moment(now).format('YYYY-MM-DD HH:mm:ss'); const formattedDateTime = moment(now).format("YYYY-MM-DD HH:mm:ss");
const memoryUsage = process.memoryUsage(); const memoryUsage = process.memoryUsage();
@ -148,7 +167,7 @@ function logMemoryUsage() {
console.log(` Heap Used : ${formatBytes(memoryUsage.heapUsed)}`); console.log(` Heap Used : ${formatBytes(memoryUsage.heapUsed)}`);
console.log(` External : ${formatBytes(memoryUsage.external)}`); console.log(` External : ${formatBytes(memoryUsage.external)}`);
console.log(` Array Buffers: ${formatBytes(memoryUsage.arrayBuffers)}`); console.log(` Array Buffers: ${formatBytes(memoryUsage.arrayBuffers)}`);
console.log('--------------------------------------------------'); console.log("--------------------------------------------------");
} }
// Log memory usage every 30 minutes (1800000 milliseconds) // Log memory usage every 30 minutes (1800000 milliseconds)
@ -158,6 +177,6 @@ setInterval(logMemoryUsage, memoryLogInterval);
app.listen(port, publicIP, () => { app.listen(port, publicIP, () => {
logger.info(`API listening on ${publicIP}:${port}`); logger.info(`API listening on ${publicIP}:${port}`);
logger.info(`Auth API listening on 127.0.0.1:${authPort}`); logger.info(`Auth API listening on ${publicIP}:${authPort}`);
logger.info(`Billing API listening on 127.0.0.1:${billingPort}`); logger.info(`Billing API listening on ${publicIP}:${billingPort}`);
}); });