<?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: Joseph Adamu</title>
    <description>The latest articles on DEV Community by Joseph Adamu (@techygee).</description>
    <link>https://dev.to/techygee</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%2F2790179%2Fd344a783-62cd-4b41-ace6-c3cd0dd96723.png</url>
      <title>DEV Community: Joseph Adamu</title>
      <link>https://dev.to/techygee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techygee"/>
    <language>en</language>
    <item>
      <title>Hey guys check my new beginner post out! I'm excited, what do you think?</title>
      <dc:creator>Joseph Adamu</dc:creator>
      <pubDate>Wed, 05 Feb 2025 12:34:50 +0000</pubDate>
      <link>https://dev.to/techygee/hey-guys-check-my-new-beginner-post-out-im-excited-what-do-you-think-42il</link>
      <guid>https://dev.to/techygee/hey-guys-check-my-new-beginner-post-out-im-excited-what-do-you-think-42il</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/techygee" 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%2F2790179%2Fd344a783-62cd-4b41-ace6-c3cd0dd96723.png" alt="techygee"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/techygee/from-zero-to-fastapi-hero-my-hng12-stage-0-adventure-14h6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;From Zero to FastAPI Hero: My HNG12 Stage 0 Adventure&lt;/h2&gt;
      &lt;h3&gt;Joseph Adamu ・ Feb 5&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#fastapi&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&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>fastapi</category>
      <category>programming</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>From Zero to FastAPI Hero: My HNG12 Stage 0 Adventure</title>
      <dc:creator>Joseph Adamu</dc:creator>
      <pubDate>Wed, 05 Feb 2025 12:24:15 +0000</pubDate>
      <link>https://dev.to/techygee/from-zero-to-fastapi-hero-my-hng12-stage-0-adventure-14h6</link>
      <guid>https://dev.to/techygee/from-zero-to-fastapi-hero-my-hng12-stage-0-adventure-14h6</guid>
      <description>&lt;h2&gt;
  
  
  From Zero to FastAPI Hero: My Backend Stage 0 Adventure
&lt;/h2&gt;

&lt;p&gt;Hey there, fellow backend wizards and code crusaders!&lt;/p&gt;

&lt;p&gt;Welcome to my behind-the-scenes journey into the HNG12 Stage 0 assignment. Today, I'm taking you on a rollercoaster ride through the creation of a sleek FastAPI application that does three cool things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Returns my registered HNG email&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shows the current UTC datetime in ISO 8601 format&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shares the GitHub URL of this awesome project&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grab your favorite beverage, and let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mission: What Was I Asked to Do?
&lt;/h2&gt;

