From 56a5d0e7d233101cd2ea62dd16bce0b68561b22f Mon Sep 17 00:00:00 2001 From: Nasyarobby Putra Date: Sun, 16 Aug 2026 22:44:19 +0700 Subject: [PATCH] refactor: rename environment variables and update related configurations - Updated environment variable names from JERAPAH_FLOW_* to JFLOW_* for consistency and clarity. - Adjusted database path handling in knexfile.js to reflect the new variable naming. - Modified logging and retention days configurations to use the new variable names. - Ensured that the JWT secret and secrets key checks are aligned with the new naming convention. - Updated workflow test storage prefix to match the new project branding. This refactor enhances the clarity of environment variable usage and aligns with the project's rebranding efforts. --- README.md | 14 +++++++------- packages/server/knexfile.js | 6 +----- packages/server/logger.js | 2 +- packages/server/registry.js | 2 +- packages/server/runner.js | 9 ++++----- packages/server/secrets.js | 9 ++++----- packages/web/src/lib/workflow-test-storage.js | 2 +- 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 2786685..3a850ce 100644 --- a/README.md +++ b/README.md @@ -61,12 +61,12 @@ Optional `script.meta.reads = "ctx"` documents expression hosts. `meta.input` / | Variable | Default | Notes | |---|---|---| -| `JERAPAH_FLOW_JWT_SECRET` | `scrunner-dev-secret` (dev only) | **Required in production**. `SCRUNNER_JWT_SECRET` is still accepted. | -| `JERAPAH_FLOW_SECRETS_KEY` | `scrunner-dev-secrets-key` (dev only) | Master key for named secrets. **Required in production**. Changing it makes existing secrets unreadable. 64 hex chars are used as a raw AES-256 key; any other string is derived with scrypt. `SCRUNNER_SECRETS_KEY` is still accepted. | -| `JERAPAH_FLOW_DB_PATH` | `packages/server/data/jerapah-flow.db` (or existing `scrunner.db`) | SQLite file. `SCRUNNER_DB_PATH` is still accepted. | -| `JERAPAH_FLOW_LOG_LEVEL` | `debug` | Pino level | -| `JERAPAH_FLOW_RETENTION_DAYS` | `30` | Run history prune | -| `JERAPAH_FLOW_CORS_ORIGIN` | `http://localhost:5173` | Vite origin in dev | +| `JFLOW_JWT_SECRET` | `jflow-dev-secret` (dev only) | **Required in production**. | +| `JFLOW_SECRETS_KEY` | `jflow-dev-secrets-key` (dev only) | Master key for named secrets. **Required in production**. Changing it makes existing secrets unreadable. 64 hex chars are used as a raw AES-256 key; any other string is derived with scrypt. | +| `JFLOW_DB_PATH` | `packages/server/data/jerapah-flow.db` | SQLite file. | +| `JFLOW_LOG_LEVEL` | `debug` | Pino level | +| `JFLOW_RETENTION_DAYS` | `30` | Run history prune | +| `JFLOW_CORS_ORIGIN` | `http://localhost:5173` | Vite origin in dev | | `PORT` | `9000` | HTTP port | | `NODE_ENV` | — | Set `production` for secure cookies | @@ -75,7 +75,7 @@ Optional `script.meta.reads = "ctx"` documents expression hosts. `meta.input` / ```bash pnpm install pnpm build -JERAPAH_FLOW_JWT_SECRET=... JERAPAH_FLOW_SECRETS_KEY=... NODE_ENV=production pnpm start +JFLOW_JWT_SECRET=... JFLOW_SECRETS_KEY=... NODE_ENV=production pnpm start ``` The server serves `packages/web/dist` when that folder exists. diff --git a/packages/server/knexfile.js b/packages/server/knexfile.js index 495f345..2fbc39c 100644 --- a/packages/server/knexfile.js +++ b/packages/server/knexfile.js @@ -2,12 +2,8 @@ import fs from "fs"; import path from "path"; import { DATA_DIR, SERVER_ROOT } from "./paths.js"; -const defaultNew = path.join(DATA_DIR, "jerapah-flow.db"); -const defaultLegacy = path.join(DATA_DIR, "scrunner.db"); const dbPath = - process.env.JERAPAH_FLOW_DB_PATH ?? - process.env.SCRUNNER_DB_PATH ?? - (fs.existsSync(defaultLegacy) && !fs.existsSync(defaultNew) ? defaultLegacy : defaultNew); + process.env.JFLOW_DB_PATH ?? path.join(DATA_DIR, "jerapah-flow.db"); fs.mkdirSync(path.dirname(dbPath), { recursive: true }); /** @type {import("knex").Knex.Config} */ diff --git a/packages/server/logger.js b/packages/server/logger.js index 2cf80b6..ce3b023 100644 --- a/packages/server/logger.js +++ b/packages/server/logger.js @@ -113,7 +113,7 @@ const rollingFile = pino.transport({ }); export const log = pino( - { level: process.env.JERAPAH_FLOW_LOG_LEVEL ?? process.env.SCRUNNER_LOG_LEVEL ?? "debug" }, + { level: process.env.JFLOW_LOG_LEVEL ?? "debug" }, pino.multistream([ { level: "debug", stream: redactStream(process.stdout) }, { level: "debug", stream: redactStream(rollingFile) }, diff --git a/packages/server/registry.js b/packages/server/registry.js index f4d56ff..6a76d3e 100644 --- a/packages/server/registry.js +++ b/packages/server/registry.js @@ -323,7 +323,7 @@ export function createRegistry(server) { pruneTask.destroy(); pruneTask = null; } - const days = Number(process.env.JERAPAH_FLOW_RETENTION_DAYS ?? process.env.SCRUNNER_RETENTION_DAYS ?? 30); + const days = Number(process.env.JFLOW_RETENTION_DAYS ?? 30); pruneTask = cron.schedule( "0 0 * * *", async () => { diff --git a/packages/server/runner.js b/packages/server/runner.js index c0a610b..87ca3c3 100644 --- a/packages/server/runner.js +++ b/packages/server/runner.js @@ -27,12 +27,11 @@ await migrate(); enableLogPersistence(); const jwtSecret = - process.env.JERAPAH_FLOW_JWT_SECRET ?? - process.env.SCRUNNER_JWT_SECRET ?? - (process.env.NODE_ENV === "production" ? "" : "scrunner-dev-secret"); + process.env.JFLOW_JWT_SECRET ?? + (process.env.NODE_ENV === "production" ? "" : "jflow-dev-secret"); if (!jwtSecret) { - log.error("JERAPAH_FLOW_JWT_SECRET is required in production"); + log.error("JFLOW_JWT_SECRET is required in production"); process.exit(1); } @@ -54,7 +53,7 @@ await server.register(jwt, { }, }); await server.register(cors, { - origin: process.env.JERAPAH_FLOW_CORS_ORIGIN ?? process.env.SCRUNNER_CORS_ORIGIN ?? "http://localhost:5173", + origin: process.env.JFLOW_CORS_ORIGIN ?? "http://localhost:5173", credentials: true, }); diff --git a/packages/server/secrets.js b/packages/server/secrets.js index 45da609..4a8492d 100644 --- a/packages/server/secrets.js +++ b/packages/server/secrets.js @@ -1,7 +1,7 @@ import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from "node:crypto"; -const DEV_DEFAULT = "scrunner-dev-secrets-key"; -const SCRYPT_SALT = Buffer.from("scrunner-secrets-v1"); +const DEV_DEFAULT = "jflow-dev-secrets-key"; +const SCRYPT_SALT = Buffer.from("jflow-secrets-v1"); const KEY_LEN = 32; const IV_LEN = 12; const AUTH_TAG_LEN = 16; @@ -11,11 +11,10 @@ const AUTH_TAG_LEN = 16; */ export function resolveSecretsKeyMaterial() { const raw = - process.env.JERAPAH_FLOW_SECRETS_KEY ?? - process.env.SCRUNNER_SECRETS_KEY ?? + process.env.JFLOW_SECRETS_KEY ?? (process.env.NODE_ENV === "production" ? "" : DEV_DEFAULT); if (!raw) { - throw new Error("JERAPAH_FLOW_SECRETS_KEY is required in production"); + throw new Error("JFLOW_SECRETS_KEY is required in production"); } return raw; } diff --git a/packages/web/src/lib/workflow-test-storage.js b/packages/web/src/lib/workflow-test-storage.js index 5b2a6d2..06d1c44 100644 --- a/packages/web/src/lib/workflow-test-storage.js +++ b/packages/web/src/lib/workflow-test-storage.js @@ -1,4 +1,4 @@ -const PREFIX = "scrunner.workflowTestData:"; +const PREFIX = "jerapah-flow.workflowTestData:"; export function workflowTestStorageKey(owner, file) { return `${PREFIX}${owner}/${file}`;