Create KUMA stateless service
This commit is contained in:
+60
@@ -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
@@ -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"]
|
||||||
@@ -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
@@ -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")))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
Reference in New Issue
Block a user