# Expense Tracker - Kubernetes Deployment ## Описание приложения Expense Tracker - это веб-приложение для отслеживания личных финансов и управления расходами. Приложение позволяет пользователям: - Добавлять новые транзакции с указанием суммы, типа (доход/расход) и категории - Просматривать историю транзакций - Анализировать расходы по категориям - Отслеживать баланс счета ## Архитектура приложения Приложение построено на стеке MERN (MongoDB, Express.js, React, Node.js) и состоит из трех основных компонентов: 1. **Frontend** - клиентская часть, разработанная на React с использованием Vite для быстрой сборки 2. **Backend** - серверная часть, разработанная на Node.js с использованием Express.js 3. **MongoDB** - база данных для хранения информации о транзакциях ## Список использованных контейнеров 1. **expense-tracker-frontend** - контейнер с клиентской частью приложения - Базовый образ: node:20-bookworm-slim - Роль: Обслуживает пользовательский интерфейс приложения - Порт: 5173 2. **expense-tracker-backend** - контейнер с серверной частью приложения - Базовый образ: node:20-bookworm-slim - Роль: Предоставляет API для работы с данными о транзакциях - Порт: 5000 3. **mongo** - контейнер с базой данных MongoDB - Базовый образ: mongo:latest - Роль: Хранение данных приложения - Порт: 27017 ## Kubernetes объекты и их описание 1. **Namespace** - Имя: expense-tracker - Роль: Изолированное пространство имен для всех ресурсов приложения 2. **Deployment** - Frontend Deployment: Управляет репликами Pod с клиентской частью приложения - Backend Deployment: Управляет репликами Pod с серверной частью приложения 3. **StatefulSet** - MongoDB StatefulSet: Управляет Pod с базой данных MongoDB, сохраняя состояние и данные 4. **Service** - Frontend Service (NodePort): Предоставляет доступ к клиентской части приложения извне кластера - Backend Service (ClusterIP): Обеспечивает внутрикластерный доступ к API - MongoDB Service (ClusterIP): Обеспечивает внутрикластерный доступ к базе данных 5. **PersistentVolume и PersistentVolumeClaim** - MongoDB PV/PVC: Обеспечивает постоянное хранилище для данных MongoDB ## Сетевая инфраструктура Приложение использует следующие сетевые ресурсы: 1. **Services** - Frontend Service (NodePort): Доступен извне кластера через порт, назначаемый Kubernetes (30000-32767) - Backend Service (ClusterIP): Доступен внутри кластера по имени `backend-service:5000` - MongoDB Service (ClusterIP): Доступен внутри кластера по имени `mongodb-service:27017` 2. **Внутрикластерная DNS-система** - Позволяет компонентам приложения обращаться друг к другу по именам сервисов вместо IP-адресов ## Хранилища данных Приложение использует постоянное хранилище для базы данных MongoDB: 1. **PersistentVolume** - Тип: HostPath (для локальной разработки) - Размер: 1Gi - Путь на хосте: `/mnt/data/mongodb` 2. **PersistentVolumeClaim** - Запрашивает 1Gi постоянного хранилища для MongoDB ## Конфигурация контейнеров 1. **Frontend** - Environment: Для разработки используется Vite Dev Server с опцией `--host` для доступа извне - Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi 2. **Backend** - Environment: - PORT: 5000 - MONGO_URI: mongodb://mongodb-service:27017/expense-tracker - Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi 3. **MongoDB** - Без дополнительной конфигурации, используется стандартный образ - Данные хранятся в постоянном хранилище - Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi ## Инструкция по запуску ### Предварительные требования 1. Установленный и настроенный Kubernetes кластер (можно использовать Minikube для локальной разработки) 2. Установленный и настроенный kubectl 3. Docker ### Подготовка приложения 1. Выполните скрипт подготовки: ```bash chmod +x prepare-app.sh ./prepare-app.sh ``` Скрипт выполнит следующие действия: - Создаст директорию для хранения данных MongoDB - Соберет Docker-образы для Frontend и Backend ### Запуск приложения 1. Выполните скрипт запуска: ```bash chmod +x start-app.sh ./start-app.sh ``` Скрипт выполнит следующие действия: - Создаст Namespace expense-tracker - Применит все конфигурационные файлы Kubernetes - Дождется запуска всех компонентов - Выведет URL для доступа к приложению ### Остановка приложения 1. Для остановки приложения выполните: ```bash chmod +x stop-app.sh ./stop-app.sh ``` Скрипт выполнит следующие действия: - Удалит все развернутые в Kubernetes ресурсы приложения ### Доступ к приложению После успешного запуска вы получите URL для доступа к приложению в выводе скрипта start-app.sh. Обычно это будет что-то вроде: ``` http://192.168.49.2:30080 ``` где: - 192.168.49.2 - IP-адрес узла кластера (для Minikube это IP-адрес виртуальной машины) - 30080 - назначенный NodePort для Frontend-сервиса ## Дополнительная информация - Для просмотра всех ресурсов в пространстве имен expense-tracker: ```bash kubectl get all -n expense-tracker ``` - Для просмотра логов компонентов: ```bash kubectl logs deployment/frontend -n expense-tracker kubectl logs deployment/backend -n expense-tracker kubectl logs statefulset/mongodb -n expense-tracker ``` - Для доступа к оболочке контейнеров: ```bash kubectl exec -it deployment/frontend -n expense-tracker -- sh kubectl exec -it deployment/backend -n expense-tracker -- sh kubectl exec -it statefulset/mongodb -n expense-tracker -- sh ```