<?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: Oyawole Damilola</title>
    <description>The latest articles on DEV Community by Oyawole Damilola (@oyawole_damilola_e3821568).</description>
    <link>https://dev.to/oyawole_damilola_e3821568</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%2F3779034%2Fd489638c-ce1b-4ecc-b720-87b4e4dee346.png</url>
      <title>DEV Community: Oyawole Damilola</title>
      <link>https://dev.to/oyawole_damilola_e3821568</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oyawole_damilola_e3821568"/>
    <language>en</language>
    <item>
      <title>From Linux Basics to Remote Deployment: A 6 Day DevOps Foundation Project</title>
      <dc:creator>Oyawole Damilola</dc:creator>
      <pubDate>Wed, 18 Feb 2026 09:30:01 +0000</pubDate>
      <link>https://dev.to/oyawole_damilola_e3821568/from-linux-basics-to-remote-deployment-a-6-day-devops-foundation-project-jo1</link>
      <guid>https://dev.to/oyawole_damilola_e3821568/from-linux-basics-to-remote-deployment-a-6-day-devops-foundation-project-jo1</guid>
      <description>&lt;p&gt;I set out to strengthen my DevOps fundamentals by building a structured 6 day hands on project series.I wanted to understand each layer before combining everything into a working remote deployment.&lt;/p&gt;




&lt;p&gt;By the end of the week, I had automated the provisioning of a remote Ubuntu EC2 instance, containerized a Flask application, configured Nginx as a reverse proxy, and deployed everything through a single script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu (local and EC2)&lt;/li&gt;
&lt;li&gt;Bash&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;AWS EC2&lt;/li&gt;
&lt;li&gt;SSH and SCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 1: Linux Essentials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I revisited core Linux concepts including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File permissions&lt;/li&gt;
&lt;li&gt;Services and systemctl&lt;/li&gt;
&lt;li&gt;Log inspection&lt;/li&gt;
&lt;li&gt;Basic system commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote a Bash script to check disk usage, memory usage, and uptime. This forced me to understand what the commands were actually doing instead of just running them.&lt;br&gt;
This step reinforced comfort with the terminal, which is non negotiable in DevOps work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 2: Bash Scripting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Conditionals&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Basic error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using these, I built a script that installs Docker, Git, and Nginx automatically on an Ubuntu server or container.&lt;/p&gt;

&lt;p&gt;Instead of manually installing packages every time, I could now provision a machine with one script. This was my first clear shift from manual work to automation thinking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 3: Docker Fundamentals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I containerized a simple Flask application.&lt;br&gt;
This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing a Dockerfile&lt;/li&gt;
&lt;li&gt;Building the image&lt;/li&gt;
&lt;li&gt;Running the container locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step clarified how containers package applications and how runtime behavior differs from running an app directly on the host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 4: Docker Compose and Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I extended the setup into a multi container environment. I defined two services in Docker Compose for Flask and Nginx, allowing the containers to communicate over an internal network. Requests were routed through Nginx to Flask and health checks validated service availability.&lt;/p&gt;

&lt;p&gt;Seeing traffic flow through the reverse proxy made the networking piece much clearer. It also demonstrated how containers communicate internally within a defined network.&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%2F6opqw2fm2jnewtewlnhc.webp" 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%2F6opqw2fm2jnewtewlnhc.webp" alt="Simple Dockerized Flask App hosted on my local machine on Port 8080" width="800" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 5: SSH Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I automated remote script execution using SCP and SSH on EC2 instances.&lt;br&gt;
This involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Securely connecting to a remote Ubuntu server&lt;/li&gt;
&lt;li&gt;Transferring scripts via SCP&lt;/li&gt;
&lt;li&gt;Executing scripts remotely&lt;/li&gt;
&lt;li&gt;Managing permissions and environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step tied local automation to real infrastructure. It moved the project from theory to practical remote execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 6: Full Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I combined everything into a single script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connects to a remote EC2 Ubuntu instance&lt;/li&gt;
&lt;li&gt;Installs Docker and Git&lt;/li&gt;
&lt;li&gt;Builds the Flask container&lt;/li&gt;
&lt;li&gt;Configures Nginx as a reverse proxy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After execution, the application was accessible through the instance’s public IP address.&lt;br&gt;
That moment validated the full workflow from provisioning to deployment.&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%2F732frja7el2hnrpp462x.webp" 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%2F732frja7el2hnrpp462x.webp" alt="Simple Flask App behind Nginx Dockerized on an Ubuntu EC2 Instance" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project was intentionally foundational. The goal was not complexity, but correctness and understanding of how the pieces connect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository&lt;/strong&gt;&lt;br&gt;
All scripts, Docker configurations, and deployment steps are available in my GitHub repository here &lt;a href="https://github.com/amilola/30Days-Devops/tree/main/Phase1" rel="noopener noreferrer"&gt;https://github.com/amilola/30Days-Devops/tree/main/Phase1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>docker</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
