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
|
||||
NODE_ENV=development
|
||||
LOG_LEVEL=info
|
||||
LOG_LEVEL=debug
|
||||
|
||||
# Data Service Configuration
|
||||
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 () => {
|
||||
try {
|
||||
logger.info('Shutting down loggers...');
|
||||
await shutdownLoggers();
|
||||
logger.info('Loggers shut down successfully');
|
||||
} catch (error) {
|
||||
// Silently ignore logger shutdown errors
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue