| name | env-config-setup |
| description | Generate environment configuration files and validation schemas
|
| shortcut | ecs |
| category | devops |
| difficulty | beginner |
| estimated_time | 2-3 minutes |
Environment Config Setup
Generates environment configuration files (.env templates, validation schemas, and type-safe config loading) for multiple environments.
What This Command Does
Generated Configuration:
- .env.example (committed template)
- .env.development, .env.production
- Config validation schema (Zod)
- Type-safe config loader
- Secret management guidance
- Docker environment setup
Output: Complete environment configuration system
Time: 2-3 minutes
Usage
/env-config-setup
/ecs --services database,redis,email
/ecs --platform aws --features secrets-manager
Generated Files
.env.example (Template - Committed to Repo)
NODE_ENV=development
PORT=3000
APP_NAME=My Application
APP_URL=http://localhost:3000
DATABASE_URL=postgresql://user:password@localhost:5432/myapp
DATABASE_POOL_MIN=2
DATABASE_POOL_MAX=10
REDIS_URL=redis://localhost:6379
REDIS_PREFIX=myapp:
JWT_SECRET=generate-random-32-char-secret-here
JWT_EXPIRES_IN=15m
JWT_REFRESH_SECRET=generate-random-32-char-refresh-secret
JWT_REFRESH_EXPIRES_IN=7d
SENDGRID_API_KEY=SG.your-api-key-here
FROM_EMAIL=[email protected]
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_REGION=us-east-1
S3_BUCKET=your-bucket-name
STRIPE_SECRET_KEY=sk_test_your-stripe-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secret
SENTRY_DSN=https://your-sentry-dsn
LOG_LEVEL=info
ENABLE_FEATURE_X=false
.env.development
NODE_ENV=development
PORT=3000
DATABASE_URL=postgresql://postgres:password@localhost:5432/myapp_dev
REDIS_URL=redis://localhost:6379
LOG_LEVEL=debug
.env.production
NODE_ENV=production
PORT=8080
DATABASE_URL=${DATABASE_URL}
REDIS_URL=${REDIS_URL}
JWT_SECRET=${JWT_SECRET}
LOG_LEVEL=warn
config/env.ts (Type-Safe Config Loader)
import { z } from 'zod'
import dotenv from 'dotenv'
const envFile = process.env.NODE_ENV === 'production'
? '.env.production'
: '.env.development'
dotenv.config({ path: envFile })
const envSchema = z.object({
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
PORT: z.coerce.number().min(1).max(65535).default(3000),
APP_NAME: z.string().min(1),
APP_URL: z.string().url(),
DATABASE_URL: z.string().url(),
DATABASE_POOL_MIN: z.coerce.number().min(0).default(),
: z..().().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().(),
: z.().().(),
: z.([, , , ]).(),
: z..().()
})
parsedEnv = envSchema.(process.)
(!parsedEnv.) {
.()
.(parsedEnv..().)
process.()
}
env = parsedEnv.
= z.< envSchema>
config/secrets.ts (AWS Secrets Manager)
import { SecretsManager } from '@aws-sdk/client-secrets-manager'
const client = new SecretsManager({ region: process.env.AWS_REGION })
export async function loadSecrets(secretName: string) {
try {
const response = await client.getSecretValue({ SecretId: secretName })
return JSON.parse(response.SecretString || '{}')
} catch (error) {
console.error('Failed to load secrets:', error)
throw error
}
}
const secrets = await loadSecrets('prod/myapp/secrets')
process.env.JWT_SECRET = secrets.JWT_SECRET
docker-compose.env.yml
version: '3.8'
services:
app:
build: .
env_file:
- .env.development
environment:
- NODE_ENV=development
- PORT=3000
ports:
- "3000:3000"
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: ${POSTGRES_DB:-myapp_dev}
ports:
- "5432:5432"
Security Best Practices
1. Never Commit Secrets:
.env
.env.local
.env.*.local
.env.production
*.key
*.pem
secrets/
2. Use Secret Rotation:
3. Least Privilege:
4. Environment Validation:
if (process.env.NODE_ENV === 'production') {
if (!env.JWT_SECRET || env.JWT_SECRET.length < 32) {
throw new Error('Production JWT_SECRET must be at least 32 characters')
}
}
Secret Generation
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
openssl rand -hex 32
openssl rand -base64 32
Platform-Specific Setup
Vercel:
vercel env add DATABASE_URL production
vercel env add JWT_SECRET production
Railway:
{
"deploy": {
"envVars": {
"NODE_ENV": "production"
}
}
}
AWS ECS:
{
"containerDefinitions": [{
"secrets": [
{
"name": "DATABASE_URL",
"valueFrom": "arn:aws:secretsmanager:region:account:secret:name"
}
]
}]
}
Related Commands
/auth-setup - Generate authentication system
/project-scaffold - Generate full project structure
Manage secrets safely. Configure environments easily. Deploy confidently. ️