PageSourceSearch

https://dylanbochman.netlify.app/assets/Runbook-BQMCb5aY.js

js dylanbochman.netlify.app collected 2026-10-03 10:40:26 UTC 12,792 bytes, 15 lines download raw bytes

1import{j as e,B as i}from"./vendor-B8mTEsSR.js";import{P as r}from"./index-B1jOIFiH.js";import"./ui-Dc_FVRD7.js";import"./blog-loader-BhJ8bIFE.js";import"./monitoring-DrLQlyIz.js";import"./theme-FyGxoSVC.js";const c=[{label:"Status",links:[{text:"stats.uptimerobot.com/zquZllQfNJ",url:"https://stats.uptimerobot.com/zquZllQfNJ"}]},{label:"Repo",links:[{text:"Dbochman/personal-website",url:"https://github.com/Dbochman/personal-website"}]},{label:"Deploy",links:[{text:"Dbochman/dbochman.github.io",url:"https://github.com/Dbochman/dbochman.github.io"}]},{label:"CMS",links:[{text:"dylanbochman.com/editor",url:"https://dylanbochman.com/editor/index.html"}]},{label:"Dependencies",links:[{text:"GitHub",url:"https://githubstatus.com"},{text:"Fastly",url:"https://status.fastly.com"},{text:"NPM",url:"https://status.npmjs.org"},{text:"Google",url:"https://status.cloud.google.com"},{text:"Sentry",url:"https://status.sentry.io"}]}],m={stack:[{item:"Hosting",value:"GitHub Pages with CDN (Fastly)"},{item:"Domain",value:"dylanbochman.com (custom domain via CNAME)"},{item:"Tech Stack",value:"React 18 + TypeScript + Vite 7 + Tailwind CSS 3"},{item:"Runtime",value:"Node.js 24 LTS (npm 11.x)"},{item:"Deployment",value:"GitHub Actions CI/CD pipeline"},{item:"Content Management",value:"Decap CMS (GitHub OAuth, /editor route)"},{item:"Monitoring",value:"UptimeRobot + Automated SEO Checks + Console Error Detection + Core Web Vitals + Google Analytics"}]},d=[{component:"Origin",description:"GitHub Pages (static hosting)"},{component:"CDN",description:"Fastly (via GitHub Pages)"},{component:"DNS",description:"Domain registrar DNS (points to GitHub Pages)"},{component:"CI/CD",description:"GitHub Actions (.github/workflows/deploy.yml)"},{component:"Dependencies",description:"NPM packages (managed by Dependabot)"}],u=[{name:"UptimeRobot (External Monitoring)",details:[{label:"Check Frequency",value:"Every 5 minutes"},{label:"Monitored URL",value:{text:"https://dylanbochman.com",url:"https://dylanbochman.com"}},{label:"Alert Method",value:"Email notification"},{label:"Status Page",value:{text:"stats.uptimerobot.com/zquZllQfNJ",url:"https://stats.uptimerobot.com/zquZllQfNJ"}}]},{name:"Automated SEO Monitoring",details:[{label:"Workflow",value:"Weekly SEO Check (GitHub Actions)"},{label:"Schedule",value:"Every Monday at 9 AM UTC"},{label:"Metrics",value:"Performance, SEO scores, Core Web Vitals"},{label:"Alerting",value:"GitHub issues created if scores drop below thresholds"},{label:"Documentation",value:{text:"AUTOMATED_SEO_CHECKS.md",url:"https://github.com/Dbochman/personal-website/blob/main/docs/AUTOMATED_SEO_CHECKS.md"}}]},{name:"Console Error Monitoring",details:[{label:"Workflow",value:"Automated Playwright tests after each deployment"},{label:"Coverage",value:"Home page + Runbook page"},{label:"Detection",value:"JavaScript errors, runtime exceptions, console warnings"},{label:"Alerting",value:"GitHub issues with screenshots and error logs"},{label:"Documentation",value:{text:"CONSOLE_ERROR_MONITORING.md",url:"https://github.com/Dbochman/personal-website/blob/main/docs/CONSOLE_ERROR_MONITORING.md"}}]},{name:"Core Web Vitals Tracking",details:[{label:"Integration",value:"Google Analytics 4 custom events"},{label:"Metrics",value:"LCP, FID, CLS, INP, FCP, TTFB"},{label:"Mode",value:"Production only (real user monitoring)"},{label:"Dashboard",value:"Google Analytics → Events → Web Vitals"}]},{name:"GitHub Actions (CI/CD Monitoring)",details:[{label:"Build status",value:"Check workflow runs"},{label:"Test results",value:"Automated test suite (Vitest + Playwright)"},{label:"Security",value:"npm audit + Dependabot alerts"},{label:"Performance",value:"Lighthouse CI budgets"}]}],h=[{title:"Site Completely Down",actions:"Check UptimeRobot → Try dbochman.github.io → Check GitHub status → Run nslookup dylanbochman.com",causes:"GitHub Pages outage | CDN issues (Fastly) | DNS misconfiguration | Repo access | Build failure | NPM registry down"},{title:"Slow Performance",investigate:"Run Lighthouse audit → Check dist/bundle-analysis.html → Verify CDN status → Review Core Web Vitals",fixes:"Code splitting | Image optimization | Audit third-party scripts | CDN cache refresh"},{title:"JavaScript Errors",investigate:"Review Sentry dashboard → Test in multiple browsers → Check recent deployments"},{title:"Build/Deployment Failures",check:"GitHub Actions logs → npm test output → npm audit results → package-lock.json 
1integrity"},{title:"CMS Editor Issues",investigate:"Check /editor/index.html loads → Verify GitHub OAuth is working → Check browser console for errors",causes:"GitHub API rate limits | OAuth app misconfiguration | CORS issues | Decap CMS CDN down",fixes:"Verify config.yml settings → Check GitHub permissions → Clear browser cache → Try different browser"}],b=[{title:"Emergency Rollback",code:`# Identify last known good commit
2git log --oneline -10
3
4# Create rollback branch
5git checkout -b emergency-rollback
6
7# Reset to stable commit
8git reset --hard <stable-commit-hash>
9
10# Force push (bypasses branch protection)
11git push origin main --force`},{title:"DNS Recovery",code:`# Verify current DNS settings
12nslookup dylanbochman.com
13
14# Expected CNAME record
15dylanbochman.com CNAME dbochman.github.io`}],p=[{role:"Primary Response",name:"Dylan Bochman - Site Owner/Technical Incident Manager",details:["Email: [email protected]","LinkedIn: linkedin.com/in/dbochman"]}],x=[{text:"GitHub Support",url:"https://githubstatus.com"},{text:"Domain Registrar",url:"#"},{text:"Google Support",url:"https://status.cloud.google.com"},{text:"Fastly CDN",url:"https://status.fastly.com"},{text:"Sentry Support",url:"https://status.sentry.io"}],g=[{title:"Documentation",links:[{text:"GitHub Pages Docs",url:"https://docs.github.com/en/pages"},{text:"Vite Documentation",url:"https://vitejs.dev/guide/"},{text:"React Documentation",url:"https://react.dev/"},{text:"Lighthouse Performance",url:"https://developers.google.com/web/tools/lighthouse"}]},{title:"Tools",links:[{text:"PageSpeed Insights",url:"https://pagespeed.web.dev/"},{text:"GTmetrix",url:"https://gtmetrix.com/"},{text:"WebPageTest",url:"https://webpagetest.org/"},{text:"Chrome DevTools",url:"https://developer.chrome.com/docs/devtools/"}]}],a={maintainer:"Dylan Bochman",email:"[email protected]",lastUpdated:"2026-01-09"},n=({link:t})=>e.jsx("a",{href:t.url,target:"_blank",rel:"noopener noreferrer",className:"text-foreground underline hover:opacity-70 transition-opacity",children:t.text}),j=()=>e.jsxs("section",{className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground
15/20 pb-2 mb-4",children:"Quick References"}),e.jsx("div",{className:"space-y-2",children:c.map((t,s)=>e.jsxs("p",{className:"text-foreground",children:[e.jsxs("strong",{children:[t.label,":"]})," ",t.links.map((o,l)=>e.jsxs("span",{children:[l>0&&" | ",e.jsx(n,{link:o})]},l))]},s))})]}),y=()=>e.jsxs("section",{className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground/20 pb-2 mb-4",children:"Architecture Overview"}),e.jsx("ul",{className:"list-disc pl-6 space-y-2",children:m.stack.map((t,s)=>e.jsxs("li",{children:[e.jsxs("strong",{children:[t.item,":"]})," ",t.value]},s))}),e.jsx("h3",{className:"text-xl font-bold mt-6 mb-3",children:"Infrastructure Components"}),e.jsx("ul",{className:"list-disc pl-6 space-y-2",children:d.map((t,s)=>e.jsxs("li",{children:[e.jsxs("strong",{children:[t.component,":"]})," ",t.description]},s))})]}),f=()=>e.jsxs("section",{id:"monitoring",className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground/20 pb-2 mb-4",children:"Monitoring & Alerting"}),u.map((t,s)=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-xl font-bold mb-3",children:t.name}),e.jsx("ul",{className:"list-disc pl-6 space-y-1",children:t.details.map((o,l)=>e.jsxs("li",{children:[e.jsxs("strong",{children:[o.label,":"]})," ",typeof o.value=="string"?o.value:e.jsx(n,{link:o.value})]},l))})]},s))]}),N=()=>e.jsxs("section",{className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground
15/20 pb-2 mb-4",children:"Troubleshooting Guide"}),h.map((t,s)=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-xl font-bold mb-2",children:t.title}),t.actions&&e.jsxs("p",{className:"mb-2",children:[e.jsx("strong",{children:"Actions:"})," ",t.actions]}),t.investigate&&e.jsxs("p",{className:"mb-2",children:[e.jsx("strong",{children:"Investigate:"})," ",t.investigate]}),t.fixes&&e.jsxs("p",{className:"mb-2",children:[e.jsx("strong",{children:"Fixes:"})," ",t.fixes]}),t.check&&e.jsxs("p",{className:"mb-2",children:[e.jsx("strong",{children:"Check:"})," ",t.check]}),t.causes&&e.jsxs("p",{className:"mb-2",children:[e.jsx("strong",{children:"Causes:"})," ",t.causes]})]},s))]}),v=()=>e.jsxs("section",{id:"recovery",className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground/20 pb-2 mb-4",children:"Recovery Procedures"}),b.map((t,s)=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-xl font-bold mb-3",children:t.title}),e.jsx("pre",{className:"bg-muted p-4 rounded-md overflow-x-auto border border-border",children:e.jsx("code",{className:"text-sm font-mono",children:t.code})})]},s))]}),k=()=>e.jsxs("section",{className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground
15/20 pb-2 mb-4",children:"Escalation Paths"}),p.map((t,s)=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-xl font-bold mb-2",children:t.role}),e.jsx("p",{className:"mb-2",children:e.jsx("strong",{children:t.name})}),t.details.map((o,l)=>e.jsx("p",{className:"ml-4",children:o},l))]},s)),e.jsx("h3",{className:"text-xl font-bold mt-6 mb-3",children:"External Dependencies"}),e.jsx("ul",{className:"list-disc pl-6 space-y-1",children:x.map((t,s)=>e.jsxs("li",{children:[e.jsxs("strong",{children:[t.text,":"]})," ",t.url!=="#"?e.jsxs(e.Fragment,{children:["For platform-level issues (",e.jsx(n,{link:t}),")"]}):"For DNS-related problems"]},s))})]}),C=()=>e.jsxs("section",{className:"mb-8",children:[e.jsx("h2",{className:"text-2xl font-bold border-b-2 border-foreground/20 pb-2 mb-4",children:"Additional Resources"}),g.map((t,s)=>e.jsxs("div",{className:"mb-6",children:[e.jsx("h3",{className:"text-xl font-bold mb-3",children:t.title}),e.jsx("ul",{className:"list-disc pl-6 space-y-1",children:t.links.map((o,l)=>e.jsx("li",{children:e.jsx(n,{link:o})},l))})]},s))]}),D=()=>e.jsx("footer",{className:"border-t border-border mt-16 pt-8",children:e.jsxs("div",{className:"flex justify-between items-center flex-wrap gap-4 opacity-70",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm mb-1",children:[e.jsx("strong",{children:"Runbook Maintainer:"})," ",a.maintainer," |"," ",e.jsx("a",{href:`mailto:${a.email}`,className:"underline hover:opacity-70",children:a.email})]}),e.jsxs("p",{className:"text-sm",children:["Last Updated: ",a.lastUpdated]})]}),e.jsxs("div",{className:"flex gap-6 text-sm",children:[e.jsx("a",{href:"https://stats.uptimerobot.com/zquZllQfNJ",target:"_blank",rel:"noopener noreferrer",className:"hover:opacity-70",children:"Status"}),e.jsx("a",{href:"https://github.com/Dbochman/personal-website",target:"_blank",rel:"noopener noreferrer",className:"hover:opacity-70",children:"GitHub"}),e.jsx("a",{href:"/",className:"hover:opacity-70",children:"Home"})]})]})});function O(){return e.jsxs(e.Fragment,{children:[e.jsxs(i,{children:[e.jsx("title",{children:"Operational Runbook - Dylan Bochman"}),e.jsx("meta",{name:"description",content:"Operational runbook for dylanbochman.com - incident response procedures, troubleshooting guides, performance standards, and escalation paths for site reliability."}),e.jsx("meta",{name:"keywords",content:"Runbook, Incident Response, SRE, Site Reliability, Operations, Troubleshooting, Monitoring"}),e.jsx("meta",{property:"og:title",content:"Operational Runbook - Dylan Bochman"}),e.jsx("meta",{property:"og:description",content:"Operational runbook for dylanbochman.com - incident response procedures, troubleshooting guides, and escalation paths."}),e.jsx("meta",{property:"og:type",content:"website"}),e.jsx("link",{rel:"canonical",href:"https://dylanbochman.com/runbook"})]}),e.jsx(r,{children:e.jsxs("div",{className:"container mx-auto px-4 py-12 max-w-4xl",children:[e.jsx("header",{className:"mb-12 text-center",children:e.jsx("h1",{className:"text-6xl font-bold mb-4 font-mono tracking-tight",children:"Operational Runbook"})}),e.jsxs("div",{className:"space-y-8",children:[e.jsx(j,{}),e.jsx(y,{}),e.jsx(f,{}),e.jsx(N,{}),e.jsx(v,{}),e.jsx(k,{}),e.jsx(C,{})]}),e.jsx(D,{})]})})]})}export{O as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.