fixed some issues, testing shutdown
This commit is contained in:
parent
dbfa80b2a2
commit
0497541a47
11 changed files with 15 additions and 800 deletions
2
.env
2
.env
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
# Core Application Settings
|
# Core Application Settings
|
||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
LOG_LEVEL=info
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
# Data Service Configuration
|
# Data Service Configuration
|
||||||
DATA_SERVICE_PORT=2001
|
DATA_SERVICE_PORT=2001
|
||||||
|
|
|
||||||
242
.env.complete
242
.env.complete
|
|
@ -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
|
|
||||||
144
.env.docker
144
.env.docker
|
|
@ -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
|
|
||||||
43
.env.example
43
.env.example
|
|
@ -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
|
|
||||||
233
.env.prod
233
.env.prod
|
|
@ -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
|
|
||||||
135
.env.production
135
.env.production
|
|
@ -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
|
|
||||||
|
|
@ -242,7 +242,9 @@ shutdown.onShutdown(async () => {
|
||||||
|
|
||||||
shutdown.onShutdown(async () => {
|
shutdown.onShutdown(async () => {
|
||||||
try {
|
try {
|
||||||
|
logger.info('Shutting down loggers...');
|
||||||
await shutdownLoggers();
|
await shutdownLoggers();
|
||||||
|
logger.info('Loggers shut down successfully');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Silently ignore logger shutdown errors
|
// Silently ignore logger shutdown errors
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,6 +174,9 @@ export class EnvLoader implements ConfigLoader {
|
||||||
'NAME': ['name'],
|
'NAME': ['name'],
|
||||||
'VERSION': ['version'],
|
'VERSION': ['version'],
|
||||||
|
|
||||||
|
// Logging mappings
|
||||||
|
'LOG_LEVEL': ['logging', 'level'],
|
||||||
|
|
||||||
// Special mappings to avoid conflicts
|
// Special mappings to avoid conflicts
|
||||||
'DEBUG_MODE': ['debug'],
|
'DEBUG_MODE': ['debug'],
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ function createTransports(serviceName: string, config: LoggerConfig = globalConf
|
||||||
ignore: 'pid,hostname,service,environment,version,childName',
|
ignore: 'pid,hostname,service,environment,version,childName',
|
||||||
errorLikeObjectKeys: ['err', 'error'],
|
errorLikeObjectKeys: ['err', 'error'],
|
||||||
errorProps: 'message,stack,name,code',
|
errorProps: 'message,stack,name,code',
|
||||||
|
sync: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,11 @@ export class Queue {
|
||||||
|
|
||||||
// Close workers first
|
// Close workers first
|
||||||
if (this.workers.length > 0) {
|
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 = [];
|
this.workers = [];
|
||||||
logger.debug('Workers closed', { queueName: this.queueName });
|
logger.debug('Workers closed', { queueName: this.queueName });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@ export class Shutdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't call process.exit here - let the caller decide
|
// Don't call process.exit here - let the caller decide
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,7 +172,8 @@ export class Shutdown {
|
||||||
process.platform === 'win32' ? ['SIGINT', 'SIGTERM'] : ['SIGTERM', 'SIGINT', 'SIGUSR2'];
|
process.platform === 'win32' ? ['SIGINT', 'SIGTERM'] : ['SIGTERM', 'SIGINT', 'SIGUSR2'];
|
||||||
|
|
||||||
signals.forEach(signal => {
|
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(() => {
|
this.shutdownAndExit(signal).catch(() => {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue