TrainSafe — это учебный проект, демонстрирующий микросервисный подход к разработке информационной системы с ролевым доступом, двухфакторной аутентификацией (2FA) и возможностью перехвата, аудита и выполнения SQL-запросов.
- Проверка IP-адреса клиента, от которого исходят запросы к БД. Если IP-адрес не входит в разрешенный диапазон, запросы игнорируются
- Генерация 2FA кода, который валиден в течение 5 минут
- Генерация сессии для успешно-авторизованного пользователя (после ввода 2FA с временем действия 30 мин)
- Проверка учетных данных пользователя
- Перехват, проверка и валидация SQL-запросов, исходящих от клиента
- Ведение реестра сессий
- Логирование запросов и ведение реестра логов
.
├── DB_init.py # Скрипт с инициализацией БД
├── README.md # Описание проекта
├── app-config.yaml # K8s ConfigMap
├── client.py # Клиентский интерфейс для взаимодействия с микросервисами
├── credit_train.csv # Пример датасета для загрузки в БД
├── docker-compose.yml # Docker-compose файл
├── monitoring # Папка с k8s манифестами Prometheus и Grafana
│ ├── cadvisor-deployment.yaml
│ └── prometheus-values.yaml
├── photos # Папка с изображениями для README
│ ├── Архитектура паттерна общая2.drawio.png
│ └── Архитектура паттерна общая3.drawio.png
├── request_service # Микросервис для обработки SQL-запросов
│ ├── Dockerfile
│ ├── request-service-deployment.yaml
│ ├── request-service-service.yaml
│ ├── request_service.py
│ └── requirements.txt
├── requirements.txt # Требуемые библиотеки
├── server # Основной микросервис с применением паттерна "Цепочка ответственности"
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── server-deployment.yaml
│ ├── server-service.yaml
│ └── server.py
└── two_factor_service # Микросервис для генерации 2FA кодов и их проверкой
├── Dockerfile
├── requirements.txt
├── two-factor-service-deployment.yaml
├── two-factor-service-service.yaml
└── two_factor_service.py
Диаграмма последовательности 1 (концептуальный уровень):
Диаграмма последовательности 2 (технический уровень):

Реализация через Docker-compose (БД и приложение на удаленных VM):

Реализация через K8s (Minikube на локальной машине, БД - на удаленной VM):

- Клонирование репозитория
git clone https://github.com/EgorSinitsyn/TrainSave- Установка MySQL на локальную машину, убедитесь, что сервер запущен
- Создайте файл .env в корне проекта, поместите туда креды от СУБД MySQL. В качестве примера в репозитории уже есть .env
- Инициализируйте БД с нужной структурой
python DB_init.py- Установка зависимостей
pip install -r requirements.txt- Запуск микросервисов
python server/server.py
python request_service/request_service.py
python two_factor_service/two_factor_service.py- Запуск клиентского интерфейса
python client.py- Установка Docker и Docker-compose
- Создание образов (опционально)
docker build -t server_module ./server
docker build -t request_service_module ./request_service
docker build -t two_factor_service_module ./two_factor_service- Запуск и билд контейнеров через Docker-compose
docker-compose up --build- Запуск клиентского интерфейса
python client.py- Взаимодейтсвие с мультиконтейнерным приложением через клиентское приложение. Скрипты микросервисов включать не нужно
- Если мультиконтейнерное приложение запущено на удаленном хосте, измените эндпоинты в файле client.py (см. стоки 5 - 13)
- Старт Minikube
minikube start --cpus=4 --memory=5192- Проверяем запуск кластера
kubectl cluster-info- Применение ConfigMap
kubectl apply -f app-config.yaml- Применение деплойментов
kubectl apply -f ./server/server-deployment.yaml
kubectl apply -f ./request_service/request-service-deployment.yaml
kubectl apply -f ./two_factor_service/two-factor-service-deployment.yaml- Применение сервисов
kubectl apply -f ./server/server-service.yaml
kubectl apply -f ./request_service/request-service-service.yaml
kubectl apply -f ./two_factor_service/two-factor-service-service.yaml- Связываем локальный Docker с Minikube
eval $(minikube docker-env)- Создаем образы (обязательно выполнить пред команду)
docker build -t server_module ./server
docker build -t request_service_module ./request_service
docker build -t two_factor_service_module ./two_factor_service- Они обязательно должны отобразиться в Minikube
eval $(minikube docker-env)
docker images- Стягиваем образы в Minikube
minikube image load server_module:latest
minikube image load request_service_module:latest
minikube image load two_factor_service_module:latest- Проверяем статус подов (должно быть running) и сервисов
kubectl get pods
kubectl get svc- Проброс локального хоста в Minikube
kubectl port-forward service/server-service 6000:6000- Устанавливаем Helm, Grafana и Prometheus
- Применяем манифест cadvisor
kubectl apply -f ./monitoring/cadvisor-deployment.yaml- Применяем манифест prometheus
helm upgrade prometheus prometheus-community/prometheus -n monitoring -f monitoring/prometheus-values.yaml- Получаем пароль от Grafana
kubectl get secret -n monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode- Порт-форвард для prometheus и grafana
kubectl port-forward -n monitoring svc/prometheus-server 9090:80
kubectl port-forward -n monitoring svc/grafana 3000:80- Заходим на дашборды Prometheus и Grafana через localhost:9090 и localhost:3000 соответственно
- В дашборде Prometheus все поды должны быть в статусе UP
- В дашборде Grafana добавляем источник данных Prometheus (Connections -> Add data source)
- Импортируем дашборды и мониторим кластер
- Запускаем клиентское приложение и взаимодействуем через localhost:6000
python client.py