10 KiB
Stock Bot Multi-Database Architecture Documentation
Overview
The Stock Bot platform uses a sophisticated multi-database architecture designed to handle different types of data efficiently. This document outlines the configuration system, database choices, and monitoring setup.
Configuration System
Migration from Custom Config to Envalid
The platform has migrated from a complex Valibot-based configuration system to a simpler, more maintainable envalid approach:
// New configuration pattern used throughout
export const configName = cleanEnv(process.env, {
ENV_VAR: str({ default: 'value', desc: 'Description' }),
NUMERIC_VAR: num({ default: 3000, desc: 'Port number' }),
BOOLEAN_VAR: bool({ default: false, desc: 'Feature flag' }),
});
Configuration Modules
| Module | Purpose | File |
|---|---|---|
database |
PostgreSQL operational data | libs/config/src/database.ts |
questdb |
Time-series data storage | libs/config/src/questdb.ts |
mongodb |
Document and unstructured data | libs/config/src/mongodb.ts |
dragonfly |
Caching and event streaming | libs/config/src/dragonfly.ts |
monitoring |
Prometheus and Grafana | libs/config/src/monitoring.ts |
loki |
Log aggregation | libs/config/src/loki.ts |
logging |
Application logging | libs/config/src/logging.ts |
Database Architecture
1. PostgreSQL - Operational Data Store
Purpose: Primary relational database for structured operational data
- Data Types: Orders, positions, strategies, user accounts, trading rules
- Strengths: ACID compliance, complex queries, transactions
- Configuration:
libs/config/src/database.ts
// Example usage
import { databaseConfig } from '@trading-bot/config';
// Connects to operational PostgreSQL instance
2. QuestDB - Time-Series Database
Purpose: High-performance time-series data storage
- Data Types: OHLCV data, technical indicators, performance metrics, tick data
- Strengths: Fast ingestion, SQL queries on time-series, columnar storage
- Configuration:
libs/config/src/questdb.ts
// Example usage
import { questdbConfig } from '@trading-bot/config';
// Optimized for time-series queries and analytics
3. MongoDB - Document Store
Purpose: Flexible document storage for unstructured data
- Data Types: Market sentiment, news articles, research reports, ML model outputs
- Strengths: Schema flexibility, horizontal scaling, complex document queries
- Configuration:
libs/config/src/mongodb.ts
// Example usage
import { mongodbConfig } from '@trading-bot/config';
// Handles variable schema and complex nested data
4. Dragonfly - Cache & Event Store
Purpose: High-performance caching and real-time event streaming
- Data Types: Market data cache, session data, real-time events, pub/sub messages
- Strengths: Redis compatibility, better performance, memory efficiency
- Configuration:
libs/config/src/dragonfly.ts
// Example usage
import { dragonflyConfig } from '@trading-bot/config';
// Drop-in Redis replacement with better performance
Monitoring & Observability Stack
Prometheus - Metrics Collection
- Purpose: Time-series metrics and monitoring
- Metrics: System performance, trading metrics, database metrics
- Configuration:
libs/config/src/monitoring.ts
Grafana - Visualization
- Purpose: Dashboards and alerting
- Dashboards: Trading performance, system health, database monitoring
- Configuration:
libs/config/src/monitoring.ts
Loki - Log Aggregation
- Purpose: Centralized log collection and analysis
- Logs: Application logs, database logs, system logs
- Configuration:
libs/config/src/loki.ts
Application Logging
- Purpose: Structured application logging
- Features: Multiple formats, file rotation, log levels
- Configuration:
libs/config/src/logging.ts
Environment Files
.env - Development (Local)
- Purpose: Local development with services on localhost
- Databases: All services running on localhost with standard ports
- Logging: Pretty-formatted console output
.env.docker - Docker Compose
- Purpose: Container orchestration with Docker Compose
- Databases: Container names as hostnames (e.g.,
postgres,mongodb) - Features: Health checks, resource limits, volume mounts
.env.complete - Full Development
- Purpose: Complete feature set for development testing
- Features: All services enabled, verbose logging, debug mode
- Use Case: Testing the full platform locally
.env.prod - Production
- Purpose: Production deployment configuration
- Security: Environment variable references, secure defaults
- Features: Optimized logging, monitoring enabled
Admin Interfaces
PgAdmin - PostgreSQL Management
- URL: http://localhost:8080 (development)
- Purpose: Database administration, query execution, monitoring
Mongo Express - MongoDB Management
- URL: http://localhost:8081 (development)
- Purpose: Document browsing, collection management, query testing
Redis Insight - Dragonfly/Redis Management
- URL: http://localhost:8001 (development)
- Purpose: Cache monitoring, key browsing, performance analysis
Data Flow Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Market Data │───▶│ Dragonfly │───▶│ QuestDB │
│ Feed │ │ (Cache/Events) │ │ (Time-Series) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Trading │◀──▶│ PostgreSQL │ │ MongoDB │
│ Engine │ │ (Operational) │ │ (Documents) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ ▲
▼ │
┌─────────────────┐ ┌──────────────────┐ │
│ Monitoring │◀───│ Prometheus │ │
│ Dashboard │ │ (Metrics) │ │
└─────────────────┘ └──────────────────┘ │
│
┌─────────────────┐ ┌──────────────────┐ │
│ Log Analysis │◀───│ Loki │───────────┘
│ │ │ (Logs) │
└─────────────────┘ └──────────────────┘
Best Practices
Database Selection Guidelines
-
PostgreSQL: Use for transactional data requiring ACID properties
- Orders, positions, account balances, strategy configurations
-
QuestDB: Use for time-series data requiring fast analytics
- OHLCV data, technical indicators, performance metrics
-
MongoDB: Use for flexible, document-based data
- Market sentiment, news articles, ML model outputs
-
Dragonfly: Use for temporary data requiring fast access
- Real-time market data cache, session data, event streams
Configuration Best Practices
- Environment Separation: Use appropriate
.envfile for each environment - Security: Never commit sensitive credentials to version control
- Validation: All configuration uses envalid for runtime validation
- Documentation: Each config variable includes descriptive help text
Monitoring Best Practices
- Metrics: Monitor database performance, trading metrics, system health
- Logging: Use structured logging with appropriate log levels
- Alerting: Set up Grafana alerts for critical system metrics
- Log Retention: Configure appropriate retention periods for each environment
Migration Guide
If migrating from the old configuration system:
- Update Imports: Change from custom config to new envalid-based modules
- Environment Variables: Update
.envfiles to include all new services - Docker Setup: Use
.env.dockerfor container-based deployments - Monitoring: Enable Prometheus, Grafana, and Loki for observability
Troubleshooting
Common Issues
- Connection Failures: Check container names in Docker environments
- Port Conflicts: Verify port mappings in environment files
- Permission Errors: Ensure proper database credentials and permissions
- Memory Issues: Adjust resource limits in Docker configuration
Debug Commands
# Check container status
docker-compose ps
# View container logs
docker-compose logs [service-name]
# Test database connections
docker-compose exec postgres pg_isready
docker-compose exec mongodb mongosh --eval "db.runCommand('ping')"
docker-compose exec questdb curl -f http://localhost:9000/status
docker-compose exec dragonfly redis-cli ping
Future Enhancements
- Database Sharding: Implement horizontal scaling for high-volume data
- Read Replicas: Add read replicas for improved query performance
- Backup Strategy: Implement automated backup and recovery procedures
- Security: Add encryption at rest and in transit
- Performance: Implement connection pooling and query optimization