Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Hello Helm - Full Stack Application with Kubernetes

A full-stack application (FastAPI backend + Next.js frontend + PostgreSQL) demonstrating how to deploy with Helm charts on Kubernetes.

🎯 Project Overview

This project showcases:

  • FastAPI Backend with PostgreSQL database
  • Next.js Frontend (React)
  • Nginx reverse proxy
  • Helm Charts for Kubernetes deployment
  • Docker Compose for local development

πŸ“ Project Structure

hello-helm/
β”œβ”€β”€ backend/                    # FastAPI application
β”‚   β”œβ”€β”€ app/                   # Application code
β”‚   β”œβ”€β”€ Dockerfile             # Dev dockerfile
β”‚   β”œβ”€β”€ Dockerfile.prod        # Production dockerfile
β”‚   └── pyproject.toml         # Python dependencies (uv)
β”‚
β”œβ”€β”€ frontend/                   # Next.js application
β”‚   └── (frontend code)
β”‚
β”œβ”€β”€ nginx/                      # Nginx configuration
β”‚   └── (nginx config)
β”‚
β”œβ”€β”€ helm_charts/               # Kubernetes Helm Charts
β”‚   β”œβ”€β”€ backend/              # Backend + PostgreSQL chart
β”‚   β”‚   β”œβ”€β”€ Chart.yaml
β”‚   β”‚   β”œβ”€β”€ values.yaml
β”‚   β”‚   β”œβ”€β”€ values-local.yaml
β”‚   β”‚   β”œβ”€β”€ templates/
β”‚   β”‚   β”‚   β”œβ”€β”€ deployment.yaml
β”‚   β”‚   β”‚   β”œβ”€β”€ service.yaml
β”‚   β”‚   β”‚   β”œβ”€β”€ postgres-statefulset.yaml
β”‚   β”‚   β”‚   β”œβ”€β”€ postgres-service.yaml
β”‚   β”‚   β”‚   └── postgres-secret.yaml
β”‚   β”‚   β”œβ”€β”€ QUICK-START.md    # 5-minute deployment guide
β”‚   β”‚   β”œβ”€β”€ README.md          # Complete chart documentation
β”‚   β”‚   └── STRUCTURE.md       # Chart structure deep-dive
β”‚   β”‚
β”‚   └── frontend/              # Frontend chart
β”‚       └── (similar structure)
β”‚
β”œβ”€β”€ compose.yml                # Docker Compose for local dev
β”‚
β”œβ”€β”€ docs/                       # Documentation
β”‚   β”œβ”€β”€ HELM-LEARNING-GUIDE.md      # πŸ“š Complete learning guide
β”‚   β”œβ”€β”€ DEPLOYMENT.md               # Deployment instructions
β”‚   β”œβ”€β”€ DOCKER-COMPOSE-VS-HELM.md   # Concept comparison
β”‚   └── MAKEFILE-GUIDE.md           # Makefile commands reference
β”‚
└── README.md                   # This file

πŸš€ Quick Start

Option 1: Local Development with Docker Compose

docker-compose up

Access:

Option 2: Kubernetes with Helm

Prerequisites:

  • Docker
  • Kubernetes (minikube/kind/Docker Desktop)
  • Helm 3.x
  • kubectl

Deploy in 3 commands:

# 1. Build & load image
cd backend
docker build -f Dockerfile.prod -t backend-app:latest .
minikube image load backend-app:latest  # or: kind load docker-image backend-app:latest

# 2. Deploy with Helm
cd ../helm_charts/backend
helm install my-backend .

# 3. Access the application
kubectl port-forward svc/my-backend 8000:8000

Visit: http://localhost:8000/docs

πŸ“š Documentation

πŸŽ“ Learning Helm Charts (Start Here!)

  1. docs/HELM-LEARNING-GUIDE.md ⭐

    • Complete learning path (Beginner β†’ Advanced)
    • Understand Helm concepts
    • Key takeaways and best practices
  2. helm_charts/backend/QUICK-START.md

    • Deploy in 5 minutes
    • Perfect for first-time users
  3. docs/DEPLOYMENT.md

    • Comprehensive deployment guide
    • Step-by-step instructions
    • Troubleshooting tips

πŸ“– Understanding the Architecture

  1. docs/DOCKER-COMPOSE-VS-HELM.md

    • Compare Docker Compose to Kubernetes/Helm
    • Concept mapping
    • When to use what
  2. helm_charts/backend/STRUCTURE.md

    • Deep dive into Helm chart structure
    • Template syntax
    • Values flow

πŸ“˜ Reference

  1. helm_charts/backend/README.md
    • Complete chart documentation
    • Configuration options
    • Customization examples

πŸ—οΈ Architecture

Development (Docker Compose)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           Docker Compose             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ Nginx   β”‚  β”‚ Backend β”‚           β”‚
β”‚  β”‚ :80     β”‚β†’ β”‚ :8000   β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚                β”‚
β”‚  β”‚Frontend β”‚       β”‚                β”‚
β”‚  β”‚ :3000   β”‚       ↓                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚               β”‚Postgres  β”‚          β”‚
β”‚               β”‚ :5432    β”‚          β”‚
β”‚               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Production (Kubernetes + Helm)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Kubernetes Cluster                   β”‚
β”‚                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Backend Deploy   β”‚  β”‚ Frontend Deploy    β”‚   β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚   β”‚
β”‚  β”‚ β”‚ Pod β”‚ Pod β”‚..β”‚β”‚ β”‚  β”‚ β”‚ Pod β”‚ Pod β”‚... β”‚ β”‚   β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚           β”‚                       β”‚              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Backend Service  β”‚  β”‚ Frontend Service  β”‚   β”‚
β”‚  β”‚ ClusterIP :8000  β”‚  β”‚ ClusterIP :3000   β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚           β”‚                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
β”‚  β”‚ PostgreSQL StatefulSet   β”‚                   β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚                   β”‚
β”‚  β”‚ β”‚ postgres-0           β”‚ β”‚                   β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β”‚
β”‚           β”‚                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                           β”‚
β”‚  β”‚ PVC (1Gi)        β”‚                           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ› οΈ Technology Stack

