Full-stack expense tracker with a Spring Boot REST API, PostgreSQL storage, React UI and cloud deployment automation. The repository demonstrates backend development, containerization and infrastructure provisioning with Docker Compose, Terraform and Ansible.
Stack: Java, Spring Boot, PostgreSQL, React, Docker, Terraform, Ansible, Yandex Cloud.
Проект состоит из двух приложений:
expense-service- RESTful сервис (Spring Boot + PostgreSQL)expense-web-client-react- клиентское веб-приложение на JS (React), общающееся с сервисом по REST
- Добавить расход
- Получить список расходов
- Изменить сумму/категорию
- Удалить расход
Поднимает сразу PostgreSQL, backend и React UI:
docker compose up -d --buildОткрыть:
- UI:
http://localhost:3000/ - REST API:
http://localhost:8081/api/expenses
Остановка:
docker compose downЗапуск модульных тестов для backend:
mvn testЗапуск модульных тестов для frontend:
cd expense-web-client-react/
npm testДля ЛР-2 используется только облачная инфраструктура Yandex Cloud:
- Terraform:
infra/terraform/ - Ansible:
infra/ansible/ - Yandex Container Registry
-
Создать/подготовить registry в Yandex Container Registry.
-
Собрать и загрузить образы:
yc container registry configure-docker
REGISTRY_ID=<registry_id>
docker buildx build --platform linux/amd64 -f expense-service/Dockerfile -t cr.yandex/$REGISTRY_ID/expense-service:latest --push .
docker buildx build --platform linux/amd64 -f expense-web-client-react/Dockerfile -t cr.yandex/$REGISTRY_ID/expense-web-client-react:latest --push .- Подготовить VM через Terraform:
cd infra/terraform
cp terraform.tfvars.example terraform.tfvars
terraform init
terraform apply- Получить строку для Ansible inventory:
terraform output ansible_host_line- Настроить Ansible:
cd ../ansible
cp inventory/hosts.ini.example inventory/hosts.iniВставить хост в inventory/hosts.ini.
- Указать образы в
group_vars/all.yml:
backend_imagefrontend_image
- Установить Docker и задеплоить приложение:
ansible-playbook playbooks/install-docker.yml
YC_IAM_TOKEN="$(yc iam create-token)"
ansible-playbook playbooks/deploy-expense-app.yml -e "registry_username=iam registry_password=${YC_IAM_TOKEN}"- Проверить приложение:
- UI:
http://<vm_external_ip>:3000/ - REST API:
http://<vm_external_ip>:8081/api/expenses