Skip to main content

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