TCPDashboard/config/settings.py
2025-05-29 23:50:41 +08:00

126 lines
4.0 KiB
Python

"""
Configuration settings for the Crypto Trading Bot Dashboard.
"""
import os
from pathlib import Path
from typing import Optional
from dotenv import load_dotenv
from pydantic import Field
from pydantic_settings import BaseSettings
# Load environment variables from .env file
env_file = Path(__file__).parent.parent / ".env"
if env_file.exists():
load_dotenv(env_file)
class DatabaseSettings(BaseSettings):
"""Database configuration settings."""
host: str = Field(default="localhost", env="POSTGRES_HOST")
port: int = Field(default=5432, env="POSTGRES_PORT")
database: str = Field(default="dashboard", env="POSTGRES_DB")
user: str = Field(default="dashboard", env="POSTGRES_USER")
password: str = Field(default="dashboard123", env="POSTGRES_PASSWORD")
url: Optional[str] = Field(default=None, env="DATABASE_URL")
@property
def connection_url(self) -> str:
"""Get the database connection URL."""
if self.url:
return self.url
return f"postgresql://{self.user}:{self.password}@{self.host}:{self.port}/{self.database}"
class RedisSettings(BaseSettings):
"""Redis configuration settings."""
host: str = Field(default="localhost", env="REDIS_HOST")
port: int = Field(default=6379, env="REDIS_PORT")
password: Optional[str] = Field(default=None, env="REDIS_PASSWORD")
@property
def connection_url(self) -> str:
"""Get the Redis connection URL."""
if self.password:
return f"redis://:{self.password}@{self.host}:{self.port}"
return f"redis://{self.host}:{self.port}"
class OKXSettings(BaseSettings):
"""OKX API configuration settings."""
api_key: str = Field(default="", env="OKX_API_KEY")
secret_key: str = Field(default="", env="OKX_SECRET_KEY")
passphrase: str = Field(default="", env="OKX_PASSPHRASE")
sandbox: bool = Field(default=True, env="OKX_SANDBOX")
@property
def is_configured(self) -> bool:
"""Check if OKX API is properly configured."""
return bool(self.api_key and self.secret_key and self.passphrase)
class DashboardSettings(BaseSettings):
"""Dashboard application settings."""
host: str = Field(default="0.0.0.0", env="DASH_HOST")
port: int = Field(default=8050, env="DASH_PORT")
debug: bool = Field(default=True, env="DASH_DEBUG")
class BotSettings(BaseSettings):
"""Bot management settings."""
max_concurrent_bots: int = Field(default=5, env="MAX_CONCURRENT_BOTS")
update_interval: int = Field(default=2, env="BOT_UPDATE_INTERVAL")
default_virtual_balance: float = Field(default=10000.0, env="DEFAULT_VIRTUAL_BALANCE")
class DataSettings(BaseSettings):
"""Data configuration settings."""
market_data_symbols: str = Field(default="BTC-USDT,ETH-USDT,LTC-USDT", env="MARKET_DATA_SYMBOLS")
historical_data_days: int = Field(default=30, env="HISTORICAL_DATA_DAYS")
chart_update_interval: int = Field(default=2000, env="CHART_UPDATE_INTERVAL")
@property
def symbols_list(self) -> list[str]:
"""Get the list of trading symbols."""
return [symbol.strip() for symbol in self.market_data_symbols.split(",")]
class AppSettings(BaseSettings):
"""Application-wide settings."""
debug: bool = Field(default=True, env="DEBUG")
environment: str = Field(default="development", env="ENVIRONMENT")
log_level: str = Field(default="INFO", env="LOG_LEVEL")
# Create settings instances
database = DatabaseSettings()
redis = RedisSettings()
okx = OKXSettings()
dashboard = DashboardSettings()
bot = BotSettings()
data = DataSettings()
app = AppSettings()
def get_project_root() -> Path:
"""Get the project root directory."""
return Path(__file__).parent.parent
def get_config_dir() -> Path:
"""Get the configuration directory."""
return get_project_root() / "config"
def get_bot_configs_dir() -> Path:
"""Get the bot configurations directory."""
return get_config_dir() / "bot_configs"