<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Elijah Udom | Infrastructure &amp; Cloud Engineer (elijahu)</title><link>https://elijahu.me/portfolio/categories/infrastructure-engineering/</link><description>Infrastructure &amp; Cloud Engineering portfolio by Elijah Udom (elijahu) — AWS, Kubernetes, eBPF Security, AI/ML Infrastructure, and Platform Engineering projects.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 30 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://elijahu.me/portfolio/categories/infrastructure-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Triforge: I Deployed an AI Model Without Clicking a Single Button</title><link>https://elijahu.me/portfolio/projects/triforge/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/triforge/</guid><description>[!WARNING] The AWS SageMaker instance backing this demo has been intentionally shut down to control infrastructure costs.
As a result, some endpoints may return 500 errors or fail to respond.
The case study, architecture, infrastructure code, and deployment workflow remain fully valid.
&amp;ldquo;I was done with ClickOps. I wanted infrastructure I could rebuild, version, and trust.&amp;rdquo;
Live Demo: chat.elijahu.me | Code: git.new/triforge | Model: Helsinki-NLP/opus-mt-en-es
The Problem I have used the AWS console.</description></item><item><title>KodeKloud Days 9-12: Databases, Backups, Tomcat, and the Great Port War</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-9-12/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-9-12/</guid><description>&amp;ldquo;Every K8s node is a Linux host. Every database that won&amp;rsquo;t start has a reason in the logs. Every &amp;rsquo;no route to host&amp;rsquo; is a firewall issue until proven otherwise.&amp;rdquo;
Context: This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, MariaDB, SELinux, Ansible. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: a MariaDB instance that wouldn&amp;rsquo;t start due to a corrupted data directory, a backup automation task requiring passwordless SSH, a Tomcat WAR deployment with a custom port, and a two-layer port conflict that required both evicting a rogue Sendmail process and adding an iptables rule before Apache was reachable.</description></item><item><title>KodeKloud Days 5-8: SELinux, Cron Jobs, and the Great Ansible Adventure</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-5-8/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-5-8/</guid><description>&amp;ldquo;Before going deeper into kernel-level work, I went back to Linux fundamentals. This is what runs under every K8s cluster and eBPF probe — owning it isn&amp;rsquo;t optional.&amp;rdquo;
This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, SELinux, Ansible, SSH. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: SELinux configuration on a RHEL-based system, cron job automation, passwordless SSH across multiple servers, and Ansible version management for global availability.</description></item><item><title>KodeKloud 100 Days Challenge: Days 1-4 (Or: How I Learned to Stop Worrying and Love the Slow Labs)</title><link>https://elijahu.me/portfolio/projects/kodekloud-days-1-4/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/kodekloud-days-1-4/</guid><description>&amp;ldquo;Before going deeper into kernel-level work, I went back to Linux fundamentals. This is what runs under every K8s cluster and eBPF probe — owning it isn&amp;rsquo;t optional.&amp;rdquo;
This series is a deliberate return to Linux fundamentals before going deeper into kernel-level work — CentOS, user management, SSH hardening, permissions. The stuff that runs silently under every K8s cluster and eBPF probe. Owning it isn&amp;rsquo;t optional.
Four problems this week: non-interactive user creation, temporary account expiry, disabling root SSH across multiple servers, and file permission management.</description></item><item><title>Getting to A+ on SSL Labs: Hardening a LEMP Stack for Production</title><link>https://elijahu.me/portfolio/projects/hardened-web-server/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/hardened-web-server/</guid><description>&amp;ldquo;Default configs aren&amp;rsquo;t secure. They&amp;rsquo;re defaults — built for compatibility, not production. Running SSL Labs against a stock Nginx install and getting a B or F isn&amp;rsquo;t a surprise. It&amp;rsquo;s the expected result.&amp;rdquo;
This is a full hardening walkthrough for a LEMP stack on Ubuntu 22.04 — Nginx TLS configuration, PHP-FPM lockdown, MySQL least-privilege setup, firewall, Fail2Ban, and what the actual path to A+ on SSL Labs looks like. Not the happy path.</description></item><item><title>Building a Secure CI/CD Pipeline with Docker, AWS ECR, and GitHub Actions</title><link>https://elijahu.me/portfolio/projects/cicd-container-orch/</link><pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/cicd-container-orch/</guid><description>&amp;ldquo;A deployment pipeline that requires a human in the loop for every push isn&amp;rsquo;t a pipeline — it&amp;rsquo;s a bottleneck with extra steps.&amp;rdquo;
This is a full walkthrough of taking a Flask application from local development to production on AWS using Docker, ECR, ECS, and GitHub Actions — with secrets handled properly from the start, not bolted on as an afterthought.
Pipeline flow: local development → GitHub Actions → ECR → ECS</description></item><item><title>Building an eBPF Container Security Monitor: Debugging Through the Pain</title><link>https://elijahu.me/portfolio/projects/ebpf-container-security/</link><pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/ebpf-container-security/</guid><description>&amp;ldquo;Monitoring containers without eBPF is whack-a-mole blindfolded.&amp;rdquo;
What started as a straightforward container security tool became a weeks-long exercise in kernel panics, parent process deception, and eBPF&amp;rsquo;s complete lack of forgiveness for sloppy code. This is the honest account of what it took to get it working.
Understanding the Fundamentals The Kernel The kernel controls everything — memory, devices, security. Every system call your containerized application makes passes through it.</description></item><item><title>Building an AWS Security Group Auditor That Actually Works in Production</title><link>https://elijahu.me/portfolio/projects/aws-security-auditor/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/aws-security-auditor/</guid><description>&amp;ldquo;Manually checking security groups across multiple AWS accounts is how breaches happen. You miss things. You always miss things.&amp;rdquo;
Manual security group reviews feel fine at one account. At ten, you&amp;rsquo;re genuinely flying blind — too many rules, too much context to hold in your head, no audit trail. I built this CLI tool to close that gap. This is the breakdown: what I built, the failure modes I hit, and what the production version actually looks like.</description></item><item><title>GitOps CI/CD with Flask, Kubernetes, and Webhook Orchestration</title><link>https://elijahu.me/portfolio/projects/orchestration-guide/</link><pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/orchestration-guide/</guid><description>&amp;ldquo;Manual deployments are technical debt with compound interest. Every time you run kubectl apply by hand you&amp;rsquo;re borrowing against future reliability.&amp;rdquo;
This is a full breakdown of a push-to-deploy GitOps pipeline on Kubernetes — Flask webhook orchestration server, isolated test namespace with resource quotas, RBAC scoped to minimum permissions, network policy isolation between test and production, and blue-green deployment with automated rollback. Built because the manual process was unsustainable, documented because the failure modes are worth knowing.</description></item><item><title>Self-Hosting Gitea on AWS: Architecture, Configuration, and the 502s I Debugged</title><link>https://elijahu.me/portfolio/projects/gitea-ec2-guide/</link><pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/gitea-ec2-guide/</guid><description>&amp;ldquo;GitHub is fine until you&amp;rsquo;re rate-limited at 11 PM pushing a large repo before a deadline. That&amp;rsquo;s when you decide to build your own.&amp;rdquo;
This is a full breakdown of running Gitea on AWS EC2 — not a happy-path tutorial, but the actual build including every error I hit and how I resolved it. Architecture, configuration, the 502 debugging session, backup automation, and what three months of running this in production looks like.</description></item></channel></rss>