1 Commits
Author SHA1 Message Date
ced4568 361fbc7416 NOC auto-update: 2026-05-04 15:40 UTC 2026-05-04 10:40:35 -05:00
9 changed files with 256 additions and 377 deletions
+25 -34
View File
@@ -1,29 +1,29 @@
# Hi, I'm Chase (Ced) Dumphord # Hi, I'm Chase (Ced) Dumphord
### DevOps Engineer | Platform & Cloud Infrastructure Engineer | Industrial Systems ### Digital Systems Engineer | Infrastructure | Automation | RF Edge Systems
> **Live Portfolio:** https://chasedumphord.com > **Live Portfolio:** https://chasedumphord.com
> **Live NOC Dashboard:** https://noc.chasedumphord.com > **Live NOC Dashboard:** https://noc.chasedumphord.com
--- ---
## About ## 🧠 About
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. Digital Systems Engineer with 10+ years of experience across industrial automation, manufacturing systems, and data-driven infrastructure. Currently at GE Aerospace Digital Team specializing in machine data integration, dashboard development, and system-level visibility. Hands-on homelab engineer bridging physical equipment with modern digital platforms. Increasingly integrating AI tooling for system documentation, automated diagnostics, and workflow acceleration.
--- ---
## Live Sites ## 🌐 Live Sites
| Site | URL | Description | | Site | URL | Description |
|------|-----|-------------| |------|-----|-------------|
| Portfolio | https://chasedumphord.com | Personal portfolio, projects, stack, resume | | Portfolio | https://chasedumphord.com | Personal portfolio — projects, stack, resume |
| NOC Dashboard | https://noc.chasedumphord.com | Live infrastructure visibility — 28 systems | | NOC Dashboard | https://noc.chasedumphord.com | Live infrastructure visibility — 28 systems |
--- ---
## Ced's NOC — Live Infrastructure Observability ## 📊 Ced's NOC — Live Infrastructure Observability
Real time network operations center dashboard monitoring 28 homelab systems across 6 infrastructure layers. Real-time network operations center dashboard monitoring 28 homelab systems across 6 infrastructure layers.
### How It Works ### How It Works
@@ -43,32 +43,25 @@ Proxmox Biggie (Cron every 5min)
- **12-node K3s Cluster** — 3 control plane (django-1/2/3) + 9 workers (ingress, data, monitoring groups) - **12-node K3s Cluster** — 3 control plane (django-1/2/3) + 9 workers (ingress, data, monitoring groups)
- **TrueNAS** — Network attached storage - **TrueNAS** — Network attached storage
- **Nginx Proxy Manager** — Reverse proxy layer - **Nginx Proxy Manager** — Reverse proxy layer
- **Prometheus + Grafana + Uptime Kuma** — Full observability stack with Prometheus actively scraping - **Prometheus + Grafana + Uptime Kuma** — Full observability stack (Prometheus actively scraping)
- **Portainer** — Container management and deployment UI
- **Dashy + Home Assistant + PrimeStation** — Services layer - **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) - **APRS iGate x2** — RF edge systems (home + mobile)
### Automation ### Automation
- Script: `~/scripts/noc_update.py` running on Biggie - Script: `~/scripts/noc_update.py` running on Biggie (`10.10.30.192`)
- Cron: `*/5 * * * *` — every 5 minutes - Cron: `*/5 * * * *` — every 5 minutes
- Log: `/var/log/noc_update.log` - Log: `/var/log/noc_update.log`
- Auth: GitHub Personal Access Token via baked remote URL - Auth: GitHub Personal Access Token via baked remote URL
--- ---
## Infrastructure Overview ## 🏗️ Infrastructure Overview
| Layer | Systems | Count | | Layer | Systems | Count |
|-------|---------|-------| |-------|---------|-------|
| Compute | Proxmox VE cluster | 6 nodes | | Compute | Proxmox VE cluster | 6 nodes |
| Orchestration | K3s Kubernetes | 12 nodes | | Orchestration | K3s Kubernetes | 12 nodes |
| Total Nodes | Combined infrastructure | 18 nodes |
| Storage | TrueNAS | 1 | | Storage | TrueNAS | 1 |
| Networking | Nginx Proxy Manager, Cloudflare Tunnels, UniFi VLANs | 4 VLANs | | Networking | Nginx Proxy Manager, Cloudflare Tunnels, UniFi VLANs | 4 VLANs |
| Monitoring | Prometheus, Grafana, Uptime Kuma, Custom NOC | 4 services | | Monitoring | Prometheus, Grafana, Uptime Kuma, Custom NOC | 4 services |
@@ -76,56 +69,54 @@ Proxmox Biggie (Cron every 5min)
--- ---
## Featured Projects ## 🔥 Featured Projects
### Ced's NOC Dashboard ### 📊 Ced's NOC Dashboard
Real time monitoring system with live system health, latency tracking, severity based alerts, and layer filtering. Real-time monitoring system with live system health, latency tracking, severity-based alerts, and layer filtering.
- **Live:** https://noc.chasedumphord.com - **Live:** https://noc.chasedumphord.com
- **Source:** https://github.com/ced4568/ceds-noc - **Source:** https://github.com/ced4568/ceds-noc
### Ced's HomeLab ### 🧱 Ced's HomeLab
Full enterprise style homelab with Proxmox clustering, K3s orchestration, VLAN segmentation, and full observability stack including Prometheus scraping. 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 - **Source:** https://github.com/ced4568/ceds-homelab
### APRS iGate (RF Edge System) ### 📡 APRS iGate (RF Edge System)
Dual node RF to internet gateway. Raspberry Pi + Direwolf TNC. Live on aprs.fi. Dual-node RF-to-internet gateway. Raspberry Pi + Direwolf TNC. Live on aprs.fi.
- **Source:** https://github.com/ced4568/ceds-aprs-igate - **Source:** https://github.com/ced4568/ceds-aprs-igate
--- ---
## Tech Stack ## 🧰 Tech Stack
**Infrastructure:** Proxmox VE • K3s • Docker • TrueNAS • Helm • Terraform • Nginx Proxy Manager • Cloudflare Tunnels **Infrastructure:** Proxmox VE • K3s • Docker • TrueNAS • Nginx Proxy Manager • Cloudflare Tunnels
**Monitoring:** Prometheus • Grafana • Uptime Kuma • Custom NOC Dashboard **Monitoring:** Prometheus • Grafana • Uptime Kuma • Custom NOC Dashboard
**Networking:** UniFi • VLAN Segmentation • Tailscale • Cloudflare DNS **Networking:** UniFi • VLAN Segmentation • Cloudflare DNS
**GitOps & CI/CD:** GitHub Actions • Docker Compose • Manifest-driven Config
**Edge / RF:** Direwolf • APRS-IS • Raspberry Pi • RTL-SDR **Edge / RF:** Direwolf • APRS-IS • Raspberry Pi • RTL-SDR
**Development:** Python • Bash • JavaScript • HTML/CSS • Git **Development:** Python • Bash • JavaScript • HTML/CSS • Git
**AI & Automation:** n8n • OpenRouter • Telegram Bots • ChatGPT • Claude (Anthropic) •Crew AI Agent • Gemini • Hermes Agent • LLM-assisted Documentation • AI-driven Diagnostics **AI & Automation:** Claude (Anthropic) • LLM-assisted Documentation • Prompt Engineering
--- ---
## Connect ## 👤 Connect
[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-blue?style=for-the-badge&logo=linkedin)](https://www.linkedin.com/in/chase-dumphord/) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-blue?style=for-the-badge&logo=linkedin)](https://www.linkedin.com/in/toochase-dumphord/)
[![GitHub](https://img.shields.io/badge/GitHub-ced4568-black?style=for-the-badge&logo=github)](https://github.com/ced4568) [![GitHub](https://img.shields.io/badge/GitHub-ced4568-black?style=for-the-badge&logo=github)](https://github.com/ced4568)
[![Portfolio](https://img.shields.io/badge/Portfolio-Live-brightgreen?style=for-the-badge)](https://chasedumphord.com) [![Portfolio](https://img.shields.io/badge/Portfolio-Live-brightgreen?style=for-the-badge)](https://chasedumphord.com)
[![NOC](https://img.shields.io/badge/NOC-Live-cyan?style=for-the-badge)](https://noc.chasedumphord.com) [![NOC](https://img.shields.io/badge/NOC-Live-cyan?style=for-the-badge)](https://noc.chasedumphord.com)
📧 chasedumphord@gmail.com | Oxford, MS 📧 chasedumphord@gmail.com | 📍 Oxford, MS
--- ---
> Built from the ground up and running in production every day. The infrastructure on this page is live. Not a demo. > This is not a static portfolio — it is a live representation of working systems.
+29 -48
View File
@@ -1,5 +1,5 @@
%PDF-1.4 %PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com %“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj 1 0 obj
<< <<
/F1 2 0 R /F2 3 0 R /F1 2 0 R /F2 3 0 R
@@ -17,7 +17,7 @@ endobj
endobj endobj
4 0 obj 4 0 obj
<< <<
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources << /Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans << >> /Rotate 0 /Trans <<
@@ -27,7 +27,7 @@ endobj
endobj endobj
5 0 obj 5 0 obj
<< <<
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources << /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans << >> /Rotate 0 /Trans <<
@@ -37,76 +37,57 @@ endobj
endobj endobj
6 0 obj 6 0 obj
<< <<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources << /PageMode /UseNone /Pages 8 0 R /Type /Catalog
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>> >>
endobj endobj
7 0 obj 7 0 obj
<< <<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog /Author (\(anonymous\)) /CreationDate (D:20260502182436+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260502182436+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>> >>
endobj endobj
8 0 obj 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) /Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
/Subject (unspecified) /Title (untitled) /Trapped /False
>> >>
endobj endobj
9 0 obj 9 0 obj
<< <<
/Count 3 /Kids [ 4 0 R 5 0 R 6 0 R ] /Type /Pages /Filter [ /ASCII85Decode /FlateDecode ] /Length 2874
>> >>
stream
Gb!SmgN)%.&q0LUoM\eYQ"42Il>79h:,K5HN29,5<qunG+UK*Ni..UD:$ou>2ZZfUXG^Abg+#m'YpC#r!/IIJ?YG(G5Bc]]9E79#iV^h&gO]/%Cp3<Dr#.3NB7HH)Au%NTHQES"Ibu7*'YMo(HtsE]h\oYkBE3J8*s;Z^eFG00)1`/Zc9[@Or2;S+IQ=_a><&9^cDm1OSh4ObE"dP_(XKA%$1nq$/=7lU]0=FP[,?I5*RYggL!F5JEXimsP-(O;hS]9K0`Qh8s+WaTj0l.NDqXd(VX9Nmg=qDlpK`FQXnP>:jc1>E#IkN4>_o4)=:DNY?LT4qbB,12c5#-h_]__&Kjo>$b-39+X*8e3.e1-d)<8#a#qL[&p"5=l0]l!i)%686%6LrUm;(:U1\@7''Ma(6+mt`C1%9h2nXr,=SWRRF3Uem#@-B:OIOl&40&4YNW\&>lU]1<L`9B:jf5hq`IWdLmZm,\H5F)ThEBf]0ZZ-9$WdLIDk95mK,hB:FYt2Y$8>OcYOe*@e<n;W*q88->ZtJ=qp=%n;,gWU&n(6@PER/LtKh_PsJ@Xkb('<]H[QPTm,G[[dCJ#*6g@;8%PNV*_qu,YhI.shXO4UIJ%q"7ScP]AK)HS"[.t1K=_=JWq7LUl4KW4XL[B76G]n>fu+3tpOWcZ%2"FS6;+g;!,mkj.m"dUuU"74D)]b0lWca@%`d&m<GF@HD\+)"C_RfgoImA0Wmn-Ktf;u[>Cc;Y9o!W5I-Q/HAtJVE<*3J`YjZGn9(OKc)s0QLE\/g8i4]>2i#,$(pSUr4KRCH+CbbLQJD.@&n,&[+L[JnPgWcu)5Y`JSSZ44N#WF-^nkcZk88&V&4C*1jAGBCT_:r*Jlh10]]>^3YlW,B0305Oqog$*LA=WqY>-krLqa>WdgE'^PV^R?A0MQpcb.O$^sQVWN=%KTl!K?J[j^N\\\U1/2J8aKZhDr6^5EDVf7(0io[9*RF@!`aA1HE-DIJ>4NS&\9F$=%n]5_ZBD?@\HicKr^SE;mH[9/aG?l2+p1XWZN;F&_$s/g:iVf]A;%HY"\juSbq;gT@_.4kbdnA-YU&fE61_lP5#]:`WQY_^RYUedeb;K`T+J#aa'<-25N4l@'D/DTS@@d1-PDX=Gk1[OI_:fnXLTRo%<QQfARhpr?pL"Pn7UWI*9S0YjucnF16tSLo4'ifCpSco=\uc)^B7`3_76qg!I'4;7f/s32oKLA*X[g,B/'%pC/Pnh1+>n\>>ui[*@$R]FcIBJ?>VMYAolQq%\)6rZ7V9PcLKn!NRGFEq35Z8&\FoESVuk-JrQS@K+$2B]d0rSCprNo>Vt).J-,+'qnijq=plfb["\-a5*9R%6i(K7Qo5*])94kh9(M*0%)*%*[8iYc,-GjW5_^,/iCd4-7/U30aPPr"Jr]jlM/_dRfYFM,mVF8CLCnX@f>QYQg_Qt0kDfiRnEmLhf-2e$0Jp$7,6ZeG5*ld.l+GsMrVJ3PaRD8m?+@j-n=p=;CW&2D9=d*>AJm(/L,>E1\Dct,YsI<L;ZV(e;c-'mqhIJD:'K?A`>3^\MCT"RoUs,>oK2Ss_riek)\^Fl0VQ5Z14]m)mlM1(r@OqJp[8V8':]Ds>@(-*49eJu.U9\nO)NDZF0S+t\jMNX=O^=j6/p\Fg&s^S;K4"oE$Z3J@W@@PR4cGWN=IZ45ESpQMRn#=Cn]njV@l4JPI]H@"DKPZ)+o5t'T6F\d*)V_h5]8re'7N42Aok\&O6(6F`q8*W_SkB7WOo;9&]Q6''"UTnkMWNQGO]]au^JAlXE;7quIh:$bru;2@Gek:t._SDm%D61F1I?;&J+M!.f2@if'd+Qq\[\+:KVrkXj"@L_FRP@\mT^66aSFohCKUWL-U:I'K4fO/Jl-_*Xu`,a2>A78mtB;M>.AMD^Uj"0"PA<EZTAQE>CQU7B#T*mDj&?/mnH,,pAs%>7kM'/:nB_:YVX.b''3B>npDf\MBL9_K54:,"_CnSn<MYEsI^bM1/#Oo4#Qg7*dler7+TWpjNA&"HR`%urm,><^tdDbg+cf&X!RS(m\lm6_+JFJ0u`[\fK6"HMg:Ca+lO,5eBTjA0QkP0mXk>lphT'ao.5hf?L7b3f"2h^*76PB:ouY9nSQX1NmD+!itj"p6DrI=r#+M4im2W.qh.!QkGh>?]m!%m*+*a0f8KD?DZq*,'lgAEkIh<3pJCB\_-#rV>\"OGR$Im81F(g)4eo`Q^&SDssaLO*%_+bVH/TG(6OV[nmTG];;q"#'I2tUPY8%OWi2ZWa%F@@?iM<&p>u#1QYd@e(B#bOB/@&VSAEuW&,VS]cdi#Ah#nGNLEcS<NQY'.02`#7912$XgDe]7>L/3NM[^)hEF6'VE)[UF``<?<QpL=[E_uaeU/qoL]iigjA77HAQC`BEFoY>?S#k+dN$"BK+d4sRj[@B34L`SI"fS;BoSo%Kj]R)%\\WGkh>GID_VnO]8UN;[[k,Upb>bHiS,aD=/Lk>X1BZb2k(,;73,q7-HJN)!I0NqVRNXO/6K$QH-#"-$^iJcoCXN-erJ?/3_ck`Y>&>qVX2Pmp-r)H\eps?"HOeOK@Q_&\aBKV:p:Y2;k9qq$K4%20oZ&qUa9nDL753^el`=@-V[4])KI)J6%iSCibra)dKgu''c0u?o;7nRQnaeE8Ubm5fs!Ybo+ErUF*+S;Pa8"B8kV-4=!gnu#WtT7[(;b]HF]5;:p#?:Jk1\g[boe9l;If=`7H5ANrB*ZT5cJOj3u8[Jq<ba/B_K7l@9H9/=()-`@dB++(ChFUtfL,AVNL%dn<LCWu`MN@/E[V&JTl45dkl(%)`)N,H#_!Wa8*UiJLQ5V+sOSV2g^I`L[W&'/:;7N!#%\DS918!o)(;.T&2&08mU56N~>endstream
endobj endobj
10 0 obj 10 0 obj
<< <<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2779 /Filter [ /ASCII85Decode /FlateDecode ] /Length 2700
>> >>
stream 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 Gb!TY>C5)6(5D;L/(R^EAl!An2GC:[8QquO23?MgU,TrT5uZJ-82^eSIP8e[aFUp>nhcgm:BRj*Q9MGDY(Q+lNB`I!*G5@B@lQSn^i<eQK&^'!N6gEm]_BaDZQ/3uQL@3%"]c2o8+;IScH,6Vo3pC$fR<D>qBC.a#Hj,5<WM.g*)DV[4E[?q&#<Sn[aPU)I!#P+LG.JdlNMMRfH4*^+_1oJi0Y9b/2EZ\E0="":9".#`dbo$htkcnnRm8q5O^8N`A_B=QL"3K-NqUKs1n3k^[$$DVs!Bfl","hX7EjuMf>'jm(9]A_\^o6!T,o^`B,#+<YP<,E'g.Yde-X=Y1Dsm]rpaT(&3e&4eC/$1Ta]e<i_hErhq)?bub!V)UEH?`KX6-?'0F7G-m^RrM<_9ZhVd.[@F2P&_Has03Tf\47`PApV/[bA7gSFg-0Cq7aA[rFffs[N8<im':,![T-c7eKU4J;Glj.l"HOu8+pA$H/gc6=asepeOfB,+a@)jITq'B,>_!M%;79%3p,pOTFifX]RH?i0@^T0-n@=jGaQ/XXH2pR5Ac5@7@!O5Y.V0?]Q))3[Wi1MKM@<+W9)M+5r"e[eXn"p:h7'lp)HVcAPu:Qp:=W$oP3#W`86un2N+Rp&.h*k(16I2mW01bkR?4)-#SRB,k%qYAmaC/[5GE-7oN(,Lj##U"g9&S%&pi%"BMS,cf%=Cc,<60f^RW5;Dae.4-V,6Rd7VDkPIR7/[3E_]`![DZ3G3=^O@.@IICcN25=%O0g.BtgnVF5e5YnmN)lNjp76[UW+n;[$AOPQ$#>5?SgmKt+iB1u*3T9CiV-aq,TlPj_$&_H89*gfJO8T+@N62Rh(s<2^4OXD2G_p)Lk]d<Nk*SOV5tias;+8><MR@54D^A*(MdDN"+#/_l$)_bl%9n9E=J?!N:@BRG&p/bm"3W!gE/r<^qW3[b')*B0?m85aB3KI<#^a/oQAnSAc<CXmcr#<Gm/nA]r_p)='EobJ!i7*2"'Nd#nX%1QZa)_M%a^_hSgNXar_q<:<$f9D4KlP:K,X86$dg+hkCD9>3[Mrt,/hE=e5;JV:"qMq]A'=D"g:IVCE5h8I]nru?Or0)"cheZ^u9Sm#EHP%_m3sC-P^7`%(CF*EGO<>4*jQX_!"<:($"C2_]YHq-C<<f@:n@j/!f,:SBb5qaZYji_m)b:pbBl]M4_[HW=9u!ceX#">Y-tHQ9Ii,N,fGE+-^@hU&M1]X>@bf>bD#0*7"#-:Cq)_/e!6^+^D^Lg*%Z@DJ\!<@>BVWFaa)Ka^@5GS'hXaGZd,Dl[`XAo]:'7K!61Xe8rS5\*9`Ck)uWE1KHP?>tOQF`iE,l]I%)l*aZk*rPQ#eN;sc;rF+$+gV)C$cO^imU(Z@((d7[phH!JMY5O6N*mitT$8*q9R["JTBhKE%ml"EGFG2t,3c6V/R&J\+T`=rlSqgF+iQrM,I?TYo5e_NHL#fu(I6!JR,.?JK_6@3V`D"@kMF@a'lX>[0Y9s,76S,s!Zq^M!3\umq:*qRTL9g/0kDqIQJ`u5<Y;;W;QFB20h.X5^N'sF=1O[O]bpM9G1UZAn`Xm4nQE!+3IC4nK]n(XtT;0Sf:*NQ"*&'8`81@Fe@B/6rTp?tUENlOK:?RH04C6N[4N$)RpL*=V8iW(^k`c1uc]*T?(J/BHmY,SPdFuX&fTA#0e9e&em:HX53YbR1=!cR(B0o9.f'$(pSFZE)d]f^RER5%K-Dcfnq1iRY[cis6gK"XZ2pcA('br'#B'm0VRT=)d+!aF_[Xm=Y0[48kUQkn#02S<i`a?,(dqS4En7A6R>0/42LALIFX*36eY+GNZ:"MF<I`-B$+eMH`4OHPI,Z\ssUZ^=>_#OEM.6Zht]<EmGY`>-46>;ohfPdEI)g4&f[HlUZiXTFX<?VQ7%;a(ec[G?uI&\[email protected]#:1nFA5_ca5mB*=Gp:!pC24T:Gm&GOg@qV;oiXTr6Z)>?irY!E)W-oj&;5*2JJmEODXr=f"^Ds3n<UU$s-0'2.m&0Ed#U^A!i03K]jEp:JNmH!3s6_X%*T.W03AY4?]if%"&CrIPGF0?(5qEoDHF70Y;o5N+Wfq$g.H=oa'1T9Sd(U-V4Nff;ESN9UfP(6Y"`W?gd03D)<Sn<#mkcc.]V^I00r3isP)b"5)qg%VCGV4jf&h/\ir@5c$;I2Ap;7I*<kL'g)Y0@cNA4Rok]aqfkCXR(chBKT=N_cMrQ0/>Aq*%&7bJND\!q7[VJ?"BE9@NXWek3n61;FB])HbY$WAQ.$+ahnGPTn39HN`+^PP)9.P-Pc>9@UkE`=b.MXfkXK5`(F1BgO.Dcf;<Qua;<R06^PH^-7eGNg2VG[TXW9K9j.=^mFR2b_D[-11nFE;j:;O@abrfhY2G]gmmCB>n4kN!8U8tF;hSB1B1c23,]:RYo<lMt_HZtLZ]d;sRY?iD;Bpd-II4Opef!c[i8sa4Y((<Ts<Oja=hDI60d*W)MF,Jr*`6u@t,%_*RXFQ?$A$dh(3;+:>JPheD4RBsVVc0P?mo[aCF.IV0CY?:dBnfpCM3o?,`<k[-8Sb`go3^76T!-T3C=%2SJq$`r1_e57\J/\!k+%fBk1\TRriS>9os9h;-dp<%.K>momU.A@qn!RHCQI(s4RMaf;bpmST@?sJp?t]fh'OLj&?3JaWK-FOh6,5^Z/!c-rh5)<.a>X+h+L1FmscnqLjf~>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 endobj
xref xref
0 13 0 11
0000000000 65535 f 0000000000 65535 f
0000000073 00000 n 0000000061 00000 n
0000000114 00000 n 0000000102 00000 n
0000000221 00000 n 0000000209 00000 n
0000000333 00000 n 0000000321 00000 n
0000000527 00000 n 0000000514 00000 n
0000000721 00000 n 0000000708 00000 n
0000000915 00000 n 0000000776 00000 n
0000000983 00000 n 0000001056 00000 n
0000001279 00000 n 0000001121 00000 n
0000001350 00000 n 0000004086 00000 n
0000004221 00000 n
0000007185 00000 n
trailer trailer
<< <<
/ID /ID
[<e07209f969febd6b4750ac978e60af12><e07209f969febd6b4750ac978e60af12>] [<451d734656bfda21b00c95ac21a36c22><451d734656bfda21b00c95ac21a36c22>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com) % ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R /Info 7 0 R
/Root 7 0 R /Root 6 0 R
/Size 13 /Size 11
>> >>
startxref startxref
9769 6878
%%EOF %%EOF
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 KiB

+68 -68
View File
@@ -1,12 +1,12 @@
{ {
"nocName": "Ced's NOC", "nocName": "Ced's NOC",
"status": "2 System(s) Degraded", "status": "1 System(s) Degraded",
"lastUpdated": "2026-10-08T06:00:01Z", "lastUpdated": "2026-05-04T15:40:01Z",
"summary": { "summary": {
"nodes": "12+ Pi", "nodes": "12+ Pi",
"services": "26/28", "services": "27/28",
"vlans": 4, "vlans": 4,
"edgeSystems": 0 "edgeSystems": 2
}, },
"systems": [ "systems": [
{ {
@@ -17,8 +17,8 @@
"address": "10.10.30.250", "address": "10.10.30.250",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.1ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Proxmox \u2014 Biggie", "name": "Proxmox \u2014 Biggie",
@@ -28,8 +28,8 @@
"address": "10.10.30.192", "address": "10.10.30.192",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.0ms", "latency": "0.1ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Proxmox \u2014 Snoop", "name": "Proxmox \u2014 Snoop",
@@ -39,8 +39,8 @@
"address": "10.10.30.153", "address": "10.10.30.153",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.3ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Proxmox \u2014 TooShort", "name": "Proxmox \u2014 TooShort",
@@ -50,8 +50,8 @@
"address": "10.10.30.120", "address": "10.10.30.120",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.3ms", "latency": "0.7ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Proxmox \u2014 Tupac", "name": "Proxmox \u2014 Tupac",
@@ -61,8 +61,8 @@
"address": "10.10.30.74", "address": "10.10.30.74",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.1ms", "latency": "0.5ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Proxmox \u2014 DrDre", "name": "Proxmox \u2014 DrDre",
@@ -72,19 +72,8 @@
"address": "10.10.30.227", "address": "10.10.30.227",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 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.6ms",
"lastCheck": "2026-10-08 06:00 UTC"
}, },
{ {
"name": "K3s Control \u2014 django-1", "name": "K3s Control \u2014 django-1",
@@ -95,7 +84,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Control \u2014 django-2", "name": "K3s Control \u2014 django-2",
@@ -106,7 +95,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Control \u2014 django-3", "name": "K3s Control \u2014 django-3",
@@ -117,7 +106,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Ingress \u2014 node-1", "name": "K3s Ingress \u2014 node-1",
@@ -128,7 +117,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Ingress \u2014 node-2", "name": "K3s Ingress \u2014 node-2",
@@ -139,18 +128,18 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Ingress \u2014 node-3", "name": "K3s Ingress \u2014 node-3",
"type": "K3s Worker / Ingress", "type": "K3s Worker / Ingress",
"layer": "Orchestration", "layer": "Orchestration",
"label": "K3s", "label": "K3s",
"address": "10.10.30.222", "address": "10.10.222",
"status": "Online", "status": "Offline",
"severity": "Healthy", "severity": "Critical",
"latency": "0.3ms", "latency": "N/A",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Data \u2014 node-4", "name": "K3s Data \u2014 node-4",
@@ -160,8 +149,8 @@
"address": "10.10.30.126", "address": "10.10.30.126",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Data \u2014 node-5", "name": "K3s Data \u2014 node-5",
@@ -171,8 +160,8 @@
"address": "10.10.30.239", "address": "10.10.30.239",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.4ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Data \u2014 node-6", "name": "K3s Data \u2014 node-6",
@@ -182,8 +171,8 @@
"address": "10.10.30.208", "address": "10.10.30.208",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Monitor \u2014 node-7", "name": "K3s Monitor \u2014 node-7",
@@ -194,7 +183,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.3ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Monitor \u2014 node-8", "name": "K3s Monitor \u2014 node-8",
@@ -205,7 +194,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "K3s Monitor \u2014 node-9", "name": "K3s Monitor \u2014 node-9",
@@ -215,8 +204,8 @@
"address": "10.10.30.29", "address": "10.10.30.29",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.4ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "TrueNAS", "name": "TrueNAS",
@@ -226,8 +215,19 @@
"address": "10.10.30.143", "address": "10.10.30.143",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.4ms", "latency": "0.6ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Nginx Proxy Manager",
"type": "Reverse Proxy",
"layer": "Networking",
"label": "Access",
"address": "10.10.30.210",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Prometheus", "name": "Prometheus",
@@ -237,8 +237,8 @@
"address": "10.10.30.140", "address": "10.10.30.140",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.1ms", "latency": "0.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Grafana", "name": "Grafana",
@@ -248,8 +248,8 @@
"address": "10.10.30.68", "address": "10.10.30.68",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.1ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Uptime Kuma", "name": "Uptime Kuma",
@@ -260,7 +260,7 @@
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.3ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Dashy", "name": "Dashy",
@@ -270,8 +270,8 @@
"address": "10.10.30.61", "address": "10.10.30.61",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.4ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "Home Assistant", "name": "Home Assistant",
@@ -281,8 +281,8 @@
"address": "10.10.30.104", "address": "10.10.30.104",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.9ms", "latency": "0.6ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "PrimeStation", "name": "PrimeStation",
@@ -292,8 +292,8 @@
"address": "10.10.30.233", "address": "10.10.30.233",
"status": "Online", "status": "Online",
"severity": "Healthy", "severity": "Healthy",
"latency": "0.2ms", "latency": "0.3ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "APRS iGate \u2014 Home", "name": "APRS iGate \u2014 Home",
@@ -301,10 +301,10 @@
"layer": "Edge", "layer": "Edge",
"label": "RF", "label": "RF",
"address": "10.10.30.129", "address": "10.10.30.129",
"status": "Offline", "status": "Online",
"severity": "Degraded", "severity": "Healthy",
"latency": "N/A", "latency": "3.7ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
}, },
{ {
"name": "APRS iGate \u2014 Mobile", "name": "APRS iGate \u2014 Mobile",
@@ -312,10 +312,10 @@
"layer": "Edge", "layer": "Edge",
"label": "RF", "label": "RF",
"address": "10.10.30.35", "address": "10.10.30.35",
"status": "Offline", "status": "Online",
"severity": "Degraded", "severity": "Healthy",
"latency": "N/A", "latency": "47.2ms",
"lastCheck": "2026-10-08 06:00 UTC" "lastCheck": "2026-05-04 15:40 UTC"
} }
] ]
} }
+95 -127
View File
@@ -1,37 +1,22 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <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 charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Chase Dumphord | DevOps &amp; Cloud Infrastructure Engineer</title> <title>Chase Dumphord | Digital Systems & Infrastructure</title>
<meta <meta
name="description" 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 --> <!-- Open Graph for LinkedIn / Discord sharing -->
<meta property="og:title" content="Chase Dumphord | DevOps &amp; Cloud Infrastructure Engineer" /> <meta property="og:title" content="Chase Dumphord | Digital Systems & Infrastructure" />
<meta property="og:description" content="DevOps &amp; Cloud Infrastructure Engineer. 18 nodes. 28 services. Always running. Based in Oxford, MS." /> <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:type" content="website" />
<meta property="og:url" content="https://chasedumphord.com" /> <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) ── --> <!-- ── 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="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="16x16" href="assets/favicons/favicon-16x16.png" />
@@ -87,13 +72,14 @@
<div class="hero-text"> <div class="hero-text">
<p class="eyebrow"> <p class="eyebrow">
<span class="eyebrow-dot"></span> <span class="eyebrow-dot"></span>
DevOps • Platform Engineering • Cloud Infrastructure • Kubernetes • Observability Digital Systems • Infrastructure • Networking • Automation • Edge Systems
</p> </p>
<h1>I build systems that <span class="accent-word">connect</span> hardware, networks, and operations.</h1> <h1>I build systems that <span class="accent-word">connect</span> hardware, networks, and operations.</h1>
<p class="lead"> <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> </p>
<div class="hero-actions"> <div class="hero-actions">
@@ -108,11 +94,11 @@
<li>📍 Oxford, MS</li> <li>📍 Oxford, MS</li>
<li> <li>
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer"> <a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
github/ced4568 ⌥ github/ced4568
</a> </a>
</li> </li>
<li> <li>
<a href="mailto:[email protected]">[email protected]</a> <a href="mailto:[email protected]">✉ [email protected]</a>
</li> </li>
</ul> </ul>
@@ -160,16 +146,16 @@
<span class="terminal-title">ced's@homelab ~ $</span> <span class="terminal-title">ced's@homelab ~ $</span>
</div> </div>
<pre><code><span class="t-prompt">ced's@homelab:~$</span> whoami <pre><code><span class="t-prompt">ced's@homelab:~$</span> whoami
<span class="t-val">devops_engineer</span> <span class="t-val">systems_builder</span>
<span class="t-prompt">ced's@homelab:~$</span> uptime <span class="t-prompt">ced's@homelab:~$</span> uptime
<span class="t-val">18 nodes • 28 services • always_on</span> <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-prompt">ced's@homelab:~$</span> cat focus.txt
<span class="t-val">kubernetes <span class="t-val">infrastructure
devops networking
observability automation
cloud_infrastructure</span> rf_edge_systems</span>
<span class="t-prompt">ced's@homelab:~$</span> systemctl status life <span class="t-prompt">ced's@homelab:~$</span> systemctl status life
<span class="t-val">● building_real_systems.service</span> <span class="t-val">● building_real_systems.service</span>
@@ -192,14 +178,14 @@ cloud_infrastructure</span>
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-card"> <div class="stat-card">
<h3>18</h3> <h3>12+</h3>
<p>Nodes</p> <p>Nodes</p>
<span>6-node Proxmox VE • 12 node K3s</span> <span>K3s cluster • Raspberry Pi</span>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<h3>28+</h3> <h3>10+</h3>
<p>Services</p> <p>Services</p>
<span>Self-hosted production stack</span> <span>Self-hosted stack</span>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<h3>4</h3> <h3>4</h3>
@@ -271,7 +257,7 @@ cloud_infrastructure</span>
<!-- Fallback shown when data can't load --> <!-- Fallback shown when data can't load -->
<div id="noc-fallback" class="noc-fallback" style="display:none;"> <div id="noc-fallback" class="noc-fallback" style="display:none;">
<p class="noc-fallback-msg"> <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"> <a href="https://noc.chasedumphord.com" target="_blank" rel="noopener noreferrer">
View the live NOC dashboard → View the live NOC dashboard →
</a> </a>
@@ -285,35 +271,34 @@ cloud_infrastructure</span>
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">// about</p> <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>
<div class="content-grid"> <div class="content-grid">
<div class="card"> <div class="card">
<p> <p>
I'm a DevOps and Cloud Infrastructure Engineer focused on reliable delivery, container I'm a technical professional focused on digital systems, infrastructure, networking,
orchestration, and cloud native infrastructure built for production conditions. I run an automation, and hands-on system integration. I build things that are practical,
18 node environment every day consisting of a 6 node Proxmox VE hypervisor cluster and reliable, and well-documented — from homelab services and live dashboards to Raspberry Pi
a 12 node K3s Kubernetes cluster with Prometheus monitoring, Grafana dashboards, and deployments, APRS iGates, and complex troubleshooting workflows.
VLAN segmented networking. Not a lab. A production system.
</p> </p>
<p> <p>
I come from 10+ years in industrial digital systems at GE Aerospace and in the field My background blends field engineering, industrial technology, and infrastructure
as a Level III engineer on aerospace inspection equipment. I understand what production problem solving. Increasingly I'm integrating AI tooling — using LLMs for system
failure actually costs. That same operational discipline is what I bring to cloud native documentation, automated diagnostics, and workflow acceleration — as part of how
infrastructure. I don't simulate environments. I run them. modern infrastructure gets built and maintained.
</p> </p>
</div> </div>
<div class="card"> <div class="card">
<h3>Core Focus Areas</h3> <h3>Core Focus Areas</h3>
<ul class="clean-list"> <ul class="clean-list">
<li>Kubernetes orchestration and container infrastructure</li> <li>Digital systems and infrastructure engineering</li>
<li>DevOps automation and CI/CD pipeline workflows</li> <li>Linux systems and service management</li>
<li>Observability with Prometheus, Grafana, and alerting pipelines</li> <li>Networking, VLANs, failover, and connectivity troubleshooting</li>
<li>Cloud native infrastructure design and deployment</li> <li>Raspberry Pi and edge-device deployments</li>
<li>Networking, VLANs, reverse proxy, and Cloudflare edge configuration</li> <li>AI-assisted automation, documentation, and diagnostic workflows</li>
<li>AI assisted automation, documentation, and diagnostic workflows</li> <li>Documentation, process building, and reproducible project design</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -325,8 +310,8 @@ cloud_infrastructure</span>
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">// projects</p> <p class="section-label">// projects</p>
<h2>Infrastructure &amp; Systems Projects</h2> <h2>Infrastructure & Systems Projects</h2>
<p class="section-intro">Built on real systems. Not demos, not tutorials running infrastructure.</p> <p class="section-intro">Built on real systems. Not demos, not tutorials — running infrastructure.</p>
</div> </div>
<div class="projects-grid"> <div class="projects-grid">
@@ -343,7 +328,7 @@ cloud_infrastructure</span>
<ul class="clean-list"> <ul class="clean-list">
<li>Proxmox VE virtualization platform</li> <li>Proxmox VE virtualization platform</li>
<li>VLAN segmentation via UniFi (Main / IoT / HomeLab / Guest)</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> <li>Uptime Kuma + Grafana monitoring stack</li>
</ul> </ul>
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link"> <a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
@@ -358,12 +343,12 @@ cloud_infrastructure</span>
</div> </div>
<p class="tags">Kubernetes • Containers • Linux • Automation</p> <p class="tags">Kubernetes • Containers • Linux • Automation</p>
<p class="project-impact"> <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> </p>
<ul class="clean-list"> <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>Containerized workload deployment</li>
<li>Infrastructure automation via manifest driven configuration</li> <li>Infrastructure automation via manifest-driven configuration</li>
</ul> </ul>
<a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link"> <a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
View on GitHub → View on GitHub →
@@ -377,7 +362,7 @@ cloud_infrastructure</span>
</div> </div>
<p class="tags">RF • Linux • Raspberry Pi • APRS-IS • Edge Systems</p> <p class="tags">RF • Linux • Raspberry Pi • APRS-IS • Edge Systems</p>
<p class="project-impact"> <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> </p>
<ul class="clean-list"> <ul class="clean-list">
<li>Direwolf APRS TNC with tuned audio chain (target: 50–60 level)</li> <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> <p class="section-label">// noc roadmap</p>
<h2>Ced's NOC Vision</h2> <h2>Ced's NOC Vision</h2>
<p class="section-intro"> <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> </p>
</div> </div>
@@ -410,24 +395,24 @@ cloud_infrastructure</span>
<div class="noc-card-badge done">✅ Live</div> <div class="noc-card-badge done">✅ Live</div>
<h3>Portfolio NOC</h3> <h3>Portfolio NOC</h3>
<p> <p>
JSON driven dashboard showing real inventory, online/offline checks, service labels, JSON-driven dashboard showing real inventory, online/offline checks, service labels,
latency, and last check timestamps across 18 nodes and 28 services. latency, and last-check timestamps.
</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.
</p> </p>
</div> </div>
<div class="noc-card"> <div class="noc-card">
<div class="noc-card-badge next">⚙️ Next</div> <div class="noc-card-badge next">⚙️ Next</div>
<h3>Automated Incident Response</h3> <h3>Automated Data Updates</h3>
<p> <p>
AI assisted ops automation using n8n, Telegram bots, and OpenRouter integrated with Scheduled local scripts will auto-refresh system status and push dashboard-ready
Prometheus alerting for automated triage and remediation workflows. 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> </p>
</div> </div>
</div> </div>
@@ -442,7 +427,7 @@ cloud_infrastructure</span>
> >
<span class="btn-dot"></span> View Live NOC Dashboard <span class="btn-dot"></span> View Live NOC Dashboard
</a> </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>
</div> </div>
</section> </section>
@@ -452,7 +437,7 @@ cloud_infrastructure</span>
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">// tech stack</p> <p class="section-label">// tech stack</p>
<h2>Tools &amp; Technologies</h2> <h2>Tools & Technologies</h2>
</div> </div>
<div class="stack-groups"> <div class="stack-groups">
@@ -464,20 +449,17 @@ cloud_infrastructure</span>
<span class="stack-pill">K3s</span> <span class="stack-pill">K3s</span>
<span class="stack-pill">Docker</span> <span class="stack-pill">Docker</span>
<span class="stack-pill">TrueNAS</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">Nginx Proxy Manager</span>
<span class="stack-pill">Cloudflare Tunnels</span> <span class="stack-pill">Cloudflare Tunnels</span>
</div> </div>
</div> </div>
<div class="stack-group"> <div class="stack-group">
<h4 class="stack-group-label">Monitoring &amp; Observability</h4> <h4 class="stack-group-label">Monitoring & Observability</h4>
<div class="stack-pills"> <div class="stack-pills">
<span class="stack-pill">Grafana</span> <span class="stack-pill">Grafana</span>
<span class="stack-pill">Prometheus</span> <span class="stack-pill">Prometheus</span>
<span class="stack-pill">Uptime Kuma</span> <span class="stack-pill">Uptime Kuma</span>
<span class="stack-pill">Alerting Pipelines</span>
<span class="stack-pill">Custom NOC Dashboard</span> <span class="stack-pill">Custom NOC Dashboard</span>
</div> </div>
</div> </div>
@@ -487,23 +469,13 @@ cloud_infrastructure</span>
<div class="stack-pills"> <div class="stack-pills">
<span class="stack-pill">UniFi</span> <span class="stack-pill">UniFi</span>
<span class="stack-pill">VLAN Segmentation</span> <span class="stack-pill">VLAN Segmentation</span>
<span class="stack-pill">Nginx</span> <span class="stack-pill">pfSense</span>
<span class="stack-pill">Traefik</span>
<span class="stack-pill">Cloudflare DNS</span> <span class="stack-pill">Cloudflare DNS</span>
</div> </div>
</div> </div>
<div class="stack-group"> <div class="stack-group">
<h4 class="stack-group-label">GitOps &amp; CI/CD</h4> <h4 class="stack-group-label">RF & Edge</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 &amp; Edge</h4>
<div class="stack-pills"> <div class="stack-pills">
<span class="stack-pill">Direwolf</span> <span class="stack-pill">Direwolf</span>
<span class="stack-pill">APRS-IS</span> <span class="stack-pill">APRS-IS</span>
@@ -525,18 +497,13 @@ cloud_infrastructure</span>
</div> </div>
<div class="stack-group"> <div class="stack-group">
<h4 class="stack-group-label">AI &amp; Automation</h4> <h4 class="stack-group-label">AI & Automation</h4>
<div class="stack-pills"> <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">Claude (Anthropic)</span>
<span class="stack-pill">ChatGPT</span> <span class="stack-pill">ChatGPT</span>
<span class="stack-pill">Gemini</span> <span class="stack-pill">LLM-assisted Documentation</span>
<span class="stack-pill">Hermes Agent</span> <span class="stack-pill">AI-driven Diagnostics</span>
<span class="stack-pill">Crew AI Agent</span> <span class="stack-pill">Prompt Engineering</span>
<span class="stack-pill">LLM assisted Documentation</span>
<span class="stack-pill">AI driven Diagnostics</span>
</div> </div>
</div> </div>
@@ -549,7 +516,7 @@ cloud_infrastructure</span>
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">// resume snapshot</p> <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>
<div class="resume-grid"> <div class="resume-grid">
@@ -557,26 +524,28 @@ cloud_infrastructure</span>
<div class="card resume-card"> <div class="card resume-card">
<h3>What I Bring</h3> <h3>What I Bring</h3>
<ul class="clean-list"> <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>Industrial and field-service technical background — hands-on problem solving under real constraints</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>Linux systems administration — service management, troubleshooting, automation</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>Networking depth — VLANs, DNS, reverse proxy, firewall config, failover design</li>
<li>Infrastructure-as-documentation mindset where everything built gets written up with runbooks, architecture decisions, and SOPs</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> </ul>
</div> </div>
<div class="card resume-card"> <div class="card resume-card">
<h3>Target Roles</h3> <h3>Target Roles</h3>
<ul class="clean-list"> <ul class="clean-list">
<li>DevOps Engineer</li> <li>Systems / Infrastructure Engineer</li>
<li>Platform Engineer</li> <li>NOC Technician / Network Operations</li>
<li>Cloud Infrastructure Engineer</li> <li>Linux Systems Administrator</li>
<li>Site Reliability Engineer</li> <li>Technical Operations / IT Infrastructure</li>
<li>Infrastructure Architect</li> <li>Edge Systems / Field Technical Roles</li>
</ul> </ul>
<div class="resume-note"> <div class="resume-note">
<p> <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> </p>
</div> </div>
</div> </div>
@@ -585,20 +554,20 @@ cloud_infrastructure</span>
<h3>Currently Learning / Building Toward</h3> <h3>Currently Learning / Building Toward</h3>
<div class="learning-grid"> <div class="learning-grid">
<div class="learning-item"> <div class="learning-item">
<span class="learning-icon">☸️</span> <span class="learning-icon">📈</span>
<span>Advanced Kubernetes patterns including GitOps with FluxCD, Helm chart authoring, and ArgoCD</span> <span>Grafana + Prometheus full observability stack</span>
</div> </div>
<div class="learning-item"> <div class="learning-item">
<span class="learning-icon">🏗️</span> <span class="learning-icon">☸️</span>
<span>Terraform infrastructure as code for cloud provisioning and repeatable environment builds</span> <span>Kubernetes production patterns (GitOps, Helm, ArgoCD)</span>
</div> </div>
<div class="learning-item"> <div class="learning-item">
<span class="learning-icon">🔐</span> <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>
<div class="learning-item"> <div class="learning-item">
<span class="learning-icon">📊</span> <span class="learning-icon">📡</span>
<span>OpenTelemetry integration and distributed tracing across the K3s cluster</span> <span>Mobile APRS iGate deployment</span>
</div> </div>
</div> </div>
</div> </div>
@@ -614,7 +583,7 @@ cloud_infrastructure</span>
> >
↓ Download Resume (PDF) ↓ Download Resume (PDF)
</a> </a>
<span class="resume-download-note">Updated 2026 • PDF format</span> <span class="resume-download-note">Updated 2025 • PDF format</span>
</div> </div>
</div> </div>
@@ -628,7 +597,7 @@ cloud_infrastructure</span>
<p class="section-label">// github</p> <p class="section-label">// github</p>
<h2>Pinned Repositories</h2> <h2>Pinned Repositories</h2>
<p class="section-intro"> <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> </p>
</div> </div>
@@ -666,10 +635,9 @@ cloud_infrastructure</span>
<p class="section-label">// personal</p> <p class="section-label">// personal</p>
<h2>Technical, curious, and always building</h2> <h2>Technical, curious, and always building</h2>
<p> <p>
Outside of work I'm into electronics, self hosting, coding, drones, and ham radio. Outside of work I'm into electronics, self-hosting, coding, drones, ham radio, and
I'm a licensed amateur radio operator running a dual node APRS RF iGate with a hands-on projects that force me to learn something real. Ball pythons and dogs round
verified uplink on aprs.fi. Kobe the Boston Terrier keeps the home lab grounded. out the home lab. That curiosity carries directly into how I build and document systems.
That curiosity carries directly into how I build and document systems.
</p> </p>
</div> </div>
</div> </div>
@@ -695,10 +663,10 @@ cloud_infrastructure</span>
<div class="card"> <div class="card">
<h3>Open To</h3> <h3>Open To</h3>
<ul class="clean-list"> <ul class="clean-list">
<li>DevOps Engineer and Platform Engineer roles</li> <li>Digital systems and infrastructure roles</li>
<li>Cloud Infrastructure and SRE positions</li> <li>Networking and technical operations</li>
<li>Remote and hybrid opportunities</li> <li>Automation and monitoring projects</li>
<li>Consulting and infrastructure projects through Synthos Systems</li> <li>Hardware + software integration work</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -717,4 +685,4 @@ cloud_infrastructure</span>
<script src="script.js"></script> <script src="script.js"></script>
</body> </body>
</html> </html>
+29 -90
View File
@@ -1,22 +1,3 @@
<!--
╔══════════════════════════════════════════════════════════════════════╗
║ 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> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@@ -27,19 +8,14 @@
<meta <meta
name="description" 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="Ced's NOC — live network operations center dashboard showing real-time infrastructure health, service status, and edge system monitoring."
/> />
<!-- Open Graph --> <!-- Open Graph -->
<meta property="og:title" content="Ced's NOC | Live Systems Dashboard" /> <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:description" content="Live infrastructure visibility — Proxmox, K3s, TrueNAS, APRS edge systems." />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://noc.chasedumphord.com" /> <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/) --> <!-- 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="32x32" href="../assets/favicons/favicon-32x32.png" />
@@ -210,23 +186,19 @@
<body> <body>
<!-- ══════════════════════════════════════════════════════════════════════ NAV <!-- ═══════════════════════════════ 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"> <header class="site-header">
<div class="container nav"> <div class="container nav">
<a href="https://chasedumphord.com" class="logo">Ced<span class="logo-cursor">_</span></a> <a href="https://chasedumphord.com" class="logo">Ced<span class="logo-cursor">_</span></a>
<nav> <nav>
<ul class="nav-links"> <ul class="nav-links">
<li><a href="#top">Dashboard</a></li> <li><a href="https://chasedumphord.com/#snapshot">Snapshot</a></li>
<li><a href="#layer-tabs">Systems</a></li> <li><a href="https://chasedumphord.com/#about">About</a></li>
<li><a href="https://chasedumphord.com">← Portfolio</a></li> <li><a href="https://chasedumphord.com/#projects">Projects</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/#stack">Stack</a></li>
<li><a href="https://chasedumphord.com/#contact">Contact</a></li> <li><a href="https://chasedumphord.com/#contact">Contact</a></li>
<li><a href="https://chasedumphord.com/assets/images/ChaseD_Resume.pdf" target="_blank" rel="noopener noreferrer">Resume</a></li>
</ul> </ul>
</nav> </nav>
</div> </div>
@@ -234,12 +206,7 @@
<main id="top"> <main id="top">
<!-- ══════════════════════════════════════════════════════════════════════ NOC HERO <!-- ═══════════════════════════════ 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="noc-page-hero">
<div class="container"> <div class="container">
<p class="eyebrow"> <p class="eyebrow">
@@ -252,9 +219,9 @@
</h1> </h1>
<p class="noc-page-lead"> <p class="noc-page-lead">
Real time visibility into Ced's HomeLab infrastructure across 18 nodes and 28 services Real-time visibility into Ced's HomeLab infrastructure — Proxmox, K3s,
Proxmox, K3s, TrueNAS, APRS RF edge systems, and self-hosted services. 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. Not simulated. Not a demo. Running hardware.
</p> </p>
<ul class="noc-page-meta"> <ul class="noc-page-meta">
@@ -265,19 +232,7 @@
</div> </div>
</div> </div>
<!-- ══════════════════════════════════════════════════════════════════════ NOC DASHBOARD <!-- ═══════════════════════════════ 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"> <div class="noc-full">
<div class="container"> <div class="container">
@@ -337,7 +292,7 @@
<!-- Fallback --> <!-- Fallback -->
<div id="noc-fallback" class="noc-fallback" style="display:none;"> <div id="noc-fallback" class="noc-fallback" style="display:none;">
<p class="noc-fallback-msg"> <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/>
Data updates when the local pipeline pushes a fresh noc-status.json. Data updates when the local pipeline pushes a fresh noc-status.json.
</p> </p>
</div> </div>
@@ -345,7 +300,7 @@
<!-- Stack info bar --> <!-- Stack info bar -->
<div class="noc-stack-bar"> <div class="noc-stack-bar">
<span><strong>Stack:</strong> Python health checks → JSON → JS dashboard</span> <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>Next:</strong> Grafana + Prometheus integration</span>
<span><strong>Source:</strong> <span><strong>Source:</strong>
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer"> <a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer">
github/ceds-homelab github/ceds-homelab
@@ -364,23 +319,23 @@
<h3>Portfolio NOC</h3> <h3>Portfolio NOC</h3>
<p> <p>
JSON-driven dashboard showing real inventory, online/offline checks, JSON-driven dashboard showing real inventory, online/offline checks,
service labels, latency, and last check timestamps across 18 nodes and 28 services. service labels, latency, and last-check timestamps.
</p> </p>
</div> </div>
<div class="noc-card"> <div class="noc-card">
<div class="noc-card-badge done">✅ Live</div> <div class="noc-card-badge next">⚙️ Next</div>
<h3>Automated Data Updates</h3> <h3>Automated Data Updates</h3>
<p> <p>
Cron-driven scripts running on Biggie auto-refresh system status every 5 minutes Scheduled scripts auto-refresh system status and push dashboard-ready
and push dashboard ready JSON to GitHub Pages with no manual updates required. JSON on a cron interval — no manual updates.
</p> </p>
</div> </div>
<div class="noc-card"> <div class="noc-card">
<div class="noc-card-badge done">✅ Live</div> <div class="noc-card-badge future">📈 Future</div>
<h3>Grafana + Prometheus</h3> <h3>Grafana + Prometheus</h3>
<p> <p>
Full observability stack running across Proxmox, TrueNAS, K3s nodes, Uptime Kuma, Full observability stack for Proxmox, TrueNAS, K3s, Raspberry Pi,
and APRS edge systems with real time metrics ingestion and live alerting pipelines. Uptime Kuma, and APRS edge systems with real-time metrics.
</p> </p>
</div> </div>
</div> </div>
@@ -391,9 +346,7 @@
</main> </main>
<!-- ══════════════════════════════════════════════════════════════════════ FOOTER <!-- ═══════════════════════════════ FOOTER ═══════════════════════════════ -->
Minimal single-row footer: copyright (year injected by data-year JS) + back-to-top link.
══════════════════════════════════════════════════════════════════════════ -->
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-content"> <div class="container footer-content">
<p>© <span data-year></span> Chase Dumphord — <span class="footer-mono">noc.chasedumphord.com</span></p> <p>© <span data-year></span> Chase Dumphord — <span class="footer-mono">noc.chasedumphord.com</span></p>
@@ -401,28 +354,25 @@
</div> </div>
</footer> </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) --> <!-- Shared script (up one level) -->
<script src="../script.js"></script> <script src="../script.js"></script>
<!-- NOC page extras — layer filter tabs + uptime pills --> <!-- NOC page extras — layer filter tabs + uptime pills -->
<script> <script>
// ── Layer filter tabs ────────────────────────────────────────── // ── Layer filter tabs ──────────────────────────────────────────
// Populated after NOC data loads. Filters the system grid by layer.
let allSystems = []; let allSystems = [];
let activeLayer = "all";
const originalLoad = window.loadNocStatus;
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
// Hook into data after the shared script loads it
const observer = new MutationObserver(() => { const observer = new MutationObserver(() => {
const cards = document.querySelectorAll(".noc-system-card"); const cards = document.querySelectorAll(".noc-system-card");
if (cards.length > 0) { if (cards.length > 0) {
buildLayerTabs(); buildLayerTabs();
buildUptimePills(); buildUptimePills();
reapplyFilter(); observer.disconnect();
} }
}); });
@@ -430,16 +380,6 @@
if (grid) observer.observe(grid, { childList: true }); 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() { function buildLayerTabs() {
const cards = document.querySelectorAll(".noc-system-card"); const cards = document.querySelectorAll(".noc-system-card");
const layers = new Set(["all"]); const layers = new Set(["all"]);
@@ -454,7 +394,7 @@
layers.forEach(layer => { layers.forEach(layer => {
const btn = document.createElement("button"); const btn = document.createElement("button");
btn.className = "layer-tab" + (layer === activeLayer ? " active" : ""); btn.className = "layer-tab" + (layer === "all" ? " active" : "");
btn.dataset.layer = layer; btn.dataset.layer = layer;
btn.textContent = layer === "all" ? "All Systems" : layer; btn.textContent = layer === "all" ? "All Systems" : layer;
btn.addEventListener("click", () => filterByLayer(layer, btn)); btn.addEventListener("click", () => filterByLayer(layer, btn));
@@ -463,7 +403,6 @@
} }
function filterByLayer(layer, activeBtn) { function filterByLayer(layer, activeBtn) {
activeLayer = layer;
document.querySelectorAll(".layer-tab").forEach(t => t.classList.remove("active")); document.querySelectorAll(".layer-tab").forEach(t => t.classList.remove("active"));
activeBtn.classList.add("active"); activeBtn.classList.add("active");
+1 -1
View File
@@ -95,6 +95,7 @@ async function loadNocStatus() {
</div> </div>
<h3>${system.name}</h3> <h3>${system.name}</h3>
<p>${system.type}</p> <p>${system.type}</p>
<code>${system.address}</code>
<div class="system-meta"> <div class="system-meta">
<small>Status: ${system.status}</small> <small>Status: ${system.status}</small>
<small>Latency: ${system.latency || "N/A"}</small> <small>Latency: ${system.latency || "N/A"}</small>
@@ -235,7 +236,6 @@ async function loadGithubRepos() {
} }
} }
} }
// Build the alert panel from system data // Build the alert panel from system data
function renderAlerts(systems, alertList) { function renderAlerts(systems, alertList) {
const scored = systems const scored = systems
+9 -9
View File
@@ -12,7 +12,7 @@ SYSTEMS = [
"type": "Virtualization Platform", "type": "Virtualization Platform",
"host": "10.10.30.250", "host": "10.10.30.250",
"port": 8006, "port": 8006,
"display_name": "BigWorld", "address": "10.10.30.250:8006",
"layer": "Core Infrastructure", "layer": "Core Infrastructure",
"label": "Hypervisor" "label": "Hypervisor"
}, },
@@ -21,7 +21,7 @@ SYSTEMS = [
"type": "Storage Platform", "type": "Storage Platform",
"host": "10.10.30.143", "host": "10.10.30.143",
"port": 80, "port": 80,
"display_name": "TrueNAS", "address": "10.10.30.143",
"layer": "Storage", "layer": "Storage",
"label": "NAS" "label": "NAS"
}, },
@@ -30,7 +30,7 @@ SYSTEMS = [
"type": "Reverse Proxy", "type": "Reverse Proxy",
"host": "10.10.30.210", "host": "10.10.30.210",
"port": 81, "port": 81,
"display_name": "NPM", "address": "10.10.30.210:81",
"layer": "Access Layer", "layer": "Access Layer",
"label": "Proxy" "label": "Proxy"
}, },
@@ -39,7 +39,7 @@ SYSTEMS = [
"type": "Service Dashboard", "type": "Service Dashboard",
"host": "10.10.30.61", "host": "10.10.30.61",
"port": 4000, "port": 4000,
"display_name": "Dashy", "address": "10.10.30.61:4000",
"layer": "Dashboard", "layer": "Dashboard",
"label": "Portal" "label": "Portal"
}, },
@@ -48,7 +48,7 @@ SYSTEMS = [
"type": "Media Service", "type": "Media Service",
"host": "10.10.30.143", "host": "10.10.30.143",
"port": 30013, "port": 30013,
"display_name": "PrimeStation", "address": "10.10.30.143:30013",
"layer": "Application Service", "layer": "Application Service",
"label": "App" "label": "App"
}, },
@@ -57,7 +57,7 @@ SYSTEMS = [
"type": "Kubernetes API", "type": "Kubernetes API",
"host": "10.10.30.72", "host": "10.10.30.72",
"port": 6443, "port": 6443,
"display_name": "k3s-django-1", "address": "10.10.30.72:6443",
"layer": "Compute Cluster", "layer": "Compute Cluster",
"label": "Cluster" "label": "Cluster"
}, },
@@ -66,7 +66,7 @@ SYSTEMS = [
"type": "RF Edge Gateway", "type": "RF Edge Gateway",
"host": "10.10.30.129", "host": "10.10.30.129",
"port": 8001, "port": 8001,
"display_name": "KJ5JCO-10 iGate", "address": "KJ5JCO-10 / Direwolf KISS 8001",
"layer": "Edge / RF", "layer": "Edge / RF",
"label": "iGate" "label": "iGate"
}, },
@@ -75,7 +75,7 @@ SYSTEMS = [
"type": "APRS Internet Service", "type": "APRS Internet Service",
"host": "noam.aprs2.net", "host": "noam.aprs2.net",
"port": 14580, "port": 14580,
"display_name": "noam.aprs2.net", "address": "noam.aprs2.net:14580",
"layer": "Edge / RF", "layer": "Edge / RF",
"label": "External" "label": "External"
} }
@@ -141,7 +141,7 @@ def main():
systems.append({ systems.append({
"name": system["name"], "name": system["name"],
"type": system["type"], "type": system["type"],
"address": system["display_name"], "address": system["address"],
"status": status, "status": status,
"severity": severity_from_status(online, latency), "severity": severity_from_status(online, latency),
"layer": system["layer"], "layer": system["layer"],