feat: add env schema for environment variable validation
Introduced `env.schema.ts` for structured validation of environment variables using Zod. Includes defaults and validations for database, S3, security, mail, Redis, and session configurations.
This commit is contained in:
63
backend/src/config/env.schema.ts
Normal file
63
backend/src/config/env.schema.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const envSchema = z.object({
|
||||||
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||||
|
PORT: z.coerce.number().default(3000),
|
||||||
|
|
||||||
|
// Database
|
||||||
|
POSTGRES_HOST: z.string(),
|
||||||
|
POSTGRES_PORT: z.coerce.number().default(5432),
|
||||||
|
POSTGRES_DB: z.string(),
|
||||||
|
POSTGRES_USER: z.string(),
|
||||||
|
POSTGRES_PASSWORD: z.string(),
|
||||||
|
|
||||||
|
// S3
|
||||||
|
S3_ENDPOINT: z.string().default("localhost"),
|
||||||
|
S3_PORT: z.coerce.number().default(9000),
|
||||||
|
S3_USE_SSL: z.preprocess((val) => val === "true", z.boolean()).default(false),
|
||||||
|
S3_ACCESS_KEY: z.string().default("minioadmin"),
|
||||||
|
S3_SECRET_KEY: z.string().default("minioadmin"),
|
||||||
|
S3_BUCKET_NAME: z.string().default("memegoat"),
|
||||||
|
|
||||||
|
// Security
|
||||||
|
JWT_SECRET: z.string().min(32),
|
||||||
|
ENCRYPTION_KEY: z.string().length(32),
|
||||||
|
PGP_ENCRYPTION_KEY: z.string().min(16),
|
||||||
|
|
||||||
|
// Mail
|
||||||
|
MAIL_HOST: z.string(),
|
||||||
|
MAIL_PORT: z.coerce.number(),
|
||||||
|
MAIL_SECURE: z.preprocess((val) => val === "true", z.boolean()).default(false),
|
||||||
|
MAIL_USER: z.string(),
|
||||||
|
MAIL_PASS: z.string(),
|
||||||
|
MAIL_FROM: z.string().email(),
|
||||||
|
|
||||||
|
DOMAIN_NAME: z.string(),
|
||||||
|
|
||||||
|
// Sentry
|
||||||
|
SENTRY_DSN: z.string().optional(),
|
||||||
|
|
||||||
|
// Redis
|
||||||
|
REDIS_HOST: z.string().default("localhost"),
|
||||||
|
REDIS_PORT: z.coerce.number().default(6379),
|
||||||
|
|
||||||
|
// Session
|
||||||
|
SESSION_PASSWORD: z.string().min(32),
|
||||||
|
|
||||||
|
// Media Limits
|
||||||
|
MAX_IMAGE_SIZE_KB: z.coerce.number().default(512),
|
||||||
|
MAX_GIF_SIZE_KB: z.coerce.number().default(1024),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Env = z.infer<typeof envSchema>;
|
||||||
|
|
||||||
|
export function validateEnv(config: Record<string, unknown>) {
|
||||||
|
const result = envSchema.safeParse(config);
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
console.error("❌ Invalid environment variables:", result.error.format());
|
||||||
|
throw new Error("Invalid environment variables");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.data;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user