Files
KindClustersDashboard/docker-compose.yml
Sergey Antropoff eb063aec20 Веб-интерфейс: страница /clusters, навигация и крошки для кластеров
- Выделена страница списка кластеров, панель упрощена; nav_active и крошки
  ведут в раздел Кластеры; theme.js синхронизирует активную пилюлю по URL.
- Доработки дашборда, аддонов, журнала, стилей и API-документации.
- Поддержка Podman: docker-compose.podman.yml, скрипты сокета; Makefile и env.
2026-04-04 13:42:21 +03:00

87 lines
6.1 KiB
YAML
Raw 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.

# Веб-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}
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 на странице «Аддоны» (секунды, 607200).
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"]