<?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: FT MJ</title>
    <description>The latest articles on DEV Community by FT MJ (@ft_mj_5b31d5ca700bb51d61f).</description>
    <link>https://dev.to/ft_mj_5b31d5ca700bb51d61f</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%2F2353755%2Fb8ae887e-3876-4eb5-922f-4f3e9e7ff049.jpg</url>
      <title>DEV Community: FT MJ</title>
      <link>https://dev.to/ft_mj_5b31d5ca700bb51d61f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ft_mj_5b31d5ca700bb51d61f"/>
    <language>en</language>
    <item>
      <title>Production Maintenance Drill: An OPS Checklist in Action Validating Production Readiness Through Hands-On Practice</title>
      <dc:creator>FT MJ</dc:creator>
      <pubDate>Sun, 08 Mar 2026 19:29:43 +0000</pubDate>
      <link>https://dev.to/ft_mj_5b31d5ca700bb51d61f/production-maintenance-drill-an-ops-checklist-in-action-validating-production-readiness-through-e6d</link>
      <guid>https://dev.to/ft_mj_5b31d5ca700bb51d61f/production-maintenance-drill-an-ops-checklist-in-action-validating-production-readiness-through-e6d</guid>
      <description>&lt;p&gt;In this assignment, I stepped into the shoes of a production support engineer and performed a comprehensive maintenance drill on a live EC2 instance running an Nginx web server. The goal was simple but critical: validate that the production server is healthy, secure, and reliable — and document every step of the process.&lt;/p&gt;

&lt;p&gt;This drill simulated exactly what real DevOps and SRE teams do when they investigate production issues, perform routine maintenance, or respond to incidents.&lt;/p&gt;

&lt;p&gt;📋 Phase 1: Network &amp;amp; Connectivity Checks&lt;br&gt;
Before diving into application-level checks, I verified that the server could actually communicate with the outside world. Network issues are often the root cause of "it's down" scenarios.&lt;/p&gt;

&lt;p&gt;Check Network Interfaces&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
ip a&lt;br&gt;
What I observed: Active network interfaces with a valid private IP.&lt;/p&gt;

&lt;p&gt;Why it matters: If no interface is up, the server cannot communicate with anything — including you.&lt;/p&gt;

&lt;p&gt;Verify Default Gateway&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
ip route&lt;br&gt;
What I observed: Default gateway route is present.&lt;/p&gt;

&lt;p&gt;Why it matters: Without a default route, the server cannot reach external services or the internet.&lt;/p&gt;

&lt;p&gt;Test DNS Resolution&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
host pravinmishra.com&lt;br&gt;
What I observed: DNS resolution works — domain successfully resolved to IP.&lt;/p&gt;

&lt;p&gt;Why it matters: If DNS fails, applications cannot reach external APIs or services.&lt;/p&gt;

&lt;p&gt;Check Packet-Level Connectivity&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
ping -c 4 thecloudadvisory.com&lt;br&gt;
What I observed: 0% packet loss.&lt;/p&gt;

&lt;p&gt;Why it matters: Packet loss in production can indicate network instability or congestion.&lt;/p&gt;

&lt;p&gt;Inspect Open Ports&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo ss -tulpen&lt;br&gt;
What I observed:&lt;/p&gt;

&lt;p&gt;Port 22 → SSH (listening on 0.0.0.0)&lt;/p&gt;

&lt;p&gt;Port 80 → Nginx (listening on 0.0.0.0)&lt;/p&gt;

&lt;p&gt;No unexpected ports open&lt;/p&gt;

&lt;p&gt;Why it matters: Every open port is a potential attack surface. Only required services should be exposed.&lt;/p&gt;

&lt;p&gt;Check Firewall Status&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo ufw status&lt;br&gt;
What I observed: ufw not installed&lt;/p&gt;

&lt;p&gt;Why it matters: In production, firewall rules should restrict traffic to required ports only. This is a security gap that needs addressing.&lt;/p&gt;

&lt;p&gt;🚦 Phase 2: Service Health Validation&lt;br&gt;
Once network connectivity was confirmed, I validated that the Nginx service was running correctly.&lt;/p&gt;

&lt;p&gt;Check Service Status&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
systemctl status nginx --no-pager&lt;br&gt;
What I observed: Nginx service is active and running under systemd.&lt;/p&gt;

