add hire/resume pages, contact form, security middleware, and admin improvements
This commit is contained in:
@@ -2,8 +2,11 @@
|
||||
{{define "meta-desc"}}About Ridgway Systems — a personal OpenBSD homelab project.{{end}}
|
||||
|
||||
{{define "content"}}
|
||||
<div class="page-header">
|
||||
<h1>About</h1>
|
||||
<div class="about-header">
|
||||
<img src="/static/img/avatar.svg" alt="Ridgway Systems" class="about-avatar">
|
||||
<div>
|
||||
<h1>About</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="prose">
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<div class="admin-actions">
|
||||
<a href="/admin/new" class="btn">New Post</a>
|
||||
<a href="/admin/status" class="btn btn-outline">Edit Status</a>
|
||||
<a href="/admin/uploads" class="btn btn-outline">Uploads</a>
|
||||
<a href="/" class="btn btn-outline">View Site</a>
|
||||
<form method="POST" action="/admin/logout" class="inline-form">
|
||||
<button type="submit" class="btn btn-outline">Logout</button>
|
||||
|
||||
@@ -45,60 +45,5 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
var previewBtn = document.getElementById('preview-btn');
|
||||
var uploadBtn = document.getElementById('upload-btn');
|
||||
var imgFile = document.getElementById('img-file');
|
||||
var textarea = document.getElementById('content');
|
||||
var output = document.getElementById('preview-output');
|
||||
var uploadStatus = document.getElementById('upload-status');
|
||||
|
||||
// --- Preview ---
|
||||
function refreshPreview() {
|
||||
var fd = new FormData();
|
||||
fd.append('content', textarea.value);
|
||||
fetch('/admin/preview', { method: 'POST', body: fd })
|
||||
.then(function(r) { return r.text(); })
|
||||
.then(function(html) { output.innerHTML = html; })
|
||||
.catch(function() { output.innerHTML = '<p class="form-error">Preview failed.</p>'; });
|
||||
}
|
||||
|
||||
previewBtn.addEventListener('click', refreshPreview);
|
||||
if (textarea.value.trim()) { refreshPreview(); }
|
||||
|
||||
// --- Image upload ---
|
||||
uploadBtn.addEventListener('click', function() { imgFile.click(); });
|
||||
|
||||
imgFile.addEventListener('change', function() {
|
||||
if (!this.files.length) return;
|
||||
var file = this.files[0];
|
||||
var fd = new FormData();
|
||||
fd.append('image', file);
|
||||
|
||||
uploadStatus.textContent = 'Uploading…';
|
||||
uploadBtn.disabled = true;
|
||||
|
||||
fetch('/admin/upload', { method: 'POST', body: fd })
|
||||
.then(function(r) { return r.json(); })
|
||||
.then(function(data) {
|
||||
if (data.error) {
|
||||
uploadStatus.textContent = 'Error: ' + data.error;
|
||||
return;
|
||||
}
|
||||
// Insert markdown at cursor position
|
||||
var pos = textarea.selectionStart;
|
||||
var before = textarea.value.substring(0, pos);
|
||||
var after = textarea.value.substring(textarea.selectionEnd);
|
||||
textarea.value = before + data.markdown + after;
|
||||
textarea.selectionStart = textarea.selectionEnd = pos + data.markdown.length;
|
||||
textarea.focus();
|
||||
uploadStatus.textContent = 'Inserted: ' + data.url;
|
||||
setTimeout(function() { uploadStatus.textContent = ''; }, 3000);
|
||||
})
|
||||
.catch(function() { uploadStatus.textContent = 'Upload failed.'; })
|
||||
.finally(function() { uploadBtn.disabled = false; imgFile.value = ''; });
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="/static/js/editor.js"></script>
|
||||
{{end}}
|
||||
|
||||
30
templates/admin/uploads.html
Normal file
30
templates/admin/uploads.html
Normal file
@@ -0,0 +1,30 @@
|
||||
{{define "title"}}Uploads — Admin{{end}}
|
||||
|
||||
{{define "content"}}
|
||||
<div class="admin-wrap">
|
||||
<div class="admin-header">
|
||||
<h1>Uploads</h1>
|
||||
<div class="admin-actions">
|
||||
<a href="/admin" class="btn btn-outline">Back to Dashboard</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{if .Flash}}<p class="flash">{{.Flash}}</p>{{end}}
|
||||
|
||||
{{if not .Files}}
|
||||
<p class="muted">No uploaded images yet.</p>
|
||||
{{else}}
|
||||
<div class="upload-browser">
|
||||
{{range .Files}}
|
||||
<div class="upload-item">
|
||||
<img src="{{.URL}}" alt="{{.Name}}" class="upload-thumb">
|
||||
<div class="upload-info">
|
||||
<code class="upload-name">{{.Name}}</code>
|
||||
<code class="upload-md">{{.Markdown}}</code>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -15,6 +15,9 @@
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="{{block "tw-title" .}}Ridgway Systems{{end}}">
|
||||
<meta name="twitter:description" content="{{block "tw-desc" .}}A homelab built on OpenBSD — from firewall to git server.{{end}}">
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
|
||||
<meta property="og:image" content="{{block "og-image" .}}https://ridgwaysystems.org/static/img/avatar.svg{{end}}">
|
||||
<meta name="twitter:image" content="{{block "tw-image" .}}https://ridgwaysystems.org/static/img/avatar.svg{{end}}">
|
||||
<link rel="stylesheet" href="/static/css/style.css">
|
||||
<link rel="stylesheet" href="/static/css/syntax.css">
|
||||
<link rel="alternate" type="application/rss+xml" title="Ridgway Systems" href="/blog/feed.xml">
|
||||
@@ -28,6 +31,7 @@
|
||||
<li><a href="/infrastructure">infrastructure</a></li>
|
||||
<li><a href="/status">status</a></li>
|
||||
<li><a href="/about">about</a></li>
|
||||
<li><a href="/hire" class="nav-hire">hire me</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
@@ -41,7 +45,8 @@
|
||||
<a href="/">ridgwaysystems.org</a> —
|
||||
running OpenBSD —
|
||||
<a href="/blog/feed.xml">RSS</a> —
|
||||
<a href="https://git.ridgwaysystems.org">gitea</a>
|
||||
<a href="https://git.ridgwaysystems.org">gitea</a> —
|
||||
<a href="/hire">hire me</a>
|
||||
</p>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
13
templates/error.html
Normal file
13
templates/error.html
Normal file
@@ -0,0 +1,13 @@
|
||||
{{define "title"}}{{.Code}} {{.Title}} — Ridgway Systems{{end}}
|
||||
|
||||
{{define "content"}}
|
||||
<div class="error-page">
|
||||
<div class="error-code">{{.Code}}</div>
|
||||
<h1>{{.Title}}</h1>
|
||||
<p>{{.Message}}</p>
|
||||
<a href="/" class="btn btn-outline">Go home</a>
|
||||
{{if eq .Code 404}}
|
||||
<a href="/blog" class="btn btn-outline">Build log</a>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
88
templates/hire.html
Normal file
88
templates/hire.html
Normal file
@@ -0,0 +1,88 @@
|
||||
{{define "title"}}Hire Blake Ridgway — Ridgway Systems{{end}}
|
||||
{{define "meta-desc"}}Available for contracts and consulting: firewall/network design, Linux, DevOps, network security, server builds, and general sysadmin.{{end}}
|
||||
{{define "og-title"}}Hire Blake Ridgway — Ridgway Systems{{end}}
|
||||
{{define "og-desc"}}Available for contracts and consulting. Remote, any US timezone.{{end}}
|
||||
|
||||
{{define "content"}}
|
||||
<div class="hire-page">
|
||||
|
||||
<div class="hire-intro">
|
||||
<h1>Work With Me</h1>
|
||||
<p class="hire-tagline">Infrastructure that actually works. On OpenBSD, Linux, or wherever the job takes it.</p>
|
||||
<p>I'm Blake Ridgway — a Site Reliability Engineer based in Enid, Oklahoma with experience across cloud infrastructure, on-prem networks, security hardening, and automation. I've built policy-as-code firewall frameworks, managed Kubernetes workloads at a fintech startup, designed WAN monitoring systems, and I'm currently running SRE on Azure at a cloud-native shop.</p>
|
||||
<p>This site runs on a self-hosted OpenBSD server in my homelab. That's not a gimmick — it's how I approach every system I touch.</p>
|
||||
<p><a href="/resume">View my full resume →</a></p>
|
||||
</div>
|
||||
|
||||
<section>
|
||||
<h2>Services</h2>
|
||||
<div class="services-grid">
|
||||
<div class="service-card">
|
||||
<h3>Firewall & Network Design</h3>
|
||||
<p>pf, iptables, VLANs, VPNs, BGP/OSPF, network segmentation, zero trust architecture.</p>
|
||||
</div>
|
||||
<div class="service-card">
|
||||
<h3>Linux & OpenBSD</h3>
|
||||
<p>System hardening, service configuration, performance tuning, and ongoing administration.</p>
|
||||
</div>
|
||||
<div class="service-card">
|
||||
<h3>DevOps & IaC</h3>
|
||||
<p>Terraform, Ansible, Azure DevOps, AWS, CI/CD pipelines, GitOps with Argo CD.</p>
|
||||
</div>
|
||||
<div class="service-card">
|
||||
<h3>Network Security</h3>
|
||||
<p>Policy-as-code firewalls, IDS/IPS, geo-blocking, security posture audits and hardening.</p>
|
||||
</div>
|
||||
<div class="service-card">
|
||||
<h3>Server Builds</h3>
|
||||
<p>Bare-metal provisioning, PXE boot, homelab and small business server deployments.</p>
|
||||
</div>
|
||||
<div class="service-card">
|
||||
<h3>General Sysadmin</h3>
|
||||
<p>Monitoring (Prometheus, Grafana, Nagios), incident response, runbooks, and day-to-day ops.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="hire-availability">
|
||||
<strong>Availability:</strong> Open to contracts and consulting engagements — fully remote, any US timezone.
|
||||
Pricing by project or hourly — contact me for details.
|
||||
</div>
|
||||
|
||||
<section class="contact-section">
|
||||
<h2>Get in touch</h2>
|
||||
<p>Tell me about your project or problem. I'll respond within one business day.</p>
|
||||
|
||||
{{if .Success}}
|
||||
<div class="form-success">
|
||||
<strong>Message sent.</strong> I'll be in touch shortly.
|
||||
</div>
|
||||
{{else}}
|
||||
{{if .Error}}<p class="form-error">{{.Error}}</p>{{end}}
|
||||
|
||||
<form method="POST" action="/hire" class="contact-form">
|
||||
<div class="form-group">
|
||||
<label for="name">Name <span class="required-mark">*</span></label>
|
||||
<input type="text" id="name" name="name" value="{{.Name}}" required autocomplete="name" placeholder="Jane Smith">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email <span class="required-mark">*</span></label>
|
||||
<input type="email" id="email" name="email" value="{{.Email}}" required autocomplete="email" placeholder="jane@example.com">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="company">Company <span class="field-note">(optional)</span></label>
|
||||
<input type="text" id="company" name="company" value="{{.Company}}" autocomplete="organization" placeholder="Acme Corp">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="message">Message <span class="required-mark">*</span></label>
|
||||
<textarea id="message" name="message" required placeholder="Describe your project, timeline, and any relevant details.">{{.Message}}</textarea>
|
||||
</div>
|
||||
<div>
|
||||
<button type="submit" class="btn">Send message</button>
|
||||
</div>
|
||||
</form>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -23,7 +23,11 @@
|
||||
{{.Content}}
|
||||
</div>
|
||||
<footer class="post-footer">
|
||||
<a href="/blog">← Back to build log</a>
|
||||
<nav class="post-nav">
|
||||
<div class="post-nav-prev">{{if .Older}}<a href="/blog/{{.Older.Slug}}">← {{.Older.Title}}</a>{{end}}</div>
|
||||
<a href="/blog" class="post-nav-all">all posts</a>
|
||||
<div class="post-nav-next">{{if .Newer}}<a href="/blog/{{.Newer.Slug}}">{{.Newer.Title}} →</a>{{end}}</div>
|
||||
</nav>
|
||||
</footer>
|
||||
</article>
|
||||
{{end}}
|
||||
|
||||
141
templates/resume.html
Normal file
141
templates/resume.html
Normal file
@@ -0,0 +1,141 @@
|
||||
{{define "title"}}Resume — Blake Ridgway{{end}}
|
||||
{{define "meta-desc"}}Blake Ridgway — Site Reliability Engineer. Cloud infrastructure, network security, DevOps, and Linux/BSD systems.{{end}}
|
||||
{{define "og-title"}}Resume — Blake Ridgway{{end}}
|
||||
{{define "og-desc"}}Site Reliability Engineer with experience in cloud infrastructure, network design, security, and automation. Available for contracts.{{end}}
|
||||
|
||||
{{define "content"}}
|
||||
<div class="resume-page">
|
||||
|
||||
<div class="resume-actions">
|
||||
<a href="/hire" class="btn">Work with me</a>
|
||||
<a href="/hire" class="btn btn-outline">Contact</a>
|
||||
<span class="resume-print-hint">Print or save as PDF: <kbd>Ctrl+P</kbd> / <kbd>⌘+P</kbd></span>
|
||||
</div>
|
||||
|
||||
<header class="resume-header">
|
||||
<h1>Blake Ridgway</h1>
|
||||
<p class="resume-tagline">Site Reliability Engineer — Cloud • Network • Linux • Security</p>
|
||||
<div class="resume-contact">
|
||||
<span>Enid, Oklahoma — US/Central — Remote</span>
|
||||
<a href="mailto:blakearidgway@gmail.com">blakearidgway@gmail.com</a>
|
||||
<a href="https://linkedin.com/in/blakearidgway">linkedin.com/in/blakearidgway</a>
|
||||
<a href="https://ridgwaysystems.org/hire">ridgwaysystems.org/hire</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Summary</h2>
|
||||
<p>Results-driven Cloud and Network Engineer with a strong background in designing, implementing, and automating secure, scalable, and highly available infrastructure across on-premises and multi-cloud environments (AWS, Azure). Proven expertise in Infrastructure-as-Code, policy-as-code security frameworks, and comprehensive monitoring for proactive incident prevention. Adept at translating complex business requirements into resilient technical solutions with a focus on network performance, cloud resource optimization, and overall security posture.</p>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Experience</h2>
|
||||
|
||||
<div class="resume-job">
|
||||
<div class="resume-job-header">
|
||||
<span class="resume-role">Site Reliability Engineer</span>
|
||||
<span class="resume-dates">Sep 2025 – Present</span>
|
||||
</div>
|
||||
<div class="resume-org">
|
||||
<span class="resume-company">Advanced Metrics</span>
|
||||
<span class="resume-location">— Remote</span>
|
||||
</div>
|
||||
<ul>
|
||||
<li>Provision, deploy, and manage virtual machines, servers, and scalable storage in Azure, optimizing for performance and cost.</li>
|
||||
<li>Configure and maintain complex virtual networks including VNet peering, VPN Gateways, ExpressRoute connections, and NSGs for secure, efficient connectivity.</li>
|
||||
<li>Implement security measures including firewalls and access controls across cloud infrastructure.</li>
|
||||
<li>Use Terraform, Azure DevOps, and ARM templates for IaC and CI/CD pipeline automation.</li>
|
||||
<li>Utilize Azure Monitor for performance monitoring, log analysis, and alerting.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="resume-job">
|
||||
<div class="resume-job-header">
|
||||
<span class="resume-role">Systems Administrator</span>
|
||||
<span class="resume-dates">Jul 2023 – Sep 2025</span>
|
||||
</div>
|
||||
<div class="resume-org">
|
||||
<span class="resume-company">Triangle Insurance Company</span>
|
||||
<span class="resume-location">— Enid, OK</span>
|
||||
</div>
|
||||
<ul>
|
||||
<li>Designed and automated infrastructure deployments using IaC, achieving a 20% performance improvement and a 15% reduction in deployment time.</li>
|
||||
<li>Architected a policy-as-code firewall framework with geo-location blocking and automated rule updates, strengthening security posture while minimizing manual errors.</li>
|
||||
<li>Developed and automated comprehensive disaster recovery validation, reducing RTO by 30% and ensuring business continuity.</li>
|
||||
<li>Designed and implemented ISP network speed monitoring using Prometheus and Grafana, providing real-time WAN visibility.</li>
|
||||
<li>Deployed full-stack monitoring with Nagios and automated alerting, cutting time-to-detect (TTD) by 40% and time-to-resolve (TTR) by 20%.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="resume-job">
|
||||
<div class="resume-job-header">
|
||||
<span class="resume-role">Sr. Platform Engineer</span>
|
||||
<span class="resume-dates">Mar 2022 – Jul 2023</span>
|
||||
</div>
|
||||
<div class="resume-org">
|
||||
<span class="resume-company">Prime Trust</span>
|
||||
<span class="resume-location">— Remote</span>
|
||||
</div>
|
||||
<ul>
|
||||
<li>Engineered Azure and AWS cloud infrastructure using IaC, improving scalability, consistency, and reducing manual intervention.</li>
|
||||
<li>Partnered with stakeholders to translate product requirements into secure, scalable infrastructure specifications aligned with business goals.</li>
|
||||
<li>Designed and supported Argo CD workload management for continuous delivery, improving release velocity and reducing deployment errors.</li>
|
||||
<li>Authored and maintained comprehensive documentation, runbooks, and standards for recurring issues, accelerating incident response.</li>
|
||||
<li>Performed deep root cause analysis on incidents, implementing preventative measures to improve long-term system stability.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Education</h2>
|
||||
|
||||
<div class="resume-job">
|
||||
<div class="resume-job-header">
|
||||
<span class="resume-role">B.S. Computer Science</span>
|
||||
<span class="resume-dates">Jun 2021 – Present</span>
|
||||
</div>
|
||||
<div class="resume-company">Southern New Hampshire University</div>
|
||||
</div>
|
||||
|
||||
<div class="resume-job">
|
||||
<div class="resume-job-header">
|
||||
<span class="resume-role">Information Technology Program</span>
|
||||
<span class="resume-dates">2013</span>
|
||||
</div>
|
||||
<div class="resume-company">Autry Technology Center</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Certifications</h2>
|
||||
<ul class="resume-cert-list">
|
||||
<li class="resume-cert">CompTIA Network+</li>
|
||||
<li class="resume-cert">FCF Cybersecurity</li>
|
||||
<li class="resume-cert">FCA Cybersecurity</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="resume-section">
|
||||
<h2>Technical Skills</h2>
|
||||
<div class="resume-skills">
|
||||
<dl>
|
||||
<dt>Cloud</dt>
|
||||
<dd>AWS, Azure (VNet, NSG, ExpressRoute, VPN Gateway, ARM Templates, Azure Monitor, CloudWatch)</dd>
|
||||
|
||||
<dt>Networking</dt>
|
||||
<dd>TCP/IP, DNS, DHCP, BGP, OSPF, VLANs, VPN, pf, iptables, IDS/IPS, NAC, Zero Trust</dd>
|
||||
|
||||
<dt>Automation</dt>
|
||||
<dd>Terraform, Ansible, Azure DevOps, Bash, Python, PowerShell, Ruby</dd>
|
||||
|
||||
<dt>Monitoring</dt>
|
||||
<dd>Prometheus, Grafana, Nagios, Splunk, ELK Stack, SIEM integration, Azure Monitor</dd>
|
||||
|
||||
<dt>Platforms</dt>
|
||||
<dd>Linux, OpenBSD, VMware, Hyper-V, Proxmox, Citrix, Docker, Kubernetes, Argo CD</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
Reference in New Issue
Block a user