# ================================================================ # BAKERY FORECASTING PLATFORM - ENVIRONMENT CONFIGURATION # Single source of truth - no duplication with docker-compose.yml # ================================================================ # ================================================================ # ENVIRONMENT & BUILD SETTINGS # ================================================================ # Environment: development, staging, production, testing ENVIRONMENT=development DEBUG=true LOG_LEVEL=INFO # Build configuration BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") IMAGE_TAG=latest DOMAIN=localhost # ================================================================ # SERVICE PORTS (used by Docker Compose) # ================================================================ # Core services GATEWAY_PORT=8000 AUTH_SERVICE_PORT=8001 TRAINING_SERVICE_PORT=8002 FORECASTING_SERVICE_PORT=8003 DATA_SERVICE_PORT=8004 TENANT_SERVICE_PORT=8005 NOTIFICATION_SERVICE_PORT=8006 # Frontend DASHBOARD_PORT=3000 MARKETING_PORT=3001 # Infrastructure REDIS_PORT=6379 RABBITMQ_PORT=5672 RABBITMQ_MANAGEMENT_PORT=15672 # Monitoring PROMETHEUS_PORT=9090 GRAFANA_PORT=3002 # Development tools PGADMIN_PORT=5050 REDIS_COMMANDER_PORT=8081 # ================================================================ # CORE SERVICE SETTINGS (used by applications) # ================================================================ # Application metadata SERVICE_VERSION=1.0.0 TIMEZONE=Europe/Madrid LOCALE=es_ES.UTF-8 CURRENCY=EUR # ================================================================ # DATABASE CONFIGURATION # ================================================================ # PostgreSQL common settings POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=es_ES.UTF-8 --lc-ctype=es_ES.UTF-8 # Auth Database AUTH_DB_NAME=auth_db AUTH_DB_USER=auth_user AUTH_DB_PASSWORD=auth_pass123 AUTH_DATABASE_URL=postgresql+asyncpg://auth_user:auth_pass123@auth-db:5432/auth_db # Training Database TRAINING_DB_NAME=training_db TRAINING_DB_USER=training_user TRAINING_DB_PASSWORD=training_pass123 TRAINING_DATABASE_URL=postgresql+asyncpg://training_user:training_pass123@training-db:5432/training_db # Forecasting Database FORECASTING_DB_NAME=forecasting_db FORECASTING_DB_USER=forecasting_user FORECASTING_DB_PASSWORD=forecasting_pass123 FORECASTING_DATABASE_URL=postgresql+asyncpg://forecasting_user:forecasting_pass123@forecasting-db:5432/forecasting_db # Data Database DATA_DB_NAME=data_db DATA_DB_USER=data_user DATA_DB_PASSWORD=data_pass123 DATA_DATABASE_URL=postgresql+asyncpg://data_user:data_pass123@data-db:5432/data_db # Tenant Database TENANT_DB_NAME=tenant_db TENANT_DB_USER=tenant_user TENANT_DB_PASSWORD=tenant_pass123 TENANT_DATABASE_URL=postgresql+asyncpg://tenant_user:tenant_pass123@tenant-db:5432/tenant_db # Notification Database NOTIFICATION_DB_NAME=notification_db NOTIFICATION_DB_USER=notification_user NOTIFICATION_DB_PASSWORD=notification_pass123 NOTIFICATION_DATABASE_URL=postgresql+asyncpg://notification_user:notification_pass123@notification-db:5432/notification_db # ================================================================ # REDIS CONFIGURATION # ================================================================ REDIS_PASSWORD=redis_pass123 REDIS_MAX_MEMORY=512mb REDIS_URL=redis://:redis_pass123@redis:6379 REDIS_MAX_CONNECTIONS=50 # Redis Database Assignments (used by standardized config) # 0 - Auth Service # 1 - Training Service # 2 - Forecasting Service # 3 - Data Service # 4 - Tenant Service # 5 - Notification Service # 6 - Gateway Service # ================================================================ # RABBITMQ CONFIGURATION # ================================================================ RABBITMQ_USER=bakery RABBITMQ_PASSWORD=forecast123 RABBITMQ_VHOST=/ RABBITMQ_ERLANG_COOKIE=bakery-secret-cookie-change-in-production RABBITMQ_URL=amqp://bakery:forecast123@rabbitmq:5672/ RABBITMQ_EXCHANGE=bakery_events RABBITMQ_QUEUE_PREFIX=bakery # ================================================================ # AUTHENTICATION & SECURITY # ================================================================ # JWT Configuration (CHANGE IN PRODUCTION!) JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-min-32-characters-long 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 # ================================================================ # CORS & API CONFIGURATION # ================================================================ CORS_ORIGINS=http://localhost:3000,http://localhost:3001,http://127.0.0.1:3000,https://panaderia.vercel.app CORS_ALLOW_CREDENTIALS=true # Rate Limiting RATE_LIMIT_ENABLED=true RATE_LIMIT_REQUESTS=100 RATE_LIMIT_WINDOW=60 RATE_LIMIT_BURST=10 # API Documentation API_DOCS_ENABLED=true # ================================================================ # SERVICE DISCOVERY URLS (used by standardized config) # ================================================================ GATEWAY_URL=http://gateway:8000 AUTH_SERVICE_URL=http://auth-service:8000 TENANT_SERVICE_URL=http://tenant-service:8000 TRAINING_SERVICE_URL=http://training-service:8000 FORECASTING_SERVICE_URL=http://forecasting-service:8000 DATA_SERVICE_URL=http://data-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 # ================================================================ # Spanish Weather Service (AEMET) AEMET_API_KEY=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1YWxmYXJvQGdtYWlsLmNvbSIsImp0aSI6ImRjZWVmNTEwLTdmYzEtNGMxNy1hODZkLWQ4NzdlZDc5ZDllNyIsImlzcyI6IkFFTUVUIiwiaWF0IjoxNzUyODMwMDg3LCJ1c2VySWQiOiJkY2VlZjUxMC03ZmMxLTRjMTctYTg2ZC1kODc3ZWQ3OWQ5ZTciLCJyb2xlIjoiIn0.C047gaiEhWhH4ItDgkHSwg8HzKTzw87TOPRTRf8j-2w AEMET_BASE_URL=https://opendata.aemet.es/opendata AEMET_TIMEOUT=30 AEMET_RETRY_ATTEMPTS=3 # Madrid Open Data Platform MADRID_OPENDATA_API_KEY=your-madrid-opendata-key-here MADRID_OPENDATA_BASE_URL=https://datos.madrid.es MADRID_OPENDATA_TIMEOUT=30 # ================================================================ # EMAIL CONFIGURATION # ================================================================ SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_USER=your-email@gmail.com SMTP_PASSWORD=your-app-specific-password SMTP_TLS=true SMTP_SSL=false DEFAULT_FROM_EMAIL=noreply@bakeryforecast.es DEFAULT_FROM_NAME=Bakery Forecast # ================================================================ # WHATSAPP/TWILIO CONFIGURATION # ================================================================ 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 # Resource Limits (used by Docker Compose) TRAINING_MEMORY_LIMIT=2G TRAINING_CPU_LIMIT=1.5 # 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 # ================================================================ # BUSINESS CONFIGURATION # ================================================================ # Forecasting Limits MAX_FORECAST_DAYS=30 MIN_HISTORICAL_DAYS=60 PREDICTION_CONFIDENCE_THRESHOLD=0.8 # Spanish Business Context 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_RETENTION=200h # Health Checks HEALTH_CHECK_TIMEOUT=30 HEALTH_CHECK_INTERVAL=30 # Grafana Configuration GRAFANA_ADMIN_USER=admin GRAFANA_ADMIN_PASSWORD=admin123 GRAFANA_SECRET_KEY=grafana-secret-key-change-in-production GRAFANA_ROOT_URL=http://localhost:3002/ # ================================================================ # DATA RETENTION & CLEANUP # ================================================================ DATA_RETENTION_DAYS=365 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 # ================================================================ # FRONTEND CONFIGURATION # ================================================================ # Frontend URLs (used by Docker Compose build args) FRONTEND_API_URL=http://localhost:8000/api/v1 FRONTEND_WS_URL=ws://localhost:8000/ws # ================================================================ # DEVELOPMENT TOOLS CONFIGURATION # ================================================================ # pgAdmin PGADMIN_EMAIL=admin@bakery.local PGADMIN_PASSWORD=admin123 # Redis Commander REDIS_COMMANDER_USER=admin REDIS_COMMANDER_PASSWORD=admin123 # ================================================================ # 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 # ================================================================ # NOTES FOR CONFIGURATION MANAGEMENT # ================================================================ # This .env file is the SINGLE SOURCE OF TRUTH for all configuration. # Docker Compose uses these variables via ${VARIABLE_NAME} substitution. # Application services load these via env_file: .env in docker-compose.yml # No duplication between .env and docker-compose.yml environment sections. # To override for different environments: # 1. Copy this file: cp .env .env.production # 2. Modify values in .env.production # 3. Use: docker-compose --env-file .env.production up -d # For sensitive values in production: # 1. Use Docker secrets or external secret management # 2. Override via environment variables: REDIS_PASSWORD=secret docker-compose up # 3. Use .env.local (gitignored) for local overrides