A personal portfolio site for a DevOps & Cloud Engineer — built as a static HTML5 site served via Nginx, containerized with Docker, and deployed to Kubernetes on DigitalOcean through a GitHub Actions CI/CD pipeline.
| Layer | Technology |
|---|---|
| Frontend | HTML5, CSS3, Vanilla JS |
| Styling | Bootstrap, Font Awesome 6.5, Google Fonts (Inter, Fira Code) |
| UI Plugins | jQuery, CubePortfolio, Magnific Popup, FlexSlider |
| CSS Preprocessing | LESS |
| Containerization | Docker + Nginx |
| Orchestration | Kubernetes (DigitalOcean) |
| CI/CD | GitHub Actions |
| Edge | Netlify edge functions |
web-profile/
├── index.html # Main entry point
├── css/ # Theme stylesheets
├── less/ # LESS source files
├── js/ # Third-party libraries and plugins
├── images/ # Visual assets and favicon
├── fonts/ # Web fonts
├── kubernetes/ # K8s manifests (deployment, service, ingress)
├── netlify/ # Netlify edge function config
└── .github/workflows/ # CI/CD pipeline
No build step required — the site is plain HTML/CSS/JS.
Option 1 — open directly:
open index.htmlOption 2 — serve with Docker (matches production):
docker build -t web-profile .
docker run -p 8080:80 web-profile
# visit http://localhost:8080Option 3 — any static file server:
npx serve .
# or
python3 -m http.server 8080Pushes to master trigger the GitHub Actions workflow:
- Security scan — Trivy scans the filesystem and built container image for vulnerabilities
- Build & push — Docker image is built and pushed to the container registry
- Deploy —
kubectl applyrolls out updated K8s manifests to the DigitalOcean cluster
Secrets (SSL_CERT, NGINX_CONF, KUBECONFIG, etc.) are managed via GitHub repository secrets.
Manifests live in kubernetes/. The setup includes:
deployment.yaml— Nginx container, replica count, resource limitsservice.yaml— ClusterIP / LoadBalancer serviceingress.yaml— Ingress rules with TLS termination
To apply manually:
kubectl apply -f kubernetes/- Samuel Emmanuel — development and DevOps
- Esther Onwochei — graphics and design
Apache 2.0 — see LICENSE.md for details.