From 0382f813a8ca4421891d258fb1df83756740f386 Mon Sep 17 00:00:00 2001 From: Walusimbi Silver Date: Tue, 17 Mar 2026 13:02:20 +0300 Subject: [PATCH] Configuration loader and Bull queue initialization --- src/config/index.js | 29 +++++++++++++++++++++++++++++ src/config/queue.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/config/index.js create mode 100644 src/config/queue.js diff --git a/src/config/index.js b/src/config/index.js new file mode 100644 index 0000000..6182835 --- /dev/null +++ b/src/config/index.js @@ -0,0 +1,29 @@ +const path = require("path"); +require("dotenv").config({ path: path.resolve(__dirname, "../../.env") }); + +module.exports = { + port: parseInt(process.env.PORT || "5100"), + host: process.env.HOST || "0.0.0.0", + + redis: { + host: process.env.REDIS_HOST || "127.0.0.1", + port: parseInt(process.env.REDIS_PORT || "6379"), + password: process.env.REDIS_PASSWORD || undefined, + db: parseInt(process.env.REDIS_DB || "2"), + }, + + storage: { + uploadDir: path.resolve(process.env.UPLOAD_DIR || "./uploads"), + outputDir: path.resolve(process.env.OUTPUT_DIR || "./processed"), + maxFileSize: parseInt(process.env.MAX_FILE_SIZE || "20971520"), // 20MB + }, + + worker: { + concurrency: parseInt(process.env.CONCURRENCY || "2"), + }, + + bullBoard: { + user: process.env.BULL_BOARD_USER || "admin", + pass: process.env.BULL_BOARD_PASS || "changeme", + }, +}; diff --git a/src/config/queue.js b/src/config/queue.js new file mode 100644 index 0000000..8738ecb --- /dev/null +++ b/src/config/queue.js @@ -0,0 +1,28 @@ +const Bull = require("bull"); +const config = require("./index"); + +/** + * One queue, multiple job types. + * Bull stores everything in Redis db 2 under the "imgforge:" prefix. + * Job types: resize, convert, compress, watermark, strip-meta, pipeline + */ +const imageQueue = new Bull("imgforge", { + redis: { + host: config.redis.host, + port: config.redis.port, + password: config.redis.password, + db: config.redis.db, + }, + defaultJobOptions: { + attempts: 3, + backoff: { type: "exponential", delay: 2000 }, + removeOnComplete: { age: 3600 * 24 }, // keep completed jobs 24h + removeOnFail: { age: 3600 * 72 }, // keep failed jobs 72h + }, +}); + +imageQueue.on("error", (err) => { + console.error("[Queue] Redis connection error:", err.message); +}); + +module.exports = imageQueue;