Configuration
Environment Variables
API (apps/api/.env)
# Application
NODE_ENV=development
PORT=3001
TZ=Asia/Kolkata
# Database
DATABASE_URL=postgresql://postgres:password@localhost:5432/syncad_central
# JWT
JWT_SECRET=your-256-bit-secret-here
JWT_ACCESS_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d
# Redis
REDIS_URL=redis://localhost:6379
# AWS
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=ap-south-1
AWS_DEFAULT_REGION=ap-south-1
# S3
S3_BUCKET=syncad-assets
S3_CDN_URL=https://cdn.syncad.in
# SES
SES_FROM_EMAIL=noreply@syncad.in
SES_FROM_NAME=SyncAD
# SNS (for SMS + Push)
SNS_TOPIC_ARN=arn:aws:sns:ap-south-1:123456:SyncADNotifications
# FCM (Push Notifications)
FCM_PROJECT_ID=syncad-prod
FCM_PRIVATE_KEY=...
FCM_CLIENT_EMAIL=...
# OTP
OTP_EXPIRY_SECONDS=300
OTP_LENGTH=6
# SCS Service (School Provisioning)
SCS_BASE_URL=http://localhost:8080
SCS_API_KEY=...
School Admin UI
NEXT_PUBLIC_API_URL=https://dev-api.metaonus.in
NEXT_PUBLIC_APP_NAME=School Admin
NEXT_PUBLIC_SCHOOL_ID= # filled at runtime from JWT
Super Admin UI
NEXT_PUBLIC_API_URL=https://dev-api.metaonus.in
NEXT_PUBLIC_APP_NAME=Super Admin
SCS Service
PORT=8080
DATABASE_URL=postgresql://postgres:password@localhost:5432/syncad_central
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=ap-south-1
ROUTE53_HOSTED_ZONE_ID=Z... # route53 zone for syncad.in
SCS_API_KEY=... # shared secret with super-admin UI
SES_FROM_EMAIL=noreply@syncad.in
Validation
All environment variables are validated at startup using apps/api/src/env.validation.ts (NestJS ConfigModule with class-validator):
// apps/api/src/env.validation.ts
export class EnvSchema {
@IsString()
@IsNotEmpty()
DATABASE_URL: string;
@IsString()
@MinLength(32)
JWT_SECRET: string;
@IsEnum(['development', 'staging', 'production'])
NODE_ENV: string;
@IsOptional()
@IsInt()
@Min(0)
OTP_EXPIRY_SECONDS: number;
}
If any required variable is missing or invalid, the API fails to start with a descriptive error.
Secret Management
In production, secrets are stored in AWS Secrets Manager and injected into ECS task definitions at runtime. Never commit real secrets to .env files — use .env.example as a template:
# .env.example (committed to git)
DATABASE_URL=
JWT_SECRET=
AWS_ACCESS_KEY_ID=
# ...