env
All checks were successful
Build & Deploy KLZ Cables / build-and-deploy (push) Successful in 3m36s

This commit is contained in:
2026-01-27 00:30:12 +01:00
parent 3cab376cd1
commit 5c71e9a064
7 changed files with 131 additions and 46 deletions

102
lib/config.ts Normal file
View File

@@ -0,0 +1,102 @@
/**
* Centralized configuration management for the application.
* This file defines the schema and provides a type-safe way to access environment variables.
*/
export const config = {
env: process.env.NODE_ENV || 'development',
isProduction: process.env.NODE_ENV === 'production',
isDevelopment: process.env.NODE_ENV === 'development',
isTest: process.env.NODE_ENV === 'test',
baseUrl: process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000',
analytics: {
umami: {
websiteId: process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID,
scriptUrl: process.env.UMAMI_SCRIPT_URL || 'https://analytics.infra.mintel.me/script.js',
// The proxied path used in the frontend
proxyPath: '/stats/script.js',
enabled: Boolean(process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID),
},
},
errors: {
glitchtip: {
// Server-side DSN (direct to GlitchTip)
dsn: process.env.SENTRY_DSN,
// Client-side DSN (proxied through Next.js)
publicDsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
// The proxied origin used in the frontend
proxyPath: '/errors',
enabled: Boolean(process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN),
},
},
cache: {
redis: {
url: process.env.REDIS_URL,
keyPrefix: process.env.REDIS_KEY_PREFIX || 'klz:',
enabled: Boolean(process.env.REDIS_URL),
},
},
logging: {
level: process.env.LOG_LEVEL || 'info',
},
mail: {
host: process.env.MAIL_HOST,
port: parseInt(process.env.MAIL_PORT || '587', 10),
user: process.env.MAIL_USERNAME,
pass: process.env.MAIL_PASSWORD,
from: process.env.MAIL_FROM,
recipients: process.env.MAIL_RECIPIENTS?.split(',') || [],
},
woocommerce: {
url: process.env.WOOCOMMERCE_URL,
consumerKey: process.env.WOOCOMMERCE_CONSUMER_KEY,
consumerSecret: process.env.WOOCOMMERCE_CONSUMER_SECRET,
},
wordpress: {
appPassword: process.env.WORDPRESS_APP_PASSWORD,
},
} as const;
/**
* Helper to get a masked version of the config for logging.
*/
export function getMaskedConfig() {
const mask = (val: string | undefined) => (val ? `***${val.slice(-4)}` : 'not set');
return {
env: config.env,
baseUrl: config.baseUrl,
analytics: {
umami: {
websiteId: mask(config.analytics.umami.websiteId),
scriptUrl: config.analytics.umami.scriptUrl,
enabled: config.analytics.umami.enabled,
},
},
errors: {
glitchtip: {
dsn: mask(config.errors.glitchtip.dsn),
publicDsn: mask(config.errors.glitchtip.publicDsn),
enabled: config.errors.glitchtip.enabled,
},
},
cache: {
redis: {
url: mask(config.cache.redis.url),
keyPrefix: config.cache.redis.keyPrefix,
enabled: config.cache.redis.enabled,
},
},
logging: {
level: config.logging.level,
},
};
}