Files
Sergey Antropoff d1a01cca9e Документация и kubectl из контейнера; Kind Clusters Dashboard
- Цель make docker|podman kubectl CLUSTER=… (KUBECTL_ARGS) — exec kubectl в kind-k8s-web
- README: без kubectl на хосте; раздел про проверку API из контейнера
- create_cluster/cluster_status: подсказки для UI, make kubectl и exec в контейнере
- app/docs: api_routes.md и README.md про kubectl и API workloads
- Прочее: переименование проекта, документация, UI документации (ранее в рабочем дереве)
2026-04-04 06:27:18 +03:00

46 lines
1.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Настройки веб-приложения из переменных окружения.
Переменные задаются в ``docker-compose`` и/или в ``.env`` в корне репозитория
(Compose подставляет их в ``environment`` процесса — отдельный ``env_file`` в коде не требуется).
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
from __future__ import annotations
from pydantic import Field, field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
_DEFAULT_TITLE = "Kind Clusters Dashboard"
class Settings(BaseSettings):
"""Параметры HTTP-сервера и поведения UI."""
model_config = SettingsConfigDict(
extra="ignore",
case_sensitive=False,
# Пустая строка из docker-compose (${VAR:-}) не должна затирать заголовок OpenAPI.
env_ignore_empty=True,
)
kind_k8s_web_host: str = Field(default="0.0.0.0", validation_alias="KIND_K8S_WEB_HOST")
# Согласовано с дефолтом compose на хосте (8080); в контейнере процесс слушает 6000 через run_uvicorn.sh.
kind_k8s_web_port: int = Field(default=8080, validation_alias="KIND_K8S_WEB_PORT")
# Заголовок в OpenAPI / HTML; пустая строка из compose не должна ломать FastAPI.
app_title: str = Field(default=_DEFAULT_TITLE, validation_alias="KIND_K8S_APP_TITLE")
@field_validator("app_title", mode="before")
@classmethod
def _non_empty_title(cls, v: object) -> object:
if v is None or (isinstance(v, str) and not v.strip()):
return _DEFAULT_TITLE
return v
def get_settings() -> Settings:
"""Экземпляр настроек (для импорта в main и роутерах)."""
return Settings()