
Welcome
DevOps engineer with 20+ years of IT experience, building security-first infrastructure and automation solutions. Passionate about hardened, observable systems — and exploring new horizons both in technology and in life.
What I Do
Infrastructure & Automation
Salt Stack • Rundeck • Docker • Podman • Rootless Quadlets • Cockpit • Proxmox • Sonatype Nexus
Monitoring & Observability
Grafana • Grafana Alloy • Prometheus • Victoria Metrics
Development & Scripting
Python • .NET • PowerShell • Bash
Web & AI Development
Django • FastAPI • Alpine.js • htmx • Labb • OpenAI API
Databases
PostgreSQL • SQLite • SQL Server
Personal Projects
Self-hosted services • Homelab environment • Photography
Explore More
Building reliable, scalable IT solutions while exploring the world one mountain at a time.
Hardening a Self-Hosted Personal Website: Caddy, Fail2ban, and Cloudflare
Posted on May 15, 2026
| 3 min
| 628 words
Running your own web server is satisfying — until you look at the logs. Within hours of going live, bots are probing for /wp-login.php, /xmlrpc.php, .env files, and PHP endpoints that never existed. Here’s how I layered three tools to shut most of that down before it reaches the application.
The Stack
- Caddy as reverse proxy and TLS terminator
- Fail2ban on the host for behavioral IP banning
- Cloudflare as the edge layer (free tier)
The key insight is that each layer catches different things:
[Read More]Self-Hosted Hugo: Building a Deployment Pipeline Without CI/CD
Posted on May 10, 2026
| 3 min
| 583 words
Most Hugo tutorials end with “deploy to Netlify” or “push to GitHub Pages.” If you’re running your own infrastructure, neither of those is satisfying. Here’s the pipeline I settled on for deploying this site to a self-hosted Caddy VM.
Architecture
Windows dev machine Caddy VM (DMZ)
──────────────── ──────────────
hugo --minify ──── SCP ────▶ /opt/caddy/site/
Caddy serves static files
Cloudflare proxies + caches
No containers. No CI runners. No GitHub. The pipeline is a batch script, a Caddy file_server block, and an SSH key.
[Read More]Managing Homelab Infrastructure with a Git Submodule Registry
Posted on May 1, 2026
| 4 min
| 661 words
When your homelab grows past a handful of services, a single git repository starts to feel like a junk drawer. Every service’s config, scripts, and docs are in the same commit history, every change touches multiple unrelated services, and cloning the whole thing just to work on one component is wasteful.
I went through this with my homelab. Here’s the pattern I landed on.
The Problem with Monorepos for Homelab
A monorepo made sense initially — one place for everything, simple history. But after adding a dozen services, the friction started:
[Read More]