Skip to content

kozjulia/bankapp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Микросервисное приложение «Банк»


Банк умеет делать следующее:

  1. Регистрироваться в системе по логину и паролю (заводить аккаунт);
  2. Добавлять счета в различных валютах;
  3. Класть виртуальные деньги на счёт и снимать их;
  4. Переводить деньги между своими счетами с учётом конвертации в различные валюты;
  5. Переводить деньги на другой счёт с учётом конвертации в различные валюты.

Приложение состоит из следующих микросервисов:

  • Front (фронт);
  • Accounts (аккаунты со счетами);
  • Cash (обналичивание денег);
  • Transfer (перевод между счетами одного или двух аккаунтов);
  • Exchange (конвертация валют);
  • Exchange Generator (генератор курсов валют);
  • Blocker (блокировщик подозрительных операций);
  • Notifications (уведомления).

Приложение написано на Java 21, использует Spring Boot 3, Gradle, Thymeleaf, WebFlux, Flyway, Spring Security, JUnit 5, Mockito, Testcontainers, Docker, API соответствует REST, данные хранятся в БД **PostgreSQL **, тесты выполняются в PostgreSQL.
Тестовое покрытие кода - 24% строк кода.


Для запуска приложения:

gradle clean build
docker-compose up

В директории build/libs проекта появится jar-архив сервиса


Как запускать в Minikube

  1. Установите Minikube: https://kubernetes.io/ru/docs/tasks/tools/install-minikube/

  2. Инициализируйте

minikube start --driver=docker
  1. Добавьте ингресс, чтобы была маршрутизация запросов к нашим сервисам
minikube addons enable ingress

Проверьте, что появился ingress-controller

kubectl get pods -n ingress-nginx
  1. Соберите docker образы
eval $(minikube docker-env)
docker-compose build accounts blocker cash exchange-generator exchange front notification transfer
  1. Обновите зависимости helm чарта
cd .deployment
helm dependency update .
  1. Установите keycloak
cd ..
kubectl apply -f keycloak-deployment.yaml
## для удаления
kubectl delete -f keycloak-deployment.yaml
  1. Установите kafka
cd ..
kubectl apply -f kafka-deployment.yaml
## для удаления
kubectl delete -f kafka-deployment.yaml
  1. Добавьте записи в /etc/hosts
sudo nano /etc/hosts

Добавьте:

127.0.0.1 keycloak.test.local
127.0.0.1 front.test.local
  1. Используйте minikube tunnel

  2. Импортируйте скоупы и клиенты для keycloak

cd .docker/keycloak-config-loader/scripts
sh upload-scopes-to-keycloak.sh
sh upload-clients-to-keycloak.sh
  1. Задеплойте сервисы с помощью helm чартов
cd .deployment
# for install
helm install bankapp .
# for update
helm upgrade bankapp .
# for delete
helm uninstall bankapp
  1. Перейдите по ссылке http://front.test.local

Как запускать helm test

  1. перейти в папку .deployment и выполнить комманды:
helm lint . 

helm install --dry-run bankapp . 

helm test bankapp 

Как запускать Jenkins

  1. Установите зависимости

Для запуска проекта вам понадобятся:

  • Docker Desktop
  • Включённый Kubernetes в Docker Desktop (настройка → Kubernetes → Enable Kubernetes)
  • Установленный Git

Устанавливать Helm или kubectl локально не нужно — они уже установлены в Jenkins-контейнере.

  1. Создайте файл jenkins_kubeconfig.yaml

Jenkins будет использовать этот файл для доступа к Kubernetes.

Выполните в терминале:

cp ~/.kube/config jenkins_kubeconfig.yaml

Затем отредактируйте файл:

Замените server на:

server: https://host.docker.internal:6443

Добавьте:

insecure-skip-tls-verify: true

Это нужно, чтобы Jenkins внутри контейнера смог обратиться к вашему локальному кластеру и проигнорировал самоподписанные сертификаты.

  1. Установите Ingress Controller в кластер

Ingress Controller — это компонент, который позволяет обращаться к сервисам Kubernetes через удобные HTTP-домены ( например, http://order.test.local).

Мы используем ingress-nginx. Установите его в кластер:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx   --namespace ingress-nginx --create-namespace
  1. Создайте .env файл

Создайте файл .env в корне проекта:

# Путь до локального kubeconfig-файла
KUBECONFIG_PATH=/Users/username/.kube/jenkins_kubeconfig.yaml

# Параметры для GHCR
GITHUB_USERNAME=your-username
GITHUB_TOKEN=ghp_...
GHCR_TOKEN=ghp_...

# Docker registry (в данном случае GHCR)
DOCKER_REGISTRY=ghcr.io/your-username
GITHUB_REPOSITORY=your-username/<проект>

# Пароль к базе данных PostgreSQL
DB_PASSWORD=your-db-password

Убедитесь, что ваш GitHub Token имеет права write:packages, read:packages и repo.

  1. Запустите Jenkins
cd jenkins
docker compose up -d --build

Jenkins будет доступен по адресу: http://localhost:8080


Как использовать

  1. Откройте Jenkins: http://localhost:8080
  2. Перейдите в задачу YandexHelmAppBuild Now
  3. Jenkins выполнит:
    • сборку и тесты
    • сборку Docker-образов
    • публикацию образов в GHCR
    • деплой в Kubernetes в два namespace: test и prod

Проверка успешного деплоя

1. Добавьте записи в /etc/hosts

sudo nano /etc/hosts

Добавьте:

127.0.0.1 keycloak.test.local
127.0.0.1 front.test.local

2. Отправьте запросы на /actuator/health

curl -s http://front.test.local/actuator/health

Ожидаемый ответ:

{
  "status": "UP",
  "groups": [
    "liveness",
    "readiness"
  ]
}

Завершение работы и очистка

Если вы хотите полностью остановить Jenkins, удалить namespace'ы test и prod, а также все установленные ресурсы, используйте скрипт nuke-all.sh.

Он находится в папке jenkins:

cd jenkins
./nuke-all.sh