summary refs log tree commit diff
path: root/bundle/src
diff options
context:
space:
mode:
authoruurgothat <cckhmck@gmail.com>2021-10-24 18:13:51 +0300
committeruurgothat <cckhmck@gmail.com>2021-10-24 18:13:51 +0300
commitb603b81629a7775914dcb4eae53f418c3620dbdd (patch)
treeb13cc06dcf49ebe49ffff452758e3849baa0ca2f /bundle/src
parentFormat the file (diff)
parentMerge pull request #492 from fosscord/translation (diff)
downloadserver-b603b81629a7775914dcb4eae53f418c3620dbdd.tar.xz
Merge branch 'master' of https://github.com/fosscord/fosscord-server
Diffstat (limited to 'bundle/src')
-rw-r--r--bundle/src/Server.ts3
-rw-r--r--bundle/src/start.ts71
-rw-r--r--bundle/src/stats.ts35
3 files changed, 62 insertions, 47 deletions
diff --git a/bundle/src/Server.ts b/bundle/src/Server.ts

index d541735f..e461ec5f 100644 --- a/bundle/src/Server.ts +++ b/bundle/src/Server.ts
@@ -12,7 +12,7 @@ import { Config, initDatabase } from "@fosscord/util"; const app = express(); const server = http.createServer(); const port = Number(process.env.PORT) || 3001; -const production = false; +const production = process.env.NODE_ENV == "development" ? false : true; server.on("request", app); // @ts-ignore @@ -23,6 +23,7 @@ const cdn = new CDNServer({ server, port, production, app }); const gateway = new Gateway.Server({ server, port, production }); async function main() { + server.listen(port); await initDatabase(); await Config.init(); // only set endpointPublic, if not already set diff --git a/bundle/src/start.ts b/bundle/src/start.ts
index 8e7c3129..4445fde6 100644 --- a/bundle/src/start.ts +++ b/bundle/src/start.ts
@@ -1,6 +1,6 @@ // process.env.MONGOMS_DEBUG = "true"; import "reflect-metadata"; -import cluster from "cluster"; +import cluster, { Worker } from "cluster"; import os from "os"; import { red, bold, yellow, cyan } from "nanocolors"; import { initStats } from "./stats"; @@ -8,20 +8,21 @@ import { config } from "dotenv"; config(); import { execSync } from "child_process"; -// TODO: add tcp socket event transmission -const cores = 1 || Number(process.env.threads) || os.cpus().length; +// TODO: add socket event transmission +let cores = Number(process.env.THREADS) || os.cpus().length; -function getCommitOrFail() { - try { - return execSync("git rev-parse HEAD").toString().trim(); - } catch (e) { - return null; +if (cluster.isMaster) { + function getCommitOrFail() { + try { + return execSync("git rev-parse HEAD").toString().trim(); + } catch (e) { + return null; + } } -} -const commit = getCommitOrFail(); + const commit = getCommitOrFail(); -console.log( - bold(` + console.log( + bold(` ███████╗ ██████╗ ███████╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╔════╝██╔═══██╗██╔════╝██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔══██╗ █████╗ ██║ ██║███████╗███████╗██║ ██║ ██║██████╔╝██║ ██║ @@ -38,32 +39,44 @@ console.log( )} Current commit: ${ - commit !== null - ? `${cyan(commit)} (${yellow(commit.slice(0, 7))})` - : "Unknown (Git cannot be found)" - } + commit !== null + ? `${cyan(commit)} (${yellow(commit.slice(0, 7))})` + : "Unknown (Git cannot be found)" + } `) -); + ); -if (commit == null) - console.log(yellow(`Warning: Git is not installed or not in PATH.`)); + if (commit == null) { + console.log(yellow(`Warning: Git is not installed or not in PATH.`)); + } -if (cluster.isMaster && !process.env.masterStarted) { - process.env.masterStarted = "true"; + initStats(); - (async () => { - initStats(); + console.log(`[Process] starting with ${cores} threads`); - if (cores === 1) { - require("./Server"); - return; - } + if (cores === 1) { + require("./Server"); + } else { + process.env.EVENT_TRANSMISSION = "process"; // Fork workers. for (let i = 0; i < cores; i++) { - cluster.fork(); + // Delay each worker start if using sqlite database to prevent locking it + let delay = process.env.DATABASE?.includes("://") ? 0 : i * 1000; + setTimeout(() => { + cluster.fork(); + console.log(`[Process] worker ${i} started.`); + }, delay); } + cluster.on("message", (sender: Worker, message: any) => { + for (const id in cluster.workers) { + const worker = cluster.workers[id]; + if (worker === sender || !worker) continue; + worker.send(message); + } + }); + cluster.on("exit", (worker: any, code: any, signal: any) => { console.log( `[Worker] ${red( @@ -72,7 +85,7 @@ if (cluster.isMaster && !process.env.masterStarted) { ); cluster.fork(); }); - })(); + } } else { require("./Server"); } diff --git a/bundle/src/stats.ts b/bundle/src/stats.ts
index 7928de89..9bd9131e 100644 --- a/bundle/src/stats.ts +++ b/bundle/src/stats.ts
@@ -15,22 +15,23 @@ export function initStats() { ); } - setInterval(async () => { - const [cpuUsed, memory, network] = await Promise.all([ - osu.cpu.usage(), - osu.mem.info(), - osu.netstat.inOut(), - ]); - var networkUsage = ""; - if (typeof network === "object") { - networkUsage = `| [Network]: in ${network.total.inputMb}mb | out ${network.total.outputMb}mb`; - } + // TODO: node-os-utils might have a memory leak, more investigation needed + // TODO: doesn't work if spawned with multiple threads + // setInterval(async () => { + // const [cpuUsed, memory, network] = await Promise.all([ + // osu.cpu.usage(), + // osu.mem.info(), + // osu.netstat.inOut(), + // ]); + // var networkUsage = ""; + // if (typeof network === "object") { + // networkUsage = `| [Network]: in ${network.total.inputMb}mb | out ${network.total.outputMb}mb`; + // } - console.log( - `[CPU] ${cpuUsed.toPrecision(3)}% | [Memory] ${Math.round( - process.memoryUsage().rss / 1024 / 1024 - )}mb/${memory.totalMemMb.toFixed(0)}mb ${networkUsage}` - ); - // TODO: node-os-utils might have a memory leak, more investigation needed - }, 1000 * 60 * 5); + // console.log( + // `[CPU] ${cpuUsed.toPrecision(3)}% | [Memory] ${Math.round( + // process.memoryUsage().rss / 1024 / 1024 + // )}mb/${memory.totalMemMb.toFixed(0)}mb ${networkUsage}` + // ); + // }, 1000 * 60 * 5); }