diff --git a/.env b/.env index 947333c..46b6f37 100644 --- a/.env +++ b/.env @@ -4,7 +4,7 @@ # Core Application Settings NODE_ENV=development -LOG_LEVEL=info +LOG_LEVEL=debug # Data Service Configuration DATA_SERVICE_PORT=2001 diff --git a/.env.complete b/.env.complete deleted file mode 100644 index 4aea194..0000000 --- a/.env.complete +++ /dev/null @@ -1,242 +0,0 @@ -# ======================================================================= -# Stock Bot Platform Environment Configuration -# ======================================================================= - -# Core Application Settings -NODE_ENV=development -PORT=3001 -APP_NAME=stock-bot -APP_VERSION=1.0.0 - -# ======================================================================= -# DATABASE CONFIGURATIONS -# ======================================================================= - -# PostgreSQL - Operational Data (orders, positions, strategies) -POSTGRES_HOST=localhost -POSTGRES_PORT=5432 -POSTGRES_DATABASE=trading_bot -POSTGRES_USERNAME=trading_user -POSTGRES_PASSWORD=trading_pass_dev -DB_HOST=localhost -DB_PORT=5432 -DB_NAME=trading_bot -DB_USER=trading_user -DB_PASSWORD=trading_pass_dev -DB_POOL_MIN=2 -DB_POOL_MAX=10 -DB_POOL_IDLE_TIMEOUT=30000 -DB_SSL=false -DB_SSL_REJECT_UNAUTHORIZED=true -DB_QUERY_TIMEOUT=30000 -DB_CONNECTION_TIMEOUT=5000 - -# QuestDB - Time-series Data (OHLCV, indicators, performance) -QUESTDB_HOST=localhost -QUESTDB_HTTP_PORT=9000 -QUESTDB_PG_PORT=8812 -QUESTDB_INFLUX_PORT=9009 -QUESTDB_USER= -QUESTDB_PASSWORD= -QUESTDB_CONNECTION_TIMEOUT=5000 -QUESTDB_REQUEST_TIMEOUT=30000 -QUESTDB_RETRY_ATTEMPTS=3 -QUESTDB_TLS_ENABLED=false -QUESTDB_DEFAULT_DATABASE=qdb -QUESTDB_TELEMETRY_ENABLED=false - -# MongoDB - Document Storage (sentiment, raw docs, unstructured data) -MONGODB_HOST=localhost -MONGODB_PORT=27017 -MONGODB_DATABASE=trading_documents -MONGODB_USERNAME=trading_admin -MONGODB_PASSWORD=trading_mongo_dev -MONGODB_AUTH_SOURCE=admin -MONGODB_URI= -MONGODB_MAX_POOL_SIZE=10 -MONGODB_MIN_POOL_SIZE=0 -MONGODB_MAX_IDLE_TIME=30000 -MONGODB_CONNECT_TIMEOUT=10000 -MONGODB_SOCKET_TIMEOUT=30000 -MONGODB_SERVER_SELECTION_TIMEOUT=5000 -MONGODB_TLS=false -MONGODB_RETRY_WRITES=true -MONGODB_JOURNAL=true -MONGODB_READ_PREFERENCE=primary -MONGODB_WRITE_CONCERN=majority - -# Dragonfly - Redis Replacement (caching and events) -DRAGONFLY_HOST=localhost -DRAGONFLY_PORT=6379 -DRAGONFLY_PASSWORD= -DRAGONFLY_USERNAME= -DRAGONFLY_DATABASE=0 -DRAGONFLY_MAX_RETRIES=3 -DRAGONFLY_RETRY_DELAY=50 -DRAGONFLY_CONNECT_TIMEOUT=10000 -DRAGONFLY_COMMAND_TIMEOUT=5000 -DRAGONFLY_POOL_SIZE=10 -DRAGONFLY_POOL_MIN=1 -DRAGONFLY_POOL_MAX=20 -DRAGONFLY_TLS=false -DRAGONFLY_ENABLE_KEEPALIVE=true -DRAGONFLY_KEEPALIVE_INTERVAL=60 -DRAGONFLY_CLUSTER_MODE=false -DRAGONFLY_CLUSTER_NODES= -DRAGONFLY_MAX_MEMORY=2gb -DRAGONFLY_CACHE_MODE=true - -# ======================================================================= -# MONITORING & LOGGING CONFIGURATIONS -# ======================================================================= - -# Logging Configuration -LOG_LEVEL=debug -LOG_FORMAT=json -LOG_CONSOLE=true -LOG_FILE=false -LOG_FILE_PATH=logs -LOG_FILE_MAX_SIZE=20m -LOG_FILE_MAX_FILES=14 -LOG_FILE_DATE_PATTERN=YYYY-MM-DD -LOG_ERROR_FILE=true -LOG_ERROR_STACK=true -LOG_PERFORMANCE=false -LOG_SQL_QUERIES=false -LOG_HTTP_REQUESTS=true -LOG_STRUCTURED=true -LOG_TIMESTAMP=true -LOG_CALLER_INFO=false -LOG_SILENT_MODULES= -LOG_VERBOSE_MODULES= -LOG_SERVICE_NAME=stock-bot -LOG_SERVICE_VERSION=1.0.0 -LOG_ENVIRONMENT=development - -# Loki - Log Aggregation -LOKI_HOST=localhost -LOKI_PORT=3100 -LOKI_URL= -LOKI_USERNAME= -LOKI_PASSWORD= -LOKI_TENANT_ID= -LOKI_PUSH_TIMEOUT=10000 -LOKI_BATCH_SIZE=1024 -LOKI_BATCH_WAIT=1000 -LOKI_RETENTION_PERIOD=30d -LOKI_MAX_CHUNK_AGE=1h -LOKI_TLS_ENABLED=false -LOKI_TLS_INSECURE=false -LOKI_DEFAULT_LABELS= -LOKI_SERVICE_LABEL=stock-bot -LOKI_ENVIRONMENT_LABEL=development - -# Prometheus - Metrics Collection -PROMETHEUS_HOST=localhost -PROMETHEUS_PORT=9090 -PROMETHEUS_URL= -PROMETHEUS_USERNAME= -PROMETHEUS_PASSWORD= -PROMETHEUS_SCRAPE_INTERVAL=15s -PROMETHEUS_EVALUATION_INTERVAL=15s -PROMETHEUS_RETENTION_TIME=15d -PROMETHEUS_TLS_ENABLED=false -PROMETHEUS_TLS_INSECURE=false - -# Grafana - Visualization -GRAFANA_HOST=localhost -GRAFANA_PORT=3000 -GRAFANA_URL= -GRAFANA_ADMIN_USER=admin -GRAFANA_ADMIN_PASSWORD=admin -GRAFANA_ALLOW_SIGN_UP=false -GRAFANA_SECRET_KEY= -GRAFANA_DATABASE_TYPE=sqlite3 -GRAFANA_DATABASE_URL= -GRAFANA_DISABLE_GRAVATAR=true -GRAFANA_ENABLE_GZIP=true - -# ======================================================================= -# DATA PROVIDER CONFIGURATIONS -# ======================================================================= - -# Default Data Provider -DEFAULT_DATA_PROVIDER=alpaca - -# Alpaca Markets -ALPACA_ENABLED=true -ALPACA_API_KEY=your_alpaca_key_here -ALPACA_SECRET_KEY=your_alpaca_secret_here -ALPACA_BASE_URL=https://paper-api.alpaca.markets -ALPACA_DATA_URL=https://data.alpaca.markets -ALPACA_PAPER_TRADING=true - -# Polygon.io -POLYGON_ENABLED=false -POLYGON_API_KEY=your_polygon_key_here -POLYGON_BASE_URL=https://api.polygon.io - -# Yahoo Finance -YAHOO_ENABLED=true -YAHOO_BASE_URL=https://query1.finance.yahoo.com - -# IEX Cloud -IEX_ENABLED=false -IEX_API_KEY=your_iex_key_here -IEX_BASE_URL=https://cloud.iexapis.com - -# Alpha Vantage -ALPHA_VANTAGE_ENABLED=false -ALPHA_VANTAGE_API_KEY=demo - -# Data Provider Settings -DATA_PROVIDER_TIMEOUT=30000 -DATA_PROVIDER_RETRIES=3 -DATA_PROVIDER_RETRY_DELAY=1000 -DATA_CACHE_ENABLED=true -DATA_CACHE_TTL=300 -DATA_CACHE_MAX_SIZE=1000 - -# ======================================================================= -# TRADING & RISK MANAGEMENT -# ======================================================================= - -# Trading Configuration -PAPER_TRADING=true -MAX_POSITION_SIZE=0.1 -MAX_DAILY_LOSS=1000 - -# Risk Management -RISK_MAX_POSITION_SIZE=0.25 -RISK_MAX_LEVERAGE=2.0 -RISK_DEFAULT_STOP_LOSS=0.02 -RISK_DEFAULT_TAKE_PROFIT=0.06 -RISK_MAX_DRAWDOWN=0.10 -RISK_MAX_CONSECUTIVE_LOSSES=5 -RISK_POSITION_SIZING_METHOD=fixed_percentage -RISK_CIRCUIT_BREAKER_ENABLED=true -RISK_CIRCUIT_BREAKER_THRESHOLD=0.05 -RISK_CIRCUIT_BREAKER_COOLDOWN=3600000 -RISK_ALLOW_WEEKEND_TRADING=false -RISK_MARKET_HOURS_ONLY=true - -# ======================================================================= -# FEATURE FLAGS -# ======================================================================= -ENABLE_ML_SIGNALS=false -ENABLE_SENTIMENT_ANALYSIS=false -ENABLE_SOCIAL_SIGNALS=false -ENABLE_OPTIONS_TRADING=false -ENABLE_CRYPTO_TRADING=false -ENABLE_BACKTESTING=true -ENABLE_PAPER_TRADING=true -ENABLE_LIVE_TRADING=false - -# ======================================================================= -# DEVELOPMENT & DEBUGGING -# ======================================================================= -DEBUG_MODE=true -VERBOSE_LOGGING=true -MOCK_DATA_PROVIDERS=false -ENABLE_API_RATE_LIMITING=true -ENABLE_REQUEST_LOGGING=true diff --git a/.env.docker b/.env.docker deleted file mode 100644 index 4e8dceb..0000000 --- a/.env.docker +++ /dev/null @@ -1,144 +0,0 @@ -# Docker Environment Configuration -# This file contains environment variables used by Docker Compose - -# ============================================================================= -# CONTAINER NETWORK SETTINGS -# ============================================================================= -COMPOSE_PROJECT_NAME=stock-bot -NETWORK_NAME=trading-bot-network - -# ============================================================================= -# DATABASE CONTAINER SETTINGS -# ============================================================================= - -# PostgreSQL Container -POSTGRES_DB=trading_bot -POSTGRES_USER=trading_user -POSTGRES_PASSWORD=trading_pass_secure -POSTGRES_INITDB_ARGS=--encoding=UTF-8 - -# MongoDB Container -MONGO_INITDB_ROOT_USERNAME=trading_admin -MONGO_INITDB_ROOT_PASSWORD=trading_mongo_secure -MONGO_INITDB_DATABASE=trading_documents - -# QuestDB Container -QDB_TELEMETRY_ENABLED=false - -# Dragonfly Container -DRAGONFLY_MAXMEMORY=4gb -DRAGONFLY_PROACTOR_THREADS=8 - -# ============================================================================= -# MONITORING CONTAINER SETTINGS -# ============================================================================= - -# Grafana Container -GF_SECURITY_ADMIN_USER=admin -GF_SECURITY_ADMIN_PASSWORD=secure_grafana_password -GF_USERS_ALLOW_SIGN_UP=false -GF_PATHS_PROVISIONING=/etc/grafana/provisioning -GF_DISABLE_GRAVATAR=true - -# Prometheus Container -PROMETHEUS_CONFIG_FILE=/etc/prometheus/prometheus.yml -PROMETHEUS_STORAGE_PATH=/prometheus -PROMETHEUS_WEB_ENABLE_LIFECYCLE=true - -# ============================================================================= -# ADMIN INTERFACE CONTAINER SETTINGS -# ============================================================================= - -# PgAdmin Container -PGADMIN_DEFAULT_EMAIL=admin@tradingbot.local -PGADMIN_DEFAULT_PASSWORD=secure_pgadmin_password -PGADMIN_CONFIG_SERVER_MODE=False -PGADMIN_DISABLE_POSTFIX=true - -# Mongo Express Container -ME_CONFIG_MONGODB_ADMINUSERNAME=trading_admin -ME_CONFIG_MONGODB_ADMINPASSWORD=trading_mongo_secure -ME_CONFIG_MONGODB_SERVER=mongodb -ME_CONFIG_MONGODB_PORT=27017 -ME_CONFIG_BASICAUTH_USERNAME=admin -ME_CONFIG_BASICAUTH_PASSWORD=secure_mongo_express_password - -# Redis Insight Container -REDIS_HOSTS=local:dragonfly:6379 - -# ============================================================================= -# VOLUME MOUNT PATHS -# ============================================================================= - -# Data Volume Paths (adjust these for your host system) -POSTGRES_DATA_PATH=./data/postgres -QUESTDB_DATA_PATH=./data/questdb -MONGODB_DATA_PATH=./data/mongodb -DRAGONFLY_DATA_PATH=./data/dragonfly -PROMETHEUS_DATA_PATH=./data/prometheus -GRAFANA_DATA_PATH=./data/grafana -LOKI_DATA_PATH=./data/loki -PGADMIN_DATA_PATH=./data/pgadmin - -# Config Volume Paths -PROMETHEUS_CONFIG_PATH=./monitoring/prometheus -GRAFANA_CONFIG_PATH=./monitoring/grafana -LOKI_CONFIG_PATH=./monitoring/loki - -# Database Init Paths -POSTGRES_INIT_PATH=./database/postgres/init -MONGODB_INIT_PATH=./database/mongodb/init - -# ============================================================================= -# PORT MAPPINGS (HOST:CONTAINER) -# ============================================================================= - -# Database Ports -POSTGRES_PORT=5432 -QUESTDB_HTTP_PORT=9000 -QUESTDB_PG_PORT=8812 -QUESTDB_INFLUX_PORT=9009 -MONGODB_PORT=27017 -DRAGONFLY_PORT=6379 - -# Monitoring Ports -PROMETHEUS_PORT=9090 -GRAFANA_PORT=3000 -LOKI_PORT=3100 - -# Admin Interface Ports -PGADMIN_PORT=8080 -MONGO_EXPRESS_PORT=8081 -REDIS_INSIGHT_PORT=8001 - -# ============================================================================= -# HEALTH CHECK SETTINGS -# ============================================================================= - -# Health Check Intervals -HEALTHCHECK_INTERVAL=30s -HEALTHCHECK_TIMEOUT=10s -HEALTHCHECK_RETRIES=3 -HEALTHCHECK_START_PERIOD=60s - -# ============================================================================= -# RESOURCE LIMITS -# ============================================================================= - -# Memory Limits (uncomment and adjust for production) -# POSTGRES_MEMORY_LIMIT=2g -# QUESTDB_MEMORY_LIMIT=4g -# MONGODB_MEMORY_LIMIT=2g -# DRAGONFLY_MEMORY_LIMIT=4g -# PROMETHEUS_MEMORY_LIMIT=2g -# GRAFANA_MEMORY_LIMIT=512m -# LOKI_MEMORY_LIMIT=1g - -# CPU Limits (uncomment and adjust for production) -# POSTGRES_CPU_LIMIT=1 -# QUESTDB_CPU_LIMIT=2 -# MONGODB_CPU_LIMIT=1 -# DRAGONFLY_CPU_LIMIT=2 -# PROMETHEUS_CPU_LIMIT=1 -# GRAFANA_CPU_LIMIT=0.5 -# LOKI_CPU_LIMIT=1 diff --git a/.env.example b/.env.example deleted file mode 100644 index 3415413..0000000 --- a/.env.example +++ /dev/null @@ -1,43 +0,0 @@ -# Environment Configuration -NODE_ENV=development -PORT=3000 - -# Database Configuration -QUESTDB_HOST=localhost -QUESTDB_PORT=9000 -QUESTDB_DATABASE=qdb - -POSTGRES_HOST=localhost -POSTGRES_PORT=5432 -POSTGRES_DATABASE=stockbot -POSTGRES_USERNAME=postgres -POSTGRES_PASSWORD=password - -DRAGONFLY_HOST=localhost -DRAGONFLY_PORT=6379 -DRAGONFLY_PASSWORD= - -# API Keys (Add your actual keys here) -ALPHA_VANTAGE_API_KEY=demo -ALPACA_API_KEY=your_alpaca_key_here -ALPACA_SECRET_KEY=your_alpaca_secret_here - -# Trading Configuration -PAPER_TRADING=true -MAX_POSITION_SIZE=0.1 -MAX_DAILY_LOSS=1000 - -# Logging -LOG_LEVEL=debug -LOG_CONSOLE=true -LOKI_HOST=localhost -LOKI_PORT=3100 -LOKI_USERNAME= -LOKI_PASSWORD= -LOKI_RETENTION_DAYS=30 -LOKI_LABELS=environment=development,service=stock-bot -LOKI_BATCH_SIZE=100 - -# Feature Flags -ENABLE_ML_SIGNALS=false -ENABLE_SENTIMENT_ANALYSIS=false diff --git a/.env.prod b/.env.prod deleted file mode 100644 index 2aa8d1d..0000000 --- a/.env.prod +++ /dev/null @@ -1,233 +0,0 @@ -# ======================================================================= -# Stock Bot Platform Production Environment Configuration -# ======================================================================= - -# Core Application Settings -NODE_ENV=production -PORT=3001 -APP_NAME=stock-bot -APP_VERSION=1.0.0 - -# ======================================================================= -# DATABASE CONFIGURATIONS -# ======================================================================= - -# PostgreSQL - Operational Data (orders, positions, strategies) -DB_HOST=${DB_HOST} -DB_PORT=${DB_PORT:-5432} -DB_NAME=${DB_NAME} -DB_USER=${DB_USER} -DB_PASSWORD=${DB_PASSWORD} -DB_POOL_MIN=5 -DB_POOL_MAX=20 -DB_POOL_IDLE_TIMEOUT=60000 -DB_SSL=true -DB_SSL_REJECT_UNAUTHORIZED=true -DB_QUERY_TIMEOUT=30000 -DB_CONNECTION_TIMEOUT=10000 - -# QuestDB - Time-series Data (OHLCV, indicators, performance) -QUESTDB_HOST=${QUESTDB_HOST} -QUESTDB_HTTP_PORT=${QUESTDB_HTTP_PORT:-9000} -QUESTDB_PG_PORT=${QUESTDB_PG_PORT:-8812} -QUESTDB_INFLUX_PORT=${QUESTDB_INFLUX_PORT:-9009} -QUESTDB_USER=${QUESTDB_USER} -QUESTDB_PASSWORD=${QUESTDB_PASSWORD} -QUESTDB_CONNECTION_TIMEOUT=10000 -QUESTDB_REQUEST_TIMEOUT=60000 -QUESTDB_RETRY_ATTEMPTS=5 -QUESTDB_TLS_ENABLED=true -QUESTDB_DEFAULT_DATABASE=qdb -QUESTDB_TELEMETRY_ENABLED=false - -# MongoDB - Document Storage (sentiment, raw docs, unstructured data) -MONGODB_HOST=${MONGODB_HOST} -MONGODB_PORT=${MONGODB_PORT:-27017} -MONGODB_DATABASE=${MONGODB_DATABASE} -MONGODB_USERNAME=${MONGODB_USERNAME} -MONGODB_PASSWORD=${MONGODB_PASSWORD} -MONGODB_AUTH_SOURCE=admin -MONGODB_URI=${MONGODB_URI} -MONGODB_MAX_POOL_SIZE=50 -MONGODB_MIN_POOL_SIZE=5 -MONGODB_MAX_IDLE_TIME=60000 -MONGODB_CONNECT_TIMEOUT=30000 -MONGODB_SOCKET_TIMEOUT=60000 -MONGODB_SERVER_SELECTION_TIMEOUT=10000 -MONGODB_TLS=true -MONGODB_RETRY_WRITES=true -MONGODB_JOURNAL=true -MONGODB_READ_PREFERENCE=primaryPreferred -MONGODB_WRITE_CONCERN=majority - -# Dragonfly - Redis Replacement (caching and events) -DRAGONFLY_HOST=${DRAGONFLY_HOST} -DRAGONFLY_PORT=${DRAGONFLY_PORT:-6379} -DRAGONFLY_PASSWORD=${DRAGONFLY_PASSWORD} -DRAGONFLY_USERNAME=${DRAGONFLY_USERNAME} -DRAGONFLY_DATABASE=0 -DRAGONFLY_MAX_RETRIES=5 -DRAGONFLY_RETRY_DELAY=100 -DRAGONFLY_CONNECT_TIMEOUT=30000 -DRAGONFLY_COMMAND_TIMEOUT=10000 -DRAGONFLY_POOL_SIZE=50 -DRAGONFLY_POOL_MIN=5 -DRAGONFLY_POOL_MAX=100 -DRAGONFLY_TLS=true -DRAGONFLY_ENABLE_KEEPALIVE=true -DRAGONFLY_KEEPALIVE_INTERVAL=30 -DRAGONFLY_CLUSTER_MODE=false -DRAGONFLY_CLUSTER_NODES= -DRAGONFLY_MAX_MEMORY=8gb -DRAGONFLY_CACHE_MODE=true - -# ======================================================================= -# MONITORING & LOGGING CONFIGURATIONS -# ======================================================================= - -# Logging Configuration (Production - Less verbose) -LOG_LEVEL=info -LOG_FORMAT=json -LOG_CONSOLE=false -LOG_FILE=true -LOG_FILE_PATH=/var/log/stock-bot -LOG_FILE_MAX_SIZE=100m -LOG_FILE_MAX_FILES=30 -LOG_FILE_DATE_PATTERN=YYYY-MM-DD -LOG_ERROR_FILE=true -LOG_ERROR_STACK=false -LOG_PERFORMANCE=true -LOG_SQL_QUERIES=false -LOG_HTTP_REQUESTS=false -LOG_STRUCTURED=true -LOG_TIMESTAMP=true -LOG_CALLER_INFO=false -LOG_SILENT_MODULES= -LOG_VERBOSE_MODULES= -LOG_SERVICE_NAME=stock-bot -LOG_SERVICE_VERSION=1.0.0 -LOG_ENVIRONMENT=production - -# Loki - Log Aggregation -LOKI_HOST=${LOKI_HOST} -LOKI_PORT=${LOKI_PORT:-3100} -LOKI_URL=${LOKI_URL} -LOKI_USERNAME=${LOKI_USERNAME} -LOKI_PASSWORD=${LOKI_PASSWORD} -LOKI_TENANT_ID=${LOKI_TENANT_ID} -LOKI_PUSH_TIMEOUT=30000 -LOKI_BATCH_SIZE=2048 -LOKI_BATCH_WAIT=5000 -LOKI_RETENTION_PERIOD=90d -LOKI_MAX_CHUNK_AGE=2h -LOKI_TLS_ENABLED=true -LOKI_TLS_INSECURE=false -LOKI_DEFAULT_LABELS= -LOKI_SERVICE_LABEL=stock-bot -LOKI_ENVIRONMENT_LABEL=production - -# Prometheus - Metrics Collection -PROMETHEUS_HOST=${PROMETHEUS_HOST} -PROMETHEUS_PORT=${PROMETHEUS_PORT:-9090} -PROMETHEUS_URL=${PROMETHEUS_URL} -PROMETHEUS_USERNAME=${PROMETHEUS_USERNAME} -PROMETHEUS_PASSWORD=${PROMETHEUS_PASSWORD} -PROMETHEUS_SCRAPE_INTERVAL=30s -PROMETHEUS_EVALUATION_INTERVAL=30s -PROMETHEUS_RETENTION_TIME=90d -PROMETHEUS_TLS_ENABLED=true -PROMETHEUS_TLS_INSECURE=false - -# Grafana - Visualization -GRAFANA_HOST=${GRAFANA_HOST} -GRAFANA_PORT=${GRAFANA_PORT:-3000} -GRAFANA_URL=${GRAFANA_URL} -GRAFANA_ADMIN_USER=${GRAFANA_ADMIN_USER} -GRAFANA_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} -GRAFANA_ALLOW_SIGN_UP=false -GRAFANA_SECRET_KEY=${GRAFANA_SECRET_KEY} -GRAFANA_DATABASE_TYPE=postgres -GRAFANA_DATABASE_URL=${GRAFANA_DATABASE_URL} -GRAFANA_DISABLE_GRAVATAR=true -GRAFANA_ENABLE_GZIP=true - -# ======================================================================= -# DATA PROVIDER CONFIGURATIONS -# ======================================================================= - -# Default Data Provider -DEFAULT_DATA_PROVIDER=alpaca - -# Alpaca Markets (Production) -ALPACA_ENABLED=true -ALPACA_API_KEY=${ALPACA_API_KEY} -ALPACA_SECRET_KEY=${ALPACA_SECRET_KEY} -ALPACA_BASE_URL=https://api.alpaca.markets -ALPACA_DATA_URL=https://data.alpaca.markets -ALPACA_PAPER_TRADING=false - -# Polygon.io -POLYGON_ENABLED=${POLYGON_ENABLED:-false} -POLYGON_API_KEY=${POLYGON_API_KEY} -POLYGON_BASE_URL=https://api.polygon.io - -# Yahoo Finance -YAHOO_ENABLED=${YAHOO_ENABLED:-false} -YAHOO_BASE_URL=https://query1.finance.yahoo.com - -# IEX Cloud -IEX_ENABLED=${IEX_ENABLED:-false} -IEX_API_KEY=${IEX_API_KEY} -IEX_BASE_URL=https://cloud.iexapis.com - -# Data Provider Settings (Production) -DATA_PROVIDER_TIMEOUT=60000 -DATA_PROVIDER_RETRIES=5 -DATA_PROVIDER_RETRY_DELAY=2000 -DATA_CACHE_ENABLED=true -DATA_CACHE_TTL=60 -DATA_CACHE_MAX_SIZE=10000 - -# ======================================================================= -# TRADING & RISK MANAGEMENT (Production) -# ======================================================================= - -# Trading Configuration -PAPER_TRADING=false -MAX_POSITION_SIZE=${MAX_POSITION_SIZE:-0.05} -MAX_DAILY_LOSS=${MAX_DAILY_LOSS:-10000} - -# Risk Management (Stricter for production) -RISK_MAX_POSITION_SIZE=${RISK_MAX_POSITION_SIZE:-0.10} -RISK_MAX_LEVERAGE=${RISK_MAX_LEVERAGE:-1.5} -RISK_DEFAULT_STOP_LOSS=${RISK_DEFAULT_STOP_LOSS:-0.015} -RISK_DEFAULT_TAKE_PROFIT=${RISK_DEFAULT_TAKE_PROFIT:-0.045} -RISK_MAX_DRAWDOWN=${RISK_MAX_DRAWDOWN:-0.05} -RISK_MAX_CONSECUTIVE_LOSSES=${RISK_MAX_CONSECUTIVE_LOSSES:-3} -RISK_POSITION_SIZING_METHOD=volatility_adjusted -RISK_CIRCUIT_BREAKER_ENABLED=true -RISK_CIRCUIT_BREAKER_THRESHOLD=0.02 -RISK_CIRCUIT_BREAKER_COOLDOWN=7200000 -RISK_ALLOW_WEEKEND_TRADING=false -RISK_MARKET_HOURS_ONLY=true - -# ======================================================================= -# FEATURE FLAGS (Production) -# ======================================================================= -ENABLE_ML_SIGNALS=${ENABLE_ML_SIGNALS:-false} -ENABLE_SENTIMENT_ANALYSIS=${ENABLE_SENTIMENT_ANALYSIS:-false} -ENABLE_SOCIAL_SIGNALS=${ENABLE_SOCIAL_SIGNALS:-false} -ENABLE_OPTIONS_TRADING=${ENABLE_OPTIONS_TRADING:-false} -ENABLE_CRYPTO_TRADING=${ENABLE_CRYPTO_TRADING:-false} -ENABLE_BACKTESTING=true -ENABLE_PAPER_TRADING=false -ENABLE_LIVE_TRADING=true - -# ======================================================================= -# PRODUCTION SETTINGS -# ======================================================================= -DEBUG_MODE=false -VERBOSE_LOGGING=false -MOCK_DATA_PROVIDERS=false -ENABLE_API_RATE_LIMITING=true -ENABLE_REQUEST_LOGGING=false diff --git a/.env.production b/.env.production deleted file mode 100644 index dfd7a4d..0000000 --- a/.env.production +++ /dev/null @@ -1,135 +0,0 @@ -# Production Environment Configuration -NODE_ENV=production -PORT=3001 - -# ============================================================================= -# DATABASE CONFIGURATIONS -# ============================================================================= - -# PostgreSQL - Operational data (orders, positions, strategies) -DB_HOST=postgres -DB_PORT=5432 -DB_NAME=trading_bot -DB_USER=trading_user -DB_PASSWORD=${POSTGRES_PASSWORD} -DB_POOL_MIN=5 -DB_POOL_MAX=20 -DB_SSL=true -DB_SSL_REJECT_UNAUTHORIZED=true - -# QuestDB - Time-series data (OHLCV, indicators, performance) -QUESTDB_HOST=questdb -QUESTDB_HTTP_PORT=9000 -QUESTDB_PG_PORT=8812 -QUESTDB_INFLUX_PORT=9009 -QUESTDB_DEFAULT_DATABASE=qdb -QUESTDB_TELEMETRY_ENABLED=false -QUESTDB_TLS_ENABLED=true - -# MongoDB - Document storage (sentiment, raw docs, unstructured data) -MONGODB_HOST=mongodb -MONGODB_PORT=27017 -MONGODB_DATABASE=trading_documents -MONGODB_USERNAME=${MONGODB_ROOT_USERNAME} -MONGODB_PASSWORD=${MONGODB_ROOT_PASSWORD} -MONGODB_AUTH_SOURCE=admin -MONGODB_TLS=true -MONGODB_RETRY_WRITES=true - -# Dragonfly - Redis replacement for caching and events -DRAGONFLY_HOST=dragonfly -DRAGONFLY_PORT=6379 -DRAGONFLY_PASSWORD=${DRAGONFLY_PASSWORD} -DRAGONFLY_DATABASE=0 -DRAGONFLY_MAX_MEMORY=4gb -DRAGONFLY_CACHE_MODE=true -DRAGONFLY_TLS=true - -# ============================================================================= -# MONITORING & OBSERVABILITY -# ============================================================================= - -# Prometheus - Metrics collection -PROMETHEUS_HOST=prometheus -PROMETHEUS_PORT=9090 -PROMETHEUS_SCRAPE_INTERVAL=30s -PROMETHEUS_RETENTION_TIME=90d -PROMETHEUS_TLS_ENABLED=true - -# Grafana - Visualization -GRAFANA_HOST=grafana -GRAFANA_PORT=3000 -GRAFANA_ADMIN_USER=${GRAFANA_ADMIN_USER} -GRAFANA_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} -GRAFANA_ALLOW_SIGN_UP=false -GRAFANA_SECRET_KEY=${GRAFANA_SECRET_KEY} -GRAFANA_DATABASE_TYPE=postgres -GRAFANA_DISABLE_GRAVATAR=true - -# Loki - Log aggregation -LOKI_HOST=loki -LOKI_PORT=3100 -LOKI_RETENTION_PERIOD=90d -LOKI_BATCH_SIZE=2048 -LOKI_TLS_ENABLED=true - -# ============================================================================= -# ADMIN INTERFACES (Disabled in production) -# ============================================================================= - -# PgAdmin - PostgreSQL GUI (disabled in production) -PGADMIN_HOST=pgadmin -PGADMIN_PORT=8080 -PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL} -PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD} -PGADMIN_SERVER_MODE=true -PGADMIN_MASTER_PASSWORD_REQUIRED=true - -# Mongo Express - MongoDB GUI (disabled in production) -MONGO_EXPRESS_HOST=mongo-express -MONGO_EXPRESS_PORT=8081 -MONGO_EXPRESS_MONGODB_SERVER=mongodb -MONGO_EXPRESS_BASICAUTH_USERNAME=${MONGO_EXPRESS_USER} -MONGO_EXPRESS_BASICAUTH_PASSWORD=${MONGO_EXPRESS_PASSWORD} - -# Redis Insight - Dragonfly/Redis GUI (disabled in production) -REDIS_INSIGHT_HOST=redis-insight -REDIS_INSIGHT_PORT=8001 -REDIS_INSIGHT_REDIS_HOSTS=production:dragonfly:6379 - -# ============================================================================= -# DATA PROVIDERS & TRADING -# ============================================================================= - -# API Keys (Set from environment variables) -ALPHA_VANTAGE_API_KEY=${ALPHA_VANTAGE_API_KEY} -ALPACA_API_KEY=${ALPACA_API_KEY} -ALPACA_SECRET_KEY=${ALPACA_SECRET_KEY} -POLYGON_API_KEY=${POLYGON_API_KEY} -IEX_API_KEY=${IEX_API_KEY} -YAHOO_FINANCE_API_KEY=${YAHOO_FINANCE_API_KEY} - -# Trading Configuration -PAPER_TRADING=false -MAX_POSITION_SIZE=0.05 -MAX_DAILY_LOSS=5000 -RISK_MANAGEMENT_ENABLED=true - -# ============================================================================= -# APPLICATION SETTINGS -# ============================================================================= - -# Logging -LOG_LEVEL=info -LOG_FORMAT=json - -# Feature Flags -ENABLE_ML_SIGNALS=true -ENABLE_SENTIMENT_ANALYSIS=true -ENABLE_RISK_MONITORING=true -ENABLE_PERFORMANCE_TRACKING=true - -# Security -CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS} -JWT_SECRET=${JWT_SECRET} -API_RATE_LIMIT=1000 diff --git a/apps/data-service/src/index.ts b/apps/data-service/src/index.ts index 17167ff..3394389 100644 --- a/apps/data-service/src/index.ts +++ b/apps/data-service/src/index.ts @@ -242,7 +242,9 @@ shutdown.onShutdown(async () => { shutdown.onShutdown(async () => { try { + logger.info('Shutting down loggers...'); await shutdownLoggers(); + logger.info('Loggers shut down successfully'); } catch (error) { // Silently ignore logger shutdown errors } diff --git a/libs/config/src/loaders/env.loader.ts b/libs/config/src/loaders/env.loader.ts index 51699f8..b4e4cf3 100644 --- a/libs/config/src/loaders/env.loader.ts +++ b/libs/config/src/loaders/env.loader.ts @@ -174,6 +174,9 @@ export class EnvLoader implements ConfigLoader { 'NAME': ['name'], 'VERSION': ['version'], + // Logging mappings + 'LOG_LEVEL': ['logging', 'level'], + // Special mappings to avoid conflicts 'DEBUG_MODE': ['debug'], }; diff --git a/libs/logger/src/logger.ts b/libs/logger/src/logger.ts index b0c0f83..887ddf2 100644 --- a/libs/logger/src/logger.ts +++ b/libs/logger/src/logger.ts @@ -54,6 +54,7 @@ function createTransports(serviceName: string, config: LoggerConfig = globalConf ignore: 'pid,hostname,service,environment,version,childName', errorLikeObjectKeys: ['err', 'error'], errorProps: 'message,stack,name,code', + sync: false, }, }); } diff --git a/libs/queue/src/queue.ts b/libs/queue/src/queue.ts index d66cac0..8f9bdb2 100644 --- a/libs/queue/src/queue.ts +++ b/libs/queue/src/queue.ts @@ -228,7 +228,11 @@ export class Queue { // Close workers first if (this.workers.length > 0) { - await Promise.all(this.workers.map(worker => worker.close())); + await Promise.all( + this.workers.map(async worker => { + return await worker.close(); + }) + ); this.workers = []; logger.debug('Workers closed', { queueName: this.queueName }); } diff --git a/libs/shutdown/src/shutdown.ts b/libs/shutdown/src/shutdown.ts index 2223efa..b0a6043 100644 --- a/libs/shutdown/src/shutdown.ts +++ b/libs/shutdown/src/shutdown.ts @@ -125,6 +125,7 @@ export class Shutdown { } // Don't call process.exit here - let the caller decide + return result; } @@ -171,7 +172,8 @@ export class Shutdown { process.platform === 'win32' ? ['SIGINT', 'SIGTERM'] : ['SIGTERM', 'SIGINT', 'SIGUSR2']; signals.forEach(signal => { - process.once(signal, () => { // Changed from 'on' to 'once' to prevent multiple handlers + process.once(signal, () => { + // Changed from 'on' to 'once' to prevent multiple handlers this.shutdownAndExit(signal).catch(() => { process.exit(1); });