chore(backend): Caching envvars

This commit is contained in:
Tibo De Peuter 2025-05-08 23:34:33 +02:00
parent a59417b8f5
commit 207df530b9
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
5 changed files with 66 additions and 1 deletions

View file

@ -66,3 +66,10 @@ DWENGO_AUTH_TEACHER_JWKS_ENDPOINT=http://hostname/realms/teacher/protocol/openid
# The address of the Loki instance, a log aggregation system.
# If running your stack in docker, this should use the docker service name.
#DWENGO_LOGGING_LOKI_HOST=http://localhost:3102
# The hostname or IP address of the Redis cache.
# If running your stack in docker, this should use the docker service name.
#DWENGO_CACHE_HOST=localhost
#DWENGO_CACHE_PORT=6379
#DWENGO_CACHE_TTL=3600
#DWENGO_CACHE_KEY_PREFIX=dwengo

View file

@ -35,3 +35,7 @@ DWENGO_AUTH_TEACHER_JWKS_ENDPOINT=http://idp:7080/idp/realms/teacher/protocol/op
DWENGO_LOGGING_LEVEL=info
DWENGO_LOGGING_LOKI_HOST=http://logging:3102
DWENGO_CACHE_HOST=cache
#DWENGO_CACHE_PORT=6379
DWENGO_CACHE_TTL=604800

View file

@ -1,4 +1,6 @@
PORT=3000
DWENGO_RUN_MODE=staging
DWENGO_DB_HOST=db
DWENGO_DB_PORT=5432
DWENGO_DB_USERNAME=postgres
@ -18,4 +20,8 @@ DWENGO_CORS_ALLOWED_ORIGINS=http://localhost/*,http://idp:7080,https://idp:7080
# Logging and monitoring
LOKI_HOST=http://logging:3102
DWENGO_LOGGING_LEVEL=debug
DWENGO_LOGGING_LOKI_HOST=http://logging:3102
DWENGO_CACHE_HOST=caching
DWENGO_CACHE_TTL=86400

42
backend/src/caching.ts Normal file
View file

@ -0,0 +1,42 @@
import { createClient, RedisClientType } from 'redis';
import { getLogger } from './logging/initalize.js';
import { envVars, getEnvVar } from './util/envVars.js';
export type CacheClient = RedisClientType;
let redisClient: CacheClient;
async function initializeClient(): Promise<CacheClient> {
if (redisClient !== undefined) {
return redisClient;
}
const redisHost = getEnvVar(envVars.CacheHost);
const redisPort = getEnvVar(envVars.CachePort);
const redisUrl = `redis://${redisHost}:${redisPort}`;
redisClient = createClient({
url: redisUrl
});
redisClient.on('error', (err) => getLogger().error('Redis error:', err));
await redisClient.connect();
return redisClient;
}
export async function getCacheClient(): Promise<CacheClient> {
redisClient ||= await initializeClient();
return redisClient;
}
export async function checkRedisHealth(): Promise<boolean> {
try {
await redisClient.set('health', 'ok');
const reply = await redisClient.get('health');
return reply === 'ok';
} catch (error) {
getLogger().error('Redis Health Check Failed:', error);
return false;
}
}

View file

@ -5,6 +5,7 @@ const STUDENT_IDP_PREFIX = IDP_PREFIX + 'STUDENT_';
const TEACHER_IDP_PREFIX = IDP_PREFIX + 'TEACHER_';
const CORS_PREFIX = PREFIX + 'CORS_';
const LOGGING_PREFIX = PREFIX + 'LOGGING_';
const CACHE_PREFIX = PREFIX + 'CACHE_';
interface EnvVar {
key: string;
@ -39,6 +40,11 @@ export const envVars: Record<string, EnvVar> = {
LogLevel: { key: LOGGING_PREFIX + 'LEVEL', defaultValue: 'info' },
LokiHost: { key: LOGGING_PREFIX + 'LOKI_HOST', defaultValue: 'http://localhost:3102' },
CacheHost: { key: CACHE_PREFIX + 'HOST', defaultValue: 'localhost' },
CachePort: { key: CACHE_PREFIX + 'PORT', defaultValue: 6379 },
CacheTTL: { key: CACHE_PREFIX + 'TTL', defaultValue: 60 * 60 * 24 }, // 24 hours
CacheKeyPrefix: { key: CACHE_PREFIX + 'KEY_PREFIX', defaultValue: 'dwengo' },
} as const;
/**