Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website, Klausur-Service, School-Service, Voice-Service, Geo-Service, BreakPilot Drive, Agent-Core Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
"""
|
|
GeoEdu Service Configuration
|
|
Environment-based configuration with Pydantic Settings
|
|
"""
|
|
from functools import lru_cache
|
|
from typing import Optional
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
"""Application settings loaded from environment variables."""
|
|
|
|
model_config = SettingsConfigDict(
|
|
env_file=".env",
|
|
env_file_encoding="utf-8",
|
|
case_sensitive=False,
|
|
)
|
|
|
|
# Service Config
|
|
port: int = 8088
|
|
environment: str = "development"
|
|
debug: bool = False
|
|
|
|
# JWT Authentication
|
|
jwt_secret: str = "your-super-secret-jwt-key"
|
|
jwt_algorithm: str = "HS256"
|
|
jwt_expiration_hours: int = 24
|
|
|
|
# PostgreSQL (PostGIS)
|
|
database_url: str = "postgresql+asyncpg://breakpilot:breakpilot123@postgres:5432/breakpilot_db"
|
|
|
|
# MinIO (S3-compatible storage)
|
|
minio_endpoint: str = "minio:9000"
|
|
minio_access_key: str = "breakpilot"
|
|
minio_secret_key: str = "breakpilot123"
|
|
minio_bucket: str = "breakpilot-geo"
|
|
minio_secure: bool = False
|
|
|
|
# Ollama (LLM for learning nodes)
|
|
ollama_base_url: str = "http://host.docker.internal:11434"
|
|
ollama_model: str = "qwen2.5:14b"
|
|
ollama_timeout: int = 120
|
|
|
|
# Data Directories
|
|
osm_data_dir: str = "/app/data/osm"
|
|
dem_data_dir: str = "/app/data/dem"
|
|
tile_cache_dir: str = "/app/cache/tiles"
|
|
bundle_dir: str = "/app/bundles"
|
|
|
|
# Tile Server Config
|
|
default_pmtiles_file: str = "germany.pmtiles"
|
|
tile_cache_max_size_gb: float = 50.0
|
|
|
|
# DEM Config
|
|
dem_resolution: str = "GLO-30" # 30m Copernicus DEM
|
|
terrain_tile_size: int = 256
|
|
|
|
# AOI Limits (DSGVO data minimization)
|
|
max_aoi_size_km2: float = 4.0 # Max 4 km² per AOI
|
|
max_aoi_per_user: int = 10
|
|
aoi_retention_days: int = 30 # Auto-delete after 30 days
|
|
|
|
# Learning Nodes
|
|
max_nodes_per_aoi: int = 20
|
|
supported_themes: list[str] = [
|
|
"topographie",
|
|
"landnutzung",
|
|
"orientierung",
|
|
"geologie",
|
|
"hydrologie",
|
|
"vegetation",
|
|
]
|
|
|
|
# CORS (for frontend access)
|
|
cors_origins: list[str] = [
|
|
"http://localhost:3000",
|
|
"http://localhost:3001",
|
|
"http://localhost:8088",
|
|
]
|
|
|
|
@property
|
|
def pmtiles_path(self) -> str:
|
|
"""Full path to PMTiles file."""
|
|
return f"{self.osm_data_dir}/{self.default_pmtiles_file}"
|
|
|
|
@property
|
|
def is_development(self) -> bool:
|
|
"""Check if running in development mode."""
|
|
return self.environment == "development"
|
|
|
|
|
|
@lru_cache
|
|
def get_settings() -> Settings:
|
|
"""Get cached settings instance."""
|
|
return Settings()
|
|
|
|
|
|
# Export settings instance for convenience
|
|
settings = get_settings()
|