Tovább a tartalomhoz

Varlock séma formátum

Az .env.schema fájl egy speciális formátumú .env fájl, amely Varlock annotációkat tartalmaz. Ez az egyetlen igazságforrás a környezeti változók típusaihoz és validációs szabályaihoz.

Fájl: apps/web/.env.schema

# @import(../../.env.local, allowMissing=true)
# @currentEnv=$NODE_ENV
# @defaultRequired=false @defaultSensitive=false
# @generateTypes(lang=ts, path=src/env.d.ts)
# ---
# @required @type=enum(development,production,test)
NODE_ENV=development
# @type=number
BODY_SIZE_LIMIT=10485760
# @type=port
ELYOS_PORT=3000
# @required @type=url
ORIGIN=
# @type=url
APP_URL=fallback(ref('ORIGIN'),'')
# @required @sensitive
POSTGRES_USER=
# @required @sensitive
POSTGRES_PASSWORD=
# @required
POSTGRES_HOST=localhost
# @required @type=url @sensitive
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}

A fájl elején, a # --- sor előtt:

  • @import(path, allowMissing=true) — másik env fájl importálása
  • @currentEnv=$NODE_ENV — aktuális környezet meghatározása
  • @defaultRequired=false — alapértelmezetten nem kötelező a változók
  • @defaultSensitive=false — alapértelmezetten nem érzékeny a változók
  • @generateTypes(lang=ts, path=...) — TypeScript típusgenerálás
AnnotációLeírásPélda
@type=stringSzöveges érték (alapértelmezett)APP_NAME=ElyOS
@type=numberNumerikus értékBODY_SIZE_LIMIT=10485760
@type=number(min=1,max=100)Numerikus érték tartománnyalDEMO_RESET_HOUR=3
@type=portPort szám (1–65535)ELYOS_PORT=3000
@type=urlURL formátumORIGIN=http://localhost:3000
@type=email(normalize=true)Email cím normalizálássalSMTP_FROM_EMAIL=noreply@elyos.hu
@type=enum(a,b,c)Felsorolás típusNODE_ENV=development
@type=booleanLogikai értékDEV_MODE=true
  • @required — kötelező változó, hiánya leállítja az alkalmazást
  • @required=eq($VAR, value) — feltételes kötelezőség

Példa feltételes kötelezőségre:

# @type=enum(smtp,resend,sendgrid,ses)
EMAIL_PROVIDER=smtp
# Csak akkor kötelező, ha EMAIL_PROVIDER=smtp
# @required=eq($EMAIL_PROVIDER, smtp)
SMTP_HOST=
# @type=port @required=eq($EMAIL_PROVIDER, smtp)
SMTP_PORT=587
  • @sensitive — érzékeny adat, nem kerül naplóba
# @required @sensitive
BETTER_AUTH_SECRET=
# @required @type=url @sensitive
DATABASE_URL=
  • @default=value — alapértelmezett érték, ha nincs megadva
# @type=port @default=3000
ELYOS_PORT=3000

Hivatkozás egy másik változóra:

APP_URL=fallback(ref('ORIGIN'),'')
SMTP_FROM_EMAIL=fallback(ref('SMTP_USERNAME'),'')

Első nem üres érték használata:

# Ha ORIGIN üres, akkor üres string
APP_URL=fallback(ref('ORIGIN'),'')
# Ha SMTP_USERNAME üres, akkor 'noreply@elyos.hu'
SMTP_FROM_EMAIL=fallback(ref('SMTP_USERNAME'),'noreply@elyos.hu')

Változók beágyazása ${VAR} szintaxissal:

DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}

A @generateTypes annotáció hatására a Varlock automatikusan generál egy TypeScript típusfájlt:

# @generateTypes(lang=ts, path=src/env.d.ts)

Generált fájl: apps/web/src/env.d.ts

export type CoercedEnvSchema = {
NODE_ENV: "development" | "production" | "test";
BODY_SIZE_LIMIT: number;
ELYOS_PORT: number;
ORIGIN: string;
APP_URL?: string;
DATABASE_URL: string;
// ...
};
declare global {
namespace NodeJS {
interface ProcessEnv extends EnvSchemaAsStrings {}
}
}

Ez lehetővé teszi a típusbiztos hozzáférést:

// ✅ Típusbiztos
const port = process.env.ELYOS_PORT;
// ❌ TypeScript hiba
const invalid = process.env.INVALID_VAR;
  1. Használj beszédes neveketSMTP_HOST jobb mint SH
  2. Csoportosítsd a változókat — kommentekkel jelöld a kategóriákat
  3. Adj meg alapértelmezett értékeket — fejlesztői környezethez
  4. Használj feltételes kötelezőséget — csak a szükséges változók legyenek kötelezők
  5. Jelöld meg az érzékeny adatokat@sensitive annotációval