- Add complete dark mode system with theme context and toggle - Implement dark mode toggle component in navigation menu - Add client-side routing with SSR-safe signal handling - Fix language selector styling for better dark mode compatibility - Add documentation system with mdBook integration - Improve navigation menu with proper external/internal link handling - Add comprehensive project documentation and configuration - Enhance theme system with localStorage persistence - Fix arena panic issues during server-side rendering - Add proper TypeScript configuration and build optimizations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
13 KiB
13 KiB
Configuration System Implementation Summary
Overview
This project now includes a comprehensive TOML-based configuration system with environment variable overrides, designed to handle complex application settings in a structured and maintainable way.
🚀 Key Features
✅ TOML Configuration Files
- Structured configuration using TOML format
- Environment-specific configs (dev, staging, prod)
- Hierarchical settings organization
- Comments and documentation in config files
✅ Environment Variable Support
- Override any setting via environment variables
- Environment variable substitution in TOML files (
${VAR_NAME}) - Automatic environment detection (dev/prod)
- Secure credential management
✅ Configuration Validation
- Comprehensive validation of all settings
- TLS certificate validation when HTTPS is enabled
- Database URL validation
- Production security checks
✅ Developer Tools
- Configuration CLI tool for management and validation
- Setup script for easy initialization
- Example configurations for different environments
- Migration guide from environment-only setup
📁 File Structure
template/
├── config.toml # Default configuration
├── config.dev.toml # Development environment
├── config.prod.toml # Production environment
├── .env.example # Environment variables example
├── CONFIG_README.md # Detailed documentation
├── CONFIG_SUMMARY.md # This summary
├── MIGRATION_GUIDE.md # Migration from old system
├── scripts/
│ └── setup-config.sh # Setup script
└── server/
├── src/
│ ├── config/
│ │ └── mod.rs # Configuration implementation
│ ├── bin/
│ │ └── config_tool.rs # CLI management tool
│ └── main.rs # Updated to use new config
└── examples/
└── config_example.rs # Usage examples
🔧 Configuration Sections
Server Configuration
- Protocol (HTTP/HTTPS)
- Host and port binding
- Environment detection
- TLS certificate paths
- Logging levels
Database Configuration
- Connection URL with environment substitution
- Connection pool settings
- Timeout configurations
- Connection lifecycle management
Security Configuration
- CSRF protection settings
- Rate limiting configuration
- BCrypt cost settings
- Session management
- Cookie security settings
Feature Flags
- Authentication system
- TLS support
- Content database
- Two-factor authentication
- OAuth providers
Email Configuration
- Email provider selection (SMTP, SendGrid, Console)
- Internationalized template system
- Language detection and fallback
- Template directory structure
- SMTP server configuration
- SendGrid API integration
- Development email testing
Additional Sections
- CORS policies
- Static file serving
- Redis configuration
- OAuth provider settings
- Application metadata
- Logging configuration
- Content management
🛠️ Usage Examples
Loading Configuration
use server::config::Config;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load configuration from TOML with env overrides
let config = Config::load()?;
// Use configuration
let server_addr = config.server_address();
let db_config = config.database_pool_config();
println!("Server: {}", server_addr);
println!("Database: {}", config.database.url);
Ok(())
}
Environment Variable Overrides
# Override server settings
export SERVER_HOST="0.0.0.0"
export SERVER_PORT="8080"
export ENVIRONMENT="production"
# Override database settings
export DATABASE_URL="postgresql://user:pass@db:5432/myapp"
# Override security settings
export SESSION_SECRET="super-secret-production-key"
Configuration Management
# Validate current configuration
cargo run --bin config_tool -- validate
# Show all configuration values
cargo run --bin config_tool -- show
# Generate environment-specific config
cargo run --bin config_tool -- generate --env prod
# Check environment variables
cargo run --bin config_tool -- check-env
🎯 Environment-Specific Configurations
Development (config.dev.toml)
- HTTP protocol for easy development
- Debug logging enabled
- Relaxed security settings
- Local database connections
- Development OAuth credentials
- Disabled CSRF for easier testing
Production (config.prod.toml)
- HTTPS with TLS certificates
- Strict security settings
- Production database connections
- Environment variable substitution for secrets
- Optimized for performance
- Comprehensive monitoring
🔒 Security Features
Secret Management
- Environment variable substitution for sensitive data
- No hardcoded secrets in configuration files
- Production validation for insecure defaults
- Secure session management
TLS Support
- Automatic TLS configuration validation
- Certificate path verification
- Optional TLS feature flag
- Development vs production TLS settings
CORS & Security Headers
- Configurable CORS policies
- Environment-specific allowed origins
- Security headers configuration
- Rate limiting settings
🚀 Migration Path
From Environment-Only Configuration
- Identify current environment variables
- Create base TOML configuration
- Update code to use
Config::load() - Move sensitive data to environment variables
- Create environment-specific configs
- Test configuration loading
- Update deployment scripts
Migration Tools
- Migration guide with step-by-step instructions
- Configuration tool for validation
- Example configurations for reference
- Rollback procedures if needed
📊 Configuration Hierarchy
- Default values (in code)
- TOML file (config.toml or environment-specific)
- Environment variables (highest priority)
- Environment variable substitution (resolved last)
🔧 CLI Tools
Configuration Tool (config_tool)
# Available commands
cargo run --bin config_tool -- validate # Validate configuration
cargo run --bin config_tool -- show # Display current config
cargo run --bin config_tool -- generate # Generate config files
cargo run --bin config_tool -- check-env # Check environment variables
cargo run --bin config_tool -- help # Show help
Setup Script (setup-config.sh)
# Interactive setup
./scripts/setup-config.sh
# Environment-specific setup
./scripts/setup-config.sh --env dev
./scripts/setup-config.sh --env prod
# Force overwrite existing files
./scripts/setup-config.sh --force
📈 Benefits
For Developers
- Easier configuration management with structured TOML
- Environment-specific settings without code changes
- Validation and error checking for configuration issues
- Documentation within configuration files
For DevOps
- Flexible deployment with environment overrides
- Secure credential management via environment variables
- Validation tools for configuration verification
- Standardized configuration across environments
For Security
- No secrets in code or configuration files
- Environment variable substitution for sensitive data
- Production validation for security settings
- TLS certificate validation
🎨 Customization
Adding New Configuration Sections
- Define struct with serde attributes
- Add to main Config struct
- Update TOML files with new section
- Add validation logic if needed
- Update documentation
Environment Variables
- Follow naming convention:
SECTION_FIELD - Add to environment override logic
- Document in README
- Add to validation checks
🧪 Testing
Available Tests
- Configuration loading from TOML files
- Environment variable overrides
- Environment variable substitution
- Validation logic
- Error handling
Test Commands
# Run configuration example
cargo run --example config_example
# Run unit tests
cargo test config::tests
# Validate configuration
cargo run --bin config_tool -- validate
📧 Email Configuration System
Email Provider Support
- Console Provider - Development email testing (prints to terminal)
- SMTP Provider - Standard SMTP servers (Gmail, Outlook, custom)
- SendGrid Provider - Production email delivery service
Internationalized Templates
- Language-specific templates with automatic fallback
- Template directory structure:
templates/email/{lang}_/{html|text}/ - Supported languages: English (en), Spanish (es), French (fr), German (de)
- Language detection from user profile, Accept-Language header, or default
Template Features
- Handlebars templating with custom helpers
- HTML and text versions for all templates
- Template variables for dynamic content
- Date formatting and text manipulation helpers
- Automatic language fallback to English
Email Configuration Structure
[email]
enabled = true
provider = "console" # "smtp", "sendgrid", "console"
from_email = "noreply@app.com"
from_name = "Your App"
template_dir = "templates/email"
# SMTP Configuration
smtp_host = "smtp.gmail.com"
smtp_port = 587
smtp_username = "your-email@gmail.com"
smtp_password = "${SMTP_PASSWORD}"
smtp_use_starttls = true
# SendGrid Configuration
sendgrid_api_key = "${SENDGRID_API_KEY}"
Environment-Specific Email Settings
- Development: Console provider for easy testing
- Staging: SMTP testing with Mailtrap or similar
- Production: SendGrid for reliable delivery
Email Template Structure
templates/email/
├── en_/ # English templates (default)
│ ├── html/ # HTML email templates
│ │ ├── contact.hbs # Contact form template
│ │ └── notification.hbs # Notification template
│ └── text/ # Plain text templates
├── es_/ # Spanish templates
│ ├── html/
│ └── text/
└── README.md # Template documentation
Email Template Variables
{{name}}- User's name{{email}}- User's email address{{subject}}- Message subject{{message}}- Message content{{submitted_at}}- Submission timestamp{{form_type}}- Type of form submission
Custom Handlebars Helpers
{{date_format submitted_at "%B %d, %Y"}}- Format dates{{capitalize form_type}}- Capitalize text{{truncate user_agent 100}}- Truncate text{{default action_text "Click Here"}}- Default values{{url_encode email}}- URL encode text
📚 Documentation
Available Documentation
- CONFIG_README.md - Comprehensive usage guide
- MIGRATION_GUIDE.md - Migration from old system
- CONFIG_SUMMARY.md - This summary
- templates/email/README.md - Email template documentation
- Inline documentation in code
- Example configurations for all environments
Getting Started
- Read CONFIG_README.md for detailed instructions
- Run setup script:
./scripts/setup-config.sh - Customize configuration files for your needs
- Set required environment variables
- Test with configuration tool
- Deploy with your preferred method
🔄 Maintenance
Regular Tasks
- Review configuration files for outdated settings
- Update environment-specific configurations
- Validate production configurations
- Rotate secrets and credentials
- Update documentation
Monitoring
- Monitor configuration loading in production
- Alert on configuration validation failures
- Log configuration changes
- Backup configuration files
📞 Support
Getting Help
- Check CONFIG_README.md for detailed documentation
- Run config tool help:
cargo run --bin config_tool -- help - Review examples in
server/examples/ - Check migration guide for common issues
- Validate configuration:
cargo run --bin config_tool -- validate
Common Issues
- Configuration file not found - Check file path and permissions
- Environment variable not found - Set required variables
- TLS configuration errors - Verify certificate paths
- Database connection errors - Check database URL format
- Validation failures - Review configuration values
- Email template not found - Check template directory structure
- Email delivery failed - Verify email provider credentials
- SMTP authentication failed - Check username/password or use App Password for Gmail
This configuration system provides a robust, flexible, and secure foundation for managing application settings across different environments while maintaining developer productivity and operational security.