<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ihedioha Ifeyinwa on Medium]]></title>
        <description><![CDATA[Stories by Ihedioha Ifeyinwa on Medium]]></description>
        <link>https://medium.com/@ihediohaifeyinwa?source=rss-d957eed26cfc------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*XXczBTkDwJCd6pXg</url>
            <title>Stories by Ihedioha Ifeyinwa on Medium</title>
            <link>https://medium.com/@ihediohaifeyinwa?source=rss-d957eed26cfc------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 28 May 2026 23:08:28 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ihediohaifeyinwa/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Building a Production-Grade EKS Cluster on AWS: My Journey with Project Bedrock]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/building-a-production-grade-eks-cluster-on-aws-my-journey-with-project-bedrock-00d512803dc6?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/00d512803dc6</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[aws-eks]]></category>
            <category><![CDATA[altschool-africa]]></category>
            <category><![CDATA[helm-chart]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Tue, 26 May 2026 12:44:58 GMT</pubDate>
            <atom:updated>2026-05-26T12:49:40.277Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introduction</h3><p>As my final cloud engineering capstone project, I was tasked with provisioning a production-grade Kubernetes environment on AWS and deploying a microservices retail application. This is the story of how I built “Project Bedrock” for InnovateMart — including every mistake, every error, and every lesson learned along the way.</p><h3>The Mission</h3><p>The project required me to:</p><ul><li>Provision a VPC and EKS cluster using Terraform</li><li>Deploy the AWS Retail Store Sample App</li><li>Set up managed databases (RDS MySQL, RDS PostgreSQL, DynamoDB)</li><li>Implement secure developer access</li><li>Configure CloudWatch observability</li><li>Build a serverless S3 + Lambda pipeline</li><li>Automate everything with GitHub Actions CI/CD</li></ul><h3><strong>Architecture Diagram</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pIeHcoeEsAEw9ze7jiF8Dg.png" /></figure><h3>Setting Up the Foundation</h3><h4>Tools and AWS Configuration</h4><p>The first thing I did was verify my tools were installed — AWS CLI, Terraform, kubectl, and Helm. Interestingly, my AWS credentials were already configured from a previous project (a month 3 assessment where I had created a terraform-user with AdministratorAccess). That saved me some time.</p><h4>Creating the GitHub Repository</h4><p>I created a public GitHub repository called project-bedrock and cloned it locally. I set up the folder structure:</p><pre>project-bedrock/<br>├── terraform/<br>├── k8s/<br>├── lambda/<br>└── .github/workflows/</pre><h4>Remote State Management</h4><p>Before writing any Terraform code, I manually created an S3 bucket for remote state:</p><p>Made an error here btw but let’s continue.</p><pre>aws s3api create-bucket \<br>  --bucket bedrock-tfstate-ifhy1 \<br>  --region us-east-1</pre><p>Then configured the Terraform backend to use it. This is crucial — local state files are not acceptable for CI/CD pipelines.</p><h4>First Mistake: Pushing Terraform Provider Files to GitHub</h4><p>When I tried to push my code, GitHub rejected it because the Terraform provider binary (terraform-provider-aws) was 691MB — way above GitHub&#39;s 100MB limit. I had forgotten to add .terraform/ to my .gitignore.</p><p>Fix: Added .gitignore and used git filter-branch to remove the large files from history:</p><pre>git filter-branch --force --index-filter \<br>  &#39;git rm -rf --cached --ignore-unmatch terraform/.terraform&#39; \<br>  --prune-empty --tag-name-filter cat -- --all<br>git push origin main --force</pre><p><strong>Lesson:</strong> Always add .terraform/ to .gitignore before your first commit.</p><h3>Provisioning the VPC</h3><p>I used the terraform-aws-modules/vpc/aws module to create:</p><ul><li>A VPC named project-bedrock-vpc</li><li>Public and private subnets across 2 AZs (us-east-1a and us-east-1b)</li><li>NAT Gateway for private subnet internet access</li><li>Internet Gateway for public subnets</li></ul><p>The default_tags feature in the AWS provider ensured every resource was automatically tagged with Project: karatu-2025-capstone.</p><p>Running terraform apply created 19 resources successfully.</p><h3>Provisioning the EKS Cluster</h3><h4>Second Mistake: Wrong Instance Type</h4><p>I configured t3.medium for the EKS node group, but got this error after 37 minutes of waiting:</p><pre>AsgInstanceLaunchFailures: Could not launch On-Demand Instances. <br>InvalidParameterCombination - The specified instance type is not <br>eligible for Free Tier.</pre><p>Fix: Changed to t3.small. The cluster came up successfully with 2 nodes.</p><p><strong>Lesson:</strong> Always check instance type availability in your account before applying. 37 minutes of waiting is painful!</p><h3>Deploying the Databases</h3><p>I created:</p><ul><li><strong>RDS MySQL</strong> for the catalog service</li><li><strong>RDS PostgreSQL</strong> for the orders service</li><li><strong>DynamoDB</strong> for the cart service</li><li><strong>Secrets Manager</strong> to store all database credentials securely</li></ul><h4>Third Mistake: Reserved Username</h4><p>PostgreSQL on RDS doesn’t allow admin as a username — it&#39;s a reserved word. Got this error:</p><pre>MasterUsername admin cannot be used as it is a reserved word used by the engine</pre><p>Fix: Changed PostgreSQL username to dbadmin.</p><p><strong>Lesson:</strong> PostgreSQL on RDS has reserved usernames. Always use something like dbadmin instead of admin.</p><h3>Installing the AWS Load Balancer Controller</h3><p>This was needed to create an Application Load Balancer (ALB) for the application ingress.</p><h4>Fourth Mistake: Outdated IAM Policy</h4><p>The Load Balancer Controller kept failing with:</p><pre>AccessDenied: not authorized to perform: <br>elasticloadbalancing:DescribeListenerAttributes</pre><p>Fix: Downloaded the latest IAM policy from the v2.11.0 release instead of v2.7.2:</p><pre>curl -o terraform/lb-controller-policy.json \<br>  https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json</pre><p><strong>Lesson:</strong> Always use the latest IAM policy file when installing the AWS Load Balancer Controller. Older versions miss new required permissions.</p><h3>Deploying the Retail Store Application</h3><h4>Fifth Mistake: Wrong Helm Repository URL</h4><p>I tried several Helm chart URLs that didn’t work:</p><pre>Error: looks like &quot;https://aws-containers.github.io/retail-store-sample-app&quot; <br>is not a valid chart repository</pre><p>Fix: The app doesn’t have a traditional Helm repo. I downloaded the Kubernetes YAML manifests directly:</p><pre>curl -L -o k8s/kubernetes.yaml \<br>  https://github.com/aws-containers/retail-store-sample-app/releases/download/v1.5.0/kubernetes.yaml<br>kubectl apply -f k8s/kubernetes.yaml -n retail-app</pre><p>After the pods came up, I created an Ingress resource and within minutes had a working retail store accessible at a public ALB URL!</p><h3>CloudWatch Observability</h3><h4>Sixth Mistake: Node Capacity Issues</h4><p>When installing the CloudWatch Observability addon, it went into DEGRADED state:</p><pre>InsufficientNumberOfReplicas: 2 Too many pods. <br>no new claims to deallocate</pre><p>Fix: Scaled up from 2 to 3 nodes to give the CloudWatch DaemonSet enough capacity:</p><pre>aws eks update-nodegroup-config \<br>  --cluster-name project-bedrock-cluster \<br>  --nodegroup-name &lt;nodegroup-name&gt; \<br>  --scaling-config minSize=1,maxSize=3,desiredSize=3</pre><p><strong>Lesson:</strong> CloudWatch Observability addon runs a DaemonSet on every node. Make sure you have enough node capacity before installing it.</p><h3>The S3 Bucket Name Mistake</h3><h4>Seventh Mistake: Wrong Student ID in Bucket Name</h4><p>The project required the S3 bucket to be named bedrock-assets-[your-student-id]. I had used my GitHub username (ifhy1) instead of my actual student ID (ALT/SOE/***/****).</p><p>Fix: Updated the bucket name to bedrock-assets-alt-soe-***-**** in Terraform and reapplied. Since the old bucket had a test file in it, I had to empty it first:</p><pre>aws s3 rm s3://bedrock-assets-ifhy1 --recursive<br>terraform apply</pre><p>The error I made mention of earlier, lol. It was an oversight on my end.</p><h3>The Credentials Exposure Incident</h3><h4>Eighth Mistake: Exposing AWS Credentials on GitHub</h4><p>This was my biggest mistake. When generating grading.json with terraform output -json, the file contained the bedrock-dev-view secret access key and console password in plain text. I pushed this to GitHub.</p><p>Within hours I received emails from:</p><ul><li><strong>AWS Security</strong> — notifying me that the key had been quarantined with AWSCompromisedKeyQuarantineV3 policy</li><li><strong>GitGuardian</strong> — alerting me about the exposed secret</li></ul><p>Fix:</p><ol><li>Detached the quarantine policy</li><li>Deleted the compromised access key</li><li>Created a new access key via Terraform</li><li>Cleaned git history using git filter-branch</li><li>Updated grading.json to redact sensitive values with SEE-GOOGLE-DOC</li></ol><p>NEVER commit AWS credentials to GitHub, even for exam purposes. Always redact sensitive values before pushing. Use sensitive = true in Terraform outputs and never include them in files committed to source control.</p><h3>The TLS/HTTPS Bonus (Extra Objectives)</h3><p>The bonus objective required exposing the application over HTTPS using <strong>ACM </strong>which is the <strong>AWS CERTIFICATE MANAGER</strong> and a custom domain. The project suggested using nip.io (a free magic DNS service) if you don’t own a domain.</p><h4>Ninth Mistake: nip.io doesn’t work with ACM</h4><p>I requested an ACM certificate for retail.54.152.50.23.nip.io but it stayed in PENDING_VALIDATION forever because ACM requires DNS validation — and you can&#39;t add DNS records to nip.io since you don&#39;t own it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1jSOmqYL-ru68DGAU1XGBg.png" /></figure><p>Fix: I had to purchase a real domain projectbedrock.xyz from Namecheap for $xx to properly validate the ACM certificate.</p><p>The project documentation suggested nip.io but this doesn’t actually work with ACM certificate validation. You need a real domain you control to complete TLS termination properly.</p><h3>CI/CD Pipeline</h3><p>I implemented GitHub Actions with two workflows:</p><p><strong>PR workflow</strong> (pr.yml): Runs terraform plan on every pull request and posts the output as a PR comment so the team can review infrastructure changes before they&#39;re applied.</p><p><strong>Apply workflow</strong> (apply.yml): Runs terraform apply automatically when code is merged to main.</p><p>AWS credentials are stored as GitHub repository secrets — never hardcoded in workflow files.</p><h3>Final Architecture</h3><p>The completed architecture includes:</p><ul><li><strong>VPC</strong> with public/private subnets across 2 AZs</li><li><strong>EKS cluster</strong> (v1.34) with managed node groups</li><li><strong>ALB</strong> exposing the retail store application</li><li><strong>RDS MySQL</strong> for catalog data</li><li><strong>RDS PostgreSQL</strong> for order data</li><li><strong>DynamoDB</strong> for cart data</li><li><strong>Secrets Manager</strong> storing all database credentials</li><li><strong>CloudWatch</strong> with FluentBit shipping all container and control plane logs</li><li><strong>S3 + Lambda</strong> for serverless image processing</li><li><strong>GitHub Actions</strong> for automated infrastructure management</li></ul><h3>Key Lessons Learned</h3><ol><li>Always add .terraform/ to .gitignore before your first commit</li><li>Check instance type availability before applying EKS node groups</li><li>PostgreSQL on RDS doesn’t allow admin as a username</li><li>Always use the latest IAM policy for the AWS Load Balancer Controller</li><li>Scale your nodes before installing DaemonSet-based addons</li><li>Read requirements carefully — student ID means your actual student ID!</li><li><strong>NEVER commit AWS credentials to GitHub</strong> — use sensitive = true and redact before pushing</li><li>nip.io doesn’t work with ACM certificate validation — use a real domain</li></ol><h3>Conclusion</h3><p>Building Project Bedrock was a challenging but incredibly rewarding experience. Every error I encountered taught me something new about AWS, Terraform, and Kubernetes. The key to success was staying calm when things went wrong, reading error messages carefully, and fixing issues methodically.</p><p>If you’re working on a similar project, I hope this article saves you from making the same mistakes I did!</p><p><em>The complete source code for this project is available at: </em><a href="https://github.com/Ifhy1/project-bedrock"><strong><em>https://github.com/Ifhy1/project-bedrock</em></strong></a></p><p>And most importantly, if there’s anything I’ve learned althrough my Cloud/DevOps Engineering journey — it’s <strong>PATIENCE.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=00d512803dc6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building Real Infrastructure on AWS: My Honest Experience]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/building-real-infrastructure-on-aws-my-honest-experience-50ba1e8b6be5?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/50ba1e8b6be5</guid>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[altschool-africa]]></category>
            <category><![CDATA[aws-ec2]]></category>
            <category><![CDATA[cicd-pipeline]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Thu, 14 May 2026 08:32:54 GMT</pubDate>
            <atom:updated>2026-05-14T12:05:21.328Z</atom:updated>
            <content:encoded><![CDATA[<p>I am a cloud engineering student at AltSchool Africa, and for my Month 3 assessment I was asked to build and deploy a complete CI/CD pipeline for a full-stack application on AWS. Frontend, backend, database, caching, infrastructure as code, monitoring— the whole thing.</p><p>I had never done anything at this scale before. I knew the concepts, I had done smaller projects, but putting it all together end to end was a different thing entirely.</p><p>This article is not a tutorial. It is an honest account of what actually happened— the things that broke, the things that confused me, and the small victories that kept me going. If you are learning cloud engineering or about to attempt something similar, I hope this saves you some of the hours I lost.</p><h3>The Architecture</h3><p>The application was a full-stack task management app called MuchToDo. Here is what the stack looked like:</p><ul><li>Frontend: React with TypeScript, hosted on AWS S3 and served globally via CloudFront</li><li>Backend: a Golang API running inside a Docker container on EC2, sitting behind an Application Load Balancer</li><li>Database: MongoDB Atlas for data persistence</li><li>Cache: AWS ElastiCache Redis for session and data caching</li><li>Infrastructure: all provisioned with Terraform</li><li>CI/CD: GitHub Actions for automated deployments.</li></ul><p>Stay with me…</p><h3>Setting Up the Infrastructure with Terraform</h3><p>I used Terraform to provision everything — VPC, subnets, EC2, ALB, ElastiCache, S3, CloudFront, IAM roles, security groups. All of it.</p><p>This part actually went relatively smoothly. Terraform is opinionated in a good way. You write what you want, it figures out the order, and when it works it is deeply satisfying to see 27 resources created in one go.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W1ccxcqp1Vv4evUGZ8Vc3A.png" /></figure><p>The key thing I learned here is to always use modules. Keeping networking, compute, storage and monitoring in separate modules made everything easier to reason about and debug. And you might be wondering why, here it is:</p><p>Because when everything is in one big Terraform file it becomes very hard to manage.</p><p><strong>Easier to debug</strong> — if your EC2 is having issues you go straight to the compute module. You don’t have to scroll through 500 lines of mixed code looking for the right resource.</p><p><strong>Easier to reason about</strong> — each module has one responsibility. Networking handles VPC and subnets. Compute handles EC2 and ALB. You always know where things live.</p><p><strong>Reusable</strong> — if you start another project you can copy just the networking module and reuse it without touching anything else.</p><p><strong>Less risk</strong> — changes to your storage module won’t accidentally affect your networking. They’re isolated from each other.</p><p>Think of it like organizing a house. You don’t throw everything in one room. Kitchen stuff in the kitchen, bedroom stuff in the bedroom making it easier to find things, easier to clean up when something goes wrong.</p><h3>The DNS Nightmare</h3><p>This is where things started getting interesting.</p><p>I was trying to run my Go application locally and connect to MongoDB Atlas. I had checked everything— my Atlas network access settings were fine, my connection string was correct, my code was fine. But the app kept throwing DNS resolution errors. It simply could not find the MongoDB Atlas hostname.</p><p>I changed my Mac’s DNS to <em>Google’s 8.8.8.8</em>. Still nothing. My MiFi was the problem— it just refused to resolve the MongoDB Atlas address. No amount of DNS changes on my end was going to fix that.</p><p>So I moved to my EC2 instance instead. AWS data centers do not have WiFi DNS issues. I also passed <em>dns 8.8.8.8 </em>directly to Docker just to be safe. It connected immediately.</p><p>Sometimes the bug is not in your code. It could just be your internet connection being difficult.</p><h3>EC2 Running Out of Resources</h3><p>Once I was on EC2, I tried running the Go application directly on the instance. This was a mistake.</p><p>I ran go run cmd/api/main.go and the instance just hung. Then it crashed. Then I got a &quot;disk quota exceeded&quot; error. I added an extra 2GB RAM to the instance thinking that would help, honestly this was a first. It did not.</p><p>The problem was that compiling a complex Go application on a small EC2 instance is just too much. The instance did not have the resources for it.</p><p>The fix was to stop building on EC2 entirely. I moved the Docker build to GitHub Actions instead. GitHub Actions spins up a fresh runner with 2 vCPUs and 7GB RAM — far more than my t3.micro. The runner builds the Docker image, pushes it to ECR, and EC2 simply pulls and runs the already built image.</p><p>EC2 does not touch the compilation anymore. GitHub Actions does the heavy lifting, EC2 just runs the result.</p><p><em>Build where you have resources. Run where you need to.</em></p><h3>The MongoDB Password Problem</h3><p>At some point, my MongoDB connection stopped working and I could not figure out why. The URI looked correct. The password looked correct. But I kept getting authentication errors.</p><p>It turned out my Atlas password had characters, especially <em>underscores, </em>that were causing issues when used inside the connection string URI. I switched to a clean alphanumeric password and it connected immediately.</p><p>Keep your database passwords simple when embedding them in connection strings. Small thing, costs a lot of time.</p><h3>Getting the CI/CD Pipelines Working</h3><p>This was the most frustrating and most rewarding part of the whole project.</p><p>The frontend pipeline was relatively straightforward— build React, sync to S3, invalidate CloudFront cache. The backend pipeline was more involved— run tests, build Docker image, push to ECR, SSH into EC2 and deploy the new container.</p><p>At one point GitHub sent me a “secret detected” notification. GitHub has a feature called <strong>secret scanning</strong>— it automatically scans every push for exposed credentials like API keys, access tokens and passwords. If it finds one it alerts you immediately and in some cases revokes the credential automatically. I had accidentally pushed a file with my AWS credentials exposed in plain text. GitHub flagged it immediately. I had to rotate my AWS keys, change passwords and audit everything I had pushed. I was so frustrated I genuinely considered scrapping the whole project and starting over.</p><p>I did not. But it was close.</p><p>This taught me something important— never hardcode credentials. Ever. Use environment variables, use GitHub secrets, use whatever your platform provides. GitHub will catch it and so will bad actors if you are not careful.</p><p>The SSH part caused the most grief after that. My original key pair did not work. I spent a long time trying to figure out why before realizing the key file permissions were wrong on my Mac, and eventually that the key just did not match the EC2 instance. I had to create a new key pair, update Terraform to use it, recreate the EC2 instance, and start fresh.</p><p>Then there was the issue of secrets not passing correctly through the SSH action in GitHub Actions. Secrets referenced inside an SSH script do not expand the way you expect. The fix was to pass them explicitly as environment variables to the action.</p><p>Another thing that caught me off guard— when a workflow fails and you fix the code, do not just click Re-run failed jobs. That reruns the old version of your workflow, not the new one you just pushed. You have to trigger a completely fresh run. I spent longer than I would like to admit pushing fixes that were not actually being picked up because I kept rerunning the wrong version.</p><p>Every one of these problems taught me something I would not have learned from just reading documentation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/942/1*I0_z-DW8JOWASv74CUQB3Q.png" /></figure><h3>When It Finally Worked</h3><p>After everything— the DNS issues, the disk quota errors, the SSH key drama, the secrets not passing, the MongoDB authentication failures— I opened my browser and hit the ALB URL.</p><p>{&quot;message&quot;:&quot;Welcome to MuchToDo API&quot;}</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/508/1*TQ9duVuH0SqhJJ8kdjeMhw.png" /></figure><p>Then I opened the S3 frontend URL and saw the full application loading— sign in, sign up, the whole thing.</p><p>It is a feeling that is hard to describe. Not just relief. Something closer to proof. Proof that all the concepts I had been studying were real, that I could actually build something that works, that runs, that deploys automatically when I push code. I felt so proud of myself.</p><h3>What I Learned</h3><p>A few things I would tell anyone attempting something similar:</p><p><strong>Build in CI, run in production.</strong> Do not try to compile heavy applications on small EC2 instances. Use GitHub Actions or any CI runner for builds and let your server just run the result.</p><p><strong>DNS issues are real.</strong> If your app cannot resolve a hostname, check your network before touching your code.</p><p><strong>Never hardcode credentials.</strong> GitHub secret scanning will catch it, but by then you have already exposed yourself. Use environment variables and GitHub secrets from day one. Rotating keys and auditing your commit history because of one careless push is not a fun afternoon.</p><p><strong>Keep secrets simple.</strong> Special characters in passwords and connection strings will cost you time. Keep them alphanumeric until you know exactly how your stack handles them.</p><p><strong>SSH keys matter.</strong> Understand how your key pairs work before you need them in a pipeline. It is much harder to debug under pressure.</p><p><strong>The documentation is the last thing but not the least thing.</strong> A good README, architecture doc and runbook are part of the work, not an afterthought.</p><p>Most importantly— build things. Nobody gets it right the first time. The goal is to get it running.</p><p>CIAO!!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=50ba1e8b6be5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Containerizing a Go API: From Docker Compose to Kubernetes]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/containerizing-a-go-api-from-docker-compose-to-kubernetes-4c31d10a5a7c?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/4c31d10a5a7c</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[altschool-africa]]></category>
            <category><![CDATA[kubernetes-cluster]]></category>
            <category><![CDATA[cloud-engineering]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Wed, 29 Apr 2026 07:23:44 GMT</pubDate>
            <atom:updated>2026-04-29T07:23:44.014Z</atom:updated>
            <content:encoded><![CDATA[<p>As part of my DevOps Engineering journey at AltSchool, I had to containerize and orchestrate a Golang REST API called MuchToDo — take it from raw source code all the way to a running Kubernetes cluster. On paper, straightforward. In practice? A series of humbling moments that I’m convinced are just part of becoming an engineer.</p><p>This is what that actually looked like.</p><h3>The Crash Loop I Didn’t See Coming</h3><p>I set up my docker-compose.yml, ran docker compose up, and watched my backend container immediately start dying and restarting. Over and over. The classic Restarting (1) status.</p><p>My first instinct was that something was wrong with the code. It wasn’t.</p><p>Running docker logs much-todo-api told me everything:</p><pre>level=ERROR msg=&quot;could not connect to MongoDB&quot; error=&quot;error parsing uri: scheme must be \&quot;mongodb\&quot; or \&quot;mongodb+srv\&quot;&quot;</pre><p>The URI was malformed — which meant the app was reading an empty string and trying to use it as a connection string. I went digging. Checked the compose file. The environment variable was set. Checked the Go code with grep -r &quot;Getenv&quot; . — and found that the app wasn&#39;t using os.Getenv at all. It was using Viper.</p><p>Opened config.go and there it was:</p><pre>MongoURI string `mapstructure:&quot;MONGO_URI&quot;`</pre><p>My compose file had MONGODB_URL. The config expected MONGO_URI. One rename later, the container stayed up.</p><p>It’s the kind of bug that feels embarrassing in hindsight but teaches you to actually read your config structs instead of assuming the names match.</p><p>I also learned patience the hard way. After running docker compose up -d --build, I&#39;d just sit there staring at the terminal for 10-15 seconds before even daring to run docker ps — because MongoDB needs time to fully initialize before the API can connect to it. If you check too early, everything looks broken. So I just waited. Uncomfortably. Counting in my head.</p><p>What made it sweeter was opening the browser right after and hitting localhost:8080/health. Just a single line back:</p><pre>{&quot;cache&quot;:&quot;disabled&quot;,&quot;database&quot;:&quot;ok&quot;}</pre><p>Tiny response. But after all that digging, seeing &quot;database&quot;:&quot;ok&quot; felt genuinely good. The thing was alive.</p><h3>Moving to Kubernetes</h3><p>Getting Docker Compose working felt like a win, but the real task was orchestrating everything on a local Kubernetes cluster using Kind.</p><p>This meant writing manifests for deployments, services, and persistent volume claims — making sure MongoDB data would survive pod restarts, and that the API and database could actually find each other inside the cluster.</p><p>The first time I applied my manifests and ran kubectl get pods, I got this:</p><pre>much-todo-api   0/1   CrashLoopBackOff   4   2m57s</pre><p>More crashing. More logs. More fixing. Eventually I got the startup timing sorted — Kubernetes doesn’t wait for MongoDB to be fully ready before starting the API, so the app was trying to connect before the database was up. A rollout restart after MongoDB settled fixed it.</p><p>Then, finally:</p><pre>mongodb-86f7655f86-h2vpp        1/1   Running   0   21m<br>much-todo-api-6f9975bc94-92g6q  1/1   Running   0   14m</pre><p>That 1/1 Running on both lines is a specific kind of satisfaction I didn&#39;t expect to feel this strongly about.</p><h3>Checking the Work</h3><p>With everything running, the API was accessible at localhost:30001/health through the NodePort service. Browser showed:</p><pre>{&quot;cache&quot;:&quot;disabled&quot;,&quot;database&quot;:&quot;ok&quot;}</pre><p>Simple. But after everything it took to get there, it felt like a lot.</p><p>I also set up an Ingress resource for future scalability — not required right now, but good practice to have it in place. The full kubectl summary showed pods, services, deployments, replicasets, and ingress all healthy.</p><h3>What I Actually Learned</h3><p>The technical stuff — Docker multi-stage builds, PVCs, NodePort vs ClusterIP, Ingress — that’s all in the documentation. You can read your way to understanding it. That part is fine.</p><p>What the docs don’t teach you is how to stay calm when your container has been crash looping for 20 minutes and you genuinely don’t know why. Or how to resist the urge to change five things at once when something breaks, because then you won’t know which change actually fixed it. I learned to slow down, read the logs properly, and follow the error to its source — even when the source turned out to be something as small as MONGODB_URL vs MONGO_URI.</p><p>I also learned that DevOps has a very specific relationship with waiting. You run a command and then you just… sit there. Waiting for pods to come up, waiting for MongoDB to initialize, waiting for the build to finish. At first it feels like nothing is happening. Eventually you realize that’s just how it works, and you stop refreshing every two seconds.</p><p>Honestly, the most valuable thing this project gave me wasn’t Kubernetes knowledge — it was the experience of being stuck, not knowing the answer, and finding my way out anyway. That’s the skill that actually transfers. The commands I’ll look up again. That feeling of working through something confusing until it clicks? That stays.</p><p>This project broke me a little and then put me back together with more knowledge than I started with. That feels like exactly the point.</p><p>Onwards.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4c31d10a5a7c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building the “Chaos Resume”: My Wild Day in DevOps & AWS]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/building-the-chaos-resume-my-wild-day-in-devops-aws-3eab39c0f30b?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/3eab39c0f30b</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[altschool-africa]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[aws-s3-bucket]]></category>
            <category><![CDATA[ec2-instance]]></category>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Mon, 20 Apr 2026 12:56:56 GMT</pubDate>
            <atom:updated>2026-04-20T14:30:30.283Z</atom:updated>
            <content:encoded><![CDATA[<p>They say the best way to learn <strong>DevOps</strong> is to build something, break it, and then fix it while your blood pressure rises. Today, I did exactly that.</p><p>I set out to build what I call the <strong>“Chaos Resume”</strong> — a dynamic, cloud-native portfolio hosted on AWS, deployed entirely via <strong>Terraform</strong>. What started as a “simple” infrastructure-as-code project quickly turned into a masterclass in troubleshooting, folder structures, and the importance of the Cmd+S keys.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/758/1*q4iewC9bZZr3znXM-z36Ug.png" /></figure><h3>The Vision: Infrastructure as Art</h3><p>The goal was honestly clear:</p><ul><li><strong>Backend:</strong> Python (Flask) running on an Ubuntu EC2 instance.</li><li><strong>Infrastructure:</strong> A custom VPC, subnets, and security groups in us-east-1.</li><li><strong>The Twist:</strong> A “Chaos Engineering” dashboard with interactive UI elements, floating cloud animations, and glass-morphism design.</li></ul><h3>The Reality: A Comedy of Errors</h3><p>If you think DevOps is just writing code and watching it work, let me tell you about my day.</p><p><strong>1. The “Ghost” Edits (The Save Button Struggle)</strong></p><p>The most humbling part of the journey? <strong>Forgetting to save.</strong> I would spend ten minutes perfecting my main.tf or app.py, run terraform apply, and… nothing changed. I was genuinely confused, staring at the screen wondering if AWS was gaslighting me.</p><p><strong>The Lesson:</strong> Terraform doesn’t care how good your code is if it’s still sitting in your text editor’s “unsaved” memory. Cmd+S is a DevOps engineer&#39;s best friend.</p><p><strong>2. The Initial Design Slump</strong></p><p>When I finally got the first version live, I hated it. It was plain, static, and frankly, didn’t scream “Cloud Engineer.” I wasn’t just looking for functionality — I wanted an <em>experience</em>. I spent hours scrapping the basic look and pivoting to a high-end dashboard with terminal typing effects and real-time infrastructure stats. If I’m putting my name on it, it has to look the part.</p><p><strong>3. The Folder Inception</strong></p><p>I hit a wall when Terraform started screaming: Error: Invalid function argument. I had created a templates folder for my HTML, but in the heat of the moment, I had accidentally dragged it <strong>inside</strong> my virtual environment (venv) folder. I was shouting at the terminal that the file existed, but Terraform—the strict librarian that it is couldn&#39;t see it because it wasn&#39;t in the root directory. I spent far too long fighting the terminal and moving directories until I finally realized I had buried my assets where the compiler couldn&#39;t breathe.</p><p><strong>4. The 16KB Wall &amp; The S3 Pivot</strong></p><p>Once I finally got the folder structure right and the design ready, I hit a hard limit. My “Chaos” design was so CSS-heavy that it exceeded the <strong>16KB limit for AWS User Data</strong> — the maximum size for the startup script passed to an EC2 instance at launch.</p><p>I went from being confused to being challenged. Instead of stuffing everything into a startup script, I pivoted to a more professional architecture: <strong>S3-backed deployments.</strong> The EC2 instance would boot lean, then pull the heavy HTML file directly from a secure storage bucket.</p><p>Here’s the logic that saved the project:</p><pre>user_data = &lt;&lt;-EOF<br>  #!/bin/bash<br>  sudo apt-get update -y<br>  sudo apt-get install -y python3-pip python3-flask python3-requests awscli -y</pre><pre>  mkdir -p /home/ubuntu/templates</pre><pre>  # Copy the Python logic<br>  cat &lt;&lt; &#39;APP&#39; &gt; /home/ubuntu/app.py<br>  ${file(&quot;app.py&quot;)}<br>  APP</pre><pre>  # Pull the &quot;Heavy&quot; HTML from S3 (Bypassing the 16KB limit)<br>  aws s3 cp s3://$${aws_s3_bucket.resume_assets.id}/index.html /home/ubuntu/templates/index.html</pre><pre>  sudo python3 /home/ubuntu/app.py &amp;<br>  EOF</pre><blockquote><strong><em>Note:</em></strong><em> The </em><em>$${...} double-dollar syntax is intentional because it&#39;s how Terraform escapes a literal </em><em>$ inside a heredoc so it doesn&#39;t get treated as a variable interpolation.</em></blockquote><p><strong>5. The Terminal Stand-off (The Destruction Refusal)</strong></p><p>Even the exit strategy was a fight. By the time I was exhausted and ready to wrap up, I deleted my local files, thinking I was done. But when I ran terraform destroy, the system threw a fit — it refused to tear down the infrastructure because it couldn&#39;t find the very file I had already deleted. The fix? I had to touch a ghost file back into existence just so Terraform had something to reference, and <em>then</em> it finally let me wipe the slate clean.</p><h3>The Cycle: Architect → Deploy → Troubleshoot → Delete</h3><p>Looking back, I realized I lived the entire DevOps lifecycle in a single session:</p><p><strong>Architect:</strong> Designed the VPC, subnets, and security groups.</p><p><strong>Deploy: </strong>Pushed the first “Minimalist” version live.</p><p><strong>Troubleshoot:</strong> Fought path errors, venv traps, unsaved files, and AWS limits.</p><p><strong>Delete:</strong> Ran terraform destroy — the most satisfying command of the day.</p><h3>Final Thoughts</h3><p>This project was “chaos” by name and chaos by nature. I felt lost more than once, but that’s where the growth happens. Seeing the cute design live on an AWS IP address made every Error: Invalid path worth it.</p><p>At the end of the day, Infrastructure as Code is less about clean code and more about refusing to quit when nothing makes sense and to keep applying until the thing you built is actually out there.</p><p>And if anyone asks how long it took? “A couple of hours.” We don’t talk about the save button.</p><p>Would I do it again? Absolutely. Will I remember to save my files first? …We’ll see.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3eab39c0f30b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Deployed a Secure Web Infrastructure on AWS Using a Bastion Host, Load Balancer, and Ansible]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/how-i-deployed-a-secureweb-infrastructure-on-aws-using-a-bastion-host-load-balancer-and-ansible-9a073b4df07a?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a073b4df07a</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Wed, 11 Feb 2026 20:49:08 GMT</pubDate>
            <atom:updated>2026-02-15T10:32:33.222Z</atom:updated>
            <content:encoded><![CDATA[<p>As part of my cloud engineering journey, I recently deployed a secure and automated web infrastructure on Amazon Web Services (AWS). This project pushed me beyond theory and forced me to think like a real cloud engineer, prioritizing security and automation from the start.</p><p>While it wasn’t completely smooth, cloud projects rarely are, especially when troubleshooting is involved — the challenges helped me build confidence in my problem-solving ability.</p><p>Let me walk you through what I built and why each decision mattered.</p><h3>Architecture Overview</h3><p>I designed this infrastructure to reflect real-world cloud practices — prioritizing security, controlled access, and high availability from the start. Here’s what the setup looked like:</p><p><strong>i.</strong> A custom <strong>VPC </strong>to isolate my resources.</p><blockquote>aws ec2 create-vpc — cidr-block 10.0.0.0/16</blockquote><p><strong>ii. </strong>A<strong> Public Subnet</strong></p><ul><li>Bastion Host</li><li>Load Balancer</li></ul><p><strong>iii. </strong>A <strong>Private Subnet</strong></p><ul><li>Web Servers</li></ul><p><strong>iv.</strong> An<strong> Application Load Balancer</strong> to distribute traffic.</p><p><strong>v. EC2 instances</strong> running NGINX.</p><p><strong>vi.</strong> <strong>Ansible</strong> to automate configuration.</p><h3>Architecture Diagram</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/844/1*VWa74ToTSPcA1mWSS7xkyg.jpeg" /></figure><p>The diagram shows how user traffic and administrative access are separated within the infrastructure.</p><p>Incoming requests from the internet first reach the <strong>Application Load Balancer (ALB)</strong> in the public subnet. The ALB distributes traffic evenly between Web Server 1 and Web Server 2, both running <strong>NGINX</strong> inside private subnets. This ensures high availability — if one server fails, the other continues serving traffic.</p><p>The web servers are not publicly accessible. Instead, they only accept traffic from the load balancer on port 80.</p><p>Below the web servers is the Bastion Host, which serves as a secure administrative gateway. Engineers connect to the Bastion Host via SSH from the internet, and from there, access the private web servers. This prevents direct SSH exposure of the web servers and significantly reduces the attack surface.</p><p>This architecture ensures:</p><ul><li>Only the load balancer is exposed to public traffic</li><li>Web servers remain private and protected</li><li>Administrative access is controlled through a single secure entry point</li><li>Traffic is distributed for fault tolerance and availability</li></ul><h3>Why I Used a Bastion Host</h3><p>Security is a top priority in cloud environments because if there’s one thing I’ve learned in cloud engineering is that <strong>“If a server doesn’t need to be public, do not make it public”.</strong></p><p>Instead of assigning public IP addresses to my web servers, I placed them inside private subnets and created a <strong>Bastion Host</strong> as the only entry point.</p><p>What this means is that:</p><p><strong>i.</strong> The web servers are hidden from the internet.</p><p><strong>ii.</strong> SSH access is tightly controlled.</p><p><strong>iii. </strong>The attack surface is significantly reduced.</p><p>SSH into Bastion Host</p><blockquote>ssh -i ~/.ssh/key.pem ec2@user&lt;bastion-public-ip&gt;</blockquote><p>SSH from Bastion Host to private EC2 server</p><blockquote>ssh -i ~/.ssh/key.pem ec2@user&lt;private-ec2-ip&gt;</blockquote><p>Rather than managing multiple exposed servers, I only needed to secure one gateway.</p><p>It’s a simple decision that makes a huge difference in real-world environments.</p><h3>How Ansible Made Things Easier</h3><p>Before this project, automation was something I mostly understood in theory. After working through this setup and doing a fair amount of <em>troubleshooting — </em>I finally understood why engineers rely<em> </em>on it.</p><p>Imagine installing NGINX manually on multiple servers… Now imagine repeating that process every single time you add a new one especially when something breaks and you have to trace the issue step by step!!!</p><p><strong>NO THANKS</strong>.</p><p>With <strong>Ansible,</strong> I wrote<strong> the </strong>playbook once and ran:</p><blockquote>ansible-playbook -i inventory nginx.yml</blockquote><p>…and whenever I hit a configuration issue, fixing it in one place meant it was fixed everywhere. Instead of <em>troubleshooting </em>the same problem across multiple servers, I only had to solve it once.</p><p>Automation doesn’t just save time, it saves you from future headaches.</p><h3>Direct EC2 Access vs Load Balancer Access</h3><p>When you’re new to AWS, it can feel easier to just expose an EC2 instance and call it a day.</p><p>But that approach doesn’t scale well in real environments.</p><p><strong>Direct EC2 Access:</strong></p><p><strong>i.</strong> One server handles everything.</p><p><strong>ii.</strong> If it goes down, your application goes with it.</p><p><strong>iii.</strong> Each server is publicly exposed.</p><p><strong>Load Balancer Access:</strong></p><p><strong>i. </strong>Traffic is distributed automatically.</p><p><strong>ii.</strong> Healthy servers receive requests.</p><p><strong>iii. </strong>Users don’t notice when one instance fails.</p><p><strong>iv. </strong>Only the load balancer is public.</p><p>Basically, Direct access works for demos.</p><p>Load balancers work for production.</p><p>ALB CLI</p><blockquote>aws elbv2 describe-target-health — target-group-arn &lt;target-group-arn&gt;</blockquote><h3>Challenges I Faced And Lessons Learned</h3><p><strong>SSH Errors that Tested My Patience</strong></p><p>I ran into multiple <em>permission denied </em>errors while trying to connect to my instances. At first, It was frustrating. But troubleshooting forced me to slow down and check the basics:</p><p>Was my key pair in the correct location?</p><p>Did it have the right permissions?</p><p>Were my security groups configured properly?</p><p>After fixing the permissions with:</p><blockquote>chmod 400 ~/.ssh/key.pem</blockquote><p>Everything worked.</p><p>Take home lesson: some cloud “mysteries” are usually configuration issues.</p><h3>When Ansible Refused to Cooperate</h3><p>There’s honestly nothing like writing a playbook, hitting run… and watching it fail instantly.</p><p>Well, my issue turned out to be connectivity.</p><p>The fix involved:</p><p>Verifying private IP addresses.</p><p>Ensuring the bastion host could reach the servers.</p><p>Correcting my inventory file.</p><p>Once that was sorted, the playbook executed perfectly.</p><p>And honestly? Watching your automation work after loads of troubleshooting/debugging is extremely satisfying. Definitely a very satisfying moment.</p><h3>Load Balancer Health Checks</h3><p>While setting up the load balancer, I noticed a message indicating that the targets were not yet in use and for a moment I thought I had missed something along the way but it turned out that this was just part of the normal setup process.</p><p>Once NGINX was running, port 80 was open, and the configuration was complete, everything registered properly and started working as expected.</p><p>What I learned there was that, sometimes a message looks like an issue when it’s really just the system waiting for everything to be fully ready.</p><h3>What This Project Really Taught Me</h3><p>More than anything, this project changed how I think about the infrastructure. I no longer see servers as things you just launch.</p><p>Now I automatically think about:</p><ul><li>Security first</li><li>Private vs Public access</li><li>Fault tolerance</li><li>Automation</li><li>Scalability</li></ul><p>Because Cloud Engineering isn’t just about knowing services but designing systems that survive real-world conditions.</p><h3>My Final Thoughts</h3><p>This project pushed me from just learning cloud concepts to actually implementing them.</p><ul><li>AWS networking</li><li>Secure architecture</li><li>Infrastructure automation</li><li>Designing with security in mind</li><li>Thinking more like an engineer instead of just following steps</li><li>Real troubleshooting(breaking things and figuring out why)</li><li>Reading cloud error messages without panicking</li></ul><p>I’m still learning, but projects like this remind me that I’m steadily moving from studying cloud to actually building in the cloud.</p><p>And honestly, there’s no better way to learn than by getting your hands <em>dirty </em>and figuring things along the way.</p><p>On to the next build. 🚀</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a073b4df07a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Setting up S3 Bucket]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/setting-up-s3-bucket-93bacae4a441?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/93bacae4a441</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Sun, 01 Feb 2026 16:31:20 GMT</pubDate>
            <atom:updated>2026-02-01T16:31:20.888Z</atom:updated>
            <content:encoded><![CDATA[<p>As part of a hands-on AWS assignment, I learned how to create a bucket in Amazon S3, upload a file, and make it publicly accessible. This article walks through the process and the challenges I faced.</p><p><strong>Step 1: Creating the S3 Bucket</strong></p><p>First, I logged into the AWS S3 console and created a <strong>new bucket</strong>. I gave it a unique name: ifeyinwa-public-bucket and selected my region as <strong>Europe (Stockholm)</strong>.</p><p>One tricky part was <strong>Object Ownership</strong>. AWS defaults to “Bucket owner enforced,” which blocks public access. To allow my file to be public, I selected <strong>ACLs enabled</strong> and unchecked <strong>Block all public access</strong>, acknowledging AWS’s warning about exposing objects publicly.</p><p><strong>Step 2: Uploading the Image</strong></p><p>Next, I uploaded an image to my bucket. During the upload process, under <strong>Permissions</strong>, I checked <strong>Grant public read access</strong>. This step is crucial because it ensures anyone with the file’s URL can view it. After clicking <strong>Upload</strong>, the image appeared in the bucket.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sAJ1ulgRxNOr6ywZTXcEZQ.png" /></figure><p><strong>Step 3: Making the Image Public</strong></p><p>Once uploaded, I clicked on the file and copied the <strong>Object URL</strong>. Opening the URL in my browser confirmed that the image was publicly accessible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EicBkdrSI6UK_zLIK3QxvQ.png" /></figure><p><strong>Challenges I Faced</strong></p><ul><li><strong>Public access issues:</strong> Initially, the default <strong>“Bucket owner enforced”</strong> setting prevented me from granting public access. I had to create a new bucket with ACLs enabled.</li><li><strong>Permissions confusion:</strong> AWS has multiple ways to control access (ACLs, bucket policies, block public access). Learning the difference took some trial and error.</li><li><strong>Verifying public access:</strong> I had to remember to test the Object URL in a browser to ensure it was truly public.</li></ul><p><strong>Lessons Learned</strong></p><p>This exercise taught me the importance of <strong>bucket settings and object permissions</strong> in AWS S3. Understanding how ACLs and public access work is critical when you want to share files publicly.</p><p>By carefully configuring the bucket and checking permissions during upload, I successfully made my image accessible to anyone with the link.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/822/1*bbiFUtxsCcD_a3npfI8ZZA.jpeg" /><figcaption>FIN.</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=93bacae4a441" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloud Nine and Linux Lines: My Cloud Engineering Launchpad at AltSchool]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/cloud-nine-and-linux-lines-my-cloud-engineering-launchpad-at-altschool-0674cd7f3823?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/0674cd7f3823</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Mon, 01 Dec 2025 16:48:36 GMT</pubDate>
            <atom:updated>2025-12-01T16:48:36.272Z</atom:updated>
            <content:encoded><![CDATA[<p>(An honest look at trading late-night Netflix for late-night bash commands)</p><h3>The Great Pivot: From Zero to sudo</h3><p>Six months ago, if you asked me what “the Cloud” was, I’d probably point vaguely at the sky and then offer to share my Google Drive link. Today, I’m navigating the deep waters of Cloud Engineering, and frankly, I’m loving every mkdir of it.</p><p>I’m currently in the thick of my second semester at <strong>AltSchool Africa</strong>, and if the first semester was a leisurely paddle, this one is a deep-sea dive. I decided to start writing about this journey — not just to document my progress, but because I’ve realised that starting in tech can often feel like you’re the only person who doesn’t <em>already</em> know the difference between <strong>cat</strong> and <strong>ls</strong>.</p><p>If you’re considering a similar path, or you’re already elbow-deep in your Linux terminal, here’s a sneak peek at what’s been happening and why you should be paying attention to the foundations(very necessary).</p><h3>* The OS Whisperer: Making Friends with Linux</h3><p>The core of my initial learning has been understanding <strong>Operating Systems</strong>, particularly <strong>Linux</strong>. Before this, I thought an operating system was just the fancy wallpaper and icons I clicked on. Now, I see the matrix:</p><ul><li><strong>The Shell &amp; Commands:</strong> I’ve spent hours talking to the machine through the command line. It’s like learning a new, efficient language. I now know how to move files, check system health, and navigate directories faster than I can find my keys in the morning. We’ve explored piping (|) and redirection (&gt;, &gt;&gt;) to chain commands together, making repetitive administrative tasks a breeze.</li><li><strong>Permissions &amp; Privacy:</strong> Ever accidentally delete a critical file? Me neither (now!). Understanding <strong>file operations, permissions, users, and groups</strong> has been crucial. Learning about chmod, chownand the octal system (755, 644) felt like unlocking a secret code. It&#39;s the difference between a secure system and a digital house of cards.</li><li><strong>Linux Process Management:</strong> Learning about processes and how they run, sleep, or get terminated has been like peering into the system’s brain. I can now manage resource consumption like a seasoned pro — or at least, like someone who knows how to use the top command. We also covered background processes (&amp;) and job control, which is essential for any long-running script.</li></ul><h3>* Vagrant: My Portable, Reusable Workspace</h3><p>One of the coolest tools we’ve tackled is <strong>Vagrant</strong>. For the uninitiated, it lets you create and manage virtual development environments using a simple configuration file. It’s a game-changer for consistency. No more “But it works on <em>my</em> machine!” excuses.</p><p>The moment I typed vagrant init and then vagrant up for the first time, I felt a rush. It was the feeling of seeing an entire, perfectly configured server environment spring to life from a single command. <strong>It was the first tangible proof that I could <em>provision</em> infrastructure, not just use it.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vFCZq4XABJBoAYX9bgWP8Q.jpeg" /></figure><h3>* The Version Control Lifeline: Git</h3><p>Finally, we hit <strong>Version Control with Git</strong>. If Linux is the engine of the cloud, Git is the insurance policy. Learning to <strong>commit, push, pull, and branch</strong> has unlocked the door to collaborative work and, more importantly, saved me from panicking when I accidentally break something. It’s the ultimate time machine for code. The power of a well-crafted <strong>commit message</strong> and the safety of <strong>branching</strong> before tackling a major feature have fundamentally changed how I approach any project.</p><h3>What’s Next? Join the Journey!</h3><p>I’m only a few modules in, and the road ahead is packed with concepts like <strong>networking protocols (TCP/IP, DNS)</strong>, <strong>virtualization</strong>, and eventually, the big cloud platforms like AWS, Microsoft Azure and Google Cloud Platform(GCP). But right now, I’m enjoying the solid foundation AltSchool is providing.</p><p>If you’ve ever wanted to jump into Cloud Engineering, remember this: <strong>The most common lie in Linux is when your shell says, “command not found.” The truth is, the command is always there; you just need to tell the system where to look!</strong></p><p>Stay tuned as I dive deeper into networking protocols and maybe even manage to spin up my first real cloud instance without needing to call for help.</p><p>_inthecl0ud…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SPeXRDp800Qi1A75DY-TvQ.jpeg" /><figcaption>Where I’m at most of the times…</figcaption></figure><p><a href="https://x.com/inthecl0ud_?s=21">https://x.com/inthecl0ud_?s=21</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0674cd7f3823" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Strengthening Open Source Communities: My Journey]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/strengthening-open-source-communities-my-journey-e841173e9fe2?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/e841173e9fe2</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Wed, 02 Apr 2025 10:56:01 GMT</pubDate>
            <atom:updated>2025-04-02T10:59:41.240Z</atom:updated>
            <content:encoded><![CDATA[<h3>Discovering My Local Tech Space</h3><p>I am part of a growing tech community in Isolo, Lagos, Nigeria, although it hasn’t always been easy to find a place to belong. While my local area is not a hub for open-source activities, I sought out opportunities to connect with other tech enthusiasts by going beyond my immediate environment. I reached out to online communities, attended events, and conducted research to gain the knowledge and network I needed to grow. This exploration has led me to<strong> open-source conferences and meetups</strong>, which were pivotal in expanding my horizons.</p><h3>Overcoming Barriers to Growth</h3><h4>Common Challenges</h4><p>My local community in Isolo, unfortunately, lacks many of the resources and structured support that larger tech hubs offer. As a result, I have faced several challenges in fostering a thriving open-source presence within my area:</p><ul><li><strong>Lack of Established Community:</strong> There isn’t a strong, established open-source or tech community locally in Isolo. I’ve had to go beyond my immediate area to find other like-minded individuals, resources, and communities. This has meant that I’ve had to actively seek out online resources, attend external conferences, and do my own research to learn and grow in the open-source space.</li><li><strong>Resource Constraints:</strong> Without access to venues, tech infrastructure, or funding, organizing events within the community is difficult. I’ve struggled to create local meetups or workshops due to limited resources, making it harder to build a physical space for engagement.</li><li><strong>Sustaining Engagement:</strong> Keeping people engaged, especially when you don’t have regular local events, has been a challenge. The initial excitement about open-source tech can wear off without a consistent community and physical meetings to maintain momentum.</li><li><strong>Limited Outreach:</strong> Since my local network is small, it’s been difficult to grow the community and attract new members, particularly people from diverse backgrounds or those unfamiliar with open source. This limited outreach makes it harder to diversify contributions and perspectives.</li></ul><h4>Strategies That Worked</h4><p>Given these challenges, I had to get creative to stay connected and engaged with the open-source world:</p><ul><li><strong>External Networking and Conferences:</strong> I realized early on that in order to grow and learn, I had to seek opportunities outside my immediate community. Attending my first open-source conferences — such as <strong>CHAOSScon Africa 2023</strong> (focused on open-source project health), <strong>OSCAfest</strong>, and<strong> She Code Africa </strong>— helped me meet like-minded individuals, learn from experts, and understand what makes an open-source community thrive. These events broadened my perspective and gave me the chance to build connections with global contributors.</li><li><strong>Building Virtual Communities:</strong> While physical presence was lacking, I made use of online spaces. Platforms like Discord, Telegram, and GitHub allowed me to connect with other open-source enthusiasts. Virtual collaboration became an essential tool in my journey, and I have continued to use these platforms to stay involved in discussions and contribute to projects.</li><li><strong>Independent Learning and Research:</strong> In the absence of a local community, I’ve made research a priority. I’ve followed blogs, tutorials, and contributed to online open-source projects. This independent learning has been crucial in staying up-to-date with the latest developments and best practices in open source.</li><li><strong>Collaborating with Global Communities:</strong> While my local community was limited, I’ve been fortunate to connect with global open-source groups and mentorship opportunities. These networks have allowed me to be part of something bigger than my immediate environment and continuously grow.</li></ul><p>Through these strategies, I’ve been able to overcome the absence of a local community and continue my open-source journey, despite the challenges.</p><h3>My First Open Source Conferences: CHAOSScon, OSCAfest, and She Code Africa</h3><p>A significant milestone in my open-source journey was attending CHAOSScon Africa 2023. This conference, focused on “<strong>Open Source Project Health,</strong>” gave me a deep dive into understanding the sustainability of open-source projects, how to measure community health, and ways to engage contributors. CHAOSScon allowed me to connect with industry experts and learn how open-source metrics could shape community engagement.</p><p><strong>Key Highlights:</strong></p><ul><li>I participated in workshops where I learned how to analyze contributor activity and project health, something that felt particularly important to apply back home.</li><li>Networking with open-source leaders provided me with insights into how open-source communities thrive, especially through inclusivity and active contributor engagement.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/786/1*nWmb5EqFBoBns0cSryfdRw.jpeg" /><figcaption>CHAOSScon 2023 GROUP PHOTO</figcaption></figure><p>Later that year, I attended <strong>OSCAfest</strong>, which had the theme <strong>“Sustainability for Growth.”</strong> This event helped expand my network within the African open-source community, offering a broader perspective on how open-source can be scaled and sustained across regions. I gained valuable knowledge on best practices for project contributions, documentation, and strategies for onboarding newcomers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/828/1*ThT-sMiNQeoefDm6jK1x3Q.jpeg" /><figcaption>OSCAFEST 2023</figcaption></figure><p>My experience at <strong>She Code Africa</strong> was another highlight. This event created a unique space for women in tech, which inspired me to pursue open-source contributions with confidence and passion. It reinforced my belief in the power of mentorship and the importance of creating inclusive spaces for underrepresented groups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ane-iv9gyYrnKyW9WUoziQ.jpeg" /><figcaption>SCA SUMMIT GROUP PHOTO</figcaption></figure><p>In summary<strong>, </strong>these conferences and events were not only educational but also instrumental in connecting me with a global network of open-source advocates. I went from having no local community to being part of a vibrant international network that’s supporting my growth in open-source.</p><h3>Fedora: My Next Step in Open Source</h3><p>With the knowledge and inspiration I’ve gained from conferences and active participation in these communities, I now look to <strong>Fedora</strong> as my next step. Fedora’s commitment to inclusivity, mentorship, and community-driven development aligns perfectly with my values. I believe Fedora can further empower local communities by providing more resources, guidance, and financial support for community-driven initiatives.</p><p>Here’s how Fedora can play a vital role in expanding community efforts:</p><ol><li><strong>Expanding mentorship networks:</strong> Connecting local contributors with Fedora mentors for open-source guidance.</li><li><strong>Providing financial support:</strong> Offering small grants for venue rentals, internet access, and community events would be highly beneficial.</li><li><strong>Developing outreach kits:</strong> Resources like promotional materials and event planning guides would streamline community engagement efforts.</li><li><strong>Recognizing active members:</strong> Showcasing local contributors through blog features or social media spotlights could boost motivation and participation.</li><li><strong>Hosting Fedora-sponsored events:</strong> Organizing regional Fedora Days or hackathons could strengthen the Fedora ecosystem and foster deeper engagement.</li></ol><h3>Ideas for Fedora</h3><h3>How can Fedora better support local communities?</h3><p>Fedora has the opportunity to further strengthen its support for local tech communities by offering tailored resources, mentorship programs, and financial assistance. As local communities often face challenges such as limited resources, outreach barriers, and participant retention, Fedora’s involvement in these areas can make a significant difference.</p><h3>What resources, mentorship, or funding would be helpful?</h3><ol><li><strong>Financial Support for Local Events:</strong> Community-driven events can struggle to secure funding for essential items like venues, refreshments, and internet access. Small grants from Fedora would go a long way in supporting these efforts and ensuring that local groups have the necessary resources to thrive.</li><li><strong>Expanded Mentorship Programs:</strong> More experienced contributors mentoring newcomers is critical for growth. Fedora could provide a structured mentorship program that connects experienced members with local communities to help guide new contributors through the onboarding process, project contributions, and community engagement.</li><li><strong>Community Outreach Materials:</strong> To help local groups grow their reach and attract a diverse pool of contributors, Fedora could provide outreach kits. These kits could include promotional templates, event planning guides, and best practices for inclusivity, all aimed at helping local groups engage with underrepresented communities and create a welcoming space for everyone.</li><li><strong>Local Fedora Representatives:</strong> Introducing dedicated Fedora representatives in various regions who can advocate for Fedora at local events and mentor newcomers. These representatives would act as connectors between Fedora and emerging communities, fostering engagement through meetups, hands-on support, and outreach efforts in areas with limited open-source exposure.</li></ol><h3>Looking Ahead</h3><p>Engaging with open-source communities and exploring new opportunities has been an incredible experience. The support from <strong>Fedora</strong> and similar initiatives would provide a solid foundation for local communities to grow, thrive, and create a welcoming environment for everyone, regardless of background or experience level.</p><p>As I continue my journey, I look forward to learning from<strong> Fedora’s diverse community,</strong> which actively promotes <em>diversity, equity, and inclusion</em>, and to furthering these values within the project. I am excited to contribute to its ecosystem, share my experiences, and work toward making open-source software more accessible to all. Together, we can create an open-source future that’s not only innovative but also supportive and open to everyone who wants to get involved.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*7jiZUMg2PazgngVFcsR5Yw.jpeg" /><figcaption>An OS stressball I got</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e841173e9fe2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Breaking Into Open Source: A Real-World Guide to Outreachy.]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/breaking-into-open-source-a-real-world-guide-to-outreachy-83e2dfbd11a9?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/83e2dfbd11a9</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Fri, 28 Mar 2025 12:20:32 GMT</pubDate>
            <atom:updated>2025-03-31T12:17:02.251Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*vGGLWBOzSxC367FBn5t1kA.png" /></figure><p>Ever looked at <strong>open-source</strong> projects and thought, <em>I’d love to be part of this, but where do I even start?</em> That’s exactly what <strong>Outreachy </strong>is here for. It’s not just about getting your foot in the door, it’s about kicking that door wide open for <strong>underrepresented voices in tech</strong>.</p><p>But let’s be real: The Outreachy process can feel like stepping into the unknown. <strong>What makes an application stand out? How do you choose a project? What if you’re not a coding pro? </strong>Relax, ‘cause’ I’ve got you.</p><p>This isn’t just a checklist, it’s your roadmap to standing out in Outreachy. From application to acceptance, here’s how to make your journey count.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/225/1*T69N01yemxvqds4iSl2LEg.png" /></figure><h3><strong>Outreachy: A Gateway to Open Source</strong></h3><p><strong>Outreachy</strong> is a fully remote, paid internship designed to bring <strong>underrepresented </strong>voices into<strong> Open Source</strong>. If you’ve ever felt like tech wasn’t built for people like you, because of race, gender identity, location, or lack of access — this program exists to change that.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*QfinyuHOqfnIGLa90YjL0g.png" /></figure><p>But Outreachy isn’t just about writing code. It’s about contributing to real-world projects, collaborating with a global community, and gaining the kind of experience that makes doors open.</p><h3><strong>Navigating Outreachy: A Step-by-Step Guide.</strong></h3><p>Success in Outreachy doesn’t happen by chance, it’s about <strong>preparation</strong> and <strong>persistence</strong>. The process follows three key stages:</p><p><strong>Application Stage-</strong> Prove your eligibility and submit your initial application.</p><p><strong>Contribution Stage-</strong> Find a project, engage with mentors, and make meaningful contributions.</p><p><strong>Final Selection- </strong>Submit a compelling final application and wait for that acceptance email!</p><h3>First Steps: Making Your Application Stand Out</h3><p>Your application is the first opportunity to demonstrate to Outreachy that you meet their eligibility criteria and are genuinely committed to open source. To strengthen your application, focus on:</p><p><strong>Your motivation- </strong>Clearly explain why open source matters to you and how it aligns with your long-term goals.</p><p><strong>Your journey- </strong>Highlight the challenges you’ve faced as someone from an underrepresented background in tech. Be honest and specific.</p><p><strong>Your goals- </strong>Outline what you hope to gain from this internship and how it will contribute to your growth.</p><p>Outreachy requires interns to <strong>dedicate 40 hours per week</strong> to their projects, so emphasize your availability and commitment. Be precise and thorough because vague or generic responses won’t cut it. Authenticity and attention to detail matter.</p><h3>Choosing the Right Project: Where do you fit in?</h3><p>This is where <strong>passion meets skill</strong>. Once your application is approved, the next challenge is selecting the right project. Here’s how to narrow down your options:</p><p><strong>Leverage your strengths- </strong>Whether you’re skilled in frontend development, backend systems, UX design, or technical writing, choose a project that aligns with your expertise.</p><p><strong>Do your research- </strong>Read project descriptions thoroughly, go through past contributions, and <strong>study the documentation</strong> to understand the project’s scope and requirements.</p><p><strong>Stay adaptable- </strong>If your first choice feels overwhelming or becomes unavailable, be flexible and explore other options.</p><h4>Exploring Open Source with Fedora</h4><p><strong>Fedora</strong>, a community-driven Linux distribution, is one of the many open-source projects you might encounter during Outreachy. It provides a welcoming space for contributors of all skill levels, whether you’re interested in coding, documentation, or testing. If you’re looking for a project with strong mentorship and real-world impact, Fedora could be a great place to start for you!</p><p>The <em>key</em> is to find a project that not only aligns with your skills but also excites you. A genuine interest will make the contribution process smoother and more rewarding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/275/1*2PB9_qy_dhmnQh2lqOHdWA.jpeg" /></figure><h3>Making an Impact: More Than Just a Contribution</h3><p>Many applicants struggle at this stage, whether by overanalyzing their approach, doubting their abilities, hesitating to seek guidance, or assuming a minor fix is sufficient. To stand out, go beyond the basics by:</p><p><strong>Deepen your understanding</strong>- Read the <strong>documentation(</strong>emphasis on this<strong>)</strong>, explore past discussions, and analyze issues to gain clarity.</p><p><strong>Engage proactively</strong>- Introduce yourself, participate in conversations, and seek guidance and feedback from mentors to establish your presence.</p><p><strong>Focus on meaningful contributions</strong>- Solve real problems rather than making surface-level edits, and be open to mentor feedback for improvements.</p><p><strong>Showcase problem-solving skills</strong>- Identify gaps, suggest improvements, implement solutions, and refine them based on feedback.</p><p><strong>Stay consistent</strong>- Regular contributions and responsiveness to feedback demonstrate reliability and commitment to the project.</p><p><strong>Communicate effectively</strong>- Ask relevant questions, provide clear explanations, and collaborate with mentors and peers to enhance your work.</p><p>Effort, engagement, and a willingness to learn will set you apart from other applicants.</p><h3><strong>The Final Application: Telling Your Story</strong></h3><p>By this stage, you should have at least one accepted contribution — though multiple contributions will strengthen your application. Your final submission should effectively highlight:</p><p><strong>Your Impact- </strong>Clearly outline what you contributed to the open-source project, why it mattered, and how it improved the project.</p><p><strong>Your Growth- </strong>Reflect on your learning process, the challenges you overcame, and how you adapted along the way.</p><p><strong>Your Passion- </strong>Demonstrate genuine enthusiasm for open source and your commitment to contributing beyond the Outreachy internship.</p><p>Success in <strong>Outreachy</strong> comes from curiosity, resilience, enthusiasm, and a strong commitment to open-source collaboration, qualities that make a lasting impression on mentors.</p><h3>Your Path Forward: The Beginning of Something Bigger</h3><p>Outreachy is a highly competitive program, and getting ahead early can make all the difference. Consistency, meaningful contributions, and engagement with mentors set strong applicants apart.</p><p>But no matter the outcome, this journey is an opportunity for growth. You’ll gain hands-on experience, build connections, and develop skills that extend far beyond this internship and become part of a thriving open-source community. Keep <em>learning</em>, keep <em>contributing</em>, and let this be the start of your <em>open-source</em> journey.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/168/1*Qgdry7tqJVDFfghmgp5rpw.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=83e2dfbd11a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Discovering Fedora: My First Steps into the Open-Source World.]]></title>
            <link>https://medium.com/@ihediohaifeyinwa/discovering-fedora-my-first-steps-into-the-open-source-world-d6917e28ee59?source=rss-d957eed26cfc------2</link>
            <guid isPermaLink="false">https://medium.com/p/d6917e28ee59</guid>
            <dc:creator><![CDATA[Ihedioha Ifeyinwa]]></dc:creator>
            <pubDate>Tue, 25 Mar 2025 07:59:50 GMT</pubDate>
            <atom:updated>2025-03-25T08:28:52.849Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/275/1*6A8vKnZh_95HvSPFw1u2Ow.jpeg" /></figure><p>Before starting the Outreachy application process, I had heard of <strong>Fedora</strong> but didn’t know much about it beyond it being a <strong>Linux distribution</strong> and honestly didn’t know what to expect. Fast forward to today, and I’ve realized <strong>Fedora</strong> is so much more than just an operating system — <strong>it’s a thriving, ever-evolving open-source community that fuels innovation and collaboration</strong>.</p><h3>What is Fedora?</h3><p>At its core,<strong> Fedora </strong>is a free and open-source Linux distribution sponsored by Red Hat. But calling it “<em>just another Linux distro</em>” wouldn’t do it justice. Fedora is where cutting-edge technology meets community-driven development. It’s a place where developers, designers, writers, and enthusiasts from all over the world come together to build something great.</p><p>Fedora isn’t just about an<em> Open Source</em>, it’s about pushing the boundaries of open-source software. It serves as the testing ground for new features that often make their way into Red Hat Enterprise Linux (RHEL), making it an essential part of the broader Linux ecosystem.</p><h3>The Four Foundations: The Heart of Fedora</h3><p>Fedora operates under four guiding principles: <strong>Freedom, Friends, Features, and First. </strong>And honestly, they’re pretty inspiring:</p><p><strong>Freedom</strong>: Fedora is all about free and open-source software, giving users complete control over their system. No proprietary nonsense, just pure, community-driven innovation.</p><p><strong>Friends</strong>: This is a big one cause the Fedora community is one of the most welcoming I’ve come across. Whether you’re a coder, writer, designer, or just curious, there’s a place for you.</p><p><strong>Features</strong>: Fedora is always ahead of the curve. It’s where new technologies are introduced, tested, and refined before being adopted by other distributions.</p><p><strong>First</strong>: If you love staying on the cutting edge of tech, Fedora is your playground. It’s constantly evolving, delivering the latest and greatest in open-source software.</p><h3>What Stands Out About Fedora</h3><p>One thing that really caught my attention is how open everything is. Discussions, decisions, and contributions happen in public, which makes it easy to see what’s going on and learn from others.</p><p>Also a <em>cool thing</em>, Fedora’s Workstation edition is a dream for developers. Whether you’re into web development, AI, or cybersecurity, it provides a smooth, efficient, and customizable environment. Plus, with its GNOME desktop, everything feels modern and polished.</p><p>I also found the Fedora <strong>DEI</strong> (<strong><em>Diversity, Equity, and Inclusion</em></strong>) team inspiring. It’s great to see a team focused on making sure Fedora is welcoming and accessible to contributors from different backgrounds.</p><h3>What’s Confusing as a Newcomer?</h3><p>Since I started learning about Fedora during the Outreachy application phase, I realized that diving into an open-source project like this can feel overwhelming at first. There’s a lot to explore, different Fedora editions, contributor roles, and community processes and it’s not always clear where to start. But thanks to Fedora’s rich documentation and friendly community, finding answers is easier than expected.</p><h3>Advice for Future Outreachy Applicants</h3><p>If you’re applying for Outreachy in 2026 (or even sooner), here’s my advice: <strong>get involved early, be consistent, don’t feel intimidated, be curious, join conversations and explore different areas. Fedora</strong> is a community-driven project, and the more you engage, whether through coding, documentation, design, or community initiatives — the more you’ll understand its culture and purpose. Don’t be afraid to ask questions; the <strong>Fedora </strong>community is incredibly supportive.</p><h3>Final Thoughts</h3><p><strong>Fedora</strong> isn’t just an operating system, it’s a <em>movement</em>. It’s about collaboration, innovation, and building something greater than the sum of its parts. If you’re looking for an <em>open-source</em> project where you can learn, contribute, and grow, <strong>Fedora</strong> is an amazing place to start.</p><p>And who knows? Maybe a year from now, you’ll be writing your own blog post, reflecting on your journey with<strong> Fedora</strong> just like I’m doing now.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d6917e28ee59" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>