# Веб-UI kind: том ./clusters, сокет Docker/Podman. Каталог ./app монтируется в контейнер —
# правки Python/шаблонов/static без пересборки образа; uvicorn --reload (см. KIND_K8S_UVICORN_RELOAD).
# Запуск: make docker up
#
# Podman (пример rootless):
#   export CONTAINER_SOCKET="$XDG_RUNTIME_DIR/podman/podman.sock"
#   make podman up
#
# Доступ к сокету: при rootless Podman сокет часто принадлежит вашему UID; процесс в контейнере
# должен совпадать по UID/GID. «make podman …» передаёт KIND_K8S_CONTAINER_UIDGID и HOME (см. Makefile).
# Вручную: KIND_K8S_CONTAINER_UIDGID=$(id -u):$(id -g) KIND_K8S_CONTAINER_HOME=/tmp podman compose up -d
# SELinux (Fedora и т.д.): при «permission denied» попробуйте CONTAINER_SOCKET_VOLUME_OPTS=:Z в .env
# Podman rootless: «make podman …» подключает docker-compose.podman.yml (userns_mode: keep-id), подставляет
# путь к podman.sock и монтирует его в контейнер как /run/podman/podman.sock (см. CONTAINER_SOCKET_MOUNT_TARGET,
# KIND_K8S_REMOTE_SOCKET_URI). В .env нужны KIND_K8S_CONTAINER_UIDGID / KIND_K8S_CONTAINER_HOME (make setup).
#
# Автор: Сергей Антропов — https://devops.org.ru

