diff --git a/backend/package.json b/backend/package.json index e81c0d0e..744cc320 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,28 +4,28 @@ "description": "", "private": true, "scripts": { - "watch": "NODE_ENV=development HOST_MODE=development tsc-watch --build --onSuccess \"node start-dev.js\"", - "watch-yaml-parse-test": "NODE_ENV=development HOST_MODE=development tsc-watch --build --onSuccess \"node dist/yamlParseTest.js\"", + "watch": "tsc-watch --build --onSuccess \"node start-dev.js\"", + "watch-yaml-parse-test": "tsc-watch --build --onSuccess \"node dist/yamlParseTest.js\"", "build": "tsc --build", - "start-bot-dev": "NODE_ENV=development HOST_MODE=development node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", - "start-bot-dev-debug": "NODE_ENV=development DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", - "start-bot-prod": "cross-env NODE_ENV=production node --enable-source-maps --stack-trace-limit=30 dist/index.js", - "start-bot-prod-debug": "NODE_ENV=production DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 dist/index.js", - "watch-bot": "NODE_ENV=development HOST_MODE=development tsc-watch --build --onSuccess \"npm run start-bot-dev\"", - "start-api-dev": "NODE_ENV=development HOST_MODE=development node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", - "start-api-dev-debug": "NODE_ENV=development DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", - "start-api-prod": "cross-env NODE_ENV=production node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", - "start-api-prod-debug": "NODE_ENV=production DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", - "watch-api": "NODE_ENV=development HOST_MODE=development tsc-watch --build --onSuccess \"npm run start-api-dev\"", + "start-bot-dev": "node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", + "start-bot-dev-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9229 dist/index.js", + "start-bot-prod": "node --enable-source-maps --stack-trace-limit=30 dist/index.js", + "start-bot-prod-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-bot -- node --enable-source-maps --stack-trace-limit=30 dist/index.js", + "watch-bot": "tsc-watch --build --onSuccess \"npm run start-bot-dev\"", + "start-api-dev": "node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", + "start-api-dev-debug": "DEBUG=true clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 --inspect=0.0.0.0:9239 dist/api/index.js", + "start-api-prod": "node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", + "start-api-prod-debug": "clinic heapprofiler --collect-only --dest .clinic-api -- node --enable-source-maps --stack-trace-limit=30 dist/api/index.js", + "watch-api": "tsc-watch --build --onSuccess \"npm run start-api-dev\"", "typeorm": "node ../node_modules/typeorm/cli.js", "migrate": "npm run typeorm -- migration:run -d dist/data/dataSource.js", - "migrate-prod": "NODE_ENV=production npm run migrate", - "migrate-dev": "(export NODE_ENV=development; export HOST_MODE=development; npm run build && npm run migrate)", + "migrate-prod": "npm run migrate", + "migrate-dev": "npm run build && npm run migrate", "migrate-rollback": "npm run typeorm -- migration:revert -d dist/data/dataSource.js", - "migrate-rollback-prod": "NODE_ENV=production npm run migrate-rollback", - "migrate-rollback-dev": "(export NODE_ENV=development; export HOST_MODE=development; npm run build && npm run migrate-rollback)", - "validate-active-configs": "NODE_ENV=development HOST_MODE=development node --enable-source-maps dist/validateActiveConfigs.js > ../config-errors.txt", - "export-config-json-schema": "NODE_ENV=development HOST_MODE=development node --enable-source-maps dist/exportSchemas.js > ../config-schema.json", + "migrate-rollback-prod": "npm run migrate-rollback", + "migrate-rollback-dev": "npm run build && npm run migrate-rollback", + "validate-active-configs": "node --enable-source-maps dist/validateActiveConfigs.js > ../config-errors.txt", + "export-config-json-schema": "node --enable-source-maps dist/exportSchemas.js > ../config-schema.json", "test": "npm run build && npm run run-tests", "run-tests": "ava", "test-watch": "tsc-watch --build --onSuccess \"npx ava\"" diff --git a/backend/src/api/start.ts b/backend/src/api/start.ts index 2e18dbf1..40f5a0bd 100644 --- a/backend/src/api/start.ts +++ b/backend/src/api/start.ts @@ -10,7 +10,7 @@ import { initGuildsAPI } from "./guilds/index"; import { clientError, error, notFound } from "./responses"; import { startBackgroundTasks } from "./tasks"; -const apiPathPrefix = env.HOST_MODE === "lightweight" ? env.LIGHTWEIGHT_API_PATH_PREFIX || "" : "/api"; +const apiPathPrefix = env.NODE_ENV === "production" ? env.API_PATH_PREFIX ?? "" : "/api"; const app = express(); diff --git a/backend/src/data/dataSource.ts b/backend/src/data/dataSource.ts index e4d8df1b..82929556 100644 --- a/backend/src/data/dataSource.ts +++ b/backend/src/data/dataSource.ts @@ -11,34 +11,22 @@ const entities = path.relative(process.cwd(), path.resolve(backendDir, "dist/dat const migrations = path.relative(process.cwd(), path.resolve(backendDir, "dist/migrations/*.js")); type DbOpts = Pick; -let dbOpts: DbOpts; -if (env.HOST_MODE === "development") { - dbOpts = { - host: "mysql", - port: 3306, - username: "zeppelin", - password: env.DEVELOPMENT_MYSQL_PASSWORD, - database: "zeppelin", - }; -} else if (env.HOST_MODE === "standalone") { - dbOpts = { - host: "mysql", - port: 3306, - username: "zeppelin", - password: env.STANDALONE_MYSQL_PASSWORD, - database: "zeppelin", - }; -} else if (env.HOST_MODE === "lightweight") { - dbOpts = { - host: env.LIGHTWEIGHT_DB_HOST, - port: env.LIGHTWEIGHT_DB_PORT, - username: env.LIGHTWEIGHT_DB_USER, - password: env.LIGHTWEIGHT_DB_PASSWORD, - database: env.LIGHTWEIGHT_DB_DATABASE, - }; -} else { - throw new Error(`Unknown host mode: ${env.HOST_MODE}`); -} +const dbOpts: DbOpts = + env.NODE_ENV === "production" + ? { + host: env.DB_HOST, + port: env.DB_PORT, + username: env.DB_USER, + password: env.DB_PASSWORD, + database: env.DB_DATABASE, + } + : { + host: "mysql", + port: 3306, + username: "zeppelin", + password: env.DEVELOPMENT_MYSQL_PASSWORD, + database: "zeppelin", + }; export const dataSource = new DataSource({ type: "mysql", diff --git a/backend/src/env.ts b/backend/src/env.ts index 33d6e310..f04e2cd5 100644 --- a/backend/src/env.ts +++ b/backend/src/env.ts @@ -38,22 +38,22 @@ const envType = z.object({ PHISHERMAN_API_KEY: z.string().optional(), - DEVELOPMENT_MYSQL_PASSWORD: z.string().optional(), // Included here for the DB_PASSWORD default in development - STANDALONE_MYSQL_PASSWORD: z.string().optional(), // Included here for the DB_PASSWORD default in production + DB_HOST: z.string().optional(), + DB_PORT: z.preprocess((v) => Number(v), z.number()).optional(), + DB_USER: z.string().optional(), + DB_PASSWORD: z.string().optional(), + DB_DATABASE: z.string().optional(), - LIGHTWEIGHT_DB_HOST: z.string().optional(), - LIGHTWEIGHT_DB_PORT: z.preprocess((v) => Number(v), z.number()).optional(), - LIGHTWEIGHT_DB_USER: z.string().optional(), - LIGHTWEIGHT_DB_PASSWORD: z.string().optional(), - LIGHTWEIGHT_DB_DATABASE: z.string().optional(), + DEVELOPMENT_MYSQL_PASSWORD: z.string().optional(), - LIGHTWEIGHT_API_PATH_PREFIX: z.string().optional(), + API_PATH_PREFIX: z.string().optional(), - HOST_MODE: z.enum(["development", "standalone", "lightweight"]).optional().default("lightweight"), DEBUG: z .string() .optional() .transform((str) => str === "true"), + + NODE_ENV: z.string().default("development"), }); let toValidate = { ...process.env }; diff --git a/docker-compose.lightweight.yml b/docker-compose.lightweight.yml index 255845aa..db830ca7 100644 --- a/docker-compose.lightweight.yml +++ b/docker-compose.lightweight.yml @@ -7,8 +7,14 @@ services: args: # Used at compile-time by dashboard API_URL: - environment: - HOST_MODE: lightweight + environment: &env + - NODE_ENV=production + - DB_HOST=${LIGHTWEIGHT_DB_HOST} + - DB_PORT=${LIGHTWEIGHT_DB_PORT} + - DB_USER=${LIGHTWEIGHT_DB_USER} + - DB_PASSWORD=${LIGHTWEIGHT_DB_PASSWORD} + - DB_DATABASE=${LIGHTWEIGHT_DB_DATABASE} + - API_PATH_PREFIX=${LIGHTWEIGHT_API_PATH_PREFIX} env_file: - .env working_dir: /zeppelin/backend @@ -20,8 +26,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: lightweight + environment: *env env_file: - .env ports: @@ -35,8 +40,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: lightweight + environment: *env env_file: - .env working_dir: /zeppelin/backend @@ -48,8 +52,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: lightweight + environment: *env env_file: - .env ports: diff --git a/docker-compose.standalone.yml b/docker-compose.standalone.yml index 47434725..5dc242e6 100644 --- a/docker-compose.standalone.yml +++ b/docker-compose.standalone.yml @@ -42,8 +42,14 @@ services: args: # Used at compile-time by dashboard API_URL: - environment: - HOST_MODE: standalone + environment: &env + - NODE_ENV=production + - DB_HOST=mysql + - DB_PORT=3306 + - DB_USER=zeppelin + - DB_PASSWORD=${STANDALONE_MYSQL_PASSWORD} + - DB_DATABASE=zeppelin + - API_PATH_PREFIX=/api env_file: - .env working_dir: /zeppelin/backend @@ -55,8 +61,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: standalone + environment: *env env_file: - .env working_dir: /zeppelin/backend @@ -68,8 +73,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: standalone + environment: *env env_file: - .env working_dir: /zeppelin/backend @@ -81,8 +85,7 @@ services: condition: service_completed_successfully build: *build restart: on-failure - environment: - HOST_MODE: standalone + environment: *env env_file: - .env working_dir: /zeppelin/dashboard