2026-08-31 17:33:05 -07:00
|
|
|
|
# Portfolio Site Deployment (ArgoCD)
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
## Context
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
Deploy personal portfolio site to Kubernetes via ArgoCD. Universal JWT OAuth already live at api.riotpiao.com for cluster.
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
## Portfolio Site Deployment
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
Portfolio source repo: `~/workplace/riotpiao` (Next.js, standalone output).
|
|
|
|
|
|
|
|
|
|
|
|
**Portfolio Helm chart structure** (local, in homelab repo):
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
k8s/portfolio/
|
|
|
|
|
|
├── Chart.yaml
|
|
|
|
|
|
├── values.yaml
|
|
|
|
|
|
├── templates/
|
|
|
|
|
|
│ ├── deployment.yaml
|
|
|
|
|
|
│ ├── service.yaml
|
2026-08-31 17:33:05 -07:00
|
|
|
|
│ ├── ingress.yaml
|
2026-08-18 18:33:49 -07:00
|
|
|
|
│ └── _helpers.tpl
|
|
|
|
|
|
└── README.md
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
**ArgoCD Application** (in homelab repo, synced by ArgoCD):
|
|
|
|
|
|
|
|
|
|
|
|
`argocd/applications/portfolio.yaml`:
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
apiVersion: argoproj.io/v1alpha1
|
|
|
|
|
|
kind: Application
|
|
|
|
|
|
metadata:
|
|
|
|
|
|
name: portfolio
|
|
|
|
|
|
namespace: argocd
|
|
|
|
|
|
spec:
|
|
|
|
|
|
project: default
|
|
|
|
|
|
source:
|
|
|
|
|
|
repoURL: https://forgejo.riotpiao.com/rock/homelab
|
|
|
|
|
|
targetRevision: HEAD
|
|
|
|
|
|
path: k8s/portfolio
|
|
|
|
|
|
destination:
|
|
|
|
|
|
server: https://kubernetes.default.svc
|
|
|
|
|
|
namespace: portfolio
|
|
|
|
|
|
syncPolicy:
|
|
|
|
|
|
automated:
|
|
|
|
|
|
prune: true
|
|
|
|
|
|
selfHeal: true
|
|
|
|
|
|
syncOptions:
|
|
|
|
|
|
- CreateNamespace=true
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-18 18:33:49 -07:00
|
|
|
|
**Build + push script** (portfolio repo):
|
|
|
|
|
|
|
|
|
|
|
|
`~/workplace/riotpiao/build.sh`:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
REGISTRY="forgejo.riotpiao.com"
|
2026-08-18 18:33:49 -07:00
|
|
|
|
IMAGE="${REGISTRY}/rock/portfolio:latest"
|
|
|
|
|
|
|
|
|
|
|
|
docker buildx build --platform linux/amd64 -t "${IMAGE}" .
|
|
|
|
|
|
docker push "${IMAGE}"
|
|
|
|
|
|
|
|
|
|
|
|
echo "✓ Pushed ${IMAGE}"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
## Repository Structure
|
|
|
|
|
|
|
|
|
|
|
|
**In homelab repo:**
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
```
|
2026-08-31 17:33:05 -07:00
|
|
|
|
~/workplace/homelab/
|
|
|
|
|
|
├── argocd/
|
|
|
|
|
|
│ └── applications/
|
|
|
|
|
|
│ └── portfolio.yaml # ArgoCD Application manifest
|
|
|
|
|
|
└── k8s/
|
|
|
|
|
|
└── portfolio/
|
|
|
|
|
|
├── Chart.yaml
|
|
|
|
|
|
├── values.yaml
|
|
|
|
|
|
└── templates/
|
|
|
|
|
|
├── deployment.yaml
|
|
|
|
|
|
├── service.yaml
|
|
|
|
|
|
├── ingress.yaml
|
|
|
|
|
|
└── _helpers.tpl
|
2026-08-18 18:33:49 -07:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Implementation Sequencing
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
1. **Portfolio build + push:**
|
2026-08-18 18:33:49 -07:00
|
|
|
|
- `cd ~/workplace/riotpiao && ./build.sh`
|
|
|
|
|
|
- Verify image in Forgejo registry
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
2. **Create ArgoCD Application:**
|
|
|
|
|
|
- Add `argocd/applications/portfolio.yaml` to homelab repo
|
|
|
|
|
|
- Push to Forgejo
|
|
|
|
|
|
- ArgoCD auto-syncs
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
3. **Verification:**
|
|
|
|
|
|
- `curl -I https://portfolio.riotpiao.com` → 200
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Portfolio Page Features
|
|
|
|
|
|
|
|
|
|
|
|
### Hero Section
|
|
|
|
|
|
- Animated avatar with flowing blob (HeroBlobFlow component)
|
|
|
|
|
|
- Title: "Full-Stack Systems Engineer"
|
|
|
|
|
|
- Subtitle: "Infrastructure × Backend × LLM Systems"
|
|
|
|
|
|
- Description: Observable, fault-tolerant systems from bare metal to cloud
|
|
|
|
|
|
- CTAs: "Explore Systems", GitHub link
|
|
|
|
|
|
- Terminal hint: "Press Cmd+K to explore via terminal"
|
|
|
|
|
|
|
|
|
|
|
|
### Experience Timeline
|
|
|
|
|
|
- Chronological work history visualization (ExperienceTimeline component)
|
|
|
|
|
|
- Job titles, companies, dates, achievements
|
|
|
|
|
|
|
|
|
|
|
|
### Feature Cards Grid (6 cards)
|
|
|
|
|
|
Each card has icon, title, description, stat, status badge, link to detail page:
|
|
|
|
|
|
|
|
|
|
|
|
1. **Infrastructure Platform** (GitBranch icon)
|
|
|
|
|
|
- Multi-region Terraform + ArgoCD GitOps on Kubernetes
|
|
|
|
|
|
- Stat: 40% CPU reduction
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
2. **Distributed Systems** (Cpu icon)
|
|
|
|
|
|
- gRPC, Kafka, AWS Step Functions across 57+ regions
|
|
|
|
|
|
- Stat: Mission-critical
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
3. **LLM Systems** (MessageSquare icon)
|
|
|
|
|
|
- CPU-bound inference optimization, INT4/INT8 quantization
|
|
|
|
|
|
- Stat: 60% latency cut
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
4. **Kafka Cluster** (Database icon)
|
|
|
|
|
|
- Strimzi KRaft cluster with auto-scaling brokers
|
|
|
|
|
|
- Stat: 3 brokers
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
5. **Open Source** (Layers icon)
|
|
|
|
|
|
- go-flink: distributed DataLakeHouse in Go
|
|
|
|
|
|
- Stat: Public repo
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
6. **Observability** (BarChart3 icon)
|
|
|
|
|
|
- Prometheus, Grafana, Dynatrace — live metrics
|
|
|
|
|
|
- Stat: 99.2% uptime
|
|
|
|
|
|
- Status: Live
|
|
|
|
|
|
|
|
|
|
|
|
### Interactive Terminal
|
|
|
|
|
|
- Accessible via Cmd+K shortcut
|
|
|
|
|
|
- Browse systems/projects via command-line interface
|
|
|
|
|
|
- InteractiveTerminal component
|
|
|
|
|
|
|
|
|
|
|
|
### Dark Mode
|
|
|
|
|
|
- Full light/dark theme support via Tailwind
|
|
|
|
|
|
|
|
|
|
|
|
### Footer
|
|
|
|
|
|
- Copyright, GitHub, email links
|
|
|
|
|
|
- Homelab deployment note (3-node Talos cluster)
|
|
|
|
|
|
|
|
|
|
|
|
### Planned Detail Pages
|
|
|
|
|
|
- `/infrastructure` — K8s + Terraform setup details
|
|
|
|
|
|
- `/systems` — Distributed systems deep-dive
|
|
|
|
|
|
- `/llm` — Inference optimization techniques
|
|
|
|
|
|
- `/kafka` — Kafka cluster architecture
|
|
|
|
|
|
- `/opensource` — go-flink project showcase
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Files to Create
|
|
|
|
|
|
|
|
|
|
|
|
**In homelab repo:**
|
2026-08-31 17:33:05 -07:00
|
|
|
|
- `argocd/applications/portfolio.yaml` (ArgoCD Application)
|
|
|
|
|
|
- `k8s/portfolio/Chart.yaml`, `values.yaml`
|
|
|
|
|
|
- `k8s/portfolio/templates/{deployment,service,ingress}.yaml`
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
**In portfolio repo (`~/workplace/riotpiao`):**
|
2026-08-31 17:33:05 -07:00
|
|
|
|
- App pages: `app/layout.tsx`, `app/page.tsx`, `app/about/page.tsx`
|
|
|
|
|
|
- Detail pages: `app/infrastructure/page.tsx`, `app/systems/page.tsx`, etc.
|
|
|
|
|
|
- Components: Header, Footer, FeatureCard, HeroBlobFlow, ExperienceTimeline, InteractiveTerminal, AnimatedRoles, AvatarWithBlob, TypewriterText, ProgressiveText, LiveIndicator
|
|
|
|
|
|
- Content: `content/{projects,experience,metadata}.ts`
|
|
|
|
|
|
- Styles: `styles/globals.css`
|
|
|
|
|
|
- Docker: `Dockerfile`, `build.sh`, `next.config.js`
|
|
|
|
|
|
- Config: `package.json` (Next.js 15 + Tailwind + Framer Motion + Lucide)
|
2026-08-18 18:33:49 -07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Success Criteria
|
|
|
|
|
|
|
2026-08-31 17:33:05 -07:00
|
|
|
|
- [x] Repository ready for ArgoCD sync
|
|
|
|
|
|
- Dockerfile + multi-stage build
|
|
|
|
|
|
- .dockerignore + build.sh
|
|
|
|
|
|
- K8s manifests (Kustomize) in infra/portfolio/base/
|
|
|
|
|
|
- ArgoCD Application defined in infra/argocd-apps.yaml
|
|
|
|
|
|
- Forgejo Actions CI pipeline (.forgejo/workflows/build-push.yml)
|
|
|
|
|
|
- [ ] Portfolio site accessible at portfolio.riotpiao.com
|
|
|
|
|
|
- [ ] Project grid + about page render
|
|
|
|
|
|
- [ ] Image served from Forgejo registry
|
|
|
|
|
|
- [ ] Deployed via ArgoCD (no manual kubectl)
|
|
|
|
|
|
- [ ] ArgoCD Application syncs automatically
|