chore: initialize repository with deployment baseline
This commit is contained in:
38
backend/src/config/env.ts
Normal file
38
backend/src/config/env.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import dotenv from "dotenv";
|
||||
import { z } from "zod";
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const envSchema = z.object({
|
||||
NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
|
||||
PORT: z.coerce.number().default(8080),
|
||||
DATABASE_URL: z.string().min(1, "DATABASE_URL is required"),
|
||||
JWT_SECRET: z.string().min(16, "JWT_SECRET must be at least 16 characters"),
|
||||
JWT_EXPIRES_IN: z.string().default("7d"),
|
||||
JWT_REFRESH_SECRET: z.string().min(16, "JWT_REFRESH_SECRET must be at least 16 characters").optional(),
|
||||
JWT_REFRESH_EXPIRES_IN: z.string().default("30d"),
|
||||
CORS_ORIGIN: z.string().default("*"),
|
||||
RATE_LIMIT_WINDOW_MS: z.coerce.number().int().positive().default(60_000),
|
||||
RATE_LIMIT_MAX: z.coerce.number().int().positive().default(600),
|
||||
AUTH_RATE_LIMIT_WINDOW_MS: z.coerce.number().int().positive().default(60_000),
|
||||
AUTH_RATE_LIMIT_MAX: z.coerce.number().int().positive().default(20),
|
||||
SCHEDULER_LEASE_MS: z.coerce.number().int().positive().default(180_000),
|
||||
SCHEDULER_HEARTBEAT_MS: z.coerce.number().int().positive().default(30_000),
|
||||
ENABLE_SCHEDULER: z.coerce.boolean().default(true),
|
||||
BILLING_CRON: z.string().default("0 * * * *"),
|
||||
BACKUP_CRON: z.string().default("*/15 * * * *"),
|
||||
POWER_SCHEDULE_CRON: z.string().default("* * * * *"),
|
||||
MONITORING_CRON: z.string().default("*/5 * * * *"),
|
||||
PROXMOX_TIMEOUT_MS: z.coerce.number().default(15000)
|
||||
});
|
||||
|
||||
const parsed = envSchema.parse(process.env);
|
||||
|
||||
if (parsed.NODE_ENV === "production" && parsed.CORS_ORIGIN === "*") {
|
||||
throw new Error("CORS_ORIGIN cannot be '*' in production");
|
||||
}
|
||||
|
||||
export const env = {
|
||||
...parsed,
|
||||
JWT_REFRESH_SECRET: parsed.JWT_REFRESH_SECRET ?? parsed.JWT_SECRET
|
||||
};
|
||||
Reference in New Issue
Block a user