dateme/README.md
2025-12-17 00:44:01 +02:00

445 lines
12 KiB
Markdown

# Dating App MVP - Full Stack Kubernetes Deployment
A complete MVP dating application with user profiles, photo uploads, and 1:1 chat. Built with modern technologies and designed to run on home-lab Kubernetes with easy portability to AWS.
## 📋 Features
### Authentication
- User registration with email verification
- Login with JWT access tokens
- Password hashing with bcrypt
- Protected endpoints with Authorization header
### User Profiles
- Create and update profiles with:
- Display name
- Age
- Gender
- Location
- Bio
- Interests (tags)
- Discover endpoint for profile recommendations
- Simple filtering (exclude self)
### Photo Management
- Upload multiple profile photos
- Store on local disk (with S3 migration path)
- Photos served via `/media/` endpoint
- Database metadata tracking
### Likes & Matches
- Like/heart other users
- Automatic match detection (mutual likes)
- Matches list endpoint
### 1:1 Chat
- Send and receive messages between matched users
- Message history for each conversation
- Real-time polling (WebSocket ready for future enhancement)
- Conversation list with latest message preview
## 🏗️ Architecture
```
aws-final-project/
├── backend/ # FastAPI Python backend
│ ├── app/
│ │ ├── models/ # Database models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── routers/ # API route handlers
│ │ ├── services/ # Business logic
│ │ ├── auth/ # JWT & auth utilities
│ │ ├── db.py # Database connection & init
│ │ └── config.py # Configuration
│ ├── main.py # FastAPI application
│ ├── requirements.txt # Python dependencies
│ ├── Dockerfile # Backend container
│ ├── .env.example # Environment template
│ └── alembic/ # Database migrations (setup for future use)
├── frontend/ # React + Vite frontend
│ ├── src/
│ │ ├── pages/ # Page components
│ │ ├── styles/ # CSS modules
│ │ ├── api.js # Centralized API client
│ │ ├── App.jsx # Main app component
│ │ └── main.jsx # React entry point
│ ├── package.json # Node dependencies
│ ├── vite.config.js # Vite configuration
│ ├── Dockerfile # Frontend nginx container
│ ├── nginx.conf # Nginx configuration
│ ├── .env.example # Environment template
│ └── index.html # HTML template
├── docker-compose.yml # Local development compose
├── helm/ # Kubernetes Helm chart
│ └── dating-app/
│ ├── Chart.yaml # Chart metadata
│ ├── values.yaml # Default values
│ ├── values-lab.yaml # Lab/home-lab values
│ ├── values-aws.yaml # AWS deployment values
│ ├── templates/ # K8s resource templates
│ └── README.md # Helm chart docs
└── README.md # This file
```
## 🚀 Quick Start
### Local Development (Docker Compose)
Prerequisites:
- Docker
- Docker Compose
```bash
# Clone and navigate
cd aws-final-project
# Copy environment files
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
# Build and start
docker-compose up -d
# Application ready at:
# Frontend: http://localhost:3000
# Backend: http://localhost:8000
# API Docs: http://localhost:8000/docs
```
### Home-Lab Kubernetes Deployment
Prerequisites:
- Kubernetes cluster (1.19+)
- Helm 3+
- Nginx Ingress Controller
- Storage provisioner
```bash
# Build and push images to your registry
docker build -t my-registry/dating-app-backend:v1 backend/
docker build -t my-registry/dating-app-frontend:v1 frontend/
docker push my-registry/dating-app-backend:v1
docker push my-registry/dating-app-frontend:v1
# Create values file for your lab
cp helm/dating-app/values-lab.yaml my-values.yaml
# Edit my-values.yaml with your registry URLs and domain
# Deploy with Helm
helm install dating-app ./helm/dating-app \
-n dating-app \
--create-namespace \
-f my-values.yaml
# Verify deployment
kubectl get pods -n dating-app
kubectl get svc -n dating-app
kubectl get ingress -n dating-app
```
### AWS Deployment
Prerequisites:
- AWS account with EKS cluster
- RDS PostgreSQL instance
- S3 bucket for images (optional)
- Container registry (ECR)
```bash
# Build and push to ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <account>.dkr.ecr.us-east-1.amazonaws.com
docker tag dating-app-backend:v1 <account>.dkr.ecr.us-east-1.amazonaws.com/dating-app-backend:v1
docker push <account>.dkr.ecr.us-east-1.amazonaws.com/dating-app-backend:v1
# Prepare values for AWS
cp helm/dating-app/values-aws.yaml my-aws-values.yaml
# Edit with your RDS endpoint, ACM certificate, domain, etc.
# Deploy
helm install dating-app ./helm/dating-app \
-n dating-app \
--create-namespace \
-f my-aws-values.yaml
```
## 📡 API Endpoints
### Authentication
- `POST /auth/register` - Register new user
- `POST /auth/login` - Login user
- `GET /auth/me` - Current user info (protected)
### Profiles
- `POST /profiles/` - Create/update profile (protected)
- `GET /profiles/me` - Get own profile (protected)
- `GET /profiles/{user_id}` - Get user profile (protected)
- `GET /profiles/discover/list` - Get profiles to discover (protected)
### Photos
- `POST /photos/upload` - Upload photo (protected)
- `GET /photos/{photo_id}` - Get photo info (protected)
- `DELETE /photos/{photo_id}` - Delete photo (protected)
### Likes
- `POST /likes/{user_id}` - Like a user (protected)
- `GET /likes/matches/list` - Get matches (protected)
### Chat
- `GET /chat/conversations` - List conversations (protected)
- `GET /chat/conversations/{conv_id}/messages` - Get messages (protected)
- `POST /chat/conversations/{conv_id}/messages` - Send message (protected)
## 🔧 Configuration
### Backend Environment Variables
```env
DATABASE_URL=postgresql://user:password@host:5432/database
JWT_SECRET=your-secret-key
JWT_EXPIRES_MINUTES=1440
MEDIA_DIR=/app/media
CORS_ORIGINS=http://localhost:3000,http://localhost:5173
```
### Frontend Environment Variables
```env
VITE_API_URL=http://localhost:8000
```
## 📦 Technology Stack
### Backend
- **Framework:** FastAPI 0.104+
- **Server:** Uvicorn
- **Database:** PostgreSQL 15
- **Driver:** psycopg2 (synchronous)
- **Auth:** JWT + bcrypt
- **Validation:** Pydantic
### Frontend
- **Framework:** React 18
- **Build Tool:** Vite
- **HTTP Client:** Axios
- **Styling:** CSS Modules
- **State:** localStorage for JWT
### Infrastructure
- **Containers:** Docker
- **Orchestration:** Kubernetes
- **Package Manager:** Helm
- **Ingress:** Nginx/Traefik compatible
## 🔐 Security Notes
### Current Implementation
- Passwords hashed with bcrypt
- JWT tokens with expiration
- CORS configured
- Protected endpoints
### For Production
- Use strong JWT_SECRET (generate: `openssl rand -hex 32`)
- Enable HTTPS/TLS in Ingress
- Use external secrets management (Vault, AWS Secrets Manager)
- Implement rate limiting
- Add request validation and sanitization
- Enable database SSL connections
- Regular security updates for dependencies
## 🌐 AWS Migration Guide
### Switch from Local Storage to S3
1. Update backend environment:
```env
STORAGE_TYPE=s3
AWS_BUCKET_NAME=your-bucket
AWS_REGION=us-east-1
```
2. Modify [backend/app/services/photo_service.py](backend/app/services/photo_service.py) to use boto3
3. Update media serving to redirect to S3 presigned URLs
### Switch from Local PostgreSQL to RDS
1. Create RDS instance in AWS
2. Update values in Helm chart:
```yaml
postgres:
enabled: false # Disable embedded Postgres
backend:
environment:
DATABASE_URL: postgresql://user:pass@rds-endpoint.amazonaws.com:5432/db
```
3. Deploy with updated values
### Load Balancer & Auto-scaling
Helm chart supports AWS Application Load Balancer (ALB):
```yaml
ingress:
className: aws-alb
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
```
Set replicas in values for auto-scaling base:
```yaml
backend:
replicas: 3
frontend:
replicas: 3
```
## 🧪 Testing
### API Testing with curl
```bash
# Register
curl -X POST http://localhost:8000/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123",
"display_name": "John Doe"
}'
# Login
curl -X POST http://localhost:8000/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123"
}'
# Update profile (use token from login response)
curl -X POST http://localhost:8000/profiles/ \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "John Doe",
"age": 28,
"gender": "male",
"location": "San Francisco",
"bio": "Looking for someone...",
"interests": ["hiking", "travel"]
}'
```
### Swagger UI
Visit `http://localhost:8000/docs` for interactive API documentation.
## 📝 Database Schema
### Tables
- `users` - User accounts with email and hashed passwords
- `profiles` - User profile information
- `photos` - User photos with file paths
- `likes` - Like relationships between users
- `conversations` - 1:1 chat conversations
- `messages` - Chat messages
All tables include proper timestamps and foreign key constraints.
## 🔄 Development Workflow
### Adding a New Feature
1. Backend
- Add database model/schema if needed
- Implement service logic
- Create router endpoints
- Document in API
2. Frontend
- Add API calls to [frontend/src/api.js](frontend/src/api.js)
- Create React components
- Add styling
3. Test
- Test locally with docker-compose
- Test in Kubernetes with Helm
### Building Images for Testing
```bash
# Backend
docker build -t dating-app-backend:test -f backend/Dockerfile backend/
# Frontend
docker build -t dating-app-frontend:test -f frontend/Dockerfile frontend/
# Test with compose
docker-compose -f docker-compose.yml up
```
## 🐛 Troubleshooting
### Backend Issues
```bash
# Check logs
docker logs dating_app_backend
# Check database connection
docker exec dating_app_backend curl http://localhost:8000/health
```
### Frontend Issues
```bash
# Check logs
docker logs dating_app_frontend
# Check API connectivity
curl http://localhost:8000/health
```
### Kubernetes Issues
```bash
# Check pod status
kubectl describe pod -n dating-app <pod-name>
# View logs
kubectl logs -n dating-app <pod-name>
# Port forward for debugging
kubectl port-forward -n dating-app svc/backend 8000:8000
kubectl port-forward -n dating-app svc/frontend 3000:80
```
## 📚 Additional Resources
- [FastAPI Documentation](https://fastapi.tiangolo.com/)
- [React Documentation](https://react.dev/)
- [Kubernetes Documentation](https://kubernetes.io/docs/)
- [Helm Documentation](https://helm.sh/docs/)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
## 📄 License
This is an educational MVP project. Use freely for learning purposes.
## 🤝 Contributing
Contributions welcome! Areas for improvement:
- WebSocket implementation for real-time chat
- File upload progress tracking
- Image optimization and compression
- Database query optimization
- Frontend component refinement
- Comprehensive test suite
- CI/CD pipeline setup
## 📞 Support
For issues or questions:
1. Check existing documentation
2. Review API documentation at `/docs`
3. Check application logs
4. Verify environment variables and configuration