Improve base config
This commit is contained in:
481
.env.sample
481
.env.sample
@@ -1,123 +1,422 @@
|
||||
# .env.example - Environment Variables Template
|
||||
# Copy to .env and update values
|
||||
|
||||
# ================================================================
|
||||
# JWT CONFIGURATION (CRITICAL - CHANGE IN PRODUCTION!)
|
||||
# ================================================================
|
||||
JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-minimum-32-characters-required
|
||||
|
||||
# ================================================================
|
||||
# EXTERNAL API KEYS
|
||||
# UPDATED .env.example FILE
|
||||
# .env.example
|
||||
# ================================================================
|
||||
|
||||
# AEMET (Spanish Weather Service) API Key
|
||||
# Get from: https://opendata.aemet.es/centrodedescargas/altaUsuario
|
||||
AEMET_API_KEY=your-aemet-api-key-here
|
||||
|
||||
# Madrid Open Data API Key (Optional)
|
||||
# Get from: https://datos.madrid.es/portal/site/egob/
|
||||
MADRID_OPENDATA_API_KEY=your-madrid-opendata-key-here
|
||||
|
||||
# ================================================================
|
||||
# EMAIL CONFIGURATION (For notifications)
|
||||
# ENVIRONMENT CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Gmail SMTP Configuration (recommended)
|
||||
SMTP_HOST=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=your-email@gmail.com
|
||||
SMTP_PASSWORD=your-gmail-app-specific-password
|
||||
|
||||
# Alternative: SendGrid
|
||||
# SMTP_HOST=smtp.sendgrid.net
|
||||
# SMTP_PORT=587
|
||||
# SMTP_USER=apikey
|
||||
# SMTP_PASSWORD=your-sendgrid-api-key
|
||||
# Environment: development, staging, production, testing
|
||||
ENVIRONMENT=development
|
||||
DEBUG=true
|
||||
LOG_LEVEL=INFO
|
||||
SERVICE_VERSION=1.0.0
|
||||
|
||||
# ================================================================
|
||||
# WHATSAPP CONFIGURATION (Twilio)
|
||||
# DATABASE CONFIGURATION
|
||||
# Each service has its own dedicated database
|
||||
# ================================================================
|
||||
|
||||
# Twilio WhatsApp Configuration
|
||||
# Get from: https://www.twilio.com/console
|
||||
WHATSAPP_ACCOUNT_SID=your-twilio-account-sid
|
||||
WHATSAPP_AUTH_TOKEN=your-twilio-auth-token
|
||||
WHATSAPP_FROM_NUMBER=whatsapp:+14155238886
|
||||
# Auth Service Database
|
||||
AUTH_DATABASE_URL=postgresql+asyncpg://auth_user:auth_pass123@auth-db:5432/auth_db
|
||||
|
||||
# Training Service Database
|
||||
TRAINING_DATABASE_URL=postgresql+asyncpg://training_user:training_pass123@training-db:5432/training_db
|
||||
|
||||
# Forecasting Service Database
|
||||
FORECASTING_DATABASE_URL=postgresql+asyncpg://forecasting_user:forecasting_pass123@forecasting-db:5432/forecasting_db
|
||||
|
||||
# Data Service Database
|
||||
DATA_DATABASE_URL=postgresql+asyncpg://data_user:data_pass123@data-db:5432/data_db
|
||||
|
||||
# Tenant Service Database
|
||||
TENANT_DATABASE_URL=postgresql+asyncpg://tenant_user:tenant_pass123@tenant-db:5432/tenant_db
|
||||
|
||||
# Notification Service Database
|
||||
NOTIFICATION_DATABASE_URL=postgresql+asyncpg://notification_user:notification_pass123@notification-db:5432/notification_db
|
||||
|
||||
# Database Connection Pool Settings
|
||||
DB_POOL_SIZE=10
|
||||
DB_MAX_OVERFLOW=20
|
||||
DB_POOL_TIMEOUT=30
|
||||
DB_POOL_RECYCLE=3600
|
||||
DB_ECHO=false
|
||||
|
||||
# ================================================================
|
||||
# DATABASE CONFIGURATION (Auto-configured in Docker)
|
||||
# REDIS CONFIGURATION
|
||||
# Each service uses a different Redis database
|
||||
# ================================================================
|
||||
|
||||
# These are set automatically in docker-compose.yml
|
||||
# Only change if using external databases
|
||||
REDIS_URL=redis://redis:6379
|
||||
REDIS_MAX_CONNECTIONS=50
|
||||
|
||||
# AUTH_DATABASE_URL=postgresql+asyncpg://auth_user:auth_pass123@auth-db:5432/auth_db
|
||||
# TENANT_DATABASE_URL=postgresql+asyncpg://tenant_user:tenant_pass123@tenant-db:5432/tenant_db
|
||||
# TRAINING_DATABASE_URL=postgresql+asyncpg://training_user:training_pass123@training-db:5432/training_db
|
||||
# FORECASTING_DATABASE_URL=postgresql+asyncpg://forecasting_user:forecasting_pass123@forecasting-db:5432/forecasting_db
|
||||
# DATA_DATABASE_URL=postgresql+asyncpg://data_user:data_pass123@data-db:5432/data_db
|
||||
# NOTIFICATION_DATABASE_URL=postgresql+asyncpg://notification_user:notification_pass123@notification-db:5432/notification_db
|
||||
# Redis Database Assignments:
|
||||
# 0 - Auth Service
|
||||
# 1 - Training Service
|
||||
# 2 - Forecasting Service
|
||||
# 3 - Data Service
|
||||
# 4 - Tenant Service
|
||||
# 5 - Notification Service
|
||||
# 6 - Gateway Service
|
||||
|
||||
# ================================================================
|
||||
# REDIS CONFIGURATION (Auto-configured in Docker)
|
||||
# RABBITMQ CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# REDIS_URL=redis://:redis_pass123@redis:6379
|
||||
RABBITMQ_URL=amqp://bakery:forecast123@rabbitmq:5672/
|
||||
RABBITMQ_EXCHANGE=bakery_events
|
||||
RABBITMQ_QUEUE_PREFIX=bakery
|
||||
RABBITMQ_RETRY_ATTEMPTS=3
|
||||
RABBITMQ_RETRY_DELAY=5
|
||||
|
||||
# ================================================================
|
||||
# RABBITMQ CONFIGURATION (Auto-configured in Docker)
|
||||
# AUTHENTICATION & SECURITY
|
||||
# ================================================================
|
||||
|
||||
# RABBITMQ_URL=amqp://bakery:forecast123@rabbitmq:5672/
|
||||
|
||||
# ================================================================
|
||||
# CORS CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Allowed origins for CORS (comma-separated)
|
||||
CORS_ORIGINS=http://localhost:3000,http://localhost:3001,https://yourdomain.com
|
||||
|
||||
# ================================================================
|
||||
# ML/AI CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Model storage configuration
|
||||
MODEL_STORAGE_PATH=/app/models
|
||||
MAX_TRAINING_TIME_MINUTES=30
|
||||
MIN_TRAINING_DATA_DAYS=30
|
||||
PROPHET_SEASONALITY_MODE=additive
|
||||
|
||||
# Prediction caching
|
||||
PREDICTION_CACHE_TTL_HOURS=6
|
||||
|
||||
# ================================================================
|
||||
# SECURITY CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Password requirements
|
||||
PASSWORD_MIN_LENGTH=8
|
||||
MAX_LOGIN_ATTEMPTS=5
|
||||
LOCKOUT_DURATION_MINUTES=30
|
||||
|
||||
# Rate limiting
|
||||
RATE_LIMIT_CALLS_PER_MINUTE=60
|
||||
RATE_LIMIT_BURST=10
|
||||
|
||||
# Session configuration
|
||||
# JWT Configuration (CHANGE IN PRODUCTION!)
|
||||
JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-very-long-and-secure
|
||||
JWT_ALGORITHM=HS256
|
||||
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
JWT_REFRESH_TOKEN_EXPIRE_DAYS=7
|
||||
|
||||
# Service-to-Service Authentication
|
||||
SERVICE_API_KEY=service-api-key-change-in-production
|
||||
ENABLE_SERVICE_AUTH=false
|
||||
|
||||
# Password Requirements
|
||||
PASSWORD_MIN_LENGTH=8
|
||||
PASSWORD_REQUIRE_UPPERCASE=true
|
||||
PASSWORD_REQUIRE_LOWERCASE=true
|
||||
PASSWORD_REQUIRE_NUMBERS=true
|
||||
PASSWORD_REQUIRE_SYMBOLS=false
|
||||
|
||||
# Security Settings
|
||||
BCRYPT_ROUNDS=12
|
||||
MAX_LOGIN_ATTEMPTS=5
|
||||
LOCKOUT_DURATION_MINUTES=30
|
||||
|
||||
# ================================================================
|
||||
# MONITORING CONFIGURATION
|
||||
# CORS & API CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Log levels: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||
LOG_LEVEL=INFO
|
||||
CORS_ORIGINS=http://localhost:3000,http://localhost:3001,http://127.0.0.1:3000
|
||||
CORS_ALLOW_CREDENTIALS=true
|
||||
|
||||
# Service versions
|
||||
SERVICE_VERSION=1.0.0
|
||||
# Rate Limiting
|
||||
RATE_LIMIT_ENABLED=true
|
||||
RATE_LIMIT_REQUESTS=100
|
||||
RATE_LIMIT_WINDOW=60
|
||||
RATE_LIMIT_BURST=10
|
||||
|
||||
# Data retention
|
||||
DATA_RETENTION_DAYS=365
|
||||
# API Documentation
|
||||
API_DOCS_ENABLED=true
|
||||
|
||||
# ================================================================
|
||||
# SERVICE URLS
|
||||
# ================================================================
|
||||
|
||||
GATEWAY_URL=http://gateway:8000
|
||||
AUTH_SERVICE_URL=http://auth-service:8000
|
||||
TRAINING_SERVICE_URL=http://training-service:8000
|
||||
FORECASTING_SERVICE_URL=http://forecasting-service:8000
|
||||
DATA_SERVICE_URL=http://data-service:8000
|
||||
TENANT_SERVICE_URL=http://tenant-service:8000
|
||||
NOTIFICATION_SERVICE_URL=http://notification-service:8000
|
||||
|
||||
# HTTP Client Settings
|
||||
HTTP_TIMEOUT=30
|
||||
HTTP_RETRIES=3
|
||||
HTTP_RETRY_DELAY=1.0
|
||||
|
||||
# ================================================================
|
||||
# EXTERNAL APIS & INTEGRATIONS
|
||||
# ================================================================
|
||||
|
||||
# Spanish Weather Service (AEMET)
|
||||
AEMET_API_KEY=your-aemet-api-key-here
|
||||
AEMET_TIMEOUT=30
|
||||
AEMET_RETRY_ATTEMPTS=3
|
||||
|
||||
# Madrid Open Data Platform
|
||||
MADRID_OPENDATA_API_KEY=your-madrid-opendata-key-here
|
||||
MADRID_OPENDATA_TIMEOUT=30
|
||||
|
||||
# Email Configuration (Gmail example)
|
||||
SMTP_HOST=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=your-email@gmail.com
|
||||
SMTP_PASSWORD=your-email-app-password
|
||||
SMTP_TLS=true
|
||||
SMTP_SSL=false
|
||||
DEFAULT_FROM_EMAIL=noreply@bakeryforecast.es
|
||||
DEFAULT_FROM_NAME=Bakery Forecast
|
||||
|
||||
# WhatsApp API (Twilio example)
|
||||
WHATSAPP_API_KEY=your-whatsapp-api-key-here
|
||||
WHATSAPP_BASE_URL=https://api.twilio.com
|
||||
WHATSAPP_FROM_NUMBER=whatsapp:+14155238886
|
||||
|
||||
# ================================================================
|
||||
# ML & AI CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Model Storage
|
||||
MODEL_STORAGE_PATH=/app/models
|
||||
MODEL_STORAGE_BACKEND=local
|
||||
MODEL_BACKUP_ENABLED=true
|
||||
MODEL_VERSIONING_ENABLED=true
|
||||
|
||||
# Training Configuration
|
||||
MAX_TRAINING_TIME_MINUTES=30
|
||||
MAX_CONCURRENT_TRAINING_JOBS=3
|
||||
MIN_TRAINING_DATA_DAYS=30
|
||||
TRAINING_BATCH_SIZE=1000
|
||||
|
||||
# Prophet Configuration
|
||||
PROPHET_SEASONALITY_MODE=additive
|
||||
PROPHET_CHANGEPOINT_PRIOR_SCALE=0.05
|
||||
PROPHET_SEASONALITY_PRIOR_SCALE=10.0
|
||||
PROPHET_HOLIDAYS_PRIOR_SCALE=10.0
|
||||
|
||||
# Prediction Caching
|
||||
PREDICTION_CACHE_TTL_HOURS=6
|
||||
WEATHER_CACHE_TTL_HOURS=1
|
||||
TRAFFIC_CACHE_TTL_HOURS=1
|
||||
TRAFFIC_CACHE_TTL_HOURS=1
|
||||
|
||||
# ================================================================
|
||||
# BUSINESS CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Forecasting Limits
|
||||
MAX_FORECAST_DAYS=30
|
||||
MIN_HISTORICAL_DAYS=60
|
||||
PREDICTION_CONFIDENCE_THRESHOLD=0.8
|
||||
|
||||
# Spanish Business Context
|
||||
TIMEZONE=Europe/Madrid
|
||||
LOCALE=es_ES.UTF-8
|
||||
CURRENCY=EUR
|
||||
BUSINESS_HOUR_START=7
|
||||
BUSINESS_HOUR_END=20
|
||||
|
||||
# Spanish Holidays & Seasonal Adjustments
|
||||
ENABLE_SPANISH_HOLIDAYS=true
|
||||
ENABLE_MADRID_HOLIDAYS=true
|
||||
SCHOOL_CALENDAR_ENABLED=true
|
||||
|
||||
# Weather Impact Modeling
|
||||
WEATHER_IMPACT_ENABLED=true
|
||||
TEMPERATURE_THRESHOLD_COLD=10.0
|
||||
TEMPERATURE_THRESHOLD_HOT=30.0
|
||||
RAIN_IMPACT_FACTOR=0.7
|
||||
|
||||
# Business Adjustments
|
||||
WEEKEND_ADJUSTMENT_FACTOR=0.8
|
||||
HOLIDAY_ADJUSTMENT_FACTOR=0.5
|
||||
|
||||
# ================================================================
|
||||
# TENANT & SUBSCRIPTION CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Default Settings
|
||||
DEFAULT_PLAN=basic
|
||||
TRIAL_PERIOD_DAYS=14
|
||||
|
||||
# Plan Limits
|
||||
BASIC_PLAN_LOCATIONS=1
|
||||
BASIC_PLAN_PREDICTIONS_PER_DAY=100
|
||||
BASIC_PLAN_DATA_RETENTION_DAYS=90
|
||||
|
||||
PREMIUM_PLAN_LOCATIONS=5
|
||||
PREMIUM_PLAN_PREDICTIONS_PER_DAY=1000
|
||||
PREMIUM_PLAN_DATA_RETENTION_DAYS=365
|
||||
|
||||
ENTERPRISE_PLAN_LOCATIONS=50
|
||||
ENTERPRISE_PLAN_PREDICTIONS_PER_DAY=10000
|
||||
ENTERPRISE_PLAN_DATA_RETENTION_DAYS=1095
|
||||
|
||||
# Billing (disabled by default)
|
||||
BILLING_ENABLED=false
|
||||
BILLING_CURRENCY=EUR
|
||||
BILLING_CYCLE_DAYS=30
|
||||
SPANISH_TAX_RATE=0.21
|
||||
|
||||
# Resource Limits
|
||||
MAX_API_CALLS_PER_MINUTE=100
|
||||
MAX_STORAGE_MB=1024
|
||||
MAX_CONCURRENT_REQUESTS=10
|
||||
|
||||
# ================================================================
|
||||
# MONITORING & OBSERVABILITY
|
||||
# ================================================================
|
||||
|
||||
# Logging Configuration
|
||||
LOG_FORMAT=json
|
||||
LOG_FILE_ENABLED=false
|
||||
LOG_FILE_PATH=/app/logs
|
||||
LOG_ROTATION_SIZE=100MB
|
||||
LOG_RETENTION_DAYS=30
|
||||
|
||||
# Metrics & Monitoring
|
||||
PROMETHEUS_ENABLED=true
|
||||
PROMETHEUS_PORT=9090
|
||||
|
||||
# Tracing (disabled by default)
|
||||
JAEGER_ENABLED=false
|
||||
JAEGER_AGENT_HOST=localhost
|
||||
JAEGER_AGENT_PORT=6831
|
||||
|
||||
# Health Checks
|
||||
HEALTH_CHECK_TIMEOUT=30
|
||||
HEALTH_CHECK_INTERVAL=30
|
||||
|
||||
# ================================================================
|
||||
# DATA RETENTION & CLEANUP
|
||||
# ================================================================
|
||||
|
||||
DATA_RETENTION_DAYS=365
|
||||
LOG_RETENTION_DAYS=90
|
||||
METRIC_RETENTION_DAYS=90
|
||||
TEMP_FILE_CLEANUP_HOURS=24
|
||||
|
||||
# Service-specific Data Retention
|
||||
AUTH_DATA_RETENTION_DAYS=365
|
||||
RAW_DATA_RETENTION_DAYS=90
|
||||
PROCESSED_DATA_RETENTION_DAYS=365
|
||||
|
||||
# ================================================================
|
||||
# DEVELOPMENT & TESTING
|
||||
# ================================================================
|
||||
|
||||
# Development Features
|
||||
AUTO_RELOAD=false
|
||||
PROFILING_ENABLED=false
|
||||
MOCK_EXTERNAL_APIS=false
|
||||
|
||||
# Testing Configuration
|
||||
TESTING=false
|
||||
TEST_DATABASE_URL=postgresql+asyncpg://test_user:test_pass@test-db:5432/test_db
|
||||
|
||||
# Data Collection Intervals
|
||||
WEATHER_COLLECTION_INTERVAL_HOURS=1
|
||||
TRAFFIC_COLLECTION_INTERVAL_HOURS=1
|
||||
EVENTS_COLLECTION_INTERVAL_HOURS=6
|
||||
|
||||
# Data Quality
|
||||
DATA_VALIDATION_ENABLED=true
|
||||
OUTLIER_DETECTION_ENABLED=true
|
||||
DATA_COMPLETENESS_THRESHOLD=0.8
|
||||
|
||||
# Geolocation (Madrid, Spain)
|
||||
DEFAULT_LATITUDE=40.4168
|
||||
DEFAULT_LONGITUDE=-3.7038
|
||||
LOCATION_RADIUS_KM=50.0
|
||||
|
||||
# ================================================================
|
||||
# NOTIFICATION CONFIGURATION
|
||||
# ================================================================
|
||||
|
||||
# Notification Types
|
||||
ENABLE_EMAIL_NOTIFICATIONS=true
|
||||
ENABLE_WHATSAPP_NOTIFICATIONS=true
|
||||
ENABLE_PUSH_NOTIFICATIONS=false
|
||||
|
||||
# Notification Queuing
|
||||
MAX_RETRY_ATTEMPTS=3
|
||||
RETRY_DELAY_SECONDS=60
|
||||
NOTIFICATION_BATCH_SIZE=100
|
||||
|
||||
# Rate Limiting
|
||||
EMAIL_RATE_LIMIT_PER_HOUR=1000
|
||||
WHATSAPP_RATE_LIMIT_PER_HOUR=100
|
||||
|
||||
# Localization
|
||||
DEFAULT_LANGUAGE=es
|
||||
DATE_FORMAT=%d/%m/%Y
|
||||
TIME_FORMAT=%H:%M
|
||||
|
||||
# Templates
|
||||
EMAIL_TEMPLATES_PATH=/app/templates/email
|
||||
WHATSAPP_TEMPLATES_PATH=/app/templates/whatsapp
|
||||
|
||||
# Delivery & Analytics
|
||||
IMMEDIATE_DELIVERY=true
|
||||
SCHEDULED_DELIVERY_ENABLED=true
|
||||
DELIVERY_TRACKING_ENABLED=true
|
||||
OPEN_TRACKING_ENABLED=true
|
||||
CLICK_TRACKING_ENABLED=true
|
||||
|
||||
# ================================================================
|
||||
# COMPLIANCE & GDPR
|
||||
# ================================================================
|
||||
|
||||
# GDPR Compliance
|
||||
GDPR_COMPLIANCE_ENABLED=true
|
||||
CONSENT_REQUIRED=true
|
||||
DATA_EXPORT_ENABLED=true
|
||||
DATA_DELETION_ENABLED=true
|
||||
PRIVACY_POLICY_URL=/privacy
|
||||
|
||||
# Email Verification
|
||||
EMAIL_VERIFICATION_REQUIRED=true
|
||||
EMAIL_VERIFICATION_EXPIRE_HOURS=24
|
||||
|
||||
# Account Security
|
||||
ACCOUNT_LOCKOUT_ENABLED=true
|
||||
PASSWORD_HISTORY_COUNT=5
|
||||
SESSION_TIMEOUT_MINUTES=60
|
||||
CONCURRENT_SESSIONS_LIMIT=3
|
||||
|
||||
# ================================================================
|
||||
# PERFORMANCE & OPTIMIZATION
|
||||
# ================================================================
|
||||
|
||||
# Caching
|
||||
REALTIME_FORECASTING_ENABLED=true
|
||||
FORECAST_UPDATE_INTERVAL_HOURS=6
|
||||
|
||||
# Batch Processing
|
||||
BATCH_PROCESSING_ENABLED=true
|
||||
BATCH_SIZE=1000
|
||||
PARALLEL_PROCESSING_WORKERS=4
|
||||
FORECAST_BATCH_SIZE=100
|
||||
|
||||
# Circuit Breaker (Gateway)
|
||||
CIRCUIT_BREAKER_ENABLED=true
|
||||
CIRCUIT_BREAKER_FAILURE_THRESHOLD=5
|
||||
CIRCUIT_BREAKER_RECOVERY_TIMEOUT=60
|
||||
|
||||
# Load Balancing (Gateway)
|
||||
ENABLE_LOAD_BALANCING=true
|
||||
LOAD_BALANCER_ALGORITHM=round_robin
|
||||
|
||||
# Request Limits
|
||||
MAX_REQUEST_SIZE=10485760
|
||||
REQUEST_TIMEOUT=30
|
||||
|
||||
# ================================================================
|
||||
# BUSINESS INTELLIGENCE & ALERTS
|
||||
# ================================================================
|
||||
|
||||
# Alert Thresholds
|
||||
HIGH_DEMAND_THRESHOLD=1.5
|
||||
LOW_DEMAND_THRESHOLD=0.5
|
||||
STOCKOUT_RISK_THRESHOLD=0.9
|
||||
|
||||
# Model Validation
|
||||
CROSS_VALIDATION_ENABLED=true
|
||||
VALIDATION_SPLIT_RATIO=0.2
|
||||
MIN_MODEL_ACCURACY=0.7
|
||||
|
||||
# Data Processing
|
||||
DATA_PREPROCESSING_ENABLED=true
|
||||
SEASONAL_DECOMPOSITION_ENABLED=true
|
||||
|
||||
# Distributed Training (Future scaling)
|
||||
DISTRIBUTED_TRAINING_ENABLED=false
|
||||
TRAINING_WORKER_COUNT=1
|
||||
|
||||
# Support & Contact
|
||||
SUPPORT_EMAIL=soporte@bakeryforecast.es
|
||||
INVOICE_LANGUAGE=es
|
||||
Reference in New Issue
Block a user