diff --git a/backend/package.json b/backend/package.json index 0fe80447..faab7570 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,14 +8,14 @@ "watch-yaml-parse-test": "cross-env NODE_ENV=development tsc-watch --onSuccess \"node dist/backend/src/yamlParseTest.js\"", "build": "rimraf dist && tsc", "start-bot-dev": "cross-env NODE_ENV=development node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/backend/src/index.js", - "start-bot-dev-debug": "NODE_ENV=development clinic heapprofiler --collect-only --dest .clinic-bot -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/backend/src/index.js", + "start-bot-dev-debug": "NODE_ENV=development DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/backend/src/index.js", "start-bot-prod": "cross-env NODE_ENV=production node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/index.js", - "start-bot-prod-debug": "NODE_ENV=production clinic heapprofiler --collect-only --dest .clinic-bot -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/index.js", + "start-bot-prod-debug": "NODE_ENV=production DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/index.js", "watch-bot": "cross-env NODE_ENV=development tsc-watch --onSuccess \"npm run start-bot-dev\"", "start-api-dev": "cross-env NODE_ENV=development node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/backend/src/api/index.js", - "start-api-dev-debug": "NODE_ENV=development clinic heapprofiler --collect-only --dest .clinic-api -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/backend/src/api/index.js", + "start-api-dev-debug": "NODE_ENV=development DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/backend/src/api/index.js", "start-api-prod": "cross-env NODE_ENV=production node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/api/index.js", - "start-api-prod-debug": "NODE_ENV=production clinic heapprofiler --collect-only --dest .clinic-api -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/api/index.js", + "start-api-prod-debug": "NODE_ENV=production DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node -r ./register-tsconfig-paths.js --unhandled-rejections=strict --enable-source-maps --stack-trace-limit=30 dist/backend/src/api/index.js", "watch-api": "cross-env NODE_ENV=development tsc-watch --onSuccess \"npm run start-api-dev\"", "typeorm": "node -r ./register-tsconfig-paths.js ./node_modules/typeorm/cli.js", "migrate-prod": "cross-env NODE_ENV=production npm run typeorm -- migration:run", diff --git a/backend/src/env.ts b/backend/src/env.ts index 3d98506d..0a65e3a4 100644 --- a/backend/src/env.ts +++ b/backend/src/env.ts @@ -50,6 +50,11 @@ const envType = z.object({ DB_USER: z.string().optional().default("zeppelin"), DB_PASSWORD: z.string().optional(), // Default is set to DOCKER_MYSQL_PASSWORD further below DB_DATABASE: z.string().optional().default("zeppelin"), + + DEBUG: z + .string() + .optional() + .transform((str) => str === "true"), }); let toValidate = { ...process.env }; diff --git a/backend/src/index.ts b/backend/src/index.ts index 468b4a0f..73d99470 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -197,6 +197,10 @@ setInterval(() => { avgCount = 0; }, 5 * 60 * 1000); +if (env.DEBUG) { + logger.info("NOTE: Bot started in DEBUG mode"); +} + logger.info("Connecting to database"); connect().then(async (connection) => { const client = new Client({ @@ -429,27 +433,30 @@ connect().then(async (connection) => { logger.info("Logging in..."); await client.login(env.BOT_TOKEN); - let stopping = false; - const cleanupAndStop = async (code) => { - if (stopping) { - return; - } - stopping = true; - logger.info("Cleaning up before exit..."); - // Force exit after 10sec - setTimeout(() => process.exit(code), 10 * SECONDS); - await bot.stop(); - await connection.close(); - logger.info("Done! Exiting now."); - process.exit(code); - }; - process.on("beforeExit", () => cleanupAndStop(0)); - process.on("SIGINT", () => { - logger.info("Received SIGINT, exiting..."); - cleanupAndStop(0); - }); - process.on("SIGTERM", () => { - logger.info("Received SIGTERM, exiting..."); - cleanupAndStop(0); - }); + // Don't intercept any signals in DEBUG mode: https://github.com/clinicjs/node-clinic/issues/444#issuecomment-1474997090 + if (!env.DEBUG) { + let stopping = false; + const cleanupAndStop = async (code) => { + if (stopping) { + return; + } + stopping = true; + logger.info("Cleaning up before exit..."); + // Force exit after 10sec + setTimeout(() => process.exit(code), 10 * SECONDS); + await bot.stop(); + await connection.close(); + logger.info("Done! Exiting now."); + process.exit(code); + }; + process.on("beforeExit", () => cleanupAndStop(0)); + process.on("SIGINT", () => { + logger.info("Received SIGINT, exiting..."); + cleanupAndStop(0); + }); + process.on("SIGTERM", () => { + logger.info("Received SIGTERM, exiting..."); + cleanupAndStop(0); + }); + } }); diff --git a/backend/src/threadsSignalFix.ts b/backend/src/threadsSignalFix.ts index 655d960b..86f53067 100644 --- a/backend/src/threadsSignalFix.ts +++ b/backend/src/threadsSignalFix.ts @@ -6,5 +6,8 @@ * - This is imported as early as possible to avoid removing our own signal handlers */ import "threads"; -process.removeAllListeners("SIGINT"); -process.removeAllListeners("SIGTERM"); +import { env } from "./env"; +if (!env.DEBUG) { + process.removeAllListeners("SIGINT"); + process.removeAllListeners("SIGTERM"); +} diff --git a/docker/production/start-bot.sh b/docker/production/start-bot.sh index 37e34d11..f0213cb9 100644 --- a/docker/production/start-bot.sh +++ b/docker/production/start-bot.sh @@ -4,7 +4,7 @@ # Exec is used to forward signals: https://unix.stackexchange.com/a/196053 cd /zeppelin/backend -if [ -n "$DEBUG" ]; then +if [ "$DEBUG" == "true" ]; then echo "DEBUG MODE: Starting bot container without starting the bot" exec tail -f /dev/null else