Backend

  • FastAPI - Modern Python web framework
  • SQLAlchemy - ORM with async support
  • PostgreSQL 15 - Database
  • Uvicorn - ASGI server
  • Pydantic - Data validation
  • uv - Fast Python package manager

Frontend

  • Next.js - React framework
  • TypeScript - Type safety
  • Tailwind CSS - Styling

Infrastructure

  • Docker - Containerization
  • Kubernetes - Orchestration
  • Helm - Package management
  • Nginx - Reverse proxy

πŸ“¦ Backend Dependencies

[project]
dependencies = [
    "asyncpg>=0.30.0",
    "fastapi[standard]>=0.118.0",
    "pydantic>=2.11.10",
    "pydantic-settings>=2.11.0",
    "sqlmodel>=0.0.25",
    "uvicorn>=0.37.0",
]

πŸ”’ Security Notes

⚠️ For Production:

  1. Secrets Management

    • Don't store passwords in values.yaml
    • Use Kubernetes Secrets with encryption at rest
    • Consider external secret managers (Vault, AWS Secrets Manager)
  2. Image Security

    • Use specific version tags, not latest
    • Scan images for vulnerabilities
    • Use minimal base images
  3. Network Security

    • Implement Network Policies
    • Use TLS/SSL for all connections
    • Restrict service-to-service communication
  4. Access Control

    • Enable RBAC
    • Use least privilege principle
    • Regular security audits

πŸ§ͺ Testing

Test Backend Locally

# With Docker Compose
docker-compose up backend postgres

# Test endpoints
curl http://localhost:8000/health
curl http://localhost:8000/items

# API docs
open http://localhost:8000/docs

Test in Kubernetes

# Deploy
helm install test-backend helm_charts/backend/

# Port forward
kubectl port-forward svc/test-backend 8000:8000

# Test
curl http://localhost:8000/health

# Cleanup
helm uninstall test-backend

πŸ› Troubleshooting

Docker Compose Issues

# View logs
docker-compose logs backend
docker-compose logs postgres

# Restart services
docker-compose restart backend

# Clean up
docker-compose down -v

Kubernetes Issues

# Check pod status
kubectl get pods

# View logs
kubectl logs -l app.kubernetes.io/name=backend

# Describe pod for events
kubectl describe pod <pod-name>

# Delete and recreate
helm uninstall my-backend
helm install my-backend helm_charts/backend/

See DEPLOYMENT.md for detailed troubleshooting.

πŸ“Š Monitoring & Observability

Logs

# Docker Compose
docker-compose logs -f backend

# Kubernetes
kubectl logs -l app.kubernetes.io/name=backend -f

Metrics

For production, consider adding:

  • Prometheus - Metrics collection
  • Grafana - Visualization
  • Loki - Log aggregation
  • Jaeger - Distributed tracing

🚒 CI/CD

Suggested pipeline:

1. Code Push
   ↓
2. Run Tests
   ↓
3. Build Docker Image
   ↓
4. Push to Registry
   ↓
5. Update Helm Values
   ↓
6. Deploy to Staging
   ↓
7. Run Integration Tests
   ↓
8. Deploy to Production (manual approval)

πŸ“ Development Workflow

Making Changes

  1. Edit code in backend/app/
  2. Test locally with Docker Compose
  3. Build new image with version tag
  4. Update Helm values with new tag
  5. Deploy to dev cluster and test
  6. Deploy to production when ready

Example

# 1. Make changes
vim backend/app/main.py

# 2. Test with compose
docker-compose up backend

# 3. Build with version
docker build -f backend/Dockerfile.prod -t backend-app:v1.2.3 .

# 4. Load into cluster
minikube image load backend-app:v1.2.3

# 5. Deploy
helm upgrade my-backend helm_charts/backend/ \
  --set image.tag=v1.2.3

🀝 Contributing

This is a learning project following your company's Helm chart pattern:

  • Each component gets its own chart
  • Charts are independent and versioned separately
  • Shared values through parent charts or external configuration

πŸ“„ License

This is a practice/learning project.

πŸŽ“ Learning Resources

πŸ†˜ Need Help?

  1. Check HELM-LEARNING-GUIDE.md for comprehensive guidance
  2. Review DEPLOYMENT.md for deployment issues
  3. Read component-specific READMEs in helm_charts/
  4. Check troubleshooting sections in each guide

🎯 Next Steps

  • Deploy backend with Helm βœ… (follow QUICK-START.md)
  • Create frontend Helm chart (similar pattern)
  • Add Ingress for external access
  • Set up monitoring (Prometheus/Grafana)
  • Implement CI/CD pipeline
  • Add automated tests
  • Document runbooks for operations

Happy Learning! πŸš€βŽˆ

For a complete learning experience, start with docs/HELM-LEARNING-GUIDE.md!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages