From 5365df47df77239e780d300a820b41d766959df7 Mon Sep 17 00:00:00 2001 From: Georgios Jason Efstathiou Date: Tue, 9 Sep 2025 10:22:08 +0200 Subject: [PATCH 1/5] support ipv6 redis --- src/common/application/launchQueueDashboard.ts | 3 +-- src/common/infrastructure/redis.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common/application/launchQueueDashboard.ts b/src/common/application/launchQueueDashboard.ts index 3d19285..5f567a9 100644 --- a/src/common/application/launchQueueDashboard.ts +++ b/src/common/application/launchQueueDashboard.ts @@ -1,12 +1,11 @@ import express, {Router} from 'express'; import Arena from 'bull-arena'; import BeeQueue from 'bee-queue'; -import Redis from 'ioredis'; import {RequestHandler} from 'express'; import {config} from '../../config/configLoader'; +import redis from '../infrastructure/redis'; let arenaRouter: Router | null = null; -const redis = new Redis(config.redisConnectionString); export const getQueuesFromRedis = async (): Promise< { diff --git a/src/common/infrastructure/redis.ts b/src/common/infrastructure/redis.ts index bb9e93a..4d8dc01 100644 --- a/src/common/infrastructure/redis.ts +++ b/src/common/infrastructure/redis.ts @@ -2,7 +2,7 @@ import Redis from 'ioredis'; import {config} from '../../config/configLoader'; import {logger} from './logger'; -const redis = new Redis(config.redisConnectionString); +const redis = new Redis(config.redisConnectionString + "?family=0"); redis.on('error', (error: Error) => { logger.error('Redis connection error:', error); From 9d835927fa0b6394149bd286c7e92b19629129d1 Mon Sep 17 00:00:00 2001 From: Georgios Jason Efstathiou Date: Tue, 9 Sep 2025 10:37:01 +0200 Subject: [PATCH 2/5] more --- src/config/configLoader.ts | 1 + src/config/configSchema.ts | 1 + src/features/deployEcosystem/application/createQueue.ts | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/config/configLoader.ts b/src/config/configLoader.ts index 8489ba9..9a5466e 100644 --- a/src/config/configLoader.ts +++ b/src/config/configLoader.ts @@ -16,6 +16,7 @@ function loadConfig(): Config { filename: process.env.LOG_FILE, }, redisConnectionString: process.env.REDIS_CONNECTION_STRING, + redisUseIpv6: process.env.REDIS_USE_IPV6 === 'true', rpc: process.env.RPC_CONFIG ? rpcConfigSchema.parse(JSON.parse(process.env.RPC_CONFIG)) : undefined, diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts index 954ecbd..b9275e3 100644 --- a/src/config/configSchema.ts +++ b/src/config/configSchema.ts @@ -28,6 +28,7 @@ export const configSchema = z.object({ databaseConnectionString: z.string(), logger: loggingConfigSchema, redisConnectionString: z.string(), + redisUseIpv6: z.boolean().default(false), gitHubToken: z.string(), rpc: rpcConfigSchema, walletPrivateKey: z.string(), diff --git a/src/features/deployEcosystem/application/createQueue.ts b/src/features/deployEcosystem/application/createQueue.ts index 281ff13..481208d 100644 --- a/src/features/deployEcosystem/application/createQueue.ts +++ b/src/features/deployEcosystem/application/createQueue.ts @@ -13,7 +13,10 @@ export default function createQueue(ecosystemId: UUID, chainId: string) { removeOnFailure: true, removeOnSuccess: true, activateDelayedJobs: true, - redis: {url: config.redisConnectionString}, + redis: { + url: config.redisConnectionString, + family: config.redisUseIpv6 ? 'IPv6' : undefined, + }, }); logger.info( From 1eb911535883769a999e29bbddd0931937dc0627 Mon Sep 17 00:00:00 2001 From: Georgios Jason Efstathiou Date: Tue, 9 Sep 2025 10:46:14 +0200 Subject: [PATCH 3/5] add health endpoint --- src/app.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/app.ts b/src/app.ts index ecf7ecb..72b2c33 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,8 @@ import {getEcosystemsRouter} from './features/getEcosystems/getEcosystemsRouter' import {getEcosystemByIdRouter} from './features/getEcosystemById/getEcosystemByIdRouter'; import {errorHandler} from './common/infrastructure/errorHandler'; import {deployEcosystemRouter} from './features/deployEcosystem/api/deployEcosystemRouter'; +import redis from './common/infrastructure/redis'; +import { dataSource } from './common/infrastructure/datasource'; export const app = express(); @@ -27,3 +29,18 @@ app.use('/api', getEcosystemsRouter); app.use('/api', getEcosystemByIdRouter); app.use('/api', deployEcosystemRouter); app.use(errorHandler); + +app.get('/health', async (_, res) => { + const redisHealthy = (await redis.ping()) === 'PONG'; + const dbHealthy = dataSource.isInitialized; + + if (redisHealthy && dbHealthy) { + res.status(200).send('OK'); + } else { + res.status(500).json({ + message: 'Unhealthy', + redis: redisHealthy ? 'healthy' : 'unhealthy', + database: dbHealthy ? 'healthy' : 'unhealthy', + }); + } +}); From f6acc1fe16bdd4d7d32ea6d758eafa91bfb7c285 Mon Sep 17 00:00:00 2001 From: Georgios Jason Efstathiou Date: Tue, 9 Sep 2025 10:49:43 +0200 Subject: [PATCH 4/5] move health in front of auth --- src/app.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app.ts b/src/app.ts index 72b2c33..fd34934 100644 --- a/src/app.ts +++ b/src/app.ts @@ -22,14 +22,6 @@ const authenticateApiKey = ( } }; -app.use(authenticateApiKey); -app.use(express.json({limit: '50mb'})); -app.use('/api', createEcosystemRouter); -app.use('/api', getEcosystemsRouter); -app.use('/api', getEcosystemByIdRouter); -app.use('/api', deployEcosystemRouter); -app.use(errorHandler); - app.get('/health', async (_, res) => { const redisHealthy = (await redis.ping()) === 'PONG'; const dbHealthy = dataSource.isInitialized; @@ -44,3 +36,11 @@ app.get('/health', async (_, res) => { }); } }); + +app.use(authenticateApiKey); +app.use(express.json({limit: '50mb'})); +app.use('/api', createEcosystemRouter); +app.use('/api', getEcosystemsRouter); +app.use('/api', getEcosystemByIdRouter); +app.use('/api', deployEcosystemRouter); +app.use(errorHandler); From d772db622851eac3201298817da762d08b752ea1 Mon Sep 17 00:00:00 2001 From: Georgios Jason Efstathiou Date: Tue, 9 Sep 2025 12:14:49 +0200 Subject: [PATCH 5/5] try this --- .../createEcosystem/application/createEcosystemHandler.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/features/createEcosystem/application/createEcosystemHandler.ts b/src/features/createEcosystem/application/createEcosystemHandler.ts index f1d85d8..8d54b24 100644 --- a/src/features/createEcosystem/application/createEcosystemHandler.ts +++ b/src/features/createEcosystem/application/createEcosystemHandler.ts @@ -26,7 +26,10 @@ export const handleCreateEcosystem = async ( removeOnFailure: true, removeOnSuccess: true, activateDelayedJobs: true, - redis: {url: config.redisConnectionString}, + redis: { + url: config.redisConnectionString, + family: config.redisUseIpv6 ? 'IPv6' : undefined, + }, }); logger.info( `Created project verification queue '${queueKey}' for ecosystem '${ecosystemId}'.`,