Config
leadr.config¶
Application configuration management.
This module defines the configuration settings for the LEADR application using Pydantic Settings. Configuration values are loaded from environment variables and .env files, with validation and type checking.
Environment files
- .env: Production/development configuration (default) - .env.test: Test environment configuration (when ENV=TEST)Example
Settings are automatically loaded based on the ENV variable: > > > from leadr.config import settings > > > settings.API_PREFIX > > > '/v1'Classes:
- CommonSettings – Base configuration settings shared across all environments.
- Settings – Production/development environment settings.
- TestSettings – Test environment settings.
Attributes:
leadr.config.CommonSettings¶
Bases: BaseSettings
Base configuration settings shared across all environments.
This class defines all configuration fields that are common to both production and test environments. Specific environment classes can override defaults or add environment-specific settings.
All settings can be configured via environment variables matching the field names (case-sensitive).
Functions:
- validate_api_enabled – Ensure at least one API (Admin or Client) is enabled.
Attributes:
- ACCESS_TOKEN_EXPIRY_HOURS (
int) – - ANTICHEAT_DUPLICATE_WINDOW_SECONDS (
int) – - ANTICHEAT_ENABLED (
bool) – - ANTICHEAT_LOGGING_ONLY (
bool) – - ANTICHEAT_MIN_SAMPLES_FOR_STATS (
int) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_A (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_B (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_C (
float) – - ANTICHEAT_RATE_LIMIT_TIER_A (
int) – - ANTICHEAT_RATE_LIMIT_TIER_B (
int) – - ANTICHEAT_RATE_LIMIT_TIER_C (
int) – - ANTICHEAT_VELOCITY_THRESHOLD_SECONDS (
float) – - API_KEY_SECRET (
str) – - API_PREFIX (
str) – - APP (
str) – - BACKGROUND_TASK_EXPIRE_INTERVAL (
int) – - BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL (
int) – - BACKGROUND_TASK_TEMPLATE_INTERVAL (
int) – - BASE_URL (
HttpUrl) – - DASHBOARD_URL (
HttpUrl) – - DB_ECHO (
bool) – - DB_HOST (
str) – - DB_HOST_DIRECT (
str | None) – - DB_NAME (
str) – - DB_PASSWORD (
str) – - DB_POOL_MAX_OVERFLOW (
int) – - DB_POOL_RECYCLE (
int) – - DB_POOL_SIZE (
int) – - DB_PORT (
int) – - DB_USER (
str) – - DEBUG (
bool) – - DEV_OVERRIDE_IP (
str | None) – - ENABLE_ADMIN_API (
bool) – - ENABLE_CLIENT_API (
bool) – - ENV (
str) – - GEOIP_DATABASE_PATH (
Path) – - GEOIP_REFRESH_DAYS (
int) – - JWT_LIFETIME_SECONDS (
int) – - JWT_SECRET (
str) – - KEYS_PATH (
Path) – - LOG_DIR (
Path) – - LOG_JSON (
bool) – - LOG_TO_FILE (
bool) – - MAILGUN_API_KEY (
str) – - MAILGUN_DOMAIN (
str) – - MAXMIND_ACCOUNT_ID (
str) – - MAXMIND_CITY_DB_URL (
str) – - MAXMIND_COUNTRY_DB_URL (
str) – - MAXMIND_LICENSE_KEY (
str) – - REFRESH_TOKEN_EXPIRY_DAYS (
int) – - REGISTRATION_RATE_LIMIT_PER_HOUR (
int) – - SCORE_METADATA_MAX_SIZE_BYTES (
int) – - SOURCE_OAUTH_BASE_URL (
HttpUrl) – - SUPERADMIN_ACCOUNT_NAME (
str) – - SUPERADMIN_ACCOUNT_SLUG (
str) – - SUPERADMIN_API_KEY (
str) – - SUPERADMIN_API_KEY_NAME (
str) – - SUPERADMIN_DISPLAY_NAME (
str) – - SUPERADMIN_EMAIL (
str) – - TESTING_EMAIL (
str) – - VERIFICATION_CODE_EXPIRY_SECONDS (
int) – - VERIFICATION_TOKEN_EXPIRY_SECONDS (
int) – - model_config –
leadr.config.CommonSettings.ACCESS_TOKEN_EXPIRY_HOURS¶
ACCESS_TOKEN_EXPIRY_HOURS: int = Field(default=24, description='Device access token expiration time in hours (default: 24 hours)')
leadr.config.CommonSettings.ANTICHEAT_DUPLICATE_WINDOW_SECONDS¶
ANTICHEAT_DUPLICATE_WINDOW_SECONDS: int = Field(default=300, description='Time window in seconds for detecting duplicate score submissions (default: 5 minutes)')
leadr.config.CommonSettings.ANTICHEAT_ENABLED¶
ANTICHEAT_ENABLED: bool = Field(default=False, description='Enable anti-cheat checks on score submissions')
leadr.config.CommonSettings.ANTICHEAT_LOGGING_ONLY¶
ANTICHEAT_LOGGING_ONLY: bool = Field(default=True, description="Log anti-cheat detections but don't reject/flag submissions (dry-run mode)")
leadr.config.CommonSettings.ANTICHEAT_MIN_SAMPLES_FOR_STATS¶
ANTICHEAT_MIN_SAMPLES_FOR_STATS: int = Field(default=10, description='Minimum number of scores required before statistical outlier detection is enabled')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_A¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_A: float = Field(default=4.0, description='Outlier threshold for Tier A devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_B¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_B: float = Field(default=3.0, description='Outlier threshold for Tier B devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_C¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_C: float = Field(default=2.5, description='Outlier threshold for Tier C devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_A¶
ANTICHEAT_RATE_LIMIT_TIER_A: int = Field(default=100, description='Rate limit for Tier A (trusted) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_B¶
ANTICHEAT_RATE_LIMIT_TIER_B: int = Field(default=50, description='Rate limit for Tier B (verified) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_C¶
ANTICHEAT_RATE_LIMIT_TIER_C: int = Field(default=20, description='Rate limit for Tier C (unverified) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_VELOCITY_THRESHOLD_SECONDS¶
ANTICHEAT_VELOCITY_THRESHOLD_SECONDS: float = Field(default=2.0, description='Minimum time between submissions to avoid velocity detection (in seconds)')
leadr.config.CommonSettings.API_KEY_SECRET¶
API_KEY_SECRET: str = Field(default='your-super-secret-api-key-pepper-change-in-production', description='Secret pepper for API key hashing. MUST be changed in production.')
leadr.config.CommonSettings.API_PREFIX¶
API_PREFIX: str = Field(default='/v1', description="API route prefix for versioning (e.g., '/v1')")
leadr.config.CommonSettings.APP¶
APP: str = Field(default='LEADR', description='Application name identifier')
leadr.config.CommonSettings.BACKGROUND_TASK_EXPIRE_INTERVAL¶
BACKGROUND_TASK_EXPIRE_INTERVAL: int = Field(default=60, description='Interval in seconds for expiring boards (default: 60s)')
leadr.config.CommonSettings.BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL¶
BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL: int = Field(default=3600, description='Interval in seconds for cleaning up expired nonces (default: 3600s / 1 hour)')
leadr.config.CommonSettings.BACKGROUND_TASK_TEMPLATE_INTERVAL¶
BACKGROUND_TASK_TEMPLATE_INTERVAL: int = Field(default=60, description='Interval in seconds for processing due board templates (default: 60s)')
leadr.config.CommonSettings.BASE_URL¶
BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="Base URL for the API server (e.g., 'https://api.leadr.gg')")
leadr.config.CommonSettings.DASHBOARD_URL¶
DASHBOARD_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="URL for the web dashboard (e.g., 'https://dashboard.leadr.gg')")
leadr.config.CommonSettings.DB_ECHO¶
DB_ECHO: bool = Field(default=False, description='Log all SQL queries to stdout (useful for debugging)')
leadr.config.CommonSettings.DB_HOST¶
DB_HOST: str = Field(default='localhost', description='PostgreSQL database host')
leadr.config.CommonSettings.DB_HOST_DIRECT¶
DB_HOST_DIRECT: str | None = Field(default=None, description='Direct PostgreSQL host for migrations (bypasses connection pooler). If not set, falls back to DB_HOST. For Neon, use the non-pooler endpoint.')
leadr.config.CommonSettings.DB_NAME¶
DB_NAME: str = Field(default='leadr', description='PostgreSQL database name')
leadr.config.CommonSettings.DB_PASSWORD¶
DB_PASSWORD: str = Field(default='leadr', description='PostgreSQL database password')
leadr.config.CommonSettings.DB_POOL_MAX_OVERFLOW¶
DB_POOL_MAX_OVERFLOW: int = Field(default=10, description='Maximum overflow connections beyond pool size')
leadr.config.CommonSettings.DB_POOL_RECYCLE¶
DB_POOL_RECYCLE: int = Field(default=3600, description='Recycle database connections after this many seconds (default: 1 hour)')
leadr.config.CommonSettings.DB_POOL_SIZE¶
DB_POOL_SIZE: int = Field(default=20, description='Number of database connections to maintain in the pool')
leadr.config.CommonSettings.DB_PORT¶
DB_PORT: int = Field(default=5432, description='PostgreSQL database port')
leadr.config.CommonSettings.DB_USER¶
DB_USER: str = Field(default='leadr', description='PostgreSQL database user')
leadr.config.CommonSettings.DEBUG¶
DEBUG: bool = Field(default=False, description='Enable debug mode with verbose logging and error details')
leadr.config.CommonSettings.DEV_OVERRIDE_IP¶
DEV_OVERRIDE_IP: str | None = Field(default=None, description='Override IP address for development/testing (bypasses localhost detection)')
leadr.config.CommonSettings.ENABLE_ADMIN_API¶
ENABLE_ADMIN_API: bool = Field(default=False, description='Enable admin API endpoints')
leadr.config.CommonSettings.ENABLE_CLIENT_API¶
ENABLE_CLIENT_API: bool = Field(default=False, description='Enable client API endpoints')
leadr.config.CommonSettings.ENV¶
ENV: str = Field(default=..., description="Environment name (e.g., 'DEV', 'PROD', 'TEST'). Required.")
leadr.config.CommonSettings.GEOIP_DATABASE_PATH¶
GEOIP_DATABASE_PATH: Path = Field(default=(PROJ_ROOT / '.geoip'), description='Directory path for storing GeoIP databases')
leadr.config.CommonSettings.GEOIP_REFRESH_DAYS¶
GEOIP_REFRESH_DAYS: int = Field(default=7, description='Number of days between GeoIP database refresh downloads (default: 7 days)')
leadr.config.CommonSettings.JWT_LIFETIME_SECONDS¶
JWT_LIFETIME_SECONDS: int = Field(default=3600, description='JWT token lifetime in seconds (default: 1 hour)')
leadr.config.CommonSettings.JWT_SECRET¶
JWT_SECRET: str = Field(default='your-super-secret-jwt-key-change-in-production', description='Secret key for JWT token signing. MUST be changed in production.')
leadr.config.CommonSettings.KEYS_PATH¶
KEYS_PATH: Path = Field(default=(PROJ_ROOT / '.keys'), description='Directory path for storing cryptographic keys')
leadr.config.CommonSettings.LOG_DIR¶
LOG_DIR: Path = Field(default=(Path('/var/log/leadr')), description='Directory for log files when LOG_TO_FILE is enabled')
leadr.config.CommonSettings.LOG_JSON¶
LOG_JSON: bool = Field(default=True, description='Use JSON format for logs (disable for colored console in dev)')
leadr.config.CommonSettings.LOG_TO_FILE¶
LOG_TO_FILE: bool = Field(default=False, description='Enable file logging in addition to stdout')
leadr.config.CommonSettings.MAILGUN_API_KEY¶
MAILGUN_API_KEY: str = Field(default='mailgun_api_key', description='Mailgun API key for email sending')
leadr.config.CommonSettings.MAILGUN_DOMAIN¶
MAILGUN_DOMAIN: str = Field(default='example.mailgun.org', description='Mailgun domain for email sending')
leadr.config.CommonSettings.MAXMIND_ACCOUNT_ID¶
MAXMIND_ACCOUNT_ID: str = Field(default='', description='MaxMind account ID for database downloads (used for basic auth)')
leadr.config.CommonSettings.MAXMIND_CITY_DB_URL¶
MAXMIND_CITY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz', description='MaxMind GeoLite2 City database download URL')
leadr.config.CommonSettings.MAXMIND_COUNTRY_DB_URL¶
MAXMIND_COUNTRY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz', description='MaxMind GeoLite2 Country database download URL')
leadr.config.CommonSettings.MAXMIND_LICENSE_KEY¶
MAXMIND_LICENSE_KEY: str = Field(default='', description='MaxMind license key for database downloads (used for basic auth)')
leadr.config.CommonSettings.REFRESH_TOKEN_EXPIRY_DAYS¶
REFRESH_TOKEN_EXPIRY_DAYS: int = Field(default=30, description='Device refresh token expiration time in days (default: 30 days)')
leadr.config.CommonSettings.REGISTRATION_RATE_LIMIT_PER_HOUR¶
REGISTRATION_RATE_LIMIT_PER_HOUR: int = Field(default=3, description='Maximum verification code requests per email per hour (default: 3)')
leadr.config.CommonSettings.SCORE_METADATA_MAX_SIZE_BYTES¶
SCORE_METADATA_MAX_SIZE_BYTES: int = Field(default=1024, description='Maximum size in bytes for score metadata JSON (default: 1KB)')
leadr.config.CommonSettings.SOURCE_OAUTH_BASE_URL¶
SOURCE_OAUTH_BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description='Base URL for OAuth provider')
leadr.config.CommonSettings.SUPERADMIN_ACCOUNT_NAME¶
SUPERADMIN_ACCOUNT_NAME: str = Field(default='LEADR', description='Name of the system account for superadmin users')
leadr.config.CommonSettings.SUPERADMIN_ACCOUNT_SLUG¶
SUPERADMIN_ACCOUNT_SLUG: str = Field(default='leadr', description='URL-friendly slug for the superadmin system account')
leadr.config.CommonSettings.SUPERADMIN_API_KEY¶
SUPERADMIN_API_KEY: str = Field(default=..., description='API key for the superadmin user. REQUIRED for bootstrap.')
leadr.config.CommonSettings.SUPERADMIN_API_KEY_NAME¶
SUPERADMIN_API_KEY_NAME: str = Field(default='Superadmin Key', description='Display name for the superadmin API key')
leadr.config.CommonSettings.SUPERADMIN_DISPLAY_NAME¶
SUPERADMIN_DISPLAY_NAME: str = Field(default='LEADR Admin', description='Display name for the superadmin user')
leadr.config.CommonSettings.SUPERADMIN_EMAIL¶
SUPERADMIN_EMAIL: str = Field(default='admin@leadr.gg', description='Email address for the superadmin user')
leadr.config.CommonSettings.TESTING_EMAIL¶
TESTING_EMAIL: str = Field(default='hello@example.com', description='Email address used for testing purposes')
leadr.config.CommonSettings.VERIFICATION_CODE_EXPIRY_SECONDS¶
VERIFICATION_CODE_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for email verification codes in seconds (default: 10 minutes)')
leadr.config.CommonSettings.VERIFICATION_TOKEN_EXPIRY_SECONDS¶
VERIFICATION_TOKEN_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for verification JWT tokens in seconds (default: 10 minutes)')
leadr.config.CommonSettings.model_config¶
model_config = SettingsConfigDict(case_sensitive=True, extra='ignore')
leadr.config.CommonSettings.validate_api_enabled¶
validate_api_enabled()
Ensure at least one API (Admin or Client) is enabled.
leadr.config.PROJ_ROOT¶
PROJ_ROOT = Path.cwd()
leadr.config.Settings¶
Bases: CommonSettings
Production/development environment settings.
Inherits all settings from CommonSettings. Loads configuration from the .env file at the project root.
This is the default settings class used when ENV != 'TEST'.
Functions:
- validate_api_enabled – Ensure at least one API (Admin or Client) is enabled.
Attributes:
- ACCESS_TOKEN_EXPIRY_HOURS (
int) – - ANTICHEAT_DUPLICATE_WINDOW_SECONDS (
int) – - ANTICHEAT_ENABLED (
bool) – - ANTICHEAT_LOGGING_ONLY (
bool) – - ANTICHEAT_MIN_SAMPLES_FOR_STATS (
int) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_A (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_B (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_C (
float) – - ANTICHEAT_RATE_LIMIT_TIER_A (
int) – - ANTICHEAT_RATE_LIMIT_TIER_B (
int) – - ANTICHEAT_RATE_LIMIT_TIER_C (
int) – - ANTICHEAT_VELOCITY_THRESHOLD_SECONDS (
float) – - API_KEY_SECRET (
str) – - API_PREFIX (
str) – - APP (
str) – - BACKGROUND_TASK_EXPIRE_INTERVAL (
int) – - BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL (
int) – - BACKGROUND_TASK_TEMPLATE_INTERVAL (
int) – - BASE_URL (
HttpUrl) – - DASHBOARD_URL (
HttpUrl) – - DB_ECHO (
bool) – - DB_HOST (
str) – - DB_HOST_DIRECT (
str | None) – - DB_NAME (
str) – - DB_PASSWORD (
str) – - DB_POOL_MAX_OVERFLOW (
int) – - DB_POOL_RECYCLE (
int) – - DB_POOL_SIZE (
int) – - DB_PORT (
int) – - DB_USER (
str) – - DEBUG (
bool) – - DEV_OVERRIDE_IP (
str | None) – - ENABLE_ADMIN_API (
bool) – - ENABLE_CLIENT_API (
bool) – - ENV (
str) – - GEOIP_DATABASE_PATH (
Path) – - GEOIP_REFRESH_DAYS (
int) – - JWT_LIFETIME_SECONDS (
int) – - JWT_SECRET (
str) – - KEYS_PATH (
Path) – - LOG_DIR (
Path) – - LOG_JSON (
bool) – - LOG_TO_FILE (
bool) – - MAILGUN_API_KEY (
str) – - MAILGUN_DOMAIN (
str) – - MAXMIND_ACCOUNT_ID (
str) – - MAXMIND_CITY_DB_URL (
str) – - MAXMIND_COUNTRY_DB_URL (
str) – - MAXMIND_LICENSE_KEY (
str) – - REFRESH_TOKEN_EXPIRY_DAYS (
int) – - REGISTRATION_RATE_LIMIT_PER_HOUR (
int) – - SCORE_METADATA_MAX_SIZE_BYTES (
int) – - SOURCE_OAUTH_BASE_URL (
HttpUrl) – - SUPERADMIN_ACCOUNT_NAME (
str) – - SUPERADMIN_ACCOUNT_SLUG (
str) – - SUPERADMIN_API_KEY (
str) – - SUPERADMIN_API_KEY_NAME (
str) – - SUPERADMIN_DISPLAY_NAME (
str) – - SUPERADMIN_EMAIL (
str) – - TESTING_EMAIL (
str) – - VERIFICATION_CODE_EXPIRY_SECONDS (
int) – - VERIFICATION_TOKEN_EXPIRY_SECONDS (
int) – - model_config –
leadr.config.TestSettings¶
Bases: CommonSettings
Test environment settings.
Inherits all settings from CommonSettings. Loads configuration from the .env.test file at the project root.
Used automatically when ENV='TEST' (set by test.sh script). Test-specific overrides can be added here.
Functions:
- validate_api_enabled – Ensure at least one API (Admin or Client) is enabled.
Attributes:
- ACCESS_TOKEN_EXPIRY_HOURS (
int) – - ANTICHEAT_DUPLICATE_WINDOW_SECONDS (
int) – - ANTICHEAT_ENABLED (
bool) – - ANTICHEAT_LOGGING_ONLY (
bool) – - ANTICHEAT_MIN_SAMPLES_FOR_STATS (
int) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_A (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_B (
float) – - ANTICHEAT_OUTLIER_THRESHOLD_TIER_C (
float) – - ANTICHEAT_RATE_LIMIT_TIER_A (
int) – - ANTICHEAT_RATE_LIMIT_TIER_B (
int) – - ANTICHEAT_RATE_LIMIT_TIER_C (
int) – - ANTICHEAT_VELOCITY_THRESHOLD_SECONDS (
float) – - API_KEY_SECRET (
str) – - API_PREFIX (
str) – - APP (
str) – - BACKGROUND_TASK_EXPIRE_INTERVAL (
int) – - BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL (
int) – - BACKGROUND_TASK_TEMPLATE_INTERVAL (
int) – - BASE_URL (
HttpUrl) – - DASHBOARD_URL (
HttpUrl) – - DB_ECHO (
bool) – - DB_HOST (
str) – - DB_HOST_DIRECT (
str | None) – - DB_NAME (
str) – - DB_PASSWORD (
str) – - DB_POOL_MAX_OVERFLOW (
int) – - DB_POOL_RECYCLE (
int) – - DB_POOL_SIZE (
int) – - DB_PORT (
int) – - DB_USER (
str) – - DEBUG (
bool) – - DEV_OVERRIDE_IP (
str | None) – - ENABLE_ADMIN_API (
bool) – - ENABLE_CLIENT_API (
bool) – - ENV (
str) – - GEOIP_DATABASE_PATH (
Path) – - GEOIP_REFRESH_DAYS (
int) – - JWT_LIFETIME_SECONDS (
int) – - JWT_SECRET (
str) – - KEYS_PATH (
Path) – - LOG_DIR (
Path) – - LOG_JSON (
bool) – - LOG_TO_FILE (
bool) – - MAILGUN_API_KEY (
str) – - MAILGUN_DOMAIN (
str) – - MAXMIND_ACCOUNT_ID (
str) – - MAXMIND_CITY_DB_URL (
str) – - MAXMIND_COUNTRY_DB_URL (
str) – - MAXMIND_LICENSE_KEY (
str) – - REFRESH_TOKEN_EXPIRY_DAYS (
int) – - REGISTRATION_RATE_LIMIT_PER_HOUR (
int) – - SCORE_METADATA_MAX_SIZE_BYTES (
int) – - SOURCE_OAUTH_BASE_URL (
HttpUrl) – - SUPERADMIN_ACCOUNT_NAME (
str) – - SUPERADMIN_ACCOUNT_SLUG (
str) – - SUPERADMIN_API_KEY (
str) – - SUPERADMIN_API_KEY_NAME (
str) – - SUPERADMIN_DISPLAY_NAME (
str) – - SUPERADMIN_EMAIL (
str) – - TESTING_EMAIL (
str) – - VERIFICATION_CODE_EXPIRY_SECONDS (
int) – - VERIFICATION_TOKEN_EXPIRY_SECONDS (
int) – - model_config –
leadr.config.TestSettings.ACCESS_TOKEN_EXPIRY_HOURS¶
ACCESS_TOKEN_EXPIRY_HOURS: int = Field(default=24, description='Device access token expiration time in hours (default: 24 hours)')
leadr.config.TestSettings.ANTICHEAT_DUPLICATE_WINDOW_SECONDS¶
ANTICHEAT_DUPLICATE_WINDOW_SECONDS: int = Field(default=300, description='Time window in seconds for detecting duplicate score submissions (default: 5 minutes)')
leadr.config.TestSettings.ANTICHEAT_ENABLED¶
ANTICHEAT_ENABLED: bool = Field(default=False, description='Enable anti-cheat checks on score submissions')
leadr.config.TestSettings.ANTICHEAT_LOGGING_ONLY¶
ANTICHEAT_LOGGING_ONLY: bool = Field(default=True, description="Log anti-cheat detections but don't reject/flag submissions (dry-run mode)")
leadr.config.TestSettings.ANTICHEAT_MIN_SAMPLES_FOR_STATS¶
ANTICHEAT_MIN_SAMPLES_FOR_STATS: int = Field(default=10, description='Minimum number of scores required before statistical outlier detection is enabled')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_A¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_A: float = Field(default=4.0, description='Outlier threshold for Tier A devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_B¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_B: float = Field(default=3.0, description='Outlier threshold for Tier B devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_C¶
ANTICHEAT_OUTLIER_THRESHOLD_TIER_C: float = Field(default=2.5, description='Outlier threshold for Tier C devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_A¶
ANTICHEAT_RATE_LIMIT_TIER_A: int = Field(default=100, description='Rate limit for Tier A (trusted) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_B¶
ANTICHEAT_RATE_LIMIT_TIER_B: int = Field(default=50, description='Rate limit for Tier B (verified) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_C¶
ANTICHEAT_RATE_LIMIT_TIER_C: int = Field(default=20, description='Rate limit for Tier C (unverified) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_VELOCITY_THRESHOLD_SECONDS¶
ANTICHEAT_VELOCITY_THRESHOLD_SECONDS: float = Field(default=2.0, description='Minimum time between submissions to avoid velocity detection (in seconds)')
leadr.config.TestSettings.API_KEY_SECRET¶
API_KEY_SECRET: str = Field(default='your-super-secret-api-key-pepper-change-in-production', description='Secret pepper for API key hashing. MUST be changed in production.')
leadr.config.TestSettings.API_PREFIX¶
API_PREFIX: str = Field(default='/v1', description="API route prefix for versioning (e.g., '/v1')")
leadr.config.TestSettings.APP¶
APP: str = Field(default='LEADR', description='Application name identifier')
leadr.config.TestSettings.BACKGROUND_TASK_EXPIRE_INTERVAL¶
BACKGROUND_TASK_EXPIRE_INTERVAL: int = Field(default=60, description='Interval in seconds for expiring boards (default: 60s)')
leadr.config.TestSettings.BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL¶
BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL: int = Field(default=3600, description='Interval in seconds for cleaning up expired nonces (default: 3600s / 1 hour)')
leadr.config.TestSettings.BACKGROUND_TASK_TEMPLATE_INTERVAL¶
BACKGROUND_TASK_TEMPLATE_INTERVAL: int = Field(default=60, description='Interval in seconds for processing due board templates (default: 60s)')
leadr.config.TestSettings.BASE_URL¶
BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="Base URL for the API server (e.g., 'https://api.leadr.gg')")
leadr.config.TestSettings.DASHBOARD_URL¶
DASHBOARD_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="URL for the web dashboard (e.g., 'https://dashboard.leadr.gg')")
leadr.config.TestSettings.DB_ECHO¶
DB_ECHO: bool = Field(default=False, description='Log all SQL queries to stdout (useful for debugging)')
leadr.config.TestSettings.DB_HOST¶
DB_HOST: str = Field(default='localhost', description='PostgreSQL database host')
leadr.config.TestSettings.DB_HOST_DIRECT¶
DB_HOST_DIRECT: str | None = Field(default=None, description='Direct PostgreSQL host for migrations (bypasses connection pooler). If not set, falls back to DB_HOST. For Neon, use the non-pooler endpoint.')
leadr.config.TestSettings.DB_NAME¶
DB_NAME: str = Field(default='leadr', description='PostgreSQL database name')
leadr.config.TestSettings.DB_PASSWORD¶
DB_PASSWORD: str = Field(default='leadr', description='PostgreSQL database password')
leadr.config.TestSettings.DB_POOL_MAX_OVERFLOW¶
DB_POOL_MAX_OVERFLOW: int = Field(default=10, description='Maximum overflow connections beyond pool size')
leadr.config.TestSettings.DB_POOL_RECYCLE¶
DB_POOL_RECYCLE: int = Field(default=3600, description='Recycle database connections after this many seconds (default: 1 hour)')
leadr.config.TestSettings.DB_POOL_SIZE¶
DB_POOL_SIZE: int = Field(default=20, description='Number of database connections to maintain in the pool')
leadr.config.TestSettings.DB_PORT¶
DB_PORT: int = Field(default=5432, description='PostgreSQL database port')
leadr.config.TestSettings.DB_USER¶
DB_USER: str = Field(default='leadr', description='PostgreSQL database user')
leadr.config.TestSettings.DEBUG¶
DEBUG: bool = Field(default=False, description='Enable debug mode with verbose logging and error details')
leadr.config.TestSettings.DEV_OVERRIDE_IP¶
DEV_OVERRIDE_IP: str | None = Field(default=None, description='Override IP address for development/testing (bypasses localhost detection)')
leadr.config.TestSettings.ENABLE_ADMIN_API¶
ENABLE_ADMIN_API: bool = Field(default=False, description='Enable admin API endpoints')
leadr.config.TestSettings.ENABLE_CLIENT_API¶
ENABLE_CLIENT_API: bool = Field(default=False, description='Enable client API endpoints')
leadr.config.TestSettings.ENV¶
ENV: str = Field(default=..., description="Environment name (e.g., 'DEV', 'PROD', 'TEST'). Required.")
leadr.config.TestSettings.GEOIP_DATABASE_PATH¶
GEOIP_DATABASE_PATH: Path = Field(default=(PROJ_ROOT / '.geoip'), description='Directory path for storing GeoIP databases')
leadr.config.TestSettings.GEOIP_REFRESH_DAYS¶
GEOIP_REFRESH_DAYS: int = Field(default=7, description='Number of days between GeoIP database refresh downloads (default: 7 days)')
leadr.config.TestSettings.JWT_LIFETIME_SECONDS¶
JWT_LIFETIME_SECONDS: int = Field(default=3600, description='JWT token lifetime in seconds (default: 1 hour)')
leadr.config.TestSettings.JWT_SECRET¶
JWT_SECRET: str = Field(default='your-super-secret-jwt-key-change-in-production', description='Secret key for JWT token signing. MUST be changed in production.')
leadr.config.TestSettings.KEYS_PATH¶
KEYS_PATH: Path = Field(default=(PROJ_ROOT / '.keys'), description='Directory path for storing cryptographic keys')
leadr.config.TestSettings.LOG_DIR¶
LOG_DIR: Path = Field(default=(Path('/var/log/leadr')), description='Directory for log files when LOG_TO_FILE is enabled')
leadr.config.TestSettings.LOG_JSON¶
LOG_JSON: bool = Field(default=True, description='Use JSON format for logs (disable for colored console in dev)')
leadr.config.TestSettings.LOG_TO_FILE¶
LOG_TO_FILE: bool = Field(default=False, description='Enable file logging in addition to stdout')
leadr.config.TestSettings.MAILGUN_API_KEY¶
MAILGUN_API_KEY: str = Field(default='mailgun_api_key', description='Mailgun API key for email sending')
leadr.config.TestSettings.MAILGUN_DOMAIN¶
MAILGUN_DOMAIN: str = Field(default='example.mailgun.org', description='Mailgun domain for email sending')
leadr.config.TestSettings.MAXMIND_ACCOUNT_ID¶
MAXMIND_ACCOUNT_ID: str = Field(default='', description='MaxMind account ID for database downloads (used for basic auth)')
leadr.config.TestSettings.MAXMIND_CITY_DB_URL¶
MAXMIND_CITY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz', description='MaxMind GeoLite2 City database download URL')
leadr.config.TestSettings.MAXMIND_COUNTRY_DB_URL¶
MAXMIND_COUNTRY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz', description='MaxMind GeoLite2 Country database download URL')
leadr.config.TestSettings.MAXMIND_LICENSE_KEY¶
MAXMIND_LICENSE_KEY: str = Field(default='', description='MaxMind license key for database downloads (used for basic auth)')
leadr.config.TestSettings.REFRESH_TOKEN_EXPIRY_DAYS¶
REFRESH_TOKEN_EXPIRY_DAYS: int = Field(default=30, description='Device refresh token expiration time in days (default: 30 days)')
leadr.config.TestSettings.REGISTRATION_RATE_LIMIT_PER_HOUR¶
REGISTRATION_RATE_LIMIT_PER_HOUR: int = Field(default=3, description='Maximum verification code requests per email per hour (default: 3)')
leadr.config.TestSettings.SCORE_METADATA_MAX_SIZE_BYTES¶
SCORE_METADATA_MAX_SIZE_BYTES: int = Field(default=1024, description='Maximum size in bytes for score metadata JSON (default: 1KB)')
leadr.config.TestSettings.SOURCE_OAUTH_BASE_URL¶
SOURCE_OAUTH_BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description='Base URL for OAuth provider')
leadr.config.TestSettings.SUPERADMIN_ACCOUNT_NAME¶
SUPERADMIN_ACCOUNT_NAME: str = Field(default='LEADR', description='Name of the system account for superadmin users')
leadr.config.TestSettings.SUPERADMIN_ACCOUNT_SLUG¶
SUPERADMIN_ACCOUNT_SLUG: str = Field(default='leadr', description='URL-friendly slug for the superadmin system account')
leadr.config.TestSettings.SUPERADMIN_API_KEY¶
SUPERADMIN_API_KEY: str = Field(default='ldr_test_superadmin_key_for_testing_12345678', description='Test superadmin API key (must start with ldr_)')
leadr.config.TestSettings.SUPERADMIN_API_KEY_NAME¶
SUPERADMIN_API_KEY_NAME: str = Field(default='Superadmin Key', description='Display name for the superadmin API key')
leadr.config.TestSettings.SUPERADMIN_DISPLAY_NAME¶
SUPERADMIN_DISPLAY_NAME: str = Field(default='LEADR Admin', description='Display name for the superadmin user')
leadr.config.TestSettings.SUPERADMIN_EMAIL¶
SUPERADMIN_EMAIL: str = Field(default='admin@leadr.gg', description='Email address for the superadmin user')
leadr.config.TestSettings.TESTING_EMAIL¶
TESTING_EMAIL: str = Field(default='hello@example.com', description='Email address used for testing purposes')
leadr.config.TestSettings.VERIFICATION_CODE_EXPIRY_SECONDS¶
VERIFICATION_CODE_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for email verification codes in seconds (default: 10 minutes)')
leadr.config.TestSettings.VERIFICATION_TOKEN_EXPIRY_SECONDS¶
VERIFICATION_TOKEN_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for verification JWT tokens in seconds (default: 10 minutes)')
leadr.config.TestSettings.model_config¶
model_config = SettingsConfigDict(case_sensitive=True, extra='ignore')
leadr.config.TestSettings.validate_api_enabled¶
validate_api_enabled()
Ensure at least one API (Admin or Client) is enabled.
leadr.config.settings¶
settings = TestSettings(_env_file=(Path(PROJ_ROOT, '.env.test'))) if os.environ.get('ENV') == 'TEST' else Settings(_env_file=(Path(PROJ_ROOT, '.env')))