<?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/tags/infrastructure/</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/tags/infrastructure/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 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><item><title>Building a Number Classification API on AWS Lambda: Serverless Architecture and CORS</title><link>https://elijahu.me/portfolio/projects/numberapi/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate><guid>https://elijahu.me/portfolio/projects/numberapi/</guid><description>&amp;ldquo;Serverless removes the infrastructure management problem and replaces it with a different set of problems. CORS is one of them.&amp;rdquo;
This is a breakdown of a number classification API built on AWS Lambda with API Gateway — the architecture decisions, the full Lambda function with input validation and error handling, the CORS preflight issue that catches most people, and the edge cases worth thinking about before they hit production.</description></item></channel></rss>