&lt;p&gt;Verify Boot-Time Enablement&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
systemctl is-enabled nginx&lt;br&gt;
What I observed: Nginx is enabled, meaning it starts automatically after reboot.&lt;/p&gt;

&lt;p&gt;Why it matters: Ensures service availability after server restarts.&lt;/p&gt;

&lt;p&gt;Test Configuration Syntax&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo nginx -t&lt;br&gt;
What I observed: Configuration syntax is valid.&lt;/p&gt;

&lt;p&gt;Why it matters: Always validate configuration before restarting to prevent downtime from bad configs.&lt;/p&gt;

&lt;p&gt;Verify Process Structure&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
ps aux | grep -E "nginx: master|nginx: worker" | grep -v grep&lt;br&gt;
What I observed: Both master and worker processes are running.&lt;/p&gt;

&lt;p&gt;Why it matters: Nginx uses a master process to manage workers. Missing worker processes means the service isn't actually serving traffic.&lt;/p&gt;

&lt;p&gt;Confirm PID on Port 80&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo ss -lptn '( sport = :80 )'&lt;br&gt;
What I observed: Nginx PID is correctly bound to port 80.&lt;/p&gt;

&lt;p&gt;Why it matters: Confirms the service is listening on the expected port.&lt;/p&gt;

&lt;p&gt;Perform Safe Restart Drill&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo systemctl restart nginx&lt;br&gt;
systemctl status nginx --no-pager&lt;br&gt;
What I observed: Restart completed successfully.&lt;/p&gt;

&lt;p&gt;Rollback plan: If nginx fails to restart, revert config changes and validate using nginx -t before restarting again.&lt;/p&gt;

&lt;p&gt;📊 Phase 3: Log Analysis&lt;br&gt;
Logs are the production engineer's best friend. I generated test traffic and examined what got logged.&lt;/p&gt;

&lt;p&gt;Generate Test Traffic&lt;br&gt;
bash&lt;br&gt;
curl -s &lt;a href="http://34.230.8.38" rel="noopener noreferrer"&gt;http://34.230.8.38&lt;/a&gt; &amp;gt; /dev/null&lt;br&gt;
curl -I &lt;a href="http://34.230.8.38" rel="noopener noreferrer"&gt;http://34.230.8.38&lt;/a&gt;&lt;br&gt;
Review Access Logs&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo tail -n 30 /var/log/nginx/access.log&lt;br&gt;
What I observed: My curl requests appeared in the logs, confirming traffic reached Nginx.&lt;/p&gt;

&lt;p&gt;Why it matters: Access logs show who is requesting what and help identify traffic patterns or attacks.&lt;/p&gt;

&lt;p&gt;Check Error Logs&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo tail -n 30 /var/log/nginx/error.log&lt;br&gt;
What I observed: No recent errors.&lt;/p&gt;

&lt;p&gt;Why it matters: Empty error logs suggest no current runtime failures — a good sign.&lt;/p&gt;

&lt;p&gt;Examine Systemd Journal&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo journalctl -u nginx --no-pager -n 50&lt;br&gt;
What I observed: Service-level events and restart history.&lt;/p&gt;

&lt;p&gt;Why it matters: Journal provides additional context that might not appear in application logs.&lt;/p&gt;

&lt;p&gt;💾 Phase 4: Resource Health&lt;br&gt;
Production services don't just need working software — they need healthy infrastructure.&lt;/p&gt;

&lt;p&gt;Check Uptime&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
uptime&lt;br&gt;
What I observed: Server has been running continuously.&lt;/p&gt;

&lt;p&gt;Review Memory Usage&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
free -h&lt;br&gt;
What I observed: Memory usage is within acceptable limits.&lt;/p&gt;

&lt;p&gt;Check Disk Space&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
df -h&lt;br&gt;
What I observed: Disk usage is below critical threshold.&lt;/p&gt;

