<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fave😌✨</title>
    <description>The latest articles on DEV Community by Fave😌✨ (@onlyfave).</description>
    <link>https://dev.to/onlyfave</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2460000%2F51fbde02-dd09-466f-af53-c40f461f4259.png</url>
      <title>DEV Community: Fave😌✨</title>
      <link>https://dev.to/onlyfave</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/onlyfave"/>
    <language>en</language>
    <item>
      <title>GitPeek: Turning GitHub Data into Stories with Mux🔥🔥🎬</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Sun, 04 Jan 2026 22:31:35 +0000</pubDate>
      <link>https://dev.to/onlyfave/gitpeek-turning-github-data-into-stories-with-mux-1ij2</link>
      <guid>https://dev.to/onlyfave/gitpeek-turning-github-data-into-stories-with-mux-1ij2</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux-2025-12-03"&gt;DEV's Worldwide Show and Tell Challenge Presented by Mux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built🚀
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://git-peek.netlify.app" rel="noopener noreferrer"&gt;&lt;strong&gt;GitPeek&lt;/strong&gt;&lt;/a&gt;, a modern and expressive GitHub profile explorer that turns a developer’s GitHub data into a readable, story-like profile.&lt;/p&gt;

&lt;p&gt;Instead of just listing numbers, GitPeek focuses on &lt;strong&gt;clarity, context, and personality&lt;/strong&gt;, helping users quickly understand &lt;em&gt;who a particular developer is&lt;/em&gt;, &lt;em&gt;how they work&lt;/em&gt;, and &lt;em&gt;what their GitHub activity says about them&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It fetches real-time data from the GitHub API and presents it in a clean, animated interface designed for both developers and non-technical viewers.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Pitch Video✨
&lt;/h2&gt;

&lt;p&gt;

&lt;iframe src="https://player.mux.com/lWxvtHiDh6hS5smkQYEyAAqea8xBnRvAJs6yoj4wzl8" width="710" height="399"&gt;
&lt;/iframe&gt;



&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo🌍
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://git-peek.netlify.app" rel="noopener noreferrer"&gt;GitPeek&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7suit30hkbrv2lm3muxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7suit30hkbrv2lm3muxd.png" alt="GitPeek homepage, dark mode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0r4m29ok9lagjtydtgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0r4m29ok9lagjtydtgj.png" alt="details, darkmode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qez09nz36aym9vhjby8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qez09nz36aym9vhjby8.png" alt="GitPeek homepage, light mode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a4trovsjoqyye25clif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a4trovsjoqyye25clif.png" alt="details, lightmode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Source Code:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/onlyfave" rel="noopener noreferrer"&gt;
        onlyfave
      &lt;/a&gt; / &lt;a href="https://github.com/onlyfave/GitPeek" rel="noopener noreferrer"&gt;
        GitPeek
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc2645d1c9d7d66512dc6f92d019572c87d2a5b2c33a566e0f87906f66092bbd/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f37737569743330686b627276326c6d336d7578642e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/bc2645d1c9d7d66512dc6f92d019572c87d2a5b2c33a566e0f87906f66092bbd/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f37737569743330686b627276326c6d336d7578642e706e67" alt="GitPeek homepage"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🧭 GitPeek — Read Your GitHub Story&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/656eba0f097b3a6b16b6dceffd8d7f3a85d44d20859ab8a028a2b00b8f85d53c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31382e302b2d626c75653f6c6f676f3d7265616374"&gt;&lt;img src="https://camo.githubusercontent.com/656eba0f097b3a6b16b6dceffd8d7f3a85d44d20859ab8a028a2b00b8f85d53c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31382e302b2d626c75653f6c6f676f3d7265616374" alt="React"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ca020f7e107b218fc9fee78cf4a01ab030a943e42a81777476c81345e96f3229/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e644353532d332e302b2d3338423241433f6c6f676f3d7461696c77696e642d637373"&gt;&lt;img src="https://camo.githubusercontent.com/ca020f7e107b218fc9fee78cf4a01ab030a943e42a81777476c81345e96f3229/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e644353532d332e302b2d3338423241433f6c6f676f3d7461696c77696e642d637373" alt="Tailwind CSS"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f9b80728c162a7da6f68932f9104522f684e0bbf638c2a6136f3a3dcbcb8680b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4672616d65725f4d6f74696f6e2d456e61626c65642d6666363962343f6c6f676f3d6672616d6572"&gt;&lt;img src="https://camo.githubusercontent.com/f9b80728c162a7da6f68932f9104522f684e0bbf638c2a6136f3a3dcbcb8680b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4672616d65725f4d6f74696f6e2d456e61626c65642d6666363962343f6c6f676f3d6672616d6572" alt="Framer Motion"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitPeek&lt;/strong&gt; is a web application that goes beyond searching GitHub profiles.&lt;br&gt;
It interprets public GitHub data to help you understand &lt;strong&gt;how a developer works&lt;/strong&gt;, not just what they’ve built.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://git-peek.netlify.app" rel="nofollow noopener noreferrer"&gt;https://git-peek.netlify.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📦 &lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/your-username/gitpeek" rel="noopener noreferrer"&gt;https://github.com/your-username/gitpeek&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📌 Why GitPeek Exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;GitHub profiles are powerful, but can be noisy.&lt;/p&gt;
&lt;p&gt;Recruiters, collaborators, and even developers themselves often struggle to quickly understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What kind of developer is this?&lt;/li&gt;
&lt;li&gt;Are they consistent or experimental?&lt;/li&gt;
&lt;li&gt;Do they maintain projects or start many and abandon them?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GitPeek was built to answer those questions clearly and visually&lt;/strong&gt;, using public GitHub data and a clean, focused interface.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ What GitPeek Does&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;GitPeek fetches public GitHub data and presents it in a way that is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy to scan&lt;/li&gt;
&lt;li&gt;Insight-focused&lt;/li&gt;
&lt;li&gt;Human-readable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of dumping raw data, GitPeek emphasizes &lt;strong&gt;patterns, behavior, and trends&lt;/strong&gt;.&lt;/p&gt;

&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/120392002/531323160-ef6a3b35-c163-4a75-8375-6970e572e785.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDIwMTcsIm5iZiI6MTc3NDY0MTcxNywicGF0aCI6Ii8xMjAzOTIwMDIvNTMxMzIzMTYwLWVmNmEzYjM1LWMxNjMtNGE3NS04Mzc1LTY5NzBlNTcyZTc4NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMDAxNTdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02MzE2YjYyMzc1ODk5MDk4Njc0MTUwZDZhMWYxMmUzOWI3NGQ5Y2MyZjVmYTBiOTYzYWU1OGU3NjllYTBhN2U4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.WG2pRv2hPLVWdTHwgtN5ocVwxnNy0qMc5MiukXzg49I"&gt;&lt;img width="1891" height="974" alt="Screenshot 2026-01-01 110511" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F120392002%2F531323160-ef6a3b35-c163-4a75-8375-6970e572e785.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDIwMTcsIm5iZiI6MTc3NDY0MTcxNywicGF0aCI6Ii8xMjAzOTIwMDIvNTMxMzIzMTYwLWVmNmEzYjM1LWMxNjMtNGE3NS04Mzc1LTY5NzBlNTcyZTc4NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMDAxNTdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02MzE2YjYyMzc1ODk5MDk4Njc0MTUwZDZhMWYxMmUzOWI3NGQ5Y2MyZjVmYTBiOTYzYWU1OGU3NjllYTBhN2U4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.WG2pRv2hPLVWdTHwgtN5ocVwxnNy0qMc5MiukXzg49I"&gt;&lt;/a&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Core Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🔍 &lt;strong&gt;Instant GitHub User&lt;/strong&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/onlyfave/GitPeek" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;h2&gt;
  
  
  Key Features of GitPeek✨
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.GitPeek summarizes a developer’s GitHub identity, not just their repositories.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;2.It translates GitHub data into plain-language insights.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;3.GitPeek focuses on how a developer works, not just what they built.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;4.It provides a visual, story-like profile.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;5.GitPeek uses real-time GitHub API data.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;6.It’s built for multiple audiences, not just developers.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;7.No sign-in required.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You can analyze any public GitHub profile instantly.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;How users can test it (no signup or login  required):&lt;/strong&gt;🎯
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Open the link, enter any GitHub username in the search bar&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. View real-time profile and repository data&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3. Observe UI responsiveness, animations, and error handling (you get an error when you type an invalid username)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No authentication or test credentials needed.&lt;/strong&gt;🔒&lt;/p&gt;


&lt;h2&gt;
  
  
  The Story Behind It 📖
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;br&gt;
GitHub profiles are like digital fingerprints for developers. They're unique, revealing, and surprisingly personal. Yet, for all their value, they’re often misunderstood or overlooked.&lt;/p&gt;

&lt;p&gt;Every profile is filled with signals: commit patterns, repository choices, favorite languages, project consistency, and long gaps or bursts of activity. To an experienced engineer, these patterns tell a story. To everyone else, they often look confusing.&lt;/p&gt;

&lt;p&gt;Recruiters scroll.&lt;br&gt;
Founders skim.&lt;br&gt;
Beginners feel intimidated.&lt;/p&gt;

&lt;p&gt;Important context gets lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;br&gt;
I built &lt;strong&gt;GitPeek&lt;/strong&gt; to answer a question I kept running into again and again:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What does this developer’s GitHub actually say about them?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not just &lt;em&gt;what tools they’ve used&lt;/em&gt; or &lt;em&gt;how many repositories they have&lt;/em&gt;, but how they work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are they consistent or experimental?&lt;/li&gt;
&lt;li&gt;Do they ship often?&lt;/li&gt;
&lt;li&gt;Do they explore, abandon, return?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitPeek doesn’t try to replace GitHub. Instead, it acts like a translator, taking raw GitHub data and reshaping it into something more readable, more human, and easier to understand at a glance.&lt;/p&gt;

