A production-ready, enterprise-grade personal finance tracker built for the modern developer
A full-stack, DevOps driven personal finance tracker built with C# ASP.NET Core, Angular, and an enterprise grade backend architecture. Fully containerized, orchestrated in Kubernetes, secured with Argon2id password hashing, and monitored with Prometheus + Grafana. CI/CD is automated via Jenkins.
BudgetForge is designed to scale from personal use to multi-tenant SaaS, combining:
- Clean Architecture and DDD for maintainable backend code
- Angular frontend for a responsive user experience
- Secure authentication with Argon2id password hashing
- DevOps first infrastructure: Kubernetes, Jenkins, Ingress, monitoring stack
BudgetForge/
βββ src/ # Backend - Clean Architecture
β βββ BudgetForge.Domain/ # Entities, enums
β βββ BudgetForge.Application/ # Business logic, DTOs, validation
β βββ BudgetForge.Infrastructure/# DB, Identity (Argon2id), external services
β βββ BudgetForge.Api/ # ASP.NET Core Web API
βββ frontend/budget-forge-ui/ # Angular frontend
βββ infra/k8s/ # Kubernetes manifests
βββ docker/ # Service configs
βββ docker-data/ # Persisted volumes
βββ jenkins/ # Jenkins Dockerfile + scripts
βββ Jenkinsfile # CI/CD pipeline
βββ scripts/ # Utility scripts
βββ tests/ # Unit & integration tests
Enterprise grade architecture showcasing Clean Architecture principles, microservices patterns, and cloud native deployment strategies
- Clean Architecture: Domain driven design with clear separation of concerns
- Event Driven: Asynchronous processing with Redis pub/sub
- Observability: Comprehensive monitoring with Prometheus + Grafana
- Security First: Argon2id encryption and JWT authentication
- Cloud Native: Kubernetes ready with horizontal scaling capabilities
- C# (.NET 8, ASP.NET Core)
- PostgreSQL
- Redis
- Argon2id password hashing (Konscious.Security.Cryptography)
- Angular 17 (SCSS, TypeScript)
- Docker, Docker Compose
- Kubernetes (kind for local dev)
- NGINX Ingress Controller
- Prometheus + Grafana (kube-prometheus-stack)
- metrics-server
- Jenkins (pipeline in Jenkinsfile)
- Lens (Kubernetes dashboard)
- Argon2id password hashing for user credentials
- Configurable hashing parameters (iterations, memory, parallelism)
- Centralized Identity layer for authentication
- Prometheus scraping API /metrics
- Grafana dashboards (API performance, cluster metrics)
- metrics-server for CPU/RAM usage
- Ready for Redis and Postgres exporters
- Stages: Build β Test β Dockerize β Push to registry β Deploy to Kubernetes
- Jenkins containerized with jenkins/ Dockerfile
- Pre-configured with Prometheus metrics plugin for build monitoring
- Pipeline logic stored in Jenkinsfile
- .NET 8 SDK
- Node.js 20+ and Angular CLI
- Docker Desktop
- kind (Kubernetes in Docker)
- kubectl
- Lens (optional, for cluster visualization)
-
Clone the repository
git clone https://github.com/yourusername/budgetforge.git cd budgetforge
-
Run locally with Docker Compose
# Start backend services (PostgreSQL, Redis) docker compose up -d postgres redis # Build and run API cd src/BudgetForge.Api dotnet restore dotnet run # Build and run frontend (in separate terminal) cd frontend/budget-forge-ui npm install ng serve
-
Access the application
- Frontend: http://localhost:4200
- API: http://localhost:5000/swagger
-
Create kind cluster
kind create cluster --name budgetforge
-
Create namespace
kubectl apply -f infra/k8s/base/namespace.yaml
-
Load API image into kind
docker build -t budgetforge-api:kind -f src/BudgetForge.Api/Dockerfile . kind load docker-image budgetforge-api:kind --name budgetforge
-
Deploy services
kubectl apply -f infra/k8s/base/
-
Setup ingress host mapping
echo "127.0.0.1 api.budgetforge.local" | sudo tee -a /etc/hosts echo "127.0.0.1 grafana.budgetforge.local" | sudo tee -a /etc/hosts
-
Access the application
- API: http://api.budgetforge.local
- Grafana: http://grafana.budgetforge.local
Install Prometheus + Grafana using Helm:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prom-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
Grafana Access:
- URL: http://grafana.budgetforge.local
- Username:
admin
- Password:
prom-operator
-
Build and run Jenkins
docker compose up -d jenkins
-
Access Jenkins
- URL: http://localhost:8082
- Configured with pipeline from
Jenkinsfile
- Pre-configured with Prometheus metrics plugin
# Run backend tests
dotnet test tests/
# Run frontend tests
cd frontend/budget-forge-ui
npm run test
# Run integration tests
dotnet test tests/BudgetForge.IntegrationTests/
# Trigger pipeline (webhook or manual)
# Jenkins will handle: build β test β dockerize β deploy
# Build and push images
docker build -t budgetforge-api:latest .
docker build -t budgetforge-ui:latest frontend/budget-forge-ui/
# Deploy to cluster
kubectl apply -f infra/k8s/production/
- Expense Tracking: Categorize and monitor spending patterns
- Budget Management: Set and track budget goals
- Responsive Design: Works seamlessly on desktop and mobile
- Secure Authentication: Industry-standard password hashing
- Analytics Dashboard: Visualize spending trends and insights
- Multi-tenant Ready: Scalable architecture for SaaS deployment
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
ConnectionStrings__DefaultConnection="Server=localhost;Database=budgetforge;..."
Redis__ConnectionString="localhost:6379"
Argon2__MemorySize=65536
Argon2__Iterations=3
Argon2__Parallelism=1
ENVIRONMENT=development
API_BASE_URL=http://localhost:5000/api
- Port conflicts: Ensure ports 4200, 5000, 3000, 9090 are available
- Kind cluster issues: Run
kind delete cluster --name budgetforge
and recreate - Database connection: Verify PostgreSQL is running in the cluster
# API logs
kubectl logs deployment/budgetforge-api
# Frontend logs (during development)
ng serve --verbose
# Jenkins logs
kubectl logs deployment/jenkins
- HPA (Horizontal Pod Autoscaler) for API scaling
- Deploy PostgreSQL inside Kubernetes cluster
- Enhanced Monitoring: Redis and PostgreSQL Grafana dashboards
- Core Features: Transaction and budget management in backend
- UI Integration: Complete Angular frontend with API connectivity
- Cloud Deployment: Terraform modules for AWS/Azure/GCP
- Backend API completion - CRUD operations for transactions and budgets
- Frontend integration - Connect Angular UI to backend services
- Advanced monitoring - Custom dashboards and alerting rules
- Cloud native deployment - Infrastructure as Code with Terraform
- Performance optimization - Caching strategies and database indexing
This project is licensed under the MIT License - see the LICENSE file for details.
- Clean Architecture principles by Robert C. Martin
- Kubernetes community for excellent tooling
- Angular and .NET Core teams for robust frameworks
Crafting enterprise-grade solutions with passion for DevOps excellence
Building projects that matter, one commit at a time π