commit 749c96e1aa983066b9ddb2e3cd6cfc9b37971429 Author: “Naeel” Date: Wed Aug 26 12:40:33 2026 +0300 Create KUMA stateless service diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..83d948b --- /dev/null +++ b/.gitignore @@ -0,0 +1,60 @@ +.env +.env.* +!.env.example + +# Python generated files +__pycache__/ +*.py[cod] +.pytest_cache/ + +# Python environments and tooling +.venv/ +venv/ +env/ +ENV/ +.mypy_cache/ +.ruff_cache/ +.tox/ +.nox/ +*.egg-info/ +dist/ +build/ +pip-wheel-metadata/ + +# Coverage and test reports +.coverage +.coverage.* +htmlcov/ +coverage.xml +*.cover + +# Logs, temporary files, databases +*.log +*.tmp +*.temp +*.swp +*.swo +*.sqlite +*.sqlite3 +*.db + +# Compiled binaries and archives +*.o +*.a +*.so +*.dll +*.dylib +*.exe +*.bin +*.zip +*.tar +*.tar.gz +*.tgz + +# IDE and OS files +.idea/ +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +.DS_Store +Thumbs.db diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..484d48e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY src/requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + +COPY src/app.py . + +EXPOSE 5000 + +CMD ["python3", "app.py"] \ No newline at end of file diff --git a/History/2026-08-26.md b/History/2026-08-26.md new file mode 100644 index 0000000..3d40e04 --- /dev/null +++ b/History/2026-08-26.md @@ -0,0 +1,103 @@ +# KUMA: история работ + +Дата: 2026-08-26 + +## Цель + +Создать сервис KUMA для алертов по whitelist: + +- https://whitelist.nodejsk8s.services.ngcloud.ru/ + +Первый этап: stateless-хранилище. В дальнейшем планируется MariaDB. + +## Git + +Локальный каталог проекта: + +- `/home/naeel/nubes/kuma` + +Удалённый Git-репозиторий: + +- `https://gitea.services.ngcloud.ru/forcloud/kuma.git` + +Репозиторий был пустым, затем клонирован в локальный каталог. Remote `origin` настроен на указанный адрес. + +## Реализация + +Создан минимальный Flask HTTP-сервис: + +- `GET /` возвращает JSON с параметрами сервиса и MariaDB. +- `GET /health` возвращает состояние сервиса. +- `GET /mariadb` возвращает параметры MariaDB. +- Пароль MariaDB не возвращается; выводится только `passwordConfigured`. +- Конфигурация задаётся переменными окружения. + +Файлы: + +- `Dockerfile` +- `app.py` +- `requirements.txt` + +## Docker + +Локальный образ: + +- `kuma:0.1.0` + +Опубликованный образ: + +- `gitea.services.ngcloud.ru/forcloud/kuma:0.1.0` + +Digest опубликованного образа: + +- `sha256:15e7ef5c9e125c81222cffe1c8c4c278c9c148fc432368f01662b4cdbd772f4e` + +Сборка образа и проверка endpoint `/mariadb` выполнены успешно. + +## Переменные окружения + +```json +{ + "MARIADB_DATABASE": "db-kuma", + "MARIADB_HOST": "mariadb", + "MARIADB_PORT": "3306", + "MARIADB_USER": "userkuma", + "MARIADB_VERSION": "9.4.0", + "PORT": "5000" +} +``` + +`MARIADB_PASSWORD` должен передаваться как секрет окружения и не храниться в истории, документации или Docker-образе. + +## Ответ сервиса + +```json +{ + "mariadb": { + "database": "db-kuma", + "host": "mariadb", + "passwordConfigured": true, + "port": 3306, + "user": "userkuma", + "version": "9.4.0" + }, + "service": "kuma", + "state": "stateless", + "target": "https://whitelist.nodejsk8s.services.ngcloud.ru/", + "version": "0.1.0" +} +``` + +## Gitea Container Registry + +Registry endpoint: + +- `https://gitea.services.ngcloud.ru/v2/` + +Проверка без корректного токена возвращала `401 Unauthorized`. С действительным токеном Registry вернул `HTTP 200`. Образ успешно опубликован и манифест проверен. + +## Ограничения текущего этапа + +- Сервис пока не подключается к MariaDB. +- Состояние не сохраняется. +- Логика получения и отправки алертов whitelist ещё не реализована. diff --git a/src/app.py b/src/app.py new file mode 100644 index 0000000..ee8fd8b --- /dev/null +++ b/src/app.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +import os + +from flask import Flask, jsonify + +app = Flask(__name__) +VERSION = "0.1.0" + + +def mariadb_configuration(): + return { + "database": os.getenv("MARIADB_DATABASE", "db-kuma"), + "host": os.getenv("MARIADB_HOST", "mariadb"), + "port": int(os.getenv("MARIADB_PORT", "3306")), + "user": os.getenv("MARIADB_USER", "userkuma"), + "passwordConfigured": bool(os.getenv("MARIADB_PASSWORD")), + "version": os.getenv("MARIADB_VERSION", "9.4.0"), + } + + +@app.get("/") +def index(): + return jsonify({ + "service": "kuma", + "version": VERSION, + "state": "stateless", + "target": "https://whitelist.nodejsk8s.services.ngcloud.ru/", + "mariadb": mariadb_configuration(), + }) + + +@app.get("/health") +def health(): + return jsonify({"ok": True, "version": VERSION}) + + +@app.get("/mariadb") +def mariadb(): + return jsonify(mariadb_configuration()) + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=int(os.getenv("PORT", "5000"))) \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 0000000..8ab6294 --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1 @@ +flask \ No newline at end of file