commit b803ba5468da81da6b5ff2b4569dca7e0069b270 Author: Neon Vortex Date: Tue Nov 25 13:34:27 2025 -0500 Initial commit: Resume site with Flux CD automation - Add HTML comment for hiring pipeline - Configure Helm chart for Kubernetes deployment - Set up ingress for resume.caffeinetux.com - Configure Harbor registry at images.caffeinetux.com - Add Flux CD manifests for GitOps deployment - Update CI workflow for Harbor integration πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..da24eab --- /dev/null +++ b/.dockerignore @@ -0,0 +1,20 @@ +# Git +.git +.gitignore + +# Documentation +README.md +*.md + +# Helm chart (not needed in Docker image) +helm/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..2e402b5 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,106 @@ +name: Build and Deploy Resume + +on: + push: + branches: [main] + paths: + - 'index.html' + - 'Dockerfile' + - 'helm/**' + - '.github/workflows/**' + pull_request: + branches: [main] + +env: + REGISTRY: images.caffeinetux.com + IMAGE_NAME: production/resume-site + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Harbor Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_PASSWORD }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=sha,prefix= + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + helm-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.13.0 + + - name: Lint Helm chart + run: helm lint ./helm + + - name: Template Helm chart + run: | + helm template resume ./helm \ + --set image.repository=test \ + --set ingress.hosts[0].host=test.example.com \ + --set ingress.hosts[0].paths[0].path=/ \ + --set ingress.hosts[0].paths[0].pathType=Prefix + + # Optional: Deploy to cluster (uncomment and configure) + # deploy: + # needs: [build, helm-lint] + # if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + # runs-on: ubuntu-latest + # steps: + # - name: Checkout + # uses: actions/checkout@v4 + # + # - name: Set up Helm + # uses: azure/setup-helm@v3 + # + # - name: Configure kubectl + # uses: azure/k8s-set-context@v3 + # with: + # kubeconfig: ${{ secrets.KUBECONFIG }} + # + # - name: Deploy to Kubernetes + # run: | + # helm upgrade --install resume ./helm \ + # --namespace resume \ + # --create-namespace \ + # --set image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ + # --set image.tag=${{ github.sha }} \ + # --wait diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a6e08b3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM nginx:alpine + +# Copy the resume site +COPY index.html /usr/share/nginx/html/index.html + +# Custom nginx config for SPA routing +RUN echo 'server { \ + listen 80; \ + server_name _; \ + root /usr/share/nginx/html; \ + index index.html; \ + location / { \ + try_files $uri $uri/ /index.html; \ + } \ + location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { \ + expires 1d; \ + add_header Cache-Control "public, immutable"; \ + } \ + gzip on; \ + gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript; \ +}' > /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c59bd5 --- /dev/null +++ b/README.md @@ -0,0 +1,165 @@ +# 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 ` + + +
+
+ + + +
+
+
+
+
Available for Consulting
+

+ Nicholas Haven + DevOps / Platform Engineer +

+

+ 6+ years designing and operating production Kubernetes infrastructure across multi-cloud environments. Expert in GitOps, infrastructure automation, and security-first DevOps practices. +

+ +
+
+
+ +
+
+
+ 01. +

Technical Skills

+
+ +
+ + Active Security Clearance (July 2021) +
+ +
+
+

+ + Multi-Cloud Platforms +

+
+ AWS (EKS, EC2, S3, RDS) + GCP (GKE) + Azure (AKS) + Kops +
+
+ +
+

+ + Container Orchestration +

+
+ Kubernetes + Docker + Helm + Kustomize + Karpenter +
+
+ +
+

+ + Infrastructure as Code & GitOps +

+
+ Terraform + Crossplane + ArgoCD + Atlantis + Ansible + Helmfile +
+
+ +
+

+ + CI/CD Pipelines +

+
+ GitLab-CI + CircleCI + GitHub Actions + Tekton + Jenkins +
+
+ +
+

+ + Observability & Monitoring +

+
+ Prometheus + Grafana + DataDog + Custom Dashboards +
+
+ +
+

+ + Security & Compliance +

+
+ Vault + Kyverno + OPA + Istio + ModSecurity + cert-manager +
+
+ +
+

+ + Languages & Scripting +

+
+ Python + Go + Bash + Node.js + SQL +
+
+
+
+
+ +
+
+
+ 02. +

Experience

+
+ +
+
+
+
+

Site Reliability Engineer

+ Fairwinds Ops Inc. +
+ July 2022 – Present +
+

+ Primary DevOps consultant for 20+ enterprise clients, architecting production Kubernetes infrastructure across multi-cloud environments. +

+
    +
  • Architect and maintain production clusters across AWS (EKS), GCP (GKE), Azure (AKS), and Kops serving millions of requests with 99.95% uptime
  • +
  • Lead direct client engagements through regular 1:1 meetings and technical consultations, delivering tailored infrastructure solutions
  • +
  • Automate multi-cloud deployments using Atlantis for Terraform and ArgoCD for GitOps-based application delivery
  • +
  • Design zero-trust security architectures using Vault, Kyverno, OPA, and Istio service mesh
  • +
  • Pioneer Terraform templating strategies reducing deployment time by 60% across client projects
  • +
  • Maintain and contribute to open-source Kubernetes tooling including custom operators and security tools
  • +
+
+ +
+
+
+

Senior DevOps Engineer

+ Mile Two LLC +
+ Aug 2020 – May 2022 +
+

+ Delivered technical solutions for government and enterprise clients in secure and classified environments. +

+
    +
  • Collaborated with government teams to deliver solutions into classified environments with full compliance
  • +
  • Upgraded Infrastructure as Code from Terraform to Crossplane with Helmfile templating
  • +
  • Designed CI/CD pipelines with CVE scanning, secret detection, and compliance validation
  • +
  • Created Kubernetes dashboard for resource tracking, observability, and cost analysis
  • +
  • Enabled autonomous deployment capabilities through self-service automation
  • +
+
+ + Humble Expertise Award Q3 2021 +
+
+ +
+
+
+

DevOps Engineer

+ Hobsons +
+ Mar 2019 – Jul 2020 +
+

+ Modernized legacy cloud infrastructure and established infrastructure-as-code practices. +

+
    +
  • Modernized legacy cloud infrastructure to current-generation solutions
  • +
  • Implemented comprehensive metrics and alerting for improved observability
  • +
  • Established version-controlled infrastructure management with Terraform
  • +
+
+ + Modernization Engineer Award Q4 2019 +
+
+ +
+
+
+

Senior DevOps Engineer

+ SC E-Learning +
+ Aug 2016 – Mar 2019 +
+

+ Managed all client-facing services with 99.99% uptime and led major cloud migration initiative. +

+
    +
  • Managed 300+ client services with 99.99% uptime including maintenance windows
  • +
  • Orchestrated AWS migration achieving $250,000+ annual cost savings
  • +
  • Implemented CI/CD with GitHub, Jenkins, S3, Lambda, and auto-scaling across multiple AZs
  • +
+
+
+
+
+ +
+
+
+ 03. +

Education

+
+ +
+

Advanced Networking & Computer Science

+

Cincinnati State

+

September 2006 – December 2008

+
+
+
+
+ + + +