Personalize portfolio and add technical case studies
This commit is contained in:
@@ -17,6 +17,15 @@ configMapGenerator:
|
||||
- name: portfolio-site
|
||||
files:
|
||||
- index.html=site/index.html
|
||||
- resume.html=site/resume.html
|
||||
- kubernetes.html=site/kubernetes.html
|
||||
- microsoft.html=site/microsoft.html
|
||||
- automation.html=site/automation.html
|
||||
- observability.html=site/observability.html
|
||||
- styles.css=site/styles.css
|
||||
- architecture.svg=site/architecture.svg
|
||||
- favicon.svg=site/favicon.svg
|
||||
- robots.txt=site/robots.txt
|
||||
- name: portfolio-nginx
|
||||
files:
|
||||
- default.conf=nginx/default.conf
|
||||
|
||||
@@ -6,6 +6,7 @@ server {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
server_tokens off;
|
||||
charset utf-8;
|
||||
|
||||
access_log /dev/stdout;
|
||||
error_log /dev/stderr warn;
|
||||
@@ -13,8 +14,11 @@ server {
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always;
|
||||
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Cross-Origin-Resource-Policy "same-origin" always;
|
||||
add_header X-Robots-Tag "noindex, nofollow" always;
|
||||
add_header Content-Security-Policy "default-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; script-src 'none'; connect-src 'none'; object-src 'none'; frame-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests" always;
|
||||
|
||||
location = /healthz {
|
||||
access_log off;
|
||||
@@ -22,7 +26,17 @@ server {
|
||||
return 200 "ok\n";
|
||||
}
|
||||
|
||||
location ~* \.(css|svg)$ {
|
||||
expires 7d;
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
location ~* \.html$ {
|
||||
expires -1;
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
try_files $uri $uri/ $uri.html /index.html;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 660" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Portfolio GitOps architecture</title>
|
||||
<desc id="desc">A Git repository flows through Argo CD and Kustomize into a restricted Kubernetes namespace, then through ingress and TLS to the browser. Security and observability controls surround the workload.</desc>
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#0f253d"/>
|
||||
<stop offset="1" stop-color="#081522"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0" stop-color="#65d4ff"/>
|
||||
<stop offset="1" stop-color="#79f2c0"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
||||
<feDropShadow dx="0" dy="12" stdDeviation="16" flood-color="#000" flood-opacity=".28"/>
|
||||
</filter>
|
||||
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
||||
<path d="M 0 0 L 10 5 L 0 10 z" fill="#65d4ff"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<rect width="1180" height="660" rx="30" fill="url(#bg)"/>
|
||||
<rect x="1" y="1" width="1178" height="658" rx="29" fill="none" stroke="#29445e"/>
|
||||
|
||||
<text x="60" y="68" fill="#eef7ff" font-family="Arial, sans-serif" font-size="30" font-weight="700">GitOps delivery path</text>
|
||||
<text x="60" y="102" fill="#a7bed2" font-family="Arial, sans-serif" font-size="17">The site architecture is part of the demonstration.</text>
|
||||
|
||||
<g filter="url(#shadow)" font-family="Arial, sans-serif">
|
||||
<g transform="translate(55 180)">
|
||||
<rect width="180" height="120" rx="20" fill="#102b45" stroke="#31506c"/>
|
||||
<text x="90" y="48" text-anchor="middle" fill="#79f2c0" font-size="17" font-weight="700">Git repository</text>
|
||||
<text x="90" y="76" text-anchor="middle" fill="#a7bed2" font-size="14">Desired state</text>
|
||||
<text x="90" y="97" text-anchor="middle" fill="#a7bed2" font-size="14">Reviewable changes</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(285 180)">
|
||||
<rect width="180" height="120" rx="20" fill="#102b45" stroke="#31506c"/>
|
||||
<text x="90" y="48" text-anchor="middle" fill="#65d4ff" font-size="17" font-weight="700">Argo CD</text>
|
||||
<text x="90" y="76" text-anchor="middle" fill="#a7bed2" font-size="14">Reconciliation</text>
|
||||
<text x="90" y="97" text-anchor="middle" fill="#a7bed2" font-size="14">Self-healing</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(515 180)">
|
||||
<rect width="180" height="120" rx="20" fill="#102b45" stroke="#31506c"/>
|
||||
<text x="90" y="48" text-anchor="middle" fill="#79f2c0" font-size="17" font-weight="700">Kustomize</text>
|
||||
<text x="90" y="76" text-anchor="middle" fill="#a7bed2" font-size="14">Manifest rendering</text>
|
||||
<text x="90" y="97" text-anchor="middle" fill="#a7bed2" font-size="14">ConfigMap hashes</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(745 160)">
|
||||
<rect width="200" height="160" rx="22" fill="#102b45" stroke="#4f7899"/>
|
||||
<text x="100" y="42" text-anchor="middle" fill="#65d4ff" font-size="17" font-weight="700">Kubernetes namespace</text>
|
||||
<text x="100" y="72" text-anchor="middle" fill="#eef7ff" font-size="16">2 web replicas</text>
|
||||
<text x="100" y="98" text-anchor="middle" fill="#a7bed2" font-size="14">Non-root · read-only</text>
|
||||
<text x="100" y="121" text-anchor="middle" fill="#a7bed2" font-size="14">No API token</text>
|
||||
<text x="100" y="144" text-anchor="middle" fill="#a7bed2" font-size="14">Default-deny network</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(995 180)">
|
||||
<rect width="130" height="120" rx="20" fill="#102b45" stroke="#31506c"/>
|
||||
<text x="65" y="44" text-anchor="middle" fill="#79f2c0" font-size="17" font-weight="700">Browser</text>
|
||||
<text x="65" y="73" text-anchor="middle" fill="#a7bed2" font-size="14">NGINX ingress</text>
|
||||
<text x="65" y="96" text-anchor="middle" fill="#a7bed2" font-size="14">TLS</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<g stroke="#65d4ff" stroke-width="3" fill="none" marker-end="url(#arrow)">
|
||||
<path d="M235 240 H275"/>
|
||||
<path d="M465 240 H505"/>
|
||||
<path d="M695 240 H735"/>
|
||||
<path d="M945 240 H985"/>
|
||||
</g>
|
||||
|
||||
<g font-family="Arial, sans-serif">
|
||||
<rect x="55" y="390" width="1070" height="190" rx="24" fill="#0a1a2a" stroke="#29445e"/>
|
||||
<text x="85" y="430" fill="#eef7ff" font-size="21" font-weight="700">Guardrails around the workload</text>
|
||||
|
||||
<g transform="translate(85 462)">
|
||||
<rect width="185" height="74" rx="15" fill="#10243a" stroke="#31506c"/>
|
||||
<text x="92.5" y="31" text-anchor="middle" fill="#65d4ff" font-size="15" font-weight="700">Pod Security</text>
|
||||
<text x="92.5" y="54" text-anchor="middle" fill="#a7bed2" font-size="13">Restricted v1.36</text>
|
||||
</g>
|
||||
<g transform="translate(295 462)">
|
||||
<rect width="185" height="74" rx="15" fill="#10243a" stroke="#31506c"/>
|
||||
<text x="92.5" y="31" text-anchor="middle" fill="#79f2c0" font-size="15" font-weight="700">NetworkPolicy</text>
|
||||
<text x="92.5" y="54" text-anchor="middle" fill="#a7bed2" font-size="13">Ingress only</text>
|
||||
</g>
|
||||
<g transform="translate(505 462)">
|
||||
<rect width="185" height="74" rx="15" fill="#10243a" stroke="#31506c"/>
|
||||
<text x="92.5" y="31" text-anchor="middle" fill="#65d4ff" font-size="15" font-weight="700">AppProject</text>
|
||||
<text x="92.5" y="54" text-anchor="middle" fill="#a7bed2" font-size="13">Namespace scoped</text>
|
||||
</g>
|
||||
<g transform="translate(715 462)">
|
||||
<rect width="185" height="74" rx="15" fill="#10243a" stroke="#31506c"/>
|
||||
<text x="92.5" y="31" text-anchor="middle" fill="#79f2c0" font-size="15" font-weight="700">Resource controls</text>
|
||||
<text x="92.5" y="54" text-anchor="middle" fill="#a7bed2" font-size="13">Quota · limits · PDB</text>
|
||||
</g>
|
||||
<g transform="translate(925 462)">
|
||||
<rect width="170" height="74" rx="15" fill="#10243a" stroke="#31506c"/>
|
||||
<text x="85" y="31" text-anchor="middle" fill="#65d4ff" font-size="15" font-weight="700">Observability</text>
|
||||
<text x="85" y="54" text-anchor="middle" fill="#a7bed2" font-size="13">Metrics · logs · alerts</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<rect x="55" y="612" width="1070" height="4" rx="2" fill="url(#accent)" opacity=".8"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1,27 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Case study: infrastructure automation using PowerShell, GitOps, Terraform, Ansible, Packer, Bash, and APIs.">
|
||||
<meta name="robots" content="noindex, nofollow"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="stylesheet" href="/styles.css">
|
||||
<title>Infrastructure Automation Case Study | Jay Phillips</title>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header"><nav class="nav shell" aria-label="Primary navigation"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true">JP</span><span>Jay Phillips</span></a><div class="nav-links"><a href="/">Home</a><a href="/#projects" aria-current="page">Projects</a><a href="/resume.html">Résumé</a><a href="mailto:Phillips-Jay@outlook.com">Contact</a></div></nav></header>
|
||||
<main id="main" class="shell">
|
||||
<div class="page-hero"><div class="breadcrumb"><a href="/">Home</a> / <a href="/#projects">Projects</a> / Automation</div><div class="eyebrow">Case study 03 · Repeatable operations</div><h1>Infrastructure <span>automation.</span></h1><p class="lead">Turning repetitive administration and hard-won troubleshooting knowledge into scripts, declarative configuration, version-controlled workflows, and reusable deployment patterns.</p></div>
|
||||
<div class="case-layout">
|
||||
<div class="case-content">
|
||||
<section class="case-section"><h2>PowerShell for enterprise administration</h2><p>PowerShell is the primary automation language for Windows and Active Directory work.</p><ul><li>Query and export computer and user data from Active Directory.</li><li>Normalize input files and enrich records with logon names, email, title, and department.</li><li>Automate group membership, local-account removal, firewall configuration, domain operations, and server inventory.</li><li>Install prerequisites for System Center products and validate server readiness.</li><li>Collect reboot history, health information, and deployment results from remote systems.</li></ul></section>
|
||||
<section class="case-section"><h2>GitOps as operational automation</h2><p>The Kubernetes environment treats Git as the desired state. Argo CD reconciles applications, reports drift, retries failures, prunes removed resources, and provides a visible deployment history.</p><ul><li>App-of-apps repository structure.</li><li>Kustomize-rendered application manifests.</li><li>Automated image digest updates for selected workloads.</li><li>Sealed Secrets for encrypted secret workflows.</li><li>Validation, commit, push, sync, rollout, and smoke tests packaged into complete Bash scripts.</li></ul></section>
|
||||
<section class="case-section"><h2>Infrastructure as code</h2><p>Terraform, Ansible, and Packer are used in the home lab to explore repeatable virtual-machine provisioning, configuration, and image creation. The objective is to move from manually assembled systems toward reproducible environments with clear inputs and versioned changes.</p></section>
|
||||
<section class="case-section"><h2>Design principles</h2><ul><li><strong>Safe defaults:</strong> scripts stop on errors, validate prerequisites, and avoid overwriting unknown state.</li><li><strong>Idempotence:</strong> repeated execution should converge or exit cleanly.</li><li><strong>Complete deliverables:</strong> full scripts and configuration files reduce copy-and-paste mistakes.</li><li><strong>Evidence:</strong> every automation ends with verification output rather than assuming success.</li><li><strong>Rollback:</strong> Git history and declarative state make changes reviewable and reversible.</li></ul></section>
|
||||
</div>
|
||||
<aside class="case-sidebar"><section class="panel"><h3>Automation stack</h3><dl class="fact-list"><div><dt>Windows</dt><dd>PowerShell</dd></div><div><dt>Linux</dt><dd>Bash</dd></div><div><dt>Provisioning</dt><dd>Terraform</dd></div><div><dt>Configuration</dt><dd>Ansible</dd></div><div><dt>Images</dt><dd>Packer</dd></div><div><dt>Delivery</dt><dd>Git + Argo CD</dd></div></dl></section><section class="panel"><h3>Focus</h3><div class="tags"><span class="tag">Repeatability</span><span class="tag">Validation</span><span class="tag">Least privilege</span><span class="tag">Version control</span><span class="tag">Rollback</span><span class="tag">Documentation</span></div></section></aside>
|
||||
</div>
|
||||
<section><div class="callout"><div><h2>See how the platform is observed.</h2><p>Continue with metrics, logs, uptime, and alert delivery.</p></div><a class="button primary" href="/observability.html">Observability case study</a></div></section>
|
||||
</main>
|
||||
<footer class="site-footer shell"><span>© 2026 Jay Phillips</span><span>Case study: infrastructure automation.</span></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="JP">
|
||||
<defs>
|
||||
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#65d4ff"/>
|
||||
<stop offset="1" stop-color="#79f2c0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="64" height="64" rx="18" fill="#0d2136"/>
|
||||
<rect x="1" y="1" width="62" height="62" rx="17" fill="none" stroke="#31506c"/>
|
||||
<text x="32" y="39" text-anchor="middle" font-family="Arial, sans-serif" font-size="22" font-weight="700" fill="url(#g)">JP</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 555 B |
+177
-503
@@ -3,596 +3,270 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Jay Phillips — Systems Administrator and Infrastructure Engineer specializing in Kubernetes, Windows Server, VMware, automation, GitOps, and observability.">
|
||||
<title>Jay Phillips | Infrastructure Portfolio</title>
|
||||
<style>
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--background: #07111f;
|
||||
--surface: rgba(15, 31, 51, 0.82);
|
||||
--surface-strong: #10243a;
|
||||
--border: rgba(148, 184, 219, 0.2);
|
||||
--text: #eef7ff;
|
||||
--muted: #a7bed2;
|
||||
--accent: #65d4ff;
|
||||
--accent-strong: #79f2c0;
|
||||
--shadow: 0 24px 70px rgba(0, 0, 0, 0.32);
|
||||
--radius: 22px;
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
color: var(--text);
|
||||
background:
|
||||
radial-gradient(circle at 12% 8%, rgba(49, 173, 255, 0.22), transparent 28rem),
|
||||
radial-gradient(circle at 92% 18%, rgba(62, 242, 179, 0.14), transparent 26rem),
|
||||
linear-gradient(145deg, #06101d 0%, #0a1727 52%, #07111f 100%);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
a { color: inherit; }
|
||||
|
||||
.shell {
|
||||
width: min(1160px, calc(100% - 36px));
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 24px;
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-weight: 750;
|
||||
letter-spacing: 0.01em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.brand-mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(135deg, rgba(101, 212, 255, 0.22), rgba(121, 242, 192, 0.15));
|
||||
box-shadow: inset 0 1px rgba(255, 255, 255, 0.08);
|
||||
color: var(--accent);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
gap: 22px;
|
||||
color: var(--muted);
|
||||
font-size: 0.94rem;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-links a:hover,
|
||||
.nav-links a:focus-visible {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.hero {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.4fr) minmax(280px, 0.6fr);
|
||||
gap: 42px;
|
||||
align-items: center;
|
||||
padding: 88px 0 80px;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 9px;
|
||||
margin-bottom: 18px;
|
||||
color: var(--accent-strong);
|
||||
font-size: 0.82rem;
|
||||
font-weight: 750;
|
||||
letter-spacing: 0.16em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.eyebrow::before {
|
||||
content: "";
|
||||
width: 28px;
|
||||
height: 1px;
|
||||
background: currentColor;
|
||||
}
|
||||
|
||||
h1, h2, h3, p { margin-top: 0; }
|
||||
|
||||
h1 {
|
||||
max-width: 830px;
|
||||
margin-bottom: 22px;
|
||||
font-size: clamp(3.1rem, 8vw, 6.5rem);
|
||||
line-height: 0.96;
|
||||
letter-spacing: -0.065em;
|
||||
}
|
||||
|
||||
h1 span {
|
||||
display: block;
|
||||
color: transparent;
|
||||
background: linear-gradient(90deg, var(--accent), var(--accent-strong));
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
}
|
||||
|
||||
.hero-copy {
|
||||
max-width: 720px;
|
||||
margin-bottom: 30px;
|
||||
color: var(--muted);
|
||||
font-size: clamp(1.05rem, 2vw, 1.28rem);
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 13px;
|
||||
}
|
||||
|
||||
.button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 48px;
|
||||
padding: 0 20px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 14px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
transition: transform 160ms ease, border-color 160ms ease, background 160ms ease;
|
||||
}
|
||||
|
||||
.button.primary {
|
||||
border-color: transparent;
|
||||
background: linear-gradient(110deg, var(--accent), var(--accent-strong));
|
||||
color: #032033;
|
||||
}
|
||||
|
||||
.button:hover,
|
||||
.button:focus-visible {
|
||||
transform: translateY(-2px);
|
||||
border-color: rgba(101, 212, 255, 0.58);
|
||||
}
|
||||
|
||||
.status-card {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding: 28px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
background: linear-gradient(155deg, rgba(16, 36, 58, 0.94), rgba(8, 22, 38, 0.86));
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.status-card::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
right: -55px;
|
||||
bottom: -75px;
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
border-radius: 50%;
|
||||
background: rgba(101, 212, 255, 0.09);
|
||||
filter: blur(6px);
|
||||
}
|
||||
|
||||
.status-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 24px;
|
||||
color: var(--accent-strong);
|
||||
font-weight: 750;
|
||||
}
|
||||
|
||||
.pulse {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
background: currentColor;
|
||||
box-shadow: 0 0 0 7px rgba(121, 242, 192, 0.12);
|
||||
}
|
||||
|
||||
.status-list {
|
||||
display: grid;
|
||||
gap: 14px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
color: var(--muted);
|
||||
font-size: 0.94rem;
|
||||
}
|
||||
|
||||
.status-list li {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 18px;
|
||||
padding-bottom: 13px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.status-list li:last-child {
|
||||
padding-bottom: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.status-list strong {
|
||||
color: var(--text);
|
||||
font-weight: 700;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
section { padding: 72px 0; }
|
||||
|
||||
.section-heading {
|
||||
display: grid;
|
||||
grid-template-columns: 0.75fr 1.25fr;
|
||||
gap: 44px;
|
||||
align-items: end;
|
||||
margin-bottom: 34px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-bottom: 0;
|
||||
font-size: clamp(2rem, 4vw, 3.25rem);
|
||||
line-height: 1.05;
|
||||
letter-spacing: -0.045em;
|
||||
}
|
||||
|
||||
.section-heading p {
|
||||
margin-bottom: 4px;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
gap: 18px;
|
||||
}
|
||||
|
||||
.card {
|
||||
min-height: 100%;
|
||||
padding: 26px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
background: var(--surface);
|
||||
box-shadow: inset 0 1px rgba(255, 255, 255, 0.035);
|
||||
}
|
||||
|
||||
.card-number {
|
||||
margin-bottom: 34px;
|
||||
color: var(--accent);
|
||||
font-size: 0.76rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.16em;
|
||||
}
|
||||
|
||||
.card h3 {
|
||||
margin-bottom: 10px;
|
||||
font-size: 1.22rem;
|
||||
}
|
||||
|
||||
.card p {
|
||||
margin-bottom: 18px;
|
||||
color: var(--muted);
|
||||
font-size: 0.96rem;
|
||||
}
|
||||
|
||||
.tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.tag {
|
||||
padding: 6px 9px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 999px;
|
||||
color: #cae1f3;
|
||||
background: rgba(255, 255, 255, 0.025);
|
||||
font-size: 0.75rem;
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.architecture {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.architecture-panel {
|
||||
padding: 30px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
background: linear-gradient(145deg, rgba(17, 39, 62, 0.82), rgba(8, 22, 37, 0.9));
|
||||
}
|
||||
|
||||
.architecture-panel h3 { margin-bottom: 18px; }
|
||||
|
||||
.flow {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.flow li {
|
||||
position: relative;
|
||||
padding: 14px 16px 14px 44px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 13px;
|
||||
color: var(--muted);
|
||||
background: rgba(4, 15, 27, 0.42);
|
||||
}
|
||||
|
||||
.flow li::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 18px;
|
||||
top: 50%;
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent);
|
||||
transform: translateY(-50%);
|
||||
box-shadow: 0 0 0 5px rgba(101, 212, 255, 0.09);
|
||||
}
|
||||
|
||||
.security-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 10px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.security-list li {
|
||||
padding: 13px 14px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
color: var(--muted);
|
||||
background: rgba(4, 15, 27, 0.42);
|
||||
font-size: 0.91rem;
|
||||
}
|
||||
|
||||
.callout {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 28px;
|
||||
padding: 36px;
|
||||
border: 1px solid rgba(101, 212, 255, 0.3);
|
||||
border-radius: var(--radius);
|
||||
background: linear-gradient(115deg, rgba(101, 212, 255, 0.12), rgba(121, 242, 192, 0.08));
|
||||
}
|
||||
|
||||
.callout h2 { margin-bottom: 8px; }
|
||||
.callout p { margin-bottom: 0; color: var(--muted); }
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 22px;
|
||||
padding: 34px 0 50px;
|
||||
border-top: 1px solid var(--border);
|
||||
color: var(--muted);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.hero,
|
||||
.section-heading,
|
||||
.architecture {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.hero { padding-top: 54px; }
|
||||
.grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.section-heading { gap: 14px; }
|
||||
}
|
||||
|
||||
@media (max-width: 620px) {
|
||||
.shell { width: min(100% - 24px, 1160px); }
|
||||
.nav-links { display: none; }
|
||||
.hero { padding: 42px 0 54px; }
|
||||
h1 { font-size: clamp(3rem, 17vw, 4.6rem); }
|
||||
section { padding: 54px 0; }
|
||||
.grid,
|
||||
.security-list { grid-template-columns: 1fr; }
|
||||
.callout,
|
||||
footer { align-items: flex-start; flex-direction: column; }
|
||||
}
|
||||
</style>
|
||||
<meta name="description" content="Jay Phillips is a Senior Systems Administrator and Infrastructure Engineer specializing in Windows Server, VMware, Kubernetes, automation, GitOps, and enterprise platform operations.">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/styles.css">
|
||||
<title>Jay Phillips | Infrastructure Engineer</title>
|
||||
</head>
|
||||
<body>
|
||||
<header class="shell">
|
||||
<nav class="nav" aria-label="Primary navigation">
|
||||
<a class="brand" href="#top">
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header">
|
||||
<nav class="nav shell" aria-label="Primary navigation">
|
||||
<a class="brand" href="/">
|
||||
<span class="brand-mark" aria-hidden="true">JP</span>
|
||||
<span>Jay Phillips</span>
|
||||
</a>
|
||||
<div class="nav-links">
|
||||
<a href="#experience">Experience</a>
|
||||
<a href="#skills">Skills</a>
|
||||
<a href="#projects">Projects</a>
|
||||
<a href="/resume.html">Résumé</a>
|
||||
<a href="#platform">Platform</a>
|
||||
<a href="#contact">Contact</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main id="top">
|
||||
<main id="main">
|
||||
<div class="shell hero">
|
||||
<div>
|
||||
<div class="eyebrow">Systems Administrator · Infrastructure Engineer</div>
|
||||
<div class="eyebrow">Senior Systems Administrator · Infrastructure Engineer</div>
|
||||
<h1>Building resilient <span>infrastructure.</span></h1>
|
||||
<p class="hero-copy">
|
||||
I design, automate, secure, and operate enterprise and home-lab platforms across
|
||||
Windows Server, VMware, Linux, Kubernetes, GitOps, and Microsoft systems management.
|
||||
I design, automate, secure, and operate enterprise and home-lab platforms across Windows Server,
|
||||
VMware, Linux, Kubernetes, GitOps, observability, and Microsoft systems management.
|
||||
</p>
|
||||
<div class="actions">
|
||||
<a class="button primary" href="#projects">Explore projects</a>
|
||||
<a class="button" href="#platform">View platform design</a>
|
||||
<a class="button primary" href="#projects">Explore case studies</a>
|
||||
<a class="button" href="/resume.html">View short résumé</a>
|
||||
<a class="button" href="mailto:Phillips-Jay@outlook.com">Contact me</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="status-card" aria-label="Portfolio deployment status">
|
||||
<div class="status-line"><span class="pulse" aria-hidden="true"></span>Portfolio foundation online</div>
|
||||
<div class="status-line"><span class="pulse" aria-hidden="true"></span>GitOps deployment online</div>
|
||||
<ul class="status-list">
|
||||
<li><span>Orchestration</span><strong>Kubernetes 1.36</strong></li>
|
||||
<li><span>Delivery</span><strong>Argo CD GitOps</strong></li>
|
||||
<li><span>Network policy</span><strong>Calico</strong></li>
|
||||
<li><span>Ingress</span><strong>NGINX + TLS</strong></li>
|
||||
<li><span>Workload identity</span><strong>Token disabled</strong></li>
|
||||
<li><span>Orchestration</span><strong>Kubernetes 1.36.2</strong></li>
|
||||
<li><span>Delivery</span><strong>Argo CD + Kustomize</strong></li>
|
||||
<li><span>Network policy</span><strong>Calico default-deny</strong></li>
|
||||
<li><span>Runtime</span><strong>Non-root, read-only</strong></li>
|
||||
<li><span>Workload identity</span><strong>API token disabled</strong></li>
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<section id="skills" class="shell">
|
||||
<div class="shell metric-strip" aria-label="Career and platform highlights">
|
||||
<div class="metric"><strong>20+</strong><span>years in information technology</span></div>
|
||||
<div class="metric"><strong>17K</strong><span>server enterprise estate supported</span></div>
|
||||
<div class="metric"><strong>4-node</strong><span>Kubernetes home-lab platform</span></div>
|
||||
<div class="metric"><strong>MIS</strong><span>Master of Information Systems</span></div>
|
||||
</div>
|
||||
|
||||
<section id="experience" class="shell">
|
||||
<div class="section-heading">
|
||||
<h2>Core capabilities</h2>
|
||||
<div>
|
||||
<div class="section-kicker">Professional experience</div>
|
||||
<h2>Enterprise operations grounded in hands-on engineering.</h2>
|
||||
</div>
|
||||
<p>
|
||||
Hands-on administration supported by automation, security controls, observability,
|
||||
documentation, and repeatable deployment practices.
|
||||
My background spans healthcare, financial, government, commercial, and military environments.
|
||||
I combine practical systems administration with automation, documentation, and platform thinking.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="timeline">
|
||||
<article class="timeline-item">
|
||||
<div class="timeline-meta"><strong>Trinity Health</strong>January 2024 – Present</div>
|
||||
<div>
|
||||
<h3>System Administrator</h3>
|
||||
<p>Support large-scale Windows Server and VMware infrastructure across a multi-site healthcare environment.</p>
|
||||
<ul>
|
||||
<li>Support an estate of approximately 17,000 physical and virtual servers across multiple healthcare ministries.</li>
|
||||
<li>Build, deploy, troubleshoot, upgrade, migrate, and decommission Windows Server systems.</li>
|
||||
<li>Work across VMware vSphere, Active Directory, BlueCat DNS, SCCM, PowerShell, storage, and networking.</li>
|
||||
<li>Develop automation that reduces repetitive administration and improves consistency.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="timeline-item">
|
||||
<div class="timeline-meta"><strong>Trinity Health / SJRMC</strong>March 2021 – December 2023</div>
|
||||
<div>
|
||||
<h3>Senior Client Technologies Analyst / System Administrator</h3>
|
||||
<p>Administered hospital infrastructure supporting critical clinical and business services.</p>
|
||||
<ul>
|
||||
<li>Supported approximately 300 physical and virtual servers.</li>
|
||||
<li>Administered VMware infrastructure, server hardware, operating systems, and datacenter deployments.</li>
|
||||
<li>Coordinated complex troubleshooting across infrastructure and application teams.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="timeline-item">
|
||||
<div class="timeline-meta"><strong>Earlier career</strong>2000 – 2021</div>
|
||||
<div>
|
||||
<h3>Infrastructure, systems, networking, and technical support roles</h3>
|
||||
<p>Progressed through healthcare support, systems engineering, Linux administration, network engineering, consulting, and U.S. Army communications.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">Systems engineering</span><span class="tag">VMware</span><span class="tag">Linux</span>
|
||||
<span class="tag">Networking</span><span class="tag">Datacenter</span><span class="tag">Military communications</span>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="skills" class="shell">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<div class="section-kicker">Core capabilities</div>
|
||||
<h2>Broad infrastructure depth with a platform-engineering mindset.</h2>
|
||||
</div>
|
||||
<p>Hands-on administration supported by automation, security controls, observability, documentation, and repeatable deployment practices.</p>
|
||||
</div>
|
||||
|
||||
<div class="grid">
|
||||
<article class="card">
|
||||
<div class="card-number">01 / CLOUD NATIVE</div>
|
||||
<h3>Kubernetes & GitOps</h3>
|
||||
<p>Multi-node clusters, Argo CD, ingress, certificates, persistent storage, RBAC, policies, and application lifecycle management.</p>
|
||||
<p>Multi-node clusters, Argo CD, ingress, certificates, persistent storage, RBAC, policies, backups, and application lifecycle management.</p>
|
||||
<div class="tags"><span class="tag">Kubernetes</span><span class="tag">Argo CD</span><span class="tag">Kustomize</span><span class="tag">Longhorn</span></div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<div class="card-number">02 / MICROSOFT</div>
|
||||
<h3>Windows Infrastructure</h3>
|
||||
<p>Windows Server, Active Directory, Group Policy, Configuration Manager, Operations Manager, SharePoint, and PowerShell.</p>
|
||||
<p>Windows Server, Active Directory, Group Policy, Configuration Manager, Operations Manager, SharePoint, clustering, DNS, and DHCP.</p>
|
||||
<div class="tags"><span class="tag">Windows Server</span><span class="tag">SCCM</span><span class="tag">SCOM</span><span class="tag">SharePoint</span></div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<div class="card-number">03 / AUTOMATION</div>
|
||||
<h3>Automation & IaC</h3>
|
||||
<p>Repeatable infrastructure operations using PowerShell, Bash, Git, Terraform, Ansible, APIs, and declarative configuration.</p>
|
||||
<div class="tags"><span class="tag">PowerShell</span><span class="tag">Terraform</span><span class="tag">Ansible</span><span class="tag">Git</span></div>
|
||||
<p>Repeatable infrastructure operations using PowerShell, Bash, Git, Terraform, Ansible, Packer, APIs, and declarative configuration.</p>
|
||||
<div class="tags"><span class="tag">PowerShell</span><span class="tag">Terraform</span><span class="tag">Ansible</span><span class="tag">Packer</span></div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<div class="card-number">04 / PLATFORMS</div>
|
||||
<h3>Virtualization & Linux</h3>
|
||||
<p>VMware vSphere administration, Linux server operations, networking, storage, patching, troubleshooting, and capacity planning.</p>
|
||||
<div class="tags"><span class="tag">VMware</span><span class="tag">Ubuntu</span><span class="tag">Rocky Linux</span><span class="tag">NFS</span></div>
|
||||
<p>VMware vSphere administration, Hyper-V, Linux server operations, networking, storage, patching, troubleshooting, and capacity planning.</p>
|
||||
<div class="tags"><span class="tag">VMware</span><span class="tag">Ubuntu</span><span class="tag">Rocky Linux</span><span class="tag">RHEL</span></div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<div class="card-number">05 / OBSERVABILITY</div>
|
||||
<h3>Monitoring & Reliability</h3>
|
||||
<p>Metrics, logging, alerting, dashboards, service health, failure analysis, and operational visibility across infrastructure layers.</p>
|
||||
<div class="tags"><span class="tag">Prometheus</span><span class="tag">Grafana</span><span class="tag">Loki</span><span class="tag">Alertmanager</span></div>
|
||||
<p>Metrics, logs, alerting, dashboards, service health, failure analysis, and operational visibility across infrastructure layers.</p>
|
||||
<div class="tags"><span class="tag">Prometheus</span><span class="tag">Grafana</span><span class="tag">Loki</span><span class="tag">Zabbix</span></div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<div class="card-number">06 / SECURITY</div>
|
||||
<h3>Secure Operations</h3>
|
||||
<p>Least privilege, service identities, network segmentation, certificate management, secret handling, backups, and recovery planning.</p>
|
||||
<div class="tags"><span class="tag">RBAC</span><span class="tag">TLS</span><span class="tag">NetworkPolicy</span><span class="tag">GitOps</span></div>
|
||||
<p>Least privilege, service identities, network segmentation, certificate management, secret handling, resource governance, backups, and recovery planning.</p>
|
||||
<div class="tags"><span class="tag">RBAC</span><span class="tag">TLS</span><span class="tag">NetworkPolicy</span><span class="tag">Sealed Secrets</span></div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="projects" class="shell">
|
||||
<div class="section-heading">
|
||||
<h2>Featured work</h2>
|
||||
<p>
|
||||
The full case studies will document the problem, architecture, implementation,
|
||||
troubleshooting decisions, security controls, and operational results.
|
||||
</p>
|
||||
<div>
|
||||
<div class="section-kicker">Technical case studies</div>
|
||||
<h2>Proof of work, not just a technology list.</h2>
|
||||
</div>
|
||||
<div class="grid">
|
||||
<article class="card">
|
||||
<p>Each case study describes the objective, architecture, implementation, controls, troubleshooting, and operational outcome.</p>
|
||||
</div>
|
||||
|
||||
<div class="project-grid">
|
||||
<article class="project-card">
|
||||
<div class="card-number">CASE STUDY / 01</div>
|
||||
<h3>Production-style Kubernetes home lab</h3>
|
||||
<p>A four-node Kubernetes platform with load balancing, persistent storage, certificate automation, ingress, backups, and segmented applications.</p>
|
||||
<div class="tags"><span class="tag">4 nodes</span><span class="tag">Calico</span><span class="tag">MetalLB</span><span class="tag">Longhorn</span></div>
|
||||
<h3>Enterprise-style Kubernetes platform</h3>
|
||||
<p>A four-node cluster with Calico networking, MetalLB, ingress-nginx, cert-manager, Longhorn, GitOps, backups, monitoring, and isolated application namespaces.</p>
|
||||
<div class="tags"><span class="tag">Kubernetes 1.36</span><span class="tag">Calico</span><span class="tag">Longhorn</span><span class="tag">MetalLB</span></div>
|
||||
<a class="project-link" href="/kubernetes.html">Read the Kubernetes case study</a>
|
||||
</article>
|
||||
<article class="card">
|
||||
|
||||
<article class="project-card">
|
||||
<div class="card-number">CASE STUDY / 02</div>
|
||||
<h3>GitOps application delivery</h3>
|
||||
<p>Declarative application deployment and reconciliation through Argo CD, Git-based change control, Kustomize, and automated image workflows.</p>
|
||||
<div class="tags"><span class="tag">Argo CD</span><span class="tag">Git</span><span class="tag">Kustomize</span><span class="tag">Self-healing</span></div>
|
||||
<h3>Microsoft infrastructure engineering</h3>
|
||||
<p>SharePoint Server Subscription Edition, SCCM operating-system deployment, Active Directory policy, Windows Server lifecycle work, and systems-management automation.</p>
|
||||
<div class="tags"><span class="tag">SharePoint SE</span><span class="tag">SCCM</span><span class="tag">Windows Server 2025</span><span class="tag">Active Directory</span></div>
|
||||
<a class="project-link" href="/microsoft.html">Read the Microsoft case study</a>
|
||||
</article>
|
||||
<article class="card">
|
||||
|
||||
<article class="project-card">
|
||||
<div class="card-number">CASE STUDY / 03</div>
|
||||
<h3>Enterprise monitoring stack</h3>
|
||||
<p>Centralized metrics, logs, dashboards, uptime monitoring, and email alerting for cluster and application health.</p>
|
||||
<div class="tags"><span class="tag">Prometheus</span><span class="tag">Grafana</span><span class="tag">Loki</span><span class="tag">Uptime Kuma</span></div>
|
||||
<h3>Infrastructure automation</h3>
|
||||
<p>PowerShell workflows for enterprise administration, declarative Kubernetes delivery, and infrastructure-as-code experimentation with Terraform, Ansible, and Packer.</p>
|
||||
<div class="tags"><span class="tag">PowerShell</span><span class="tag">GitOps</span><span class="tag">Terraform</span><span class="tag">Ansible</span></div>
|
||||
<a class="project-link" href="/automation.html">Read the automation case study</a>
|
||||
</article>
|
||||
|
||||
<article class="project-card">
|
||||
<div class="card-number">CASE STUDY / 04</div>
|
||||
<h3>Observability and alerting</h3>
|
||||
<p>Centralized cluster metrics, logs, dashboards, uptime monitoring, VMware visibility, and email alert delivery across a layered monitoring platform.</p>
|
||||
<div class="tags"><span class="tag">Prometheus</span><span class="tag">Grafana</span><span class="tag">Loki</span><span class="tag">Alertmanager</span></div>
|
||||
<a class="project-link" href="/observability.html">Read the observability case study</a>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="credentials" class="shell">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<div class="section-kicker">Education & certifications</div>
|
||||
<h2>Continuous growth backed by formal education and experience.</h2>
|
||||
</div>
|
||||
<p>Academic achievement complements more than two decades of practical infrastructure work and ongoing home-lab engineering.</p>
|
||||
</div>
|
||||
<div class="split">
|
||||
<article class="panel">
|
||||
<h3>Education</h3>
|
||||
<ul class="clean-list">
|
||||
<li><strong>Master of Information Systems</strong><br>University of Phoenix, 2026 · Dean’s List · Epsilon Pi Tau Honor Society</li>
|
||||
<li><strong>Bachelor of Science in Information Technology</strong><br>University of Phoenix, 2017 · National Society of Collegiate Scholars</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article class="panel">
|
||||
<h3>Certifications</h3>
|
||||
<ul class="clean-list">
|
||||
<li>Microsoft Azure Fundamentals (AZ-900)</li>
|
||||
<li>Microsoft Certified Professional</li>
|
||||
<li>MCSA: Windows Server 2008</li>
|
||||
<li>MCITP: Enterprise Administrator on Windows Server 2008</li>
|
||||
</ul>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="platform" class="shell">
|
||||
<div class="section-heading">
|
||||
<h2>This site is part of the demonstration.</h2>
|
||||
<p>
|
||||
The portfolio is deployed as an isolated, policy-controlled workload rather than a
|
||||
conventional static hosting account. The architecture itself is a portfolio artifact.
|
||||
</p>
|
||||
<div>
|
||||
<div class="section-kicker">Live platform demonstration</div>
|
||||
<h2>This website is part of the portfolio.</h2>
|
||||
</div>
|
||||
<div class="architecture">
|
||||
<article class="architecture-panel">
|
||||
<h3>Delivery path</h3>
|
||||
<ol class="flow">
|
||||
<li>Git repository stores the desired state</li>
|
||||
<li>Argo CD reconciles a restricted AppProject</li>
|
||||
<li>Kustomize renders application resources</li>
|
||||
<li>ingress-nginx routes HTTPS traffic</li>
|
||||
<li>cert-manager issues the internal TLS certificate</li>
|
||||
</ol>
|
||||
</article>
|
||||
<article class="architecture-panel">
|
||||
<h3>Security controls</h3>
|
||||
<ul class="security-list">
|
||||
<li>Restricted Pod Security</li>
|
||||
<li>Non-root container</li>
|
||||
<li>Read-only root filesystem</li>
|
||||
<li>All capabilities dropped</li>
|
||||
<li>Default-deny networking</li>
|
||||
<li>No outbound network access</li>
|
||||
<li>No API token mounted</li>
|
||||
<li>Resource quotas and limits</li>
|
||||
</ul>
|
||||
</article>
|
||||
<p>The site is deployed as an isolated, policy-controlled Kubernetes workload rather than a conventional static hosting account.</p>
|
||||
</div>
|
||||
<div class="architecture-panel">
|
||||
<img src="/architecture.svg" alt="GitOps architecture showing Git, Argo CD, Kustomize, Kubernetes, ingress, security controls, and observability">
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="shell">
|
||||
<section id="contact" class="shell">
|
||||
<div class="callout">
|
||||
<div>
|
||||
<h2>Foundation complete. Case studies next.</h2>
|
||||
<p>This internal staging release will grow into a public portfolio, short résumé, architecture library, and safe interactive demonstration environment.</p>
|
||||
<h2>Let’s talk infrastructure.</h2>
|
||||
<p>I am interested in infrastructure engineering, senior systems administration, platform operations, automation, and service-delivery opportunities.</p>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<a class="button primary" href="mailto:Phillips-Jay@outlook.com">Email Jay</a>
|
||||
<a class="button" href="/resume.html">View résumé</a>
|
||||
</div>
|
||||
<a class="button primary" href="#top">Back to top</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="shell">
|
||||
<span>© 2026 Jay Phillips</span>
|
||||
<footer class="site-footer shell">
|
||||
<span>© 2026 Jay Phillips · Mishawaka, Indiana</span>
|
||||
<span>Deployed with Kubernetes, Argo CD, Kustomize, Calico, ingress-nginx, and cert-manager.</span>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Case study: Jay Phillips' enterprise-style Kubernetes home-lab platform.">
|
||||
<meta name="robots" content="noindex, nofollow"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="stylesheet" href="/styles.css">
|
||||
<title>Kubernetes Platform Case Study | Jay Phillips</title>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header"><nav class="nav shell" aria-label="Primary navigation"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true">JP</span><span>Jay Phillips</span></a><div class="nav-links"><a href="/">Home</a><a href="/#projects" aria-current="page">Projects</a><a href="/resume.html">Résumé</a><a href="mailto:Phillips-Jay@outlook.com">Contact</a></div></nav></header>
|
||||
<main id="main" class="shell">
|
||||
<div class="page-hero">
|
||||
<div class="breadcrumb"><a href="/">Home</a> / <a href="/#projects">Projects</a> / Kubernetes</div>
|
||||
<div class="eyebrow">Case study 01 · Platform engineering</div>
|
||||
<h1>Enterprise-style <span>Kubernetes platform.</span></h1>
|
||||
<p class="lead">A four-node home-lab cluster designed to practice production-minded orchestration, GitOps, persistent storage, security policy, observability, backup, and application operations.</p>
|
||||
</div>
|
||||
|
||||
<div class="case-layout">
|
||||
<div class="case-content">
|
||||
<section class="case-section"><h2>Objective</h2><p>Build a realistic platform that could host useful services while providing hands-on experience with the operational concerns that exist beyond a basic Kubernetes installation: networking, storage, certificates, identity, policy, upgrades, monitoring, logging, backups, and declarative delivery.</p></section>
|
||||
<section class="case-section"><h2>Architecture</h2><ul><li>One Ubuntu control-plane node and three Ubuntu worker nodes running Kubernetes 1.36.2 with containerd.</li><li>Calico for pod networking and enforceable NetworkPolicies.</li><li>MetalLB for LoadBalancer services and ingress-nginx as the application entry point.</li><li>cert-manager for automated certificate lifecycle management.</li><li>Longhorn distributed block storage with NFS backup targets.</li><li>Argo CD app-of-apps pattern for GitOps reconciliation.</li><li>Sealed Secrets for encrypted secret material stored in Git.</li></ul></section>
|
||||
<section class="case-section"><h2>Delivery and operations</h2><p>Applications are defined in Git and reconciled by Argo CD. Kustomize and Helm are used where appropriate, and automated image workflows can update digest-pinned deployments. Current workloads include documentation, password management, monitoring, uptime checks, logging, DNS automation, tooling, and portfolio services.</p><h3>Operational practices</h3><ul><li>Namespace-based separation for applications and platform components.</li><li>Resource requests and limits, health probes, disruption budgets, and topology spreading.</li><li>Persistent-volume backups and recovery planning.</li><li>Prometheus metrics, Grafana dashboards, Loki logs, and Alertmanager email delivery.</li><li>Git history as the change record and Argo CD as the drift detector.</li></ul></section>
|
||||
<section class="case-section"><h2>Security controls demonstrated by this portfolio</h2><ul><li>Restricted Pod Security enforcement pinned to the cluster version.</li><li>Non-root execution, read-only root filesystem, RuntimeDefault seccomp, no privilege escalation, and all Linux capabilities dropped.</li><li>Dedicated ServiceAccount with token automount disabled.</li><li>Default-deny ingress and egress with only ingress-controller traffic allowed.</li><li>Restricted Argo CD AppProject limited to one repository and one namespace.</li><li>ResourceQuota and LimitRange to constrain blast radius.</li></ul></section>
|
||||
<section class="case-section"><h2>Engineering lessons</h2><p>The project reinforced that a useful Kubernetes platform is an integration of multiple control planes. Storage, certificates, DNS, ingress, monitoring, and GitOps must all agree on naming, identity, networking, and lifecycle behavior. Troubleshooting therefore requires moving methodically across layers instead of treating every symptom as an application problem.</p></section>
|
||||
</div>
|
||||
<aside class="case-sidebar">
|
||||
<section class="panel"><h3>Platform facts</h3><dl class="fact-list"><div><dt>Cluster</dt><dd>4 nodes</dd></div><div><dt>Kubernetes</dt><dd>v1.36.2</dd></div><div><dt>Runtime</dt><dd>containerd</dd></div><div><dt>Networking</dt><dd>Calico + MetalLB</dd></div><div><dt>Storage</dt><dd>Longhorn</dd></div><div><dt>Delivery</dt><dd>Argo CD GitOps</dd></div></dl></section>
|
||||
<section class="panel"><h3>Technologies</h3><div class="tags"><span class="tag">Kubernetes</span><span class="tag">Argo CD</span><span class="tag">Kustomize</span><span class="tag">Helm</span><span class="tag">Calico</span><span class="tag">Longhorn</span><span class="tag">cert-manager</span><span class="tag">Sealed Secrets</span></div></section>
|
||||
</aside>
|
||||
</div>
|
||||
<section><div class="callout"><div><h2>See another case study.</h2><p>Continue with Microsoft infrastructure engineering or observability.</p></div><div class="actions"><a class="button primary" href="/microsoft.html">Microsoft platform</a><a class="button" href="/observability.html">Observability</a></div></div></section>
|
||||
</main>
|
||||
<footer class="site-footer shell"><span>© 2026 Jay Phillips</span><span>Case study: Kubernetes and GitOps platform.</span></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Case study: Microsoft infrastructure engineering with SharePoint, SCCM, Windows Server, Active Directory, and PowerShell.">
|
||||
<meta name="robots" content="noindex, nofollow"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="stylesheet" href="/styles.css">
|
||||
<title>Microsoft Infrastructure Case Study | Jay Phillips</title>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header"><nav class="nav shell" aria-label="Primary navigation"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true">JP</span><span>Jay Phillips</span></a><div class="nav-links"><a href="/">Home</a><a href="/#projects" aria-current="page">Projects</a><a href="/resume.html">Résumé</a><a href="mailto:Phillips-Jay@outlook.com">Contact</a></div></nav></header>
|
||||
<main id="main" class="shell">
|
||||
<div class="page-hero"><div class="breadcrumb"><a href="/">Home</a> / <a href="/#projects">Projects</a> / Microsoft</div><div class="eyebrow">Case study 02 · Enterprise systems</div><h1>Microsoft infrastructure <span>engineering.</span></h1><p class="lead">Hands-on design, deployment, troubleshooting, and automation across Windows Server, SharePoint Server, Configuration Manager, Active Directory, Group Policy, and systems-management tooling.</p></div>
|
||||
<div class="case-layout">
|
||||
<div class="case-content">
|
||||
<section class="case-section"><h2>SharePoint Server Subscription Edition</h2><p>Built an on-premises SharePoint environment on Windows Server 2025 to provide an internal collaboration and OneDrive-style experience.</p><ul><li>Designed SQL data and log placement and configured server memory boundaries.</li><li>Created dedicated farm and service identities following separation-of-duties principles.</li><li>Configured portal and MySites web applications, content databases, managed metadata, user profiles, and supporting service applications.</li><li>Implemented internal PKI certificates, HTTPS bindings, and integrated authentication.</li><li>Tuned search services and system resources to improve page performance.</li></ul></section>
|
||||
<section class="case-section"><h2>Configuration Manager deployment engineering</h2><p>Developed SCCM operating-system deployment workflows for virtual servers, including PXE boot, task sequences, driver support, and in-place upgrade planning.</p><ul><li>Resolved VMXNET3 PXE compatibility and driver-import issues.</li><li>Tuned TFTP block size to improve boot-image transfer performance.</li><li>Built PowerShell task-sequence steps that run safely as Local System.</li><li>Worked through site-upgrade prerequisite failures and client boundary configuration.</li><li>Planned Software Center-initiated in-place upgrades for Windows Server virtual machines.</li></ul></section>
|
||||
<section class="case-section"><h2>Active Directory and Windows operations</h2><ul><li>Created Group Policy designs for RDP, Windows Update behavior, firewall configuration, and enterprise client settings.</li><li>Automated account, group membership, server inventory, reboot history, and domain-migration tasks with PowerShell.</li><li>Troubleshot failover clustering, NTFS corruption, SQL-hosted applications, authentication, DNS, and Windows Server lifecycle issues.</li><li>Built prerequisite automation for System Center Operations Manager and Orchestrator.</li></ul></section>
|
||||
<section class="case-section"><h2>Approach</h2><p>The common design principle is repeatability. GUI configuration is documented, then moved into PowerShell, Group Policy, task sequences, or version-controlled deployment files wherever practical. That reduces one-off knowledge and turns troubleshooting discoveries into reusable operating procedures.</p></section>
|
||||
</div>
|
||||
<aside class="case-sidebar"><section class="panel"><h3>Platforms</h3><dl class="fact-list"><div><dt>Server OS</dt><dd>Windows Server 2025</dd></div><div><dt>Collaboration</dt><dd>SharePoint SE</dd></div><div><dt>Deployment</dt><dd>SCCM / PXE</dd></div><div><dt>Identity</dt><dd>Active Directory</dd></div><div><dt>Automation</dt><dd>PowerShell</dd></div></dl></section><section class="panel"><h3>Technologies</h3><div class="tags"><span class="tag">Windows Server</span><span class="tag">SharePoint</span><span class="tag">SQL Server</span><span class="tag">SCCM</span><span class="tag">SCOM</span><span class="tag">Group Policy</span><span class="tag">PowerShell</span></div></section></aside>
|
||||
</div>
|
||||
<section><div class="callout"><div><h2>See the automation behind the work.</h2><p>Continue with the infrastructure automation case study.</p></div><a class="button primary" href="/automation.html">Automation case study</a></div></section>
|
||||
</main>
|
||||
<footer class="site-footer shell"><span>© 2026 Jay Phillips</span><span>Case study: Microsoft infrastructure engineering.</span></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Case study: infrastructure observability using Prometheus, Grafana, Loki, Alertmanager, Uptime Kuma, and Zabbix.">
|
||||
<meta name="robots" content="noindex, nofollow"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="stylesheet" href="/styles.css">
|
||||
<title>Observability Case Study | Jay Phillips</title>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header"><nav class="nav shell" aria-label="Primary navigation"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true">JP</span><span>Jay Phillips</span></a><div class="nav-links"><a href="/">Home</a><a href="/#projects" aria-current="page">Projects</a><a href="/resume.html">Résumé</a><a href="mailto:Phillips-Jay@outlook.com">Contact</a></div></nav></header>
|
||||
<main id="main" class="shell">
|
||||
<div class="page-hero"><div class="breadcrumb"><a href="/">Home</a> / <a href="/#projects">Projects</a> / Observability</div><div class="eyebrow">Case study 04 · Reliability engineering</div><h1>Observability and <span>alerting.</span></h1><p class="lead">A layered monitoring design that combines infrastructure metrics, logs, synthetic availability checks, VMware visibility, dashboards, and actionable email notification.</p></div>
|
||||
<div class="case-layout">
|
||||
<div class="case-content">
|
||||
<section class="case-section"><h2>Monitoring layers</h2><ul><li><strong>Prometheus:</strong> cluster, node, controller, and application metrics.</li><li><strong>Grafana:</strong> dashboards for operational visibility and trend analysis.</li><li><strong>Loki and Promtail:</strong> centralized Kubernetes log collection and search.</li><li><strong>Alertmanager:</strong> routing, grouping, repeat intervals, and email delivery through an internal relay.</li><li><strong>Uptime Kuma:</strong> synthetic checks for service and endpoint availability.</li><li><strong>Zabbix:</strong> infrastructure and VMware monitoring outside the Kubernetes-native stack.</li></ul></section>
|
||||
<section class="case-section"><h2>Alert delivery</h2><p>Alertmanager was integrated with an internal SMTP relay and verified end to end with a dedicated PrometheusRule. The configuration separates actionable alerts from noise, routes Watchdog-style signals away from the user receiver, and applies a repeat interval to reduce unnecessary messages.</p></section>
|
||||
<section class="case-section"><h2>Operational outcomes</h2><ul><li>One place to inspect cluster health, application state, and resource consumption.</li><li>Centralized logs for troubleshooting restarts, ingress failures, and application errors.</li><li>Email notification for conditions that need attention away from the dashboard.</li><li>Independent uptime checks that validate the user-facing path rather than only pod health.</li><li>VMware and traditional-server monitoring alongside cloud-native telemetry.</li></ul></section>
|
||||
<section class="case-section"><h2>Reliability mindset</h2><p>Monitoring is treated as part of the service design, not an afterthought. New workloads should expose health checks, declare resource requirements, produce useful logs, and have a clear alerting path. The objective is early detection with enough context to shorten diagnosis and recovery.</p></section>
|
||||
</div>
|
||||
<aside class="case-sidebar"><section class="panel"><h3>Toolchain</h3><dl class="fact-list"><div><dt>Metrics</dt><dd>Prometheus</dd></div><div><dt>Dashboards</dt><dd>Grafana</dd></div><div><dt>Logs</dt><dd>Loki + Promtail</dd></div><div><dt>Alerts</dt><dd>Alertmanager</dd></div><div><dt>Uptime</dt><dd>Uptime Kuma</dd></div><div><dt>Infrastructure</dt><dd>Zabbix</dd></div></dl></section><section class="panel"><h3>Practices</h3><div class="tags"><span class="tag">Health probes</span><span class="tag">Synthetic checks</span><span class="tag">Alert routing</span><span class="tag">Log aggregation</span><span class="tag">Dashboards</span><span class="tag">Email relay</span></div></section></aside>
|
||||
</div>
|
||||
<section><div class="callout"><div><h2>Return to the complete portfolio.</h2><p>Review the experience, skills, credentials, and live platform architecture.</p></div><a class="button primary" href="/">Back to portfolio</a></div></section>
|
||||
</main>
|
||||
<footer class="site-footer shell"><span>© 2026 Jay Phillips</span><span>Case study: observability and alerting.</span></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,136 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Short professional résumé for Jay Phillips, Senior Systems Administrator and Infrastructure Engineer.">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/styles.css">
|
||||
<title>Résumé | Jay Phillips</title>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<header class="site-header print-hide">
|
||||
<nav class="nav shell" aria-label="Primary navigation">
|
||||
<a class="brand" href="/"><span class="brand-mark" aria-hidden="true">JP</span><span>Jay Phillips</span></a>
|
||||
<div class="nav-links">
|
||||
<a href="/">Home</a><a href="/#projects">Projects</a><a href="/resume.html" aria-current="page">Résumé</a><a href="mailto:Phillips-Jay@outlook.com">Contact</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main id="main" class="shell">
|
||||
<div class="page-hero">
|
||||
<div class="breadcrumb print-hide"><a href="/">Home</a> / Résumé</div>
|
||||
<div class="eyebrow">Public-safe short résumé</div>
|
||||
<h1>Jay Phillips<br><span>Infrastructure Engineer.</span></h1>
|
||||
<p class="lead">Senior Systems Administrator with 20+ years of IT experience and 10+ years supporting enterprise infrastructure across healthcare, financial, government, commercial, and military environments.</p>
|
||||
<div class="actions print-hide">
|
||||
<a class="button primary" href="mailto:Phillips-Jay@outlook.com">Phillips-Jay@outlook.com</a>
|
||||
<a class="button" href="/">Back to portfolio</a>
|
||||
</div>
|
||||
<p class="print-hide">To save a PDF copy, use your browser’s <strong>Print</strong> command and select <strong>Save as PDF</strong>.</p>
|
||||
</div>
|
||||
|
||||
<div class="resume-wrap">
|
||||
<aside class="resume-sidebar">
|
||||
<section class="resume-panel">
|
||||
<h2>Core technologies</h2>
|
||||
<div class="skill-groups">
|
||||
<div class="skill-group"><h3>Infrastructure</h3><p>Windows Server, Active Directory, DNS, DHCP, Group Policy, DFS, clustering, SharePoint, Microsoft 365</p></div>
|
||||
<div class="skill-group"><h3>Virtualization</h3><p>VMware ESXi, vCenter, Hyper-V, Azure fundamentals, AWS foundations</p></div>
|
||||
<div class="skill-group"><h3>Automation</h3><p>PowerShell, Bash, Terraform, Ansible, Packer, Git, SCCM</p></div>
|
||||
<div class="skill-group"><h3>Platforms</h3><p>Kubernetes, Docker, Argo CD, GitOps, Ubuntu, Rocky Linux, RHEL, Debian</p></div>
|
||||
<div class="skill-group"><h3>Observability</h3><p>Prometheus, Grafana, Loki, Alertmanager, Zabbix, SolarWinds, Nagios, Uptime Kuma</p></div>
|
||||
<div class="skill-group"><h3>Networking</h3><p>TCP/IP, VLANs, routing, pfSense, Cisco switching, SAN/NAS, NetBox, phpIPAM</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="resume-panel">
|
||||
<h2>Credentials</h2>
|
||||
<p><strong>Master of Information Systems</strong><br>University of Phoenix, 2026</p>
|
||||
<p><strong>BS, Information Technology</strong><br>University of Phoenix, 2017</p>
|
||||
<div class="tags"><span class="tag">AZ-900</span><span class="tag">MCP</span><span class="tag">MCSA</span><span class="tag">MCITP</span></div>
|
||||
</section>
|
||||
</aside>
|
||||
|
||||
<div class="resume-main">
|
||||
<section class="resume-section">
|
||||
<h2>Professional summary</h2>
|
||||
<p>Infrastructure-focused Senior Systems Administrator with expertise in VMware, Windows Server, Linux, PowerShell automation, Kubernetes, Terraform, Ansible, GitOps, networking, and enterprise platform operations. Proven success supporting large-scale environments while improving automation, standardization, reliability, and operational visibility.</p>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Professional experience</h2>
|
||||
<article class="resume-role">
|
||||
<h3>Trinity Health — System Administrator</h3>
|
||||
<div class="meta">January 2024 – Present</div>
|
||||
<ul>
|
||||
<li>Support infrastructure consisting of approximately 17,000 physical and virtual servers in a multi-site healthcare environment.</li>
|
||||
<li>Maintain Windows Server and VMware platforms supporting critical healthcare applications and infrastructure services.</li>
|
||||
<li>Perform provisioning, upgrades, migrations, troubleshooting, and decommissioning across the server lifecycle.</li>
|
||||
<li>Develop PowerShell automation to reduce manual work and improve consistency.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article class="resume-role">
|
||||
<h3>Trinity Health / Saint Joseph Regional Medical Center — Senior Client Technologies Analyst / System Administrator</h3>
|
||||
<div class="meta">March 2021 – December 2023</div>
|
||||
<ul>
|
||||
<li>Supported approximately 300 physical and virtual servers.</li>
|
||||
<li>Administered VMware infrastructure supporting critical healthcare operations.</li>
|
||||
<li>Installed and maintained server hardware, operating systems, datacenter deployments, and enterprise applications.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article class="resume-role">
|
||||
<h3>Progressive infrastructure and technical roles</h3>
|
||||
<div class="meta">2000 – 2021</div>
|
||||
<p>Systems Engineer, Systems Administrator, Junior Network Engineer, Desktop/Network Analyst, IT Contractor, healthcare support analyst, and U.S. Army Signal Support Systems Specialist.</p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Selected technical projects</h2>
|
||||
<article class="resume-role">
|
||||
<h3>Enterprise infrastructure home lab</h3>
|
||||
<ul>
|
||||
<li>Built and maintained a four-node Kubernetes cluster using Argo CD GitOps workflows.</li>
|
||||
<li>Implemented Prometheus, Grafana, Loki, Alertmanager, Uptime Kuma, and Zabbix monitoring.</li>
|
||||
<li>Designed routed VLAN architecture and centralized firewall management through pfSense.</li>
|
||||
<li>Deployed Longhorn storage, certificate automation, ingress, sealed secrets, backups, NetBox, phpIPAM, and multiple self-hosted workloads.</li>
|
||||
<li>Used PowerShell, Terraform, Ansible, Packer, Bash, and Git to automate infrastructure tasks.</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article class="resume-role">
|
||||
<h3>Microsoft platform engineering</h3>
|
||||
<ul>
|
||||
<li>Built a SharePoint Server Subscription Edition farm with SSL, MySites, managed metadata, user profiles, and SQL storage design.</li>
|
||||
<li>Developed SCCM PXE and task-sequence workflows for Windows Server deployment and in-place upgrades.</li>
|
||||
<li>Created reusable PowerShell automation for Active Directory, server lifecycle, prerequisite installation, reporting, and remediation.</li>
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Education & certifications</h2>
|
||||
<div class="grid two">
|
||||
<div>
|
||||
<h3>Education</h3>
|
||||
<p><strong>Master of Information Systems</strong><br>University of Phoenix, 2026<br>Dean’s List · Epsilon Pi Tau Honor Society</p>
|
||||
<p><strong>Bachelor of Science in Information Technology</strong><br>University of Phoenix, 2017<br>National Society of Collegiate Scholars</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Certifications</h3>
|
||||
<p>Microsoft Azure Fundamentals (AZ-900)<br>Microsoft Certified Professional<br>MCSA: Windows Server 2008<br>MCITP: Enterprise Administrator</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer shell print-hide"><span>© 2026 Jay Phillips</span><span>Public-safe résumé — phone number and street address intentionally omitted.</span></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow: /
|
||||
@@ -0,0 +1,341 @@
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--background: #07111f;
|
||||
--background-deep: #050d17;
|
||||
--surface: rgba(15, 31, 51, 0.84);
|
||||
--surface-strong: #10243a;
|
||||
--surface-soft: rgba(10, 26, 43, 0.72);
|
||||
--border: rgba(148, 184, 219, 0.2);
|
||||
--border-strong: rgba(101, 212, 255, 0.38);
|
||||
--text: #eef7ff;
|
||||
--muted: #a7bed2;
|
||||
--muted-strong: #c8dbea;
|
||||
--accent: #65d4ff;
|
||||
--accent-strong: #79f2c0;
|
||||
--danger: #ffab9d;
|
||||
--shadow: 0 24px 70px rgba(0, 0, 0, 0.32);
|
||||
--radius: 22px;
|
||||
--radius-small: 14px;
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
html { scroll-behavior: smooth; }
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
color: var(--text);
|
||||
background:
|
||||
radial-gradient(circle at 10% 5%, rgba(49, 173, 255, 0.2), transparent 29rem),
|
||||
radial-gradient(circle at 92% 18%, rgba(62, 242, 179, 0.13), transparent 27rem),
|
||||
linear-gradient(145deg, #06101d 0%, #0a1727 52%, #07111f 100%);
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
a { color: inherit; }
|
||||
img { max-width: 100%; display: block; }
|
||||
button, input, textarea { font: inherit; }
|
||||
|
||||
.skip-link {
|
||||
position: fixed;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
z-index: 1000;
|
||||
padding: 10px 14px;
|
||||
border-radius: 10px;
|
||||
background: var(--accent);
|
||||
color: #032033;
|
||||
font-weight: 800;
|
||||
transform: translateY(-180%);
|
||||
}
|
||||
.skip-link:focus { transform: translateY(0); }
|
||||
|
||||
.shell {
|
||||
width: min(1180px, calc(100% - 36px));
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.site-header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 50;
|
||||
border-bottom: 1px solid rgba(148, 184, 219, 0.12);
|
||||
background: rgba(5, 13, 23, 0.84);
|
||||
backdrop-filter: blur(18px);
|
||||
}
|
||||
|
||||
.nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 24px;
|
||||
min-height: 78px;
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.01em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.brand-mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(135deg, rgba(101, 212, 255, 0.22), rgba(121, 242, 192, 0.15));
|
||||
color: var(--accent);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 21px;
|
||||
color: var(--muted);
|
||||
font-size: 0.93rem;
|
||||
}
|
||||
.nav-links a { text-decoration: none; }
|
||||
.nav-links a:hover, .nav-links a:focus-visible, .nav-links a[aria-current="page"] { color: var(--text); }
|
||||
|
||||
.hero {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.35fr) minmax(300px, 0.65fr);
|
||||
gap: 48px;
|
||||
align-items: center;
|
||||
padding: 88px 0 74px;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 9px;
|
||||
margin-bottom: 18px;
|
||||
color: var(--accent-strong);
|
||||
font-size: 0.8rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.16em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.eyebrow::before { content: ""; width: 28px; height: 1px; background: currentColor; }
|
||||
|
||||
h1, h2, h3, h4, p { margin-top: 0; }
|
||||
h1 {
|
||||
max-width: 860px;
|
||||
margin-bottom: 22px;
|
||||
font-size: clamp(3rem, 7.2vw, 6.4rem);
|
||||
line-height: 0.97;
|
||||
letter-spacing: -0.064em;
|
||||
}
|
||||
h1 span, .gradient-text {
|
||||
color: transparent;
|
||||
background: linear-gradient(90deg, var(--accent), var(--accent-strong));
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
}
|
||||
|
||||
.hero-copy {
|
||||
max-width: 760px;
|
||||
margin-bottom: 28px;
|
||||
color: var(--muted);
|
||||
font-size: clamp(1.04rem, 1.8vw, 1.24rem);
|
||||
}
|
||||
|
||||
.actions { display: flex; flex-wrap: wrap; gap: 12px; }
|
||||
.button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 48px;
|
||||
padding: 0 20px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 14px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
text-decoration: none;
|
||||
font-weight: 750;
|
||||
transition: transform 160ms ease, border-color 160ms ease, background 160ms ease;
|
||||
}
|
||||
.button.primary { border-color: transparent; background: linear-gradient(110deg, var(--accent), var(--accent-strong)); color: #032033; }
|
||||
.button.small { min-height: 40px; padding: 0 15px; font-size: 0.9rem; }
|
||||
.button:hover, .button:focus-visible { transform: translateY(-2px); border-color: rgba(101, 212, 255, 0.58); }
|
||||
|
||||
.status-card, .panel, .card, .timeline-item, .project-card, .resume-panel {
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
background: linear-gradient(155deg, rgba(16, 36, 58, 0.92), rgba(8, 22, 38, 0.82));
|
||||
box-shadow: inset 0 1px rgba(255, 255, 255, 0.035);
|
||||
}
|
||||
|
||||
.status-card { position: relative; overflow: hidden; padding: 28px; box-shadow: var(--shadow); }
|
||||
.status-card::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
right: -55px;
|
||||
bottom: -75px;
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
border-radius: 50%;
|
||||
background: rgba(101, 212, 255, 0.09);
|
||||
}
|
||||
.status-line { display: flex; align-items: center; gap: 10px; margin-bottom: 24px; color: var(--accent-strong); font-weight: 800; }
|
||||
.pulse { width: 10px; height: 10px; border-radius: 50%; background: currentColor; box-shadow: 0 0 0 7px rgba(121, 242, 192, 0.12); }
|
||||
.status-list { display: grid; gap: 14px; margin: 0; padding: 0; list-style: none; color: var(--muted); font-size: 0.93rem; }
|
||||
.status-list li { display: flex; justify-content: space-between; gap: 18px; padding-bottom: 13px; border-bottom: 1px solid var(--border); }
|
||||
.status-list li:last-child { padding-bottom: 0; border-bottom: 0; }
|
||||
.status-list strong { color: var(--text); text-align: right; }
|
||||
|
||||
.metric-strip {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
gap: 1px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 24px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
background: var(--border);
|
||||
}
|
||||
.metric { padding: 26px; background: rgba(8, 22, 38, 0.92); }
|
||||
.metric strong { display: block; color: var(--text); font-size: clamp(1.65rem, 3vw, 2.3rem); line-height: 1.1; }
|
||||
.metric span { color: var(--muted); font-size: 0.9rem; }
|
||||
|
||||
section { padding: 74px 0; scroll-margin-top: 86px; }
|
||||
.section-heading {
|
||||
display: grid;
|
||||
grid-template-columns: 0.8fr 1.2fr;
|
||||
gap: 44px;
|
||||
align-items: end;
|
||||
margin-bottom: 34px;
|
||||
}
|
||||
h2 { margin-bottom: 0; font-size: clamp(2rem, 4vw, 3.35rem); line-height: 1.05; letter-spacing: -0.047em; }
|
||||
.section-heading p { margin-bottom: 4px; color: var(--muted); }
|
||||
.section-kicker { margin-bottom: 10px; color: var(--accent); font-size: 0.78rem; font-weight: 800; letter-spacing: 0.15em; text-transform: uppercase; }
|
||||
|
||||
.grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
|
||||
.grid.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.card { min-height: 100%; padding: 26px; }
|
||||
.card-number { margin-bottom: 30px; color: var(--accent); font-size: 0.74rem; font-weight: 800; letter-spacing: 0.15em; }
|
||||
.card h3, .project-card h3 { margin-bottom: 10px; font-size: 1.24rem; }
|
||||
.card p, .project-card p { color: var(--muted); font-size: 0.96rem; }
|
||||
|
||||
.tags { display: flex; flex-wrap: wrap; gap: 8px; }
|
||||
.tag { padding: 6px 9px; border: 1px solid var(--border); border-radius: 999px; color: #cae1f3; background: rgba(255, 255, 255, 0.025); font-size: 0.75rem; font-weight: 700; }
|
||||
|
||||
.timeline { display: grid; gap: 16px; }
|
||||
.timeline-item { display: grid; grid-template-columns: 230px 1fr; gap: 30px; padding: 28px; }
|
||||
.timeline-meta { color: var(--muted); font-size: 0.9rem; }
|
||||
.timeline-meta strong { display: block; margin-bottom: 4px; color: var(--accent-strong); font-size: 1rem; }
|
||||
.timeline-item h3 { margin-bottom: 8px; }
|
||||
.timeline-item p { color: var(--muted); }
|
||||
.timeline-item ul { margin: 14px 0 0; padding-left: 20px; color: var(--muted-strong); }
|
||||
.timeline-item li + li { margin-top: 7px; }
|
||||
|
||||
.project-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
|
||||
.project-card { display: flex; flex-direction: column; padding: 28px; }
|
||||
.project-card .card-number { margin-bottom: 24px; }
|
||||
.project-card .tags { margin-top: auto; padding-top: 14px; }
|
||||
.project-link { display: inline-flex; margin-top: 20px; color: var(--accent); font-weight: 800; text-decoration: none; }
|
||||
.project-link::after { content: " →"; }
|
||||
.project-link:hover, .project-link:focus-visible { color: var(--accent-strong); }
|
||||
|
||||
.architecture-panel { padding: 22px; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(6, 17, 30, 0.54); }
|
||||
.architecture-panel img { border-radius: 18px; }
|
||||
|
||||
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
|
||||
.panel { padding: 28px; }
|
||||
.panel h3 { margin-bottom: 14px; }
|
||||
.clean-list { margin: 0; padding: 0; list-style: none; }
|
||||
.clean-list li { position: relative; padding: 12px 0 12px 26px; border-bottom: 1px solid var(--border); color: var(--muted-strong); }
|
||||
.clean-list li:last-child { border-bottom: 0; }
|
||||
.clean-list li::before { content: ""; position: absolute; left: 0; top: 22px; width: 9px; height: 9px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 5px rgba(101, 212, 255, 0.09); }
|
||||
|
||||
.callout { display: flex; align-items: center; justify-content: space-between; gap: 28px; padding: 36px; border: 1px solid var(--border-strong); border-radius: var(--radius); background: linear-gradient(115deg, rgba(101, 212, 255, 0.12), rgba(121, 242, 192, 0.08)); }
|
||||
.callout h2 { margin-bottom: 8px; }
|
||||
.callout p { margin-bottom: 0; color: var(--muted); }
|
||||
|
||||
.page-hero { padding: 76px 0 36px; }
|
||||
.page-hero h1 { max-width: 980px; font-size: clamp(2.8rem, 6vw, 5.4rem); }
|
||||
.breadcrumb { margin-bottom: 18px; color: var(--muted); font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--accent); text-decoration: none; }
|
||||
.lead { max-width: 860px; color: var(--muted); font-size: 1.15rem; }
|
||||
|
||||
.case-layout { display: grid; grid-template-columns: minmax(0, 1fr) 310px; gap: 28px; align-items: start; }
|
||||
.case-content { display: grid; gap: 22px; }
|
||||
.case-section { padding: 30px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface-soft); }
|
||||
.case-section h2 { margin-bottom: 18px; font-size: clamp(1.7rem, 3vw, 2.35rem); }
|
||||
.case-section h3 { margin: 22px 0 8px; }
|
||||
.case-section p, .case-section li { color: var(--muted-strong); }
|
||||
.case-section ul { padding-left: 20px; }
|
||||
.case-section li + li { margin-top: 7px; }
|
||||
.case-sidebar { position: sticky; top: 100px; }
|
||||
.case-sidebar .panel + .panel { margin-top: 16px; }
|
||||
.fact-list { display: grid; gap: 11px; margin: 0; }
|
||||
.fact-list div { display: grid; gap: 2px; padding-bottom: 11px; border-bottom: 1px solid var(--border); }
|
||||
.fact-list div:last-child { padding-bottom: 0; border-bottom: 0; }
|
||||
.fact-list dt { color: var(--muted); font-size: 0.8rem; }
|
||||
.fact-list dd { margin: 0; color: var(--text); font-weight: 750; }
|
||||
|
||||
.resume-wrap { display: grid; grid-template-columns: 270px 1fr; gap: 24px; align-items: start; }
|
||||
.resume-sidebar { position: sticky; top: 100px; }
|
||||
.resume-panel { padding: 28px; }
|
||||
.resume-panel + .resume-panel { margin-top: 18px; }
|
||||
.resume-main { display: grid; gap: 18px; }
|
||||
.resume-section { padding: 32px; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(8, 22, 38, 0.72); }
|
||||
.resume-section h2 { margin-bottom: 20px; font-size: 2rem; }
|
||||
.resume-role { padding: 20px 0; border-top: 1px solid var(--border); }
|
||||
.resume-role:first-of-type { padding-top: 0; border-top: 0; }
|
||||
.resume-role h3 { margin-bottom: 4px; }
|
||||
.resume-role .meta { margin-bottom: 12px; color: var(--accent-strong); font-weight: 700; }
|
||||
.resume-role ul { margin-bottom: 0; padding-left: 20px; color: var(--muted-strong); }
|
||||
.skill-groups { display: grid; gap: 18px; }
|
||||
.skill-group h3 { margin-bottom: 8px; font-size: 1rem; color: var(--accent); }
|
||||
.skill-group p { margin-bottom: 0; color: var(--muted-strong); }
|
||||
|
||||
.contact-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
|
||||
.contact-row a { color: var(--accent); font-weight: 750; }
|
||||
|
||||
.site-footer { display: flex; justify-content: space-between; gap: 22px; padding: 34px 0 50px; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.9rem; }
|
||||
|
||||
@media (max-width: 950px) {
|
||||
.hero, .section-heading, .split, .case-layout, .resume-wrap { grid-template-columns: 1fr; }
|
||||
.grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.timeline-item { grid-template-columns: 1fr; gap: 10px; }
|
||||
.metric-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.case-sidebar, .resume-sidebar { position: static; }
|
||||
}
|
||||
|
||||
@media (max-width: 690px) {
|
||||
.shell { width: min(100% - 24px, 1180px); }
|
||||
.site-header { position: static; }
|
||||
.nav { align-items: flex-start; flex-direction: column; padding: 18px 0; }
|
||||
.nav-links { gap: 13px 18px; }
|
||||
.hero { padding: 54px 0 48px; }
|
||||
h1 { font-size: clamp(3rem, 16vw, 4.7rem); }
|
||||
section { padding: 54px 0; }
|
||||
.grid, .grid.two, .project-grid, .metric-strip { grid-template-columns: 1fr; }
|
||||
.callout, .site-footer { align-items: flex-start; flex-direction: column; }
|
||||
.status-list li { align-items: flex-start; flex-direction: column; gap: 4px; }
|
||||
.status-list strong { text-align: left; }
|
||||
}
|
||||
|
||||
@media print {
|
||||
:root { color-scheme: light; }
|
||||
body { color: #111; background: #fff; font-size: 10.5pt; }
|
||||
.site-header, .site-footer, .actions, .skip-link, .print-hide { display: none !important; }
|
||||
.shell { width: 100%; }
|
||||
.page-hero { padding: 0 0 18px; }
|
||||
.page-hero h1 { color: #111; font-size: 30pt; }
|
||||
.gradient-text { color: #111; background: none; -webkit-text-fill-color: initial; }
|
||||
.lead, .resume-role ul, .resume-section p, .skill-group p { color: #222; }
|
||||
.resume-wrap { display: block; }
|
||||
.resume-sidebar { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 12px; }
|
||||
.resume-panel, .resume-section { break-inside: avoid; border: 1px solid #bbb; background: #fff; box-shadow: none; }
|
||||
.resume-panel + .resume-panel { margin-top: 0; }
|
||||
.tag { color: #111; border-color: #aaa; background: #fff; }
|
||||
a { text-decoration: none; }
|
||||
}
|
||||
Reference in New Issue
Block a user