&lt;p&gt;The goal was clarity, not complexity.&lt;/p&gt;

&lt;p&gt;By focusing on layout, hierarchy, and subtle motion, GitPeek helps viewers move from raw data to insight, turning commits and repositories into a coherent snapshot of a developer’s habits, growth, and mindset.&lt;/p&gt;

&lt;p&gt;GitPeek exists because code tells a story.&lt;br&gt;
Sometimes, it just needs help being read.&lt;/p&gt;


&lt;h2&gt;
  
  
  Technical Highlights✅
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend architecture:&lt;/strong&gt; React (Vite) with a modular, component-based design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme support:&lt;/strong&gt; Built-in light and dark modes that adapt seamlessly to user preferences while preserving contrast, readability, and visual clarity 🌗&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API integration:&lt;/strong&gt; Real-time data powered by the GitHub REST API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI/UX execution:&lt;/strong&gt; Tailwind CSS delivering a clean, consistent visual system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motion design:&lt;/strong&gt; Subtle Framer Motion animations used intentionally to guide user attention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling:&lt;/strong&gt; Graceful handling of invalid usernames, empty states, and GitHub API rate limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsiveness:&lt;/strong&gt; Fully optimized for both desktop and mobile experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core challenge was not fetching data, but &lt;strong&gt;deciding how to present it clearly and meaningfully&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Use of Mux (Additional Prize Category Participants Only)
&lt;/h3&gt;

&lt;p&gt;Mux is used in GitPeek for multiple purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Demo Video Hosting &amp;amp; Playback:&lt;/strong&gt; The GitPeek pitch/demo video is uploaded as a Mux asset, processed for adaptive streaming, and embedded directly into the Dev.to post using the Mux playback URL. This ensures high-quality video delivery across devices without self-hosting or performance overhead. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk1ibqz54iq8pvkd3ymp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk1ibqz54iq8pvkd3ymp.png" alt="Mux upload"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Cover Media Creation:&lt;/strong&gt; Mux was used to generate the article’s cover video, adding a visually engaging, animated preview for readers.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GIF Generation from Video:&lt;/strong&gt; The cover video produced with Mux was also converted into a GIF, which is embedded as an interactive visual element, enhancing storytelling and drawing attention to the article.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://image.mux.com/lWxvtHiDh6hS5smkQYEyAAqea8xBnRvAJs6yoj4wzl8/animated.gif?width=320" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;image.mux.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;







&lt;p&gt;Thank you for reviewing &lt;strong&gt;GitPeek&lt;/strong&gt;✨.&lt;/p&gt;

&lt;p&gt;❗ By submitting this project, I confirm that my video adheres to Mux's terms of service: &lt;a href="https://www.mux.com/terms" rel="noopener noreferrer"&gt;https://www.mux.com/terms&lt;/a&gt; &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>🚀🧠Why Write 50 Scholarship Essays? I Let RunnerH Do It With One Prompt.🤯🔥🔥🔥🔥</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Sun, 06 Jul 2025 21:33:42 +0000</pubDate>
      <link>https://dev.to/onlyfave/why-write-50-scholarship-essays-i-let-runnerh-do-it-with-one-prompt-87i</link>
      <guid>https://dev.to/onlyfave/why-write-50-scholarship-essays-i-let-runnerh-do-it-with-one-prompt-87i</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/runnerh"&gt;Runner H "AI Agent Prompting" Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 No More Essays. AI Hacked It.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Runner H Dev Challenge Submission by CloudFave&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📌What I Built
&lt;/h2&gt;

&lt;p&gt;Scholarships can be life-changing. But the essay workload? Overwhelming. This project shows how AI can level the playing field, saving time, energy, and mental stress while still keeping quality high.&lt;/p&gt;

&lt;p&gt;If you've ever hunted for scholarships, you know the pain.&lt;/p&gt;

&lt;p&gt;Hours of Googling. Dozens of open tabs. Rewriting the same essay 20 different ways.&lt;br&gt;
By the end, you're exhausted... and you've only applied to two. 😩&lt;/p&gt;

&lt;p&gt;I got tired of that life. So I built something better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An AI-powered system that removes the hardest part of scholarship hunting: the essays. Runner H now finds eligible scholarships every week, organizes them, and drafts compelling essays for each—based on my personal statement.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ✨ Highlights
&lt;/h3&gt;

&lt;p&gt;⚡ &lt;strong&gt;50 unique essays, 1 prompt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Hyper-targeted to each scholarship&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📂 &lt;strong&gt;Organized and ready for submission&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧘 &lt;strong&gt;Zero burnout, all brains&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me show you how it works 👇&lt;/p&gt;


&lt;h2&gt;
  
  
  ✨Demo
&lt;/h2&gt;

&lt;p&gt;🌀 Watch &lt;strong&gt;&lt;a href="https://runner.hcompany.ai" rel="noopener noreferrer"&gt;Runner H&lt;/a&gt;&lt;/strong&gt; in action — the entire scholarship flow, live and unfiltered.🔥&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/MWwkc8nJqrs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50m6p9zogsb3ppl0lxvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50m6p9zogsb3ppl0lxvc.png" alt="screenshot" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felv1zvru2y8iwwkppw3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felv1zvru2y8iwwkppw3x.png" alt="screenshot" width="675" height="600"&gt;&lt;/a&gt;&lt;br&gt;
AI bot finding scholarships, writing essays, and updating my sheet like a boss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukt2mel24mbiaa8oxg46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukt2mel24mbiaa8oxg46.png" alt="Screenshot" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀🔥💻How I Used Runner H
&lt;/h2&gt;

&lt;p&gt;I created a prompt that turns GPT into a weekly scholarship-hunting, essay-drafting, form-filling autopilot assistant. Here’s how the flow goes:&lt;/p&gt;
&lt;h3&gt;
  
  
  🧠 Prompt (Core Instruction)
&lt;/h3&gt;

&lt;p&gt;✨ &lt;strong&gt;Prompt Template: Autonomous Scholarship Application Agent&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;(Built in Runner H format – step-by-step, human-in-the-loop, unstoppable.)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**You are my Autonomous Scholarship Assistant.**  
Your mission is to find, prepare, and organize weekly scholarship applications I’m eligible for, never proceeding without my explicit approval at each stage.

Here’s the workflow you must follow every week unless told otherwise:

