Environment Configuration
Environment Configuration
Section titled “Environment Configuration”Learn how to manage mailiam configurations across development, staging, and production environments.
Overview
Section titled “Overview”mailiam supports multiple approaches for managing environment-specific configurations:
- Environment Variables - Dynamic values at runtime
- Multiple Config Files - Separate files per environment
- Conditional Configuration - Environment-based logic in single file
- CI/CD Integration - Automated deployment workflows
Environment Variables
Section titled “Environment Variables”Basic Usage
Section titled “Basic Usage”Reference environment variables in your mailiam.config.yaml:
project: name: "${PROJECT_NAME:-My Application}" slug: "${PROJECT_SLUG:-my-app}"
domains: "${DOMAIN}": forwarding: "hello@${DOMAIN}": "${ADMIN_EMAIL}" "support@${DOMAIN}": "${SUPPORT_EMAIL}"
forms: contact: name: "Contact Form" replyTo: "${CONTACT_EMAIL}"
templates: branded: variables: company_name: "${COMPANY_NAME:-My Company}" api_url: "${API_URL:-https://api.example.com}"Environment Variable Patterns
Section titled “Environment Variable Patterns”Development
Section titled “Development”export PROJECT_NAME="My App (Dev)"export DOMAIN="dev.example.com"export ADMIN_EMAIL="dev-admin@example.com"export MAILIAM_API_KEY="mlm_dev_your_key_here"Staging
Section titled “Staging”export PROJECT_NAME="My App (Staging)"export DOMAIN="staging.example.com"export ADMIN_EMAIL="staging-admin@example.com"export MAILIAM_API_KEY="mlm_staging_your_key_here"Production
Section titled “Production”export PROJECT_NAME="My App"export DOMAIN="example.com"export ADMIN_EMAIL="admin@example.com"export MAILIAM_API_KEY="mlm_prod_your_key_here"Default Values
Section titled “Default Values”Provide fallback values using the ${VAR:-default} syntax:
settings: rate_limit: "${RATE_LIMIT:-10}" spam_protection: "${SPAM_PROTECTION:-true}" sending_mode: "${SENDING_MODE:-standard}"
domains: "${DOMAIN:-localhost}": forms: contact: name: "${FORM_NAME:-Contact Form}" rateLimit: "${FORM_RATE_LIMIT:-5}"Multiple Configuration Files
Section titled “Multiple Configuration Files”File Structure
Section titled “File Structure”project/├── mailiam.config.yaml # Base configuration├── mailiam.dev.yaml # Development overrides├── mailiam.staging.yaml # Staging overrides├── mailiam.prod.yaml # Production configuration└── environments/ ├── development.yaml ├── staging.yaml └── production.yamlBase Configuration
Section titled “Base Configuration”mailiam.config.yaml:
project: name: "My Application" slug: "my-app"
# Shared templatestemplates: default: type: "form" subject: "New contact from {{ form.name }}" text: | Name: {{ form.name }} Email: {{ form.email }} Message: {{ form.message }}Environment-Specific Files
Section titled “Environment-Specific Files”mailiam.dev.yaml:
project: name: "My Application (Dev)"
domains: dev.example.com: forwarding: "*@dev.example.com": "dev-team@company.com" forms: contact: name: "Dev Contact Form" rateLimit: 100 # Higher limit for testing
settings: spam_protection: false # Disabled for easier testing rate_limit: 100mailiam.prod.yaml:
project: name: "My Application"
domains: example.com: forwarding: "hello@example.com": "team@company.com" "support@example.com": "support@company.com" forms: contact: name: "Contact Form" rateLimit: 10 acknowledgment: enabled: true template: "professional"
settings: spam_protection: true rate_limit: 10 enableAnalytics: trueUsing Environment-Specific Files
Section titled “Using Environment-Specific Files”# Deploy development configurationcp mailiam.dev.yaml mailiam.config.yamlmailiam push
# Deploy production configurationcp mailiam.prod.yaml mailiam.config.yamlmailiam pushConditional Configuration
Section titled “Conditional Configuration”Use environment variables to enable conditional logic:
project: name: "My App${NODE_ENV == 'production' ? '' : ' (' + NODE_ENV + ')'}"
domains: # Use different domains based on environment "${NODE_ENV == 'production' ? 'example.com' : NODE_ENV + '.example.com'}": forwarding: # Different email destinations per environment "admin@${DOMAIN}": "${NODE_ENV == 'production' ? 'admin@company.com' : 'dev-team@company.com'}"
forms: contact: name: "Contact Form" # Relaxed rate limiting in development rateLimit: "${NODE_ENV == 'production' ? 10 : 100}"
settings: # Disable spam protection in development spam_protection: "${NODE_ENV != 'development'}" # Enable analytics only in production enableAnalytics: "${NODE_ENV == 'production'}"API Key Management
Section titled “API Key Management”Per-Environment Keys
Section titled “Per-Environment Keys”Use different API keys for each environment:
Development
Section titled “Development”# ~/.bashrc or ~/.zshrcexport MAILIAM_API_KEY_DEV="mlm_dev_abc123..."
# For development workexport MAILIAM_API_KEY="$MAILIAM_API_KEY_DEV"Production
Section titled “Production”# Production server or CI/CDexport MAILIAM_API_KEY_PROD="mlm_prod_xyz789..."
# For production deploymentexport MAILIAM_API_KEY="$MAILIAM_API_KEY_PROD"Environment Scripts
Section titled “Environment Scripts”Create helper scripts for switching environments:
scripts/dev.sh:
#!/bin/bashexport NODE_ENV=developmentexport MAILIAM_API_KEY="mlm_dev_your_key_here"export DOMAIN="dev.example.com"export ADMIN_EMAIL="dev@company.com"
echo "Environment set to development"mailiam auth statusscripts/prod.sh:
#!/bin/bashexport NODE_ENV=productionexport MAILIAM_API_KEY="mlm_prod_your_key_here"export DOMAIN="example.com"export ADMIN_EMAIL="admin@company.com"
echo "Environment set to production"mailiam auth statusUsage:
source scripts/dev.shmailiam push
source scripts/prod.shmailiam pushCI/CD Integration
Section titled “CI/CD Integration”GitHub Actions
Section titled “GitHub Actions”.github/workflows/deploy.yml:
name: Deploy mailiam Configuration
on: push: branches: [main] pull_request: branches: [main]
jobs: deploy-staging: if: github.event_name == 'pull_request' runs-on: ubuntu-latest environment: staging steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' - name: Install mailiam CLI run: npm install -g mailiam - name: Deploy to staging env: MAILIAM_API_KEY: ${{ secrets.MAILIAM_STAGING_API_KEY }} NODE_ENV: staging DOMAIN: staging.example.com ADMIN_EMAIL: staging@company.com run: | mailiam push --dry-run # Preview changes first mailiam push
deploy-production: if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' - name: Install mailiam CLI run: npm install -g mailiam - name: Deploy to production env: MAILIAM_API_KEY: ${{ secrets.MAILIAM_PRODUCTION_API_KEY }} NODE_ENV: production DOMAIN: example.com ADMIN_EMAIL: admin@company.com run: | mailiam test config # Validate configuration mailiam pushSecrets Management
Section titled “Secrets Management”Store sensitive values as secrets in your CI/CD system:
GitHub Secrets
Section titled “GitHub Secrets”MAILIAM_STAGING_API_KEYMAILIAM_PRODUCTION_API_KEYADMIN_EMAIL_PRODSUPPORT_EMAIL_PROD
Accessing Secrets in Configuration
Section titled “Accessing Secrets in Configuration”domains: "${DOMAIN}": forwarding: "admin@${DOMAIN}": "${ADMIN_EMAIL}" "support@${DOMAIN}": "${SUPPORT_EMAIL}"Environment-Specific DNS
Section titled “Environment-Specific DNS”Development DNS
Section titled “Development DNS”For local development, use test domains:
# Developmentdomains: localhost: forms: contact: name: "Local Contact Form" # For local testing, disable rate limits rateLimit: 1000Staging DNS
Section titled “Staging DNS”Use staging subdomains:
# Stagingdomains: staging.example.com: forwarding: "*@staging.example.com": "staging-team@company.com" forms: contact: name: "Staging Contact Form" # Similar to production but with higher limits for testing rateLimit: 50Production DNS
Section titled “Production DNS”Production domains with proper configuration:
# Productiondomains: example.com: forwarding: "hello@example.com": "team@company.com" "support@example.com": "support@company.com" forms: contact: name: "Contact Form" rateLimit: 10 acknowledgment: enabled: trueTesting Across Environments
Section titled “Testing Across Environments”Configuration Validation
Section titled “Configuration Validation”Test configurations before deployment:
# Test development configNODE_ENV=development mailiam test config
# Test production configNODE_ENV=production mailiam test config
# Dry run deploymentmailiam push --dry-runEmail Testing
Section titled “Email Testing”Test email functionality per environment:
# Developmentmailiam test send dev-test@company.com
# Stagingmailiam test send staging-test@company.com
# Production (be careful!)mailiam test send admin@company.comEnvironment Variables Reference
Section titled “Environment Variables Reference”Standard Environment Variables
Section titled “Standard Environment Variables”| Variable | Description | Example |
|---|---|---|
NODE_ENV | Environment name | development, staging, production |
MAILIAM_API_KEY | mailiam API key | mlm_abc123... |
DOMAIN | Primary domain | example.com |
ADMIN_EMAIL | Administrator email | admin@company.com |
SUPPORT_EMAIL | Support email | support@company.com |
Custom Variables
Section titled “Custom Variables”Create your own environment variables:
project: name: "${APP_NAME:-My App}"
domains: "${PRIMARY_DOMAIN}": forwarding: "contact@${PRIMARY_DOMAIN}": "${CONTACT_DESTINATION}" "sales@${PRIMARY_DOMAIN}": "${SALES_DESTINATION}"Best Practices
Section titled “Best Practices”1. Separate Concerns
Section titled “1. Separate Concerns”- Use different API keys per environment
- Use environment-specific domains
- Configure appropriate rate limits per environment
2. Security
Section titled “2. Security”# Never commit secretsecho "*.env" >> .gitignoreecho "mailiam.prod.yaml" >> .gitignore
# Use secrets management in CI/CD# Store API keys as encrypted secrets3. Testing
Section titled “3. Testing”# Always test configuration changesmailiam test config
# Use dry-run for production deploymentsmailiam push --dry-run
# Validate email functionalitymailiam test send your-email@company.com4. Documentation
Section titled “4. Documentation”Document your environment setup:
README.md:
## Environment Setup
### Development```bashcp environments/development.yaml mailiam.config.yamlexport MAILIAM_API_KEY="mlm_dev_..."mailiam pushProduction
Section titled “Production”cp environments/production.yaml mailiam.config.yamlexport MAILIAM_API_KEY="mlm_prod_..."mailiam push### 5. Monitoring
Monitor different environments separately:
```yamlsettings: # Enable analytics per environment enableAnalytics: "${NODE_ENV == 'production'}"
# Different rate limits per environment rate_limit: "${NODE_ENV == 'production' ? 10 : 100}"Troubleshooting
Section titled “Troubleshooting”Environment Variable Not Found
Section titled “Environment Variable Not Found”# Check if variable is setecho $DOMAIN
# List all mailiam-related variablesenv | grep MAILIAMWrong Configuration Deployed
Section titled “Wrong Configuration Deployed”# Check current environmentmailiam auth status
# Verify configurationmailiam test config
# Roll back if neededgit checkout HEAD~1 -- mailiam.config.yamlmailiam pushAPI Key Issues
Section titled “API Key Issues”# Check which key is being usedmailiam auth status
# Switch to correct environment keyexport MAILIAM_API_KEY="$MAILIAM_API_KEY_PROD"mailiam auth statusNext Steps
Section titled “Next Steps”- Configuration Schema Reference - Complete configuration options
- CLI Commands - Available CLI commands
- Domain Management - Setting up domains
- Security Best Practices - Securing your setup