diff --git a/.env.sample b/.env.sample deleted file mode 100644 index be94b57e..00000000 --- a/.env.sample +++ /dev/null @@ -1,531 +0,0 @@ -# ================================================================ -# 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 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 36bacf2e..0d71335a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,8 +27,6 @@ volumes: grafana_data: model_storage: log_storage: - nominatim_db_data: - nominatim_data: # ================================================================ @@ -592,9 +590,9 @@ services: context: ./frontend dockerfile: Dockerfile.${ENVIRONMENT} args: - - REACT_APP_API_URL=${FRONTEND_API_URL} - - REACT_APP_WS_URL=${FRONTEND_WS_URL} - - REACT_APP_ENVIRONMENT=${ENVIRONMENT} + - NEXT_PUBLIC_API_URL=${FRONTEND_API_URL} + - NEXT_PUBLIC_WS_URL=${FRONTEND_WS_URL} + - NEXT_PUBLIC_ENVIRONMENT=${ENVIRONMENT} image: bakery/dashboard:${IMAGE_TAG} container_name: bakery-dashboard restart: unless-stopped diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/frontend/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/frontend/src/api/base/apiClient.ts b/frontend/src/api/base/apiClient.ts index eca97c19..56b99638 100644 --- a/frontend/src/api/base/apiClient.ts +++ b/frontend/src/api/base/apiClient.ts @@ -320,5 +320,5 @@ class ApiClient { // FIXED: Create default instance with correct base URL (removed /api suffix) export const apiClient = new ApiClient({ - baseURL: process.env.REACT_APP_API_URL || 'http://localhost:8000/api/v1' + baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000/api/v1' }); \ No newline at end of file diff --git a/frontend/src/api/websocket/WebSocketManager.ts b/frontend/src/api/websocket/WebSocketManager.ts index 06cf8c6e..d969911b 100644 --- a/frontend/src/api/websocket/WebSocketManager.ts +++ b/frontend/src/api/websocket/WebSocketManager.ts @@ -216,13 +216,13 @@ class WebSocketManager extends EventEmitter { private getWebSocketBaseUrl(): string { if (typeof window !== 'undefined') { // Check if window is defined const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; - const host = process.env.REACT_APP_WS_URL || window.location.host; + const host = process.env.NEXT_PUBLIC_WS_URL || window.location.host; return `${protocol}//${host}/ws`; } else { // Provide a fallback for server-side or non-browser environments // You might want to get this from environment variables or a config file // depending on your setup. - return process.env.REACT_APP_WS_URL || 'ws://localhost:3000/ws'; + return process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:3000/ws'; } }