c9d9c0f9dd
Add password-protected setup page (/api/setup) for DB initialization, admin creation, and demo data seeding. Dockerize the full stack with server, client, nginx reverse proxy, and MySQL services. Add project README with architecture overview, quick start, and VPS deployment guide. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""TieMeasureFlow Server Configuration."""
|
|
from pathlib import Path
|
|
from pydantic_settings import BaseSettings
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
"""Application settings loaded from environment variables."""
|
|
|
|
# Database
|
|
db_host: str = "localhost"
|
|
db_port: int = 3306
|
|
db_name: str = "tiemeasureflow"
|
|
db_user: str = "tmflow"
|
|
db_password: str = "change_me_in_production"
|
|
|
|
# Server
|
|
server_host: str = "0.0.0.0"
|
|
server_port: int = 8000
|
|
server_secret_key: str = "change-this-to-a-random-secret-key"
|
|
server_cors_origins: str = "http://localhost:5000"
|
|
|
|
# File Storage
|
|
upload_dir: str = "uploads"
|
|
max_upload_size_mb: int = 50
|
|
|
|
# Rate Limiting (requests per minute)
|
|
rate_limit_login: int = 5
|
|
rate_limit_general: int = 100
|
|
|
|
# SSL (Production)
|
|
ssl_certfile: str | None = None
|
|
ssl_keyfile: str | None = None
|
|
|
|
# Setup page (empty = disabled)
|
|
setup_password: str | None = None
|
|
|
|
@property
|
|
def database_url(self) -> str:
|
|
"""Async MySQL connection string."""
|
|
return (
|
|
f"mysql+asyncmy://{self.db_user}:{self.db_password}"
|
|
f"@{self.db_host}:{self.db_port}/{self.db_name}"
|
|
)
|
|
|
|
@property
|
|
def cors_origins(self) -> list[str]:
|
|
"""Parse CORS origins from comma-separated string."""
|
|
return [origin.strip() for origin in self.server_cors_origins.split(",")]
|
|
|
|
@property
|
|
def upload_path(self) -> Path:
|
|
"""Absolute path to upload directory."""
|
|
return Path(__file__).parent / self.upload_dir
|
|
|
|
model_config = {"env_file": "../.env", "env_file_encoding": "utf-8"}
|
|
|
|
|
|
settings = Settings()
|