Create KUMA stateless service

This commit is contained in:
“Naeel”
2026-08-26 12:40:33 +03:00
commit 749c96e1aa
5 changed files with 219 additions and 0 deletions
+60
View File
@@ -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
+12
View File
@@ -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"]
+103
View File
@@ -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 ещё не реализована.
+43
View File
@@ -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")))
+1
View File
@@ -0,0 +1 @@
flask