🛠 1. Profile Setup (first run only):
- Ask for my email address (where you'll send drafts and summaries).
- Ask me to confirm or provide:
  - Nationality
  - Current level of study
  - Field of study
  - Gender (if relevant)
  - Academic or career interests
- Ask me to upload or paste my CV/personal statement.
- Confirm if I want to use this profile + CV for all future drafts.

🔍 2. Weekly Scholarship Search:
- Every Monday, search verified portals like OpportunityDesk, Scholars4Dev, and DAAD.
- Filter based on my profile to find eligible scholarships.
- Collect for each:
  - Name
  - Deadline
  - Eligibility
  - Essay requirement
  - Link to apply
- Present the top results (max 10 per week).
- Ask me to pick which ones you'd like to generate essays for.
- Do nothing else until I respond.

✍️ 3. Essay Drafting (for selected scholarships):
- For each approved one, generate a unique essay based on the prompt and my CV.
- Provide:
  - Scholarship name
  - Essay prompt
  - Word count
  - Drafted essay
  - Deadline
  - Link to apply
- Bundle all drafts into a clear weekly report or Google Doc.
- Ask if I’d like revisions or formatting help.

📬 4. Weekly Summary &amp;amp; Report:
- Create a Google Sheet tracker with:
  - Scholarship
  - Deadline
  - Status (Drafted / Pending / Skipped)
  - Notes column
- Send the tracker + all essays to my email.
- Ask: “All done for this week. Reply ‘Continue’ to start again next Monday or ‘Pause’ to take a break.”

🔁 5. Loop Rules:
- Wait for explicit "Continue" before restarting the next weekly search.
- If I reply "Pause", skip the next cycle.
- If I say "Reset", collect a new profile and CV.
- If I say "Archive", zip all past work and send the full archive.

🚫 Never apply to scholarships for me.
🚫 Never submit any forms.
✅ Always ask before moving forward.

Let me know when you're ready to begin.

🧠 **Built for busy students. Powered by AI. Focused on opportunity.**  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💥Use Case &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;This wasn’t just AI flexing,it was about smart delegation. Runner H made me rethink productivity: why do it all yourself when you can strategize and supervise?&lt;/p&gt;

&lt;p&gt;🏁 This is for every student who:&lt;/p&gt;

&lt;p&gt;Struggles to keep up with scholarship deadlines&lt;/p&gt;

&lt;p&gt;Feels overwhelmed writing essays from scratch&lt;/p&gt;

&lt;p&gt;Doesn’t know where to start&lt;/p&gt;

&lt;p&gt;This agent doesn’t just make life easier—it creates a repeatable, scalable system that can help students across Africa, Asia, LATAM, and anywhere funding is hard to come by.&lt;/p&gt;

&lt;p&gt;It's a little bit of AI, a little bit of hustle, and a whole lot of peace of mind.&lt;/p&gt;




&lt;h3&gt;
  
  
  ❤️Social Love
&lt;/h3&gt;

&lt;p&gt;Posted it on X, LinkedIn, and my dev circles. Let’s help every student find their bag. 🎓💸&lt;/p&gt;

&lt;p&gt;🍒&lt;strong&gt;X Post&lt;/strong&gt;:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1941984422640697805-680" src="https://platform.twitter.com/embed/Tweet.html?id=1941984422640697805"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1941984422640697805-680');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1941984422640697805&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Call to Action:
&lt;/h3&gt;

&lt;p&gt;Runner H just hacked the most stressful part of student life.&lt;br&gt;
Try this flow, remix it for your own use case, and tag me when you win that bag 🤑&lt;/p&gt;

&lt;p&gt;Thanks for reading and thanks to Runner H for the dope prompt challenge! 💖&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>runnerhchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>What Exactly Is Cloud Engineering?</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Wed, 04 Jun 2025 11:37:35 +0000</pubDate>
      <link>https://dev.to/onlyfave/what-exactly-is-cloud-engineering-35h4</link>
      <guid>https://dev.to/onlyfave/what-exactly-is-cloud-engineering-35h4</guid>
      <description>&lt;h2&gt;
  
  
  📢 Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever been at a social gathering and introduced yourself as a cloud engineer, or answered the classic question, &lt;em&gt;"What do you do?"&lt;/em&gt;, only to be met with puzzled looks and the inevitable follow-up:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;"What do cloud engineers actually do?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You're not alone. Many people are curious about &lt;em&gt;the cloud&lt;/em&gt; and what cloud engineers really do.&lt;/p&gt;

&lt;p&gt;In simple terms, cloud computing is like renting a super-powerful computer over the internet. Instead of owning and maintaining physical hardware, businesses use resources provided by cloud providers like AWS, Azure, or Google Cloud.&lt;br&gt;&lt;br&gt;
But what does a &lt;strong&gt;cloud engineer&lt;/strong&gt; do in this vast digital world? Let’s break it down step by step.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌥️ What Is Cloud Computing?
&lt;/h2&gt;

&lt;p&gt;Cloud computing is the &lt;strong&gt;on-demand delivery of IT resources over the internet&lt;/strong&gt; with &lt;strong&gt;pay-as-you-go pricing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it like electricity or water, you don’t need to build a power plant or water system to use them. Similarly, cloud computing lets you access computing power, storage, and tools over the internet, without owning or managing the physical machines yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41pg55q9vik4x1c7ihsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41pg55q9vik4x1c7ihsr.png" alt="What is cloud computing?" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Six Benefits of Cloud Computing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;No need to run and maintain data centers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data centers require time, money, and manpower. Cloud computing removes that burden so you can focus more on your applications and customers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Increased speed and agility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In traditional setups, it can take weeks to get new resources. With the cloud, you can spin up resources in &lt;strong&gt;minutes&lt;/strong&gt;, perfect for experimenting and innovating.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Go global in minutes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can instantly deploy your apps to servers around the world. This means customers everywhere can access your product with minimal latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Trade upfront expenses for variable costs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of investing heavily in servers and infrastructure, you &lt;strong&gt;only pay for what you use&lt;/strong&gt;, making cloud adoption more cost-efficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Stop guessing capacity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No more estimating hardware needs in advance. With cloud scalability, you can adjust resources based on real-time demand.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Benefit from massive economies of scale&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cloud providers serve millions of customers, allowing them to reduce costs and pass those savings on to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpkb0xfry6jn9dc0u4tje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpkb0xfry6jn9dc0u4tje.png" alt="Benefits of cloud computing" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Deploying to the Cloud
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cloud Computing Models
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ☁️ Infrastructure as a Service (IaaS)
&lt;/h4&gt;

&lt;p&gt;Provides the fundamental building blocks like networking, virtual machines, and storage. You manage most of it yourself, giving you the highest control and flexibility.&lt;/p&gt;

&lt;h4&gt;
  
  
  🛠️ Platform as a Service (PaaS)
&lt;/h4&gt;

&lt;p&gt;Removes the hassle of managing the underlying infrastructure. Developers can focus on building applications without worrying about maintenance, patching, or scaling.&lt;/p&gt;

&lt;h4&gt;
  
  
  📦 Software as a Service (SaaS)
&lt;/h4&gt;

&lt;p&gt;A complete, ready-to-use software solution managed entirely by the provider. You just use the software, like Gmail, Zoom, or Google Docs, without thinking about how it runs behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgfnd5q1937oezuutfkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgfnd5q1937oezuutfkm.png" alt="cloud models" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Responsibilities of a Cloud Engineer
&lt;/h2&gt;

&lt;p&gt;Cloud engineers build, manage, and support cloud-based systems and services. Here's what they typically do:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Cloud Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design secure, scalable, and reliable cloud solutions tailored to business needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Deployment &amp;amp; Automation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Automate infrastructure with tools like &lt;strong&gt;Terraform&lt;/strong&gt;, &lt;strong&gt;AWS CloudFormation&lt;/strong&gt;, or &lt;strong&gt;Ansible&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Monitoring &amp;amp; Optimization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use tools like &lt;strong&gt;CloudWatch&lt;/strong&gt;, &lt;strong&gt;Datadog&lt;/strong&gt;, or &lt;strong&gt;GCP Operations Suite&lt;/strong&gt; to monitor system health and control costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Security &amp;amp; Compliance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Implement best practices to secure systems and ensure compliance with standards like &lt;strong&gt;GDPR&lt;/strong&gt;, &lt;strong&gt;HIPAA&lt;/strong&gt;, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Team Collaboration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Work closely with &lt;strong&gt;developers&lt;/strong&gt;, &lt;strong&gt;DevOps&lt;/strong&gt;, and &lt;strong&gt;product teams&lt;/strong&gt; to ensure seamless deployments and faster releases.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Want to Learn More About Cloud Computing?
&lt;/h2&gt;

&lt;p&gt;Here are some great resources to explore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🌐 &lt;a href="https://aws.amazon.com/education/awseducate/" rel="noopener noreferrer"&gt;AWS Educate – Cloud 101&lt;/a&gt; &lt;em&gt;(Free)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;☁️ &lt;a href="https://www.cloudskillsboost.google" rel="noopener noreferrer"&gt;Google Cloud Skills Boost – Cloud Digital Leader&lt;/a&gt; &lt;em&gt;(Free)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://learn.microsoft.com/en-us/training/paths/azure-fundamentals/" rel="noopener noreferrer"&gt;Microsoft Learn – Azure Fundamentals&lt;/a&gt; &lt;em&gt;(Free)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;💡 &lt;a href="https://www.youtube.com/watch?v=2LaAJq1lB1Q" rel="noopener noreferrer"&gt;FreeCodeCamp – Full Cloud Computing Course (YouTube)&lt;/a&gt; &lt;em&gt;(Free)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;📗 &lt;a href="https://www.amazon.com/dp/0133387526" rel="noopener noreferrer"&gt;"Cloud Computing: Concepts, Technology &amp;amp; Architecture" by Thomas Erl&lt;/a&gt; &lt;em&gt;(Paid)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://www.coursera.org/learn/introduction-to-cloud" rel="noopener noreferrer"&gt;Coursera – "Introduction to Cloud Computing" by IBM&lt;/a&gt; &lt;em&gt;(Free with audit option)&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🤝 Conclusion
&lt;/h2&gt;

&lt;p&gt;Cloud engineers are the &lt;strong&gt;builders&lt;/strong&gt;, &lt;strong&gt;guardians&lt;/strong&gt;, and &lt;strong&gt;maintainers&lt;/strong&gt; of the cloud. From designing infrastructure to monitoring performance, they ensure everything runs smoothly.&lt;/p&gt;

&lt;p&gt;So, the next time someone asks,&lt;br&gt;&lt;br&gt;
&lt;em&gt;“What do cloud engineers do?”&lt;/em&gt;,&lt;br&gt;&lt;br&gt;
you can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“We help the world run on the cloud — one scalable, secure, and seamless system at a time.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🙏 Thanks for reading! If you found this helpful, feel free to connect or drop a comment on &lt;a href="https://www.linkedin.com/in/favour-onyeneke-2b2881297/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://x.com/only_fave" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>beginners</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>IaC in Action: Deploying a Static Site with Pulumi, AWS &amp; Cloudflare</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Sun, 06 Apr 2025 22:02:06 +0000</pubDate>
      <link>https://dev.to/onlyfave/iac-in-action-deploying-a-static-site-with-pulumi-aws-cloudflare-29cj</link>
      <guid>https://dev.to/onlyfave/iac-in-action-deploying-a-static-site-with-pulumi-aws-cloudflare-29cj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/pulumi"&gt;Pulumi Deploy and Document Challenge&lt;/a&gt;: Fast Static Website Deployment&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀What I Built
&lt;/h2&gt;

&lt;p&gt;This project showcases how to deploy a static website from scratch using Pulumi with Python, Amazon S3 for website hosting, and Cloudflare for DNS and CDN.&lt;br&gt;
The website, hosted at &lt;a href="https://one-million.tech" rel="noopener noreferrer"&gt;one-million.tech&lt;/a&gt;, was fully provisioned using infrastructure as code (IaC), enabling repeatable, automated, and version-controlled deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗Live Demo Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://one-million.tech" rel="noopener noreferrer"&gt;one-million.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgj1hz1gi90spdv3dck2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgj1hz1gi90spdv3dck2.png" alt="website screenshot" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm15fx2h2h0lk9etume1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm15fx2h2h0lk9etume1u.png" alt="website screenshot" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦Project Repo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/onlyfave/Pulumi-deploy-static" rel="noopener noreferrer"&gt;https://github.com/onlyfave/Pulumi-deploy-static&lt;/a&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be sure to check out the &lt;a href="https://github.com/your-username/static-site-pulumi/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; for a full step-by-step guide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ✍️ My Journey
&lt;/h2&gt;

&lt;p&gt;I started this project with one primary goal in mind: to gain hands-on experience deploying infrastructure using Pulumi with Python, and to go beyond clicking buttons in the AWS console. I’d worked with static sites before, but this time, I wanted a clean, repeatable, automated way to manage the full lifecycle of a site, from code to cloud, using Infrastructure as Code (IaC).&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ The Initial Setup
&lt;/h3&gt;

&lt;p&gt;I chose Pulumi because it lets me write infrastructure in Python(my language of choice). I created a new Pulumi project and began scaffolding the resources needed for hosting a static site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An S3 bucket with static site configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Public access policies (but with care, to keep things secure)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uploading local site files to S3 using Pulumi’s FileAsset&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS setup using Cloudflare to point my custom domain &lt;a href="https://one-million.tech" rel="noopener noreferrer"&gt;one-million.tech&lt;/a&gt; to the S3-hosted site&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;That was the plan. Simple on paper. But cloud deployments are never as smooth as you'd think at first glance 😅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I shared every challenge I encountered, from S3 bucket errors to DNS propagation pain, and how I resolved them. It’s packed with lessons, code snippets, and real dev struggles.&lt;br&gt;
📖 &lt;a href="https://dev.to/onlyfave/how-i-tamed-the-cloud-troubleshooting-my-s3-cloudflare-pulumi-static-site-5fjc"&gt;&lt;strong&gt;How I Tamed the Cloud&lt;/strong&gt; — Troubleshooting My S3, Cloudflare &amp;amp; Pulumi Static Site&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Using Pulumi
&lt;/h2&gt;

&lt;p&gt;Pulumi was the backbone of this project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I used the &lt;strong&gt;Python SDK&lt;/strong&gt; to define and provision an S3 bucket configured for static site hosting.&lt;/li&gt;
&lt;li&gt;I added &lt;strong&gt;Cloudflare DNS configuration&lt;/strong&gt; via Pulumi to route my custom domain (&lt;code&gt;one-million.tech&lt;/code&gt;) to the S3 endpoint.&lt;/li&gt;
&lt;li&gt;I uploaded static HTML files with correct types using Pulumi’s &lt;code&gt;FileAsset&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I stored secrets and configs securely with &lt;code&gt;pulumi config&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Pulumi?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IaC with a real language (Python💻)&lt;/li&gt;
&lt;li&gt;No manual setup or clicking through AWS/Cloudflare dashboards&lt;/li&gt;
&lt;li&gt;Version control + fast re-deployment&lt;/li&gt;
&lt;li&gt;Seamless integration of multiple cloud providers&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>pulumichallenge</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>💡How I Tamed the Cloud: Troubleshooting My S3 + Cloudflare + Pulumi Static Site</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Fri, 04 Apr 2025 21:37:26 +0000</pubDate>
      <link>https://dev.to/onlyfave/how-i-tamed-the-cloud-troubleshooting-my-s3-cloudflare-pulumi-static-site-5fjc</link>
      <guid>https://dev.to/onlyfave/how-i-tamed-the-cloud-troubleshooting-my-s3-cloudflare-pulumi-static-site-5fjc</guid>
      <description>&lt;h2&gt;
  
  
  Troubleshooting My Static Website Deployment with S3, Cloudflare &amp;amp; Pulumi
&lt;/h2&gt;

&lt;p&gt;Deploying a static website may seem simple at first glance, but behind the scenes lies a minefield of configuration details and cloud service quirks.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through the key challenges I faced while deploying &lt;a href="https://one-million.tech" rel="noopener noreferrer"&gt;one-million.tech&lt;/a&gt; using &lt;strong&gt;Amazon S3&lt;/strong&gt;, &lt;strong&gt;Cloudflare&lt;/strong&gt;, and &lt;strong&gt;Pulumi&lt;/strong&gt; and how I resolved each issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Goal
&lt;/h2&gt;

&lt;p&gt;Build and deploy a static website to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host files on &lt;a href="https://aws.amazon.com/pm/serv-s3/?trk=c8974be7-bc21-436d-8108-722e8ab912e1&amp;amp;sc_channel=ps&amp;amp;ef_id=Cj0KCQjwhr6_BhD4ARIsAH1YdjBSZOd6lWNpKEBf0awWzi8PyAqvTxxdEUF1dSMdeZZTspjs_D0I8roaAn7NEALw_wcB:G:s&amp;amp;s_kwcid=AL!4422!3!645125273960!p!!g!!aws%20s3!19574556914!145779856272&amp;amp;gclid=Cj0KCQjwhr6_BhD4ARIsAH1YdjBSZOd6lWNpKEBf0awWzi8PyAqvTxxdEUF1dSMdeZZTspjs_D0I8roaAn7NEALw_wcB" rel="noopener noreferrer"&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://www.cloudflare.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt; for DNS + HTTPS&lt;/li&gt;
&lt;li&gt;Automate infrastructure setup using &lt;a href="https://www.pulumi.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Pulumi&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚧 Common Pitfalls I Encountered (And Fixed)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;S3 Endpoint URL Error&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: While connecting my domain name to the S3 bucket, I received this error:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Not a valid S3 website endpoint"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;: I used the full URL instead of just the &lt;strong&gt;region endpoint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Use the correct format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3-website-us-east-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid including the full bucket path or &lt;code&gt;http://&lt;/code&gt; prefix.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;DNS Record Already Exists&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A record with the specified name already exists"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;: I attempted to create a new &lt;code&gt;A&lt;/code&gt; record in Cloudflare while one already existed for &lt;code&gt;@&lt;/code&gt; (root domain).&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;DNS&lt;/strong&gt; tab in Cloudflare.&lt;/li&gt;
&lt;li&gt;Edit the existing record instead of creating a new one.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Pulumi Bucket Conflicts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;:&lt;br&gt;
I wasn’t sure whether to delete an existing bucket used by Pulumi.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-checked that the bucket wasn’t associated with any critical data.&lt;/li&gt;
&lt;li&gt;Deleted the unused &lt;code&gt;pulumi-deploy-bucket&lt;/code&gt; and redeployed with a new Pulumi configuration.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;404 Not Found Error on My Domain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;:&lt;br&gt;
Once the nginx page disappeared, the domain showed a 404 error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;: S3 bucket wasn’t properly configured for &lt;strong&gt;static website hosting&lt;/strong&gt; and &lt;code&gt;index.html&lt;/code&gt; was missing.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enabled "Static website hosting" in the bucket settings.&lt;/li&gt;
&lt;li&gt;Uploaded &lt;code&gt;index.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Specified &lt;code&gt;index.html&lt;/code&gt; as the default root document.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Edits to index.html are Not Reflecting on the live site&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;:&lt;br&gt;
My changes to &lt;code&gt;index.html&lt;/code&gt; were not showing up on the live site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;: Cloudflare cached the old version of the site.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploaded updated &lt;code&gt;index.html&lt;/code&gt; to S3.&lt;/li&gt;
&lt;li&gt;Went to &lt;strong&gt;Cloudflare &amp;gt; Caching &amp;gt; Purge Everything&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  8. &lt;strong&gt;Secrets Detected in GitHub Commits&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;:&lt;br&gt;
GitHub flagged my commits:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Secrets detected in recent commits"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ &lt;strong&gt;Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added sensitive files like &lt;code&gt;Pulumi.dev.yaml&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;git filter-branch&lt;/code&gt; to remove them from Git history:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git filter-branch &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--index-filter&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"git rm --cached --ignore-unmatch Pulumi.dev.yaml"&lt;/span&gt; &lt;span class="nt"&gt;--prune-empty&lt;/span&gt; &lt;span class="nt"&gt;--tag-name-filter&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzu2j39wvrq0takoynww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzu2j39wvrq0takoynww.png" alt="troubleshooting" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Final Result
&lt;/h2&gt;

&lt;p&gt;After working through these issues, I successfully deployed my static site:&lt;br&gt;
🔗 &lt;a href="https://one-million.tech" rel="noopener noreferrer"&gt;https://one-million.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything is now cached, secure (HTTPS), and fast — thanks to Cloudflare and S3.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always double-check AWS bucket configuration for website hosting.&lt;/li&gt;
&lt;li&gt;Cloudflare DNS takes time — patience is key.&lt;/li&gt;
&lt;li&gt;Pulumi’s automation is powerful but unforgiving with secrets.&lt;/li&gt;
&lt;li&gt;Cache is the usual suspect when updates don’t show.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;Stay tuned for my &lt;a href="https://github.com/onlyfave/Pulumi-deploy-static" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; and portfolio write-up!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you’re planning to deploy your own static site with Pulumi, AWS, and Cloudflare, save this guide. It might just save you a weekend of debugging!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Written by:&lt;/strong&gt; Fave — DevOps &amp;amp; Cloud Engineer&lt;/p&gt;

</description>
      <category>pulumichallenge</category>
      <category>website</category>
      <category>s3</category>
      <category>cloud</category>
    </item>
    <item>
      <title>New to AWS Lambda? Here’s Everything You Need to Know to Get Started!🚀</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Tue, 01 Apr 2025 01:09:58 +0000</pubDate>
      <link>https://dev.to/onlyfave/new-to-aws-lambda-heres-everything-you-need-to-know-to-get-started-e7n</link>
      <guid>https://dev.to/onlyfave/new-to-aws-lambda-heres-everything-you-need-to-know-to-get-started-e7n</guid>
      <description>&lt;h2&gt;
  
  
  AWS Lambda: A Beginner's Guide to Serverless Computing
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Serverless computing is a cloud computing model where developers build and run applications without managing servers. The cloud provider handles infrastructure management, scaling, and billing, allowing developers to focus on coding.&lt;/p&gt;

&lt;p&gt;One of the most popular serverless services is &lt;strong&gt;AWS Lambda&lt;/strong&gt;, provided by &lt;strong&gt;Amazon Web Services (AWS)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Lambda: An Overview
&lt;/h2&gt;

&lt;p&gt;AWS Lambda is a serverless computing service that allows developers to run code &lt;strong&gt;without provisioning or managing servers&lt;/strong&gt;. It is an ideal compute service for applications that need to scale up rapidly and scale down to zero when not in demand.&lt;/p&gt;

&lt;p&gt;This guide explores &lt;strong&gt;AWS Lambda in detail&lt;/strong&gt;, covering its architecture, key features, use cases, pricing, limitations, and how to deploy a simple function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of AWS Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Serverless Compute
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run code &lt;strong&gt;without managing servers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;No need to provision or manage infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Automatic Scaling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lambda &lt;strong&gt;automatically scales&lt;/strong&gt; up or down based on the number of requests.&lt;/li&gt;
&lt;li&gt;Handles &lt;strong&gt;thousands of requests per second&lt;/strong&gt; dynamically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Cost-Effective (Pay-as-You-Go Pricing)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You only pay for the &lt;strong&gt;compute time&lt;/strong&gt; you consume (measured in milliseconds).&lt;/li&gt;
&lt;li&gt;No upfront costs or idle server charges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Multi-Language Support
&lt;/h3&gt;

&lt;p&gt;AWS Lambda supports multiple programming languages, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ruby&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built on &lt;strong&gt;AWS infrastructure&lt;/strong&gt;, ensuring high availability and reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Cases for AWS Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Data Processing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Process &lt;strong&gt;real-time data streams&lt;/strong&gt; from services like &lt;strong&gt;Amazon Kinesis&lt;/strong&gt; or &lt;strong&gt;DynamoDB Streams&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. API Backends
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create and deploy &lt;strong&gt;serverless APIs&lt;/strong&gt; using &lt;strong&gt;AWS Lambda&lt;/strong&gt; with &lt;strong&gt;Amazon API Gateway&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Automation and Task Scheduling
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Automated Backups
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Schedule Lambda functions to perform &lt;strong&gt;automatic backups&lt;/strong&gt; of data and applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cron Jobs
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Execute periodic tasks using &lt;strong&gt;AWS Lambda&lt;/strong&gt;, eliminating the need for dedicated servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. IoT Device Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manage &lt;strong&gt;IoT devices&lt;/strong&gt; and configurations remotely.&lt;/li&gt;
&lt;li&gt;Process real-time &lt;strong&gt;sensor data&lt;/strong&gt; for monitoring and analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Video Encoding
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Process video files using Lambda functions for &lt;strong&gt;format conversion and optimization&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjjx7qez9hs0od3qpudl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjjx7qez9hs0od3qpudl.png" alt="AWS use cases" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started With AWS Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create an AWS Account
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you don’t already have an AWS account, &lt;strong&gt;sign up for a free tier account&lt;/strong&gt; at &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS Console&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Access AWS Lambda
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log in&lt;/strong&gt; to the AWS Management Console.&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Lambda&lt;/strong&gt; in the AWS search bar.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create function&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Create a New Lambda Function
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Choose a Method
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Author from scratch&lt;/strong&gt; → Create a function from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a blueprint&lt;/strong&gt; → AWS provides pre-built templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Configure the Function
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name your function&lt;/strong&gt; (e.g., &lt;code&gt;myFirstLambda&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose a runtime&lt;/strong&gt; (e.g., &lt;strong&gt;Python 3.9&lt;/strong&gt; or &lt;strong&gt;Node.js 18.x&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set an execution role&lt;/strong&gt; (AWS will create a default IAM role for you).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create function&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Write and Deploy Lambda Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write code &lt;strong&gt;directly&lt;/strong&gt; in AWS Console or &lt;strong&gt;upload a ZIP file&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a simple Python example that returns &lt;strong&gt;"Hello, World!"&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Configure a Trigger (Optional)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Add Trigger&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Lambda functions can be triggered by changes in S3 buckets. To learn how to set this up, refer to my article on AWS S3 buckets for step-by-step instructions &lt;a href="https://dev.to/onlyfave/a-comprehensive-guide-to-aws-s3-bucket-26kl"&gt;AWS S3&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6: Deploy and Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Test&lt;/strong&gt; → Choose &lt;strong&gt;Create new test event&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Run the test and check the output.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Challenges of AWS Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Memory and CPU Limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maximum &lt;strong&gt;3 GB&lt;/strong&gt; memory with limited CPU resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Execution Time Limit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Functions can run for a &lt;strong&gt;maximum of 15 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Deployment Package Size
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;250 MB (uncompressed)&lt;/strong&gt; limit for deployment packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Concurrent Execution Limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS enforces limits on the &lt;strong&gt;number of concurrent executions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Limited Logging and Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Debugging is challenging, especially for complex &lt;strong&gt;event-driven architectures&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Stateless Nature
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Lambda functions are &lt;strong&gt;stateless&lt;/strong&gt;, making tracking across multiple executions difficult.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Debugging Difficulty
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional debugging methods&lt;/strong&gt; do not work effectively in a serverless environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;🔹 Try connecting AWS Lambda to &lt;strong&gt;Amazon API Gateway&lt;/strong&gt;.&lt;br&gt;
🔹 Use Lambda with &lt;strong&gt;Amazon S3 triggers&lt;/strong&gt;.&lt;br&gt;
🔹 Deploy Lambda using &lt;strong&gt;AWS SAM&lt;/strong&gt; or &lt;strong&gt;Pulumi&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AWS Lambda &lt;strong&gt;revolutionizes serverless computing&lt;/strong&gt;, allowing developers to build &lt;strong&gt;scalable, cost-effective applications&lt;/strong&gt; without worrying about infrastructure. While it has some limitations, &lt;strong&gt;its flexibility, automatic scaling, and cost savings&lt;/strong&gt; make it an excellent choice for modern cloud applications.&lt;/p&gt;

&lt;p&gt;As &lt;strong&gt;serverless computing&lt;/strong&gt; continues to evolve, &lt;strong&gt;AWS Lambda remains a leading solution&lt;/strong&gt; for event-driven cloud applications.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Found this guide helpful? Share it with your developer community!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>lambda</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Introduction to Ansible: A Beginner's Guide</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Sun, 16 Feb 2025 08:56:33 +0000</pubDate>
      <link>https://dev.to/onlyfave/introduction-to-ansible-a-beginners-guide-1p70</link>
      <guid>https://dev.to/onlyfave/introduction-to-ansible-a-beginners-guide-1p70</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Ansible is an open-source automation tool used for configuration management, application deployment, and task automation. It simplifies IT operations by automating repetitive tasks across multiple systems, ensuring consistency and reducing human errors.&lt;/p&gt;

&lt;p&gt;Ansible was developed by Red Hat and has gained widespread adoption due to its agentless nature and easy-to-use YAML-based playbooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perequisites
&lt;/h2&gt;

&lt;p&gt;To learn Ansible effectively, you should have the following prerequisites:&lt;br&gt;
&lt;strong&gt;1. Basic Linux Knowledge&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. Command Line and Terminal Usage&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3. Networking Basics&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;4. YAML Syntax&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;5. Python Basics (Optional but Useful)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;6. Basics of Configuration Management &amp;amp; Automation&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;7. Version Control (Git)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;8. Cloud and Virtualization Concepts (Optional)&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Use Ansible?
&lt;/h2&gt;

&lt;p&gt;Ansible offers several benefits that make it a preferred choice for automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agentless Architecture&lt;/strong&gt;: Unlike other configuration management tools like Puppet or Chef, Ansible does not require agents on managed nodes. It connects using SSH or WinRM, reducing overhead and security risks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple and Human-Readable&lt;/strong&gt;: Ansible uses YAML for its configuration files, making it easy to understand and write. Even those with minimal coding experience can use it effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotency&lt;/strong&gt;: Ansible ensures that tasks are only executed when necessary, preventing unintended changes. If a task is already applied, Ansible skips it, ensuring stability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: It can manage thousands of systems efficiently with minimal resource overhead, making it ideal for large-scale IT environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Support&lt;/strong&gt;: Ansible supports Linux, macOS, Windows, and cloud environments like AWS, Azure, and Google Cloud. It can also manage network devices and containers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: With Ansible Galaxy, users can access a vast collection of pre-built roles and modules, enabling faster implementation of automation tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security and Compliance&lt;/strong&gt;: Ansible allows enforcing security policies by automating compliance configurations and auditing system states.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How Ansible Works
&lt;/h2&gt;

&lt;p&gt;Ansible operates by executing tasks on remote systems using a set of predefined instructions known as playbooks. Below is an overview of how Ansible works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory&lt;/strong&gt;: A list of managed nodes (hosts) defined in an inventory file. The inventory file can be static or dynamic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modules&lt;/strong&gt;: Small programs that perform tasks like installing packages, managing users, and configuring services. Ansible includes built-in modules and supports custom module development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playbooks&lt;/strong&gt;: YAML files that define automation tasks and workflows. Playbooks can contain multiple plays and tasks, organizing automation steps efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt;: Ansible runs the playbook against the inventory, connecting via SSH or WinRM to execute tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handlers and Variables&lt;/strong&gt;: Ansible uses handlers to trigger actions when a change occurs and variables to make playbooks more dynamic.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Installing Ansible
&lt;/h2&gt;

&lt;p&gt;To install Ansible on a Linux system, use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ansible &lt;span class="nt"&gt;-y&lt;/span&gt;  &lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Red Hat-based systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;ansible &lt;span class="nt"&gt;-y&lt;/span&gt;  &lt;span class="c"&gt;# Fedora/RHEL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows, Ansible can be used via the Windows Subsystem for Linux (WSL) or inside a Linux-based container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing Your First Ansible Playbook
&lt;/h2&gt;

&lt;p&gt;Below is a simple Ansible playbook that installs Nginx on a remote server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Nginx&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web_servers&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Nginx&lt;/span&gt;
      &lt;span class="na"&gt;apt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breaking Down the Playbook
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;: A human-readable name for the play.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hosts&lt;/code&gt;: Specifies which inventory group to target (&lt;code&gt;web_servers&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;become&lt;/code&gt;: Grants administrator privileges for task execution.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tasks&lt;/code&gt;: Defines a list of tasks to be performed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apt&lt;/code&gt;: Uses the Ansible package manager module to install Nginx.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To run this playbook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.ini nginx-playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Ansible Commands
&lt;/h2&gt;

&lt;p&gt;Here are some useful commands when working with Ansible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check connectivity to hosts:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ansible all &lt;span class="nt"&gt;-m&lt;/span&gt; ping &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run a command on all hosts:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ansible all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"uptime"&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test a playbook without making changes (dry run):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.ini nginx-playbook.yml &lt;span class="nt"&gt;--check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ansible Best Practices
&lt;/h2&gt;

&lt;p&gt;To effectively use Ansible, consider the following best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Roles&lt;/strong&gt;: Organize playbooks into reusable roles for better maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Variables and Templates&lt;/strong&gt;: Avoid hardcoding values; use variables and Jinja2 templates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep Playbooks DRY (Don't Repeat Yourself)&lt;/strong&gt;: Structure playbooks efficiently to avoid redundancy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Sensitive Data&lt;/strong&gt;: Use Ansible Vault to encrypt sensitive data like passwords and API keys.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ansible-vault encrypt secrets.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test Playbooks&lt;/strong&gt;: Validate playbooks in a staging environment before applying to production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;To learn more about Ansible, you can check out:&lt;/p&gt;

&lt;h4&gt;
  
  
  Official Documentation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.ansible.com/" rel="noopener noreferrer"&gt;Ansible Documentation&lt;/a&gt;&lt;/strong&gt; – The best place to start, with official guides, module references, and best practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Books
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.ansiblefordevops.com/" rel="noopener noreferrer"&gt;Ansible for DevOps&lt;/a&gt;&lt;/strong&gt; by Jeff Geerling – A hands-on guide to Ansible with real-world automation examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ansible: Up and Running&lt;/strong&gt; by Lorin Hochstein – Covers Ansible fundamentals and advanced topics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Online Courses &amp;amp; Tutorials
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.redhat.com/en/services/training/ansible" rel="noopener noreferrer"&gt;Red Hat Ansible Training&lt;/a&gt;&lt;/strong&gt; – Official training from Red Hat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.udemy.com/course/learn-ansible/" rel="noopener noreferrer"&gt;Udemy - Ansible for the Absolute Beginner&lt;/a&gt;&lt;/strong&gt; – Great for beginners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.linkedin.com/learning/learning-ansible-2/" rel="noopener noreferrer"&gt;LinkedIn Learning - Learning Ansible&lt;/a&gt;&lt;/strong&gt; – Covers Ansible basics and automation use cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/c/JeffGeerling" rel="noopener noreferrer"&gt;YouTube - Jeff Geerling’s Ansible Tutorials&lt;/a&gt;&lt;/strong&gt; – Free and practical Ansible tutorials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Hands-on Labs &amp;amp; Practice
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.katacoda.com/courses/ansible" rel="noopener noreferrer"&gt;Katacoda Ansible Scenarios&lt;/a&gt;&lt;/strong&gt; – Interactive labs for practicing Ansible commands and playbooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.katacoda.com/ansible" rel="noopener noreferrer"&gt;Play with Ansible&lt;/a&gt;&lt;/strong&gt; – A browser-based Ansible playground.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Community &amp;amp; Forums
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/ansible/ansible" rel="noopener noreferrer"&gt;Ansible GitHub Repository&lt;/a&gt;&lt;/strong&gt; – Source code and latest updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ansible.com/slack" rel="noopener noreferrer"&gt;Ansible Community Slack&lt;/a&gt;&lt;/strong&gt; – Connect with other learners and professionals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.reddit.com/r/ansible/" rel="noopener noreferrer"&gt;Reddit - r/ansible&lt;/a&gt;&lt;/strong&gt; – Discussions, use cases, and troubleshooting tips.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ansible is a powerful tool that simplifies IT automation, making it easier to manage infrastructure at scale. With its agentless architecture, YAML-based playbooks, and vast module library, Ansible is an essential tool for DevOps engineers, system administrators, and cloud engineers.&lt;/p&gt;

&lt;p&gt;By leveraging Ansible, organizations can achieve greater efficiency, security, and consistency in their IT environments!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>ansible</category>
      <category>beginners</category>
    </item>
    <item>
      <title>FastAPI Book Management API with CI/CD: A Modern Developer's Guide Overview🔥</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Sun, 16 Feb 2025 08:14:29 +0000</pubDate>
      <link>https://dev.to/onlyfave/fastapi-book-management-api-with-cicd-a-modern-developers-guideoverview-47j5</link>
      <guid>https://dev.to/onlyfave/fastapi-book-management-api-with-cicd-a-modern-developers-guideoverview-47j5</guid>
      <description>&lt;h2&gt;
  
  
  FastAPI Book Management API
&lt;/h2&gt;

&lt;p&gt;The FastAPI Book Management API is not just another RESTful API, it’s a high-performance, developer-friendly, and production-ready solution for managing books. Built with FastAPI, this project leverages modern web development practices to deliver a seamless experience for both developers and end-users. Whether you're a beginner exploring API development or an experienced developer looking to implement CI/CD, this project has something for everyone.&lt;/p&gt;

&lt;p&gt;This article dives deep into the project setup, implementation, CI/CD pipeline, deployment strategies, and troubleshooting tips. By the end, you'll have a comprehensive understanding of how to build, deploy, and maintain a scalable API using tools and practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Project Stands Out
&lt;/h3&gt;

&lt;p&gt;This project isn’t just about managing books—it’s about building a modern API that adheres to best practices. Here’s what makes it special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI Framework&lt;/strong&gt;: Lightning-fast performance with asynchronous support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRUD Operations&lt;/strong&gt;: Full support for creating, reading, updating, and deleting books.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input Validation&lt;/strong&gt;: Robust validation using Pydantic schemas to ensure data integrity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS Middleware&lt;/strong&gt;: Secure cross-origin resource sharing for frontend integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Documentation&lt;/strong&gt;: Interactive API documentation powered by OpenAPI and Swagger UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pipeline&lt;/strong&gt;: Automated testing and deployment using GitHub Actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dockerization&lt;/strong&gt;: Containerized deployment for consistency across environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nginx Reverse Proxy&lt;/strong&gt;: Enhanced performance and security for production deployments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. FastAPI Framework
&lt;/h4&gt;

&lt;p&gt;FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.7+ based on standard Python type hints. It’s designed to be easy to use, highly performant, and production-ready. With built-in support for programming, it’s perfect for handling high traffic and complex workflows.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. CRUD Operations
&lt;/h4&gt;

&lt;p&gt;The API supports all basic CRUD operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt;: Add new books to the collection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt;: Retrieve a single book or a list of all books.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt;: Modify existing book details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt;: Remove books from the collection.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Input Validation
&lt;/h4&gt;

&lt;p&gt;Using Pydantic, the API ensures that all incoming data is validated before processing. This prevents invalid data from entering the system and reduces the risk of errors.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. CORS Middleware
&lt;/h4&gt;

&lt;p&gt;Cross-Origin Resource Sharing (CORS) is enabled to allow frontend applications (e.g., React, Angular) to interact with the API seamlessly.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Automated Documentation
&lt;/h4&gt;

&lt;p&gt;FastAPI automatically generates interactive API documentation using OpenAPI and Swagger UI. This makes it easy for developers to explore and test the API endpoints.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. CI/CD Pipeline
&lt;/h4&gt;

&lt;p&gt;The project includes a GitHub Actions workflow for continuous integration and deployment. This ensures that every code change is tested and deployed automatically, reducing the risk of bugs in production.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Dockerization
&lt;/h4&gt;

&lt;p&gt;The API is containerized using Docker, making it easy to deploy and run in any environment. Docker ensures consistency across development, testing, and production environments.&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Nginx Reverse Proxy
&lt;/h4&gt;

&lt;p&gt;For production deployments, Nginx is used as a reverse proxy to improve performance, handle load balancing, and enhance security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Clone the Repository
&lt;/h4&gt;

&lt;p&gt;Start by cloning the repository to your local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/onlyfave/fastapi-book-project.git
&lt;span class="nb"&gt;cd &lt;/span&gt;fastapi-book-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Install Dependencies
&lt;/h4&gt;

&lt;p&gt;Ensure you have Python installed, then install the required dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Run the FastAPI Server
&lt;/h4&gt;

&lt;p&gt;Start the FastAPI server using Uvicorn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access the API at: &lt;a href="http://127.0.0.1:8000" rel="noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explore the interactive documentation at: &lt;a href="http://127.0.0.1:8000/docs" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/docs&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API Endpoints
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Health Check
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;GET /healthcheck&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Create a Book
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;POST /api/v1/books/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request Body:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The Hobbit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"J.R.R. Tolkien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publication_year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1937&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"genre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCI_FI"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The Hobbit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"J.R.R. Tolkien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publication_year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1937&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"genre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCI_FI"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Get All Books
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;GET /api/v1/books/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; List of books&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Get a Book by ID
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;GET /api/v1/books/{book_id}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Update a Book
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;PUT /api/v1/books/{book_id}&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Delete a Book
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;DELETE /api/v1/books/{book_id}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD Pipeline Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  GitHub Actions Workflow
&lt;/h4&gt;

&lt;p&gt;The CI/CD pipeline is powered by GitHub Actions. Here’s how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; The pipeline runs on every push or pull request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build:&lt;/strong&gt; The code is checked out, Python is set up, and dependencies are installed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test:&lt;/strong&gt; Automated tests are run using pytest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy:&lt;/strong&gt; If the build and tests pass, the code is deployed to the server.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI/CD Pipeline&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Python&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.10'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;pip install -r requirements.txt&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pytest&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to server&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Deploying..."&lt;/span&gt;  &lt;span class="c1"&gt;# Replace with actual deployment steps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Using Docker
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Create a Dockerfile:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.10-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Build and Run the Docker Container:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; fastapi-book-api &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 fastapi-book-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verify the Deployment:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/healthcheck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debugging &amp;amp; Troubleshooting
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Check Running Containers
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. View Application Logs
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Restart Deployment
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop &amp;lt;container_id&amp;gt;
docker start &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Check CI/CD Pipeline Logs
&lt;/h4&gt;

&lt;p&gt;Go to GitHub → Actions tab and check if the build or deployment failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;p&gt;This project is just the beginning. Here are some ideas for future improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Add user authentication using OAuth2 or JWT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Integration:&lt;/strong&gt; Use a database like PostgreSQL or MongoDB for persistent storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Book Recommendations:&lt;/strong&gt; Implement a recommendation engine based on user preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting:&lt;/strong&gt; Protect the API from abuse by implementing rate limiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; Add monitoring and logging for better observability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The FastAPI Book Management API is a powerful, scalable, and modern solution for managing books. With its robust features, automated CI/CD pipeline, and containerized deployment, it’s ready for production use. Whether you’re building a personal library or a large-scale book management system, this project provides a solid foundation to build upon.&lt;/p&gt;

&lt;p&gt;So, what are you waiting for? Dive into the code, experiment with the API, and take your development skills to the next level.&lt;br&gt;
Happy Coding! 🚀&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>cicd</category>
      <category>devops</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>From Code to Cloud: Building and Deploying a Smart Number Classification API with FastAPI</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Thu, 06 Feb 2025 00:12:37 +0000</pubDate>
      <link>https://dev.to/onlyfave/from-code-to-cloud-building-and-deploying-a-smart-number-classification-api-with-fastapi-5g25</link>
      <guid>https://dev.to/onlyfave/from-code-to-cloud-building-and-deploying-a-smart-number-classification-api-with-fastapi-5g25</guid>
      <description>&lt;h2&gt;
  
  
  Number Classification API
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Number Classification API&lt;/strong&gt; is a FastAPI-powered web service that classifies numbers based on their mathematical properties and provides a fun fact. It determines whether a number is &lt;strong&gt;prime&lt;/strong&gt;, &lt;strong&gt;perfect&lt;/strong&gt;, &lt;strong&gt;Armstrong&lt;/strong&gt;, &lt;strong&gt;even&lt;/strong&gt;, or &lt;strong&gt;odd&lt;/strong&gt; and fetches an interesting fact from an external API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Classifies numbers based on mathematical properties.&lt;/li&gt;
&lt;li&gt;Fetches fun facts using the &lt;a href="http://numbersapi.com/" rel="noopener noreferrer"&gt;Numbers API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Provides a structured JSON response.&lt;/li&gt;
&lt;li&gt;Handles errors gracefully and ensures valid integer input.&lt;/li&gt;
&lt;li&gt;Publicly accessible and deployed on &lt;strong&gt;Google Cloud Compute Engine (GCE)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API Endpoint
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Classify a Number&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/classify-number?number=&amp;lt;integer&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Request Parameters&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;The number to classify&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Successful Response (200 OK)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;371&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_prime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_perfect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"armstrong"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"odd"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"digit_sum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fun_fact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"371 is an Armstrong number because 3^3 + 7^3 + 1^3 = 371"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Error Response (400 Bad Request)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid input. Please enter an integer."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: FastAPI (Python)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting Platform&lt;/strong&gt;: Google Cloud Compute Engine (GCE)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port&lt;/strong&gt;: 8000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS Handling&lt;/strong&gt;: Enabled to allow cross-origin requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;li&gt;FastAPI &amp;amp; Uvicorn&lt;/li&gt;
&lt;li&gt;Virtual Environment (optional but recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Steps to Run Locally&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/onlyfave/Number-classification-api.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Number-classification-api

&lt;span class="c"&gt;# Create a virtual environment&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate  &lt;span class="c"&gt;# On Windows use: venv\Scripts\activate&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Run the FastAPI server&lt;/span&gt;
uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment on Google Cloud Compute Engine (GCE)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a VM Instance&lt;/strong&gt; on GCE.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funk43dw27xcsa3om9xjc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funk43dw27xcsa3om9xjc.png" alt="Screenshot 2025-02-05 231115" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install dependencies&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-pip
   pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the API in the background&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;nohup &lt;/span&gt;uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Allow external traffic&lt;/strong&gt; on port 8000:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   gcloud compute firewall-rules create allow-fastapi &lt;span class="se"&gt;\&lt;/span&gt;
       &lt;span class="nt"&gt;--allow&lt;/span&gt; tcp:8000 &lt;span class="se"&gt;\&lt;/span&gt;
       &lt;span class="nt"&gt;--target-tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http-server &lt;span class="se"&gt;\&lt;/span&gt;
       &lt;span class="nt"&gt;--description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Allow FastAPI traffic"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or do it manually in the VPC Firewall settings&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgq4w0vixxcthokfnyj30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgq4w0vixxcthokfnyj30.png" alt="Screenshot 2025-02-05 235933" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify API is accessible&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl http://35.209.49.217:8000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number-classification-api/
│── main.py               # FastAPI application
│── requirements.txt      # Project dependencies
│── README.md             # Documentation (this file)
└── .gitignore            # Git ignore file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screenshots&lt;/p&gt;

&lt;p&gt;Python file(main.py)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0ye9b44fhloa8zqk4ci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0ye9b44fhloa8zqk4ci.png" alt="Screenshot 2025-02-05 234325" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example API Response&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzbufn5wj2znrvmhvzvd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzbufn5wj2znrvmhvzvd.png" alt="Screenshot 2025-02-05 233409" width="800" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API Running Successfully&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyi7vpp5bo7wt29vlwsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyi7vpp5bo7wt29vlwsh.png" alt="Screenshot 2025-02-06 001319" width="721" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pushed to GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagfu822x64ktbt1d447j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagfu822x64ktbt1d447j.png" alt="Screenshot 2025-02-05 234548" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technologies Used&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the API
&lt;/h2&gt;

&lt;p&gt;You can test the API using &lt;strong&gt;cURL&lt;/strong&gt;, &lt;strong&gt;Postman&lt;/strong&gt;, or a web browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"http://35.209.49.217:8000/api/classify-number?number=42"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Favour Onyeneke&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;GitHub link: &lt;a href="https://github.com/onlyfave/Number-classification-api" rel="noopener noreferrer"&gt;onlyfave&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Number Classification API&lt;/strong&gt; is a lightweight and efficient API that provides mathematical insights and fun facts about numbers. Future improvements may include support for additional number properties and performance optimizations.🔥&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>fastapi</category>
      <category>gcp</category>
    </item>
    <item>
      <title>Best resource to understand Prometheus and what it entails🔥</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Tue, 04 Feb 2025 13:33:44 +0000</pubDate>
      <link>https://dev.to/onlyfave/best-resource-to-understand-prometheus-and-what-it-entails-cjm</link>
      <guid>https://dev.to/onlyfave/best-resource-to-understand-prometheus-and-what-it-entails-cjm</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/favxlaw" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1673424%2Fe7aa58e9-2f38-4ddb-a697-61240e8b812b.png" alt="favxlaw"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/favxlaw/prometheus-architecture-understanding-the-workflow-162o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Prometheus Architecture: Understanding the Workflow 🚀&lt;/h2&gt;
      &lt;h3&gt;Favour Lawrence ・ Feb 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#monitoring&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>devops</category>
      <category>monitoring</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Configured NGINX on a Fresh Ubuntu Server: My Experience</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Fri, 31 Jan 2025 17:54:01 +0000</pubDate>
      <link>https://dev.to/onlyfave/how-i-configured-nginx-on-a-fresh-ubuntu-server-my-experience-434b</link>
      <guid>https://dev.to/onlyfave/how-i-configured-nginx-on-a-fresh-ubuntu-server-my-experience-434b</guid>
      <description>&lt;h1&gt;
  
  
  Configuring NGINX on a Fresh Ubuntu Server: My Experience
&lt;/h1&gt;

&lt;p&gt;Setting up NGINX on a fresh Ubuntu server is a fundamental task for any DevOps engineer. Recently, I had to configure NGINX on a brand-new Ubuntu instance and serve a custom HTML page as the default page. While the process is straightforward, I encountered some challenges and learned a few valuable lessons along the way. In this blog post, I’ll share my experience, step-by-step setup, and troubleshooting tips.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Setting Up the Environment
&lt;/h2&gt;

&lt;p&gt;To start, I spun up a new Ubuntu server instance on Google Cloud Platform (GCP) Compute Engine. After provisioning the server, I connected to it via Google Cloud SSH:&lt;br&gt;
If you're using any other cloud platform, you can SSH into it using the IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh ubuntu@your-server-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Installing NGINX
&lt;/h2&gt;

&lt;p&gt;NGINX is not installed by default on Ubuntu, so the first step I did was to update the package list and install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, I checked the status to ensure it was running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It wasn’t running, so I started and enabled it to run on boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Creating a Custom HTML Page ✨
&lt;/h2&gt;

&lt;p&gt;NGINX serves files from &lt;code&gt;/var/www/html&lt;/code&gt;. So to customize the default page, I created an &lt;code&gt;index.html&lt;/code&gt; file inside this directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; We have two major text editors which we use on the terminal; Vim and Nano (I just prefer using Vim).&lt;/p&gt;

&lt;p&gt;I added a simple HTML page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Welcome To My HTML Page!&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 8rem;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Welcome To DevOps Stage 0 - Fave💕✨&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving the file, I needed to restart NGINX for the changes to take effect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Configuring NGINX to Serve the Custom Page
&lt;/h2&gt;

&lt;p&gt;In some cases, the default NGINX configuration might not serve the custom HTML page correctly. So I verified that the default server block in &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt; was set up properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ensured the configuration looked like this in the default file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving the changes, I tested the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything was fine, so I reloaded NGINX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Testing the Setup
&lt;/h2&gt;

&lt;p&gt;To verify that everything worked correctly, I accessed the server’s public IP address in a web browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://34.59.6.191
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I was greeted with my custom HTML page!! 😌💅&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Challenges I Faced
&lt;/h2&gt;

&lt;p&gt;While the process might seem smooth, I encountered some challenges and I had to troubleshoot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NGINX not starting:&lt;/strong&gt; Running &lt;code&gt;sudo nginx -t&lt;/code&gt; helped identify if I missed any steps or configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page not updating:&lt;/strong&gt; Clearing the browser cache or restarting NGINX usually fixed this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firewall blocking requests:&lt;/strong&gt; I had to edit the firewall rule on my instance to only serve port 80. Ensuring the firewall allowed HTTP traffic solved the issue.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 References:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;DevOps Engineers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;Cloud Engineers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Conclusion
&lt;/h2&gt;

&lt;p&gt;Configuring NGINX on a fresh Ubuntu server to serve a custom HTML page was a great learning experience. While the setup process was mostly smooth, troubleshooting minor issues reinforced my understanding of how NGINX handles requests and configurations. If you're setting up a web server for the first time, following these steps should help you get started quickly.&lt;/p&gt;

&lt;p&gt;Thanks 😌🔥&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>ubuntu</category>
      <category>devops</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Building a Scalable Real-Time NBA Stats Pipeline With AWS: Unlocking Seamless Data Integration</title>
      <dc:creator>Fave😌✨</dc:creator>
      <pubDate>Fri, 31 Jan 2025 12:42:00 +0000</pubDate>
      <link>https://dev.to/onlyfave/building-a-real-time-nba-stats-pipeline-leveraging-aws-for-seamless-data-integration-o3c</link>
      <guid>https://dev.to/onlyfave/building-a-real-time-nba-stats-pipeline-leveraging-aws-for-seamless-data-integration-o3c</guid>
      <description>&lt;h2&gt;
  
  
  NBA Statistics Pipeline🏀
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🚀 Introduction
&lt;/h2&gt;

&lt;p&gt;This project is an &lt;strong&gt;NBA Statistics Pipeline&lt;/strong&gt; that fetches NBA team statistics from the &lt;a href="https://sportsdata.io/" rel="noopener noreferrer"&gt;SportsData API&lt;/a&gt; and stores them in &lt;strong&gt;AWS DynamoDB&lt;/strong&gt;. The project also implements structured logging using &lt;strong&gt;AWS CloudWatch&lt;/strong&gt;, enabling efficient monitoring and debugging.&lt;/p&gt;

&lt;p&gt;This project was built to demonstrate my proficiency in &lt;strong&gt;AWS services, Python, API integrations, and Infrastructure as Code (IaC)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; (Data processing, API requests, logging)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS DynamoDB&lt;/strong&gt; (NoSQL database for storing NBA stats)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudWatch&lt;/strong&gt; (Logging &amp;amp; monitoring)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boto3&lt;/strong&gt; (AWS SDK for Python)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; (Containerization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EC2 Instance&lt;/strong&gt; (Compute environment for development)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fetches real-time NBA statistics from the SportsData API&lt;/li&gt;
&lt;li&gt;Stores team stats in &lt;strong&gt;AWS DynamoDB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Structured logging with &lt;strong&gt;AWS CloudWatch&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Error handling and logging with &lt;strong&gt;JSON structured logs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;environment variables&lt;/strong&gt; for sensitive credentials&lt;/li&gt;
&lt;li&gt;Implements &lt;strong&gt;batch writing&lt;/strong&gt; for efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📸 Snapshots
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API Response Sample&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flat6q2ocryh17lseynk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flat6q2ocryh17lseynk5.png" alt="Screenshot 2025-01-31 114651" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB Table Data&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5t8wv1eo4p7t3x6sk7l9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5t8wv1eo4p7t3x6sk7l9.png" alt="Screenshot 2025-01-31 115147" width="800" height="92"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly7nuykl1ci5833uqufu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly7nuykl1ci5833uqufu.png" alt="Screenshot 2025-01-31 115315" width="800" height="350"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77h7thjkz0irlzsvci13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77h7thjkz0irlzsvci13.png" alt="Screenshot 2025-01-31 115438" width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzult28qsketu15ayxbah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzult28qsketu15ayxbah.png" alt="Screenshot 2025-01-31 115510" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudWatch Logs&lt;/strong&gt; (Structured logs for monitoring)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4ayi3l4h6upziy4qhpe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4ayi3l4h6upziy4qhpe.png" alt="Screenshot 2025-01-31 121713" width="800" height="125"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwac7r50t3ukj0t8kqat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwac7r50t3ukj0t8kqat.png" alt="Screenshot 2025-01-31 121916" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal Output&lt;/strong&gt; (Successful execution of the pipeline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furg9ujuvngm7y48xdshz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furg9ujuvngm7y48xdshz.png" alt="Screenshot 2025-01-31 122345" width="800" height="410"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenhea0n9ffajnhe8d00i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenhea0n9ffajnhe8d00i.png" alt="Screenshot 2025-01-31 122416" width="800" height="422"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf6hq6tk26taur6u44f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf6hq6tk26taur6u44f1.png" alt="Screenshot 2025-01-31 122458" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🏗 Project Architecture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└── nba-stats-pipeline
    ├── src
    │  ├── __init__.py
    │  ├── nba_stats.py
    │  ├── lambdafunction.py
    ├── requirements.txt      # Dependencies
    │   ├── .env              # Environment variables
    │   ├── Dockerfile        # Containerization setup (if applicable)
    ├── README.md             # Project documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🚀 Step-by-Step Guide to Building the NBA Stats Pipeline
&lt;/h2&gt;
&lt;h3&gt;
  
  
  4️⃣ Launch EC2 Instance and SSH Into It
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"nba-stats-pipeline.pem"&lt;/span&gt; ubuntu@ec2-18-212-173-76.compute-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  1️⃣ Clone the Repository
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/onlyfave/nba-stats-pipeline.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nba-stats-pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  1️⃣ Install Python3
&lt;/h3&gt;

&lt;p&gt;Python3 is required to run the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1️⃣ Install Pip
&lt;/h3&gt;

&lt;p&gt;On most systems, pip comes pre-installed with Python3. To verify, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't have pip installed, use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ Install Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3️⃣ Set Up Environment Variables
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;SPORTDATA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;
&lt;span class="py"&gt;DYNAMODB_TABLE_NAME&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;nba-player-stats&lt;/span&gt;
&lt;span class="py"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_access_key&lt;/span&gt;
&lt;span class="py"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_secret_key&lt;/span&gt;
&lt;span class="py"&gt;AWS_REGION&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4️⃣ CD Into the Folder Containing the Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4️⃣ Run the Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 nba_stats.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Sample Data Format
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"TeamID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"TeamName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Los Angeles Lakers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Wins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Losses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PointsPerGameFor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;112.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PointsPerGameAgainst"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;108.3&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🏗 Deployment (Optional: Dockerized Version)
&lt;/h2&gt;

&lt;p&gt;To run this project inside a Docker container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nba-stats-pipeline &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--env-file&lt;/span&gt; .env nba-stats-pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔥 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Expertise&lt;/strong&gt;: Used DynamoDB &amp;amp; CloudWatch for data storage &amp;amp; monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps Skills&lt;/strong&gt;: Managed credentials, logging, and error handling efficiently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-Native Thinking&lt;/strong&gt;: Designed a cloud-based ETL pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📌 Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Implement &lt;strong&gt;Lambda Functions&lt;/strong&gt; for automated execution&lt;/li&gt;
&lt;li&gt;Deploy using &lt;strong&gt;AWS ECS or Kubernetes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Integrate with &lt;strong&gt;Grafana&lt;/strong&gt; for real-time data visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📢 Connect With Me
&lt;/h2&gt;

&lt;p&gt;🚀 &lt;a href="https://www.linkedin.com/in/favour-onyeneke-2b2881297/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; | 🐦 &lt;a href="https://x.com/only_fave" rel="noopener noreferrer"&gt;Twitter/X&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