&lt;p&gt;Inspect /var Directory Usage&lt;br&gt;
bash&lt;br&gt;
echo "Manjay Verma - Maintenance Drill"&lt;br&gt;
sudo du -sh /var/* | sort -h&lt;br&gt;
What I observed: No single directory consuming excessive space.&lt;/p&gt;

&lt;p&gt;Why it matters: If disk fills up completely, services cannot write logs and may crash. Monitoring disk usage prevents this.&lt;/p&gt;

&lt;p&gt;⚠️ Phase 5: Incident Simulation (The Best Part)&lt;br&gt;
Theory is useful, but practice is irreplaceable. I intentionally broke the configuration to understand real incident response.&lt;/p&gt;

&lt;p&gt;Break the Config&lt;br&gt;
bash&lt;br&gt;
sudo nano /etc/nginx/sites-available/default&lt;/p&gt;

&lt;h1&gt;
  
  
  Removed one semicolon to break the config
&lt;/h1&gt;

&lt;p&gt;Observe the Failure&lt;br&gt;
bash&lt;br&gt;
sudo nginx -t&lt;br&gt;
Result: Configuration test failed with syntax error.&lt;/p&gt;

&lt;p&gt;Fix and Recover&lt;br&gt;
bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Restored the missing semicolon
&lt;/h1&gt;

&lt;p&gt;sudo nginx -t           # Configuration test passes&lt;br&gt;
sudo systemctl restart nginx&lt;br&gt;
curl -I &lt;a href="http://34.230.8.38" rel="noopener noreferrer"&gt;http://34.230.8.38&lt;/a&gt;   # HTTP/1.1 200 OK&lt;br&gt;
Root Cause: Syntax error in nginx configuration (missing semicolon)&lt;/p&gt;

&lt;p&gt;Fix: Restored valid configuration and validated using nginx -t&lt;/p&gt;

&lt;p&gt;Prevention: Always test configuration before restarting. Never assume — verify.&lt;/p&gt;

&lt;p&gt;🔒 Security &amp;amp; Reliability Notes&lt;br&gt;
Based on my maintenance drill, here's the current security posture:&lt;/p&gt;

&lt;p&gt;✅ SSH access uses key-based authentication (no password login)&lt;/p&gt;

&lt;p&gt;✅ Open ports restricted to 22 (SSH) and 80 (HTTP)&lt;/p&gt;

&lt;p&gt;✅ Nginx is enabled on boot for automatic recovery&lt;/p&gt;

&lt;p&gt;✅ No secrets or private keys were exposed during this exercise&lt;/p&gt;

&lt;p&gt;⚠️ Firewall not configured — this should be addressed&lt;/p&gt;

&lt;p&gt;💡 Cost optimization: I will stop the EC2 instance when not in use to prevent unnecessary charges&lt;/p&gt;

&lt;p&gt;📌 Key Learnings&lt;br&gt;
This week taught me that real production validation goes far beyond checking if a website loads. Here's what I learned:&lt;/p&gt;

&lt;p&gt;Area    Key Takeaway&lt;br&gt;
Network Connectivity issues often masquerade as application problems&lt;br&gt;
Services    Verify not just "running" but "actually serving traffic"&lt;br&gt;
Logs    Logs tell the real story — access, errors, and system events&lt;br&gt;
Resources   Disk, memory, and CPU monitoring prevent surprises&lt;br&gt;
Incidents   Breaking things safely teaches more than reading docs&lt;br&gt;
Recovery    Always have a rollback plan and test configuration changes&lt;br&gt;
🚀 Next Steps&lt;br&gt;
This maintenance drill revealed both strengths and gaps. Moving forward, I will:&lt;/p&gt;

&lt;p&gt;Implement firewall rules to restrict traffic to only required ports&lt;/p&gt;

&lt;p&gt;Set up automated monitoring with alerts for:&lt;/p&gt;

&lt;p&gt;High disk usage&lt;/p&gt;

&lt;p&gt;Service failures&lt;/p&gt;

&lt;p&gt;Unusual traffic patterns&lt;/p&gt;

&lt;p&gt;Practice more failure scenarios to build muscle memory for incident response&lt;/p&gt;

&lt;p&gt;Document runbooks so recovery steps are clear and repeatable&lt;/p&gt;

&lt;p&gt;💭 Final Thoughts&lt;br&gt;
Production maintenance isn't glamorous, but it's essential. This drill simulated exactly what on-call engineers do daily: validate, investigate, fix, and learn.&lt;/p&gt;

&lt;p&gt;The most valuable takeaway? Simulating failures in a controlled environment builds confidence for handling real outages. By deliberately breaking and fixing Nginx, I experienced the full cycle of detection, diagnosis, recovery, and prevention — all without impacting real users.&lt;/p&gt;

&lt;p&gt;Have you performed similar maintenance drills? What unexpected issues did you discover? Share your experiences below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🚀 Running a 5-Day Mini Sprint in Jira and Shipping a Real Website Change to EC2</title>
      <dc:creator>FT MJ</dc:creator>
      <pubDate>Sun, 08 Mar 2026 19:22:33 +0000</pubDate>
      <link>https://dev.to/ft_mj_5b31d5ca700bb51d61f/running-a-5-day-mini-sprint-in-jira-and-shipping-a-real-website-change-to-ec2-3dc1</link>
      <guid>https://dev.to/ft_mj_5b31d5ca700bb51d61f/running-a-5-day-mini-sprint-in-jira-and-shipping-a-real-website-change-to-ec2-3dc1</guid>
      <description>&lt;p&gt;Hands-On DevOps: From Jira Sprint to Live Deployment on AWS EC2&lt;br&gt;
In this assignment, I practiced a real DevOps workflow by running a mini Scrum sprint in Jira, implementing a small improvement to a portfolio website, and deploying the change to a live server on AWS EC2.&lt;/p&gt;

&lt;p&gt;Rather than a big-bang release, the focus was on shipping small, incremental updates daily, tracking progress in Jira, and verifying each change on a public URL.&lt;/p&gt;

&lt;p&gt;The improvement was simple but meaningful:&lt;/p&gt;

&lt;p&gt;Pravin Mishra Portfolio v1.0 — Deployed on &lt;/p&gt;
&lt;dd&gt; — By Manjay verma

&lt;p&gt;This footer was added to the website and deployed live to an EC2 instance.&lt;/p&gt;

&lt;p&gt;🎯 Sprint Goal&lt;br&gt;
The sprint goal defined in Jira was:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ship a visible "Pravin Mishra Portfolio" footer (version + deploy date + author) to EC2 and document progress daily in Jira.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This simulated how real engineering teams commit to a measurable outcome for each sprint.&lt;/p&gt;

&lt;p&gt;🧩 Sprint Setup in Jira&lt;br&gt;
The sprint was managed using the following workflow:&lt;/p&gt;

&lt;p&gt;Create a Story in Jira&lt;/p&gt;

&lt;p&gt;Break it into 5 daily subtasks&lt;/p&gt;

&lt;p&gt;Track daily updates using Daily Scrum comments&lt;/p&gt;

&lt;p&gt;Move tasks across the board&lt;/p&gt;

&lt;p&gt;Track progress using the Burndown Chart&lt;/p&gt;

&lt;p&gt;Subtasks created:&lt;/p&gt;

&lt;p&gt;Day 1 — Implement footer &amp;amp; deploy&lt;/p&gt;

&lt;p&gt;Day 2 — Make deploy date dynamic&lt;/p&gt;

&lt;p&gt;Day 3 — Polish UI &amp;amp; improve accessibility&lt;/p&gt;

&lt;p&gt;Day 4 — Update homepage tagline&lt;/p&gt;

&lt;p&gt;Day 5 — Demo + retro + review burndown&lt;/p&gt;

&lt;p&gt;This structure ensured that progress was visible and measurable every single day.&lt;/p&gt;

&lt;p&gt;🏗️ DevOps Workflow Used&lt;br&gt;
The workflow followed a typical DevOps pipeline:&lt;/p&gt;

&lt;p&gt;Code changes locally&lt;/p&gt;

&lt;p&gt;Commit using Git&lt;/p&gt;

&lt;p&gt;Deploy to EC2&lt;/p&gt;

&lt;p&gt;Verify on public website&lt;/p&gt;

&lt;p&gt;Update Jira ticket&lt;/p&gt;

&lt;p&gt;📊 Project Workflow Diagram&lt;br&gt;
text&lt;br&gt;
┌─────────────────────────┐&lt;br&gt;
│        Jira Sprint      │&lt;br&gt;
│ Story + Subtasks        │&lt;br&gt;
│ Daily Scrum Updates     │&lt;br&gt;
└────────────┬────────────┘&lt;br&gt;
             │&lt;br&gt;
             ▼&lt;br&gt;
┌─────────────────────────┐&lt;br&gt;
│     Local Development   │&lt;br&gt;
│ Edit HTML/CSS/JS        │&lt;br&gt;
│ Add Footer Feature      │&lt;br&gt;
└────────────┬────────────┘&lt;br&gt;
             │ Git Commit&lt;br&gt;
             ▼&lt;br&gt;
┌─────────────────────────┐&lt;br&gt;
│         Git Repo        │&lt;br&gt;
│ Version Control         │&lt;br&gt;
│ Feature Branch          │&lt;br&gt;
└────────────┬────────────┘&lt;br&gt;
             │ Deploy via SCP&lt;br&gt;
             ▼&lt;br&gt;
┌─────────────────────────┐&lt;br&gt;
│        AWS EC2 Server   │&lt;br&gt;
│ Nginx Web Server        │&lt;br&gt;
│ Portfolio Website       │&lt;br&gt;
└────────────┬────────────┘&lt;br&gt;
             │ Public Access&lt;br&gt;
             ▼&lt;br&gt;
┌─────────────────────────┐&lt;br&gt;
│      Live Website       │&lt;br&gt;
│ Footer Version Visible  │&lt;br&gt;
│ Deploy Date + Author    │&lt;br&gt;
└─────────────────────────┘&lt;br&gt;
⚙️ Day-by-Day Sprint Execution&lt;br&gt;
Day 1 — Implement Footer and Deploy&lt;br&gt;
The first task was to add a footer section to the HTML template:&lt;/p&gt;

&lt;p&gt;html&lt;/p&gt;

&lt;p&gt;Pravin Mishra Portfolio v1.0 — Deployed on 09 Mar 2026 — By Manjay&lt;/p&gt;

&lt;p&gt;After implementing the footer:&lt;/p&gt;

&lt;p&gt;Changes were committed using Git&lt;/p&gt;

&lt;p&gt;The site was deployed to EC2&lt;/p&gt;

&lt;p&gt;The footer appeared on the live website&lt;/p&gt;

&lt;p&gt;This step validated the end-to-end delivery pipeline.&lt;/p&gt;

&lt;p&gt;Day 2 — Make Deploy Date Dynamic&lt;br&gt;
To improve the feature, the deploy date was generated automatically using JavaScript:&lt;/p&gt;

&lt;p&gt;html&lt;br&gt;
&lt;span id="deployDate"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;const d = new Date();&lt;br&gt;
const options = { day: '2-digit', month: 'short', year: 'numeric' };&lt;br&gt;
document.getElementById("deployDate").innerText =&lt;br&gt;
  d.toLocaleDateString('en-GB', options);&lt;/p&gt;

&lt;p&gt;Now the footer automatically displays the current deployment date, eliminating manual updates.&lt;/p&gt;

&lt;p&gt;Day 3 — UI Polish and Accessibility&lt;br&gt;
The footer was enhanced for better usability and accessibility:&lt;/p&gt;

&lt;p&gt;Improvements included:&lt;/p&gt;

&lt;p&gt;Increased padding&lt;/p&gt;

&lt;p&gt;Better font size and contrast&lt;/p&gt;

&lt;p&gt;Responsive layout testing&lt;/p&gt;

&lt;p&gt;The UI was verified on both desktop and mobile views using browser DevTools.&lt;/p&gt;

&lt;p&gt;Day 4 — Update Homepage Tagline&lt;br&gt;
The homepage text was updated to promote the DevOps learning community:&lt;/p&gt;

&lt;p&gt;Join DMI Cohort 3 on Discord and start your DevOps journey&lt;/p&gt;

&lt;p&gt;This change improved community visibility and engagement.&lt;/p&gt;

&lt;p&gt;Day 5 — Demo, Retro, and Burndown Review&lt;br&gt;
The final day focused on reviewing the sprint:&lt;/p&gt;

&lt;p&gt;Activities included:&lt;/p&gt;

&lt;p&gt;Recording a demo of the live website&lt;/p&gt;

&lt;p&gt;Showing the footer with version, date, and author&lt;/p&gt;

&lt;p&gt;Reviewing the burndown chart in Jira&lt;/p&gt;

&lt;p&gt;Writing retrospective notes&lt;/p&gt;

&lt;p&gt;Retrospective Example:&lt;/p&gt;

&lt;p&gt;What went well  What to improve&lt;br&gt;
Daily incremental updates helped maintain momentum  Automating deployment using CI/CD would improve efficiency&lt;br&gt;
DevOps principle observed: Continuous Delivery&lt;/p&gt;

&lt;p&gt;📈 Key DevOps Learnings&lt;br&gt;
This assignment demonstrated several important DevOps practices:&lt;/p&gt;

&lt;p&gt;1️⃣ Incremental Delivery&lt;br&gt;
Instead of one large change, small improvements were delivered daily, reducing risk and enabling faster feedback.&lt;/p&gt;

&lt;p&gt;2️⃣ Traceability&lt;br&gt;
Every change was tracked in Jira and linked to the user story, creating a clear audit trail.&lt;/p&gt;

&lt;p&gt;3️⃣ Deployment Proof&lt;br&gt;
Each change was verified on a public EC2 URL, confirming that the feature worked in production.&lt;/p&gt;

&lt;p&gt;4️⃣ Agile Collaboration&lt;br&gt;
Using stories, subtasks, and daily scrum updates mirrors how real Scrum teams operate.&lt;/p&gt;

&lt;p&gt;🌍 Final Result&lt;br&gt;
By the end of the sprint:&lt;/p&gt;

&lt;p&gt;✔ A visible footer was deployed&lt;br&gt;
✔ The deploy date was automated with JavaScript&lt;br&gt;
✔ UI was polished and accessibility improved&lt;br&gt;
✔ The homepage tagline was updated&lt;br&gt;
✔ All changes were tracked through Jira&lt;br&gt;
✔ The website was live on EC2&lt;/p&gt;

&lt;p&gt;This exercise demonstrated how Agile + DevOps workflows help teams ship reliable improvements quickly and consistently.&lt;/p&gt;

&lt;p&gt;💡 Final Thoughts&lt;br&gt;
This mini sprint highlighted a fundamental principle:&lt;/p&gt;

&lt;p&gt;Small daily improvements with proof are better than one large delayed release.&lt;/p&gt;

&lt;p&gt;By combining Jira sprint management, Git version control, and EC2 deployment, this assignment simulated a real-world DevOps delivery cycle — proving that even simple improvements can teach powerful lessons when executed with the right processes.&lt;/p&gt;


&lt;/dd&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>FullStack Diaries</title>
      <dc:creator>FT MJ</dc:creator>
      <pubDate>Sun, 22 Feb 2026 15:52:44 +0000</pubDate>
      <link>https://dev.to/ft_mj_5b31d5ca700bb51d61f/fullstack-diaries-kb9</link>
      <guid>https://dev.to/ft_mj_5b31d5ca700bb51d61f/fullstack-diaries-kb9</guid>
      <description>&lt;p&gt;From Local Git to Live EC2 Deployment — My DevOps Week 3 Journey (DMI Cohort 2)&lt;/p&gt;

&lt;p&gt;Author: Manjay Verma&lt;br&gt;
Program: DevOps Micro Internship (DMI) — Cohort 2&lt;br&gt;
Week: 3 — Git &amp;amp; GitHub Workflow&lt;/p&gt;

&lt;p&gt;🌟 Introduction&lt;/p&gt;

&lt;p&gt;As part of the DevOps Micro Internship (DMI), Week 3 focused on mastering Git, GitHub collaboration workflows, and deploying a real static website on AWS EC2 using Nginx.&lt;/p&gt;

&lt;p&gt;This week transformed my understanding of:&lt;/p&gt;

&lt;p&gt;Version control systems&lt;/p&gt;

&lt;p&gt;Branching strategies&lt;/p&gt;

&lt;p&gt;Open-source contribution workflow&lt;/p&gt;

&lt;p&gt;Production-style deployment on Linux servers&lt;/p&gt;

&lt;p&gt;This blog documents my complete hands-on journey.&lt;/p&gt;

&lt;p&gt;Part 1: Setting Up Git Locally&lt;br&gt;
Created a Project Repository&lt;/p&gt;

&lt;p&gt;I created a project named:&lt;/p&gt;

&lt;p&gt;CodeTrack&lt;/p&gt;

&lt;p&gt;Initialized Git:&lt;/p&gt;

&lt;p&gt;git init&lt;br&gt;
🔍 What I Learned&lt;/p&gt;

&lt;p&gt;Git tracks changes using snapshots.&lt;/p&gt;

&lt;p&gt;.git directory stores commit history.&lt;/p&gt;

&lt;p&gt;Version control prevents accidental loss of code.&lt;/p&gt;

&lt;p&gt;🔹 Part 2: Git Identity Configuration&lt;/p&gt;

&lt;p&gt;Configured Git identity locally and globally:&lt;/p&gt;

&lt;p&gt;git config user.name "Manjay Verma"&lt;br&gt;
git config user.email "..."&lt;br&gt;
🔍 Key Learning&lt;/p&gt;

&lt;p&gt;Local config applies per repository.&lt;/p&gt;

&lt;p&gt;Global config applies system-wide.&lt;/p&gt;

&lt;p&gt;Enterprise environments prefer local config.&lt;/p&gt;

&lt;p&gt;🔹 Part 3: Staging, Committing &amp;amp; Clean History&lt;/p&gt;

&lt;p&gt;Created:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;style.css&lt;/p&gt;

&lt;p&gt;Performed staged commits:&lt;/p&gt;

&lt;p&gt;git add .&lt;br&gt;
git commit -m "Initial commit: Add index and style files"&lt;/p&gt;

&lt;p&gt;Then made a small change and committed separately.&lt;/p&gt;

&lt;p&gt;🔍 What I Learned&lt;/p&gt;

&lt;p&gt;Clean commit messages improve collaboration.&lt;/p&gt;

&lt;p&gt;Small commits are easier to review.&lt;/p&gt;

&lt;p&gt;Commit history tells the project story.&lt;/p&gt;

&lt;p&gt;🔹 Part 4: Branching Workflow (Feature-Based Development)&lt;/p&gt;

&lt;p&gt;Created feature branch:&lt;/p&gt;

&lt;p&gt;git checkout -b feature/contact-page&lt;/p&gt;

&lt;p&gt;Added:&lt;/p&gt;

&lt;p&gt;contact.html&lt;/p&gt;

&lt;p&gt;Updated index.html&lt;/p&gt;

&lt;p&gt;Merged back to main:&lt;/p&gt;

&lt;p&gt;git merge feature/contact-page&lt;br&gt;
🔍 Key Learning&lt;/p&gt;

&lt;p&gt;Feature branches isolate development.&lt;/p&gt;

&lt;p&gt;Main branch remains stable.&lt;/p&gt;

&lt;p&gt;This is industry-standard Git workflow.&lt;/p&gt;

&lt;p&gt;🔹 Part 5: GitHub Collaboration Workflow&lt;/p&gt;

&lt;p&gt;Steps followed:&lt;/p&gt;

&lt;p&gt;Forked upstream repository&lt;/p&gt;

&lt;p&gt;Cloned my fork&lt;/p&gt;

&lt;p&gt;Added upstream remote&lt;/p&gt;

&lt;p&gt;Created feature branch&lt;/p&gt;

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

&lt;p&gt;Created Pull Request&lt;/p&gt;

&lt;p&gt;git remote add upstream &lt;br&gt;
git push origin feature/update-readme&lt;br&gt;
🔍 What I Learned&lt;/p&gt;

&lt;p&gt;Difference between origin and upstream&lt;/p&gt;

&lt;p&gt;Why forks are required in open-source&lt;/p&gt;

&lt;p&gt;How Pull Requests enable collaboration&lt;/p&gt;

&lt;p&gt;🔹 Part 6: Deploying to AWS EC2 (Production-Style)&lt;/p&gt;

&lt;p&gt;Launched instance in:&lt;/p&gt;

&lt;p&gt;Asia Pacific (Mumbai)&lt;/p&gt;

&lt;p&gt;Using:&lt;/p&gt;

&lt;p&gt;Ubuntu 22.04&lt;/p&gt;

&lt;p&gt;t2.micro (Free Tier)&lt;/p&gt;

&lt;p&gt;Security Group (SSH + HTTP)&lt;/p&gt;

&lt;p&gt;Connected via SSH:&lt;/p&gt;

&lt;p&gt;ssh -i codetrack-key.pem ubuntu@&lt;/p&gt;

&lt;p&gt;Installed Nginx:&lt;/p&gt;

&lt;p&gt;sudo apt update&lt;br&gt;
sudo apt install nginx -y&lt;/p&gt;

&lt;p&gt;Deployed static site to:&lt;/p&gt;

&lt;p&gt;/var/www/html/&lt;br&gt;
🌍 Live Deployment Result&lt;/p&gt;

&lt;p&gt;My website is now live on AWS EC2 using Nginx.&lt;/p&gt;

&lt;p&gt;This gave me hands-on experience with:&lt;/p&gt;

&lt;p&gt;Linux server management&lt;/p&gt;

&lt;p&gt;Security Groups&lt;/p&gt;

&lt;p&gt;Public IP configuration&lt;/p&gt;

&lt;p&gt;Service management using systemctl&lt;/p&gt;

&lt;p&gt;🔥 Production-Level Checks Performed&lt;br&gt;
sudo systemctl status nginx&lt;br&gt;
curl localhost&lt;br&gt;
netstat -tulpn | grep 80&lt;br&gt;
🔍 What I Learned&lt;/p&gt;

&lt;p&gt;Always verify services are running.&lt;/p&gt;

&lt;p&gt;Always test port bindings.&lt;/p&gt;

&lt;p&gt;Deployment is not complete until verified.&lt;/p&gt;

&lt;p&gt;🚧 Challenges Faced&lt;br&gt;
❌ SSH Connection Timeout&lt;/p&gt;

&lt;p&gt;Fixed by correcting Security Group inbound rules.&lt;/p&gt;

&lt;p&gt;❌ GitHub 403 Permission Error&lt;/p&gt;

&lt;p&gt;Fixed by properly forking repository and setting correct origin.&lt;/p&gt;

&lt;p&gt;❌ "origin does not appear to be a git repository"&lt;/p&gt;

&lt;p&gt;Fixed by adding remote URL.&lt;/p&gt;

&lt;p&gt;Each issue strengthened my troubleshooting skills.&lt;/p&gt;

&lt;p&gt;🎯 Key DevOps Concepts Practiced&lt;/p&gt;

&lt;p&gt;Git internals&lt;/p&gt;

&lt;p&gt;Branching strategy&lt;/p&gt;

&lt;p&gt;Clean commit hygiene&lt;/p&gt;

&lt;p&gt;Fork &amp;amp; PR workflow&lt;/p&gt;

&lt;p&gt;Linux server configuration&lt;/p&gt;

&lt;p&gt;Nginx deployment&lt;/p&gt;

&lt;p&gt;Security best practices&lt;/p&gt;

&lt;p&gt;🧠 My Biggest Takeaway&lt;/p&gt;

&lt;p&gt;DevOps is not just about tools — it’s about:&lt;/p&gt;

&lt;p&gt;Clean workflow&lt;/p&gt;

&lt;p&gt;Reproducibility&lt;/p&gt;

&lt;p&gt;Verification&lt;/p&gt;

&lt;p&gt;Security awareness&lt;/p&gt;

&lt;p&gt;Professional documentation&lt;/p&gt;

&lt;p&gt;This week moved me closer to real-world DevOps engineering practices.&lt;/p&gt;

&lt;p&gt;🚀 What’s Next?&lt;/p&gt;

&lt;p&gt;Next goals:&lt;/p&gt;

&lt;p&gt;Automate deployment using CI/CD&lt;/p&gt;

&lt;p&gt;Use GitHub Actions&lt;/p&gt;

&lt;p&gt;Attach custom domain&lt;/p&gt;

&lt;p&gt;Deploy using Docker&lt;/p&gt;

&lt;p&gt;🙌 Acknowledgment&lt;/p&gt;

&lt;p&gt;Thanks to the DevOps Micro Internship (DMI) program and mentors for structured hands-on guidance.&lt;/p&gt;

&lt;h1&gt;
  
  
  Docker
&lt;/h1&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>git</category>
      <category>github</category>
    </item>
  </channel>
</rss>
