166 lines
3.9 KiB
Markdown
166 lines
3.9 KiB
Markdown
|
|
# Nicholas Haven - Resume Website
|
||
|
|
|
||
|
|
A professional, responsive resume website designed for deployment on Kubernetes.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- **Modern Design**: Dark theme with cyan accents, animated backgrounds, and smooth transitions
|
||
|
|
- **Responsive**: Works on all device sizes
|
||
|
|
- **Production-Ready**: Includes Dockerfile and Helm chart
|
||
|
|
- **Kubernetes-Native**: Configured with health checks, PDB, HPA, and proper security contexts
|
||
|
|
- **TLS Ready**: Pre-configured for cert-manager integration
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
### 1. Build the Docker Image
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build locally
|
||
|
|
docker build -t resume-site:latest .
|
||
|
|
|
||
|
|
# Or build and push to your registry
|
||
|
|
docker build -t your-registry.com/resume-site:latest .
|
||
|
|
docker push your-registry.com/resume-site:latest
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Deploy with Helm
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Create namespace (optional)
|
||
|
|
kubectl create namespace resume
|
||
|
|
|
||
|
|
# Install with custom values
|
||
|
|
helm upgrade --install resume ./helm \
|
||
|
|
--namespace resume \
|
||
|
|
--set image.repository=your-registry.com/resume-site \
|
||
|
|
--set image.tag=latest \
|
||
|
|
--set ingress.hosts[0].host=resume.yourdomain.com \
|
||
|
|
--set ingress.hosts[0].paths[0].path=/ \
|
||
|
|
--set ingress.hosts[0].paths[0].pathType=Prefix \
|
||
|
|
--set ingress.tls[0].secretName=resume-tls \
|
||
|
|
--set ingress.tls[0].hosts[0]=resume.yourdomain.com
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Using a Values File (Recommended)
|
||
|
|
|
||
|
|
Create a `values-production.yaml`:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
image:
|
||
|
|
repository: your-registry.com/resume-site
|
||
|
|
tag: "1.0.0"
|
||
|
|
|
||
|
|
ingress:
|
||
|
|
enabled: true
|
||
|
|
className: nginx
|
||
|
|
annotations:
|
||
|
|
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||
|
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||
|
|
hosts:
|
||
|
|
- host: resume.yourdomain.com
|
||
|
|
paths:
|
||
|
|
- path: /
|
||
|
|
pathType: Prefix
|
||
|
|
tls:
|
||
|
|
- secretName: resume-tls
|
||
|
|
hosts:
|
||
|
|
- resume.yourdomain.com
|
||
|
|
|
||
|
|
resources:
|
||
|
|
limits:
|
||
|
|
cpu: 100m
|
||
|
|
memory: 64Mi
|
||
|
|
requests:
|
||
|
|
cpu: 10m
|
||
|
|
memory: 32Mi
|
||
|
|
```
|
||
|
|
|
||
|
|
Then deploy:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
helm upgrade --install resume ./helm \
|
||
|
|
--namespace resume \
|
||
|
|
-f values-production.yaml
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration Options
|
||
|
|
|
||
|
|
| Parameter | Description | Default |
|
||
|
|
|-----------|-------------|---------|
|
||
|
|
| `replicaCount` | Number of pods | `2` |
|
||
|
|
| `image.repository` | Docker image repository | `resume-site` |
|
||
|
|
| `image.tag` | Docker image tag | `latest` |
|
||
|
|
| `ingress.enabled` | Enable ingress | `true` |
|
||
|
|
| `ingress.className` | Ingress class name | `nginx` |
|
||
|
|
| `ingress.hosts` | Ingress hosts configuration | `[]` |
|
||
|
|
| `autoscaling.enabled` | Enable HPA | `false` |
|
||
|
|
| `podDisruptionBudget.enabled` | Enable PDB | `true` |
|
||
|
|
|
||
|
|
## Local Development
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run with Docker
|
||
|
|
docker build -t resume-site:dev .
|
||
|
|
docker run -p 8080:80 resume-site:dev
|
||
|
|
|
||
|
|
# Open http://localhost:8080
|
||
|
|
```
|
||
|
|
|
||
|
|
## Directory Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
.
|
||
|
|
├── index.html # Main resume page
|
||
|
|
├── Dockerfile # Multi-stage Docker build
|
||
|
|
├── README.md # This file
|
||
|
|
└── helm/
|
||
|
|
├── Chart.yaml # Helm chart metadata
|
||
|
|
├── values.yaml # Default values
|
||
|
|
└── templates/
|
||
|
|
├── _helpers.tpl
|
||
|
|
├── deployment.yaml
|
||
|
|
├── service.yaml
|
||
|
|
├── ingress.yaml
|
||
|
|
├── serviceaccount.yaml
|
||
|
|
├── pdb.yaml
|
||
|
|
└── hpa.yaml
|
||
|
|
```
|
||
|
|
|
||
|
|
## Customization
|
||
|
|
|
||
|
|
### Updating Content
|
||
|
|
|
||
|
|
Edit `index.html` directly. The file is self-contained with embedded CSS.
|
||
|
|
|
||
|
|
### Changing Colors
|
||
|
|
|
||
|
|
CSS variables are defined at the top of the `<style>` block:
|
||
|
|
|
||
|
|
```css
|
||
|
|
:root {
|
||
|
|
--accent-cyan: #06b6d4;
|
||
|
|
--accent-emerald: #10b981;
|
||
|
|
--accent-violet: #8b5cf6;
|
||
|
|
/* ... */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Adding New Sections
|
||
|
|
|
||
|
|
Follow the existing pattern using `section` elements with appropriate class names.
|
||
|
|
|
||
|
|
## Health Checks
|
||
|
|
|
||
|
|
The nginx configuration includes a `/health` endpoint that returns `200 OK` for Kubernetes probes.
|
||
|
|
|
||
|
|
## Security
|
||
|
|
|
||
|
|
- Runs as non-root user (nginx:101)
|
||
|
|
- Drops all capabilities
|
||
|
|
- Configured with proper security contexts
|
||
|
|
- TLS termination at ingress level
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Built with clean code and deployed on Kubernetes* ☸️
|