services:
  kind-k8s-web:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        KIND_VERSION: ${KIND_VERSION:-0.24.0}
        KUBECTL_VERSION: ${KUBECTL_VERSION:-}
        HELM_VERSION: ${HELM_VERSION:-v3.16.3}
    image: kind-k8s-tools:local
    container_name: kind-clusters-dashboard
    # 0:0 — как root в образе (Docker Desktop и т.д.). Для rootless Podman задайте UID:GID владельца сокета.
    user: "${KIND_K8S_CONTAINER_UIDGID:-0:0}"
    volumes:
      - ./clusters:/work/clusters
      - ${CONTAINER_SOCKET:-/var/run/docker.sock}:${CONTAINER_SOCKET_MOUNT_TARGET:-/var/run/docker.sock}${CONTAINER_SOCKET_VOLUME_OPTS:-}
      # Локальная разработка: код с хоста сразу в контейнере (пересборка образа не нужна).
      - ./app:/opt/kind-k8s/app
      # README для /documentation и GET /api/v1/docs/readme (без пересборки образа).
      - ./README.md:/opt/kind-k8s/README.md:ro
    working_dir: /opt/kind-k8s/app
    # Хост по умолчанию 8080: порт 6000 в Chrome/Edge даёт ERR_UNSAFE_PORT; внутри контейнера слушает 6000.
    ports:
      - "${KIND_K8S_WEB_PORT:-8080}:6000"
    # Доступ к apiserver kind с проброшенного порта хоста (kubectl внутри контейнера веб-UI).
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      # Не-root в контейнере: домашний каталог (в образе нет /home/<uid>).
      HOME: ${KIND_K8S_CONTAINER_HOME:-/root}
      # docker-cli и kind читают DOCKER_HOST; путь должен совпадать с правой частью тома сокета выше.
      DOCKER_HOST: ${KIND_K8S_REMOTE_SOCKET_URI:-unix:///var/run/docker.sock}
      KIND_K8S_IN_CONTAINER: "1"
      KIND_K8S_WORKDIR: /work
      # kubeconfig.host на томе; скачивание в UI патчит копию с KIND_K8S_KUBECONFIG_CLIENT_HOST (по умолчанию localhost).
      KIND_K8S_PATCH_KUBECONFIG: ${KIND_K8S_PATCH_KUBECONFIG:-1}
      KIND_K8S_KUBECONFIG_CLIENT_HOST: ${KIND_K8S_KUBECONFIG_CLIENT_HOST:-localhost}
      # Для kubectl внутри контейнера при server=host.docker.internal: SAN kind — localhost (редко менять).
      KIND_K8S_KUBECONFIG_TLS_SERVER_NAME: ${KIND_K8S_KUBECONFIG_TLS_SERVER_NAME:-localhost}
      # Хост в server= для GET …/kubeconfig/docker и для kubectl в контейнере (проброс порта на хост); пусто — host.docker.internal.
      KIND_K8S_APISERVER_GATEWAY_HOST: ${KIND_K8S_APISERVER_GATEWAY_HOST:-}
      CONTAINER_CLI: ${CONTAINER_CLI:-docker}
      KIND_K8S_SKIP_VERSION_LIST: ${KIND_K8S_SKIP_VERSION_LIST:-}
      KIND_K8S_VERSION_LIST_DISPLAY: ${KIND_K8S_VERSION_LIST_DISPLAY:-}
      KIND_K8S_HUB_TAGS_MAX_PAGES: ${KIND_K8S_HUB_TAGS_MAX_PAGES:-}
      KIND_K8S_DEBUG: ${KIND_K8S_DEBUG:-}
      KIND_K8S_JOB_LOG_MAX_LINES: ${KIND_K8S_JOB_LOG_MAX_LINES:-}
      # Псевдо-TTY для потоковых команд (0 = pipe). Для docker pull по умолчанию используется --progress=plain без PTY.
      KIND_K8S_STREAM_PTY: ${KIND_K8S_STREAM_PTY:-}
      KIND_K8S_DOCKER_PULL_PLAIN: ${KIND_K8S_DOCKER_PULL_PLAIN:-}
      # Сколько строк журнала отдавать в GET /api/v1/jobs/{id} (по умолчанию 5000 в коде).
      KIND_K8S_JOB_API_LOG_MAX_LINES: ${KIND_K8S_JOB_API_LOG_MAX_LINES:-}
      KIND_K8S_JOBS_JSON: ${KIND_K8S_JOBS_JSON:-}
      KIND_K8S_README_PATH: ${KIND_K8S_README_PATH:-}
      KIND_K8S_WAIT_NODES: ${KIND_K8S_WAIT_NODES:-}
      KIND_K8S_WAIT_NODES_TIMEOUT_SEC: ${KIND_K8S_WAIT_NODES_TIMEOUT_SEC:-}
      # Таймаут subprocess helm/kubectl на странице «Аддоны» (секунды, 60–7200).
      KIND_K8S_HELM_TIMEOUT_SEC: ${KIND_K8S_HELM_TIMEOUT_SEC:-}
      # Кэш списков версий чартов (helm search repo), секунды; лимит строк на чарт — KIND_K8S_HELM_VERSIONS_MAX.
      KIND_K8S_HELM_VERSIONS_CACHE_SEC: ${KIND_K8S_HELM_VERSIONS_CACHE_SEC:-}
      KIND_K8S_HELM_VERSIONS_MAX: ${KIND_K8S_HELM_VERSIONS_MAX:-}
      # Журнал заданий в clusters/<имя>/journal/jobs_history.json
      KIND_K8S_CLUSTER_JOURNAL_MAX_ENTRIES: ${KIND_K8S_CLUSTER_JOURNAL_MAX_ENTRIES:-}
      KIND_K8S_CLUSTER_JOURNAL_MAX_LOG_LINES: ${KIND_K8S_CLUSTER_JOURNAL_MAX_LOG_LINES:-}
      # Максимум записей в clusters/<имя>/helm_addon_log.json (история Helm).
      KIND_K8S_HELM_ADDON_LOG_MAX_ENTRIES: ${KIND_K8S_HELM_ADDON_LOG_MAX_ENTRIES:-}
      KIND_K8S_APP_TITLE: ${KIND_K8S_APP_TITLE:-}
      # 1 — uvicorn --reload (изменения в ./app); 0 — один процесс без reload.
      KIND_K8S_UVICORN_RELOAD: ${KIND_K8S_UVICORN_RELOAD:-1}
    command: ["/opt/kind-k8s/run_uvicorn.sh"]
