Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35698bfac5 |
@@ -1,131 +1,269 @@
|
||||
# Hi, I'm Chase (Ced) Dumphord
|
||||
### DevOps Engineer | Platform & Cloud Infrastructure Engineer | Industrial Systems
|
||||
<h1>Hi, I'm Chase! <br/>
|
||||
Digital Systems | Infrastructure | RF Edge Systems
|
||||
</h1>
|
||||
|
||||
> **Live Portfolio:** https://chasedumphord.com
|
||||
> **Live NOC Dashboard:** https://noc.chasedumphord.com
|
||||
<h3>
|
||||
I build real-world systems that combine data, automation, and infrastructure.
|
||||
From dashboards and full-stack apps to homelab environments, everything I create is designed to solve practical problems and scale.
|
||||
</h3>
|
||||
|
||||
<img align="right" alt="Coding Gorilla" width="400px" style="padding-right:10px;" src="https://gifdb.com/images/thumbnail/monkey-laptop-coding-miys12p5izw3s11s.gif" />
|
||||
|
||||
<ul>
|
||||
<li>🚀 Currently building data dashboards & system monitoring tools</li>
|
||||
<li>🖥️ Running a full homelab (Proxmox, Kubernetes, Docker)</li>
|
||||
<li>⚙️ Focused on automation, infrastructure, and real-world systems</li>
|
||||
<li>🧠 Ask me about Raspberry Pi clusters, K3s, or system design</li>
|
||||
<li>📫 Reach me: Chasedumphord@gmail.com</li>
|
||||
<li>⚡ Fun fact: I have ball pythons 🐍 along with dogs</li>
|
||||
</ul>
|
||||
|
||||
---
|
||||
|
||||
## About
|
||||
# 🧠 Ced’s Portfolio System
|
||||
|
||||
DevOps and Cloud Infrastructure Engineer with 10+ years of experience across industrial automation, manufacturing data systems, field service engineering, and infrastructure operations. Currently part of GE Aerospace's Digital Team building data pipelines, dashboards, and digital inspection systems using MTConnect and OPS Vision. Hands-on infrastructure engineer running an 18-node production environment consisting of a 6-node Proxmox VE cluster and a 12-node K3s Kubernetes cluster with TrueNAS, full observability stack, and VLAN-segmented networking. Built from the ground up and running in production every day. The infrastructure on this page is live. Not a demo.
|
||||
👉 **Live Site:** https://chasedumphord.com
|
||||
|
||||
This repository represents a **live system portfolio**, not just static projects.
|
||||
|
||||
It showcases:
|
||||
|
||||
* 📊 **Ced’s NOC Dashboard** (live system monitoring)
|
||||
* 🧠 **HomeLab Infrastructure** (Proxmox, VLANs, services)
|
||||
* ☸️ **K3s Cluster** (distributed compute)
|
||||
* 📡 **APRS iGate (RF Edge System)**
|
||||
|
||||
---
|
||||
|
||||
## Live Sites
|
||||
# 📊 Ced’s NOC Dashboard
|
||||
|
||||
| Site | URL | Description |
|
||||
|------|-----|-------------|
|
||||
| Portfolio | https://chasedumphord.com | Personal portfolio, projects, stack, resume |
|
||||
| NOC Dashboard | https://noc.chasedumphord.com | Live infrastructure visibility — 28 systems |
|
||||
A central visibility layer for all systems.
|
||||
|
||||
<b>Live:</b> <a href="https://noc.chasedumphord.com">noc.chasedumphord.com</a>
|
||||
|
||||
### 🔍 What it shows:
|
||||
|
||||
* Infrastructure health
|
||||
* Service availability
|
||||
* Network segmentation
|
||||
* RF edge system status
|
||||
|
||||
### 🧠 Why it matters:
|
||||
|
||||
This demonstrates:
|
||||
|
||||
* System monitoring mindset
|
||||
* Operational visibility
|
||||
* Real-world infrastructure awareness
|
||||
|
||||
---
|
||||
|
||||
## Ced's NOC — Live Infrastructure Observability
|
||||
## 🖼️ Live Dashboard Preview
|
||||
|
||||
Real time network operations center dashboard monitoring 28 homelab systems across 6 infrastructure layers.
|
||||
### 📊 Metrics Overview
|
||||
|
||||
### How It Works
|
||||

