Configuration Guide
Overview
The www application uses a flexible configuration system that supports multiple environments, secret management, and modular configuration files.
Configuration Architecture
Configuration Files
src/config/
├── index.js # Main configuration loader
├── ejs.js # Template engine configuration
├── i18n.js # Internationalization setup
├── jwt.js # JWT token configuration
└── passport.js # Authentication strategies
Environment Management
- Development: Local development settings
- Staging: Pre-production environment
- Production: Live application settings
Environment Variables
Core Application Settings
# Server Configuration
NODE_ENV=development|staging|production
APP_PORT=8081
IS_PRODUCTION=false
# Database/Cache
REDIS_URL=redis://localhost:6379
REDIS_PASSWORD=your_redis_password
# Authentication
JWT_SECRET=your_jwt_secret_key
JWT_EXPIRES_IN=24h
GOOGLE_CLIENT_ID=your_google_oauth_client_id
GOOGLE_CLIENT_SECRET=your_google_oauth_secret
# External Services
INFISICAL_CLIENT_ID=your_infisical_client_id
INFISICAL_CLIENT_SECRET=your_infisical_client_secret
INFISICAL_PROJECT_ID=your_project_id
Service-Specific Variables
# Email Configuration
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your_smtp_user
SMTP_PASS=your_smtp_password
# SMS/Phone Verification
TWILIO_ACCOUNT_SID=your_twilio_sid
TWILIO_AUTH_TOKEN=your_twilio_token
TWILIO_PHONE_NUMBER=your_twilio_number
# API Endpoints
API_BASE_URL=http://localhost:3000
API_VERSION=v1
# Logging
LOG_LEVEL=info|debug|error
LOG_FILE_PATH=./logs/app.log
Secret Management
Infisical Integration
The application uses Infisical for secure secret management:
// Automatic secret loading from Infisical
await setEnvFromInfisical();
Infisical Configuration
- Secrets stored securely in Infisical vault
- Environment-specific secret management
- Automatic secret rotation support
- Development vs production secret isolation
Local Development
# Create .env file for local development
cp .env.example .env
# Edit .env with your local configuration
Configuration Modules
1. Main Configuration (src/config/index.js)
export default function setAppConfig(app) {
// Express app configuration
// Middleware setup
// Static file serving
// Security headers
}
2. EJS Configuration (src/config/ejs.js)
// Template engine setup
// View directory configuration
// Layout management
// Helper functions
3. Internationalization (src/config/i18n.js)
// Multi-language support
// Locale detection
// Translation loading
// Fallback language handling
4. JWT Configuration (src/config/jwt.js)
// Token signing configuration
// Expiration settings
// Secret management
// Token validation rules
5. Passport Configuration (src/config/passport.js)
// OAuth strategy setup
// User serialization
// Authentication callbacks
// Session management
Database Configuration
Redis Configuration
// Redis connection settings
const redisConfig = {
host: process.env.REDIS_HOST || 'localhost',
port: process.env.REDIS_PORT || 6379,
password: process.env.REDIS_PASSWORD,
db: process.env.REDIS_DB || 0,
retryDelayOnFailover: 100,
maxRetriesPerRequest: 3
};
Connection Management
- Connection pooling
- Automatic reconnection
- Error handling and recovery
- Health check monitoring
Logging Configuration
Winston Logger Setup
// src/services/loggerService.js
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
Log Levels
- Error: Application errors and exceptions
- Warn: Warning messages and deprecated features
- Info: General application information
- Debug: Detailed debugging information
Security Configuration
CORS Settings
// Cross-Origin Resource Sharing
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || ['http://localhost:3000'],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
Security Headers
// Security middleware configuration
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'", "fonts.googleapis.com"],
fontSrc: ["'self'", "fonts.gstatic.com"],
scriptSrc: ["'self'", "'unsafe-inline'"]
}
}
}));
Rate Limiting
// API rate limiting configuration
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: 'Too many requests from this IP'
});
Development Configuration
Development-Specific Settings
if (process.env.NODE_ENV === 'development') {
// Enable detailed error reporting
app.use(errorHandler());
// Enable CORS for all origins
app.use(cors({ origin: true }));
// Disable caching
app.use(noCache());
}
Debug Configuration
- Detailed error messages
- Source map generation
- Hot reload settings
- Development middleware
Production Configuration
Production Optimizations
if (process.env.NODE_ENV === 'production') {
// Enable compression
app.use(compression());
// Strict security headers
app.use(helmet());
// Enable caching
app.use(express.static('public', { maxAge: '1y' }));
}
Performance Settings
- Asset compression
- Caching strategies
- Connection pooling
- Resource optimization
Configuration Validation
Environment Validation
// Required environment variables check
const requiredEnvVars = [
'JWT_SECRET',
'GOOGLE_CLIENT_ID',
'GOOGLE_CLIENT_SECRET',
'REDIS_URL'
];
requiredEnvVars.forEach(envVar => {
if (!process.env[envVar]) {
throw new Error(`Missing required environment variable: ${envVar}`);
}
});
Configuration Testing
- Environment variable validation
- Database connection testing
- External service connectivity
- Configuration schema validation
Deployment Configuration
Docker Configuration
# Environment variables in Docker
ENV NODE_ENV=production
ENV APP_PORT=8081
Docker Compose
# docker-compose.yml configuration
environment:
- NODE_ENV=production
- REDIS_URL=redis://redis:6379
CI/CD Configuration
- Environment-specific deployments
- Secret injection in CI/CD
- Configuration validation in pipelines
- Automated configuration testing