Add KUMA UI health endpoint workflow

This commit is contained in:
“Naeel”
2026-08-26 16:34:24 +03:00
parent 8a15e705cd
commit 8dc373142a
3 changed files with 85 additions and 3 deletions
+3 -1
View File
@@ -125,7 +125,7 @@ WHITELIST_TIMEOUT=10
## Версионирование
Версия KUMA установлена в `0.0.2`. В дальнейшем увеличивается только третья позиция: `0.0.*`.
Версия KUMA установлена в `0.0.3`. В дальнейшем увеличивается только третья позиция: `0.0.*`.
## SMTP-алерты
@@ -143,3 +143,5 @@ SMTP_SUBJECT_PREFIX=[KUMA]
Для сортировки почты добавлен префикс темы `[KUMA]`. `SMTP_FROM` остаётся реальным адресом SMTP-аккаунта; несуществующий адрес отправителя не используется.
Добавлен UI на `/` для ручной проверки whitelist и отправки алерта. Whitelist URL предустановлен: `https://whitelist.nodejsk8s.services.ngcloud.ru/v2/app`.
`POST /alert` больше не отправляет HTML страницы Keycloak. При редиректе отправляется краткое сообщение со статусом и URL авторизации; обычный ответ ограничен 4000 символами.
+72
View File
@@ -0,0 +1,72 @@
# История чата KUMA
Дата: 2026-08-26
> Секреты и токены замаскированы.
## Запросы и действия
1. Локальный каталог `/home/naeel/nubes/kuma` был привязан к пустому Git-репозиторию:
`https://gitea.services.ngcloud.ru/forcloud/kuma.git`.
2. Создан stateless Flask-сервис KUMA для whitelist:
`https://whitelist.nodejsk8s.services.ngcloud.ru/`.
3. Добавлены Docker-файлы и Python-код. Код перенесён в каталог `src/`.
4. Добавлен `.gitignore` для `.env`, кэшей Python, окружений, логов, БД, бинарников, архивов, IDE и временных файлов.
5. Создан локальный файл секретов `/home/naeel/nubes/kuma/.env`; он игнорируется Git.
6. Создан каталог `History` для документации проекта.
7. Проверен Gitea Container Registry:
`https://gitea.services.ngcloud.ru/v2/`.
8. Образы публиковались в Registry:
- `gitea.services.ngcloud.ru/forcloud/kuma:0.1.0`
- `gitea.services.ngcloud.ru/forcloud/kuma:0.2.0`
- `gitea.services.ngcloud.ru/forcloud/kuma:0.2.1`
- `gitea.services.ngcloud.ru/forcloud/kuma:0.0.1`
- `gitea.services.ngcloud.ru/forcloud/kuma:0.0.2`
9. Зафиксировано правило версий: использовать только формат `0.0.*`.
10. Проверено, что whitelist endpoint без авторизации отвечает `HTTP 302` с перенаправлением на `/v2/login`.
11. В KUMA добавлен `GET /check` для проверки whitelist.
12. Добавлен UI на `/` с предустановленным whitelist URL и ручными кнопками проверки и отправки алерта.
13. Добавлен `POST /alert`, который получает ответ whitelist и отправляет его по SMTP.
14. Для сортировки писем добавлен префикс темы `[KUMA]`.
15. SMTP Яндекса проверен напрямую через `smtp.yandex.ru:465` SSL. После включения обязательной настройки IMAP аутентификация прошла.
16. Git-коммиты и push выполнялись в ветку `master`.
## Текущий managed service
URL UI:
`https://kuma.containerk8s.dev.nubes.ru/`
Актуальный образ:
`gitea.services.ngcloud.ru/forcloud/kuma:0.0.3`
Последний коммит:
`будет создан после текущего изменения`
## Текущие endpoint
- `GET /` — UI KUMA.
- `GET /health` — проверка состояния.
- `GET /check` — запрос whitelist без автоматического перехода по redirect.
- `POST /alert` — отправка ответа whitelist по SMTP.
## Конфигурация
Whitelist URL предустановлен:
`https://whitelist.nodejsk8s.services.ngcloud.ru/v2/app`
SMTP использует сервер Яндекса, SSL-порт `465`, полный email как логин и пароль приложения. Значения логина и пароля в этот файл не записываются.
Тема алертов начинается с:
`[KUMA]`
## Важные уточнения
- IMAP требуется включить в интерфейсе Яндекс Почты, чтобы активировать пароли приложений и OAuth-токены.
- KUMA IMAP не использует и почту не читает.
- KUMA использует SMTP только для отправки алертов.
- Пароли и токены не должны попадать в Git, Dockerfile, образ или History.
+10 -2
View File
@@ -8,7 +8,7 @@ from flask import Flask, jsonify, request
import requests
app = Flask(__name__)
VERSION = "0.0.2"
VERSION = "0.0.3"
WHITELIST_URL = os.getenv(
"WHITELIST_URL",
"https://whitelist.nodejsk8s.services.ngcloud.ru/v2/app",
@@ -100,7 +100,15 @@ def check():
@app.post("/alert")
def alert():
payload = requests.get(request.json.get("url", WHITELIST_URL), timeout=10).text
url = request.json.get("url", WHITELIST_URL)
response = requests.get(url, allow_redirects=False, timeout=10)
if response.is_redirect:
payload = (
f"Whitelist недоступен без авторизации. HTTP {response.status_code}. "
f"URL авторизации: {response.headers.get('Location', 'не указан')}"
)
else:
payload = f"Whitelist HTTP {response.status_code}\n\n{response.text[:4000]}"
try:
send_alert("KUMA whitelist alert", payload)
return jsonify({"ok": True, "sent": True})