&lt;p&gt;The challenge was crystal clear: build a public API that serves up a neat JSON bundle containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; (Yep, my registered HNG email!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current Datetime:&lt;/strong&gt; Freshly minted in UTC, right when you ask.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub URL:&lt;/strong&gt; A link to where all the magic happens (i.e., the project repo).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I opted for &lt;strong&gt;Python&lt;/strong&gt; and &lt;strong&gt;FastAPI&lt;/strong&gt; because they make creating and deploying APIs feel like a walk in the park—with a few unexpected loop-de-loops for fun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rolling Up My Sleeves: Setting Up the API
&lt;/h2&gt;

&lt;p&gt;I started by creating a virtual environment (because who doesn’t love a good sandbox to play in?), then installed FastAPI and Uvicorn. With my coding hat on and coffee in hand, I crafted the following masterpiece:&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;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;  &lt;span class="c1"&gt;# Import our trusty web framework
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.middleware.cors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;  &lt;span class="c1"&gt;# For smooth cross-origin magic
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;  &lt;span class="c1"&gt;# To grab the current time in UTC
&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Creating our FastAPI app instance
&lt;/span&gt;
&lt;span class="c1"&gt;# Adding CORS middleware to handle all those cross-origin requests
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;          &lt;span class="c1"&gt;# Open to all domains (tweak for production if needed)
&lt;/span&gt;    &lt;span class="n"&gt;allow_credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# Cookies and authorization headers? Yes, please!
&lt;/span&gt;    &lt;span class="n"&gt;allow_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;        &lt;span class="c1"&gt;# We only need GET since we're all about simple retrieval
&lt;/span&gt;    &lt;span class="n"&gt;allow_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;          &lt;span class="c1"&gt;# Let every header join the party
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# The root endpoint of our API
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_info&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;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;joseph.adamu.it@gmail.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# My registered HNG email
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;  &lt;span class="c1"&gt;# Fresh UTC datetime
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;github_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://github.com/Joe-encodes/fastapi-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Link to my GitHub repo
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Only run this if the script is executed directly
&lt;/span&gt;    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uvicorn&lt;/span&gt;  &lt;span class="c1"&gt;# Uvicorn: the lightweight Python web server that brings our API to life
&lt;/span&gt;    &lt;span class="n"&gt;uvicorn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What’s happening here?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; is our magic wand that turns code into a live API.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS middleware&lt;/strong&gt; ensures that our API is friendly and accessible from any domain (because sharing is caring).
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;get_info&lt;/code&gt; endpoint&lt;/strong&gt; does all the heavy lifting by packaging my email, current UTC time, and GitHub link into a neat JSON gift.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;After coding, I fired up the API locally with Uvicorn and tested it on my browser and with curl. Watching that JSON response pop up was like seeing a well-cooked dish come out of the oven—satisfying and oh-so-rewarding!&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;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open your browser to &lt;a href="http://127.0.0.1:8000" rel="noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt; and feast your eyes on the magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment: Taking It Live on Render
&lt;/h2&gt;

&lt;p&gt;Once I confirmed everything was working perfectly on my local machine, I pushed the code to GitHub and connected the repository to Render. With a couple of settings tweaked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Command:&lt;/strong&gt; &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Command:&lt;/strong&gt; &lt;code&gt;uvicorn main:app --host 0.0.0.0 --port 10000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...and voilà! The API was deployed and accessible to the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons, Laughter, and Learning
&lt;/h2&gt;

&lt;p&gt;Here’s what I learned on this wild ride:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI is a blast:&lt;/strong&gt; It’s fast, fun, and super friendly for developers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS is crucial:&lt;/strong&gt; Handling cross-origin requests ensures that your API is as open and accessible as you intend it to be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment can be thrilling:&lt;/strong&gt; Seeing your code go live is like watching your kid ride a bike for the first time—exhilarating and nerve-wracking all at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This HNG12 Stage 0 assignment wasn’t just about writing code—it was an adventure in problem-solving, deploying, and celebrating every small victory along the way. I hope my journey inspires you to embrace the fun in backend development and push your own limits.&lt;/p&gt;

&lt;p&gt;Until next time, keep coding, stay curious, and may your API always return a happy 200 OK!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Joe-encodes" rel="noopener noreferrer"&gt;Joe-encodes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/joseph-adamu-it" rel="noopener noreferrer"&gt;Joseph Adamu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:joseph.adamu.it@gmail.com"&gt;joseph.adamu.it@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy coding, everyone!&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>programming</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>“From Zero to NGINX Hero: My DevOps Stage 0 Adventure”</title>
      <dc:creator>Joseph Adamu</dc:creator>
      <pubDate>Wed, 29 Jan 2025 23:54:52 +0000</pubDate>
      <link>https://dev.to/techygee/from-zero-to-nginx-hero-my-devops-stage-0-adventure-29ae</link>
      <guid>https://dev.to/techygee/from-zero-to-nginx-hero-my-devops-stage-0-adventure-29ae</guid>
      <description>&lt;h3&gt;
  
  
  &lt;em&gt;Drama, suspense, and a happy ending included! 🔥&lt;/em&gt;
&lt;/h3&gt;




&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;As a budding DevOps enthusiast, my first hands-on task was setting up an NGINX web server on a fresh Ubuntu machine. This foundational exercise aimed to teach server configuration, troubleshooting, and deploymentskills critical for roles like &lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;DevOps Engineers&lt;/a&gt; and &lt;a href="https://hng.tech/hire/ci-cd-pipeline-engineers" rel="noopener noreferrer"&gt;CI/CD Pipeline Engineers&lt;/a&gt;. In this blog, Ill walk through my journey, the hurdles I faced, and how this task aligns with my career aspirations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Installing NGINX
&lt;/h4&gt;

&lt;p&gt;I started by updating the Ubuntu package repository and installing NGINX using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, I verified NGINX was running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Step 2: Creating the Custom HTML Page&lt;/p&gt;

&lt;p&gt;I replaced the default landing page by creating a new &lt;code&gt;index.html&lt;/code&gt; at &lt;code&gt;/var/www/html/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I added a simple HTML template with the required message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;DevOps Stage 0&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;Welcome to DevOps Stage 0 - TechGee&amp;lt;/h1&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;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%2Fws0u3zlqchdkry9zlnk9.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%2Fws0u3zlqchdkry9zlnk9.png" width="800" height="500"&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%2Flstwskwmf57j7quv6zzs.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%2Flstwskwmf57j7quv6zzs.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Configuring Permissions and Testing
&lt;/h4&gt;

&lt;p&gt;To avoid permission issues, I set ownership of the &lt;code&gt;/var/www/html&lt;/code&gt; directory to the web server user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chown -R www-data:www-data /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I reloaded NGINX to apply changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl reload nginx
&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%2Fxn0328uo4z1n5oyo2cja.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%2Fxn0328uo4z1n5oyo2cja.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; Solutions: The Oops, I Did It Again Edition&lt;/strong&gt; 🎭&lt;/p&gt;




&lt;h4&gt;
  
  
  Challenge 1: Firewall, the Over-enthusiastic Bouncer 🚧
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt; : My NGINX server was ready to party, but Ubuntu's firewall (UFW) was like, &lt;em&gt;NOPE. Port 80? Never heard of her.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt; : I whispered the magic words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw allow 'Nginx HTTP'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Moral of the Story&lt;/strong&gt; : Firewalls are the bouncers of the internet. Always check the guest list.&lt;/p&gt;




&lt;h4&gt;
  
  
  Challenge 2: Permission Denied? More Like Permission Confused 🔑
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt; : My HTML page was MIA. Turns out, the file was owned by &lt;code&gt;root&lt;/code&gt;the ultimate gatekeeper. NGINX, being a mere mortal (&lt;code&gt;www-data&lt;/code&gt;), couldn't read it. 🙈&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt; : I handed over the keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chown www-data:www-data /var/www/html/index.html # "Here, NGINX. This is YOUR house now." 🏠
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Moral of the Story&lt;/strong&gt; : Sharing is caring. Especially with web servers.&lt;/p&gt;




&lt;h4&gt;
  
  
  Challenge 3: The Case of the Missing Semicolon 🔍
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt; : I edited the NGINX config like a coding wizard until I missed a &lt;code&gt;;&lt;/code&gt;. NGINX responded with: &lt;em&gt;Error 500: LOL, nice try.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt; : I became Sherlock Holmes of Syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nginx -t # Spoiler: It yelled, Missing semicolon at line 13! 🕵
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, I raided the logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tail -f /var/log/nginx/error.log # Ah-ha! Theres the culprit! 🎯
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Moral of the Story&lt;/strong&gt; : Semicolons are the pepperoni of codesmall but essential. 🍕&lt;/p&gt;




&lt;h3&gt;
  
  
  Why You'll Remember This Forever 🌟
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Firewalls are drama queens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Permissions are like relationships; communication is key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Typos are the universes way of keeping you humble.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now go forth, and may your servers never throw a tantrum again! 🚀&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(P.S. If all else fails, scream sudo!! and pray.)&lt;/em&gt; 😇&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Hiring Opportunities in DevOps and Related Fields&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you are looking to hire talent in the tech industry, consider the following roles:&lt;/p&gt;

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

&lt;p&gt;This is intended for hiring managers and recruiters seeking qualified candidates in these specialized roles.&lt;/p&gt;




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

&lt;p&gt;Completing this task was a small but significant step in my DevOps journey. It taught me resilience (debugging at 2 AM!), attention to detail, and the thrill of seeing Welcome to DevOps Stage 0 load on my screen. Im excited to tackle more complex tasksmaybe Docker or Kubernetes next!&lt;/p&gt;

&lt;p&gt;To fellow beginners: Embrace the grind. Every error message is a lesson. 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to start your DevOps journey?&lt;/strong&gt; Check out opportunities at &lt;a href="https://hng.tech/hire" rel="noopener noreferrer"&gt;HNG Tech&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;]]&amp;gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>development</category>
      <category>linux</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
