diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 5d20f1cff..349a41754 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -1,4 +1,5 @@ import { CronJob } from "cron"; +import { Redis } from "ioredis"; import { Knex } from "knex"; import { z } from "zod"; @@ -71,6 +72,7 @@ import { trustedIpDALFactory } from "@app/ee/services/trusted-ip/trusted-ip-dal" import { trustedIpServiceFactory } from "@app/ee/services/trusted-ip/trusted-ip-service"; import { TKeyStoreFactory } from "@app/keystore/keystore"; import { getConfig } from "@app/lib/config/env"; +import { logger } from "@app/lib/logger"; import { TQueueServiceFactory } from "@app/queue"; import { readLimit } from "@app/server/config/rateLimiter"; import { accessTokenQueueServiceFactory } from "@app/services/access-token-queue/access-token-queue"; @@ -1257,7 +1259,7 @@ export const registerRoutes = async ( response: { 200: z.object({ date: z.date(), - message: z.literal("Ok"), + message: z.string().optional(), emailConfigured: z.boolean().optional(), inviteOnlySignup: z.boolean().optional(), redisConfigured: z.boolean().optional(), @@ -1266,12 +1268,37 @@ export const registerRoutes = async ( }) } }, - handler: async () => { + handler: async (request, reply) => { const cfg = getConfig(); const serverCfg = await getServerCfg(); + + try { + await db.raw("SELECT NOW()"); + } catch (err) { + logger.error("Health check: database connection failed", err); + return reply.code(503).send({ + date: new Date(), + message: "Service unavailable" + }); + } + + if (cfg.isRedisConfigured) { + const redis = new Redis(cfg.REDIS_URL); + try { + await redis.ping(); + redis.disconnect(); + } catch (err) { + logger.error("Health check: redis connection failed", err); + return reply.code(503).send({ + date: new Date(), + message: "Service unavailable" + }); + } + } + return { date: new Date(), - message: "Ok" as const, + message: "Ok", emailConfigured: cfg.isSmtpConfigured, inviteOnlySignup: Boolean(serverCfg.allowSignUp), redisConfigured: cfg.isRedisConfigured,