fixed some issues, testing shutdown

This commit is contained in:
Boki 2025-06-20 17:56:45 -04:00
parent dbfa80b2a2
commit 0497541a47
11 changed files with 15 additions and 800 deletions

2
.env
View file

@ -4,7 +4,7 @@
# Core Application Settings
NODE_ENV=development
LOG_LEVEL=info
LOG_LEVEL=debug
# Data Service Configuration
DATA_SERVICE_PORT=2001

View file

@ -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

View file

@ -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

View file

@ -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
View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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'],
};

View file

@ -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,
},
});
}

View file

@ -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 });
}

View file

@ -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);
});