|
||||
|
||||
### 🖥️ Systems Overview
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 🔴 Live System Status
|
||||
|
||||
🔴 **Live NOC Dashboard:** [noc.chasedumphord.com](https://noc.chasedumphord.com)
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
# 🧠 Featured System — Ced’s NOC (Network Operations Center)
|
||||
|
||||
A real-time monitoring and observability platform built on top of my homelab infrastructure.
|
||||
|
||||
### 🔍 What it demonstrates:
|
||||
|
||||
* Live system monitoring (services, nodes, edge systems)
|
||||
* Infrastructure visibility across VLANs and clusters
|
||||
* Custom dashboard UI (portfolio + operational view)
|
||||
* Service health tracking (latency, uptime, status)
|
||||
* Real data ingestion (not simulated)
|
||||
|
||||
### ⚙️ Stack:
|
||||
|
||||
* Python (health checks / data generation)
|
||||
* JSON API (status feed)
|
||||
* JavaScript (dynamic UI rendering)
|
||||
* Future: Grafana + Prometheus integration
|
||||
|
||||
👉 This is the **core system** that ties everything together.
|
||||
|
||||
---
|
||||
|
||||
# 🧱 Foundation — Ced’s Home Lab (Infrastructure + Monitoring)
|
||||
|
||||
Real-world environment used to simulate production systems and host services.
|
||||
|
||||
* Proxmox virtualization platform
|
||||
* K3s Kubernetes cluster (Raspberry Pi)
|
||||
* TrueNAS storage system
|
||||
* Nginx Proxy Manager (external access layer)
|
||||
* VLAN segmentation (Main / IoT / HomeLab / Guest)
|
||||
* Monitoring stack (Grafana, Prometheus, Uptime Kuma)
|
||||
|
||||
👉 The NOC dashboard is built directly on top of this environment.
|
||||
|
||||
---
|
||||
|
||||
# 📡 Edge System — APRS iGate (RF → Internet Gateway)
|
||||
|
||||
A real-world RF system that feeds live data into infrastructure.
|
||||
|
||||
* Raspberry Pi + Direwolf APRS TNC
|
||||
* Audio chain tuning (critical for decode accuracy)
|
||||
* APRS-IS integration
|
||||
* Real beacon ingestion from handheld radios
|
||||
|
||||
🔗 **Project:**
|
||||
https://github.com/ced4568/ceds-aprs-igate
|
||||
|
||||
---
|
||||
|
||||
## 🔥 Key Insight
|
||||
|
||||
This system bridges:
|
||||
|
||||
```
|
||||
Proxmox Biggie (Cron every 5min)
|
||||
→ noc_update.py pings 28 systems
|
||||
→ writes data/noc-status.json
|
||||
→ git push to ced-portfolio
|
||||
→ GitHub Pages deploys (~30s)
|
||||
→ Browser fetches every 30s
|
||||
→ Live dashboard updates
|
||||
RF (radio signals) → Digital Infrastructure → Internet (APRS-IS)
|
||||
```
|
||||
|
||||
### Systems Monitored
|
||||
---
|
||||
|
||||
- **6-node Proxmox Cluster** — BigWorld, Biggie, Snoop, TooShort, Tupac, DrDre
|
||||
- **12-node K3s Cluster** — 3 control plane (django-1/2/3) + 9 workers (ingress, data, monitoring groups)
|
||||
- **TrueNAS** — Network attached storage
|
||||
- **Nginx Proxy Manager** — Reverse proxy layer
|
||||
- **Prometheus + Grafana + Uptime Kuma** — Full observability stack with Prometheus actively scraping
|
||||
- **Portainer** — Container management and deployment UI
|
||||
- **Dashy + Home Assistant + PrimeStation** — Services layer
|
||||
- **Hermes Agent** — AI-assisted ops automation agent
|
||||
- **Hetzner VPS** — Cloud-hosted production node
|
||||
- **Tailscale** — Zero-config VPN mesh networking
|
||||
- **Restdesk** — Self-hosted helpdesk and ticketing
|
||||
- **PaperClip Agents** — Document automation and processing agents
|
||||
- **APRS iGate x2** — RF edge systems (home + mobile)
|
||||
## 🎯 Key Tuning Insight
|
||||
|
||||
### Automation
|
||||
* Target audio level: **~50–60**
|
||||
* Too high → clipping / decode failure
|
||||
* Too low → missed packets
|
||||
|
||||
- Script: `~/scripts/noc_update.py` running on Biggie
|
||||
- Cron: `*/5 * * * *` — every 5 minutes
|
||||
- Log: `/var/log/noc_update.log`
|
||||
- Auth: GitHub Personal Access Token via baked remote URL
|
||||
This was tuned using:
|
||||
|
||||
* Direwolf audio level output
|
||||
* Real beacon testing from handheld radios
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure Overview
|
||||
# 🧠 Featured Projects
|
||||
|
||||
| Layer | Systems | Count |
|
||||
|-------|---------|-------|
|
||||
| Compute | Proxmox VE cluster | 6 nodes |
|
||||
| Orchestration | K3s Kubernetes | 12 nodes |
|
||||
| Total Nodes | Combined infrastructure | 18 nodes |
|
||||
| Storage | TrueNAS | 1 |
|
||||
| Networking | Nginx Proxy Manager, Cloudflare Tunnels, UniFi VLANs | 4 VLANs |
|
||||
| Monitoring | Prometheus, Grafana, Uptime Kuma, Custom NOC | 4 services |
|
||||
| Edge | APRS iGate (home + mobile), Direwolf TNC | 2 nodes |
|
||||
<ul>
|
||||
<li>
|
||||
<b>🧠 Ced’s NOC Dashboard</b><br/>
|
||||
Real-time monitoring system providing visibility into infrastructure, services, and edge systems.<br/>
|
||||
<b>Highlights:</b> Live status tracking, latency monitoring, alert panel, dynamic UI updates.<br/>
|
||||
<b>Live:</b> <a href="https://noc.chasedumphord.com">noc.chasedumphord.com</a><br/>
|
||||
<b>Source:</b> <a href="https://github.com/ced4568/ceds-homelab">ceds-homelab</a>
|
||||
</li>
|
||||
|
||||
<br/>
|
||||
|
||||
<li>
|
||||
<b>🧱 Ced’s Home Lab</b><br/>
|
||||
Full infrastructure environment simulating production systems using virtualization and Kubernetes.<br/>
|
||||
<b>Highlights:</b> Proxmox VE, K3s cluster (12-node Pi cluster), VLAN segmentation, reverse proxy, monitoring stack.<br/>
|
||||
<b>Source:</b> <a href="https://github.com/ced4568/ceds-homelab">ceds-homelab</a>
|
||||
</li>
|
||||
|
||||
<br/>
|
||||
|
||||
<li>
|
||||
<b>📡 APRS iGate (RF Edge System)</b><br/>
|
||||
RF-to-internet gateway ingesting real-world radio data into digital systems.<br/>
|
||||
<b>Highlights:</b> Audio tuning, Direwolf APRS TNC, APRS-IS integration, live beacon ingestion.<br/>
|
||||
<b>Source:</b> <a href="https://github.com/ced4568/ceds-aprs-igate">ceds-aprs-igate</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
---
|
||||
|
||||
## Featured Projects
|
||||
# 🧰 Tech Stack
|
||||
|
||||
### Ced's NOC Dashboard
|
||||
### ⚡ Core Technologies
|
||||
|
||||
Real time monitoring system with live system health, latency tracking, severity based alerts, and layer filtering.
|
||||
<img align="left" alt="TypeScript" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/typescript/typescript-plain.svg" />
|
||||
<img align="left" alt="Git" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/git/git-original.svg" />
|
||||
<img align="left" alt="Linux" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/linux/linux-original.svg" />
|
||||
<img align="left" alt="HTML" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/html5/html5-plain.svg" />
|
||||
<img align="left" alt="JavaScript" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/javascript/javascript-plain.svg" />
|
||||
<img align="left" alt="React" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg" />
|
||||
<img align="left" alt="NodeJS" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nodejs/nodejs-original.svg" />
|
||||
<img align="left" alt="Python" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/python/python-plain.svg" />
|
||||
<img align="left" alt="Docker" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg" />
|
||||
<img align="left" alt="Kubernetes" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/kubernetes/kubernetes-plain.svg" />
|
||||
<img align="left" alt="Grafana" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/grafana/grafana-original.svg" />
|
||||
<img align="left" alt="Prometheus" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/prometheus/prometheus-original.svg" />
|
||||
<img align="left" alt="Bash" width="30px" style="padding-right:10px;" src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/bash/bash-original.svg" />
|
||||
|
||||
- **Live:** https://noc.chasedumphord.com
|
||||
- **Source:** https://github.com/ced4568/ceds-noc
|
||||
|
||||
### Ced's HomeLab
|
||||
|
||||
Full enterprise style homelab with Proxmox clustering, K3s orchestration, VLAN segmentation, and full observability stack including Prometheus scraping.
|
||||
|
||||
- **Source:** https://github.com/ced4568/ceds-homelab
|
||||
|
||||
### APRS iGate (RF Edge System)
|
||||
|
||||
Dual node RF to internet gateway. Raspberry Pi + Direwolf TNC. Live on aprs.fi.
|
||||
|
||||
- **Source:** https://github.com/ced4568/ceds-aprs-igate
|
||||
<br /><br />
|
||||
|
||||
---
|
||||
|
||||
## Tech Stack
|
||||
### 🖥️ Infrastructure & Systems
|
||||
|
||||
**Infrastructure:** Proxmox VE • K3s • Docker • TrueNAS • Helm • Terraform • Nginx Proxy Manager • Cloudflare Tunnels
|
||||
* Proxmox VE (Virtualization)
|
||||
* K3s Kubernetes (Raspberry Pi Cluster)
|
||||
* Docker / Containerized Services
|
||||
* TrueNAS (Storage)
|
||||
|
||||
**Monitoring:** Prometheus • Grafana • Uptime Kuma • Custom NOC Dashboard
|
||||
### 📊 Monitoring & Observability
|
||||
|
||||
**Networking:** UniFi • VLAN Segmentation • Tailscale • Cloudflare DNS
|
||||
* Grafana (Dashboards)
|
||||
* Prometheus (Metrics - in progress)
|
||||
* Uptime Kuma (Service Monitoring)
|
||||
* Custom NOC Dashboard (Python + JSON + JS)
|
||||
|
||||
**GitOps & CI/CD:** GitHub Actions • Docker Compose • Manifest-driven Config
|
||||
### 🌐 Networking & Access
|
||||
|
||||
**Edge / RF:** Direwolf • APRS-IS • Raspberry Pi • RTL-SDR
|
||||
* Nginx Proxy Manager (Reverse Proxy)
|
||||
* Cloudflare Tunnels (Secure External Access)
|
||||
* VLAN Segmentation (UniFi Network)
|
||||
|
||||
**Development:** Python • Bash • JavaScript • HTML/CSS • Git
|
||||
### 📡 Edge & RF Systems
|
||||
|
||||
**AI & Automation:** n8n • OpenRouter • Telegram Bots • ChatGPT • Claude (Anthropic) •Crew AI Agent • Gemini • Hermes Agent • LLM-assisted Documentation • AI-driven Diagnostics
|
||||
* Direwolf (APRS TNC)
|
||||
* APRS-IS Integration
|
||||
* Raspberry Pi iGate Systems
|
||||
* Audio Signal Processing / Tuning
|
||||
|
||||
### 💻 Development
|
||||
|
||||
* Python (Automation / Data Collection)
|
||||
* JavaScript (Frontend Dashboard UI)
|
||||
* HTML / CSS (UI Design)
|
||||
* Bash (System Automation)
|
||||
* Git / GitHub (Version Control)
|
||||
|
||||
---
|
||||
|
||||
## Connect
|
||||
# 📈 Roadmap
|
||||
|
||||
[](https://www.linkedin.com/in/chase-dumphord/)
|
||||
[](https://github.com/ced4568)
|
||||
[](https://chasedumphord.com)
|
||||
[](https://noc.chasedumphord.com)
|
||||
|
||||
📧 chasedumphord@gmail.com | Oxford, MS
|
||||
* [ ] Grafana + Prometheus integration
|
||||
* [ ] Real-time metrics ingestion
|
||||
* [ ] NOC alerting system
|
||||
* [ ] Mobile APRS iGate deployment
|
||||
* [ ] Advanced system dashboards
|
||||
|
||||
---
|
||||
|
||||
> Built from the ground up and running in production every day. The infrastructure on this page is live. Not a demo.
|
||||
# 👤 Connect With Me
|
||||
|
||||
[LinkedIn](https://www.linkedin.com/in/toochase-dumphord/)
|
||||
[GitHub](https://github.com/ced4568)
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Final Note
|
||||
|
||||
> This is not a static portfolio — it is a **live representation of working systems.**
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Author (anonymous) /CreationDate (D:20260602024727+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260602024727+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Count 3 /Kids [ 4 0 R 5 0 R 6 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2779
|
||||
>>
|
||||
stream
|
||||
GauHM>BALh(4OT53)@/S)3E5\fV^%JM4OEBJRiMro$U&<oN:BZ[3Wddm>p/.>KtF/:?#+9<#L=We).]ak7XD5pugDhBgMB'8geP*ncP?+acF)jVO)B_IHC9U+"'GH_QY-#0mRaY$mVD:ig%G`P<kfRI*(irUcH\LIg$^#+'XR&"gO1,p7+6mlFX+WK_e!,V?OXS03Q9YZmj.odb/OqrJRPfgZq6(6f)5'o7mWYK+J#@no7aWZT%Z1QQ3`Wn(Bctq>F#jd@"5Fagn;KdV[:p\^CZ[K>tH:1:iQgc)Or+C#)%DSYHuVC[aTnS0k;:k!cZc14b8d!!`m#6\DWc`Vp@eJV2VHJqFUJBP&A68^IqEW#Gl5O%XC4J1g07eHBegA"q1Mkhh;MM;1a(JLA!iG<?Pe]KHkt`1H=uO5drAeB;H9+/_5ZJG$00o5%JOh\b+'dsJtu07qYW05S>UD`&FS<[VT5IW@c=:KLVmO8mmqm0*3H[7K9d%Z?,E/)jU13Njp+Up5;G'MP_(J4;79Or(JP?\]#>54cj@Aa$P<mX)Y20F/Jc/om?'^(Vl$@;'o]%pEtM.oLHJ%jfhZbENZ5[Ak\hgIPdJXU8)r\IK?J2KNKk$+Z^feSO,T]<I7]!39i:YsWTKo8G0%mfi.<%LqK@/7u/J<WS>r[.7ncB[(+ZYGc!C2Ls\Ud>.m<a\r,aMG=>,#>h=g'f9\oN]:6*NND;IA-P5_U>uSS%Y,FtQ8?L%<jd`=-WS6fjJfs^:)RdrU]8kdXJEcZHi3#L6D&r<!ftXs6.Npjp9f2Z;EPdu88G8fDPT*j0M28:.ojTge1,6;(gPo*X^hI-[,,>X["f3L%u#>&cY&L)n/t+:C^e82*r$:IoV%[m/U>UAVZHI#$YV-1hD3Uj^E-,-asPG+c&==/9]VpS;,sspY-m$IbL(IAiX5jLB7u2W.X_P=4Sm.W>%I.s8F'O@bFMJQ&84Bo%4Z)@c%^!c^r>HI!buEUFV44N,PHR>\gV-d"6o48ADci';'0U67-VMQ+MgjG5/%+rdT;YBF!2#-'YD,Ag:tcjZ--.b3RcCN_bW&uaJ(7T$AP)+M*.t<(T'<#8sQH2fQ6:1n4iu?#p&L0LFZC^N#WO7_eWLYO0p_'jh$[24A\uS6*uc[NCj!;)F=5][gnt/oT&5ISb'[email protected]\m"3cg3c^Hs$:LO=J^K4Sr76ep'9,gP.(2=Th?PuLX%f952Y@dV<W>Dnm[KHk;gV]iq^7!<0bQHa-XhIeCD:A:ola;QT<EL)Z;[IkK_(u;/G$]O/L?B&pEJJFG4q=WHfI%YFb@^Da_cYooH1^'O"Hp]-R%nopd-aZJbD=2t5-Tc/q^*%XfgB;1MT7!cM1Y8-ssU;c6LI)nM[-S+3qu**L[^D9B"?/GgVCSWloJ]G2I1i0<b(/5YrA6)>+#YcR$qC+i7Q:,V'Q!Q*Id*gprIe&)MAHbJUlc=&?7=#q[tNc.]GDNARtcul?)C^bJ,D&[email protected]/EtM#\?\K2X*SK+,!!HBGG79>Ai-gd\QVoJNE&iUlH$4Np05`!:=J]@/@[YWT>!k*Xe\,PGi,'[`Z%3?k%`F))@3NlY.drF%2<K#lY`RsD,GYFS;Th2*uk"mb.=%V*Go,YW0=OOfK)+])I.PJ#'Z'tSBL=>c*EiaPUD&MDd/%CY:`Qsj3d)sZ)ne)5Fd,Z/(6+8*St5S2Gj/A$JKU<L5lsN],d<g__>3=!BaG[n_&goji"7<]++K.m%-pL/P9.5I!Tp\17h0US/bZ:^U;eZ_WC0C1iPct@c!>Sg>W4_]"G]@15oqUY\&J=,\jDOiK\P%mgV?WT(@Xo'8<HeT5>U$@I./fo@FRXa1uiYBH;"UhRl&l:FAB_4U,o\Q+Z5&1cCb1otQRts1bEcE"hi1B:.FI?0n:=6HB(==P^%4FF(075%i0cQ,19%%=A&u`J3F@pB^TlCCrXY&&#f1q)aE]#hoPSWmpoX>sVhFFFrDQ2U#rj*j=K^S,G_b))su"s2b9hpOUA'B1[IA)[sV$:JmulhR1Uc)om++CeDsFVG.B3(M7]bgj$akQa=Gg[FuWi%;l7:a$[J0&qg0*LM>[email protected]\q62Zn/m"l0<[j"Z27)Up+>l.Jd<<#&[6b/1PBI5nfn-D1pUKqiLS5N$/c:'<F1n`/G,$bSQ<gLGB<00@0]R.i>"<\gW#Me_Ae22#A*RW`fliHfMVQ)%da1imo==#6dQ$C<KfSq(H2W<_q&Aq"0n](&+`CqYbY/k\,LN#bRDigX;8okOgF=(c443i3an$7Er3UIU!Maejb]8j*F-`\8M)N8%a(dZ*:)QR/+Q/V)'Xo$D/pKG3=W0Hk&p>G;M&/5m\]?RM&/&-/\%@:;EojgMbmtJ+Qi53((0r,B\o_NsYgd9]nV@H(+47u%Ol#fOj3sSA6r*H"fWD!ck81\D*b^#\d+I(_m*,1&l<ac3Am;FkYfrHcDoCX2V=P+TOB=%:fOZ7l.a]7b21[CDLSdefdO-@^5T:3HTo6BYIB*+0hk",qdGE"tj-`H+8JPcKX]8,h'aYS1=er:X>1Te8(1E\GIaNc.#L#<oHc^^t+'Jba[[.5SAcm0gE,P?URCBYU4YTSp7t(?g$hk$eUK6k5+PC%8>?r(2gZic`dj3o'0S_T[W2P[AK\bo%`\eXZ+5h#-*sXCtfi-dGKrit];1*<CIaT?YDc:A<:7%^;/YT9!f/:*XeP)r(\+6-GgnGiGd;JRfUm:JKbhs.>a,il>1Cq1q*ro0%Zi~>endstream
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2872
|
||||
>>
|
||||
stream
|
||||
Gatm<?'j9R(4FN43)<iI?/T,N&*VbY1.bT=FCkuXm6b35/O5<#Hn?4&J,S2dKl*3N[qSB6_MeN[S:/]9HV6P^nCP/LVd#lS$[Vcs-U49CMYtg/BlQpmMcZJl7\f4$]HBb^a<tnBs%p-&]=7-A!DU84?-`3BfWBpQI(+54;\EQS/cBqcpbXAgSnUskK@5-?6[F&KGM2ifi$V_+8W3U*+cZD6D"bd7UQE-e^Mg`10_%W];:=ioC9cgtF^dRm-S]m<&;='R-;>E!n9paM(6,:P$(j^0LQm`fG3--YRsO=qEr.oZ=boMkWuA:L;F@]Y<[Z;p4_eT`WC:[b`KTK^-J6qBfR6!]8O@?2Q4F@kE<%oHE[V:>X+G+BqsN-gC*e`p4Y]qhGuYmK;%P65H7LJZQhcLip5<9r8X@"u>0)<W#(0:L.].;fVn0#jR<@,+T4biJcJfa2?=G-(g&i"W4VAslbNb!(:gN4Xpd.&KM3[!:jerC*Jdb9.8mE1,GWI`7Hj&\./TM;6No<gRQ,j+^;Z8J#OBYKSCe;C"iB'>:?7XaPV8tZ6UfO>AZsk5GLtj3;hHOI6XNC'OnR;3,ratrae!o<cLHdBm'MgCh%NtbYA;(*=[#u.)&M2L65kWMqr$2ac[-9F:,J6c\r(6,:4Z\u(Y6m'VEBNe=[&'`"3N)]QR1qHNM&4h\IrRO0cn&_EIJoW&rcl)&RbdpgHZtpM=iCng2.H$.@[M:i^od31aV@mWl*7k(8CuGNT@NoJHkVPR(WfmqHRKX-J2tF?,+=6u'\sL>;/fj4BB`oKh_j4HGeSJ`NP2S]p3V,hUEBW#4egVSTtb_9&54nih,<_1k_</:Pq;$6a:$;%cW:9c2)Y&e<V8gUa.0o9&S=]KqU61:<LW!+o]C6WatPg@_D$ibKoDA/4IG"]VV*Z(0[g1S#Gl-Nejd>a7D3/b9[)\3<i>nNK3q5JEY&?Y:M@#pf?Gf`REe'(2J@b9/5>GfV$G/YK;m-,,dmtW;d%3NP\12!D^nnn2eB,)De,akEeTKZA>^iEG^Tq.R">rFF9j,S>P&;Ps1#S(7=jraXms?DcSAOQiENr/Qp`/4D,@>o`5'/YR[[;6pjQ5b/_u$9na27Y'SWfMLqrY_j:)1g^U5Ia0S]R<+.KA`KU0'2Y1s-=7:m5>03pHs^>P:1LpDkIbL2AqC_B31BmD_5ES*aF0st.V<^ARpiFFdK;2gg33iQe;SfqhGj4T8G[_XBhWJ[%JZJ]LIF62KViGhW-#t&e:>)Sqs`#Z*&BBM^h57>^X[2@tpAI_;4S3*e^*>84qe>=a]dST0o^K@OAmKZJ\'QVA>I-S9[L=;?@^8Wuu0cb(bhI;5%94a^,^-ZWbFF^-#.ZPnd-CYnq#)IE5.4%kiaNO.8rGpXhDFQ*i6#FYEXtHFc::f<MG;,m]Ut5ep$2[!3>18.8Z5RUQ!0+-\Nf$)aMB3Nk\(RKiEgo7f^VHJZ$r^]7qNO?mYnNBRlq.I1`Qib8+'BSj-rb_[\`P?/2MMf%%0"JjM:p1u'=h)Tg)WD5Y"HH6)m*f'8*cAY<du9IS)<CNG8jXHIXA`p-ebLk=n,q(PW&6"25JK^5*"8*Xe%D2QQ4oC:9YYTU`H8SJ;kp.@&LNDKQgr4o<9#@TQ6\W0q:kuXPjCP7`Kl=P%D)7BeJ`<b\2J._Z.F@KY^O5hoWGp=lFU;VoJ_J%8XG<$r?e,L*mr]0qTNp]ohSnbH>Rb`ma,S'[U=T=o'\/"!'N#TlKqk_9Hf;i*M[4PD%BlH?>A6m=NQ*>pJh@f72q\B57@X8PMP7EEq*SZcj>qk]LO12;D0,js[$>K:(_7F_.m8:+kaGK-2#%r1H'dr\@OH9>.^q<u@D@-S]+Rlkp1B1*_g\;H`3UjuB<E!]l+RT\hG_L.hj?K[uS*ZgPdE+30qdQ:AOmoNl4$$]\!5md)hkm[Jiu#GcTJENg%B!T)%N3C)K^,RG['kJq'8:3To2XNTu&6JsDjY[\]k'h5d<bduhSI*m?`qpY7fN[gQ+"#Mc@8[ptc/jK:)Zc1&=-@DO[2^#fr;ZHmG)(*"dI*d/Qf&$t9QkUPV%A'J]W3#a!XH1K(lG><^.!f`[AI/6uT"[L^6GqRIo>oWQ:'Zl%Le)92,?8XZ_3UBb]?D<g?9H?`oR1rFdPPFb?^D?EFWGm`gD6hO)4Zq.%se;s=73;#Ed#0:9kAGFfsMHigle]MI+*5G0s=(>h-H#2+cIAI(Q,fDOfUAk[M%o;D(IJO"M(a5n`<2aJu#`)IFHOs%/=>S'W36\*/>AHTm,)+]BO!`*POioRg[)`\i65Qp3q0jkmjHP;5NX@cl?XkUn(gZB^bbWk;8[Q^/\pC;<!9VSo,3T[uVi[S]/>Tm[u^-p+5Z:^>]=cquO(7o$(`P2ZrUGa4]5CS6jYaD(nagnbK)`l<u@f]80XTkQ6iX5'lq8GQ'IRD-QJ-kUf:CH#9`D)YRt[mebOcZ0'Z_$jY?Qkr3'gpsn1A2D2n,7)`7$Y[odKgT_qk]MPeXR<,cuZF.cpRtG]9HZ3f(hRb"Ziu$tR2o?=8?s%HunsQ]s]Wt6;r0+J&_qkf-mmc94i%#(O-CPO4/#QNW0@]Pp^*]iAg?3$u3"=*(:3srNE$b>qp`^,==fkBZ=agA2%hM!;<],W4i[#7<6VXVmon2Dd)8:W,?]t?/M5l&I<!<7Y7+$.r$bQd'5lYasL\/ncJFg\!RJk(arTsno._3ts2i\-pD4PGCi15k?$tRec]+W-A.:Kpu(FO!`+0LPmHm6tI&4#("G^H[tdG>SGYqqg!Amh)J4'?<190(;=jk?(dfGZ!sWH"IDgZ*?M]h\XBN'oMfS]/u63"Dt"4C0<+q^!%/SfZ=MpRGi6?$c0.LHGS;~>endstream
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2492
|
||||
>>
|
||||
stream
|
||||
Gatm<?$"a[&q&$/R&[40m;>K(8Wfb>kfDUDDsXgV<q[sq&.(ofP6;C!jX>79rYbbcd9>cIHf`0fU*sEr1YpNtJ:.8&m*E$]qDbA`^BPC*1ga,lGnJ;>k\C+B$_l:G:<3g\,`2]p7eVbilMnP/<sra-NU1\:(Q@,An4q>J*KMY+Y[9[\h*%*0d<iIIH)d,\79\1#[ar*il)J!FP&p:Pc2UN0?eRqBYZ!3ZbPU-Q4L2VlG`di\gEcDYT8&#+j4CFkN[P43G*Nrko/TUuFS5.d<@2#hRq8JR[):33j"$h@h[ZGG'F#b_s/TtYN+^)ON+BmBe)ggJC^F3G:,Q)lOn+qV9atLqRd,d.K&u!]-s%Zd@bHL$.6bauE%50KU$T(=8<ouSjr%7qaFGPoa!Q)Ghr_Rao-5osVgF`pBpm0-HI*^.a:`u<.J%Z+6ohIPC<d/9=NOUVi2--n_0iHM9Un]0VDA-l-Bj8*dufXO99:E@a_S.2&+S4d:<P!1LFq0.`D,-@-dAgqT[rId%k&*-<Q\M'+:dK6rTh=k,a2qPNaNBT93%6q!VoB1qlris)]MYV<Kl];+e#uRJmOB+alF9>0NsCbRPmhG[Lg!rgKoa+E[-ZhZgjHW)c-4Th/fugW^)*6/1Oe3[pdQ@4?kANMo7q;Q'$F."\cP>r(eR(?'R_of:5[Bbp)?D>"WY7)a5ZRj5\HZn^Gk(8IJg]RaMPnUhb8lH;15(2(?TP+^j;%8bEEqIR(rnO`0uCO:,bu20ZSBXF.?jF_gDV.sQ\_NC/KDULpN4MonI8F1Dpr4tFaq6"G2N28J7AB7#N2-J+dL8;/Jr`UdB_asBZ*Q-0>K@?$SL/7_[XL0HQ@D+PU5Bpj%F#J1o<(XN/)[ab$96/`6tHTXN/2,'6-`HLmLVHPF7nbNOMcR`>k1t]/'(:(*>C6bjPKAM2o+_ss492nPR`Bhe/H*r:S>i$VQlFK9:@A#@O9."U]Z"Teh-eT:`e!>Eq/9\mA8XKhR>BfJ8<<>Nf#QRB,Wm;+)38&q,e+QVF'bjn`">hq3bDPS^Whe(Gmi3_d>#<+WAG/GmTu0R5a2q2P4DRWs'kJjMguH1ebakZZMW5I(/IHAq$*,r+lJRh^g_<f.[-"B9%5'jf<Ujb.V^X9Y;<Xto?!k?LYe$)e5F=LJo%tQlETj(+kY02qYdX2V=e@?3?-FD*r-VOsa+:RRf4EO#H3]4_*_(I:Og/#sr=7Kb\a#u,a\i[jCC*hI9'J3B;\j&0[6T;rKKjH_R<4q\RIdW<`st-'=&7rTX__!0U/5]/*A:DkQ3cHn1)3NDRY4"<6S4)k/"2'-l+^&b4Umb;X/-mH^]m=qpg5/)J<)tMSH6+@S'1kXIkrn$o`ljY(F>V@5W]+tL#)I&Wj/.41o?b8`h3eK;;`2]Bu@F$<kFn9q=QXEXN<ob>s:&pj*2*m"Y?DKI.ru:G45<4._&g.XR4t0!8q$\J[-!o>?P=jjKLqXnc(#pg@dqHL<0_h;ij"3=]6:4BDE;Q(<Uk?]m/&$f-ZB$-.Rn(RDgWo\Y85AZ`G/Ws-fqP(5,.'<hk92)`0#O*>4u;@oDUCa5!D)Rf?A6c<Lm2h]#[&-ZAmrRl>McSot'(mBS0X>';J[AOY.:>3T7X_9Or@RpGE-&a3gP9c+("hH\U'XGbJJdaj,Q$N+RDe>4$6R9o%rIa-\iB#9KRj#oYOG*oDm1PQ+\(KK?pFiLtnAo@f/fI?M[:sPtdj-X,Zb[Fe:qD^TB8)=W'D'm$/DfALiP=-ERD]6fJJ0q%7oJtdWhb9>R=g0/pA4bWCQ;Q_gs+`Gpp:BRmRh'3c[o,#NhqifCF(L;VQMH(b)Nj>Q_gM"/+5dC:(K^K2>BVaogSVt<iKq@c2liC*"`S'klo+2'G\EZdS?@aBo?2Q'gp=o,nBgl&2seMFRn#YT`lLr9p$3#T%p^]@WSqd1+eS6g]dWclVglF5K=%(g&u9L#fjpDGZ9c@_<rMV;5r+I.J<FU`TO,<g1I;Ve^%989r2qmS#a5Q00\u.M<$#G"nrF5b!7-_IM[rCGGg:=M-!V9KantRYXtDrb0':c0s#d)H87itKmUL0UI$&Tf^B,\+e%DRr]TH;'p\G-dr;@7q[eW-#LI!refo;&<__KK3A^"[^1o3e1qbBg]e2*NUI)WqTMn549(X;tddj72qq5_[/4#+-Tgr=Ga5O3hc>s>\m4)9fuTHQcsr^ID/O$a1P@'U^HnJO\#VEI#Q&*"FR'S>l5*inu]W$.R!`#mfVTU&>JO]C.MB:oEXbnI&EL=ksET:,qU.CM)&>k6-F<?m(WU+/0.+;FUij,72BG%*N`E(TLYlOB)m1p5rWbW$&^A!rF#B,`7`DFgCKO+3eXp%KO5nJEYFOt_on@($H<Veg5t3mnZD5P@G9T(\;rBCF6C)%=bK?IF=cZU/E:T7:Yn8n8%@p35U02NHflW&__2MJ=_Ck$^4o)h0;8n&/E\#[F\iY<QE$N=^1"&G5C?1SG@X~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 13
|
||||
0000000000 65535 f
|
||||
0000000073 00000 n
|
||||
0000000114 00000 n
|
||||
0000000221 00000 n
|
||||
0000000333 00000 n
|
||||
0000000527 00000 n
|
||||
0000000721 00000 n
|
||||
0000000915 00000 n
|
||||
0000000983 00000 n
|
||||
0000001279 00000 n
|
||||
0000001350 00000 n
|
||||
0000004221 00000 n
|
||||
0000007185 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<e07209f969febd6b4750ac978e60af12><e07209f969febd6b4750ac978e60af12>]
|
||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||
|
||||
/Info 8 0 R
|
||||
/Root 7 0 R
|
||||
/Size 13
|
||||
>>
|
||||
startxref
|
||||
9769
|
||||
%%EOF
|
||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 561 KiB |
@@ -1,321 +1,101 @@
|
||||
{
|
||||
"nocName": "Ced's NOC",
|
||||
"status": "2 System(s) Degraded",
|
||||
"lastUpdated": "2026-10-05T20:50:01Z",
|
||||
"status": "Operational",
|
||||
"lastUpdated": "2025-05-01T00:00:00Z",
|
||||
"summary": {
|
||||
"nodes": "12+ Pi",
|
||||
"services": "26/28",
|
||||
"nodes": 12,
|
||||
"services": 10,
|
||||
"vlans": 4,
|
||||
"edgeSystems": 0
|
||||
"edgeSystems": 2
|
||||
},
|
||||
"systems": [
|
||||
{
|
||||
"name": "Proxmox \u2014 BigWorld",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"name": "Proxmox Primary",
|
||||
"type": "Virtualization Host",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.250",
|
||||
"address": "proxmox.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.2ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 Biggie",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.192",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.1ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 Snoop",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.153",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.2ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 TooShort",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.120",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.4ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 Tupac",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.74",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.4ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 DrDre",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.30.227",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.2ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox \u2014 soc-01",
|
||||
"type": "Proxmox VE Hypervisor",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Compute",
|
||||
"address": "10.10.40.205",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.8ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Control \u2014 django-1",
|
||||
"type": "K3s Control Plane",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.72",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Control \u2014 django-2",
|
||||
"type": "K3s Control Plane",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.245",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Control \u2014 django-3",
|
||||
"type": "K3s Control Plane",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.128",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Ingress \u2014 node-1",
|
||||
"type": "K3s Worker / Ingress",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.219",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Ingress \u2014 node-2",
|
||||
"type": "K3s Worker / Ingress",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.134",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.4ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Ingress \u2014 node-3",
|
||||
"type": "K3s Worker / Ingress",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.222",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Data \u2014 node-4",
|
||||
"type": "K3s Worker / Data",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.126",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Data \u2014 node-5",
|
||||
"type": "K3s Worker / Data",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.239",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Data \u2014 node-6",
|
||||
"type": "K3s Worker / Data",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.208",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Monitor \u2014 node-7",
|
||||
"type": "K3s Worker / Monitoring",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.198",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Monitor \u2014 node-8",
|
||||
"type": "K3s Worker / Monitoring",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.216",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.2ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "K3s Monitor \u2014 node-9",
|
||||
"type": "K3s Worker / Monitoring",
|
||||
"layer": "Orchestration",
|
||||
"label": "K3s",
|
||||
"address": "10.10.30.29",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"latency": "2ms",
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "TrueNAS",
|
||||
"type": "Network Attached Storage",
|
||||
"type": "Network Storage",
|
||||
"layer": "Infrastructure",
|
||||
"label": "Storage",
|
||||
"address": "10.10.30.143",
|
||||
"address": "truenas.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.5ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"latency": "3ms",
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "Prometheus",
|
||||
"type": "Metrics Collection",
|
||||
"layer": "Monitoring",
|
||||
"label": "Observability",
|
||||
"address": "10.10.30.140",
|
||||
"name": "K3s Cluster",
|
||||
"type": "Kubernetes (12-node Pi)",
|
||||
"layer": "Orchestration",
|
||||
"label": "Containers",
|
||||
"address": "k3s.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.1ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"latency": "5ms",
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "Grafana",
|
||||
"type": "Metrics Dashboard",
|
||||
"layer": "Monitoring",
|
||||
"label": "Observability",
|
||||
"address": "10.10.30.68",
|
||||
"name": "Nginx Proxy Manager",
|
||||
"type": "Reverse Proxy",
|
||||
"layer": "Networking",
|
||||
"label": "Access",
|
||||
"address": "npm.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.1ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"latency": "1ms",
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "Uptime Kuma",
|
||||
"type": "Service Monitor",
|
||||
"layer": "Monitoring",
|
||||
"label": "Observability",
|
||||
"address": "10.10.30.14",
|
||||
"address": "uptime.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"latency": "2ms",
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "Dashy",
|
||||
"type": "HomeLab Dashboard",
|
||||
"layer": "Services",
|
||||
"label": "Dashboard",
|
||||
"address": "10.10.30.61",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.3ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "Home Assistant",
|
||||
"type": "Home Automation",
|
||||
"layer": "Services",
|
||||
"label": "Automation",
|
||||
"address": "10.10.30.104",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.7ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "PrimeStation",
|
||||
"type": "Media / Game Server",
|
||||
"layer": "Services",
|
||||
"label": "Media",
|
||||
"address": "10.10.30.233",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "0.2ms",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
},
|
||||
{
|
||||
"name": "APRS iGate \u2014 Home",
|
||||
"name": "APRS iGate — Home",
|
||||
"type": "RF Edge / APRS-IS Gateway",
|
||||
"layer": "Edge",
|
||||
"label": "RF",
|
||||
"address": "10.10.30.129",
|
||||
"status": "Offline",
|
||||
"severity": "Degraded",
|
||||
"address": "aprs-home.local",
|
||||
"status": "Active",
|
||||
"severity": "Healthy",
|
||||
"latency": "N/A",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "APRS iGate \u2014 Mobile",
|
||||
"name": "APRS iGate — Mobile",
|
||||
"type": "RF Edge / Mobile Node",
|
||||
"layer": "Edge",
|
||||
"label": "RF",
|
||||
"address": "10.10.30.35",
|
||||
"status": "Offline",
|
||||
"address": "aprs-mobile.local",
|
||||
"status": "Building",
|
||||
"severity": "Degraded",
|
||||
"latency": "N/A",
|
||||
"lastCheck": "2026-10-05 20:50 UTC"
|
||||
"lastCheck": "Manual"
|
||||
},
|
||||
{
|
||||
"name": "Grafana",
|
||||
"type": "Metrics Dashboard",
|
||||
"layer": "Monitoring",
|
||||
"label": "Observability",
|
||||
"address": "grafana.local",
|
||||
"status": "Online",
|
||||
"severity": "Healthy",
|
||||
"latency": "4ms",
|
||||
"lastCheck": "Manual"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,37 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-EQJFN7CX4Y"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-EQJFN7CX4Y');
|
||||
</script>
|
||||
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>Chase Dumphord | DevOps & Cloud Infrastructure Engineer</title>
|
||||
<title>Chase Dumphord | Digital Systems & Infrastructure</title>
|
||||
|
||||
<meta
|
||||
name="description"
|
||||
content="Chase Dumphord DevOps and Cloud Infrastructure Engineer running an 18 node production environment with K3s, Proxmox, Prometheus, Grafana, and APRS RF edge systems out of Oxford, MS."
|
||||
content="Chase Dumphord — digital systems builder focused on infrastructure, Linux, K3s, Proxmox, APRS RF edge systems, and real-world technical problem solving."
|
||||
/>
|
||||
|
||||
<!-- Open Graph for LinkedIn / Discord sharing -->
|
||||
<meta property="og:title" content="Chase Dumphord | DevOps & Cloud Infrastructure Engineer" />
|
||||
<meta property="og:description" content="DevOps & Cloud Infrastructure Engineer. 18 nodes. 28 services. Always running. Based in Oxford, MS." />
|
||||
<meta property="og:title" content="Chase Dumphord | Digital Systems & Infrastructure" />
|
||||
<meta property="og:description" content="Hands-on systems builder. Proxmox • K3s • APRS • HomeLab. Based in Oxford, MS." />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://chasedumphord.com" />
|
||||
|
||||
<meta property="og:image" content="https://chasedumphord.com/assets/images/noc-dashboard.png" />
|
||||
<meta property="og:image:width" content="1536" />
|
||||
<meta property="og:image:height" content="650" />
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:image" content="https://chasedumphord.com/assets/images/noc-dashboard.png" />
|
||||
|
||||
<!-- ── Favicon set (from ced-logo-pack) ── -->
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicons/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicons/favicon-16x16.png" />
|
||||
@@ -47,7 +32,7 @@
|
||||
<meta name="author" content="Chase Dumphord" />
|
||||
|
||||
<!-- ── Social verification (rel=me) ── -->
|
||||
<link rel="me" href="https://www.linkedin.com/in/chase-dumphord/" />
|
||||
<link rel="me" href="https://www.linkedin.com/in/chase-dumphord" />
|
||||
<link rel="me" href="https://github.com/ced4568" />
|
||||
|
||||
<!-- Fonts: JetBrains Mono for terminal/code feel, Syne for headings -->
|
||||
@@ -87,13 +72,14 @@
|
||||
<div class="hero-text">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow-dot"></span>
|
||||
DevOps • Platform Engineering • Cloud Infrastructure • Kubernetes • Observability
|
||||
Digital Systems • Infrastructure • Networking • Automation • Edge Systems
|
||||
</p>
|
||||
|
||||
<h1>I build systems that <span class="accent-word">connect</span> hardware, networks, and operations.</h1>
|
||||
|
||||
<p class="lead">
|
||||
Chase Dumphord DevOps and Cloud Infrastructure Engineer running an 18 node production environment out of Oxford, MS. 6 node Proxmox VE cluster, 12 node K3s Kubernetes cluster, full observability stack, and VLAN-segmented networking. I build things that actually run, then document how they work.
|
||||
Chase Dumphord — infrastructure builder running Proxmox, K3s, TrueNAS, and APRS RF edge systems out of Oxford, MS.
|
||||
I build things that actually work, then document how they work.
|
||||
</p>
|
||||
|
||||
<div class="hero-actions">
|
||||
@@ -108,18 +94,18 @@
|
||||
<li>📍 Oxford, MS</li>
|
||||
<li>
|
||||
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
|
||||
github/ced4568
|
||||
⌥ github/ced4568
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="mailto:[email protected]">[email protected]</a>
|
||||
<a href="mailto:[email protected]">✉ [email protected]</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- LinkedIn badge — prominent social proof row -->
|
||||
<div class="hero-badges">
|
||||
<a
|
||||
href="https://www.linkedin.com/in/chase-dumphord/"
|
||||
href="https://www.linkedin.com/in/chase-dumphord"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="badge-link linkedin-badge"
|
||||
@@ -127,7 +113,7 @@
|
||||
<svg class="badge-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
||||
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
||||
</svg>
|
||||
Connect on LinkedIn
|
||||
LinkedIn
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/ced4568"
|
||||
@@ -157,21 +143,21 @@
|
||||
<span class="dot red"></span>
|
||||
<span class="dot yellow"></span>
|
||||
<span class="dot green"></span>
|
||||
<span class="terminal-title">ced's@homelab ~ $</span>
|
||||
<span class="terminal-title">ced@homelab ~ $</span>
|
||||
</div>
|
||||
<pre><code><span class="t-prompt">ced's@homelab:~$</span> whoami
|
||||
<span class="t-val">devops_engineer</span>
|
||||
<pre><code><span class="t-prompt">ced@homelab:~$</span> whoami
|
||||
<span class="t-val">systems_builder</span>
|
||||
|
||||
<span class="t-prompt">ced's@homelab:~$</span> uptime
|
||||
<span class="t-val">18 nodes • 28 services • always_on</span>
|
||||
<span class="t-prompt">ced@homelab:~$</span> uptime
|
||||
<span class="t-val">12+ nodes • 10+ services • always_on</span>
|
||||
|
||||
<span class="t-prompt">ced's@homelab:~$</span> cat focus.txt
|
||||
<span class="t-val">kubernetes
|
||||
devops
|
||||
observability
|
||||
cloud_infrastructure</span>
|
||||
<span class="t-prompt">ced@homelab:~$</span> cat focus.txt
|
||||
<span class="t-val">infrastructure
|
||||
networking
|
||||
automation
|
||||
rf_edge_systems</span>
|
||||
|
||||
<span class="t-prompt">ced's@homelab:~$</span> systemctl status life
|
||||
<span class="t-prompt">ced@homelab:~$</span> systemctl status life
|
||||
<span class="t-val">● building_real_systems.service</span>
|
||||
<span class="t-muted"> Active: active (running)</span><span class="t-cursor">▌</span></code></pre>
|
||||
</div>
|
||||
@@ -192,14 +178,14 @@ cloud_infrastructure</span>
|
||||
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>18</h3>
|
||||
<h3>12+</h3>
|
||||
<p>Nodes</p>
|
||||
<span>6-node Proxmox VE • 12 node K3s</span>
|
||||
<span>K3s cluster • Raspberry Pi</span>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>28+</h3>
|
||||
<h3>10+</h3>
|
||||
<p>Services</p>
|
||||
<span>Self-hosted production stack</span>
|
||||
<span>Self-hosted stack</span>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<h3>4</h3>
|
||||
@@ -271,7 +257,7 @@ cloud_infrastructure</span>
|
||||
<!-- Fallback shown when data can't load -->
|
||||
<div id="noc-fallback" class="noc-fallback" style="display:none;">
|
||||
<p class="noc-fallback-msg">
|
||||
NOC feed unavailable from this context systems run locally.<br/>
|
||||
📡 NOC feed unavailable from this context — systems run locally.<br/>
|
||||
<a href="https://noc.chasedumphord.com" target="_blank" rel="noopener noreferrer">
|
||||
View the live NOC dashboard →
|
||||
</a>
|
||||
@@ -285,35 +271,34 @@ cloud_infrastructure</span>
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">// about</p>
|
||||
<h2>DevOps and Cloud Infrastructure Engineer with 10+ years of real systems ownership</h2>
|
||||
<h2>Hands-on systems builder with a digital infrastructure mindset</h2>
|
||||
</div>
|
||||
|
||||
<div class="content-grid">
|
||||
<div class="card">
|
||||
<p>
|
||||
I'm a DevOps and Cloud Infrastructure Engineer focused on reliable delivery, container
|
||||
orchestration, and cloud native infrastructure built for production conditions. I run an
|
||||
18 node environment every day consisting of a 6 node Proxmox VE hypervisor cluster and
|
||||
a 12 node K3s Kubernetes cluster with Prometheus monitoring, Grafana dashboards, and
|
||||
VLAN segmented networking. Not a lab. A production system.
|
||||
I'm a technical professional focused on digital systems, infrastructure, networking,
|
||||
automation, and hands-on system integration. I build things that are practical,
|
||||
reliable, and well-documented — from homelab services and live dashboards to Raspberry Pi
|
||||
deployments, APRS iGates, and complex troubleshooting workflows.
|
||||
</p>
|
||||
<p>
|
||||
I come from 10+ years in industrial digital systems at GE Aerospace and in the field
|
||||
as a Level III engineer on aerospace inspection equipment. I understand what production
|
||||
failure actually costs. That same operational discipline is what I bring to cloud native
|
||||
infrastructure. I don't simulate environments. I run them.
|
||||
My background blends field engineering, industrial technology, and infrastructure
|
||||
problem solving. Increasingly I'm integrating AI tooling — using LLMs for system
|
||||
documentation, automated diagnostics, and workflow acceleration — as part of how
|
||||
modern infrastructure gets built and maintained.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Core Focus Areas</h3>
|
||||
<ul class="clean-list">
|
||||
<li>Kubernetes orchestration and container infrastructure</li>
|
||||
<li>DevOps automation and CI/CD pipeline workflows</li>
|
||||
<li>Observability with Prometheus, Grafana, and alerting pipelines</li>
|
||||
<li>Cloud native infrastructure design and deployment</li>
|
||||
<li>Networking, VLANs, reverse proxy, and Cloudflare edge configuration</li>
|
||||
<li>AI assisted automation, documentation, and diagnostic workflows</li>
|
||||
<li>Digital systems and infrastructure engineering</li>
|
||||
<li>Linux systems and service management</li>
|
||||
<li>Networking, VLANs, failover, and connectivity troubleshooting</li>
|
||||
<li>Raspberry Pi and edge-device deployments</li>
|
||||
<li>AI-assisted automation, documentation, and diagnostic workflows</li>
|
||||
<li>Documentation, process building, and reproducible project design</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -325,8 +310,8 @@ cloud_infrastructure</span>
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">// projects</p>
|
||||
<h2>Infrastructure & Systems Projects</h2>
|
||||
<p class="section-intro">Built on real systems. Not demos, not tutorials running infrastructure.</p>
|
||||
<h2>Infrastructure & Systems Projects</h2>
|
||||
<p class="section-intro">Built on real systems. Not demos, not tutorials — running infrastructure.</p>
|
||||
</div>
|
||||
|
||||
<div class="projects-grid">
|
||||
@@ -343,7 +328,7 @@ cloud_infrastructure</span>
|
||||
<ul class="clean-list">
|
||||
<li>Proxmox VE virtualization platform</li>
|
||||
<li>VLAN segmentation via UniFi (Main / IoT / HomeLab / Guest)</li>
|
||||
<li>Self hosted services behind Nginx Proxy Manager + Cloudflare Tunnels</li>
|
||||
<li>Self-hosted services behind Nginx Proxy Manager + Cloudflare Tunnels</li>
|
||||
<li>Uptime Kuma + Grafana monitoring stack</li>
|
||||
</ul>
|
||||
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
|
||||
@@ -358,12 +343,12 @@ cloud_infrastructure</span>
|
||||
</div>
|
||||
<p class="tags">Kubernetes • Containers • Linux • Automation</p>
|
||||
<p class="project-impact">
|
||||
12 node K3s cluster on Raspberry Pi running distributed infrastructure and container orchestration in production with dedicated control plane, ingress, data, and monitoring node pools.
|
||||
12-node K3s cluster on Raspberry Pi built to simulate distributed infrastructure and container orchestration at scale.
|
||||
</p>
|
||||
<ul class="clean-list">
|
||||
<li>Multi node cluster setup and management</li>
|
||||
<li>Multi-node cluster setup and management</li>
|
||||
<li>Containerized workload deployment</li>
|
||||
<li>Infrastructure automation via manifest driven configuration</li>
|
||||
<li>Infrastructure automation via manifest-driven configuration</li>
|
||||
</ul>
|
||||
<a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
|
||||
View on GitHub →
|
||||
@@ -377,7 +362,7 @@ cloud_infrastructure</span>
|
||||
</div>
|
||||
<p class="tags">RF • Linux • Raspberry Pi • APRS-IS • Edge Systems</p>
|
||||
<p class="project-impact">
|
||||
Operational dual-node RF to internet gateway. Decodes real beacon packets and uplinks live to aprs.fi.
|
||||
Operational dual-node RF-to-internet gateway. Decodes real beacon packets and uplinks live to aprs.fi.
|
||||
</p>
|
||||
<ul class="clean-list">
|
||||
<li>Direwolf APRS TNC with tuned audio chain (target: 50–60 level)</li>
|
||||
@@ -401,7 +386,7 @@ cloud_infrastructure</span>
|
||||
<p class="section-label">// noc roadmap</p>
|
||||
<h2>Ced's NOC Vision</h2>
|
||||
<p class="section-intro">
|
||||
Staged monitoring and systems visibility platform built on real infrastructure.
|
||||
Staged monitoring and systems-visibility platform built on real infrastructure.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -410,24 +395,24 @@ cloud_infrastructure</span>
|
||||
<div class="noc-card-badge done">✅ Live</div>
|
||||
<h3>Portfolio NOC</h3>
|
||||
<p>
|
||||
JSON driven dashboard showing real inventory, online/offline checks, service labels,
|
||||
latency, and last check timestamps across 18 nodes and 28 services.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge done">✅ Live</div>
|
||||
<h3>Grafana + Prometheus Observability Stack</h3>
|
||||
<p>
|
||||
Full observability stack running across Proxmox, TrueNAS, K3s nodes, Uptime Kuma,
|
||||
and APRS edge systems with real time metrics ingestion and live alerting pipelines.
|
||||
JSON-driven dashboard showing real inventory, online/offline checks, service labels,
|
||||
latency, and last-check timestamps.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge next">⚙️ Next</div>
|
||||
<h3>Automated Incident Response</h3>
|
||||
<h3>Automated Data Updates</h3>
|
||||
<p>
|
||||
AI assisted ops automation using n8n, Telegram bots, and OpenRouter integrated with
|
||||
Prometheus alerting for automated triage and remediation workflows.
|
||||
Scheduled local scripts will auto-refresh system status and push dashboard-ready
|
||||
JSON on a cron interval — no manual updates.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge future">📈 Future</div>
|
||||
<h3>Grafana + Prometheus</h3>
|
||||
<p>
|
||||
Full observability stack for Proxmox, TrueNAS, K3s, Raspberry Pi nodes, Uptime Kuma,
|
||||
and APRS edge systems with real-time metrics ingestion.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -442,7 +427,7 @@ cloud_infrastructure</span>
|
||||
>
|
||||
<span class="btn-dot"></span> View Live NOC Dashboard
|
||||
</a>
|
||||
<span class="noc-cta-sub">noc.chasedumphord.com live infrastructure visibility</span>
|
||||
<span class="noc-cta-sub">noc.chasedumphord.com — live infrastructure visibility</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -452,7 +437,7 @@ cloud_infrastructure</span>
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">// tech stack</p>
|
||||
<h2>Tools & Technologies</h2>
|
||||
<h2>Tools & Technologies</h2>
|
||||
</div>
|
||||
|
||||
<div class="stack-groups">
|
||||
@@ -464,20 +449,17 @@ cloud_infrastructure</span>
|
||||
<span class="stack-pill">K3s</span>
|
||||
<span class="stack-pill">Docker</span>
|
||||
<span class="stack-pill">TrueNAS</span>
|
||||
<span class="stack-pill">Helm</span>
|
||||
<span class="stack-pill">Terraform</span>
|
||||
<span class="stack-pill">Nginx Proxy Manager</span>
|
||||
<span class="stack-pill">Cloudflare Tunnels</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack-group">
|
||||
<h4 class="stack-group-label">Monitoring & Observability</h4>
|
||||
<h4 class="stack-group-label">Monitoring & Observability</h4>
|
||||
<div class="stack-pills">
|
||||
<span class="stack-pill">Grafana</span>
|
||||
<span class="stack-pill">Prometheus</span>
|
||||
<span class="stack-pill">Uptime Kuma</span>
|
||||
<span class="stack-pill">Alerting Pipelines</span>
|
||||
<span class="stack-pill">Custom NOC Dashboard</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -487,23 +469,13 @@ cloud_infrastructure</span>
|
||||
<div class="stack-pills">
|
||||
<span class="stack-pill">UniFi</span>
|
||||
<span class="stack-pill">VLAN Segmentation</span>
|
||||
<span class="stack-pill">Nginx</span>
|
||||
<span class="stack-pill">Traefik</span>
|
||||
<span class="stack-pill">pfSense</span>
|
||||
<span class="stack-pill">Cloudflare DNS</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack-group">
|
||||
<h4 class="stack-group-label">GitOps & CI/CD</h4>
|
||||
<div class="stack-pills">
|
||||
<span class="stack-pill">GitHub Actions</span>
|
||||
<span class="stack-pill">Docker Compose</span>
|
||||
<span class="stack-pill">Manifest driven Config</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack-group">
|
||||
<h4 class="stack-group-label">RF & Edge</h4>
|
||||
<h4 class="stack-group-label">RF & Edge</h4>
|
||||
<div class="stack-pills">
|
||||
<span class="stack-pill">Direwolf</span>
|
||||
<span class="stack-pill">APRS-IS</span>
|
||||
@@ -525,18 +497,13 @@ cloud_infrastructure</span>
|
||||
</div>
|
||||
|
||||
<div class="stack-group">
|
||||
<h4 class="stack-group-label">AI & Automation</h4>
|
||||
<h4 class="stack-group-label">AI & Automation</h4>
|
||||
<div class="stack-pills">
|
||||
<span class="stack-pill">n8n</span>
|
||||
<span class="stack-pill">OpenRouter</span>
|
||||
<span class="stack-pill">Telegram Bots</span>
|
||||
<span class="stack-pill">Claude (Anthropic)</span>
|
||||
<span class="stack-pill">ChatGPT</span>
|
||||
<span class="stack-pill">Gemini</span>
|
||||
<span class="stack-pill">Hermes Agent</span>
|
||||
<span class="stack-pill">Crew AI Agent</span>
|
||||
<span class="stack-pill">LLM assisted Documentation</span>
|
||||
<span class="stack-pill">AI driven Diagnostics</span>
|
||||
<span class="stack-pill">LLM-assisted Documentation</span>
|
||||
<span class="stack-pill">AI-driven Diagnostics</span>
|
||||
<span class="stack-pill">Prompt Engineering</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -549,7 +516,7 @@ cloud_infrastructure</span>
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">// resume snapshot</p>
|
||||
<h2>10+ years of systems ownership from the factory floor to cloud native infrastructure</h2>
|
||||
<h2>Technical experience that bridges field work and digital systems</h2>
|
||||
</div>
|
||||
|
||||
<div class="resume-grid">
|
||||
@@ -557,26 +524,28 @@ cloud_infrastructure</span>
|
||||
<div class="card resume-card">
|
||||
<h3>What I Bring</h3>
|
||||
<ul class="clean-list">
|
||||
<li>Production Kubernetes infrastructure running 18 nodes across dedicated control plane, ingress, data, and monitoring node pools with live observability</li>
|
||||
<li>10+ years of systems ownership in industrial environments where failure has direct production consequences including GE Aerospace digital systems and Level III field service on aerospace equipment</li>
|
||||
<li>End to end cloud native infrastructure capability covering containers, ingress, secrets, monitoring, backups, and automated recovery with live systems to prove it</li>
|
||||
<li>Infrastructure-as-documentation mindset where everything built gets written up with runbooks, architecture decisions, and SOPs</li>
|
||||
<li>Industrial and field-service technical background — hands-on problem solving under real constraints</li>
|
||||
<li>Linux systems administration — service management, troubleshooting, automation</li>
|
||||
<li>Networking depth — VLANs, DNS, reverse proxy, firewall config, failover design</li>
|
||||
<li>Infrastructure-as-documentation mindset — everything I build gets written up</li>
|
||||
<li>Homelab → production thinking — I build lab environments that mirror real-world system design</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="card resume-card">
|
||||
<h3>Target Roles</h3>
|
||||
<ul class="clean-list">
|
||||
<li>DevOps Engineer</li>
|
||||
<li>Platform Engineer</li>
|
||||
<li>Cloud Infrastructure Engineer</li>
|
||||
<li>Site Reliability Engineer</li>
|
||||
<li>Infrastructure Architect</li>
|
||||
<li>Systems / Infrastructure Engineer</li>
|
||||
<li>NOC Technician / Network Operations</li>
|
||||
<li>Linux Systems Administrator</li>
|
||||
<li>Technical Operations / IT Infrastructure</li>
|
||||
<li>Edge Systems / Field Technical Roles</li>
|
||||
</ul>
|
||||
|
||||
<div class="resume-note">
|
||||
<p>
|
||||
Open to remote and hybrid roles where real infrastructure ownership and operational depth matter. I come from industrial systems and I bring that same zero downtime discipline to cloud native environments.
|
||||
Currently positioning around digital systems, infrastructure, and technical operations —
|
||||
especially roles where hands-on problem solving and system integration matter more than certifications.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -585,20 +554,20 @@ cloud_infrastructure</span>
|
||||
<h3>Currently Learning / Building Toward</h3>
|
||||
<div class="learning-grid">
|
||||
<div class="learning-item">
|
||||
<span class="learning-icon">☸️</span>
|
||||
<span>Advanced Kubernetes patterns including GitOps with FluxCD, Helm chart authoring, and ArgoCD</span>
|
||||
<span class="learning-icon">📈</span>
|
||||
<span>Grafana + Prometheus full observability stack</span>
|
||||
</div>
|
||||
<div class="learning-item">
|
||||
<span class="learning-icon">🏗️</span>
|
||||
<span>Terraform infrastructure as code for cloud provisioning and repeatable environment builds</span>
|
||||
<span class="learning-icon">☸️</span>
|
||||
<span>Kubernetes production patterns (GitOps, Helm, ArgoCD)</span>
|
||||
</div>
|
||||
<div class="learning-item">
|
||||
<span class="learning-icon">🔐</span>
|
||||
<span>Infrastructure security hardening and zero-trust network architecture</span>
|
||||
<span>Network security and zero-trust architecture</span>
|
||||
</div>
|
||||
<div class="learning-item">
|
||||
<span class="learning-icon">📊</span>
|
||||
<span>OpenTelemetry integration and distributed tracing across the K3s cluster</span>
|
||||
<span class="learning-icon">📡</span>
|
||||
<span>Mobile APRS iGate deployment</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -614,7 +583,7 @@ cloud_infrastructure</span>
|
||||
>
|
||||
↓ Download Resume (PDF)
|
||||
</a>
|
||||
<span class="resume-download-note">Updated 2026 • PDF format</span>
|
||||
<span class="resume-download-note">Updated 2025 • PDF format</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -628,7 +597,7 @@ cloud_infrastructure</span>
|
||||
<p class="section-label">// github</p>
|
||||
<h2>Pinned Repositories</h2>
|
||||
<p class="section-intro">
|
||||
Active projects on GitHub source code, configs, and documentation for everything I'm building.
|
||||
Active projects on GitHub — source code, configs, and documentation for everything I'm building.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -666,10 +635,9 @@ cloud_infrastructure</span>
|
||||
<p class="section-label">// personal</p>
|
||||
<h2>Technical, curious, and always building</h2>
|
||||
<p>
|
||||
Outside of work I'm into electronics, self hosting, coding, drones, and ham radio.
|
||||
I'm a licensed amateur radio operator running a dual node APRS RF iGate with a
|
||||
verified uplink on aprs.fi. Kobe the Boston Terrier keeps the home lab grounded.
|
||||
That curiosity carries directly into how I build and document systems.
|
||||
Outside of work I'm into electronics, self-hosting, coding, drones, ham radio, and
|
||||
hands-on projects that force me to learn something real. Ball pythons and dogs round
|
||||
out the home lab. That curiosity carries directly into how I build and document systems.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -689,16 +657,16 @@ cloud_infrastructure</span>
|
||||
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
|
||||
<p>Location: Oxford, MS</p>
|
||||
<p>GitHub: <a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a></p>
|
||||
<p>LinkedIn: <a href="https://www.linkedin.com/in/chase-dumphord/" target="_blank" rel="noopener noreferrer">linkedin.com/in/chase-dumphord</a></p>
|
||||
<p>LinkedIn: <a href="https://www.linkedin.com/in/chase-dumphord" target="_blank" rel="noopener noreferrer">linkedin.com/in/toochase-dumphord</a></p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Open To</h3>
|
||||
<ul class="clean-list">
|
||||
<li>DevOps Engineer and Platform Engineer roles</li>
|
||||
<li>Cloud Infrastructure and SRE positions</li>
|
||||
<li>Remote and hybrid opportunities</li>
|
||||
<li>Consulting and infrastructure projects through Synthos Systems</li>
|
||||
<li>Digital systems and infrastructure roles</li>
|
||||
<li>Networking and technical operations</li>
|
||||
<li>Automation and monitoring projects</li>
|
||||
<li>Hardware + software integration work</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -717,4 +685,4 @@ cloud_infrastructure</span>
|
||||
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,506 +1,475 @@
|
||||
<!--
|
||||
╔══════════════════════════════════════════════════════════════════════╗
|
||||
║ Ced's NOC — Live Infrastructure Dashboard ║
|
||||
║ FILE: noc/index.html ║
|
||||
╠══════════════════════════════════════════════════════════════════════╣
|
||||
║ PAGE MAP (top → bottom) ║
|
||||
║ 1. HEAD — meta, OG/Twitter tags, favicons, Google Fonts, ║
|
||||
║ shared stylesheet (../style.css), NOC-specific CSS ║
|
||||
║ 2. NAV — site header: Ced_ logo, nav links, portfolio link ║
|
||||
║ 3. NOC HERO — eyebrow (live/auto-refresh badge), H1, lead text, ║
|
||||
║ meta bar (location, portfolio link, GitHub) ║
|
||||
║ 4. DASHBOARD — status command bar, uptime pills (JS), metrics grid, ║
|
||||
║ alert panel, layer filter tabs, system cards grid, ║
|
||||
║ stack info bar, NOC roadmap cards ║
|
||||
║ 5. FOOTER — copyright + back-to-top link ║
|
||||
║ 6. SCRIPTS — ../script.js + inline NOC JS (layer tabs, ║
|
||||
║ uptime pill builder, MutationObserver for card grid) ║
|
||||
╚══════════════════════════════════════════════════════════════════════╝
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>Ced's NOC | Live Systems Dashboard</title>
|
||||
<title>Chase Dumphord | Digital Systems & Infrastructure</title>
|
||||
|
||||
<meta
|
||||
name="description"
|
||||
content="Ced's NOC — live network operations center dashboard showing real-time infrastructure health across 18 nodes and 28 services. Proxmox, K3s, TrueNAS, APRS edge systems."
|
||||
content="Chase Dumphord portfolio - digital systems, infrastructure, networking, automation, homelab engineering, and real-world technical projects."
|
||||
/>
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:title" content="Ced's NOC | Live Systems Dashboard" />
|
||||
<meta property="og:description" content="Live infrastructure visibility — 18 nodes, 28 services. Proxmox, K3s, TrueNAS, APRS edge systems. Always running." />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://noc.chasedumphord.com" />
|
||||
<meta property="og:image" content="https://chasedumphord.com/assets/images/noc-dashboard.png" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:title" content="Ced's NOC | Live Systems Dashboard" />
|
||||
<meta name="twitter:description" content="Live infrastructure visibility — 18 nodes, 28 services. Proxmox, K3s, TrueNAS, APRS edge systems. Always running." />
|
||||
<meta name="twitter:image" content="https://chasedumphord.com/assets/images/noc-dashboard.png" />
|
||||
|
||||
<!-- Favicons (path up one level since we're in /noc/) -->
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="../assets/favicons/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="../assets/favicons/favicon-16x16.png" />
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="../assets/favicons/favicon-192x192.png" />
|
||||
<link rel="apple-touch-icon" sizes="512x512" href="../assets/favicons/favicon-512x512.png" />
|
||||
<link rel="shortcut icon" href="../assets/favicons/favicon.ico" />
|
||||
|
||||
<meta name="robots" content="index, follow" />
|
||||
<meta name="author" content="Chase Dumphord" />
|
||||
|
||||
<!-- Fonts — same as main site -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Syne:wght@700;800&family=DM+Sans:wght@400;500;700&display=swap" rel="stylesheet" />
|
||||
|
||||
<!-- Shared stylesheet (up one level) -->
|
||||
<link rel="stylesheet" href="../style.css" />
|
||||
|
||||
<!-- NOC-specific styles -->
|
||||
<style>
|
||||
/* ── NOC page overrides & extras ── */
|
||||
.noc-page-hero {
|
||||
padding: 3.5rem 0 2rem;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.noc-page-hero .eyebrow {
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
.noc-page-title {
|
||||
font-family: var(--font-display);
|
||||
font-size: clamp(2rem, 4vw, 3.2rem);
|
||||
font-weight: 800;
|
||||
margin: 0 0 0.75rem;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.noc-page-title span {
|
||||
color: var(--accent-2);
|
||||
}
|
||||
|
||||
.noc-page-lead {
|
||||
color: var(--muted);
|
||||
font-size: 1rem;
|
||||
max-width: 60ch;
|
||||
margin: 0 0 1.5rem;
|
||||
}
|
||||
|
||||
.noc-page-meta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.6rem 1.4rem;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.78rem;
|
||||
color: var(--muted);
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.noc-page-meta a { color: var(--muted); }
|
||||
.noc-page-meta a:hover { color: var(--accent-2); }
|
||||
|
||||
/* Full-width NOC content area */
|
||||
.noc-full {
|
||||
padding: 2.5rem 0 4rem;
|
||||
}
|
||||
|
||||
/* Uptime summary bar */
|
||||
.uptime-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.uptime-pill {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.76rem;
|
||||
padding: 0.35rem 0.75rem;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--line);
|
||||
color: var(--muted);
|
||||
background: rgba(255,255,255,0.03);
|
||||
}
|
||||
|
||||
.uptime-pill.online {
|
||||
color: var(--accent-2);
|
||||
border-color: rgba(94, 250, 204, 0.3);
|
||||
background: rgba(94, 250, 204, 0.06);
|
||||
}
|
||||
|
||||
.uptime-pill.warning {
|
||||
color: var(--warning);
|
||||
border-color: rgba(242, 204, 96, 0.3);
|
||||
background: rgba(242, 204, 96, 0.06);
|
||||
}
|
||||
|
||||
.uptime-pill.offline {
|
||||
color: var(--danger);
|
||||
border-color: rgba(255, 95, 86, 0.3);
|
||||
background: rgba(255, 95, 86, 0.06);
|
||||
}
|
||||
|
||||
/* Layer filter tabs */
|
||||
.layer-tabs {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.layer-tab {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.76rem;
|
||||
font-weight: 700;
|
||||
padding: 0.35rem 0.85rem;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--line);
|
||||
color: var(--muted);
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s;
|
||||
}
|
||||
|
||||
.layer-tab:hover,
|
||||
.layer-tab.active {
|
||||
color: var(--accent-2);
|
||||
border-color: rgba(94, 250, 204, 0.35);
|
||||
background: rgba(94, 250, 204, 0.07);
|
||||
}
|
||||
|
||||
/* Roadmap section on NOC page */
|
||||
.noc-roadmap {
|
||||
margin-top: 3rem;
|
||||
padding-top: 2.5rem;
|
||||
border-top: 1px solid var(--line);
|
||||
}
|
||||
|
||||
/* Stack info footer on NOC page */
|
||||
.noc-stack-bar {
|
||||
margin-top: 2.5rem;
|
||||
padding: 1rem 1.25rem;
|
||||
border-radius: var(--radius);
|
||||
background: rgba(0,0,0,0.2);
|
||||
border: 1px solid var(--line);
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.78rem;
|
||||
color: var(--muted);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem 1.5rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.noc-stack-bar strong {
|
||||
color: var(--accent-2);
|
||||
}
|
||||
|
||||
@media (max-width: 620px) {
|
||||
.layer-tabs { gap: 0.4rem; }
|
||||
.layer-tab { font-size: 0.7rem; padding: 0.3rem 0.65rem; }
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- ══════════════════════════════════════════════════════════════════════ NAV
|
||||
Shared site-header component (styled by ../style.css).
|
||||
Left: "Ced_" logo linking back to chasedumphord.com.
|
||||
Right: nav links — Dashboard (top anchor), Systems (layer-tabs anchor),
|
||||
← Portfolio (main site), GitHub (ced4568), Contact.
|
||||
══════════════════════════════════════════════════════════════════════════ -->
|
||||
<header class="site-header">
|
||||
<div class="container nav">
|
||||
<a href="https://chasedumphord.com" class="logo">Ced<span class="logo-cursor">_</span></a>
|
||||
<a href="#top" class="logo">Chase Dumphord</a>
|
||||
|
||||
<nav>
|
||||
<ul class="nav-links">
|
||||
<li><a href="#top">Dashboard</a></li>
|
||||
<li><a href="#layer-tabs">Systems</a></li>
|
||||
<li><a href="https://chasedumphord.com">← Portfolio</a></li>
|
||||
<li><a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer">GitHub</a></li>
|
||||
<li><a href="https://chasedumphord.com/#contact">Contact</a></li>
|
||||
<li><a href="#snapshot">Snapshot</a></li>
|
||||
<li><a href="#noc">NOC</a></li>
|
||||
<li><a href="#about">About</a></li>
|
||||
<li><a href="#projects">Projects</a></li>
|
||||
<li><a href="#resume">Resume</a></li>
|
||||
<li><a href="#contact">Contact</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="top">
|
||||
<section class="hero">
|
||||
<div class="container hero-grid">
|
||||
<div class="hero-text">
|
||||
<p class="eyebrow">Digital Systems • Infrastructure • Networking • Automation • Edge Systems</p>
|
||||
|
||||
<!-- ══════════════════════════════════════════════════════════════════════ NOC HERO
|
||||
Eyebrow tag: "Ced's NOC • Live Infrastructure Dashboard • Auto-refresh: 30s".
|
||||
H1: "Live Systems Dashboard" with accent color on "Dashboard".
|
||||
Lead text: describes 18 nodes, 28 services, Proxmox/K3s/TrueNAS/APRS stack.
|
||||
Meta bar: location (Oxford MS), portfolio link, GitHub profile link.
|
||||
══════════════════════════════════════════════════════════════════════════ -->
|
||||
<div class="noc-page-hero">
|
||||
<div class="container">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow-dot"></span>
|
||||
Ced's NOC • Live Infrastructure Dashboard • Auto-refresh: 30s
|
||||
</p>
|
||||
<h1>I build practical systems that connect hardware, networks, software, and operations.</h1>
|
||||
|
||||
<h1 class="noc-page-title">
|
||||
Live Systems <span>Dashboard</span>
|
||||
</h1>
|
||||
<p class="lead">
|
||||
I’m Chase Dumphord — a hands-on systems builder focused on digital infrastructure,
|
||||
Linux systems, homelab engineering, Raspberry Pi deployments, networking, automation,
|
||||
and real-world technical problem solving.
|
||||
</p>
|
||||
|
||||
<p class="noc-page-lead">
|
||||
Real time visibility into Ced's HomeLab infrastructure across 18 nodes and 28 services
|
||||
Proxmox, K3s, TrueNAS, APRS RF edge systems, and self-hosted services.
|
||||
Built from the ground up and running in production every day. The infrastructure on this page is live. Not a demo.
|
||||
</p>
|
||||
<div class="hero-actions">
|
||||
<a class="btn btn-primary" href="#projects">View Projects</a>
|
||||
<a class="btn btn-secondary" href="#contact">Contact Me</a>
|
||||
</div>
|
||||
|
||||
<ul class="noc-page-meta">
|
||||
<li>📍 Oxford, MS</li>
|
||||
<li><a href="https://chasedumphord.com">← Portfolio</a></li>
|
||||
<li><a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github/ced4568</a></li>
|
||||
</ul>
|
||||
<ul class="quick-facts">
|
||||
<li>Oxford, MS</li>
|
||||
<li>
|
||||
GitHub:
|
||||
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">ced4568</a>
|
||||
</li>
|
||||
<li>
|
||||
Email:
|
||||
<a href="mailto:[email protected]">[email protected]</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="hero-panel">
|
||||
<img
|
||||
src="assets/images/ChaseD_headshot.jpg"
|
||||
alt="Headshot of Chase Dumphord"
|
||||
class="hero-image"
|
||||
/>
|
||||
|
||||
<div class="terminal-card">
|
||||
<div class="terminal-top">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
|
||||
<pre><code>$ whoami
|
||||
systems_builder
|
||||
|
||||
$ focus
|
||||
infrastructure
|
||||
networking
|
||||
automation
|
||||
edge_systems
|
||||
|
||||
$ status
|
||||
building_real_systems</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ══════════════════════════════════════════════════════════════════════ NOC DASHBOARD
|
||||
Full-width live dashboard area. All dynamic content driven by ../script.js
|
||||
pulling noc-status.json. Sub-sections inside:
|
||||
• Status command bar — live connection status dot + refresh badge (JS)
|
||||
• Uptime pills bar — online/degraded/offline counts built by buildUptimePills()
|
||||
• Metrics grid — 4 counters: Nodes, Services Online, Network Segments, Edge Systems
|
||||
• Alert panel — top 3 priority systems, fed from JSON data feed
|
||||
• Layer filter tabs — filter cards by stack layer (Compute, Storage, Network, etc.)
|
||||
• System cards grid — one card per host/service, populated by JS from JSON
|
||||
• Fallback message — shown if JSON feed is unavailable
|
||||
• Stack info bar — tech stack credits: Python → JSON → JS, Grafana link, GitHub repo
|
||||
• NOC Roadmap — 3 build-stage cards (Portfolio NOC, Auto Updates, Grafana — all ✅ Live)
|
||||
══════════════════════════════════════════════════════════════════════════ -->
|
||||
<div class="noc-full">
|
||||
<section id="snapshot" class="section section-alt">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">Environment</p>
|
||||
<h2>Systems Snapshot</h2>
|
||||
<p class="section-intro">
|
||||
A quick look at the infrastructure and systems I’m actively building and documenting.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<h3>12+</h3>
|
||||
<p>Nodes</p>
|
||||
<span>K3s cluster environment</span>
|
||||
</div>
|
||||
|
||||
<div class="stat-card">
|
||||
<h3>10+</h3>
|
||||
<p>Services</p>
|
||||
<span>Self-hosted stack</span>
|
||||
</div>
|
||||
|
||||
<div class="stat-card">
|
||||
<h3>4</h3>
|
||||
<p>VLANs</p>
|
||||
<span>Segmented network design</span>
|
||||
</div>
|
||||
|
||||
<div class="stat-card">
|
||||
<h3>2</h3>
|
||||
<p>iGate Nodes</p>
|
||||
<span>Home + mobile APRS</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="noc" class="section noc-dashboard">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">Ced’s NOC</p>
|
||||
<h2>Live Systems Overview</h2>
|
||||
<p class="section-intro">
|
||||
Real infrastructure inventory from Ced’s HomeLab, K3s cluster, and APRS edge systems.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Status command bar -->
|
||||
<div class="noc-command-bar">
|
||||
<span class="status-dot" id="noc-dot"></span>
|
||||
<span id="noc-status-text">Connecting to NOC feed...</span>
|
||||
<span class="noc-refresh-badge" id="noc-refresh-badge"></span>
|
||||
<span class="status-dot"></span>
|
||||
<span id="noc-status-text">Loading NOC status...</span>
|
||||
</div>
|
||||
|
||||
<p class="noc-proof">
|
||||
Proxmox • K3s • TrueNAS • VLAN Segmentation • APRS RF Edge Systems
|
||||
Built using real infrastructure: Proxmox • K3s • TrueNAS • VLAN segmentation • APRS RF Edge Systems
|
||||
</p>
|
||||
|
||||
<!-- Uptime summary pills (populated by JS) -->
|
||||
<div class="uptime-bar" id="uptime-bar"></div>
|
||||
|
||||
<!-- Metrics -->
|
||||
<div class="noc-metrics-grid">
|
||||
<div class="noc-metric">
|
||||
<h3 id="metric-nodes">--</h3>
|
||||
<p>Infrastructure Nodes</p>
|
||||
</div>
|
||||
|
||||
<div class="noc-metric">
|
||||
<h3 id="metric-services">--</h3>
|
||||
<p>Services Online</p>
|
||||
</div>
|
||||
|
||||
<div class="noc-metric">
|
||||
<h3 id="metric-vlans">--</h3>
|
||||
<p>Network Segments</p>
|
||||
</div>
|
||||
|
||||
<div class="noc-metric">
|
||||
<h3 id="metric-edge">--</h3>
|
||||
<p>Edge Systems</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Alert panel -->
|
||||
<div class="noc-alert-panel">
|
||||
<div class="noc-alert-header">
|
||||
<h3>🚨 Alert Panel</h3>
|
||||
<span>Top 3 Priority Systems</span>
|
||||
<h3>🚨 NOC Alert Panel</h3>
|
||||
<span>Top 3 System Notes</span>
|
||||
</div>
|
||||
|
||||
<div id="noc-alert-list" class="noc-alert-list">
|
||||
<p class="noc-loading">Awaiting data feed...</p>
|
||||
<p>Loading alerts...</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Layer filter tabs -->
|
||||
<div class="layer-tabs" id="layer-tabs">
|
||||
<button class="layer-tab active" data-layer="all">All Systems</button>
|
||||
<div id="noc-system-grid" class="noc-system-grid"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="about" class="section">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">About</p>
|
||||
<h2>Hands-on systems builder with a digital infrastructure mindset</h2>
|
||||
</div>
|
||||
|
||||
<!-- System cards grid -->
|
||||
<div id="noc-system-grid" class="noc-system-grid"></div>
|
||||
<div class="content-grid">
|
||||
<div class="card">
|
||||
<p>
|
||||
I’m a technical professional focused on digital systems, infrastructure, networking,
|
||||
automation, and hands-on system integration. I enjoy building systems that are practical,
|
||||
reliable, and well documented — from homelab services and dashboards to Raspberry Pi
|
||||
deployments, APRS iGates, and troubleshooting workflows.
|
||||
</p>
|
||||
|
||||
<!-- Fallback -->
|
||||
<div id="noc-fallback" class="noc-fallback" style="display:none;">
|
||||
<p class="noc-fallback-msg">
|
||||
NOC feed unavailable from this context systems run locally.<br/>
|
||||
Data updates when the local pipeline pushes a fresh noc-status.json.
|
||||
<p>
|
||||
My background blends field engineering, industrial technology, software-oriented thinking,
|
||||
and infrastructure problem solving. I’m especially interested in projects that connect the
|
||||
physical and digital worlds through monitoring, networking, automation, and resilient design.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Core Focus Areas</h3>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>Digital systems and infrastructure</li>
|
||||
<li>Linux systems and service management</li>
|
||||
<li>Networking, VLANs, failover, and connectivity troubleshooting</li>
|
||||
<li>Raspberry Pi and edge-device deployments</li>
|
||||
<li>Documentation, process building, and reproducible project design</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="projects" class="section section-alt">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">Projects</p>
|
||||
<h2>🔧 Infrastructure & Systems Projects</h2>
|
||||
<p class="section-intro">
|
||||
These projects are built around real systems, networking, Linux services, edge devices,
|
||||
and practical documentation.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Stack info bar -->
|
||||
<div class="noc-stack-bar">
|
||||
<span><strong>Stack:</strong> Python health checks → JSON → JS dashboard</span>
|
||||
<span><strong>Live:</strong> <a href="https://grafana.cedshomelab.com" target="_blank" rel="noopener noreferrer">Grafana + Prometheus</a></span>
|
||||
<span><strong>Source:</strong>
|
||||
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer">
|
||||
github/ceds-homelab
|
||||
<div class="projects-grid">
|
||||
<article class="project-card featured-project">
|
||||
<div class="project-top">
|
||||
<h3>🧠 Ced’s HomeLab Infrastructure</h3>
|
||||
<span class="status-pill">Flagship</span>
|
||||
</div>
|
||||
|
||||
<p class="tags">Infrastructure • Networking • Virtualization • Monitoring • Self-Hosting</p>
|
||||
|
||||
<p class="project-impact">
|
||||
Designed as a practical infrastructure environment for networking, monitoring,
|
||||
service hosting, and documentation.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Personal infrastructure lab focused on network segmentation, virtualization,
|
||||
self-hosted services, monitoring, and architecture documentation.
|
||||
</p>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>VLAN segmentation and network design</li>
|
||||
<li>Proxmox virtualization</li>
|
||||
<li>Self-hosted services and monitoring</li>
|
||||
<li>System architecture documentation</li>
|
||||
</ul>
|
||||
|
||||
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
|
||||
View Project →
|
||||
</a>
|
||||
</span>
|
||||
</article>
|
||||
|
||||
<article class="project-card">
|
||||
<div class="project-top">
|
||||
<h3>☸️ K3s Kubernetes Cluster</h3>
|
||||
<span class="status-pill">Infrastructure</span>
|
||||
</div>
|
||||
|
||||
<p class="tags">Kubernetes • Containers • Linux • Infrastructure • Automation</p>
|
||||
|
||||
<p class="project-impact">
|
||||
Built to simulate distributed infrastructure, container orchestration, and scalable service deployment.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Multi-node K3s cluster built for container orchestration, service deployment,
|
||||
and infrastructure experimentation.
|
||||
</p>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>Multi-node cluster setup</li>
|
||||
<li>Containerized workloads</li>
|
||||
<li>Service deployment</li>
|
||||
<li>Infrastructure automation</li>
|
||||
</ul>
|
||||
|
||||
<a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
|
||||
View Project →
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="project-card">
|
||||
<div class="project-top">
|
||||
<h3>📡 APRS iGate System</h3>
|
||||
<span class="status-pill">Edge System</span>
|
||||
</div>
|
||||
|
||||
<p class="tags">RF • Linux • Raspberry Pi • Networking • APRS-IS • Edge Systems</p>
|
||||
|
||||
<p class="project-impact">
|
||||
Bridges RF communication into IP-based infrastructure using Linux, Direwolf, and APRS-IS.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Operational dual-node APRS iGate system built with Raspberry Pi, Direwolf, APRS-IS,
|
||||
RF radios, HomeLab network integration, and planned mobile GPS support.
|
||||
</p>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>RF packet decoding with Direwolf</li>
|
||||
<li>APRS-IS uplink verified on aprs.fi</li>
|
||||
<li>HomeLab WiFi + mobile hotspot failover</li>
|
||||
<li>Mobile build includes ETH-USB-HUB-BOX expansion</li>
|
||||
<li>Documented configs, architecture, and troubleshooting</li>
|
||||
</ul>
|
||||
|
||||
<a href="https://github.com/ced4568/ceds-aprs-igate" target="_blank" rel="noopener noreferrer" class="project-link">
|
||||
View Project →
|
||||
</a>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section noc-section">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">NOC Roadmap</p>
|
||||
<h2>📊 Ced’s NOC Vision</h2>
|
||||
<p class="section-intro">
|
||||
Ced’s NOC is being built as a staged monitoring and systems-visibility platform for HomeLab,
|
||||
Kubernetes, edge devices, and future production-style dashboards.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- NOC Roadmap -->
|
||||
<div class="noc-roadmap">
|
||||
<p class="section-label">// noc roadmap</p>
|
||||
<h2 class="section-h2" style="font-family:var(--font-display);font-size:1.6rem;margin:0 0 1.25rem;">Build Stages</h2>
|
||||
<div class="noc-grid">
|
||||
<div class="noc-card">
|
||||
<h3>✅ Current: Portfolio NOC</h3>
|
||||
<p>
|
||||
JSON-driven dashboard that displays real inventory, online/offline checks, service labels,
|
||||
latency, and last-check timestamps.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="noc-grid">
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge done">✅ Live</div>
|
||||
<h3>Portfolio NOC</h3>
|
||||
<p>
|
||||
JSON-driven dashboard showing real inventory, online/offline checks,
|
||||
service labels, latency, and last check timestamps across 18 nodes and 28 services.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge done">✅ Live</div>
|
||||
<h3>Automated Data Updates</h3>
|
||||
<p>
|
||||
Cron-driven scripts running on Biggie auto-refresh system status every 5 minutes
|
||||
and push dashboard ready JSON to GitHub Pages with no manual updates required.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<div class="noc-card-badge done">✅ Live</div>
|
||||
<h3>Grafana + Prometheus</h3>
|
||||
<p>
|
||||
Full observability stack running across Proxmox, TrueNAS, K3s nodes, Uptime Kuma,
|
||||
and APRS edge systems with real time metrics ingestion and live alerting pipelines.
|
||||
</p>
|
||||
</div>
|
||||
<div class="noc-card">
|
||||
<h3>⚙️ Next: Automated Data Updates</h3>
|
||||
<p>
|
||||
Scheduled local script updates will refresh system status data automatically and push dashboard-ready
|
||||
JSON into the portfolio.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="noc-card">
|
||||
<h3>📈 Future: Grafana + Prometheus</h3>
|
||||
<p>
|
||||
Deeper monitoring stack for Proxmox, TrueNAS, K3s, Raspberry Pi nodes, Uptime Kuma,
|
||||
and APRS edge systems.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="resume" class="section">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">Resume Snapshot</p>
|
||||
<h2>Technical experience that bridges field work and digital systems</h2>
|
||||
</div>
|
||||
|
||||
<div class="content-grid">
|
||||
<div class="card">
|
||||
<h3>What I Bring</h3>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>Industrial and field-service technical experience</li>
|
||||
<li>Linux, Raspberry Pi, and systems administration work</li>
|
||||
<li>Networking, connectivity, and troubleshooting depth</li>
|
||||
<li>Documentation, process building, and reproducible project design</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>Current Direction</h3>
|
||||
|
||||
<p>
|
||||
I’m positioning myself around digital systems, infrastructure, networking,
|
||||
automation, and technical operations — especially roles where hands-on problem
|
||||
solving and system integration matter.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
More detailed resume content will be added here as the portfolio grows.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section section-alt personal-section">
|
||||
<div class="container personal-grid">
|
||||
<div class="personal-image-wrap">
|
||||
<img
|
||||
src="assets/images/lakephotopinkpants.png"
|
||||
alt="Chase Dumphord standing by a fence with a lake view in the background"
|
||||
class="personal-image"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<p class="section-label">Personal Note</p>
|
||||
<h2>Technical, curious, and always building</h2>
|
||||
|
||||
<p>
|
||||
Outside of work, I enjoy electronics, self-hosting, coding, drones, radio, and
|
||||
hands-on technical projects that push me to learn something useful. That curiosity
|
||||
carries directly into the way I build and document systems.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="contact" class="section">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<p class="section-label">Contact</p>
|
||||
<h2>Let’s connect</h2>
|
||||
</div>
|
||||
|
||||
<div class="contact-grid">
|
||||
<div class="card">
|
||||
<h3>Contact Info</h3>
|
||||
|
||||
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
|
||||
<p>Phone: <a href="tel:+16622142231">662-214-2231</a></p>
|
||||
<p>Location: Oxford, MS</p>
|
||||
<p>
|
||||
GitHub:
|
||||
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>What I’m Open To</h3>
|
||||
|
||||
<ul class="clean-list">
|
||||
<li>Digital systems and infrastructure roles</li>
|
||||
<li>Networking and technical operations work</li>
|
||||
<li>Automation and monitoring projects</li>
|
||||
<li>Projects involving hardware + software integration</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<!-- ══════════════════════════════════════════════════════════════════════ FOOTER
|
||||
Minimal single-row footer: copyright (year injected by data-year JS) + back-to-top link.
|
||||
══════════════════════════════════════════════════════════════════════════ -->
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-content">
|
||||
<p>© <span data-year></span> Chase Dumphord — <span class="footer-mono">noc.chasedumphord.com</span></p>
|
||||
<a href="#top" class="back-to-top">↑ back to top</a>
|
||||
<p>© <span data-year></span> Chase Dumphord</p>
|
||||
<a href="#top" class="back-to-top">Back to top ↑</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- ══════════════════════════════════════════════════════════════════════ SCRIPTS
|
||||
1. ../script.js — shared portfolio script (NOC JSON fetch, card rendering, year injection).
|
||||
2. Inline NOC JS — layer filter tabs (buildLayerTabs, filterByLayer) and
|
||||
uptime pill builder (buildUptimePills). Uses MutationObserver on the system grid
|
||||
to rebuild tabs/pills whenever the JS card renderer populates the DOM.
|
||||
══════════════════════════════════════════════════════════════════════════ -->
|
||||
<!-- Shared script (up one level) -->
|
||||
<script src="../script.js"></script>
|
||||
|
||||
<!-- NOC page extras — layer filter tabs + uptime pills -->
|
||||
<script>
|
||||
// ── Layer filter tabs ──────────────────────────────────────────
|
||||
let allSystems = [];
|
||||
let activeLayer = "all";
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const observer = new MutationObserver(() => {
|
||||
const cards = document.querySelectorAll(".noc-system-card");
|
||||
if (cards.length > 0) {
|
||||
buildLayerTabs();
|
||||
buildUptimePills();
|
||||
reapplyFilter();
|
||||
}
|
||||
});
|
||||
|
||||
const grid = document.getElementById("noc-system-grid");
|
||||
if (grid) observer.observe(grid, { childList: true });
|
||||
});
|
||||
|
||||
function reapplyFilter() {
|
||||
if (activeLayer !== "all") {
|
||||
document.querySelectorAll(".noc-system-card").forEach(card => {
|
||||
const layerEl = card.querySelector(".noc-system-top span:last-child");
|
||||
card.style.display =
|
||||
layerEl && layerEl.textContent.trim() === activeLayer ? "" : "none";
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function buildLayerTabs() {
|
||||
const cards = document.querySelectorAll(".noc-system-card");
|
||||
const layers = new Set(["all"]);
|
||||
|
||||
cards.forEach(card => {
|
||||
const layerEl = card.querySelector(".noc-system-top span:last-child");
|
||||
if (layerEl) layers.add(layerEl.textContent.trim());
|
||||
});
|
||||
|
||||
const tabContainer = document.getElementById("layer-tabs");
|
||||
tabContainer.innerHTML = "";
|
||||
|
||||
layers.forEach(layer => {
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "layer-tab" + (layer === activeLayer ? " active" : "");
|
||||
btn.dataset.layer = layer;
|
||||
btn.textContent = layer === "all" ? "All Systems" : layer;
|
||||
btn.addEventListener("click", () => filterByLayer(layer, btn));
|
||||
tabContainer.appendChild(btn);
|
||||
});
|
||||
}
|
||||
|
||||
function filterByLayer(layer, activeBtn) {
|
||||
activeLayer = layer;
|
||||
document.querySelectorAll(".layer-tab").forEach(t => t.classList.remove("active"));
|
||||
activeBtn.classList.add("active");
|
||||
|
||||
document.querySelectorAll(".noc-system-card").forEach(card => {
|
||||
if (layer === "all") {
|
||||
card.style.display = "";
|
||||
return;
|
||||
}
|
||||
const layerEl = card.querySelector(".noc-system-top span:last-child");
|
||||
card.style.display =
|
||||
layerEl && layerEl.textContent.trim() === layer ? "" : "none";
|
||||
});
|
||||
}
|
||||
|
||||
function buildUptimePills() {
|
||||
const bar = document.getElementById("uptime-bar");
|
||||
if (!bar) return;
|
||||
|
||||
const cards = document.querySelectorAll(".noc-system-card");
|
||||
let online = 0, warning = 0, offline = 0;
|
||||
|
||||
cards.forEach(card => {
|
||||
const dot = card.querySelector(".mini-status");
|
||||
if (!dot) return;
|
||||
if (dot.classList.contains("online")) online++;
|
||||
else if (dot.classList.contains("warning")) warning++;
|
||||
else if (dot.classList.contains("offline")) offline++;
|
||||
});
|
||||
|
||||
bar.innerHTML = `
|
||||
<span class="uptime-pill online">● ${online} Online</span>
|
||||
${warning > 0 ? `<span class="uptime-pill warning">● ${warning} Degraded</span>` : ""}
|
||||
${offline > 0 ? `<span class="uptime-pill offline">● ${offline} Offline</span>` : ""}
|
||||
<span class="uptime-pill">${online + warning + offline} Total Systems</span>
|
||||
`;
|
||||
}
|
||||
</script>
|
||||
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -35,12 +35,7 @@ async function loadNocStatus() {
|
||||
|
||||
try {
|
||||
// Cache-bust to always get fresh data
|
||||
// Use absolute URL when on NOC subdomain, relative when on main portfolio
|
||||
const nocDataUrl = window.location.hostname === 'noc.chasedumphord.com'
|
||||
? `https://chasedumphord.com/data/noc-status.json?t=${Date.now()}`
|
||||
: `data/noc-status.json?t=${Date.now()}`;
|
||||
|
||||
const res = await fetch(nocDataUrl);
|
||||
const res = await fetch(`data/noc-status.json?t=${Date.now()}`);
|
||||
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
|
||||
@@ -54,9 +49,7 @@ async function loadNocStatus() {
|
||||
dot.className = "status-dot live";
|
||||
}
|
||||
if (statusText) {
|
||||
const d = new Date(data.lastUpdated);
|
||||
const formatted = d.toLocaleString('en-US', { month: 'long', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit', hour12: true });
|
||||
statusText.textContent = `${data.nocName} — ${data.status} — Last updated: ${formatted}`;
|
||||
statusText.textContent = `${data.nocName} — ${data.status} — Last updated: ${data.lastUpdated}`;
|
||||
}
|
||||
if (badge) {
|
||||
badge.textContent = `Auto-refresh: 30s`;
|
||||
@@ -95,6 +88,7 @@ async function loadNocStatus() {
|
||||
</div>
|
||||
<h3>${system.name}</h3>
|
||||
<p>${system.type}</p>
|
||||
<code>${system.address}</code>
|
||||
<div class="system-meta">
|
||||
<small>Status: ${system.status}</small>
|
||||
<small>Latency: ${system.latency || "N/A"}</small>
|
||||
@@ -225,7 +219,7 @@ async function loadGithubRepos() {
|
||||
container.innerHTML = `
|
||||
<div class="repo-loading">
|
||||
<p class="noc-loading">
|
||||
Could not load repositories.
|
||||
Could not load repositories.
|
||||
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
|
||||
View on GitHub →
|
||||
</a>
|
||||
@@ -236,7 +230,6 @@ async function loadGithubRepos() {
|
||||
}
|
||||
}
|
||||
|
||||
// Build the alert panel from system data
|
||||
function renderAlerts(systems, alertList) {
|
||||
const scored = systems
|
||||
.map((sys) => {
|
||||
@@ -246,7 +239,7 @@ function renderAlerts(systems, alertList) {
|
||||
let score = 0;
|
||||
if (sev.includes("critical") || status.includes("offline")) score = 3;
|
||||
else if (sev.includes("degraded")) score = 2;
|
||||
else if (sev.includes("unknown")) score = 1;
|
||||
else if (sev.includes("unknown")) score = 1;
|
||||
|
||||
return { ...sys, score };
|
||||
})
|
||||
@@ -277,4 +270,4 @@ function renderAlerts(systems, alertList) {
|
||||
</div>
|
||||
`;
|
||||
}).join("");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ SYSTEMS = [
|
||||
"type": "Virtualization Platform",
|
||||
"host": "10.10.30.250",
|
||||
"port": 8006,
|
||||
"display_name": "BigWorld",
|
||||
"address": "10.10.30.250:8006",
|
||||
"layer": "Core Infrastructure",
|
||||
"label": "Hypervisor"
|
||||
},
|
||||
@@ -21,7 +21,7 @@ SYSTEMS = [
|
||||
"type": "Storage Platform",
|
||||
"host": "10.10.30.143",
|
||||
"port": 80,
|
||||
"display_name": "TrueNAS",
|
||||
"address": "10.10.30.143",
|
||||
"layer": "Storage",
|
||||
"label": "NAS"
|
||||
},
|
||||
@@ -30,7 +30,7 @@ SYSTEMS = [
|
||||
"type": "Reverse Proxy",
|
||||
"host": "10.10.30.210",
|
||||
"port": 81,
|
||||
"display_name": "NPM",
|
||||
"address": "10.10.30.210:81",
|
||||
"layer": "Access Layer",
|
||||
"label": "Proxy"
|
||||
},
|
||||
@@ -39,7 +39,7 @@ SYSTEMS = [
|
||||
"type": "Service Dashboard",
|
||||
"host": "10.10.30.61",
|
||||
"port": 4000,
|
||||
"display_name": "Dashy",
|
||||
"address": "10.10.30.61:4000",
|
||||
"layer": "Dashboard",
|
||||
"label": "Portal"
|
||||
},
|
||||
@@ -48,7 +48,7 @@ SYSTEMS = [
|
||||
"type": "Media Service",
|
||||
"host": "10.10.30.143",
|
||||
"port": 30013,
|
||||
"display_name": "PrimeStation",
|
||||
"address": "10.10.30.143:30013",
|
||||
"layer": "Application Service",
|
||||
"label": "App"
|
||||
},
|
||||
@@ -57,7 +57,7 @@ SYSTEMS = [
|
||||
"type": "Kubernetes API",
|
||||
"host": "10.10.30.72",
|
||||
"port": 6443,
|
||||
"display_name": "k3s-django-1",
|
||||
"address": "10.10.30.72:6443",
|
||||
"layer": "Compute Cluster",
|
||||
"label": "Cluster"
|
||||
},
|
||||
@@ -66,7 +66,7 @@ SYSTEMS = [
|
||||
"type": "RF Edge Gateway",
|
||||
"host": "10.10.30.129",
|
||||
"port": 8001,
|
||||
"display_name": "KJ5JCO-10 iGate",
|
||||
"address": "KJ5JCO-10 / Direwolf KISS 8001",
|
||||
"layer": "Edge / RF",
|
||||
"label": "iGate"
|
||||
},
|
||||
@@ -75,7 +75,7 @@ SYSTEMS = [
|
||||
"type": "APRS Internet Service",
|
||||
"host": "noam.aprs2.net",
|
||||
"port": 14580,
|
||||
"display_name": "noam.aprs2.net",
|
||||
"address": "noam.aprs2.net:14580",
|
||||
"layer": "Edge / RF",
|
||||
"label": "External"
|
||||
}
|
||||
@@ -141,7 +141,7 @@ def main():
|
||||
systems.append({
|
||||
"name": system["name"],
|
||||
"type": system["type"],
|
||||
"address": system["display_name"],
|
||||
"address": system["address"],
|
||||
"status": status,
|
||||
"severity": severity_from_status(online, latency),
|
||||
"layer": system["layer"],
|
||||
|
||||
@@ -413,7 +413,6 @@ a:hover { text-decoration: underline; }
|
||||
var(--bg);
|
||||
border-top: 1px solid var(--line);
|
||||
border-bottom: 1px solid var(--line);
|
||||
/* subtle scan-line texture */
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@@ -932,31 +931,31 @@ a:hover { text-decoration: underline; }
|
||||
.hero-badges {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.6rem;
|
||||
margin-top: 1.25rem;
|
||||
gap: 0.5rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.badge-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem 0.9rem;
|
||||
gap: 0.35rem;
|
||||
padding: 0.3rem 0.65rem;
|
||||
border-radius: 999px;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.78rem;
|
||||
font-size: 0.72rem;
|
||||
font-weight: 700;
|
||||
border: 1px solid var(--line);
|
||||
transition: background 0.15s, border-color 0.15s, transform 0.15s;
|
||||
}
|
||||
|
||||
.badge-link:hover {
|
||||
transform: translateY(-2px);
|
||||
transform: translateY(-1px);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.badge-icon {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
@@ -1122,7 +1121,7 @@ a:hover { text-decoration: underline; }
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════
|
||||
RESPONSIVE ADDITIONS
|
||||
RESPONSIVE
|
||||
═══════════════════════════════ */
|
||||
@media (max-width: 1050px) {
|
||||
.projects-grid,
|
||||
|
||||