Journal — J. Choo Portfolio Ed.
in progress planned shipped > migrated

Jocelyn Choo

Solutions Engineer DevOps

runs a family media platform and a DevOps lab off three machines in the same rack.

Building a 3-node Proxmox homelab, GitOps pipelines, and infrastructure-as-code. Solutions Engineer by day, DevOps by night.

family-prod · uptime 99.9%
Jocelyn Choo pg. 01 — profile

Collection · pg. 02

Great things are yet to be done

Journal Entry

Currently a Solutions Engineer in Hong Kong, building homelab-infra on the side — a 3-node Proxmox cluster that's both my family's private cloud and a production-grade DevOps playground: Terraform, Ansible, K3s, ArgoCD, and CI/CD, all as code.

"Live like no one else today, so that you can live like no one else tomorrow." — Dave Ramsey

Experience 2+ yrs System Engineering 1+ yr Backend Development
Education B.Sc. Internet & Multimedia Technologies Associate of Arts in Computer Science

Collection · pg. 03

The toolchain

DevOps Tools

Core stack

  • Linux — experienced
  • Shell & Bash scripting — intermediate
  • Build tools — intermediate
  • Python — experienced
  • Docker — experienced
  • GitOps · ArgoCD — basic
CI/CD Automation

Pipeline & cloud

  • Jenkins — intermediate
  • AWS Cloud — intermediate
  • AWS EKS — basic
  • Kubernetes — basic
  • Terraform — experienced
  • Ansible + Vault — experienced
  • Prometheus · Grafana · Loki — proficient
  • GitLab (self-hosted CE) — intermediate
  • Networking — DNS (AdGuard) · reverse proxy (NPM) · managed VLANs (in progress)

Collection · pg. 04

homelab-infra

A 3-node Proxmox cluster, built in public — a family media platform and a DevOps playground, everything as code. Phases 1–2 are live: the family tier (Jellyfin, Nextcloud, Immich photo backup, media automation with a self-healing watchdog) after a zero-downtime cutover, and the core-infra tier — self-hosted DNS, reverse proxy, Prometheus/Grafana/Loki observability with live email alerting, and GitLab CE. A GitLab Runner is registered and online; the first pipeline is next, VLAN segmentation is rolling out zone by zone, and the disposable K3s lab — torn down and rebuilt monthly — follows. If it isn't in git, it doesn't exist.

Proxmox VE 9 (3-node cluster) Terraform Ansible + Vault Docker Compose Cloudflare Tunnel Tailscale Prometheus · Grafana · Loki AdGuard DNS Nginx Proxy Manager GitLab CE PBS backups Immich (photos) MikroTik managed VLANs GitLab Runner K3s ArgoCD Jenkins · JCasC Off-site backup (B2/R2)
GitHub Repo Design Decisions (ADRs)
Diagram

Architecture pg. 05

Homelab architecture diagram

Traffic enters through a Cloudflare Tunnel (no open ports) to Jellyfin and Nextcloud — the only public services; every admin plane, including Immich's photo backup, is Tailscale-only. All three nodes are clustered: k8plus (family-prod — Jellyfin, Nextcloud, Immich), g11 (core-infra — DNS, reverse proxy, Prometheus/Grafana/Loki with email alerting, GitLab CE, and a registered GitLab Runner), and the MacBook (disposable K3s lab). The first CI pipeline is next. A MikroTik managed switch is in place, with VLAN segmentation rolling out zone by zone and a JetKVM for out-of-band console.

○ planned

5-Minute Demo Video pg. 06

One git push travels through CI, security scanning (Trivy), and ArgoCD to a live Kubernetes rollout — recorded end to end.

✕ shipped

Live Proof pg. 07

Grafana Fleet Overview (system health) and a public Uptime Kuma status page (service uptime) are both live — real infra, watchable in real time.

Grafana Fleet Overview dashboard showing CPU, memory, filesystem, and network metrics across all six homelab hosts
Jellyfin status Nextcloud status Grafana status
View live status →
○ phase 5

The AWS Party Trick pg. 08

./demo.sh up stands up a mini k3s lab on AWS spot in ~4 minutes and prints a live URL; ./demo.sh down tears it down — a few cents per run, nothing left behind.

Collection · pg. 10

Let's build something

Index jocelyn_cys@jchoo.me LinkedIn GitHub