Port full site: all pages, blog posts, nav/footer, assets

This commit is contained in:
Jarvis Prime
2026-03-22 20:13:49 +00:00
parent ba8d866985
commit fbe79d4523
23 changed files with 285 additions and 34 deletions

View File

@@ -6,23 +6,92 @@ const { title } = Astro.props;
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{title}</title>
<title>{title ? `${title} — dd0c.net` : 'dd0c.net'}</title>
<link rel="icon" href="/favicon.ico">
<style>
body { font-family: system-ui, sans-serif; max-width: 720px; margin: 2rem auto; padding: 0 1rem; line-height: 1.6; color: #333; }
a { color: #0f3460; }
footer { margin-top: 2rem; font-size: 0.9rem; text-align: center; }
.center { text-align: center; }
h1 { font-size: 1.5rem; }
h2 { font-size: 1.15rem; margin-top: 1.5rem; }
p { margin: 0.5rem 0; }
*, *::before, *::after { box-sizing: border-box; }
body {
font-family: system-ui, -apple-system, sans-serif;
margin: 0;
background: #f8f9fa;
color: #333;
line-height: 1.6;
}
nav {
background: #fff;
border-bottom: 2px solid #3294D2;
padding: 0 1.5rem;
display: flex;
align-items: center;
gap: 0;
}
nav .brand {
display: flex;
align-items: center;
gap: 0.5rem;
text-decoration: none;
margin-right: 1.5rem;
padding: 0.75rem 0;
}
nav .brand img {
height: 32px;
width: auto;
}
nav a {
color: #333;
text-decoration: none;
padding: 0.75rem 0.85rem;
font-size: 0.95rem;
transition: color 0.15s;
}
nav a:hover { color: #3294D2; }
nav .spacer { flex: 1; }
nav a.external { color: #3294D2; }
main {
max-width: 760px;
margin: 2rem auto;
padding: 0 1.25rem;
}
footer {
margin-top: 3rem;
padding: 1.25rem;
text-align: center;
font-size: 0.875rem;
color: #666;
border-top: 1px solid #e0e0e0;
background: #fff;
}
footer a { color: #3294D2; text-decoration: none; }
footer a:hover { text-decoration: underline; }
h1 { font-size: 1.75rem; color: #1a1a1a; }
h2 { font-size: 1.2rem; margin-top: 1.75rem; color: #1a1a1a; }
a { color: #3294D2; }
p { margin: 0.6rem 0; }
@media (max-width: 600px) {
nav { flex-wrap: wrap; padding: 0 0.75rem; }
nav .brand { margin-right: 0.5rem; }
nav a { padding: 0.6rem 0.5rem; font-size: 0.875rem; }
}
</style>
</head>
<body>
<slot />
<nav>
<a class="brand" href="/">
<img src="/images/smalllogo.png" alt="dd0c.net" />
</a>
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/services">Services</a>
<div class="spacer"></div>
<a class="external" href="https://github.com/ddoc" target="_blank" rel="noopener">GitHub</a>
</nav>
<main>
<slot />
</main>
<footer>
<a href="/privacy">Privacy Policy</a> ·
<a href="/terms">Terms of Service</a> ·
Contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a>
<a href="/privacy">Privacy Policy</a> &nbsp;·&nbsp;
<a href="/terms">Terms of Service</a> &nbsp;·&nbsp;
&copy; Brian Galura 2004&ndash;2026
</footer>
</body>
</html>

View File

@@ -0,0 +1,19 @@
---
import Base from './Base.astro';
const { frontmatter } = Astro.props;
---
<Base title={frontmatter.title}>
<style>
.post-meta { color: #888; font-size: 0.875rem; margin-bottom: 1.5rem; }
.post-body { line-height: 1.75; }
.post-body iframe { max-width: 100%; }
.back { display: inline-block; margin-bottom: 1.25rem; font-size: 0.9rem; color: #3294D2; text-decoration: none; }
.back:hover { text-decoration: underline; }
</style>
<a class="back" href="/">← All posts</a>
<h1>{frontmatter.title}</h1>
<p class="post-meta">{frontmatter.date}</p>
<div class="post-body">
<slot />
</div>
</Base>

8
src/pages/about.astro Normal file
View File

@@ -0,0 +1,8 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="About">
<h1>About</h1>
<p>After a childhood spent tinkering on subjects such as Java programming and Linux, Brian's professional experience started with VoIP testing at 3Com in suburban Chicago. He then spent two years studying Computer Engineering at Purdue University before leaving to pursue freelance consulting in Los Angeles.</p>
<p>Following several years of freelancing, he developed his expertise in enterprise infrastructure and cloud computing by working for a variety of startups and large corporations. Later he completed a Bachelor's in I.T. while working at Citrix. Brian is currently working on Citrix's Cloud Engineering and Systems Architecture team in Santa Barbara, California.</p>
</Base>

View File

@@ -1,10 +1,29 @@
---
import Base from '../layouts/Base.astro';
const posts = [
{ title: 'AWS VPC Buildout With Foreman Hooks for RDNS Creation', date: '2014-01-15', slug: 'foreman-hooks-aws-vpc' },
{ title: 'CloudStack Collab 2013: Lessons Learned at Citrix OSD', date: '2013-06-23', slug: 'cloudstack-devops' },
];
---
<Base title="dd0c Tools">
<div class="center">
<img src="/logo.png" alt="dd0c Tools" width="120" height="120">
<h1>dd0c Tools</h1>
<p>dd0c Tools — Personal productivity tools for Google Workspace.</p>
</div>
<Base title="dd0c.net">
<style>
.post-list { list-style: none; padding: 0; margin: 1.5rem 0; }
.post-list li { padding: 0.75rem 0; border-bottom: 1px solid #e8e8e8; display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; }
.post-list li:last-child { border-bottom: none; }
.post-list a { font-size: 1.05rem; text-decoration: none; color: #3294D2; }
.post-list a:hover { text-decoration: underline; }
.post-date { font-size: 0.875rem; color: #888; white-space: nowrap; }
</style>
<h1>dd0c.net</h1>
<p>Infrastructure, cloud, and systems engineering by Brian Galura.</p>
<h2>Posts</h2>
<ul class="post-list">
{posts.map(p => (
<li>
<a href={`/posts/${p.slug}`}>{p.title}</a>
<span class="post-date">{p.date}</span>
</li>
))}
</ul>
</Base>

View File

@@ -0,0 +1,11 @@
---
layout: ../../layouts/PostLayout.astro
title: "CloudStack Collab 2013: Lessons Learned at Citrix OSD"
date: "2013-06-23"
---
[Open@Citrix](http://open.citrix.com/cloud-computing-vids/video/six-months-into-cloudstack-lessons-learned-at-citrix-osd-by-brian-galura.html)
[Slides](http://prezi.com/2sgvlsz2bqoz/?utm_campaign=share&utm_medium=copy)
<iframe width="560" height="315" src="https://www.youtube.com/embed/MUcLkXr2M34" frameborder="0" allowfullscreen></iframe>

View File

@@ -0,0 +1,34 @@
---
layout: ../../layouts/PostLayout.astro
title: "AWS VPC Buildout With Foreman Hooks for RDNS Creation"
date: "2014-01-15"
---
Originally posted on [Digital Ducttape](http://digital-ducttape.com/2013/10/23/aws-vpc-buildout-with-foreman_hooks-for-rdns-creation/)
[Foreman](http://theforeman.org/) is a tool I have used for a long time as an external node classifier for Puppet and its smart-proxy for integration with DNS. However when Foreman recently [added support](http://projects.theforeman.org/issues/1871) for building EC2 instances inside a VPC, I thought it was a great opportunity to use the same tool for a new buildout.
Shortly after starting I discovered that reverse DNS is [unfortunately broken](http://projects.theforeman.org/issues/3166) for EC2 VPC builds. Foreman does not map a relationship between VPC subnets and any DNS smart-proxy. Unswayed I took to #foreman and was guided to a potential solution.
Enter [foreman_hooks](https://github.com/theforeman/foreman_hooks). This plugin for foreman allows you to subscribe to create/update/destroy events and invoke any executable. Lucky for me this was a great workaround for the functionality lacking in the recent 1.3 release. Initially I wrote a script utilizing the smart-proxy API to create PTR records but it complained that the IP address was already assigned. Fair enough. Without further investigation I wrote instead a short shell script which does the same thing using nsupdate with tsigs and viola! Integrated forward and reverse DNS for EC2 VPC deployments. A few more lines of code added support for the destroy hook and now the feature is complete.
I named this script `rdns.sh` and placed it in `/usr/share/foreman/config/hooks.d` and created symlinks to it in both:
`/usr/share/foreman/config/hooks/host/managed/destroy/`
`/usr/share/foreman/config/hooks/host/managed/create/`
[source for rdns.sh](https://gist.github.com/ddoc/8447483)
<script src="https://gist.github.com/ddoc/8447483.js"></script>
[source for utils.sh](https://gist.github.com/ddoc/8446722)
[source for hook_functions.sh](https://github.com/theforeman/foreman_hooks/blob/master/examples/hook_functions.sh)
Of course, after implementing this I saw many uses for foreman_hooks including:
- resizing an EC2 root volume at build time
- attaching additional volumes
- EIP associations and DNS
- different hooks for different domains
- adding and removing hosts to an external monitoring system
I will post updates on these implementations at another time.

View File

@@ -1,7 +1,7 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Privacy Policy — dd0c.net">
<Base title="Privacy Policy">
<h1>Privacy Policy</h1>
<p><strong>Effective Date:</strong> March 22, 2026</p>
<p>This application ("App") is a personal-use tool operated by Brian Galura ("Operator"). It is not offered as a commercial service.</p>
@@ -25,5 +25,5 @@ import Base from '../layouts/Base.astro';
<p>You may revoke the App's access at any time via <a href="https://myaccount.google.com/permissions">Google Account Permissions</a>.</p>
<h2>Contact</h2>
<p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p>
<p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
</Base>

39
src/pages/services.astro Normal file
View File

@@ -0,0 +1,39 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Services">
<style>
ul { padding-left: 1.25rem; }
ul li { margin: 0.35rem 0; }
.contact { margin: 1rem 0; }
.contact a { color: #3294D2; }
</style>
<h1>Services</h1>
<p>Hourly and flat-cost projects.</p>
<p class="contact">Contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
<h2>Successful projects include</h2>
<ul>
<li>Service deployments into and out of the cloud</li>
<li>Zip-code based retail store locator</li>
<li>Data-mining applications</li>
<li>Custom web traffic reports</li>
<li>Trouble ticket reporting</li>
<li>Custom IVR application</li>
<li>System automation with Puppet</li>
<li>Ruby and PHP development</li>
<li>SNMP network discovery</li>
<li>CloudStack/XenServer implementation</li>
</ul>
<h2>Skills</h2>
<ul>
<li>DNS configuration</li>
<li>File system sizing and creation</li>
<li>Startup and shutdown scripts</li>
<li>Kernel performance tuning</li>
<li>Disaster recovery process implementation</li>
<li>Installation and configuration of new hardware</li>
<li>Installation of third party software packages</li>
</ul>
</Base>

View File

@@ -1,7 +1,7 @@
---
import Base from '../layouts/Base.astro';
---
<Base title="Terms of Service — dd0c.net">
<Base title="Terms of Service">
<h1>Terms of Service</h1>
<p><strong>Effective Date:</strong> March 22, 2026</p>
@@ -24,5 +24,5 @@ import Base from '../layouts/Base.astro';
<p>These terms may be updated at any time. Continued use constitutes acceptance of the updated terms.</p>
<h2>Contact</h2>
<p>For questions, contact: <a href="mailto:bgalura@gmail.com">bgalura@gmail.com</a></p>
<p>For questions, contact: <a href="mailto:contact@dd0c.net">contact@dd0c.net</a></p>
</Base>