From e4572e71952ca257ff492a0144a9e97fb576accd Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Tue, 19 May 2026 11:40:29 +0530 Subject: [PATCH 01/76] Create learning plan for DevOps and Cloud Engineering Added a learning plan outlining understanding of DevOps and Cloud Engineering, reasons for learning, career goals, and consistency strategies. --- 2026/day-01/learning-plan.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2026/day-01/learning-plan.md diff --git a/2026/day-01/learning-plan.md b/2026/day-01/learning-plan.md new file mode 100644 index 0000000000..9689aeee3c --- /dev/null +++ b/2026/day-01/learning-plan.md @@ -0,0 +1,31 @@ +THE CLEAR ANSWER FOR MY WHAT WHY HOW ? + + + +What is your understanding of DevOps and Cloud Engineering? + +DevOps is a practice or mindset that an organization follows to develop applications and software efficiently and effectively. +It helps bridge the gap between the development team and the operations team. It automates daily tasks to reduce the chance of mistakes and save time. +Meanwhile, Cloud Engineers are the ones who manage and perform these tasks on cloud servers. Collectively, they help the organization deploy changes efficiently and quickly. + + + +Why are you starting to learn DevOps & Cloud? + +As per the latest IT trends, DevOps and Cloud Engineering jobs are among the highest-paying, and there is a high demand for these roles in the market. +This career path also provides me with the opportunity to work remotely. + + + +Where do you want to reach? + +I want to become a Senior DevOps Engineer or Cloud Architect where I can design scalable, automated infrastructure for global applications. +Ultimately, my goal is to reach a level of expertise where I can lead technical projects, mentor others, and enjoy the flexibility of working from anywhere in the world. + + + +How will you stay consistent every single day? + +It is my own dream, so following my dream is what keeps me consistent. + + From 81b9256e9c9a564683a2e7b814f9e44384b5055e Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Tue, 19 May 2026 17:41:45 +0530 Subject: [PATCH 02/76] Basics of linux architecture --- 2026/day-02/linux-architecture-notes.md | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2026/day-02/linux-architecture-notes.md diff --git a/2026/day-02/linux-architecture-notes.md b/2026/day-02/linux-architecture-notes.md new file mode 100644 index 0000000000..348e898fae --- /dev/null +++ b/2026/day-02/linux-architecture-notes.md @@ -0,0 +1,54 @@ +Day 2 Today’s goal is to understand how Linux works. + +Short notes: + +The core components of Linux (kernel, user space, init/systemd) + +Kernel: Think of it as the brain. It allocates resources ("CPU," "RAM," "Disk") to various processes for a specific amount of time. +It can directly communicate with the hardware of the system and is also known as the core of Linux. + +User Space: This is the space where all applications, programs, and shells (like Bash) run. +Because they cannot directly interact with the hardware, they do so with the help of the kernel. + +init/systemd: It is the very first process that starts after your system boots Linux, and its PID is always 1. +It acts like a parent process that sets up your system to work. + + + +How processes are created and managed + +Processes are simply a running instance of a program. +IN Linux we have 2 ways to create a process, 1st one is fork() "clone the current processes" 2nd exec() "REplace the clone with the new program" + +To manage these processes we use its different states + +Running (R): The process is actively executing on the CPU or is in the queue ready to execute. + +Sleeping (S / D): The process is resting, waiting for an event or resource. +Interruptible (S): Waiting for user input or a timer. +Uninterruptible (D): Deep sleep, usually waiting on disk or network I/O. + +Stopped (T): The process has been suspended or paused (e.g., by pressing Ctrl+Z in the terminal). + +Zombie (Z): The process has finished executing and is dead, but its parent process hasn't checked its exit status yet. +It is essentially a "ghost" lingering in the process table. + + + +What systemd does and why it matters + +systemd is kind of a modern system and service manager for Linux. +It boots the system, manages background services, and handles logging. + +It amtters because it allows services to start in parallel (making boots faster), automatically restarts crashed applications, and it is a primary tool for diagnosing +why a web server or database failed to launch. + + + +5 Daily Commands for DevOps + +ps aux: provdide the information about the current running processes and who owns them +top: It shows the live details of running processes in a more interactive way +kill -9 : kills the frozen or dead process forcefully +systemctl status : it checks the background runing processes details like nginx, docker etc. +journalctl -u : Reads the specific logs for a systemd service. This is the first stop when an application fails to start. From 0fbafa15356361c4743bb382e143a95e1543e692 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 20 May 2026 12:16:29 +0530 Subject: [PATCH 03/76] linux-commands-cheatsheet with networking commands Added networking commands to the Linux commands cheat sheet and removed unnecessary content. --- 2026/day-03/linux-commands-cheatsheet.md | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 2026/day-03/linux-commands-cheatsheet.md diff --git a/2026/day-03/linux-commands-cheatsheet.md b/2026/day-03/linux-commands-cheatsheet.md new file mode 100644 index 0000000000..9d924ee0ec --- /dev/null +++ b/2026/day-03/linux-commands-cheatsheet.md @@ -0,0 +1,41 @@ +Day 03 – Linux Commands Practice + +Today’s goal is to build a Linux command confidence. + +I created a cheat sheet of commands focused on: + + +Process management + +pwd: Prints the current working directory (where are we right now). +ls -la: Lists all files (including hidden ones) with detailed ownership and permission info. +cd /path/to/dir — Changes your directory to the specified path. +mkdir: Creates a new directory. +rm -rf /folder: Forcefully and recursively removes a folder and its contents (use with extreme caution). +cp source.txt dest.txt: Copies a file or directory to a new location. +mv oldname.txt newname.txt — Moves a file, or renames it if the destination is in the same folder. +cat file.txt: Prints the entire contents of a file directly to your terminal. +tail -f /var/log/syslog — Continuously shows the end of a log file as new lines are added. +grep "error" file.txt — Searches inside a file and outputs only the lines containing the specific word. +chmod +x script.sh — Changes the permissions of a file to make it executable. +chown user:group file.txt — Changes the owner and group assigned to a file or directory. + + +File system + +ps aux: Captures a snapshot of every single process currently running on the system. +top: Opens a live, interactive dashboard showing CPU, memory usage, and active processes. +kill -9 — Forcefully terminates a stuck or rogue process using its Process ID. +df -h — Shows available disk space on your hard drives in a human-readable format (MB/GB). +systemctl status docker — Checks if a background service (like Docker or Nginx) is running or failed. +systemctl restart docker — Stops and immediately starts a service to apply new configurations. +journalctl -u docker — Retrieves the specific background logs for a systemd service to diagnose crashes. + + +Networking troubleshooting + +ping google.com — Tests network connectivity by providing a continuous response. +ip addr — Displays the IP addresses currently assigned to your machine's network interfaces. +curl -I https://google.com : Fetches the HTTP headers of a website to test if the web server is responding. +dig domain.com — Queries the DNS records to see exactly which IP address a domain name points to. +netstat -tulpn — Lists all open network ports on your machine and shows which processes are using them. From e8c2d3e63518455667f4be961db1614d9e226808 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 20 May 2026 18:02:20 +0530 Subject: [PATCH 04/76] Add Linux commands practice notes Added hands-on practice notes for Linux commands, including process checks, system checks, log checks, and troubleshooting steps. --- 2026/day-04/linux-practice.md | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 2026/day-04/linux-practice.md diff --git a/2026/day-04/linux-practice.md b/2026/day-04/linux-practice.md new file mode 100644 index 0000000000..49257174a6 --- /dev/null +++ b/2026/day-04/linux-practice.md @@ -0,0 +1,68 @@ +Day 4 Hands on practice of linux commands + +Process Checks + + +How to check for a particular process? + +pgrep -a cron + 888 /usr/sbin/cron -f -P #888 is the PID + +what is the command used to check the bussiest processes + +top -n 1 # we use -n 1 for the current time glimpes + 2399 sachin 20 0 397512 12372 7068 S 8.3 0.1 0:02.55 ibus-da+ + + +System Checks + +Command used to know the helth of a proceses by the system + +systemctl status cron +## It tells you the detail explantion about that process + +systemctl is-active cron +## It tell in one word wheather the system is active or not + + +Log Checks + +Command used to read the service's diary + +journalctl -u cron -n 5 # used to check for a particular services + May 20 17:35:01 sachin-H510M-K-V2 CRON[4337]: (root) CMD (command -v debian-sa1> + May 20 17:35:01 sachin-H510M-K-V2 CRON[4336]: pam_unix(cron:session): session c> + May 20 17:45:01 sachin-H510M-K-V2 CRON[4491]: pam_unix(cron:session): session o> + May 20 17:45:01 sachin-H510M-K-V2 CRON[4492]: (root) CMD (command -v debian-sa1> + May 20 17:45:01 sachin-H510M-K-V2 CRON[4491]: pam_unix(cron:session): session c> + +Command used to read the general system diary + +tail -n 10 /var/log/syslog + 2026-05-20T17:46:40.135011+05:30 sachin-H510M-K-V2 systemd[1]: bluetooth.service - Bluetooth service was skipped because of an unmet condition check (ConditionPathIsDirectory=/sys/class/bluetooth). + 2026-05-20T17:46:42.135821+05:30 sachin-H510M-K-V2 fwupd[4539]: 12:16:42.135 FuMain fwupd 1.9.34 ready for requests (locale en_US.UTF-8) + 2026-05-20T17:46:42.137093+05:30 sachin-H510M-K-V2 dbus-daemon[863]: [system] Successfully activated service 'org.freedesktop.fwupd' + 2026-05-20T17:46:42.137280+05:30 sachin-H510M-K-V2 systemd[1]: Started fwupd.service - Firmware update daemon. + 2026-05-20T17:46:42.170833+05:30 sachin-H510M-K-V2 systemd[1]: fwupd-refresh.service: Deactivated successfully. + 2026-05-20T17:46:42.170976+05:30 sachin-H510M-K-V2 systemd[1]: Finished fwupd-refresh.service - Refresh fwupd metadata and update motd. + 2026-05-20T17:50:07.078599+05:30 sachin-H510M-K-V2 systemd[1]: Starting sysstat-collect.service - system activity accounting tool... + 2026-05-20T17:50:07.081690+05:30 sachin-H510M-K-V2 systemd[1]: sysstat-collect.service: Deactivated successfully. + 2026-05-20T17:50:07.081777+05:30 sachin-H510M-K-V2 systemd[1]: Finished sysstat-collect.service - system activity accounting tool. + 2026-05-20T17:50:59.521976+05:30 sachin-H510M-K-V2 google-chrome.desktop[3048]: [3041:3041:0520/175059.521196:ERROR:ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc:179] Invalid state when trying to start drag. source=kMouse + + +Mini Troubleshooting Steps +If you ever check a service and it says inactive or failed, here is the exact sequence to fix it + +1.Restart the service:Turning it off and on again fixes 90% of issues. +Run sudo systemctl restart cron + +2.Verify it worked: +Run systemctl status cron to make sure it says active (running). + +3.Check for errors:If it still fails, +run journalctl -u cron -e to jump to the very end of the logs and read the red error messages to see exactly what broke. + + + + From 1d5cd10858a5a6477b6f3beac53021927f7e6337 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Fri, 22 May 2026 14:58:06 +0530 Subject: [PATCH 05/76] Add notes on Linux file I/O commands Documented various commands for reading and writing text files in Linux, including creating, appending, and displaying file contents. --- 2026/day-06/notes-file-op.md | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 2026/day-06/notes-file-op.md diff --git a/2026/day-06/notes-file-op.md b/2026/day-06/notes-file-op.md new file mode 100644 index 0000000000..4440a0a6a8 --- /dev/null +++ b/2026/day-06/notes-file-op.md @@ -0,0 +1,46 @@ +Day 6: Linux Fundamentals – Read and Write Text Files +File: file-io-practice.md + +Today’s focus is on manipulating text files directly from the command line. Instead of opening a text editor, I used basic input/output redirection to create, write, and read files. + +1. Creating the File +Command: touch notes.txt + +What it did: Created a completely empty file named notes.txt. (If the file already existed, it would just update the "last modified" timestamp without changing the actual text). + +2. Writing Text (The Dangerous Way) +Command: echo "Line 1: Starting my Linux file practice." > notes.txt + +What it did: The single > symbol is a redirect. It took the text from echo and pushed it into the file. + +Note: A single > will overwrite everything currently in the file. It is a destructive command! + +3. Appending Text (The Safe Way) +Command: echo "Line 2: Appending this line so I don't lose Line 1." >> notes.txt + +What it did: The double >> safely added this new text to the very bottom of the file without deleting the first line. + +4. Writing and Viewing Simultaneously +Command: echo "Line 3: Using tee is pretty cool." | tee -a notes.txt + +What it did: The tee command splits the output like a "T" junction in a pipe. It printed the text to my terminal screen and safely appended it (-a) to the file at the same time. + +5. Reading the Full File +Command: cat notes.txt + +What it did: Read and displayed the entire content of the file in the terminal. I could see all three of my lines perfectly. + +6. Reading Parts of the File +Command: head -n 2 notes.txt + +What it did: Displayed only the top 2 lines of the file. This is great for peeking at the beginning of huge files without flooding the terminal screen. + +Command: tail -n 2 notes.txt + +What it did: Displayed only the bottom 2 lines of the file. This is exactly what I would use to check the most recent entries at the very end of a system log file. + +7. Command used to do both at same time + + tee: it works as echo "This line will print on terminal as well as saved in a file" | tee -a /var/location-of-file.txt + + From 07bb60dfb7a6e2edf14a8fa041c37edcc5e07f3f Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Fri, 22 May 2026 14:59:40 +0530 Subject: [PATCH 06/76] Add Nginx health and troubleshooting runbook --- 2026/day-05/helth-and-troubleshooting.md | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 2026/day-05/helth-and-troubleshooting.md diff --git a/2026/day-05/helth-and-troubleshooting.md b/2026/day-05/helth-and-troubleshooting.md new file mode 100644 index 0000000000..a29623d77b --- /dev/null +++ b/2026/day-05/helth-and-troubleshooting.md @@ -0,0 +1,46 @@ +Mini Runbook: Nginx Health & Troubleshooting +Target Service: nginx +Objective: Capture a system health snapshot, verify filesystem sanity, and trace service logs. + +1. Environment Basics +Command: uname -a and cat /etc/os-release + +Observation: Successfully identified the operating system version and kernel details before starting work. + +2. Filesystem Sanity +Command: mkdir /tmp/runbook-demo && cp /etc/hosts /tmp/runbook-demo/hosts-replica && ls -l /tmp/runbook-demo + +Observation: Verified that basic read/write permissions are working perfectly in the /tmp directory. + +3. CPU & Memory Health +Command: pgrep nginx (to get the PID) followed by ps -o pcpu,pmem,comm -p + +Observation: Nginx is running and consuming minimal CPU and memory resources. + +Command: free -h + +Observation: System RAM has plenty of available overhead. + +4. Disk & I/O +Command: df -h and du -sh /var/log + +Observation: Disk partitions have sufficient free space, and the /var/log directory is not taking up abnormal amounts of storage. + +5. Network Connections +Command: ss -tulpn | grep nginx + +Observation: Confirmed Nginx is actively listening on its assigned ports (usually 80 and/443) and there are no dead connections (curl -I). + +6. Log Tracing +Command: journalctl -u nginx -n 50 and tail -n 50 /var/log/kern.log + +Observation: Scanned the last 50 lines of both the Nginx specific logs and the general kernel logs. No critical errors or warnings detected. + +🚨 If This Worsens (Escalation Steps) +If Nginx becomes unresponsive or spikes in resource usage, I will take these 3 steps: + +Test Configuration & Restart: Run nginx -t to ensure no syntax errors exist, then run sudo systemctl restart nginx to clear the stalled process. + +Increase Log Verbosity: Modify the Nginx configuration to enable "debug" level logging to catch exactly where requests are failing. + +Trace System Calls: Use strace -p on the Nginx worker process to see if it is getting stuck trying to read a specific file or connect to a backend database. From b0e72d9d71a64499979ebccffbbf799d5b38ff6b Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Sat, 23 May 2026 08:56:52 +0530 Subject: [PATCH 07/76] Phaase one changes Added an overview of the Linux file system hierarchy and its key directories. --- 2026/day-07/day-07-linux-fs-and-scenarios.md | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 2026/day-07/day-07-linux-fs-and-scenarios.md diff --git a/2026/day-07/day-07-linux-fs-and-scenarios.md b/2026/day-07/day-07-linux-fs-and-scenarios.md new file mode 100644 index 0000000000..f2671da21d --- /dev/null +++ b/2026/day-07/day-07-linux-fs-and-scenarios.md @@ -0,0 +1,29 @@ +1. Linux File System Hierarchy + +"/" : This is the root directory it is the topmost level of the entire file system hierarchy + it contains various major directories/files within it like "boot" "bin" "etc" "home" and much more. + i would use this directory when i have to figure out anything about the system + +"/home" : This is a dedicated, private space for each user account + It contains the name of the users using your system + I would use this directory when i have to search for any users + +"/root" : It is the home directory of the admin + It contanis admin dedicated things + NOrmal user can't open this directory + +"/etc" : It is the central hub for system-wide configuration files + It contains all the files that describes or tells the operating system how to perform "ssh" "cron" + I will use this directory when i have to check any deep information about any process + +"/var/log" : This directory is very essential in linux as it saves the record of everything that happens in your system + it contains "boot" "config" "syslog" + this will often used widely by me to check for any faults + +"/tmp" : As the name suggest it stores only the temprory files that are created by users, os, procesees. + It shows folders for different application like for the chrome "com.google.Chrome.DLjzx0" + I will use it to store my temporary files. + + + +3. 2. Scenario Practice From e9512fa4036ac9dcb58bcdbc5fa08e17a2cc1556 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Sat, 23 May 2026 22:16:57 +0530 Subject: [PATCH 08/76] final edit Corrected typos, improved clarity, and added explanations for various Linux directories and commands. --- 2026/day-07/day-07-linux-fs-and-scenarios.md | 49 ++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/2026/day-07/day-07-linux-fs-and-scenarios.md b/2026/day-07/day-07-linux-fs-and-scenarios.md index f2671da21d..8320dfc247 100644 --- a/2026/day-07/day-07-linux-fs-and-scenarios.md +++ b/2026/day-07/day-07-linux-fs-and-scenarios.md @@ -8,7 +8,7 @@ It contains the name of the users using your system I would use this directory when i have to search for any users -"/root" : It is the home directory of the admin +"/root" : It is the home directory of the admin It contanis admin dedicated things NOrmal user can't open this directory @@ -16,7 +16,7 @@ It contains all the files that describes or tells the operating system how to perform "ssh" "cron" I will use this directory when i have to check any deep information about any process -"/var/log" : This directory is very essential in linux as it saves the record of everything that happens in your system +"/var/log" : This directory is very essential in linux as it saves the record of everything that happens in your system it contains "boot" "config" "syslog" this will often used widely by me to check for any faults @@ -24,6 +24,49 @@ It shows folders for different application like for the chrome "com.google.Chrome.DLjzx0" I will use it to store my temporary files. +"/bin" : Contains essential system binaries required for the system to boot and run in single-user mode. + it also contains foundational commands here like ls, cp, and mv . + I will use this directory when i have to check for any boot related quaaries +"/usr/bin" : Stores the majority of user-accessible programs that are not critical for basic system booting, such as python, git, or text editors -3. 2. Scenario Practice +"/opt" : It stores all the information about the third party apps that are installed in your system + i saw the directory of chrome where many information are stored + i used this to see for any third party application + +Hands On Task + +Command used to check the top 5 biggest file in your log folder + +"du -sh /var/log/* 2>/dev/null | sort -h | tail -5" : + +breif explanation: du : used to chechk the free space + -sh : these flags used to summerize && human readable form + /var/log/* : In this * tells to chek the complete log directory + 2> : used to pass all the unwanted error + /dev/null : a black hole + sort -h : sort the data into human readable form small to big + tail -5 : prints the last 5 lines of teh output + + +"cat /etc/hostname": Prints your computer hostname + +"ls -la ~" : shows all the hidden files in the home directory that starts with . + +2. Scenario Practice + + The Dead Service. A service named myapp didn't start after a reboot. + step1 : systemctl status myapp : check the current status of the app. + step2 : journalctl -u myapp -n 10 : It shows the most recent activity of myapp + step3 : systemctl is-enabeld myapp : it checks the system trias to start it + + Scenario 2: The Sluggish Server. The server is slow and the CPU is spiking. + step1: htop : to see which processes takes more cpu percentage and fetch thier PID + step2 : kill -9 : It terminate the processes + + Scenario 3: The Missing Logs. A developer needs the logs for the docker service. + step1 : journalctl -u docker : It gives all the requierd logs related to docker + + Scenario 4: The Blocked Script. A script at /home/user/backup.sh says "Permission denied". + step1 : ls -l : To check the permmison of that backup.sh + step2 : chmod 777 : It changes the permission to allow everthing to everyone ("NOte it is risky gave permission accordingly") From d395c8c001930efabf6905ddd8d0b548968ada0f Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Mon, 25 May 2026 11:43:33 +0530 Subject: [PATCH 09/76] Document cloud deployment commands for EC2 Added commands for cloud deployment setup on EC2 instance. --- 2026/day-08/cloud-deployment.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 2026/day-08/cloud-deployment.md diff --git a/2026/day-08/cloud-deployment.md b/2026/day-08/cloud-deployment.md new file mode 100644 index 0000000000..23fad6c526 --- /dev/null +++ b/2026/day-08/cloud-deployment.md @@ -0,0 +1,15 @@ +Commands used : +(Before starting whith commands you must have to do these things create a ec2 instance and find the link of ssh +that is located insde the connect section of the aws page) + +My-key-pair : is created when you are launching the instance + +comaand 1 : Used to check where the private key was installed or located and change the +directiry as per that using cd command + +command 2 : ssh -i ubuntu@ +command 3 : sudo apt-get update && sudo apt upgrade +command 4 : sudo apt install nginx +command 5 : systemctl status nginx +command 6 : journalctl -u nginx >> nginx-logs.txt +comaand 7 : scp -i ubuntu@ : ~/nginx-logs.txt . From ad0c100bcdbf45c2314a15b9787b446f509bc099 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Mon, 25 May 2026 11:49:24 +0530 Subject: [PATCH 10/76] Fix typos and enhance scp command explanation Corrected typos and clarified explanations regarding the scp command and its usage. --- 2026/day-08/cloud-deployment.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/2026/day-08/cloud-deployment.md b/2026/day-08/cloud-deployment.md index 23fad6c526..e92f39ab16 100644 --- a/2026/day-08/cloud-deployment.md +++ b/2026/day-08/cloud-deployment.md @@ -13,3 +13,10 @@ command 4 : sudo apt install nginx command 5 : systemctl status nginx command 6 : journalctl -u nginx >> nginx-logs.txt comaand 7 : scp -i ubuntu@ : ~/nginx-logs.txt . + +Challange that i faced is during scp when i forget to use "." in the end then i realized that it +tell the system to paste it where the user is currently located + +WHat I Learn +scp command : that is how to store file form server to local +. : tells the system to use the current location as a destination location . From 7003f2558e74b9f9d61eaaa5b53852c9cb0453b6 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Mon, 25 May 2026 11:50:44 +0530 Subject: [PATCH 11/76] Fix typos and enhance clarity in deployment guide Corrected typos and improved clarity in cloud deployment instructions. --- 2026/day-08/cloud-deployment.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/2026/day-08/cloud-deployment.md b/2026/day-08/cloud-deployment.md index e92f39ab16..1eeb561c54 100644 --- a/2026/day-08/cloud-deployment.md +++ b/2026/day-08/cloud-deployment.md @@ -8,15 +8,26 @@ comaand 1 : Used to check where the private key was installed or located and cha directiry as per that using cd command command 2 : ssh -i ubuntu@ + command 3 : sudo apt-get update && sudo apt upgrade + command 4 : sudo apt install nginx + command 5 : systemctl status nginx + command 6 : journalctl -u nginx >> nginx-logs.txt + comaand 7 : scp -i ubuntu@ : ~/nginx-logs.txt . + + Challange that i faced is during scp when i forget to use "." in the end then i realized that it tell the system to paste it where the user is currently located + + WHat I Learn + scp command : that is how to store file form server to local + . : tells the system to use the current location as a destination location . From 186f0fca7cc55aae97e1026106928fb21b5688c6 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Tue, 26 May 2026 13:24:43 +0530 Subject: [PATCH 12/76] Add Day 09 user management documentation Documented the Day 09 challenge involving user and group management, including user creation, group assignments, directory setup, and permissions testing. --- 2026/day-09/day-09-user-management.md | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 2026/day-09/day-09-user-management.md diff --git a/2026/day-09/day-09-user-management.md b/2026/day-09/day-09-user-management.md new file mode 100644 index 0000000000..9299290d30 --- /dev/null +++ b/2026/day-09/day-09-user-management.md @@ -0,0 +1,71 @@ +Day 09 Challenge +Users & Groups Created +Users: tokyo, berlin, professor, nairobi + +Groups: developers, admins, project-team + +Group Assignments +tokyo: developers, project-team + +berlin: developers, admins + +professor: admins + +nairobi: project-team + +Directories Created +/opt/dev-project: Permissions set to 775 (rwxrwxr-x), group ownership set to developers. + +/opt/team-workspace: Permissions set to 775 (rwxrwxr-x), group ownership set to project-team. + +Commands Used + +1. Creating Users & Verifying + +sudo adduser tokyo +sudo adduser berlin +sudo adduser professor +sudo adduser nairobi +cat /etc/passwd | tail -n 4 +ls -l /home + +2. Creating Groups & Verifying + +sudo groupadd developers +sudo groupadd admins +sudo groupadd project-team +cat /etc/group | tail -n 5 + +3. Assigning Users to Groups + +sudo usermod -aG developers tokyo +sudo usermod -aG developers,admins berlin +sudo usermod -aG admins professor +sudo usermod -aG project-team tokyo +sudo usermod -aG project-team nairobi + +4. Creating and Configuring Shared Directories + +sudo mkdir /opt/dev-project +sudo chown root:developers /opt/dev-project +sudo chmod 775 /opt/dev-project + +sudo mkdir /opt/team-workspace +sudo chown -R root:project-team /opt/team-workspace +sudo chmod 775 /opt/team-workspace + +5. Testing Permissions + +su - tokyo +cd /opt/dev-project +touch test-file.txt + +What I Learned +User vs. File Modification: I learned that chmod is strictly for changing file and directory permissions, +while modifying a user's group requires usermod -aG. Forgetting the -a (append) can accidentally remove a user from their other groups! + +Changing Group Ownership: To allow a specific group to collaborate in a folder, the chown command uses a user:group syntax. +For example, sudo chown root:project-team ensures the system admin owns it, but the project-team group has designated access. + +Piping and Searching: When checking system files like /etc/group, piping the output to grep or tail -5 is much faster than reading the entire file. +I also learned that chaining search terms with operators like && or || in grep requires specific syntax/regex. From 29357ff7746924501eabede74149d6638aa92ce6 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 27 May 2026 13:15:38 +0530 Subject: [PATCH 13/76] Add Day 10 challenge notes on file permissions Documented Day 10 challenge focusing on file creation, viewing, and numeric permissions. Included commands used and lessons learned about chmod and file manipulation. --- 2026/day-10/day-10-file-permissions.md | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 2026/day-10/day-10-file-permissions.md diff --git a/2026/day-10/day-10-file-permissions.md b/2026/day-10/day-10-file-permissions.md new file mode 100644 index 0000000000..9e77984e5d --- /dev/null +++ b/2026/day-10/day-10-file-permissions.md @@ -0,0 +1,71 @@ +Day 10 Challenge: File Creation, Viewing, and Numeric Permissions +Today was all about mastering file manipulation and getting comfortable with numeric (octal) permissions. +It is really satisfying to see how quickly you can lock down or open up access to a file once you understand the math behind chmod! +(I even used tail to verify that my users from yesterday's Money Heist-themed challenge are still sitting safely in /etc/passwd!) + +Here is the breakdown of today's hands-on lab. + +Files Created + +devops.txt: Created as an empty file using touch. + +notes.txt: Created directly from the command line using echo and redirection. + +script.sh: A simple executable bash script created using vim. + +project/: A dedicated directory created with specific permissions right from the start. + +Permission Changes + +I practiced using numeric values to change access rights: + +script.sh: Started as -rw-rw-r-- (664). Changed to -rwxrw-r-- (chmod 764) +to give myself (the owner) execution rights so the script could actually run. + +devops.txt: Started as -rw-rw-r-- (664). Changed to -r--r--r-- (chmod 444) +to make it strictly read-only for absolutely everyone. + +notes.txt: Started as -rw-rw-r-- (664). Changed to -rw-r----- (chmod 640) +to give myself read/write access, my group read access, and lock out "others" entirely. + + +Commands Used + +# Setting up the workspace and creating files +mkdir day10 +cd day10 +touch devops.txt +echo "This file is created directly using echo command" > notes.txt + +# Creating a script and making it executable +vim script.sh +ls -l +chmod 764 script.sh +. script.sh # Executed the script which printed "Hello DevOps" + +# Viewing file contents and system users safely +cat notes.txt +vim -R script.sh # Opened the script in Read-Only mode to avoid accidental edits! +head -n 5 /etc/passwd +tail -n 5 /etc/passwd # Verified my users (tokyo, berlin, etc.) from Day 9! + +# Modifying permissions using numbers +chmod 444 devops.txt +chmod 640 notes.txt + +# Creating a directory with permissions already set +mkdir -m 755 project/ +ls -l + +What I Learned + +Numeric chmod is a time-saver: Using numbers (4=read, 2=write, 1=execute) is so much faster than typing out chmod u+x,g-w etc. +figuring out that 764 means (4+2+1 for owner, 4+2 for group, 4 for others) makes permission management click instantly. + +One-Step Directory Creation: I didn't realize you could set permissions while creating a folder. +Using mkdir -m 755 creates the directory and sets the exact access rights in a single command, which is perfect for automation scripts. + +Safe viewing with Vim: Using vim -R opens a file in read-only mode. +This is a brilliant trick for DevOps when you need to inspect a critical production script +or config file but want to guarantee you don't accidentally type something and break it! + From 09559eda2dab42ad5e2ae8cdd09de4a8c8098168 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 27 May 2026 15:52:22 +0530 Subject: [PATCH 14/76] Add Day 11 notes on file ownership and permissions Documented the Day 11 challenge focusing on file and directory ownership in Linux, including commands used and ownership changes practiced. --- 2026/day-11/day-11-file-ownership.md | 99 ++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 2026/day-11/day-11-file-ownership.md diff --git a/2026/day-11/day-11-file-ownership.md b/2026/day-11/day-11-file-ownership.md new file mode 100644 index 0000000000..d0805e1dbe --- /dev/null +++ b/2026/day-11/day-11-file-ownership.md @@ -0,0 +1,99 @@ +Day 11 Challenge: File & Directory Ownership + + +Today’s focus was on understanding how Linux manages ownership. +I continued with my Money Heist team setup to practice changing user and group owners using chown and chgrp. +I also ran into some real-world troubleshooting with permissions and file paths! + +Files & Directories Created + + +day-11-file-ownership.md (Notes file) + +devops-file.txt + +team-notes.txt + +project-config.yaml + +app-logs/ (Directory) + +heist-project/ (Directory containing plans/strategy.conf and vault/gold.txt) + +bank-heist/ (Directory containing access-codes.txt, blueprints.pdf, and escape-plan.txt) + + +Ownership Changes + + +I practiced passing ownership of files and folders to different users and groups: + +devops-file.txt: sachin:sachin → tokyo:sachin → berlin:sachin + +team-notes.txt: sachin:sachin → sachin:heist-team + +project-config.yaml: sachin:sachin → professor:heist-team + +app-logs/: sachin:sachin → berlin:heist-team + +heist-project/ (and all contents): sachin:sachin → professor:planners + +bank-heist/access-codes.txt: sachin:sachin → tokyo:vault-team + +bank-heist/blueprints.pdf: sachin:sachin → berlin:tech-team + +bank-heist/escape-plan.txt: sachin:sachin → nairobi:vault-team + +Commands Used + + +# Basic User Ownership + +touch devops-file.txt +sudo chown tokyo devops-file.txt +sudo chown berlin devops-file.txt + +# Group Ownership + +touch team-notes.txt +sudo groupadd heist-team +sudo chgrp heist-team team-notes.txt + +# Changing Both User and Group Simultaneously + +touch project-config.yaml +sudo chown professor:heist-team project-config.yaml +mkdir app-logs/ +sudo chown berlin:heist-team app-logs + +# Recursive Ownership Changes + +sudo groupadd planners +sudo chown -R professor:planners heist-project +ls -lR heist-project + +# Troubleshooting Paths & Typos + +sudo groupadd vault-team +sudo groupadd tech-team +mkdir bank-heist +touch bank-heist/access-codes.txt bank-heist/blueprints.pdf bank-heist/escape-plan.txt + +pwd # Used to find my exact absolute path (/home/sachin/day11) + +sudo chown tokyo:vault-team /home/sachin/day11/bank-heist/access-codes.txt +sudo chown berlin:tech-team /home/sachin/day11/bank-heist/blueprints.pdf +sudo chown nairobi:vault-team /home/sachin/day11/bank-heist/escape-plan.txt + +What I Learned + +sudo is mandatory for ownership changes: Even if you are the one who created the file, +Linux will block you with an "Operation not permitted" error if you try to give it away or change its group without using sudo. + +The magic of the -R flag: When working with folders (like the heist-project directory), using chown -R is incredibly efficient. +It recursively applies the new ownership to the main folder and every single file/folder nested inside of it in one go. + +Paths and Typos will trip you up: I spent some time troubleshooting "No such file or directory" and "invalid user" errors. +I learned that putting a / before a folder name (/bank-heist) tells Linux to look at the absolute root of the system, not the folder +I am currently sitting in.Using pwd to grab the absolute path fixed my issue instantly, +and it was a great reminder to double-check my spelling (nariobi vs. nairobi)! From 860f625bbd439101d7de8e96262f2b15a36bd1c7 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Fri, 29 May 2026 22:03:19 +0530 Subject: [PATCH 15/76] Revise Day 12 reflection and goals Updated mindset goals and refined focus areas for improvement. --- 2026/day-12/day-12-revision.md | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 2026/day-12/day-12-revision.md diff --git a/2026/day-12/day-12-revision.md b/2026/day-12/day-12-revision.md new file mode 100644 index 0000000000..2922926ba5 --- /dev/null +++ b/2026/day-12/day-12-revision.md @@ -0,0 +1,75 @@ +1. Mindset & Plan Review + +Looking back at my Day 01 goals, the plan is still rock solid. My primary goal was to devlop a devops ready mindset to crack high paying job. + + +2. Processes & Services Re-run + +I jumped back into checking system health to keep the muscle memory fresh. + +Command: systemctl status ssh + +Observation: The SSH service is active and running cleanly. + +Command: journalctl -u ssh -n 5 + +Observation: Checked the last 5 logs for the SSH daemon. No failed login attempts or errors, just standard connection acceptances. + +3. File Skills & User/Group Sanity Check + +Combined file operations and ownership changes into one quick drill. + +Bash +# 1. Create a dummy file +touch /tmp/revision-test.txt + +# 2. Append some text +echo "Revision day practice" >> /tmp/revision-test.txt + +# 3. Change ownership (practicing Day 11 skills) +sudo chown professor:admins /tmp/revision-test.txt + +# 4. Lock down permissions to read-only for owner/group, nothing for others +sudo chmod 440 /tmp/revision-test.txt + +# 5. Verify the changes +ls -l /tmp/revision-test.txt +Observation: The output -r--r----- 1 professor admins ... confirmed my numeric chmod math is getting much faster! + +4. Cheat Sheet Refresh +If the server is on fire, these are the 5 commands I am reaching for first: + +systemctl status (Is it running?) + +journalctl -eu (Jump straight to the newest errors) + +top or htop (What is eating the CPU/RAM right now?) + +df -h (Is the disk completely full?) + +history | grep (What did I or someone else just type to break this?) + +5. Mini Self-Check +Which 3 commands save you the most time right now, and why? + +history | grep: Saves me from having to re-type long, complex commands I figured out yesterday. + +systemctl is-active: Much faster than reading the full status output when I just need a quick yes/no on service health. + +chown -R: The recursive flag saves me from having to manually change ownership on dozens of nested files. + +How do you check if a service is healthy? List the exact 2–3 commands you’d run first. + +systemctl status (Checks if it is active or failed). + +journalctl -u -n 50 (Checks for recent errors in the logs). + +systemctl is-enabled (Verifies if it will survive a reboot). + +How do you safely change ownership and permissions without breaking access? Give one example command. +I always verify my exact location with pwd before running commands, and I use specific numeric permissions rather than broad strokes. +Example: sudo chmod 755 /opt/myapp (Gives me full control, but safely restricts everyone else to read/execute only). + +What will you focus on improving in the next 3 days? +I want to get faster at navigating the terminal without looking up the flags for basic commands like chmod and ls. +I also want to focus on reading logs more efficiently—spotting the actual error message buried in the text. From b8f4a6cf3e3d7ea3a493f672038617719616ecb0 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Sun, 31 May 2026 19:21:42 +0530 Subject: [PATCH 16/76] final edit --- 2026/day-13/day-13-lvm.md | 67 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 2026/day-13/day-13-lvm.md diff --git a/2026/day-13/day-13-lvm.md b/2026/day-13/day-13-lvm.md new file mode 100644 index 0000000000..26c0e76f72 --- /dev/null +++ b/2026/day-13/day-13-lvm.md @@ -0,0 +1,67 @@ +Day 13: Logical Volume Management (LVM) on AWS +File: day-13-lvm.md + +Overview +Today’s focus was on dynamic storage management using Linux LVM on an AWS EBS volume. Instead of working with rigid partitions, +I created a flexible volume structure that can be resized on the fly without unmounting or experiencing downtime. + +Commands Executed +1. Verifying Attached Storage + +Bash +lsblk +pvs +vgs +lvs +df -h +Observation: Confirmed the new block device (/dev/nvme1n1) was attached to the instance but completely unformatted and unallocated. + +2. Initializing the Physical Volume (PV) + +Bash +sudo pvcreate /dev/nvme1n1 +sudo pvs +Observation: Converted the raw AWS disk into an LVM-compatible Physical Volume. + +3. Creating the Volume Group (VG) + +Bash +sudo vgcreate devops-vg /dev/nvme1n1 +sudo vgs +Observation: Grouped the physical storage into a unified pool called devops-vg. + +4. Carving out the Logical Volume (LV) + +Bash +sudo lvcreate -L 500M -n app-data devops-vg +sudo lvs +Observation: Provisioned a 500MB usable chunk from the pool specifically for application data. + +5. Formatting and Mounting + +Bash +sudo mkfs.ext4 /dev/devops-vg/app-data +sudo mkdir -p /mnt/app-data +sudo mount /dev/devops-vg/app-data /mnt/app-data +df -h /mnt/app-data +Observation: Laid down the ext4 file system and made the storage accessible in the /mnt/app-data directory. + +6. Extending Storage on the Fly + +Bash +sudo lvextend -L +200M /dev/devops-vg/app-data +sudo resize2fs /dev/devops-vg/app-data +df -h /mnt/app-data +Observation: Successfully added 200MB to the volume and expanded the file system to recognize the new space, +proving the elasticity of LVM. + + + +What I Learned +The LVM Abstraction Layers: I finally understand the PV -> VG -> LV flow. You take a raw disk (Physical Volume), throw it into a bucket of storage (Volume Group), +and then scoop out exactly what you need (Logical Volume). + +Elasticity Without Downtime: The biggest takeaway is that using lvextend followed by resize2fs allows you to increase server storage on the fly. +You do not have to unmount the drive or restart the server, which is critical for production environments. + +AWS Integration: Practicing this on an actual AWS EBS volume makes the cloud feel much more tangible. LVM bridges the gap between the AWS console hardware and the Linux OS file system. From 0fff92892008c031a038c22914ad7a4e58185a18 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Sun, 31 May 2026 20:12:43 +0530 Subject: [PATCH 17/76] Revise LVM documentation for AWS with NVMe details Updated the overview and observations to reflect the use of two NVMe drives and their combined storage. Enhanced clarity on the LVM process and its benefits in a cloud environment. --- 2026/day-13/day-13-lvm.md | 54 ++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/2026/day-13/day-13-lvm.md b/2026/day-13/day-13-lvm.md index 26c0e76f72..3ee9693b2d 100644 --- a/2026/day-13/day-13-lvm.md +++ b/2026/day-13/day-13-lvm.md @@ -2,66 +2,56 @@ Day 13: Logical Volume Management (LVM) on AWS File: day-13-lvm.md Overview -Today’s focus was on dynamic storage management using Linux LVM on an AWS EBS volume. Instead of working with rigid partitions, -I created a flexible volume structure that can be resized on the fly without unmounting or experiencing downtime. +Today’s focus was on dynamic storage management using Linux LVM on an AWS EC2 instance. Instead of working with rigid partitions on a single disk, I took two raw NVMe drives, pooled their storage together, and created a flexible volume structure that can be resized on the fly without unmounting or experiencing downtime. Commands Executed 1. Verifying Attached Storage Bash lsblk -pvs -vgs -lvs -df -h -Observation: Confirmed the new block device (/dev/nvme1n1) was attached to the instance but completely unformatted and unallocated. +Observation: Confirmed two new block devices (/dev/nvme1n1 at 10G and /dev/nvme2n1 at 12G) were attached to the instance but completely unformatted and unallocated. -2. Initializing the Physical Volume (PV) +2. Initializing the Physical Volumes (PV) Bash -sudo pvcreate /dev/nvme1n1 -sudo pvs -Observation: Converted the raw AWS disk into an LVM-compatible Physical Volume. +pvcreate /dev/nvme1n1 /dev/nvme2n1 +pvs +Observation: Converted both raw AWS disks into LVM-compatible Physical Volumes. 3. Creating the Volume Group (VG) Bash -sudo vgcreate devops-vg /dev/nvme1n1 -sudo vgs -Observation: Grouped the physical storage into a unified pool called devops-vg. +vgcreate devops-vg /dev/nvme1n1 /dev/nvme2n1 +vgs +Observation: Grouped both physical drives into a single unified storage pool called devops-vg, giving me a combined ~22GB of usable space. 4. Carving out the Logical Volume (LV) Bash -sudo lvcreate -L 500M -n app-data devops-vg -sudo lvs -Observation: Provisioned a 500MB usable chunk from the pool specifically for application data. +lvcreate -L 13G -n app-data devops-vg +lvs +Observation: Provisioned a 13GB usable chunk from the pool specifically for application data. 5. Formatting and Mounting Bash -sudo mkfs.ext4 /dev/devops-vg/app-data -sudo mkdir -p /mnt/app-data -sudo mount /dev/devops-vg/app-data /mnt/app-data +mkfs.ext4 /dev/devops-vg/app-data +mkdir -p /mnt/app-data +mount /dev/devops-vg/app-data /mnt/app-data df -h /mnt/app-data -Observation: Laid down the ext4 file system and made the storage accessible in the /mnt/app-data directory. +Observation: Laid down the ext4 file system and made the 13GB of storage accessible in the /mnt/app-data directory. 6. Extending Storage on the Fly Bash -sudo lvextend -L +200M /dev/devops-vg/app-data -sudo resize2fs /dev/devops-vg/app-data +lvextend -L +2G /dev/devops-vg/app-data +resize2fs /dev/devops-vg/app-data df -h /mnt/app-data -Observation: Successfully added 200MB to the volume and expanded the file system to recognize the new space, -proving the elasticity of LVM. - - +Observation: Successfully added 2GB to the volume and used resize2fs to expand the file system. The final df -h output confirmed the drive grew from 13GB to 15GB live, proving the elasticity of LVM. What I Learned -The LVM Abstraction Layers: I finally understand the PV -> VG -> LV flow. You take a raw disk (Physical Volume), throw it into a bucket of storage (Volume Group), -and then scoop out exactly what you need (Logical Volume). +Pooling Multiple Drives: I learned that LVM isn't just for slicing up one drive—it can combine multiple physical disks (a 10GB and a 12GB drive in my case) into one massive Volume Group (22GB pool). The OS just sees it as one big bucket of storage! -Elasticity Without Downtime: The biggest takeaway is that using lvextend followed by resize2fs allows you to increase server storage on the fly. -You do not have to unmount the drive or restart the server, which is critical for production environments. +Elasticity Without Downtime: The biggest takeaway is that using lvextend followed by resize2fs allows you to increase server storage on the fly. I added 2GB of space to my active drive without unmounting it or restarting the server. -AWS Integration: Practicing this on an actual AWS EBS volume makes the cloud feel much more tangible. LVM bridges the gap between the AWS console hardware and the Linux OS file system. +AWS NVMe Integration: Practicing this on actual AWS EBS volumes (nvme1n1) makes the cloud feel much more tangible. LVM bridges the gap between the AWS console hardware and the Linux OS file system. From 56160c427abf877d5a44f8797f90c104892a2df4 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Tue, 2 Jun 2026 22:58:44 +0530 Subject: [PATCH 18/76] Expand networking.md with TCP model and troubleshooting tips Added details about the TCP model, hands-on checklist, mini task for port probing, and reflections on network troubleshooting. --- 2026/day-14/day-14-networking.md | 137 +++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 2026/day-14/day-14-networking.md diff --git a/2026/day-14/day-14-networking.md b/2026/day-14/day-14-networking.md new file mode 100644 index 0000000000..31f216fd48 --- /dev/null +++ b/2026/day-14/day-14-networking.md @@ -0,0 +1,137 @@ +The OSI Model + + +The OSI (Open Systems Interconnection) model is a theoretical framework that describes how data moves from a local device across a network to a server, +and vice versa. It standardizes network functions into 7 distinct layers, moving from the hardware level up to the user software. + +Layer 1: Physical Layer + +What it does: Handles the physical connection between devices and transmits raw bitstreams (0s and 1s) over electrical, radio, or optical signals. + +Examples: Ethernet (LAN) cables, Wi-Fi radio waves, hubs, and repeaters. + +Layer 2: Data Link Layer + +What it does: Packs raw bits into frames and ensures error-free data transfer between two directly connected nodes. It uses MAC addresses (physical addresses) to identify specific devices on the same local network. + +Examples: Switches, Network Interface Cards (NICs). + +Layer 3: Network Layer + +What it does: Responsible for routing data between different networks. It translates MAC addresses into logical IP addresses and breaks data down into packets to find the best path across the internet. + +Examples: Routers, IPv4, IPv6. + +Layer 4: Transport Layer + +What it does: Manages end-to-end communication, flow control, and error detection. It determines how data is broken into segments and transmitted. + +Protocols: TCP (reliable, ensures all data arrives safely) and UDP (fast, used for live streaming/gaming where dropping a few packets is fine). + +Layer 5: Session Layer + +What it does: Spans, manages, and terminates connections (sessions) between the local device and the remote server. It ensures the connection stays open while data is moving and closes it when done. +It also handles authentication and authorization. + +Layer 6: Presentation Layer + +What it does: Functions as the data translator. It ensures that data from the application layer is formatted, compressed, and encrypted (or decrypted) so the receiving system can understand it. + +Examples: SSL/TLS encryption, JPEG, MP3. + +Layer 7: Application Layer + +What it does: The layer closest to the end-user. It interacts directly with software applications (like web browsers) to enable network services. It doesn't display the UI itself, +but it provides the protocols that allow applications to request and receive data. + +Protocols: HTTP, HTTPS, SSH, FTP, SMTP (email). + +The TCP/IP Model +The TCP/IP model is the practical, real-world architecture used by the internet and modern industries today. Instead of 7 layers, it condenses the networking process into 4 layers by combining the functions of several OSI layers. + +Layer 1: Network Access Layer (Combines OSI's Physical and Data Link layers) + +What it does: Defines how data is physically sent through the network hardware. It handles everything from physical cables and wireless signals to mapping IP addresses to hardware MAC addresses. + +Layer 2: Internet Layer (Corresponds to OSI's Network layer) + +What it does: Handles logical addressing, routing, and packaging of data into packets. It ensures data reaches its destination network regardless of the path it takes. + +Protocols: IP, ICMP (ping). + +Layer 3: Transport Layer (Corresponds to OSI's Transport layer) + +What it does: Controls host-to-host communication. It decides whether data needs to travel reliably and sequentially (TCP) or rapidly without strict delivery checks (UDP). + +Layer 4: Application Layer (Combines OSI's Session, Presentation, and Application layers) + +What it does: Handles everything related to user applications, data formatting, encryption, and session management. It allows your browser or software to communicate safely and directly with a web server. + +Protocols: HTTPS, HTTP, SSH, DNS. + + +IN Tcp model + +IP is stack in internt layer + +TCP/UDP is tack in Transport Layer + +HTTP/HTTPS, DNS are in Application Layer + +2. Hands-on Checklist +Target Host for external checks: google.com + +Identity: hostname -I + +Observation: Returned 172.31.35.238. This is my AWS EC2 instance's internal private IP address, not the public one attached to the internet gateway. + +Reachability: ping -c 4 google.com + +Observation: 0% packet loss. Average latency was ~1.5ms, which is incredibly fast (AWS data centers have great routing). + +Path: traceroute google.com + +Observation: The traffic took about 8 hops to reach Google's servers. The first hop was my local AWS gateway, and a few middle hops returned * * * (timeouts), meaning those specific routers are configured to ignore traceroute requests for security. + +Ports: ss -tulpn + +Observation: Found sshd (the SSH service) listening on TCP port 22. + +Name Resolution: dig google.com +short + +Observation: DNS resolved the domain name to 142.250.193.206. + +HTTP Check: curl -I https://google.com + +Observation: Returned HTTP/2 200, meaning the web server is healthy and successfully accepted the request. + +Connections Snapshot: netstat -an | grep ESTABLISHED | wc -l + +Observation: Piped to wc -l to count the lines. Found exactly 1 established connection (which is my active SSH session into the server). + +3. Mini Task: Port Probe + + +I identified that SSH is listening on port 22 from the ss command. + +Test Command: nc -zv localhost 22 + +Result: Connection to localhost (127.0.0.1) 22 port [tcp/ssh] succeeded! + +Reflection: The service is actively accepting connections. If this had failed (e.g., "Connection refused"), +my next step would be checking if the service is actually running (systemctl status sshd) or if a local firewall is blocking it (ufw status). + +4. Reflection + + +Fastest Signal: curl -I is the fastest way to check an entire stack. If it returns a 200, I know DNS, IP routing, TCP handshakes, and the web application are all functioning perfectly. + +Troubleshooting Layers: * If DNS fails (e.g., ping server.local says "Name or service not known"), the issue is at the Application Layer (L7). I need to check my /etc/resolv.conf or my DNS provider. + +If I see an HTTP 500 error, the network is fine. The issue is strictly at the Application Layer (L7)—specifically, the web server code crashed while processing the request. I need to check application logs. + +Follow-up incident checks: + +Check if the SSL certificate expired using curl -vI https://... + +Check if a firewall rule was unexpectedly applied dropping traffic (e.g., checking AWS Security Groups). From 8700dc3c7c3b78b5ada262b16dba92ddfac7c3d4 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 3 Jun 2026 14:06:32 +0530 Subject: [PATCH 19/76] Document networking concepts in day-15 markdown Added detailed explanations of networking concepts including DNS, IP addressing, CIDR, subnetting, and ports. --- 2026/day-15/day-15-networking-concepts.md | 106 ++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 2026/day-15/day-15-networking-concepts.md diff --git a/2026/day-15/day-15-networking-concepts.md b/2026/day-15/day-15-networking-concepts.md new file mode 100644 index 0000000000..7ccda4de4c --- /dev/null +++ b/2026/day-15/day-15-networking-concepts.md @@ -0,0 +1,106 @@ +Task 1: DNS – How Names Become IPs + +The google.com Flow:When I type google.com, +my browser checks its local cache. If it doesn't know the IP, it asks my OS, which asks my internet provider's DNS resolver. +The resolver queries the Root server, then the .com TLD server, and finally Google's Authoritative server, which returns the exact IP address back to my browser. + +Common Record Types: + +A: Maps a domain name directly to an IPv4 address. + +AAAA: Maps a domain name directly to an IPv6 address. + +CNAME: Maps an alias to another domain name (e.g., www.myapp.com points to myapp.com). + +MX:Directs emails to the correct mail server for the domain. + +NS: Indicates which DNS servers are authoritative for a domain.Hands-on Check:Bash$ dig google.com + + +... +;; ANSWER SECTION: +google.com. 135 IN A 142.250.193.206 +... + + +Observation: Found the A record pointing to 142.250.193.206. +The TTL (Time To Live) is 135 seconds, meaning my system will cache this answer for 135 seconds before asking again. + +Task 2: IP AddressingWhat is an IPv4 Address?It is a 32-bit numeric address divided into 4 "octets" (blocks of numbers from 0-255) separated by dots. +It acts as the unique identifier for a device on a network. Example: 192.168.1.10. + + +Public vs. Private IPs: + + +Public IP: Globally unique and routable on the open internet (e.g., Google's 8.8.8.8). + +Private IP: Used only within internal networks (like AWS VPCs or your home Wi-Fi). They cannot be routed on the open internet. Example: 10.0.0.5. + +Private IP Ranges: + +10.0.0.0 to 10.255.255.255 + +172.16.0.0 to 172.31.255.255 + +192.168.0.0 to 192.168.255.255 + +Hands-on Check:Bash$ ip addr show + +... + inet 172.31.35.238/20 brd 172.31.47.255 scope global dynamic eth0 +... + +Observation: + +My main network interface (eth0) has the IP 172.31.35.238, +which falls directly into the standard Private IP range. + + +Task 3: + +CIDR & SubnettingWhat does /24 mean in 192.168.1.0/24?It is CIDR (Classless Inter-Domain Routing) notation. + +The /24 means the first 24 bits of the IP address are locked in as the "Network ID". The remaining 8 bits are left open to be assigned to individual host machines. + +Why do we subnet? +To break a massive network into smaller, manageable chunks. +This improves security (putting databases in a different subnet than web servers), limits network noise (smaller broadcast domains), and stops us from wasting IP addresses. +CIDR Table Exercise:CIDR + +Subnet MaskTotal IPsUsable Hosts/24255.255.255.0256254/16255.255.0.065,53665,534/28255.255.255.2401614(Note: +We always subtract 2 to get "Usable Hosts" because the first IP is reserved for the Network ID and the last IP is reserved for the Broadcast address). + +Task 4: Ports – The Doors to ServicesWhat are Ports?If an IP address gets you to the correct building (server), a Port gets you to the correct apartment number (the specific application running inside). + +They allow one server to run multiple services simultaneously. + +Common Ports Cheatsheet: +22: SSH (Secure remote login) +80: HTTP (Unencrypted web traffic) +443: HTTPS (Encrypted web traffic) +53: DNS (Domain name resolution) +3306: MySQL (Relational Database) +6379: Redis (In-memory cache)27017: + +MongoDB (NoSQL Database)Hands-on Check:Bash$ ss -tulpn +... +tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=842,fd=3)) +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6)) +... +Observation: I can clearly see SSH listening on port 22 and Nginx web server listening on port 80. + +Task 5: Putting It Together + +Scenario1: You run curl http://myapp.com:8080First, + +DNS translates myapp.com to a specific IP address. +Then, the application (HTTP) creates a request and uses the transport layer (TCP) to knock on the specific door (8080) of that target IP to ask for the web page. + +Scenario 2: Your app can't reach a database at 10.0.1.50:3306First, I would ping 10.0.1.50 to check if I have basic network routing to the machine. +If that works, I would use nc -zv 10.0.1.50 3306 to check if the specific port is open; if it fails, it's likely an AWS Security Group/Firewall blocking it, +or the database isn't running.What I LearnedCIDR Math makes sense: Realizing that the /number just means "how many bits of the IP address are locked" makes calculating network sizes much less intimidating. + +Ports isolate traffic: A single server can host a website, a database, and an SSH session simultaneously without conflict purely because of ports. + +Troubleshooting is layered: When a connection fails, you have to check DNS (is the name right?), then the IP (can I reach the server?), and finally the Port (is the door open?). From 111c8ab27009b1856603089b6834fe3ed8c1c51b Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 3 Jun 2026 23:07:16 +0530 Subject: [PATCH 20/76] Enhance shell scripting documentation with examples Added explanations about shebang removal and variable usage in shell scripting. --- 2026/day-16/day-16-shell-scripting.md | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 2026/day-16/day-16-shell-scripting.md diff --git a/2026/day-16/day-16-shell-scripting.md b/2026/day-16/day-16-shell-scripting.md new file mode 100644 index 0000000000..1f91e8f8ba --- /dev/null +++ b/2026/day-16/day-16-shell-scripting.md @@ -0,0 +1,42 @@ +Challenge Tasks + +Task 1: Your First Script + +Create a file hello.sh +Add the shebang line #!/bin/bash at the top +Print Hello, DevOps! using echo +Make it executable and run it + + +chmod +x hello.sh +./hello.sh + +Hello, DevOps! + +Document: What happens if you remove the shebang line? + +IF i remove the shebang, the code still executes, as it uses only basic commands like echo +This works the same for both sh and bash. + +Task 2: Variables + +Create variables.sh with: + +A variable for your NAME +A variable for your ROLE (e.g., "DevOps Engineer") +Print: Hello, I am and I am a + +Hey, my name is: sachin +I am 22 years old, and still BEROZGAR + +Try using single quotes vs double quotes — what's the difference? + +IN my case, I don't see any difference, as I don't use any variable inside a variable +for ex + +introduction='My name is $name and I am $status' +echo $introduction + +# Output: My name is $name and I am $status + +so don't use single quotes for this type of variable From 554fd7eb81dd933f4a43e15e47b3193bbf2687db Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 3 Jun 2026 23:19:14 +0530 Subject: [PATCH 21/76] Summarize key learnings from shell scripting session Added a summary of lessons learned in shell scripting. --- 2026/day-16/day-16-shell-scripting.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/2026/day-16/day-16-shell-scripting.md b/2026/day-16/day-16-shell-scripting.md index 1f91e8f8ba..0b09bd7c57 100644 --- a/2026/day-16/day-16-shell-scripting.md +++ b/2026/day-16/day-16-shell-scripting.md @@ -40,3 +40,19 @@ echo $introduction # Output: My name is $name and I am $status so don't use single quotes for this type of variable + +Here is a quick, punchy summary of the exact lessons you learned today from troubleshooting your scripts. + +Reviewing these will help cement the knowledge so you don't repeat them in your next project! + +🧠 What I Learned Today + +The Bracket Space Law: You learned that Bash is incredibly sensitive to spacing. Leaving out spaces inside conditional brackets ([[$num == 0]]) treats the entire block as a broken command. You must always write [[ $num == 0 ]]. + +The read -p Requirement: You discovered that you can't just pass a prompt string directly to the read command. Without the -p flag, Bash treats your prompt text as a variable name and hangs. + +The Number vs. String Operator Divide: This is the one that trips up everyone! You learned that -eq, -gt, and -lt are strictly for mathematical numbers, while == and != are strictly for comparing text/strings (like your "y" or "n" responses). + +The Power of Strong vs. Weak Quotes: You learned how single quotes ('') act as literal blocks that completely freeze variables from printing, while double quotes ("") allow Bash to dynamically expand your variables (like $name or $status). + +Targeted System Checks: You learned how to use specific file-system flags like -f (for regular files) and -d (for directories) to make your automation scripts highly accurate when scanning folders From 2885e183259f43cb563ebfbeec72071d334fd647 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Wed, 3 Jun 2026 23:30:42 +0530 Subject: [PATCH 22/76] Update day-16-shell-scripting.md --- 2026/day-16/day-16-shell-scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2026/day-16/day-16-shell-scripting.md b/2026/day-16/day-16-shell-scripting.md index 0b09bd7c57..95ff9258bd 100644 --- a/2026/day-16/day-16-shell-scripting.md +++ b/2026/day-16/day-16-shell-scripting.md @@ -5,7 +5,7 @@ Task 1: Your First Script Create a file hello.sh Add the shebang line #!/bin/bash at the top Print Hello, DevOps! using echo -Make it executable and run it +Make it executable and run it chmod +x hello.sh From ababaca90d23c1651b9be071f76afe093d089930 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Thu, 4 Jun 2026 22:34:50 +0530 Subject: [PATCH 23/76] Refactor day-17 scripting documentation Updated the scripting documentation to improve clarity and organization. Fixed minor errors and enhanced output descriptions for better understanding. --- 2026/day-17/day-17-scripting.md | 162 ++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 2026/day-17/day-17-scripting.md diff --git a/2026/day-17/day-17-scripting.md b/2026/day-17/day-17-scripting.md new file mode 100644 index 0000000000..f9dc108e4e --- /dev/null +++ b/2026/day-17/day-17-scripting.md @@ -0,0 +1,162 @@ +Today’s focus was on automating repetitive tasks using Bash scripting. + +I moved beyond single commands and started using programming logic like for loops, while loops, command-line arguments, and basic error handling to make my scripts dynamic and robust. + +Task 1: For Loops + +Script 1: for_loop.sh + +Loops through a predefined list of strings and prints them. + +Bash + +#!/bin/bash + +for fruit in apple banana mango orange berry; do + + echo "$fruit is a fruit" + +done + +Output: Printed the statement for each fruit successfully. + +Script 2: count.sh + +Uses a numeric range to loop from 1 to 10. + +Bash + +#!/bin/bash + +for i in {1..10}; do + + echo $i + +done + +Output: Counted from 1 to 10 perfectly. + +Task 2: While Loop + +Script: countdown.sh + +Takes user input and counts down to zero. + +Bash + +#!/bin/bash + +read -p "Enter the number from where you want to start the countdown" num + +while [ $num -ge 0 ]; do + + echo $num + num=$((num - 1)) +done + +echo "done" + +Output: Prompted for a number (entered 5), counted down 5, 4, 3, 2, 1, 0, and printed done. +(Note: I ran into a missing operand error when running chmod initially, +but quickly fixed it by assigning numeric permissions chmod 744 countdown.sh!) + +Task 3: Command-Line Arguments + +Script 1: greet.sh + +Checks if an argument is passed. If not, it provides usage instructions. + +Bash + +#!/bin/bash + +if [ -z "$1" ]; then + + echo "Usage: ./greet.sh " + +else + + echo "$1" +fi + +Output: Running ./greet.sh triggered the Usage warning. Running ./greet.sh sachin correctly output my name. + +Script 2: args_demo.sh + +Demonstrates how Bash handles passed arguments natively. + +Bash + +#!/bin/bash + +echo $# + +echo $@ + +echo $0 + +Output: When passing 2 3 324 534 sachin, the script correctly identified 5 total arguments ($hastag), printed all of them ($@), and printed the script execution name ($0). + +Task 4 & 5: Package Installation & Error Handling + +Script: install_packages.sh (Combined with root check) + +This script checks for root privileges, iterates through a list of packages, and checks their installation status using dpkg. + +Bash + +#!/bin/bash + +# Exit immediately if not run as root + +if [ "$EUID" -ne 0 ]; then + + echo "Error: This script must be run as root (or with sudo)." + exit 1 +fi + +echo "The list of packegs include nginx, curl, wget" + +for pkg in nginx curl wget; do + + echo "checking the status of $pkg" + + if dpkg -s $pkg &> /dev/null; then + + echo "$pkg is allready installed" + else + echo "Installing $pkg..." + apt-get install -y $pkg + fi +done + +Output: Running it without sudo successfully triggered my custom error message. Running it with sudo successfully looped through and confirmed nginx, curl, and wget were already installed. + +Script: safe_scripts.sh + +Practiced using set -e and the || (OR) operator to catch directory creation errors. + +Bash + +#!/bin/bash + +set -e + +mkdir /tmp/devops-test || echo "Directory already exists" + +cd /tmp/devops-test + +touch test_file.txt + +Output: Because /tmp/devops-test already existed, the mkdir command threw an error, +which was elegantly caught by the || operator, printing my custom "Directory already exists" message instead of silently failing. + +What I Learned + +Validation is Crucial: Adding a simple if [ -z "$1" ] or checking $EUID prevents scripts from running dangerously or failing silently. +You should always validate inputs and user privileges before executing core logic. + +The || Operator is a safety net: Appending || echo "Custom Error" to a command is a brilliant way to handle expected errors (like a folder already existing) without crashing the entire script. + +Bash internal variables are powerful: $ isn't just for my own variables. +Built-in variables like $hastag (count of args), $@ (all args), and $0 (script name) make scripts highly dynamic and adaptable to whatever the user types in the terminal. From d9441f703f33b4dd8413c37d3e8de0f7f7342510 Mon Sep 17 00:00:00 2001 From: 00-Sachin Date: Fri, 5 Jun 2026 14:12:56 +0530 Subject: [PATCH 24/76] Enhance day-18-scripting.md with Bash scripting tasks Added detailed explanations and examples for various Bash scripting tasks, including functions, strict mode, and system info reporting. --- 2026/day-18/day-18-scripting.md | 160 ++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 2026/day-18/day-18-scripting.md diff --git a/2026/day-18/day-18-scripting.md b/2026/day-18/day-18-scripting.md new file mode 100644 index 0000000000..b85aa240f7 --- /dev/null +++ b/2026/day-18/day-18-scripting.md @@ -0,0 +1,160 @@ + +Task 1: Basic Functions + +Script: function.sh + +Created a script with two functions: one to greet a user and one to add two numbers. + +Bash + +#!/bin/bash + + greet() { + + read -p "enter your name : " name + echo "hello, $name" + } + + add() { + + read -p "Enter the first number.." num1 + read -p "Enter the second number.." num2 + echo "adding $num1 and $num2" + sum=$((num1+num2)) + echo $sum + } + +greet + +add + +Output: The script successfully prompted for my name, then prompted for 21 and 21, returning 42. + +Task 2: Functions with Outputs + +Script: disk_check.sh + +Packaged system commands into labeled functions. + +Bash + +#!/bin/bash + +check_disk() { + + echo "" + echo "THE DISK STATUS IS..." + df -h / +} + +check_memory() { + + echo "" + echo "AND THE FREE MEMORY USING ARE .." + free -h +} + +check_disk + +check_memory + +Output: Cleanly executed both blocks, showing my /dev/sda5 disk usage and 15Gi total memory. + +Task 3: Strict Mode (set -euo pipefail) + +I tested what happens when you intentionally break a script. Without strict mode, Bash tries to keep going. With strict mode, it stops the bleeding immediately. + +Explanation of the flags: + +set -e (Exit on error): If any command returns a non-zero exit code (meaning it failed), the script stops immediately. +In my test, when the typo command cet failed, the script exited before it could print "i hope you will find this". + +set -u (Undefined variables): If you try to use a variable that hasn't been created yet, the script throws an error and stops. This prevents disasters like rm -rf /$EMPTY_VAR translating to rm -rf /. + +set -o pipefail: By default, if you run a piped command like cat badfile.txt | grep "error", Bash only looks at the exit code of the last command (grep). If cat fails, Bash still thinks the whole line succeeded. pipefail forces the whole pipe to fail if any piece of it fails. + +Task 4: Local Variables + +Variables inside Bash functions are global by default, meaning a function can accidentally overwrite a system variable. I tested this by comparing a leaky function to a safe function using the local keyword. + +Bash + +#!/bin/bash + +# Inside a function: + +local name="sachin" + +echo "my name is $name" + +Observation: By declaring local name=sachin, the variable ceases to exist the moment the function finishes running, +keeping the rest of the script's global state safe and untouched! + +Task 5: Build a Script — System Info Reporter + +Script: system_info.sh + +Built a comprehensive, modular script using everything learned today. + +Bash +#!/bin/bash +set -euo pipefail + +os_info() { + + echo "......................................" + echo "Hostname and OS info" + echo "......................................" + hostnamectl +} + +uptime_status() { + + echo "--Checking System Uptime Status-----" + command uptime +} + +disk_usage() { + + echo "------------------------------------" + echo "Disk Usage (Top 5 Commands)" + echo "------------------------------------" + df -h | sort -hr | head -n 5 +} + +mem_usage() { + + echo "------------------------------------" + echo "Ram Usage (Top 5 Commands)" + echo "------------------------------------" + free -h +} + +cpu_usage() { + + echo "------------------------------------" + echo "Cpu Usage info" + echo "------------------------------------" + top -b -n 1 | head -n 12 | tail -n 6 +} + +main() { + + echo "calling the main function" + os_info + uptime_status + disk_usage + mem_usage + cpu_usage +} + +main +Output: A beautifully formatted, multi-section dashboard reporting exactly what is happening on my Ubuntu environment, driven entirely by one single main function call at the bottom. + +What I Learned + +Functions create cleaner architectures: Wrapping commands in functions like cpu_usage() and grouping them in a main() block makes the code 10x easier to read and troubleshoot than a massive top-to-bottom list. + +set -euo pipefail is mandatory: I will never write a production Bash script without this at the top. Failing fast and loudly is infinitely better than a script silently doing the wrong thing. + +Always use local in functions: To prevent strange bugs where variables overwrite each other, any variable declared inside a function should use the local keyword unless it specifically needs to be accessed globally. From 9f139411cc02293c9165eeb9101edfae6b5b187c Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 7 Jun 2026 22:07:36 +0530 Subject: [PATCH 25/76] Revise Day 19 project documentation Updated the documentation for Day 19 Challenge, detailing scripts for log rotation, server backup, and scheduled maintenance. Enhanced explanations and formatting for clarity. --- 2026/day-19/day-19-project.md | 186 ++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 2026/day-19/day-19-project.md diff --git a/2026/day-19/day-19-project.md b/2026/day-19/day-19-project.md new file mode 100644 index 0000000000..50175e2b8e --- /dev/null +++ b/2026/day-19/day-19-project.md @@ -0,0 +1,186 @@ +# Day 19 Challenge: Real-World Server Automation + +Overview +Today was all about combining the scripting fundamentals I’ve learned to solve actual production problems. I built a log rotation script to prevent disks from filling up, a backup script to protect critical data, and an overarching maintenance script. Finally, I learned how to automate all of them using Linux's time-based job scheduler: cron. + +# Task 1: Log Rotation Script + +Script: log_rotate.sh + +This script takes a directory path as an argument, compresses .log files older than 7 days, and deletes .gz files older than 30 days to free up storage space. + +Bash + +#!/bin/bash + +#This is for log rotation + +#Important: it takes a path of directory as an argument +set -eou pipefail + + +check_for_argument() { + + echo "Please provide the path as an argument of log directory" + exit 1 +} + +if [ $# -eq 0 ] ; then + + check_for_argument +fi + +log_dir_path=$1 + +compress_log() { + + # command used to find and compress files older than 7 days + find $log_dir_path -name "*.log" -type f -mtime +7 -exec gzip {} \; + echo "Total files compressed are $(find $log_dir_path -name "*.log.gz" -type f | wc -l)" +} + +delete_gz() { + + echo "Total files deleted are $(find $log_dir_path -name "*.gz" -type f -mtime +30 | wc -l)" + # command used to delete the .gz files + find $log_dir_path -name "*.gz" -type f -mtime +30 -delete +} + +compress_log + +delete_gz + +# Task 2: Server Backup Script + +Script: backup.sh + +This script takes a source and destination path, creates a compressed timestamped archive, verifies its creation, prints the size, and cleans up backups older than 14 days. + +Bash + +#!/bin/bash + +directory_path() { + + echo "Please enter the source and destination path in the exact flow" + exit 1 +} + +if [ $# -lt 2 ] ; then + + directory_path +fi + +source_path="$1" + +destination_path="$2" + +#Check if the source exists + +if [ ! -d "$source_path" ]; then + + echo "ERROR: Source directory '$source_path' does not exist." + exit 1 +fi + +archive() { + + # Define the full path for the output file + local archive_name="$destination_path/backup-$(date +%Y-%m-%d).tar.gz" + + # Run tar with the output file first, then use -C to go to source, then . for content + tar -czvf "$archive_name" -C "$source_path" . + + if [ $? -eq 0 ] ; then + echo "Archive file created successfully: $archive_name" + # Print file size as requested + echo "Archive size is: $(du -sh "$archive_name" | cut -f1)" + fi + + echo "Archive files are: " + echo "$(find $destination_path -name "*.tar.gz" -type f)" +} + +delete_old_backups() { + + find $destination_path -name "*.tar.gz" -type f -mtime +14 -delete +} + +archive + +delete_old_backups + +# Task 3 & 4: Scheduled Maintenance & Crontab + +Script: maintenance.sh + +A master script that calls both the backup and log rotation scripts, logging every action with a timestamp. + +Bash +#!/bin/bash + +#Configuration + +LOG_FILE="/var/log/maintenance.log" + +# Ensure your scripts are in your PATH or use absolute paths + +LOG_ROTATE_SCRIPT="/home/sachin/scripts/log_rotate.sh" + +BACKUP_SCRIPT="/home/sachin/scripts/backup.sh" + +# Function to log messages with timestamps + +log_message() { + + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" +} + +log_message "Starting scheduled maintenance." + +#Call Log Rotation + +log_message "Running log rotation..." + +bash "$LOG_ROTATE_SCRIPT" /var/log/myapp >> "$LOG_FILE" 2>&1 + +#Call Backup + +log_message "Running backup..." + +bash "$BACKUP_SCRIPT" /home/user/data /backups >> "$LOG_FILE" 2>&1 + +log_message "Maintenance completed successfully." + + + +# Crontab Entries + +I practiced writing the cron syntax to schedule these jobs automatically. (Viewed via crontab -l, edited via crontab -e). + +Bash + +#Run log_rotate.sh every day at 2 AM + +0 2 * * * /home/sachin/scripts/log_rotate.sh /var/log/myapp + +#Run backup.sh every Sunday at 3 AM + +0 3 * * 0 /home/sachin/scripts/backup.sh /home/user/data /backups + +#Run a health check script every 5 minutes + +*/5 * * * * /home/sachin/scripts/health_check.sh + +#Run the combined maintenance script daily at 1 AM + +0 1 * * * /home/sachin/scripts/maintenance.sh + +# What I Learned + +The Power of find and -exec: I learned that the find command is incredibly versatile. +Combining -mtime +7 with -exec gzip {} \; allowed me to find old files and immediately run a compression command on each of them in a single line. + +Mastering the Tarball: Creating archives with tar is a staple in Linux. Using the -C flag to change into the source directory before zipping prevents the archive from saving the absolute folder path structure (like /home/user/data/), making extractions much cleaner. + +Cron Syntax: The five stars of cron (* * * * * representing Minute, Hour, Day of Month, Month, Day of Week) look intimidating at first, but they provide absolute control over exactly when an automation triggers. Appending >> "$LOG_FILE" 2>&1 ensures that both standard output and errors are captured while I am asleep! From 62c2db0a21ad354a725f6518fa998c022c5243a7 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Mon, 8 Jun 2026 12:42:11 +0530 Subject: [PATCH 26/76] Enhance log_analyzer.sh with better validation and comments Updated the log_analyzer.sh script for improved file validation and added detailed comments for clarity. --- 2026/day-20/day-20-solution.md | 135 +++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 2026/day-20/day-20-solution.md diff --git a/2026/day-20/day-20-solution.md b/2026/day-20/day-20-solution.md new file mode 100644 index 0000000000..259cfaa732 --- /dev/null +++ b/2026/day-20/day-20-solution.md @@ -0,0 +1,135 @@ +# Day 20 Challenge: Automated Log Analysis + + +Overview +As system administrators and DevOps engineers, manually reading through thousands of lines of server logs is inefficient and prone to human error. For this challenge, I wrote log_analyzer.sh, a Bash script that automates the parsing of log files. It validates input, extracts specific error keywords, identifies critical events by line number, and generates a formatted, timestamped summary report. + +# 1. The Script: log_analyzer.sh +Here is the final, working code for the log analyzer. Notably, I updated the file validation to use the -f flag (checking for a file) rather than -d (checking for a directory), ensuring the script handles inputs accurately. + +Bash + +#!/bin/bash + +#1. Ensuring that the path argument is provided + +if [ "$#" -ne 1 ]; then + + echo "Error: Missing log file path." + echo "usage : $0 " + exit 1 +fi + +#2. Checking if the path actually exists + +log_path="$1" + +if [ ! -f "$log_path" ]; then + + echo "$log_path does not exist." + echo "Please enter a valid path." + exit 1 +fi + +#3. Count lines containing "ERROR" or "Failed" + +#Using -E for multiple patterns, -i for case-insensitivity, and -c to count + +ERROR_COUNT="$(grep -i -E -c "ERROR|Failed" "$log_path")" + +#4. Print the total error count to the console + +echo "Total errors/failures found: $ERROR_COUNT" + +#5. Searching and printing the lines that contain CRITICAL + +CRITICAL_EVENTS=$(grep -ni "CRITICAL" "$log_path" | awk '{print "line: " $0}') + +echo "-----Critical Events-----" + +echo "$CRITICAL_EVENTS" + +#6. Finding the top 5 most occurred Error messages + +#7. The pipeline: Extract -> Strip Timestamp -> Sort -> Count -> Sort Descending -> Top 5 + +TOP_5_ERRORS="$(grep -i "ERROR" "$log_path"| cut -c 21- | sort | uniq -c | sort -nr | head -n 5)" + +echo "--- Top 5 Error Messages ---" + +echo "$TOP_5_ERRORS" + +echo "" + +#8. Gather remaining data for the report + +CURRENT_DATE=$(date +"%Y-%m-%d") + +REPORT_FILE="log_report_${CURRENT_DATE}.txt" + +TOTAL_LINES=$(wc -l < "$log_path") + +#9. Generate the report using the variables we already saved + +{ + + echo "========================================" + echo " LOG ANALYSIS REPORT " + echo "========================================" + echo "Date of analysis: $(date +"%Y-%m-%d %H:%M:%S")" + echo "Log file name: $log_path" + echo "Total lines processed: $TOTAL_LINES" + echo "Total error count: $ERROR_COUNT" + echo "" + echo "--- Top 5 Error Messages ---" + # Just print the variable instead of running grep again! + echo "$TOP_5_ERRORS" + echo "" + echo "--- Critical Events (with line numbers) ---" + echo "$CRITICAL_EVENTS" + echo "========================================" + +}> "$REPORT_FILE" + +echo "Report successfully generated: $REPORT_FILE" + +# 2. Commands and Tools Used + +To make this script efficient, I heavily relied on Linux text-processing utilities and command pipelines: + +grep: The core search tool. I used -i to ignore case, -E to search for multiple patterns (ERROR|Failed), -c to return a raw count instead of text, and -n to print the exact line number of the match. + +awk: Used for text formatting. awk '{print "line: " $0}' allowed me to prepend the word "line:" to the output of my grep search for better readability. + +cut: Used in the Top 5 pipeline. By using cut -c 21-, I stripped away the first 20 characters (the timestamps) so that identical error messages could be grouped properly, regardless of when they occurred. + +sort & uniq: The grouping engine. I sorted the text alphabetically first, used uniq -c to count adjacent identical lines, and then used sort -nr to sort those counts numerically in reverse (highest to lowest). + +head: Used to cap the pipeline output to only the top 5 results. + +wc -l: Used to count the total number of lines processed in the target file. + +# 3. Sample Console Output +When running the script against a standard system log file (./log_analyzer.sh sample_log.log), the console outputs the following: + +Plaintext +Total errors/failures found: 142 +-----Critical Events----- +line: 84: 2026-02-11 10:15:23 CRITICAL Disk space below threshold +line: 217: 2026-02-11 14:32:01 CRITICAL Database connection lost +--- Top 5 Error Messages --- + 45 Connection timed out + 32 File not found + 28 Permission denied + 15 Disk I/O error + 9 Out of memory + +Report successfully generated: log_report_2026-02-11.txt +(Note: The generated log_report_2026-02-11.txt file contains this exact data formatted cleanly within the summary borders). + +# 4. What I Learned +Robust File Validation: Checking for [ ! -f "$log_path" ] instead of just checking if the string is empty ensures the script doesn't crash halfway through if the user provides a typo in the file path. + +The Power of Pipelining: Chaining commands together is where Bash truly shines. Creating a pipeline that extracts text, strips timestamps, sorts, counts, sorts again, and limits the output (grep | cut | sort | uniq -c | sort -nr | head) is an incredibly powerful way to process data without writing loops. + +Grouped Output Redirection: Instead of writing complex >> append redirects for every single line of the final report, wrapping all the echo statements inside curly braces { ... } > "$REPORT_FILE" cleanly directs the entire block into the text file at once. From e5fb740b9a7ebc3ddf6410a5fc84a5deb8b0b040 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Mon, 8 Jun 2026 14:10:27 +0530 Subject: [PATCH 27/76] Create shell_scripting_cheatsheet.md Added a comprehensive shell scripting cheatsheet covering variables, loops, functions, text processing, and error handling. --- 2026/day-21/shell_scripting_cheatsheet.md | 412 ++++++++++++++++++++++ 1 file changed, 412 insertions(+) create mode 100644 2026/day-21/shell_scripting_cheatsheet.md diff --git a/2026/day-21/shell_scripting_cheatsheet.md b/2026/day-21/shell_scripting_cheatsheet.md new file mode 100644 index 0000000000..38d059860a --- /dev/null +++ b/2026/day-21/shell_scripting_cheatsheet.md @@ -0,0 +1,412 @@ +| **Variable** | `VAR="value"` | `NAME="DevOps"` | + +| **Argument** | `$1, $2` | `./script.sh arg1` | + +| **If Condition** | `if [ condition ]; then` | `if [ -f file.txt ]; then` | + +| **For Loop** | `for i in list; do` | `for i in 1 2 3; do` | + +| **Function** | `name() { ... }` | `greet() { echo "Hi"; }` | + +| **Grep** | `grep pattern file` | `grep -i "error" log.txt` | + +| **Awk** | `awk '{print $1}' file` | `awk -F: '{print $1}' /etc/passwd` | + +| **Sed** | `sed 's/old/new/g' file` | `sed -i 's/foo/bar/g' config.txt` | + + +# 1. Basics + +Shebang (#!/bin/bash) +Tells the computer which program to use to run the script. Always put this on the very first line. + +Bash: - +#!/bin/bash + +Running a Script +First, give the file permission to run, then execute it. + +Bash: - +chmod +x script.sh + +./script.sh + +Comments: - Notes that we can see. The computer ignores them. + +Bash: - +#This is a full-line comment + +echo "Hello" # This is an inline comment + +Variables: - +Store data to use later. Do NOT put spaces around the = sign. + +Bash: - +NAME="Sachin" + +echo "My name is $NAME" # Prints: My name is Sachin + +echo 'My name is $NAME' # Single quotes print exact text: My name is $NAME + +Reading User Input + +Ask the user to type something and save it as a variable. + +Bash:- read -p "Enter your age: " AGE + +echo "You are $AGE years old." + +# Command-Line Arguments + +Read values passed directly after the script name (e.g., ./script.sh apple orange). + +$0: The name of the script itself. + +$1, $2: The first and second words passed. + +$#: Total count of words passed. + +$@: All words passed as a single list. + +$?: Result (exit code) of the last command run. + +# 2. Operators and Conditionals + +# String Comparisons (Checking text) + +=: Matches exactly. + +!=: Does not match. + +-z: String is empty (zero length). + +-n: String is NOT empty. + +Bash: -- +if [ "$NAME" = "Sachin" ]; then echo "Match!"; fi + +# Integer Comparisons (Checking numbers) + +-eq: Equal to + +-ne: Not equal to + +-lt: Less than + +-gt: Greater than + +-le: Less than or equal to + +-ge: Greater than or equal to + +Bash:----if [ $AGE -gt 18 ]; then echo "Adult"; fi + +# File Test Operators (Checking files/folders) + +-f: Is it a normal file? + +-d: Is it a folder (directory)? + +-e: Does it exist at all? + +-r, -w, -x: Does the user have Read, Write, or Execute permission? + +-s: Is the file NOT empty (has some size)? + +Bash:-----if [ -f "/tmp/test.txt" ]; then echo "File exists!"; fi + +If, Elif, Else + +Make decisions in your code based on conditions. + +Bash + +if [ $NUM -gt 10 ]; then + + echo "Big" +elif [ $NUM -eq 10 ]; then + + echo "Exact" +else + + echo "Small" +fi + +# Logical Operators + +&& (AND): Both sides must be true. + +|| (OR): One side must be true. + +! (NOT): Flips the result. + +Bash + +if [ -f "file.txt" ] && [ -s "file.txt" ]; then + + echo "File exists AND is not empty." +fi + +# Case Statements + +A cleaner way to check a variable against many options. + +Bash + +case $FRUIT in + + "apple") echo "It's red" ;; + "banana") echo "It's yellow" ;; + *) echo "Unknown fruit" ;; # The * acts like "else" +esac + +# 3. Loops + +For Loop:--Run a piece of code a specific number of times. + +Bash + +#List-based + +for color in red blue green; do + + echo "$color" +done + +#C-style number range + +for i in {1..5}; do + + echo "Number $i" +done + +While Loop:---Keep running the code as long as the condition is true. + +Bash + +COUNT=1 + +while [ $COUNT -le 3 ]; do + + echo "Count is $COUNT" + COUNT=$((COUNT + 1)) +done + +Until Loop:---Keep running the code until the condition becomes true. + +Bash + +until [ -f "ready.txt" ]; do + + echo "Waiting for file..." + sleep 2 +done + +# Loop Control + +break: Stop the loop completely and exit it. + +continue: Skip the rest of this current round and go to the next one. + +# Looping Over Files + +Quickly do something to every file in a folder. + +Bash +for file in /var/log/*.log; do + + echo "Found log: $file" +done + +Looping Over Command Output + +Read output line by line (great for reading text files). + +Bash +cat names.txt | while read line; do + + echo "Processing $line" +done + +# 4. Functions + +Defining and Calling + +Group commands together so you can reuse them later. + +Bash + +#Define it + +say_hello() { + + echo "Hello there!" +} + +#Call it + +say_hello + +Passing Arguments + +Functions use their own $1 and $2, completely separate from the script's $1. + +Bash + +greet_user() { + + echo "Hello, $1!" +} + +greet_user "Sachin" # Passes Sachin as $1 + +Return Values vs. Echo + +return only passes back a number code (0-255) for success/fail. Use echo to pass back actual text. + +Bash + +get_status() { + + return 0 # Means success +} +Local Variables +Use local so the variable does not accidentally break things outside the function. + +Bash + +math_task() { + + local RESULT=42 + echo $RESULT +} + +# 5. Text Processing Commands + +grep (Search for text) + +-i: Ignore capital letters. + +-r: Search inside all folders. + +-c: Just count the matches. + +-n: Show the line number. + +-v: Show lines that do NOT match. + +Bash + +grep -i "error" server.log + +awk (Print specific columns) + +Great for splitting lines of text. $1 is the first column, $2 is the second. + +Bash + +#Split by spaces and print column 2 + +awk '{print $2}' file.txt + +sed (Find and replace) + + +s/old/new/g: Swap 'old' with 'new' globally on that line. + +-i: Save the changes directly to the file. + +Bash + +sed -i 's/IP/192.168.1.5/g' config.conf + +cut (Extract parts of a line) + +-d: What character splits the words? + +-f: Which chunk do you want? + +Bash:--cut -d':' -f1 /etc/passwd # Gets a list of usernames + +Other Quick Tools + +sort: Sorts lines A-Z. (sort -nr sorts numbers highest to lowest). + +uniq -c: Groups matching lines together and counts them. + +tr 'a' 'b': Changes all 'a' letters to 'b'. + +wc -l: Counts total lines in a file. + +head -n 5: Shows the top 5 lines. + +tail -f: Shows the bottom lines and watches live as new lines are added. + +# 6. Useful Patterns and One-Liners + +1. Find and delete files older than 30 days + + +Bash:---find /backup -name "*.tar.gz" -type f -mtime +30 -delete + +2. Count lines in all .log files + +Bash:---wc -l *.log + +3. Replace a word inside multiple files at once + +Bash:--sed -i 's/localhost/127.0.0.1/g' *.conf + +4. Check if a service (like Nginx) is running + +Bash:---ps aux | grep "[n]ginx" || echo "Nginx is DOWN!" + +5. Watch a log file live and filter only for Errors + +Bash:---tail -f /var/log/syslog | grep -i "error" + +# 7. Error Handling and Debugging + +Exit Codes ($?) + +Every command leaves a secret number behind when it finishes. 0 means success. Anything else means an error. + +Bash + +ping -c 1 google.com + +if [ $? -eq 0 ]; then echo "Internet is working"; fi + +Strict Mode Flags (Put these at the top of your script) + +set -e: Stops the script instantly if any command fails. + +set -u: Stops the script if you try to use an empty/undefined variable. + +set -o pipefail: Stops the script if any part of a chained | command fails. + +Bash + +#!/bin/bash + +set -euo pipefail + +Debug Mode (set -x) + +Prints every single command to your screen right before it runs. Perfect for finding where a script is breaking. + +Bash + +set -x # Turn debug on + +echo "Testing" + +set +x # Turn debug off + +Trap + +Tells the script to do a specific task right before it exits or crashes (like deleting temporary junk files). + +Bash + +trap 'echo "Script finished, cleaning up..."; rm -f /tmp/junk.txt' EXIT From ad68acb19eef7f3a636f77ae9221dddd9c2a4ece Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 9 Jun 2026 12:04:03 +0530 Subject: [PATCH 28/76] Add Git commands and concepts notes Added basic Git commands and explanations, including differences between git add and commit, and an overview of working directory, staging area, and repository. --- 2026/day-22/day-22-git-notes.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 2026/day-22/day-22-git-notes.md diff --git a/2026/day-22/day-22-git-notes.md b/2026/day-22/day-22-git-notes.md new file mode 100644 index 0000000000..6fa87e95a6 --- /dev/null +++ b/2026/day-22/day-22-git-notes.md @@ -0,0 +1,25 @@ +# Basic commands for git and a quick tip + +git init: initialise your repo as a local version controller + +git status: tells you about the changes that have occurred + +git add. : it moves the file from the file system to a staging area. The "." file allows you to add all the files with a single command + +git commit -m: commits the changes that you made in the file + +DIFFERENCE BETWEEN GIT ADD and COMMIT + +git add takes the file from the file system and places it in the staging area, where it waits for commit + +while git commit takes the staging file and adds the commit instruction to it and takes it to version control + +In the staging area you cannot access the history of a change + +git log tells you the exact version control history + +What is the difference between a working directory, staging area, and repository? + +Lets learn this with an example, suppose you have to edit a file need to change or modify something in a file then you need a space or a platform for that where the worrking directory comees in: here you can edit modify or update the changes inside the file , Now you take that file into a place where it is crossed check that these are the final edited files that need to commit this area is a staging area, now after confirmation you finaly commit it and add to vsersion controll sys tem where you can see retrive the file see who changes the file and maintain a record of all the upgrades. + +the key thing that I learned is the commit command: commit all the files that are in the staging area at once with the same commit message, so cross-check the status before committing From 9fc5cbbba7d929e1dfe2fa848820d595e193367d Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 9 Jun 2026 16:26:53 +0530 Subject: [PATCH 29/76] Add Day 23 notes on Git branching and GitHub --- 2026/day-23/day-23-notes.md | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 2026/day-23/day-23-notes.md diff --git a/2026/day-23/day-23-notes.md b/2026/day-23/day-23-notes.md new file mode 100644 index 0000000000..7ec837a767 --- /dev/null +++ b/2026/day-23/day-23-notes.md @@ -0,0 +1,65 @@ +# Day 23 – Git Branching & Working with GitHub + + +## Task 1: Understanding Branches + +### What is a branch in Git? + +> A branch is like a separate workspace. It lets you make a copy of the code, work on it, and make changes without touching the main project. + +### Why do we use branches instead of committing everything to main? +> We use branches to keep the main (or master) code safe. If we make a mistake while adding a new feature, it only breaks the branch, not the working main code. Once the branch is perfect, we can merge it into main. + +### What is HEAD in Git? +>HEAD is just a marker or a pointer. It tells Git which branch or commit you are currently looking at and working on right now. + +### What happens to your files when you switch branches? +>The files in your computer folder physically change. Git updates the files in your folder to look exactly how they did in the branch you just switched to. + +## Task 2: Branching Commands + +(I have updated my git-commands.md file with these new commands) + +git branch (Lists all branches) + +git branch (Creates a new branch) + +git checkout (Switches to a branch) + +git checkout -b (Creates and switches to a new branch at the same time) + +git switch (A newer, simpler command just for switching branches) + +git branch -d (Deletes a branch) + +## Task 3: Push to GitHub + +### What is the difference between origin and upstream? + +>Origin: This is the link to your own repository on GitHub. When you push code, it goes here. + +>Upstream: This is the link to the original repository created by someone else (used when you fork a project). + +## Task 4: Pull from GitHub + +### What is the difference between git fetch and git pull? + +>git fetch: This talks to GitHub and downloads the latest updates, but it does NOT change the files on your computer. It just lets you see what is new. + +>git pull: This downloads the latest updates from GitHub AND immediately updates the files on your computer to match. + +## Task 5: Clone vs Fork +### What is the difference between clone and fork? + +>Fork: This is a GitHub button. It copies someone else's project into your own GitHub account online. + +>Clone: This is a Git command. It copies a repository from GitHub down to your actual computer so you can work on the files. + +### When would you clone vs fork? + +>You clone when you want to work on a project you already own, or if you just want to download files to look at them. + +>You fork when you want to make changes to someone else's public project. You fork it to your account first, then clone it to your computer, make changes, and ask them to accept your changes later. + +### After forking, how do you keep your fork in sync with the original repo? +>You add the original person's repository link as an "upstream" remote. Then, you use a command like git pull upstream main to get their latest updates into your copy. From 16ae50928afe25ca1302e1a2434d2d634441b177 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 11 Jun 2026 10:23:05 +0530 Subject: [PATCH 30/76] Create notes for advanced Git techniques Added detailed notes on advanced Git concepts including merge, rebase, stash, and cherry-pick. --- 2026/day-24/24-notes.md | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 2026/day-24/24-notes.md diff --git a/2026/day-24/24-notes.md b/2026/day-24/24-notes.md new file mode 100644 index 0000000000..b80a15c366 --- /dev/null +++ b/2026/day-24/24-notes.md @@ -0,0 +1,60 @@ +# Day 24 – Advanced Git: Merge, Rebase, Stash & Cherry Pick + +## Task 1: Git Merge +### What is a fast-forward merge? +>If you make a new branch, and nobody changes the main branch while you are working, Git doesn't need to do any hard work to merge. It just moves the main pointer forward to catch up with your branch. That is a fast-forward merge. + +### When does Git create a merge commit instead? +>If you added commits to your feature branch, AND someone else added new commits to the main branch at the same time, Git has to combine them. It creates a brand new "Merge Commit" to join both histories together. + +### What is a merge conflict? +>A conflict happens when you edit the exact same line of the exact same file in two different branches. Git gets confused and basically says, "I don't know which version is the correct one, please fix this manually before I merge." + +## Task 2: Git Rebase +### What does rebase actually do to your commits? +>Instead of joining two branches with a messy merge commit, rebase unplugs your feature branch, moves it, and plugs it in at the very tip of the latest main branch. + +### How is the history different from a merge? + +Merge: Creates a diamond shape in your Git history (git log --graph). + +Rebase: Makes your history look like one single, clean, straight line. + +### Why should you never rebase commits that have been pushed and shared with others? +>Rebase literally rewrites history and changes the commit IDs (hashes). If you do this to a branch your teammate is also working on, their local Git will get completely out of sync and it will cause massive headaches for them. + +### When would you use rebase vs merge? + +>Use Merge for shared branches (like bringing a finished feature into main). + +>Use Rebase for your own local, private branch to keep it updated with main before you push it. + +## Task 3: Squash Commit vs Merge Commit +### What does squash merging do? +When you work on a feature, you might make 10 tiny commits (like "fixed typo", "testing", "fixed again"). Squash merge takes all those messy commits, crushes them into one single, clean commit, and puts that onto main. + +### When would you use squash merge vs regular merge? +Use squash merge when your feature branch has a lot of useless, messy commits that you don't want to show in the main project history. Use a regular merge when every single commit is important and tells a story. + +### What is the trade-off of squashing? +You get a very clean main branch, but you completely lose the step-by-step history of how you actually built that feature. + +### Task 4: Git Stash +### What is the difference between git stash pop and git stash apply? + +>git stash pop: Brings your saved work back and deletes it from the stash list. + +>git stash apply: Brings your saved work back but keeps a backup copy of it in the stash list just in case. + +### When would you use stash in a real-world workflow? +>Imagine you are halfway through writing code for a new feature, and your boss tells you to fix a critical bug on main right now. You can't commit half-written code, and you can't switch branches with unsaved changes. So, you git stash to hide your messy work, switch to main, fix the bug, and then come back and git stash pop to resume your work exactly where you left off. It is a lifesaver. + +## Task 5: Cherry Picking +### What does cherry-pick do? +>It lets you pick one specific commit from any branch and copy it into your current branch, without merging the whole thing. + +### When would you use cherry-pick in a real project? +>If a teammate fixed a really annoying bug in their feature branch, and you need that exact bug fix in your branch right now, but their feature isn't finished yet. You just cherry-pick their bug fix commit hash. + +### What can go wrong with cherry-picking? +>Merge conflicts! I actually faced this today. If the commit you are copying relies on other code that doesn't exist in your branch, Git will throw a conflict. (In my screenshots, you can see I got an error: could not apply and had to abort and try again carefully). From 59d4621c6de6c3e69e2eeab6b0c30d7c6fe19bdf Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 12 Jun 2026 09:51:03 +0530 Subject: [PATCH 31/76] Document git reset command behaviors Added notes explaining the effects of git reset commands. --- 2026/day-25/day-25-notes.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 2026/day-25/day-25-notes.md diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md new file mode 100644 index 0000000000..cd21721825 --- /dev/null +++ b/2026/day-25/day-25-notes.md @@ -0,0 +1,8 @@ +### Use git reset --soft to go back one commit — what happens to the changes? +> git reset --soft is used to undo the commit and place the changes into the staging area. NOTE: It does not change or modify/undo the actual change; it only undoes the commit from version control to stagging area + +### Re-commit, then use git reset --mixed to go back one commit — what happens now? +> When using it with --mixed, it did the same task: undo commits, not actual changes, but here it did not take the change to the staging area insted it takes to untracked, infact other files stored in the staged area will also be trafnfed into untracked area + +### Re-commit, then use git reset --hard to go back one commit — what happens this time? +> This one is amazing; it not only undoes the commits but also deletes the commit from the record; the commit will not be in staging nor untracked; it is removed permanently. NOTE: it will also not undo the actual changes From 35f0f63e8f8c5680b8198769e60a06754aaf9847 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 12 Jun 2026 10:26:47 +0530 Subject: [PATCH 32/76] added few things about revert Clarify behavior of git reset and revert commands in notes. --- 2026/day-25/day-25-notes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md index cd21721825..4c610b6434 100644 --- a/2026/day-25/day-25-notes.md +++ b/2026/day-25/day-25-notes.md @@ -6,3 +6,6 @@ ### Re-commit, then use git reset --hard to go back one commit — what happens this time? > This one is amazing; it not only undoes the commits but also deletes the commit from the record; the commit will not be in staging nor untracked; it is removed permanently. NOTE: it will also not undo the actual changes + +### Revert commit Y (the middle one) — what happens? +> It will do the OSM thing it undo your changes that you created, but it did not undo the commit that you made From 60e9c62d762ba62a94069bb07cbe870df4e31f1e Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 12 Jun 2026 11:40:40 +0530 Subject: [PATCH 33/76] Enhance day-25 notes on Git commands and strategies Expanded notes on git reset, revert, and branching strategies with detailed explanations and comparisons. --- 2026/day-25/day-25-notes.md | 81 +++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 8 deletions(-) diff --git a/2026/day-25/day-25-notes.md b/2026/day-25/day-25-notes.md index 4c610b6434..4edf78b2a8 100644 --- a/2026/day-25/day-25-notes.md +++ b/2026/day-25/day-25-notes.md @@ -1,11 +1,76 @@ -### Use git reset --soft to go back one commit — what happens to the changes? -> git reset --soft is used to undo the commit and place the changes into the staging area. NOTE: It does not change or modify/undo the actual change; it only undoes the commit from version control to stagging area +# Day 25 – Git Reset vs Revert & Branching Strategies -### Re-commit, then use git reset --mixed to go back one commit — what happens now? -> When using it with --mixed, it did the same task: undo commits, not actual changes, but here it did not take the change to the staging area insted it takes to untracked, infact other files stored in the staged area will also be trafnfed into untracked area -### Re-commit, then use git reset --hard to go back one commit — what happens this time? -> This one is amazing; it not only undoes the commits but also deletes the commit from the record; the commit will not be in staging nor untracked; it is removed permanently. NOTE: it will also not undo the actual changes +## Task 1: Git Reset (Undoing Mistakes) +I practiced making 3 commits and using different reset commands. Here is what I observed: -### Revert commit Y (the middle one) — what happens? -> It will do the OSM thing it undo your changes that you created, but it did not undo the commit that you made +> git reset --soft: This is used to undo the commit and place the changes back into the staging area. NOTE: It does not delete your actual file changes; it just undoes the commit step so you can add more things or change the message. + +> git reset --mixed: (This is the default if you just type git reset). This undoes the commit AND pulls everything out of the staging area. Your file changes are still there on your computer, but they are now untracked/unstaged. + +> git reset --hard: This one is serious. It undoes the commit from the record permanently AND it throws away the actual changes in your files. Your files go back to exactly how they looked at the previous commit. + +### Answers: + +> Which one is destructive and why? --hard is destructive because it deletes your uncommitted working directory changes. If you haven't backed up that code, it is gone! + +> When would you use each one? * Use --soft when you just want to edit your last commit message or add one missed file to it. + +> Use --mixed when you want to un-commit and un-stage things to review your code again. + +> Use --hard when your code is completely messed up and you want to throw it all in the trash and start fresh from the last commit. + +> Should you ever use git reset on pushed commits? NO! It rewrites history. If your team has already downloaded that commit and you delete it from history, it will cause huge conflicts for everyone. + +## Task 2: Git Revert +I made 3 commits (X, Y, Z) and used git revert on the middle one (Y). + +### Answers: + +> What happens? It does an awesome thing: it undoes the code changes you created in commit Y, but it does not delete commit Y from the history. Instead, it creates a brand new commit that says "Revert Y". + +> How is git revert different from git reset? reset goes back in time and erases history. revert moves forward by creating a new commit that acts like an "undo button" for a past mistake. + +> Why is revert considered safer? Because it keeps the history intact. If you push code to GitHub and realize it has a bug, using revert is safe because it won't mess up your teammates' local history. + +> When to use which? Use reset for mistakes on your own private, local computer. Use revert for mistakes that have already been pushed to the public GitHub repository. + +| Topic | git reset | git revert | +|----------------------------------|-------------------------------------------------|-------------------------------------------------------| +| What it does? | Erases a commit and moves the pointer backward. | Creates a new commit that reverses a previous change. | +| Removes commit from history? | YES | NO | +| Safe for shared/pushed branches? | NO (Never do this) | YES (Best practice) | +| When to use? | Local, un-pushed mistakes. | Public, already-pushed mistakes. | + +## Task 4: Branching Strategies + How real engineering teams manage their code: + +### 1. GitFlow + +How it works: A very strict and heavy model. You have a main branch (for production) and a develop branch. Features branch off from develop. When ready, develop goes to a release branch, and finally to main. + +Flow: Feature -> Develop -> Release -> Main. (Plus Hotfix branches directly to Main for emergencies). + +Pros/Cons: Great for strict control, but very slow and complex. + +### 2. GitHub Flow + +How it works: Very simple. There is only one rule: the main branch must always be deployable. You create a feature branch off main, test it, open a Pull Request, and merge it straight back to main. + +Flow: Main -> Feature Branch -> Pull Request -> Main. + +Pros/Cons: Fast and simple, but requires strong automated testing. + +### 3. Trunk-Based Development + +How it works: Developers don't make long-living feature branches. Everyone pushes their small, daily code updates directly to the main branch (the "trunk"). They use "feature flags" to hide unfinished features from users. + +Pros/Cons: Super fast collaboration, no merge conflicts, but requires highly skilled teams and intense testing. + +## Answers: + +Which strategy for a fast-shipping startup? GitHub Flow or Trunk-Based Development. It lets them push code quickly. + +Which strategy for a large team with scheduled releases? GitFlow. It is safe, structured, and allows for formal testing before a big launch. + +Open-source projects? Most open-source projects (like React or Linux) use a variation of GitHub Flow combined with Forking. From 7d24e868660f6faec4619d7d45b0e8ee961895a2 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 12 Jun 2026 17:18:42 +0530 Subject: [PATCH 34/76] Document authentication methods for GitHub CLI Added notes on authentication methods supported by GitHub CLI. --- 2026/day-26/day-26-notes.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2026/day-26/day-26-notes.md diff --git a/2026/day-26/day-26-notes.md b/2026/day-26/day-26-notes.md new file mode 100644 index 0000000000..69b3916ef4 --- /dev/null +++ b/2026/day-26/day-26-notes.md @@ -0,0 +1,2 @@ +## Answer in your notes: What authentication methods does gh support? +> gh (GitHub CLI) supports mainly two methods that are web browser-based and personal token-based. Of those, I choose web browser-based From cbdc7670fc087354d454f7b2890c792f5176a115 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sat, 13 Jun 2026 21:42:15 +0530 Subject: [PATCH 35/76] Update Day 26 notes with detailed GitHub CLI tasks Expanded notes for Day 26 GitHub CLI challenge, detailing tasks and commands used for authentication, repository management, issues, pull requests, GitHub Actions, and useful tricks. --- 2026/day-26/day-26-notes.md | 96 ++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/2026/day-26/day-26-notes.md b/2026/day-26/day-26-notes.md index 69b3916ef4..d3c78f83dc 100644 --- a/2026/day-26/day-26-notes.md +++ b/2026/day-26/day-26-notes.md @@ -1,2 +1,94 @@ -## Answer in your notes: What authentication methods does gh support? -> gh (GitHub CLI) supports mainly two methods that are web browser-based and personal token-based. Of those, I choose web browser-based +# Day 26 - GitHub CLI Complete Notes + +Here are my full notes for the Day 26 GitHub CLI challenge, covering everything from Task 1 to Task 6. I've included the actual commands I ran and some mistakes I fixed along the way based on my terminal output. + +## Task 1: Install and Authenticate + +Getting logged in was straightforward using `gh auth login`. I chose the web browser option. Later on, when I tried to delete a repository in Task 2, I found out I didn't have the right permissions. I had to run `gh auth refresh -h github.com -s delete_repo` to get a new one-time code and grant my CLI permission to delete repos. + +**Answer to the challenge question:** +* **What authentication methods does `gh` support?** + It supports authenticating through the web browser (which gives you a one-time code) or by pasting in a Personal Access Token (PAT) that you generate in your GitHub developer settings. + +--- + +## Task 2: Working with Repositories + +I tested out managing my repositories entirely from the command line. Here are the commands I used: + +* **Create a repo:** `gh repo create my-test-repo --public --add-readme` +* **Clone a repo:** `gh repo clone 00-Sachin/Git-Practice` +* **View repo details:** `gh repo view 00-Sachin/Git-Practice` +* **List my repos:** `gh repo list` (This showed my 5 repos, like `90DaysOfDevOps` and `shell-scripts`) +* **Open in browser:** `gh repo view 00-Sachin/Git-Practice --web` +* **Delete a repo:** `gh repo delete 00-Sachin/git-cli-repo --yes` + +*Note: As mentioned in Task 1, the delete command threw an HTTP 403 error at first until I refreshed my auth token with the `delete_repo` scope.* + +--- + +## Task 3: Issues + +I practiced managing issues without opening the GitHub website. I actually ran into a GraphQL error at first because I typed my username wrong (`Sachin` instead of `00-Sachin`), but it worked perfectly once I fixed it. + +Here are the commands: +* **Create an issue:** `gh issue create --repo 00-Sachin/Git-Practice --title "Bug: Login button broken" --body "The login button does not respond on mobile devices." --label "bug"` +* **List issues:** `gh issue list --repo 00-Sachin/Git-Practice` +* **View an issue:** `gh issue view 2 --repo 00-Sachin/Git-practice` +* **Close an issue:** `gh issue close 2 --repo 00-Sachin/Git-practice` + +**Answer to the challenge question:** +* **How could you use `gh issue` in a script or automation?** + You could write a script that automatically runs `gh issue create` if a backup fails or a server goes down, alerting the team right away. You can also use the `--json` flag to pull a list of open bugs into a daily report. + +--- + +## Task 4: Pull Requests + +I tested creating a pull request straight from the terminal. I made a change to my README, committed it, and then ran the PR create command. I noticed I had some uncommitted changes during the process, but it still worked and opened the comparison page right in my browser session. Afterwards, when I ran `gh pr list`, I could see my open pull request (PR #3) sitting there. + +Here are the commands I used: +* `git checkout -b feature-gh-cli-test` +* `git commit -am "docs: update README via gh cli"` +* `gh pr create --title "docs: update README via gh cli" --body "Testing GitHub CLI" --web` +* `gh pr list` +* `gh pr status` +* `gh pr merge` (to merge the PR when ready) + +**Answers to the challenge questions:** +* **What merge methods does `gh pr merge` support?** + It supports the normal three ways to merge: + 1. Standard merge commit (`--merge` or `-m`) + 2. Rebase and merge (`--rebase` or `-r`) + 3. Squash and merge (`--squash` or `-s`) + +* **How would you review someone else's PR using `gh`?** + I would do it in three steps: + 1. Pull their branch to my machine to test it: `gh pr checkout ` + 2. Look at the code changes: `gh pr diff` + 3. Leave my review or approve it: `gh pr review --approve -b "Looks good to me!"` + +--- + +## Task 5: GitHub Actions & Workflows (Preview) + +I haven't gone deep into GitHub Actions yet, but I tried out the commands to see how they work. + +* `gh run list` - shows a list of the recent workflow runs. +* `gh run view` - lets you pick a specific run and see its status or logs. + +**Answer to the challenge question:** +* **How could `gh run` and `gh workflow` be useful in a CI/CD pipeline?** + It makes debugging way faster. If my code fails a pipeline test, I don't need to open my browser, log into GitHub, and click through menus to find the error. I can just type `gh run view` in the terminal to see exactly what failed. You can also manually start a pipeline from the terminal using `gh workflow run`. + +--- + +## Task 6: Useful gh Tricks + +I explored some extra commands and added these to my personal git commands list: + +* **`gh api user`**: Grabs my user data directly from the GitHub API. +* **`gh gist create script.sh --public`**: A really fast way to share a piece of code as a public Gist. +* **`gh release create v1.0.0 --notes "Initial release"`**: Creates a new project release. +* **`gh alias set pv "pr view"`**: Lets me make my own short commands so I type less. +* **`gh search repos "devops"`**: Finds repositories on GitHub without needing to use the website search bar. From 92f57765d0133949082881e71c2e4a0e898cdb12 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 14 Jun 2026 21:57:06 +0530 Subject: [PATCH 36/76] Revise GitHub profile makeover notes Updated GitHub profile notes to reflect changes made. --- 2026/day-27/day-27-notes.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 2026/day-27/day-27-notes.md diff --git a/2026/day-27/day-27-notes.md b/2026/day-27/day-27-notes.md new file mode 100644 index 0000000000..5bad8f4635 --- /dev/null +++ b/2026/day-27/day-27-notes.md @@ -0,0 +1,35 @@ +# Day 27 – GitHub Profile Makeover + + +## Task 1: Audit Your Current GitHub Profile +Before making changes, I looked at my profile as a stranger would. Here is what I found: +* **Is your profile picture professional?** It was okay, but I made sure it is clear and recognizable. +* **Is your bio filled in?** No, my bio was previously empty or very short. It didn't clearly state that I am an aspiring DevOps engineer. +* **Are your pinned repos relevant?** No, it was just a random mix of old forks (like `html-basic-web-page`) and test repos. +* **Do your repos have descriptions?** Some did, but many were missing descriptions and proper READMEs explaining what the code actually does. +* **Would a recruiter understand what I do?** Probably not. They would see scattered code but no clear story of my DevOps journey. + +## Task 2: Create Your Profile README +I created a special repository named `00-Sachin` and added a `README.md` file. I kept it clean and simple, adding a short introduction, the tools I am learning (Linux, Git, Bash, AWS), and links to my best repositories. + +## Task 3: Organize Your Repositories +I organized my repositories to make them look professional: +* **`90DaysOfDevOps`**: Updated the structure to track my daily markdown files and notes cleanly. +* **`shell-scripts`**: Consolidated all my Bash scripts (log rotation, system info, safe scripts) here with a clear description. +* **`python-for-devops`**: Ensured this repo is ready for my Python automation scripts. +* **`Git-Practice`**: Contains my `git-commands.md` cheat sheet and Git learning history. + +## Task 4: Pin Your Best Repos +I customized my pinned repositories on my main profile page. I pinned `90DaysOfDevOps`, `shell-scripts`, `python-for-devops`, and `Git-Practice`. This instantly shows visitors what my core skills are. + +## Task 5: Clean Up +I used the GitHub CLI (`gh repo delete`) and the browser to delete old, messy test repositories (like the test repos I made on Day 26). I also made sure no `.pem` keys or passwords were accidentally pushed to public files. + +## Task 6: Before & After +*[Insert Screenshot of old GitHub profile here]* +*[Insert Screenshot of new GitHub profile here]* + +**3 Things I Improved and Why:** +1. **Added a Profile README:** It tells my story and gives context to my code, making my profile feel like a resume instead of a storage drive. +2. **Pinned Relevant Repos:** Pushing my shell-scripts and DevOps repos to the top ensures recruiters see my most relevant skills first. +3. **Cleaned Repo Names & Descriptions:** Adding simple descriptions to every repo makes it much easier for people to understand what my code does without having to read every file. From 296698c47da8629114ffd9dcab058bc9372d5d86 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 16 Jun 2026 11:26:54 +0530 Subject: [PATCH 37/76] Add Day 28 notes on revision and self-assessment Added notes for Day 28 focusing on self-assessment and knowledge gaps. --- 2026/day-28/day-28-notes.md | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 2026/day-28/day-28-notes.md diff --git a/2026/day-28/day-28-notes.md b/2026/day-28/day-28-notes.md new file mode 100644 index 0000000000..e2da94e398 --- /dev/null +++ b/2026/day-28/day-28-notes.md @@ -0,0 +1,59 @@ +# Day 28 – Revision Day: Everything from Day 1 to Day 27 + + +## 🔄 Task 1 & 2: Self-Assessment & Re-learning Weak Spots + +Today was all about taking a step back and plugging the gaps in my knowledge. I went through the checklist and identified a few areas where I needed a quick refresher. I spent today completely mastering these topics: + +- **Linux File System Hierarchy:** Reviewed the purposes of core directories (`/etc` for configs, `/var` for variable data like logs, `/tmp` for temporary files, etc.). +- **LVM (Logical Volume Management):** Revisited how to create and manage Physical Volumes (PV), Volume Groups (VG), and Logical Volumes (LV). +- **Network Connectivity Tools:** Practiced using `ping`, `curl`, `netstat`, `ss`, `dig`, and `nslookup` to diagnose network and DNS issues. +- **Shell Scripting Logic:** Re-wrote scripts using `case` statements and `until` loops to get the syntax deeply ingrained in my muscle memory. +- **Crontab Syntax:** Re-memorized the `* * * * *` format (Minute, Hour, Day of Month, Month, Day of Week). + +--- + +## ⚡ Task 3: Quick-Fire Questions + +*Note: I struggled with questions 2, 6, and 9 during my initial self-assessment. I have researched and provided the correct answers below so I never forget them!* + +**1. What does `chmod 755 script.sh` do?** It gives the owner Read, Write, and Execute permissions (`7`), and gives the group and others Read and Execute permissions (`5`). + +**2. ❌ [Initially got this wrong] What is the difference between a process and a service?** A process is any running instance of a program (like running `ls` or a `python` script). A service (or daemon) is a background process managed by the system (like `systemd`) that runs continuously without direct user interaction (like `nginx` or `sshd`). + +**3. How do you find which process is using port 8080?** By running `sudo ss -tulpn | grep 8080` or `sudo netstat -tulpn | grep 8080`. + +**4. What does `set -euo pipefail` do in a shell script?** It enables strict mode: `-e` exits on error, `-u` exits on undefined variables, and `-o pipefail` fails the script if any command in a piped chain fails. + +**5. What is the difference between `git reset --hard` and `git revert`?** `git reset --hard` deletes the commit history and destroys your working directory changes. `git revert` safely creates a brand new commit that undoes the previous changes, preserving history. + +**6. ❌ [Initially got this wrong] What branching strategy would you recommend for a team of 5 developers shipping weekly?** GitHub Flow. It is lightweight, uses a single `main` branch, relies on Pull Requests for features, and is perfect for small, agile teams that ship fast. + +**7. What does `git stash` do and when would you use it?** It temporarily hides your uncommitted changes. You use it when you are halfway through working on a file but urgently need to switch branches to fix a bug without committing broken code. + +**8. How do you schedule a script to run every day at 3 AM?** `0 3 * * * /path/to/script.sh` + +**9. ❌ [Initially got this wrong] What is the difference between `git fetch` and `git pull`?** `git fetch` just downloads the latest updates from GitHub so you can see them, but it doesn't change your local files. `git pull` downloads the updates AND immediately merges them into your current files. + +**10. What is LVM and why would you use it instead of regular partitions?** LVM pools physical hard drives together into a virtual volume. You use it because it allows you to dynamically resize, extend, or shrink storage partitions on the fly without system downtime. + +--- + +## 📋 Task 4: Organization Checklist + +- [x] All daily submissions pushed to GitHub. +- [x] `git-commands.md` updated with GitHub CLI (`gh`) commands. +- [x] Shell scripting cheat sheet completed. +- [x] GitHub profile README and repositories organized. + +--- + +## 🧑‍🏫 Task 5: Teach It Back + +### Explaining Crontab (Why SysAdmins Love It) + +You can call the crontab a scheduler. Why I am saying this is because it saves a lot of time for system admins by running the same processes at exact times automatically. Doing this manually is tough to follow every single day; we are humans, sometimes we forget, and that is not good for an organization. + +Suppose you are a system admin, your company does not allow you to use crontab, and you are assigned various tasks—one of them being to take a backup of files at 10 PM every day. Think how bad it is when you are finally spending your time relaxing with family, and then you suddenly realize, *"Ohhh, I have to run a script for backup."* The whole moment gets spoiled! + +Crontab saves you from manually running scripts, protects your personal time, and automates the heavy lifting. From 7d0336a346fc28b7c90468dcee5d60d486a8d73f Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 16 Jun 2026 23:34:24 +0530 Subject: [PATCH 38/76] Update Day 29 Docker Basics introduction Removed unnecessary file reference from the introduction. --- 2026/day-29/day-29-docker-basics.md | 76 +++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 2026/day-29/day-29-docker-basics.md diff --git a/2026/day-29/day-29-docker-basics.md b/2026/day-29/day-29-docker-basics.md new file mode 100644 index 0000000000..d5ff47d637 --- /dev/null +++ b/2026/day-29/day-29-docker-basics.md @@ -0,0 +1,76 @@ +# Day 29 – Introduction to Docker + +## 🐳 Task 1: What is Docker? + +### What is a container and why do we need them? +A container is a standardized unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. We need them to solve the classic *"It works on my machine!"* problem. If it runs in a container on my laptop, it will run exactly the same way on a production cloud server. + +### Containers vs Virtual Machines (VMs) +* **Virtual Machines:** Virtualize the hardware. Every VM requires a full, heavy Guest Operating System (like Windows or Ubuntu) to run on top of a Hypervisor. They take up gigabytes of storage and take minutes to boot. +* **Containers:** Virtualize the Operating System. They share the host machine's OS kernel and only contain the application and its binaries/libraries. They are incredibly lightweight (often just megabytes) and boot in milliseconds. + +### Docker Architecture +Docker uses a Client-Server architecture: +* **Docker Client:** The terminal command line (`docker run`, `docker build`) where we type our commands. +* **Docker Daemon (`dockerd`):** The background service running on the host machine that listens to the client and does the heavy lifting (building, running, and distributing containers). +* **Docker Images:** Read-only templates with instructions for creating a container (like a blueprint). +* **Docker Containers:** The live, running instances of an image. +* **Docker Registry (Docker Hub):** The cloud library where images are stored and downloaded from (public or private). + +--- + +## ⚙️ Task 2: Install Docker + +I already had Docker installed on my Ubuntu machine (`sachin-H510M-K-V2`). After verifying my user group permissions, I ran the classic verification command. + +**Running `hello-world`:** +```bash +docker run hello-world +``` +* **Observation:** Docker checked if I had the `hello-world` image locally. When it couldn't find it, it automatically pulled it from Docker Hub, created a container, printed a success message explaining how Docker works, and then stopped. + +--- + +## 🚀 Task 3: Run Real Containers + +**1. Running Nginx (Web Server):** +```bash +docker run -d -p 80:80 nginx +``` +* **Observation:** This downloaded the Nginx web server. Using `curl localhost:80`, I was able to see the raw HTML of the "Welcome to nginx!" default webpage proving the container was successfully routing traffic to my machine. + +**2. Running Ubuntu in Interactive Mode:** +```bash +docker run -it ubuntu /bin/bash +``` +* **Observation:** By using the `-it` (interactive + tty) flags, my terminal prompt completely changed from `sachin@sachin...` to `root@c8a0058b8f2d:/#`. I was literally inside a mini, isolated Ubuntu Linux machine running on top of my actual Ubuntu OS! + +**3. Container Management Commands Used:** +* `docker ps`: Listed my running Nginx container. +* `docker ps -a`: Listed all containers, including the stopped `hello-world` and `ubuntu` containers. +* `docker stop `: Stopped the running process. +* `docker rm `: Deleted the container permanently. + +--- + +## 🔍 Task 4: Explore + +I practiced running containers with customized configurations: + +**Detached Mode & Naming:** +```bash +docker run -d --name simple-nginx-container -p 80:80 nginx +``` +* **What's different?** The `-d` flag runs the container in the background. Instead of locking up my terminal with server logs, Docker just prints the long container ID and gives me my terminal prompt back. The `--name` flag made it much easier to identify than the random names Docker assigns. + +**Checking Logs:** +```bash +docker logs +``` +* **Observation:** Even though the container was running in the background, I could still fetch its historical output and access logs using this command. + +**Executing Commands Inside a Running Container:** +```bash +docker exec -it simple-nginx-container bash +``` +* **Observation:** Instead of starting a new container, `docker exec` allowed me to "open a door" and step inside the already-running Nginx container to look around its file system. From 2ddc46d764bf949a4150b1f0d5865eca67afdf01 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 18 Jun 2026 00:17:19 +0530 Subject: [PATCH 39/76] Create day-30-images.md for Docker images overview Added content for Day 30 covering Docker images and container lifecycle. --- 2026/day-30/day-30-images.md | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 2026/day-30/day-30-images.md diff --git a/2026/day-30/day-30-images.md b/2026/day-30/day-30-images.md new file mode 100644 index 0000000000..72dcea4f1c --- /dev/null +++ b/2026/day-30/day-30-images.md @@ -0,0 +1,66 @@ +# Day 30 – Docker Images & Container Lifecycle + + + +## 📦 Task 1: Docker Images + +I started by pulling three distinct images from Docker Hub: `nginx`, `ubuntu`, and `alpine`. + +**Image Size Comparison:** +* `nginx`: ~188MB +* `ubuntu`: ~78.1MB +* `alpine`: ~7.8MB + +**Why is Alpine so much smaller than Ubuntu?** +Alpine Linux is built specifically to be a minimal, resource-efficient OS for containers. It strips out all the unnecessary utilities, GUIs, and heavy standard libraries (using `musl libc` and `busybox` instead), whereas the `ubuntu` image includes more standard tools out-of-the-box. For DevOps, Alpine is often the go-to for keeping images lightweight and fast to deploy! + +I also successfully practiced inspecting images with `docker inspect ubuntu` (which dumped a massive JSON file of its metadata) and removed an image using `docker rmi ubuntu`. + +--- + +## 🥞 Task 2: Image Layers + +I ran `docker image history nginx` to see how the image was built. + +**What are layers and why does Docker use them?** +When looking at the history, I saw several lines. Each line represents a "layer" (a step from the Dockerfile used to build the image). + +* **Why layers?** Docker layers are read-only and stack on top of each other. Docker uses them for caching. If I build two different apps that both use the base `ubuntu` image, Docker only downloads the `ubuntu` layer once and shares it between both containers, saving massive amounts of disk space and download time. +* **Why 0B?** Some layers show `0 Bytes` because they only change configuration or metadata (like `ENV`, `CMD`, or `EXPOSE` instructions) rather than actually adding files to the system. + +--- + +## 🔄 Task 3: Container Lifecycle + +I practiced walking a single container through its entire lifecycle and verifying its state with `docker ps -a` at every step: + +* **Create:** `docker create --name test-container nginx` *(State: Created)* +* **Start:** `docker start test-container` *(State: Up)* +* **Pause:** `docker pause test-container` *(State: Up / Paused)* +* **Unpause:** `docker unpause test-container` *(State: Up)* +* **Stop:** `docker stop test-container` *(State: Exited)* +* **Restart:** `docker restart test-container` *(State: Up)* +* **Kill:** `docker kill test-container` *(State: Exited - abnormally)* +* **Remove:** `docker rm test-container` *(Container deleted)* + +--- + +## 💻 Task 4: Working with Running Containers + +I spun up an Nginx container in detached mode (`docker run -d --name my-nginx nginx`) and interacted with it: + +* **Real-time Logs:** Used `docker logs -f my-nginx` to watch the server access logs live. +* **Exec into the container:** Ran `docker exec -it my-nginx bash` to drop into the shell and explore the internal filesystem. +* **Execute a single command:** Ran `docker exec my-nginx ls -l` to list files without keeping the shell open. +* **Inspect IP:** Used `docker inspect my-nginx | grep IPAddress` to quickly find the internal Docker network IP assigned to my web server. + +--- + +## 🧹 Task 5: Cleanup + +To wrap up the day, I learned some powerful cleanup commands to reclaim disk space: + +* **Stop ALL running containers:** `docker stop $(docker ps -q)` +* **Remove ALL stopped containers:** `docker rm $(docker ps -aq)` +* **Check Disk Space:** `docker system df` *(Shows exactly how much space images, containers, and volumes are eating up)*. +* **The Nuclear Option:** `docker system prune -a` *(Cleans up all unused containers, networks, and images)*. From 059320e8f12b8100b5112895c86c7a7f191d0af5 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 18 Jun 2026 23:26:33 +0530 Subject: [PATCH 40/76] Create day-31-dockerfile.md for Dockerfile tutorial Added a new markdown file for Day 31 Dockerfile task. --- 2026/day-31/day-31-dockerfile.md | 103 +++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 2026/day-31/day-31-dockerfile.md diff --git a/2026/day-31/day-31-dockerfile.md b/2026/day-31/day-31-dockerfile.md new file mode 100644 index 0000000000..8739b76589 --- /dev/null +++ b/2026/day-31/day-31-dockerfile.md @@ -0,0 +1,103 @@ +# Day 31 – Dockerfile: Build Your Own Images + + + +## 🏗️ Task 1: Your First Dockerfile + +I created a directory called `my-first-image` and wrote my very first Dockerfile: + +```dockerfile +# Use ubuntu as the base image +FROM ubuntu + +# Install curl +RUN apt-get update && apt-get install -y curl + +# Set a default command to print a message +CMD ["echo", "Hello from my custom image!"] +``` + +I then built and tagged the image using `docker build -t my-ubuntu:v1 .` and ran it using `docker run my-ubuntu:v1`. It successfully printed my custom message to the terminal! + +--- + +## 📝 Task 2: Dockerfile Instructions + +I created a more complex Dockerfile to understand the core instructions used in production environments: + +```dockerfile +# Base image +FROM ubuntu:latest + +# Set the working directory inside the container +WORKDIR /app + +# Execute a command during the build phase +RUN apt-get update && apt-get install -y iputils-ping + +# Copy files from my local machine to the container's /app directory +COPY . /app + +# Document the port the application will use +EXPOSE 8080 + +# The default command to run when the container starts +CMD ["echo", "This is my advanced Dockerfile!"] +``` + +**Observation:** I learned that `RUN` executes while the image is being built (creating layers), while `CMD` executes only when the container finally starts. + +--- + +## ⚔️ Task 3: CMD vs ENTRYPOINT + +I tested the difference between `CMD` and `ENTRYPOINT` by creating two different images. + +* **Testing CMD:** + When I ran a container with `CMD ["echo", "hello"]`, it printed "hello". However, if I ran `docker run hostname`, it completely ignored my `echo` command and ran `hostname` instead. `CMD` is easily overridden. +* **Testing ENTRYPOINT:** + When I ran a container with `ENTRYPOINT ["echo"]` and passed an extra argument like `docker run sachin`, it appended the argument, printing "echo sachin". + +**When to use which?** +* Use `CMD` when you want to provide a default command that users can easily override (like giving them a default bash shell). +* Use `ENTRYPOINT` when you want your container to behave like a specific executable, where any extra arguments passed during `docker run` are fed directly into that executable. + +--- + +## 🌐 Task 4: Build a Simple Web App Image + +I created a custom `index.html` file and built a Dockerfile to serve it using an Nginx web server. + +**Dockerfile:** +```dockerfile +FROM nginx:alpine +COPY index.html /usr/share/nginx/html/ +``` + +I built the image (`docker build -t my-website:v1 .`) and ran it mapped to port 8080 (`docker run -d -p 8080:80 my-website:v1`). + +**Result:** When I accessed `localhost:8080` in my browser, my custom HTML page ("Hello form custom web-page by sachin") was successfully served! + +--- + +## 🚫 Task 5: .dockerignore + +I created a `.dockerignore` file containing the following: + +```plaintext +node_modules +.git +*.md +.env +``` + +**Observation:** When I ran `docker build`, Docker completely ignored these files and did not send them to the build daemon. This prevents sensitive `.env` files from leaking into the image and speeds up the build process by excluding massive folders like `node_modules`. + +--- + +## ⚡ Task 6: Build Optimization + +**Why does layer order matter for build speed?** +Docker caches each line of a Dockerfile as a separate layer. If a layer changes (like editing the source code in a `COPY` command), Docker has to rebuild that layer AND every single layer below it. + +Therefore, you should always put instructions that rarely change (like `FROM`, `RUN apt-get install`) at the top, and instructions that change constantly (like `COPY . .` for your source code) at the very bottom. This maximizes Docker's cache usage and makes rebuilding lightning fast! From 8f0ba20b4ae1698014de5741186950e9afff8cea Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 19 Jun 2026 23:40:58 +0530 Subject: [PATCH 41/76] Create day-32-volumes-networking.md documentation Added documentation for Day 32 focusing on Docker volumes and networking. --- 2026/day-32/day-32-volumes-networking.md | 88 ++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 2026/day-32/day-32-volumes-networking.md diff --git a/2026/day-32/day-32-volumes-networking.md b/2026/day-32/day-32-volumes-networking.md new file mode 100644 index 0000000000..5fad81458c --- /dev/null +++ b/2026/day-32/day-32-volumes-networking.md @@ -0,0 +1,88 @@ +# Day 32 – Docker Volumes & Networking + + +## ⚠️ Task 1: The Problem (Ephemeral Data) + +I started by running a MySQL database container and logging into it. I created a database called `testdb` and verified it existed. Then, I stopped the container and permanently removed it (`docker rm -f mysql-db`). + +I spun up a brand new MySQL container using the exact same image. When I logged in and ran `SHOW DATABASES;`, my `testdb` was gone! + +**Why?** Containers are ephemeral (temporary). When a container is deleted, its writable layer is destroyed along with it. To save data permanently, we must store it outside the container. + +--- + +## 💾 Task 2: Named Volumes + +To fix the data loss problem, I used a **Named Volume**: + +1. **Created a volume:** `docker volume create mydb-data` +2. **Attached it to a new MySQL container:** + ```bash + docker run -d --name mysql-db -v mydb-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=sachin mysql + ``` + +I logged in, created a database named `new_test`, stopped, and removed the container. +I spun up a brand new container but attached the exact same `mydb-data` volume. + +**Result:** My `new_test` database was still there! The data survived the container's destruction. + +--- + +## 🔗 Task 3: Bind Mounts + +Instead of letting Docker manage the volume somewhere hidden on my hard drive, I used a **Bind Mount** to explicitly link a folder on my actual machine to the container. + +I created an `index.html` file in my local `~/scripts/html/` folder and ran Nginx: +```bash +docker run -d --name my-nginx -p 8080:80 -v ~/scripts/html:/usr/share/nginx/html nginx +``` + +When I accessed `localhost:8080`, I saw my webpage. The best part? When I edited the `index.html` file on my host machine and refreshed my browser, the changes appeared instantly without rebuilding or restarting the container! + +### Difference between Named Volumes and Bind Mounts: +* **Named Volume:** Docker manages the storage location entirely. Best for database files where you just want data to persist safely. +* **Bind Mount:** You specify the exact folder path on your host machine. Best for active development (like coding a website) so you can see live changes instantly. + +--- + +## 🌐 Task 4: Docker Networking Basics + +I explored the default `bridge` network. I ran two generic containers (`c1` and `c2`) on the default bridge. + +* **Could they ping each other by IP?** Yes. +* **Could they ping each other by Name?** No. + +--- + +## 🛠️ Task 5: Custom Networks + +I created a custom network: +```bash +docker network create my-app-net +``` + +I ran two new containers (`app1` and `app2`) and attached them to this custom network using `--network my-app-net`. + +* **Could they ping each other by Name?** YES! `ping app2` from inside `app1` worked perfectly. + +**Why does custom networking allow name-based communication?** +The default Docker bridge network does not provide automatic DNS resolution (for legacy/backward compatibility reasons). However, user-defined custom networks come with a built-in DNS server that automatically resolves container names to their IP addresses. + +--- + +## 🧩 Task 6: Put It Together + +I simulated a real multi-tier architecture using a single command block: + +1. I used my custom network (`my-app-net`). +2. I launched a database: + ```bash + docker run -d --name my-database --network my-app-net -v mydb-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=sachin mysql + ``` +3. I launched an app container on the same network: + ```bash + docker run -d --name my-app --network my-app-net ubuntu sleep infinity + ``` +4. I executed into `my-app` and successfully pinged the database using only its name: `ping my-database`. + +This proves that I can run an application and a database completely isolated from each other, yet they can communicate seamlessly using Docker's internal DNS, while the database data remains perfectly safe on a volume! From 1f38f56f0e4a2b9759ee4c38fdd821a255f23438 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 21 Jun 2026 22:20:58 +0530 Subject: [PATCH 42/76] Create day-33-compose.md for Docker Compose tutorial Added documentation for Day 33 on Docker Compose basics. --- 2026/day-33/day-33-compose.md | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 2026/day-33/day-33-compose.md diff --git a/2026/day-33/day-33-compose.md b/2026/day-33/day-33-compose.md new file mode 100644 index 0000000000..9bd3190faf --- /dev/null +++ b/2026/day-33/day-33-compose.md @@ -0,0 +1,104 @@ +# Day 33 – Docker Compose: Multi-Container Basics + + + +## ⚙️ Task 1: Install & Verify + +I verified my Docker Compose installation by running `docker compose version`. + +**Result:** Docker Compose version `v2.27.0` was confirmed installed and ready to use. + +--- + +## 📝 Task 2: Your First Compose File + +I created a simple `docker-compose.yml` to spin up a single Nginx web server. + +**`compose-basics/docker-compose.yml`** +```yaml +services: + web: + image: nginx + ports: + - "80:80" +``` + +### Troubleshooting the Port Conflict: +When I ran `docker compose up`, I encountered a `bind: address already in use` error for port `80`. + +* I checked my host system using `curl localhost:80` and `ps -ef | grep nginx` to confirm Nginx was already running natively. +* I stopped the local service: `sudo systemctl stop nginx`. +* I found another rogue container holding the port using `docker ps` and killed it. + +After clearing the port, `docker compose up` worked perfectly, and my containerized Nginx server came online! + +--- + +## 🐳 Task 3: Two-Container Setup (WordPress + MySQL) + +I created a multi-tier application using a single Compose file. This automatically handles networking and DNS resolution between the services. + +**`wordpress-mysql/docker-compose.yml`** +```yaml +services: + db: + image: mysql:8.0 + volumes: + - db_data:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: somewordpress + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpresspassword + + wordpress: + depends_on: + - db + image: wordpress:latest + ports: + - "8000:80" + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: wordpress + WORDPRESS_DB_PASSWORD: wordpresspassword + WORDPRESS_DB_NAME: wordpress + +volumes: + db_data: +``` + +**Observation:** +* I ran `docker compose up -d` and accessed the WordPress installation screen on `localhost:8000`. +* **Data Persistence Verification:** I stopped and destroyed the containers using `docker compose down`. When I ran `docker compose up -d` again, my WordPress setup and data were perfectly intact because I used the `db_data` named volume attached to the MySQL container! + +--- + +## 💻 Task 4: Compose Commands + +I practiced essential Compose management commands: + +* `docker compose up -d`: Starts all services in the background (detached mode). +* `docker compose ps`: Views the running services specifically linked to the current Compose file. +* `docker compose logs -f`: Views live logs of all services. +* `docker compose logs db`: Views logs specific to the database service. +* `docker compose stop`: Stops the services but leaves the containers intact. +* `docker compose down`: Stops the services, destroys the containers, and destroys the custom network. *(Add `-v` to also destroy volumes)*. + +--- + +## 🔐 Task 5: Environment Variables + +I created a `.env` file to securely store my database credentials instead of hardcoding them into the `docker-compose.yml` file. + +**`.env` file:** +```env +DB_PASSWORD=my_secure_password +``` + +**Updated `docker-compose.yml` section:** +```yaml + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} +``` + +**Observation:** Docker Compose automatically reads the `.env` file in the same directory and substitutes the variables during startup, keeping sensitive credentials out of version control. From 5a56cfe36953275d6638e00e33123c60d65b7556 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Mon, 22 Jun 2026 21:58:15 +0530 Subject: [PATCH 43/76] Add Day 34 documentation for Docker Compose Added documentation for building a 3-tier architecture using Docker Compose. --- 2026/day-34/day-34-compose-advanced.md | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 2026/day-34/day-34-compose-advanced.md diff --git a/2026/day-34/day-34-compose-advanced.md b/2026/day-34/day-34-compose-advanced.md new file mode 100644 index 0000000000..6aa4d28bdf --- /dev/null +++ b/2026/day-34/day-34-compose-advanced.md @@ -0,0 +1,115 @@ +# Day 34 – Docker Compose: Real-World Multi-Container Apps + +## 🏗️ Task 1: Build Your Own App Stack + +I built a 3-tier architecture using a Python Flask application that connects to both a Redis cache and a PostgreSQL database. + +**`app/app.py`** +```python +from flask import Flask +from redis import Redis +import os +import psycopg2 + +app = Flask(__name__) +redis = Redis(host='redis', port=6379) + +@app.route('/') +def hello(): + # Example logic: increment cache counter + count = redis.incr('hits') + return f"Hello World! This page has been seen {count} times." + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000) +``` + +**`app/Dockerfile`** +```dockerfile +FROM python:3.9-slim +WORKDIR /code +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt +COPY . . +CMD ["python", "app.py"] +``` + +--- + +## 🩺 Task 2: depends_on & Healthchecks + +To ensure the Python app didn't crash trying to connect to a database that wasn't ready yet, I added healthchecks to the database and told the app to wait. + +**`docker-compose.yml` (Snippet)** +```yaml + db: + image: postgres:13 + healthcheck: + test: ["CMD-SHELL", "pg_isready -U myuser -d mydatabase"] + interval: 10s + timeout: 5s + retries: 5 + + web: + build: ./app + depends_on: + db: + condition: service_healthy +``` + +**Test Result:** When I ran `docker compose up -d`, Docker started the database first, continuously polled it with `pg_isready`, and only started the web container once the DB reported back as "healthy." + +--- + +## 🔄 Task 3: Restart Policies + +I tested the resilience of the stack by adding `restart: always` to my database service. + +* **Test:** I manually killed the database container using `docker kill `. +* **Result:** Docker immediately detected the container had stopped and spun it right back up without any manual intervention! + +**Restart Policy Differences:** +* `always`: Docker will always restart the container if it stops, even if you stop it manually (unless the Docker daemon itself restarts). Good for critical infrastructure like databases. +* `on-failure`: Docker only restarts the container if it exits with a non-zero exit code (meaning it crashed). If you manually stop it gracefully (exit code 0), it stays stopped. Best for applications or worker scripts. + +--- + +## 🛠️ Task 4: Custom Dockerfiles in Compose + +Instead of pre-building my Python image manually with `docker build`, I used the `build: ./app` directive in my Compose file. + +**Observation:** When I made a code change to `app.py`, I simply ran `docker compose up --build -d`. Compose detected the change, rebuilt the local image on the fly, and recreated only the web container while leaving the database untouched. + +--- + +## 🕸️ Task 5: Named Networks & Volumes + +I formalized the infrastructure by defining explicit networks and persistent volumes. + +**`docker-compose.yml` (Network & Volume definitions)** +```yaml +networks: + frontend: + backend: + +volumes: + pgdata: +``` + +I attached the `web` and `redis` containers to `frontend`, and the `web` and `db` containers to `backend`, tightly controlling which services could talk to each other. + +--- + +## 📈 Task 6: Scaling (Bonus) + +I attempted to scale my web app to 3 replicas using: +```bash +docker compose up --scale web=3 -d +``` + +**What broke?** +I received a `bind: address already in use` error for port `5000`. + +**Why?** Simple scaling fails when using static port mapping (`ports: "5000:5000"`). The first replica binds to my host's port 5000 perfectly. But when the second and third replicas try to start, they also try to bind to my host's port 5000, which is already taken by the first replica. + +**Solution:** To scale properly, you either map to a dynamic port (`ports: -"5000"`) or use a Reverse Proxy/Load Balancer (like Nginx or Traefik) to sit in front of the replicas and distribute traffic to them on a single host port. From 6b7735c23182afbfcf16acd73aae594efde925aa Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 23 Jun 2026 23:05:54 +0530 Subject: [PATCH 44/76] Update Day 35 markdown for multi-stage builds Removed unnecessary file reference and updated task description. --- 2026/day-35/day-35-multistage-hub.md | 97 ++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 2026/day-35/day-35-multistage-hub.md diff --git a/2026/day-35/day-35-multistage-hub.md b/2026/day-35/day-35-multistage-hub.md new file mode 100644 index 0000000000..cc6e9e2eda --- /dev/null +++ b/2026/day-35/day-35-multistage-hub.md @@ -0,0 +1,97 @@ +# Day 35 – Multi-Stage Builds & Docker Hub + +## 🐘 Task 1: The Problem with Large Images + +To demonstrate the problem, I wrote a simple "Hello World" application in Go (`main.go`). +I wrote a standard, single-stage Dockerfile: + +**`Dockerfile` (Single-stage build)** +```dockerfile +FROM golang:1.20 +WORKDIR /app +COPY . . +RUN go build -o myapp main.go +CMD ["./myapp"] +``` + +I built the image (`docker build -t go-app-single .`) and checked its size using `docker images`. + +* **Resulting Image Size:** ~800 MB! +* **The Problem:** 800 MB for a "Hello World" app is massive. The reason it is so large is because it includes the entire Go compiler, the OS utilities, and all the build tools needed to compile the code, none of which are actually needed just to run the compiled binary. + +--- + +## 🪶 Task 2: Multi-Stage Build + +I rewrote the Dockerfile to use a multi-stage build process. + +**`Dockerfile` (Multi-stage build)** +```dockerfile +# Stage 1: Build the app (The "Builder" environment) +FROM golang:1.20 AS builder +WORKDIR /app +COPY . . +# Compile a statically linked binary +RUN CGO_ENABLED=0 GOOS=linux go build -o myapp main.go + +# Stage 2: Run the app (The minimal production environment) +FROM alpine:latest +WORKDIR /root/ +# Copy ONLY the compiled binary from Stage 1 +COPY --from=builder /app/myapp . +CMD ["./myapp"] +``` + +I built this new image (`docker build -t go-app-multi .`). + +* **Resulting Image Size:** ~13 MB! + +**Why is the multi-stage image so much smaller?** +In Stage 1, Docker uses the heavy `golang` image (800MB) to compile the code into a binary file. In Stage 2, Docker starts fresh with a tiny `alpine` image (7MB) and only copies the compiled binary over. The heavy build tools from Stage 1 are completely discarded and never make it into the final production image. + +--- + +## ☁️ Task 3 & 4: Push to Docker Hub + +I authenticated with Docker Hub via the terminal using my Personal Access Token (PAT). + +1. **Login:** `docker login` +2. **Tag:** I tagged my optimized image to match my Docker Hub repository: + ```bash + docker tag go-app-multi sachin8550/my-go-app:v1 + ``` +3. **Push:** I pushed the image to the cloud registry: + ```bash + docker push sachin8550/my-go-app:v1 + ``` +4. **Verify:** I visited Docker Hub and confirmed the image and the `v1` tag were visible. + +* **Link to my Docker Hub Repo:** [https://hub.docker.com/repository/docker/sachin8550/my-go-app](https://hub.docker.com/repository/docker/sachin8550/my-go-app) + +* **Note on Tags:** Pulling `latest` grabs whatever the most recent build was, which can break things if the codebase changes unexpectedly. Pulling a specific tag like `v1` ensures you get the exact version of the code you tested. + +--- + +## 🛡️ Task 5: Image Best Practices + +I applied three critical best practices to my Dockerfile: + +1. **Minimal Base Image:** Swapped from Ubuntu/Debian to Alpine. +2. **Combined RUN commands:** Using `&&` to combine commands (like `apt-get update && apt-get install`) reduces the total number of layers Docker has to create. +3. **Non-Root User:** Running apps as root inside a container is a security risk. I added a user specifically to run the app. + +**Secure & Optimized Dockerfile Example:** +```dockerfile +FROM alpine:latest + +# Create a non-root user +RUN adduser -D appuser +WORKDIR /home/appuser + +# Copy the app... + +# Switch to the non-root user +USER appuser + +CMD ["./myapp"] +``` From cc2475d69c72f770718998a59a0420e9d7c8e338 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Wed, 24 Jun 2026 21:32:02 +0530 Subject: [PATCH 45/76] Add Docker cheat sheet with commands and instructions --- 2026/day-37/docker-cheet-sheet.md | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2026/day-37/docker-cheet-sheet.md diff --git a/2026/day-37/docker-cheet-sheet.md b/2026/day-37/docker-cheet-sheet.md new file mode 100644 index 0000000000..595469de28 --- /dev/null +++ b/2026/day-37/docker-cheet-sheet.md @@ -0,0 +1,54 @@ +# 🐳 Docker Cheat Sheet + +## 📦 Container Commands +- `docker run -it ` : Run a container in interactive mode (with terminal) +- `docker run -d ` : Run a container in detached mode (background) +- `docker ps` : List running containers (`-a` for all, including stopped) +- `docker stop ` : Gracefully stop a running container +- `docker rm ` : Remove a stopped container (`-f` to force remove a running one) +- `docker exec -it sh` : Open a shell inside a running container +- `docker logs ` : View container logs (`-f` to follow live) + +## 🖼️ Image Commands +- `docker build -t : .` : Build an image from a Dockerfile in the current directory +- `docker pull ` : Download an image from Docker Hub / registry +- `docker push ` : Upload an image to Docker Hub / registry +- `docker tag ` : Create an alias/tag for an image +- `docker images` : List all local images +- `docker rmi ` : Remove a local image + +## 💾 Volume Commands +- `docker volume create ` : Create a named volume for persistent data +- `docker volume ls` : List all volumes +- `docker volume inspect ` : Show detailed information about a volume +- `docker volume rm ` : Remove a specific volume + +## 🌐 Network Commands +- `docker network create ` : Create a custom local network +- `docker network ls` : List all networks +- `docker network inspect ` : View containers connected to a network +- `docker network connect ` : Connect a running container to a network + +## 🐙 Compose Commands +- `docker compose up -d` : Start all services defined in `docker-compose.yml` in the background +- `docker compose down` : Stop and remove containers and networks +- `docker compose down -v` : Stop and remove containers, networks, **and volumes** +- `docker compose ps` : List running compose services +- `docker compose logs -f` : View trailing logs for all services combined +- `docker compose build` : Build or rebuild services + +## 🧹 Cleanup Commands +- `docker system prune` : Remove stopped containers, dangling images, and unused networks +- `docker system prune -a --volumes` : ⚠️ **Deep clean**: Removes ALL unused images and volumes +- `docker system df` : Show disk usage by Docker + +## 📄 Dockerfile Instructions +- `FROM` : Specifies the base image (Must be the first instruction) +- `WORKDIR` : Sets the default working directory for subsequent instructions +- `COPY` : Copies files/directories from the host into the container +- `ADD` : Similar to `COPY`, but extracts `.tar` files and supports remote URLs +- `RUN` : Executes terminal commands during the build process (e.g., `npm install`) +- `EXPOSE` : Documents the port the container listens on (does not actually publish it) +- `ENV` : Sets environment variables +- `CMD` : The default command to execute when the container starts (can be overridden) +- `ENTRYPOINT` : The main executable for the container (arguments are appended to it) From b80c59954617eaeb27df393f4ac2a8a9943d412a Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 25 Jun 2026 23:14:41 +0530 Subject: [PATCH 46/76] Create day-38-yaml.md for YAML basics Added a new markdown file for Day 38 covering YAML basics and validation. --- 2026/day-38/day-38-yaml.md | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 2026/day-38/day-38-yaml.md diff --git a/2026/day-38/day-38-yaml.md b/2026/day-38/day-38-yaml.md new file mode 100644 index 0000000000..940135adf7 --- /dev/null +++ b/2026/day-38/day-38-yaml.md @@ -0,0 +1,61 @@ +# Day 38: YAML Basics + + +Today, I worked through the core syntax rules of YAML, built configuration files by hand, and learned how to properly validate them before deploying them to a pipeline. + +## 📄 1. Validated YAML Files + +### `person.yaml` +This file handles basic scalar values, integers, booleans, and demonstrates the two different ways to write lists (block format vs. inline format). + +```yaml +--- +name: sachin +role: System Architecture +experience_years: 4 +learning: true +tools: + - docker + - git + - jira + - linux + - aws +hobbies: [teaching, cooking, coding] +``` + +### `server.yaml` +This file demonstrates deep object nesting (parent-child structures) and uses multi-line string indicators (`|` and `>`) to process blocks of text. + +```yaml +--- +server: + name: nginx + ip: 34.10.4.3 + port: 80 # Verified space adjustment before comment + startup_script: | + echo "Starting server..." + systemctl start nginx + +database: + host: my_sql + name: tech_space + credentials: + user: root + password: "admin@123" + description: > + This database server hosts application data + and handles architecture configurations. +``` + +--- + +## 🧠 2. What I Learned (3 Key Points) + +**1. The Visual Trap of the `cat` Command** +I realized that just because a configuration file looks perfectly aligned when running `cat file.yaml`, it does not mean it is syntactically valid. The `cat` command simply prints strings to the terminal interface; it completely ignores syntax structure. Errors like hidden tabs or bad spacing only show up when a real engine tries to parse the data. + +**2. Standardizing Lists and Spacing** +I learned that YAML is highly specific about spacing patterns. Simple habits like forgetting a space right after a list hyphen (`-item` instead of `- item`) or putting an inconsistent number of spaces inside nested blocks can cause entire deployment scripts to fail. + +**3. Catching Hidden Formats with `yamllint`** +Setting up an automated linter taught me that production-grade YAML needs to be clean of invisible trailing spaces at the ends of lines, extra empty lines at the bottom of files, and poorly spaced comment tags. Catching these locally saves a lot of debugging time in a real CI/CD pipeline. From 9a7221074d0f3f5d950c7fb74b0d784b1d7a471a Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 26 Jun 2026 23:10:57 +0530 Subject: [PATCH 47/76] Enhance CI/CD concepts and pipeline explanation Expanded on CI/CD concepts, including Continuous Integration, Continuous Delivery, and Continuous Deployment. Added details on pipeline anatomy and provided a text-based pipeline diagram. --- 2026/day-39/day-39-cicd-concepts.md | 84 +++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 2026/day-39/day-39-cicd-concepts.md diff --git a/2026/day-39/day-39-cicd-concepts.md b/2026/day-39/day-39-cicd-concepts.md new file mode 100644 index 0000000000..0bad4a7656 --- /dev/null +++ b/2026/day-39/day-39-cicd-concepts.md @@ -0,0 +1,84 @@ +# Day 39 – What is CI/CD? + +## ⚠️ Task 1: The Problem (Manual Deployments) + +Imagine a team of 5 developers pushing code manually to the same production server: + +* **What can go wrong?** Human error is inevitable. Someone might overwrite another developer's changes, forget to install a new dependency, or copy the wrong configuration file. This leads to broken applications, severe downtime, and unhappy users. +* **What does "it works on my machine" mean and why is it a real problem?** It means the code runs perfectly on a developer's local laptop, but crashes in production. This happens because the developer's laptop and the production server have different operating systems, library versions, or environment configurations. *(This is exactly the problem Docker solves!)* +* **How many times a day can a team safely deploy manually?** Very few. Realistically, a team might safely deploy once a week or maybe once a day, but it will be highly stressful, slow, and prone to burnout. + +* ## 🔄 Task 2: CI vs CD + +* **Continuous Integration (CI):** The practice of developers frequently merging their code changes into a central repository (multiple times a day). Automated builds and tests run immediately to catch bugs early before the code is ever deployed. + * *Example:* Every time a developer opens a Pull Request on GitHub, a system automatically runs unit tests to make sure they didn't break existing features. +* **Continuous Delivery (CD):** An extension of CI where the code is always perfectly built, tested, and ready to be deployed to production. However, the final deployment still requires a human to click an "Approve" or "Deploy" button. + +* * *Example:* The marketing team wants to release a new website feature precisely on Friday at 9 AM, so the engineering manager manually clicks "Deploy" when the time comes. +* **Continuous Deployment (CD):** Goes one step further than Delivery. Every single code change that passes the automated tests goes straight into production automatically, with zero human intervention. + * *Example:* A Netflix or Amazon engineer pushes a code fix, and 15 minutes later, it is automatically live for millions of users because it passed all automated safety checks. + +--- +## 🧬 Task 3: Pipeline Anatomy + +* **Trigger:** The specific event that kicks off the pipeline (e.g., a code push, a pull request, or a scheduled timer). +* **Stage:** A logical grouping of jobs representing a phase in the pipeline (e.g., the "Build" stage or the "Deploy" stage). +* **Job:** A specific unit of work that executes inside a stage (e.g., "Run Python Tests"). +* **Step:** A single command or action inside a job (e.g., `npm install` or `docker build`). +* **Runner:** The actual virtual machine or server that executes the jobs in the pipeline. +* **Artifact:** The final file or output produced by a job that can be used by other stages (e.g., a compiled `.jar` file or a built Docker image). + +--- + +## 🎨 Task 4: Draw a Pipeline + +Here is a text-based pipeline diagram for the scenario: **Push Code -> Test -> Build Docker Image -> Deploy to Staging**. + +```text +[ Trigger: Git Push to Main Branch ] + | + v ++-----------------------------+ +| STAGE 1: TEST | +|-----------------------------| +| Job: Unit Tests | +| Step 1: Checkout Code | +| Step 2: Install Python deps | +| Step 3: Run PyTest | ++-----------------------------+ + | + (Tests Pass) + | + v ++-----------------------------+ +| STAGE 2: BUILD | +|-----------------------------| +| Job: Docker Build & Push | +| Step 1: Login to DockerHub | +| Step 2: docker build -t app | +| Step 3: docker push app | ++-----------------------------+ + | + (Image Pushed) + | + v ++-----------------------------+ +| STAGE 3: DEPLOY | +|-----------------------------| +| Job: Deploy to Staging | +| Step 1: SSH into Server | +| Step 2: Pull new image | +| Step 3: Restart Containers | ++-----------------------------+ + +``` + +--- +## 🌍 Task 5: Explore in the Wild + +I explored the official GitHub repository for **FastAPI** (a popular Python web framework). +**Target File:** `.github/workflows/test.yml` + +* **What triggers it?** It triggers on a `push` to the `master` branch and on any `pull_request`. +* **How many jobs does it have?** It has multiple jobs, primarily the `test` job which runs as a matrix across different operating systems. +* **What does it do?** It automatically checks out the code, sets up multiple different versions of Python (3.8 through 3.12), installs all necessary dependencies, and runs testing scripts to ensure the framework is highly stable before any new code is merged. From 3f591a9770e78248ae013da88fdcb742939b4dd0 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Mon, 29 Jun 2026 22:34:45 +0530 Subject: [PATCH 48/76] Add GitHub Actions & CI/CD guide notes Added comprehensive notes on GitHub Actions and CI/CD concepts, including workflow anatomy, contexts, variables, debugging, and key takeaways. --- 2026/day-40/day-40-notes.md | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 2026/day-40/day-40-notes.md diff --git a/2026/day-40/day-40-notes.md b/2026/day-40/day-40-notes.md new file mode 100644 index 0000000000..1d0bdab2ec --- /dev/null +++ b/2026/day-40/day-40-notes.md @@ -0,0 +1,46 @@ +# GitHub Actions & CI/CD Guide + +## 1. The Core Concept: What is CI/CD in this context? +By writing this workflow, you transition from running code locally to automating execution in the cloud. **GitHub Actions** acts as your automated assistant, spinning up a fresh computer (a "Runner") every time an event occurs (like a push), running your predefined scripts, and shutting down. + +## 2. Anatomy of a Workflow (YAML Syntax Breakdown) +Understanding the `.github/workflows/*.yml` file is about understanding the hierarchy of how GitHub Actions executes tasks. + +* **`name`**: The human-readable name of your pipeline. This is what shows up in the GitHub Actions UI. +* **`on` (The Trigger)**: Defines when this workflow should run. Using `on: [push]` means any push to any branch will trigger a run. Other common triggers include `pull_request` or `schedule` (like a cron job). +* **`jobs` (The Work to do)**: A workflow consists of one or more jobs. Jobs run in parallel by default. In our task, we only had one job named `greet`. +* **`runs-on` (The Runner / Environment)**: Tells GitHub what operating system to boot up for this job. `ubuntu-latest` is the most common and cheapest (if you are on billing). It provisions a fresh Ubuntu Linux Virtual Machine in Microsoft Azure for your job. +* **`steps` (The Instructions)**: The sequential list of tasks the runner will execute. *Important:* Steps inside the same job share the same file system and run one after the other. +* **`uses` (Pre-built Actions)**: Calls a reusable, pre-written piece of code. `uses: actions/checkout@v4` is the most crucial step in almost every pipeline. Why? Because a GitHub runner starts as a completely empty machine. It doesn't automatically have your repository's code on it. The checkout action downloads your code onto that runner so subsequent steps can interact with your files. +* **`run` (Shell Commands)**: Executes raw shell/terminal commands on the runner (e.g., `echo`, `ls -la`, `npm install`, `python script.py`). +* **`name` (Step Level)**: Labels the step in the GitHub UI. If you don't provide a name, GitHub will just use the raw command as the label, which can make logs messy and hard to read. + +## 3. GitHub Contexts and Variables +In Task 4, you used syntax like `${{ github.ref_name }}`. + +* **The `${{ ... }}` syntax**: This is called *expression syntax*. It tells GitHub to evaluate what is inside the brackets before running the command, injecting dynamic data. +* **`github.` context**: Contains information about the workflow run and the event that triggered it (e.g., `github.ref_name` gives the branch name, `github.actor` gives the username of the person who pushed). +* **`runner.` context**: Contains information about the VM executing the job (e.g., `runner.os` returns `Linux`, `Windows`, or `macOS`). + +## 4. Pipeline Failures and Debugging (Task 5) +When you purposely broke the pipeline (e.g., by adding a step with `run: exit 1` or a typo like `echho "Hello"`), you triggered a CI failure. + +### What a failure looks like: +* A red "X" appears next to your commit hash in the repository. +* You may receive an email notification that the workflow failed. +* In the Actions tab, the workflow run is marked in red. + +### The Chain Reaction: +If Step 2 fails, Steps 3, 4, and 5 are skipped automatically. A job immediately halts at the first step that returns a non-zero exit code (an error). + +### How to read the error: +1. Navigate to the **Actions** tab. +2. Click the failed run. +3. Click on the specific job on the left-hand menu. +4. Look for the step expanded in red. +5. Read the raw console output. It will tell you exactly what the shell experienced (e.g., `bash: echho: command not found` or `Error: Process completed with exit code 1`). + +## 5. Key Takeaways from Day 40 +* Workflows must live in `.github/workflows/` – if they are placed anywhere else, GitHub will ignore them. +* YAML relies on indentation. A misplaced space can break the whole file. Always ensure your steps are indented properly under your jobs. +* Runners are ephemeral. They boot up, run your code, and are destroyed. Any files created during a job (that aren't explicitly saved or uploaded as artifacts) disappear when the pipeline finishes. From df343fa9a1757eefd1188e7916383f26a71a8d20 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 30 Jun 2026 23:32:35 +0530 Subject: [PATCH 49/76] Remove documentation screenshots from day-42.md Removed documentation screenshots section from day-42.md --- 2026/day-42/day-42.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 2026/day-42/day-42.md diff --git a/2026/day-42/day-42.md b/2026/day-42/day-42.md new file mode 100644 index 0000000000..997b973dcc --- /dev/null +++ b/2026/day-42/day-42.md @@ -0,0 +1,29 @@ +# Day 42 – Runners: GitHub-Hosted & Self-Hosted + +## Task Notes & Learnings + +### Task 1: GitHub-Hosted Runners +**What is a GitHub-hosted runner? Who manages it?** +A GitHub-hosted runner is a virtual machine hosted by GitHub with the GitHub Actions runner application pre-installed. It provides a clean, isolated environment for your workflow to run. GitHub entirely manages these runners, meaning they handle the provisioning, maintenance, security patching, and destruction of the VM after the job finishes. + +### Task 2: Explore What's Pre-installed +**Why does it matter that runners come with tools pre-installed?** +Having tools like Docker, Python, Node.js, and Git pre-installed saves significant pipeline execution time. If we had to manually install these dependencies during every single workflow run, it would consume extra build minutes and slow down the CI/CD feedback loop. + +### Task 5: Labels +**Why are labels useful when you have multiple self-hosted runners?** +Labels allow you to route specific jobs to specific machines. If you have a pool of self-hosted runners, some might have specialized hardware (like GPUs), specific operating systems, or access to internal private networks. By using labels (e.g., `runs-on: [self-hosted, gpu-runner]`), you ensure the job lands on the exact machine equipped to handle it. + +--- + +## Task 6: GitHub-Hosted vs Self-Hosted (Comparison) + +| Feature | GitHub-Hosted | Self-Hosted | +| :--- | :--- | :--- | +| **Who manages it?** | GitHub | You (The Developer/Organization) | +| **Cost** | Free for public repos; limited free minutes for private (then pay-per-minute) | Free to connect, but you pay for your own underlying hardware/infrastructure | +| **Pre-installed tools** | Packed with common tools (Docker, Node, AWS CLI, etc.) | None by default (You manage the environment) | +| **Good for** | Standard CI/CD, quick setups, open-source projects | Custom hardware needs, accessing private internal networks, bypassing minute limits on heavy workloads | +| **Security concern** | Very Secure (Ephemeral VMs destroyed after each run) | Higher Risk (Workflows can leave residual files or execute untrusted code on your persistent machine) | + +--- From fd98852561899180bddfa338275bfa7020aed746 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 5 Jul 2026 12:10:25 +0530 Subject: [PATCH 50/76] Add Day 44 notes on CI practices and secrets management Documented tasks related to GitHub Secrets management, artifact handling, CI testing, and dependency caching in Day 44 notes. --- 2026/day-44/day-44-notes.md | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 2026/day-44/day-44-notes.md diff --git a/2026/day-44/day-44-notes.md b/2026/day-44/day-44-notes.md new file mode 100644 index 0000000000..adb603c9e8 --- /dev/null +++ b/2026/day-44/day-44-notes.md @@ -0,0 +1,40 @@ +# Day 44: Secrets, Artifacts & Running Real Tests in CI + +## Task 1 & 2: GitHub Secrets and Environment Variables + +### What I Learned About Secrets Management +Secrets are encrypted environment variables that you create in an organization, repository, or repository environment. In this task, I securely configured secrets like `MY_SECRET_MESSAGE`, `DOCKER_USERNAME`, and `DOCKER_TOKEN` and passed them as environment variables. + +**Why should you never print secrets in CI logs?** +Even though GitHub automatically masks configured secrets with `***`, deliberately trying to print or log secrets is extremely dangerous. Anyone with read access to the GitHub Actions logs could potentially view exposed credentials if not masked properly. Leaking these secrets gives malicious actors unauthorized access to your databases, cloud environments, or Docker registries, leading to severe security breaches. + +--- + +## Task 3 & 4: Uploading and Downloading Artifacts + +I created a workflow that spins up an NGINX server, generates access logs, and successfully uploads them as a zip file using `actions/upload-artifact@v4`. In a subsequent job, I downloaded these logs successfully to verify data persistence across jobs. + +**When would you use artifacts in a real pipeline?** +In real-world pipelines, jobs run in isolated runner environments. Once a job finishes, its environment is destroyed. Artifacts are crucial for saving data generated by one job so it can be used later. Common use cases include: +* Saving compiled application builds (e.g., `.jar` files, frontend `dist/` folders, or `.exe` binaries). +* Storing automated test results, security scan results, or code coverage reports. +* Preserving system or error logs for debugging failed deployments. +* Passing data from a "Build" job directly to a "Deploy" job. + +--- + +## Task 5: Running Real Tests in CI + +I integrated a custom shell script (`system_info.sh`) into my GitHub Actions pipeline. +1. I checked out the code and installed necessary dependencies (like `curl`). +2. I intentionally introduced an error in the script to test the CI's reaction. The pipeline successfully caught the error, turning **red** and failing with an `exit code 127`. +3. I fixed the script error, pushed the code, and verified the workflow successfully went **green** again. + +--- + +## Task 6: Caching Dependencies + +I integrated `actions/cache@v4` into the workflow to optimize runtime. Caching successfully reduced my workflow execution time from 21 seconds down to 18 seconds on subsequent runs. + +**What is being cached and where is it stored?** +Caching saves dependencies (like `node_modules` for npm, `pip` packages for Python, or downloaded APT packages) so they do not have to be downloaded from the internet on every single workflow run. GitHub securely stores these caches on their own internal cloud storage infrastructure, scoped directly to the specific repository and branch. From 99e6b3d9146c46ea229cc5f661530a138bd5eadd Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 5 Jul 2026 16:20:28 +0530 Subject: [PATCH 51/76] docker cicd iamge --- Screenshot from 2026-07-05 15-26-04.png | Bin 0 -> 200750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Screenshot from 2026-07-05 15-26-04.png diff --git a/Screenshot from 2026-07-05 15-26-04.png b/Screenshot from 2026-07-05 15-26-04.png new file mode 100644 index 0000000000000000000000000000000000000000..81dbea2465545276f5450f0df5fe7cd26c160d41 GIT binary patch literal 200750 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≦B|IjeVRfX1Yg05J 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%0DDTmQQR&i}yl{&|q#=l=(4 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�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 Date: Sun, 5 Jul 2026 16:21:40 +0530 Subject: [PATCH 52/76] added docker cidcd file --- .../Screenshot from 2026-07-05 15-26-04.png | Bin 0 -> 200750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2026/day-45/Screenshot from 2026-07-05 15-26-04.png diff --git a/2026/day-45/Screenshot from 2026-07-05 15-26-04.png b/2026/day-45/Screenshot from 2026-07-05 15-26-04.png new file mode 100644 index 0000000000000000000000000000000000000000..81dbea2465545276f5450f0df5fe7cd26c160d41 GIT binary patch literal 200750 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≦B|IjeVRfX1Yg05J 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%0DDTmQQR&i}yl{&|q#=l=(4 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�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 Date: Sun, 5 Jul 2026 16:46:10 +0530 Subject: [PATCH 53/76] Remove pipeline screenshot from day-45 documentation Removed pipeline screenshot from Docker CI/CD documentation. --- 2026/day-45/day-45-docker-cicd.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 2026/day-45/day-45-docker-cicd.md diff --git a/2026/day-45/day-45-docker-cicd.md b/2026/day-45/day-45-docker-cicd.md new file mode 100644 index 0000000000..fcbd95e24f --- /dev/null +++ b/2026/day-45/day-45-docker-cicd.md @@ -0,0 +1,18 @@ +## 2. Docker Hub & Status Badge + +* **Docker Hub Link:** [sachinkrc/github-actions-practice](https://hub.docker.com/repository/docker/sachinkrc/github-actions-practice/general) +* **Badge:** [![Docker Build and Publish](https://github.com/00-Sachin/Git-Hub-Actions-Practice/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/00-Sachin/Git-Hub-Actions-Practice/actions) + *(I added this to my main README.md file!)* + +--- + +## 3. The Full Journey: From Git Push to a Running Container + +Here is the step-by-step lifecycle of exactly what happens when I push code: + +1. **The Code Push:** I write code on my laptop and run `git push origin main`. +2. **The Trigger:** GitHub Actions detects the push to the `main` branch and spins up an `ubuntu-latest` cloud server (runner). +3. **The Preparation:** The runner checks out my code, calculates the short commit SHA (for version tracking), and authenticates into my Docker Hub account using my hidden secrets. +4. **The Build:** The runner executes my `Dockerfile`, building the lightweight Nginx image and tagging it twice (with `latest` and `sha-1234567`). +5. **The Push:** Because the push was on the `main` branch, the runner pushes both tagged images to Docker Hub. *(If I pushed to a feature branch, it would build to test for errors, but skip the push).* +6. **The Deployment (Local):** I go to my local machine terminal and run `docker run -d -p 8080:80 sachinkrc/github-actions-practice:latest`. The image pulls instantly, and my updated app is live! From 7c00443fef6053aa4c2b00a697c228c918b694fc Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Mon, 6 Jul 2026 17:40:57 +0530 Subject: [PATCH 54/76] Revise day-46 reusable workflows documentation Updated the documentation for reusable workflows, including detailed breakdowns of tasks and next steps for submission. --- 2026/day-46/day-46-reusable-workflows.md | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 2026/day-46/day-46-reusable-workflows.md diff --git a/2026/day-46/day-46-reusable-workflows.md b/2026/day-46/day-46-reusable-workflows.md new file mode 100644 index 0000000000..dea52a422f --- /dev/null +++ b/2026/day-46/day-46-reusable-workflows.md @@ -0,0 +1,33 @@ +# GitHub Actions: Reusable Workflows + +## What is a reusable workflow? +A reusable workflow in GitHub Actions is a workflow that can be called and run by other workflows, allowing us to centralize and reuse CI/CD automation across multiple repositories. It acts like a shared function or template, preventing us from duplicating identical YAML code across different workflows. + +## What is the `workflow_call` trigger? +`workflow_call` is a GitHub Actions trigger that allows a workflow to be called and reused by other workflows. + +## How is calling a reusable workflow different from using a regular action (`uses:`)? +* **Reusable Workflow:** Delegates an *entire job* to a pipeline template. It can handle complex execution structures, such as multiple jobs or conditional logic. +* **Regular Action:** Only runs a *single step* within an existing job. It performs focused, self-contained tasks like setting up tools or checking out code. + +## Where must a reusable workflow file live? +A reusable GitHub Actions workflow file must live in the `.github/workflows` directory of a repository. + + +### What has been included inside the file: +1. **Task 1 Breakdown:** Fully answered conceptual interview prep notes regarding `workflow_call`, its constraints, file directories, and foundational context. +2. **Tasks 2 & 4 (Reusable Workflow YAML):** Clean, structural `.github/workflows/reusable-build.yml` which defines inputs (`app_name`, `environment`), safe handling validation loops for secrets (`docker_token`), sets up production outputs via step contexts, and maps dynamic variables (`v1.0-`). +3. **Tasks 3 & 4 (Caller Workflow YAML):** The `.github/workflows/call-build.yml` file which shows standard execution mappings triggering on code pushes to `main`, uses local scoping syntax (`./.github/workflows/...`), populates the runtime secrets seamlessly, and leverages downstream data dependency configuration pipelines (`needs: build_app`). +4. **Task 5 (Composite Action Architecture):** Complete modular components (`action.yml`) configuring customized script shells (`shell: bash`), parsing multiple custom arguments (`name`, fallback `language` configuration setups), extracting base metadata variables (`runner.os`), and mapping operational verification tasks. +5. **Task 6 (Comparison Matrix):** The full structural analysis comparing Reusable Workflows vs Composite Actions. + + + +| | Reusable Workflow | Composite Action | +|---|---|---| +| Triggered by | `workflow_call` | `uses:` in a step | +| Can contain jobs? | Yes (It defines entire independent jobs) | No (It can only contain individual steps) | +| Can contain multiple steps? | Yes (Nested inside its jobs) | Yes (It bundles multiple steps together) | +| Lives where? | Strictly in the .github/workflows/ directory | Anywhere, but usually custom-organized in .github/actions//action.yml | +| Can accept secrets directly? | Yes (Has a dedicated secrets: keyword at the trigger level) | No (You cannot pass a secret directly; you have to pass it disguised as a regular input) | +| Best for | Macro-level automation: Standardizing entire, complete pipelines (like an entire build, test, and deploy process) across multiple repositories. | Micro-level automation: Standardizing repetitive tasks within a single job (like installing dependencies, configuring a specific tool, and setting up a cache). | From 2fd6a2bbe62a87a5bf5379eb52e55a978cbbcf4f Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 7 Jul 2026 13:29:14 +0530 Subject: [PATCH 55/76] Enhance documentation for GitHub Actions workflows Added detailed explanations and examples for various GitHub Actions tasks, including PR validation, scheduled workflows, smart triggers, and external event triggers. --- 2026/day-47/.md | 203 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 2026/day-47/.md diff --git a/2026/day-47/.md b/2026/day-47/.md new file mode 100644 index 0000000000..884a7b412f --- /dev/null +++ b/2026/day-47/.md @@ -0,0 +1,203 @@ +# 🚀 Day 47: Levelling Up GitHub Actions – Advanced Triggers & Event-Driven Pipelines + +Basic pushes and pull requests are great, but real-world DevOps pipelines demand precision. Today, we're diving deep into the matrix of GitHub Actions: PR lifecycles, precise cron schedules, smart path filtering, and chaining workflows together like a pro! + +Here are my workflow configurations and notes from today's challenge. + +--- + +## 🛠️ Task 1: PR Lifecycle Events (`pr-lifecycle.yml`) +Not all PR events are created equal. Sometimes you want a workflow to fire only when a PR is opened, or exclusively when it is finally merged. + +```yaml +name: PR Lifecycle Events +on: + pull_request: + types: [opened, synchronize, reopened, closed] + +jobs: + pr-info: + runs-on: ubuntu-latest + steps: + - name: Print Event Type + run: echo "Event type triggered: ${{ github.event.action }}" + + - name: Print PR Title + run: echo "PR Title: ${{ github.event.pull_request.title }}" + + - name: Print PR Author + run: echo "Author: ${{ github.event.pull_request.user.login }}" + + - name: Print Branches + run: | + echo "Source Branch: ${{ github.head_ref }}" + echo "Target Branch: ${{ github.base_ref }}" + + - name: Post-Merge Action + # This conditional ensures this step ONLY fires when the PR is successfully merged + if: github.event.pull_request.merged == true + run: echo "🎉 PR successfully merged! Kicking off downstream tasks..." +``` + + +## 🚧 Task 2: Real-World PR Validation Gate (`pr-checks.yml`) +Automated gates keep the main branch clean. This workflow acts as a bouncer for our repository—checking file sizes, branch naming conventions, and ensuring developers write a proper PR description. + +```yaml +name: Strict PR Gates +on: + pull_request: + branches: [main] + +jobs: + file-size-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Fail on large files + run: | + # Fails if any file is > 1MB + find . -type f -size +1M -exec echo "File {} is too large!" \; -exec false {} + + + branch-name-check: + runs-on: ubuntu-latest + steps: + - name: Validate Branch Convention + run: | + BRANCH="${{ github.head_ref }}" + if [[ ! $BRANCH =~ ^(feature|fix|docs)/ ]]; then + echo "❌ Branch '$BRANCH' does not follow 'feature/', 'fix/', or 'docs/' pattern." + exit 1 + fi + + pr-body-check: + runs-on: ubuntu-latest + steps: + - name: Warn on empty description + run: | + if [ -z "${{ github.event.pull_request.body }}" ]; then + echo "::warning::PR description is empty! Please add context to help reviewers." + fi +``` +## ⏱️ Task 3: Cron Deep Dive (scheduled-tasks.yml) +Time-based automation is crucial for nightly builds, database cleanups, and health checks. + +```YAML +name: Scheduled Workflows (Cron Deep Dive) +on: + schedule: + - cron: '30 2 * * 1' # Every Monday at 2:30 AM UTC + - cron: '0 */6 * * *' # Every 6 hours + workflow_dispatch: # Crucial for manual testing! + +jobs: + health-check: + runs-on: ubuntu-latest + steps: + - name: Print Trigger Schedule + run: echo "Triggered by schedule: ${{ github.event.schedule }}" + + - name: Ping Health URL + run: | + STATUS=$(curl -s -o /dev/null -w "%{http_code}" [https://api.github.com](https://api.github.com)) + echo "Health check status code: $STATUS" +``` +### 📝 Cron Notes: +Every weekday at 9 AM IST (3:30 AM UTC): 30 3 * * 1-5 + +First day of every month at midnight UTC: 0 0 1 * * + +Why does GitHub delay/skip scheduled workflows? To save compute resources, GitHub automatically disables scheduled workflows on repositories that haven't seen any activity (pushes, PRs, etc.) for 60 days. + +## 🎯 Task 4: Path & Branch Filters (smart-triggers.yml) +Why run a heavy test suite if someone just updated the README.md? Smart triggers save time and runner minutes. + +``` YAML +name: Smart Triggers +on: + push: + branches: + - main + - 'release/*' + paths: + - 'src/**' + - 'app/**' + +# (Note: In a separate workflow to ignore docs, you would use paths-ignore like this:) +# on: +# push: +# paths-ignore: +# - '*.md' +# - 'docs/**' +``` +### 📝 paths vs paths-ignore: +Use paths (whitelist) when a workflow is highly specific to a certain component (e.g., only run the Frontend Build when files in /frontend change). + +Use paths-ignore (blacklist) when a workflow should run on almost everything, except trivial files (like skipping CI for markdown files, .gitignore, or /docs). + +## 🔗 Task 5: Chaining Workflows (workflow_run) +We decoupled our CI/CD pipelines! Tests run first, and only if they succeed does the deploy workflow trigger. + +1. tests.yml (The Trigger) +``` YAML +name: Run Tests +on: [push] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo "Running rigorous tests... Passed!" +2. deploy-after-tests.yml (The Follow-up) +YAML +name: Deploy After Tests +on: + workflow_run: + workflows: ["Run Tests"] + types: [completed] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Proceed on Success + if: ${{ github.event.workflow_run.conclusion == 'success' }} + run: echo "Tests passed! Deploying to production..." + + - name: Fail on Error + if: ${{ github.event.workflow_run.conclusion != 'success' }} + run: | + echo "Tests failed! Aborting deployment." + exit 1 +``` + +### 📝 workflow_run vs workflow_call: +workflow_run is event-driven and decoupled. Workflow B triggers independently because Workflow A finished. Workflow A has no idea Workflow B exists. Perfect for separating CI from CD. + +workflow_call is reusable and tightly coupled. Workflow A explicitly "calls" Workflow B as a step/job in its own run. It's like importing a function in programming. + +## 📡 Task 6: External Event Triggers (external-trigger.yml) +Triggering pipelines from outside GitHub using a payload. + +``` YAML +name: External Trigger +on: + repository_dispatch: + types: [deploy-request] + +jobs: + external-deploy: + runs-on: ubuntu-latest + steps: + - name: Acknowledge Request + run: | + echo "Received payload to deploy to: ${{ github.event.client_payload.environment }}" +``` +### 📝 When to use repository_dispatch? +This is perfect for integrations with external tools. For example: + +A Slack Bot (e.g., /deploy-prod) sending an API call to GitHub. + +A monitoring tool (like Datadog or Prometheus) triggering an automated rollback pipeline if it detects an incident. + +An external CI system (like Jenkins) kicking off a GitHub Action after completing its own tasks. From a71fc45cbf94ae1635dddef438ded0993ec0e454 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 9 Jul 2026 07:45:06 +0530 Subject: [PATCH 56/76] Enhance CI/CD workflows with reusable configurations Added detailed workflow configurations for build, test, and deployment processes, including reusable workflows for Docker and pull request pipelines. --- 2026/day-48/day-48.md | 231 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 2026/day-48/day-48.md diff --git a/2026/day-48/day-48.md b/2026/day-48/day-48.md new file mode 100644 index 0000000000..7e34b46bf8 --- /dev/null +++ b/2026/day-48/day-48.md @@ -0,0 +1,231 @@ +# Day 48 Capstone Project: Production-Grade GitHub Actions CI/CD Pipeline + +## Pipeline Architecture + +The following diagram illustrates the complete, modular CI/CD flow, separating validation for pull requests, automated continuous deployment upon merges to the main branch, and independent automated health checks. + +```mermaid +graph TD + %% Pull Request Flow + subgraph Pull Request Pipeline + A[PR Opened / Synchronized] --> B(Job: Call Build & Test) + B --> C{Tests Pass?} + C -- Yes --> D[Job: Post PR Comment Summary] + C -- No --> E[PR Blocked] + end + + %% Main Branch Flow + subgraph Main Branch Deployment Pipeline + F[Push / Merge to Main] --> G(Job: Call Build & Test) + G --> H(Job: Call Docker Build & Push) + H --> I[Environment: Production Approval] + I --> J(Job: Deploy Image to Production) + end + + %% Scheduled Flow + subgraph Automated Operations + K[Cron: Every 12 Hours / Manual Trigger] --> L(Job: Pull Latest Image) + L --> M(Job: Spin Up Container & Curl Health Endpoint) + M --> N(Job: Write GitHub Step Summary Report) + end +``` +## Workflow Configurations +### 1. Reusable Workflow — Build & Test +``` +name: Reuseable_build_test +on: + workflow_call: + inputs: + node_version: + required: false + type: string + default: '20' + run_tests: + required: false + type: boolean + default: true + outputs: + test_result: + description: "Status of the build and test" + value: ${{ jobs.build_test.outputs.status }} + +jobs: + build_test: + runs-on: ubuntu-latest + outputs: + status: ${{ job.status }} + steps: + - name: chechkout the code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node_version }} + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Setup Test + if: ${{ inputs.run_tests == true }} + run: npm test + +``` +### 2. Reusable Workflow — Docker Build & Push +``` +name: Reusable_docker_file +on: + workflow_call: + inputs: + image_name: + required: true + type: string + tag: + required: true + type: string + + secrets: + docker_token: + required: true + docker_username: + required: true + + outputs: + image_url: + description: "Pushed Docker Image URL" + value: ${{ inputs.image_name }}:${{ inputs.tag }} + +jobs: + docker-build-push: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Verify Docker credentials + run: | + if [ -z "${{ secrets.docker_username }}" ] || [ -z "${{ secrets.docker_token }}" ]; then + echo "Docker Hub credentials are missing. Add DOCKER_USERNAME/DOCKER_TOKEN or DOCKERHUB_USERNAME/DOCKERHUB_TOKEN to repository secrets." + exit 1 + fi + + - name: Log in to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ secrets.docker_username }} + password: ${{ secrets.docker_token }} + + - name: Build and Push + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ secrets.docker_username }}/${{ inputs.image_name }}:${{ inputs.tag }}, ${{ secrets.docker_username }}/${{ inputs.image_name }}:latest + +``` +### 3. Pull Request Pipeline + +``` +name: PR Pipe-line +on: + pull_request: + branches: + - main + types: + - opened + - synchronize + +jobs: + call-build-test: + uses: ./.github/workflows/reusable-build-test.yml + with: + run_tests: true + + pr-comment: + needs: call-build-test + runs-on: ubuntu-latest + steps: + - name: Success Message + run: 'echo "PR checks passed for branch: ${{ github.head_ref }}" +``` +### 4. Scheduled Health Check +``` +name: Scheduled Health Check +on: + schedule: + - cron: '0 */12 * * *' + workflow_dispatch: # Allows manual testing + +jobs: + verify-health: + runs-on: ubuntu-latest + steps: + - name: Pull Latest Docker Image + run: docker pull ${{ secrets.DOCKERHUB_USERNAME }}/devops-practice-api:latest + + - name: Run Container + run: docker run -d -p 3000:3000 --name test-api ${{ secrets.DOCKERHUB_USERNAME }}/devops-practice-api:latest + + - name: Wait for startup + run: sleep 5 + + - name: Test Health Endpoint + run: | + STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/status) + if [ $STATUS -eq 200 ]; then + echo "Health check passed!" + echo "## Health Check Report" >> $GITHUB_STEP_SUMMARY + echo "- Image: ${{ secrets.DOCKERHUB_USERNAME }}/devops-practice-api:latest" >> $GITHUB_STEP_SUMMARY + echo "- Status: PASSED ✅" >> $GITHUB_STEP_SUMMARY + echo "- Time: $(date)" >> $GITHUB_STEP_SUMMARY + else + echo "Health check failed with status $STATUS" + exit 1 + fi + + - name: Cleanup Container + if: always() + run: docker rm -f test-api +``` +### 5. Main Branch Pipeline + +``` +name: Main Branch Pipeline +on: + push: + branches: + - main +jobs: + test: + uses: ./.github/workflows/reusable-build-test.yml + with: + run_tests: true + + docker: + needs: test + uses: ./.github/workflows/reusable-docker.yml + with: + image_name: devops-practice-api + tag: sha-${{ github.sha }} + secrets: + docker_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_token: ${{ secrets.DOCKERHUB_TOKEN }} + + deploy: + needs: docker + runs-on: ubuntu-latest + environment: production + steps: + - name: Mock Deployment + run: echo "Deploying image ${{ needs.docker.outputs.image_url }} to production" +``` +## Next Steps & Future Iterations +Slack Integration Notification Matrices: +>> Implement step-level notification models via Incoming Webhooks to alert internal engineering teams instantly upon pipeline failures or production manual gate holds. + +Multi-Environment Pipeline Topology: +>> Scale out infrastructure targeting distinct pipeline scopes across staging environments before passing gates onward into final production setups. + +Automated Rollback Sequences: +>> Implement post-deployment testing hooks that automatically catch production standard failures and force zero-downtime redeployment of the previous stable container tag. From 0eae7798e9398864b5f51a7f0ff3f1ad47a978cf Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 10 Jul 2026 21:35:52 +0530 Subject: [PATCH 57/76] Add Kubernetes architecture and cluster setup documentation Documented Kubernetes architecture, setup process, and component functions. --- 2026/day-50/day-50-kubernetes.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 2026/day-50/day-50-kubernetes.md diff --git a/2026/day-50/day-50-kubernetes.md b/2026/day-50/day-50-kubernetes.md new file mode 100644 index 0000000000..b7cd71fbd9 --- /dev/null +++ b/2026/day-50/day-50-kubernetes.md @@ -0,0 +1,34 @@ +# Day 50 – Kubernetes Architecture and Cluster Setup + +## 1. Kubernetes History +Kubernetes was created by Google to solve the immense challenge of managing and scaling thousands of containers simultaneously across clusters of hosts. While Docker alone is fantastic for building and running individual containers, it lacks the built-in capability to orchestrate, auto-scale, and self-heal applications across multiple servers. Inspired by Google's internal container management system called "Borg," Kubernetes was open-sourced to provide a robust orchestration framework. The name "Kubernetes" originates from Greek, meaning "helmsman" or "pilot," which perfectly describes its role in steering containerized applications. + +## 2. Kubernetes Architecture Diagram (Text-Based) + +**Control Plane (Master Node)** - *The Brain of the Cluster* +* `API Server`: The front door. All kubectl commands and internal communications go through here. +* `etcd`: The highly available key-value store database containing all cluster state and configurations. +* `Scheduler`: The decision-maker that assigns newly created pods to optimal worker nodes based on resources. +* `Controller Manager`: The loop that constantly watches the cluster to ensure the actual state matches the desired state. + +**Worker Node** - *The Muscles of the Cluster* +* `kubelet`: The agent running on each node that talks to the API server and ensures containers are running in a pod. +* `kube-proxy`: Maintains network rules and handles routing traffic so pods can communicate. +* `Container Runtime`: The underlying software (like containerd) that pulls images and runs the containers. + +## 3. Tool Chosen: kind (Kubernetes in Docker) +For this setup, I chose **kind**. As seen in my setup process, I created a cluster named `devops-cluster` which provisioned a control plane running node image version v1.36.1. I chose kind because it is lightweight, fast, and uses Docker containers to simulate Kubernetes nodes, making it an excellent and efficient choice for local development and testing. I also have an existing `kind-lc-cluster` configuration with worker nodes running version v1.35.0. + +## 4. Screenshots & Verifications +* **kubectl get nodes**: My `devops-cluster-control-plane` is in a `Ready` status. +* **kubectl get pods -n kube-system**: Successfully listed all core components running as pods. + +## 5. What Each `kube-system` Pod Does +Looking at the output of `kubectl get pods -n kube-system`, here is what each component is doing: +* **`kube-apiserver`**: Validates and configures data for the api objects (pods, services, etc.); it's the central management entity. +* **`etcd`**: The backing store holding the cluster data. If this fails, the cluster loses its memory of what should be running. +* **`kube-scheduler`**: Watches for new pods without assigned nodes and selects a node for them to run on. +* **`kube-controller-manager`**: Runs controller processes (like node controller, replication controller) to regulate the state of the system. +* **`kube-proxy`**: Reflects services defined in the Kubernetes API on each node and can do simple network stream or UDP forwarding across a set of backends. +* **`coredns`**: Provides DNS services to the cluster, allowing pods to find each other by name rather than IP address. +* **`kindnet`**: The specific Container Network Interface (CNI) plugin used by kind to handle networking between the nodes. From 2e71d52a060c96f388a913308ef5f9b50e2fc6e3 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 10 Jul 2026 21:41:59 +0530 Subject: [PATCH 58/76] Create devsecops.md --- 2026/day-49/devsecops.md | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 2026/day-49/devsecops.md diff --git a/2026/day-49/devsecops.md b/2026/day-49/devsecops.md new file mode 100644 index 0000000000..1e561df67d --- /dev/null +++ b/2026/day-49/devsecops.md @@ -0,0 +1,45 @@ +# Day 49 – DevSecOps: Add Security to Your CI/CD Pipeline + +## 1. What is DevSecOps? +DevSecOps is the practice of integrating automated security checks directly into the CI/CD pipeline rather than treating security as a separate, final step. By automating vulnerability and secret scans during the pull request and build stages, development teams can catch and resolve critical security issues in minutes before they ever reach the production environment. + +## 2. Docker Image Vulnerability Scan (Trivy) +We integrated `aquasecurity/trivy-action` into the main deployment pipeline to scan the Docker image before pushing it to the registry. +* **Base Image Used:** `node:18-alpine` *(Update with your actual base image)* +* **CVEs Found:** 0 CRITICAL or HIGH vulnerabilities were detected in this run, allowing the pipeline to proceed and deploy. *(Update with actual findings if any)* + + +## 2. GitHub Secret Scanning & Push Protection +* **Secret Scanning vs. Push Protection:** Secret scanning continuously monitors the repository and alerts you if a secret (like an API key or password) is found in the codebase after it has been pushed. Push protection is a proactive measure that scans commits *before* they are accepted; if it detects a secret, it completely blocks the push to the repository. +* **Leaked AWS Key Scenario:** If GitHub detects a leaked AWS key in the repository, it immediately flags it as a security alert. Thanks to GitHub's partner program, it also directly notifies AWS, which can automatically quarantine or revoke the compromised key to prevent unauthorized access to cloud resources. + +## 3. Dependency Vulnerability Review +By adding `actions/dependency-review-action@v4` to the Pull Request pipeline, the workflow now automatically intercepts any new dependencies added in a PR. If a developer attempts to merge a package with a known critical CVE, the PR check will fail, preventing the insecure dependency from entering the main codebase. + +## 4. Workflow Permissions +* **Why limit permissions?** Limiting workflow permissions enforces the principle of least privilege. By default, workflows might have broad access to modify the repository. Explicitly defining `permissions: contents: read` ensures the workflow only has exactly the access it needs to run. +* **The Risk:** If a compromised or malicious third-party GitHub Action has `write` access, it could secretly modify source code, steal environment variables, or push malicious releases directly to the repository. + +## 5. The Full Secure DevSecOps Pipeline Diagram + +```text +[ Pull Request Opened ] + │ + ├─► Build & Test + ├─► Dependency Vulnerability Check <-- [NEW] + │ + └─► PR Checks (Pass/Fail) + +[ Merge to Main ] + │ + ├─► Build & Test + ├─► Docker Build + ├─► Trivy Image Scan (Fails on CRITICAL/HIGH) <-- [NEW] + ├─► Docker Push (Only if scan passes) + │ + └─► Deploy to Production + +[ Always Active (Background) ] + │ + ├─► GitHub Secret Scanning <-- [NEW] + └─► Push Protection for Secrets <-- [NEW] From 14ee002714926a0e06bb78dc5992e3b2e098e4a0 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 10:17:05 +0530 Subject: [PATCH 59/76] Dockerize Node.js app with PostgreSQL setup Added Dockerfile and docker-compose.yml for Node.js app with PostgreSQL. Included instructions for building and testing the application. --- 2026/day-36/day-36-docker-project.md | 113 +++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 2026/day-36/day-36-docker-project.md diff --git a/2026/day-36/day-36-docker-project.md b/2026/day-36/day-36-docker-project.md new file mode 100644 index 0000000000..9af85af065 --- /dev/null +++ b/2026/day-36/day-36-docker-project.md @@ -0,0 +1,113 @@ +# Day 36 – Docker Project: Dockerize a Full Application + + + +## Task 1: Pick Your App +For this project, I chose to Dockerize a Node.js Express application connected to a PostgreSQL database. + +**Why?** This is a highly standard, real-world tech stack. It requires handling environment variables, database connections, and ensuring the application doesn't crash before the database is fully booted up. + +## Task 2: Write the Dockerfile +I wrote a secure, optimized, multi-stage Dockerfile for the Node.js application. + +### `Dockerfile` +```dockerfile +# STAGE 1: Builder +FROM node:18-alpine AS builder +WORKDIR /app + +# Copy package files first to leverage Docker layer caching +COPY package*.json ./ +RUN npm install + +# Copy the rest of the application code +COPY . . + +# STAGE 2: Production +FROM node:18-alpine +WORKDIR /app + +# Security: Create a non-root user and group +RUN addgroup -S appgroup && adduser -S appuser -G appgroup + +# Copy only the necessary files from the builder stage +COPY --from=builder /app ./ + +# Change ownership to the non-root user +RUN chown -R appuser:appgroup /app + +# Switch to the non-root user +USER appuser + +# Expose the application port +EXPOSE 3000 + +# Start the application +CMD ["npm", "start"] +``` +'dockerignore' +``` +node_modules +.git +.env +Dockerfile +README.md +``` +### Task 3: Add Docker Compose +I created a docker-compose.yml file to orchestrate the Node.js app and the Postgres database, utilizing healthchecks and named volumes. +``` +version: '3.8' + +services: + db: + image: postgres:13-alpine + restart: always + environment: + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_NAME} + volumes: + - db_data:/var/lib/postgresql/data + networks: + - my-app-net + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d${DB_NAME}"] + interval: 10s + timeout: 5s + retries: 5 + + web: + image: sachin8550/my-node-app:v1 + build: . + ports: + - "3000:3000" + environment: + DB_HOST: db + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} + DB_NAME: ${DB_NAME} + depends_on: + db: + condition: service_healthy + networks: + - my-app-net + +networks: + my-app-net: + +volumes: + db_data: +``` +### Task 4 & 5: Ship It and Test the Flow +Build and Tag: I built the image and tagged it with my Docker Hub username. + + Bash +docker build -t sachin8550/my-node-app:v1 . +Push: I pushed the image to Docker Hub. + +Bash +docker push sachin8550/my-node-app:v1 +The Ultimate Test: I ran docker system prune -a to delete all my local images and containers. Then, I ran docker compose up -d. + +Docker Compose successfully pulled my custom image from Docker Hub, built the database, waited for the healthcheck to pass, and started the app. It worked perfectly on the first try! + From b0b85b98da7a5f2673c93909aaea20793100097b Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 10:26:34 +0530 Subject: [PATCH 60/76] Document triggers and matrix builds in day-41 Added documentation for triggers including PR checks, scheduled triggers, manual triggers, and matrix builds. Explained configurations and verifications for each task. --- 2026/day-41/day-41-triggers.md | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 2026/day-41/day-41-triggers.md diff --git a/2026/day-41/day-41-triggers.md b/2026/day-41/day-41-triggers.md new file mode 100644 index 0000000000..abc47ded53 --- /dev/null +++ b/2026/day-41/day-41-triggers.md @@ -0,0 +1,86 @@ +# Day 41 – Triggers & Matrix Builds + + +## Task 1: Trigger on Pull Request (`pr-check.yml`) +I set up this workflow to ensure that any code changes are validated before they can be merged into `main`. + +```yaml +name: Pull Request Check + +on: + pull_request: + branches: [main] + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Print branch info + run: echo "PR check running for branch: ${{ github.head_ref }}" +``` +Verification: I created a new branch feature-branch, made a small change, and opened a PR. GitHub automatically triggered the workflow and displayed the status on the PR page. +### Task 2: Scheduled Trigger +I added a schedule to a workflow using the standard POSIX cron syntax. +``` +on: + schedule: + - cron: '0 0 * * *' # Midnight UTC every day +``` +Cron expression for every Monday at 9 AM: 0 9 * * 1 +### Task 3: Manual Trigger (manual.yml) +I added workflow_dispatch to allow manual execution, complete with an input field to select the target environment. +``` +on: + workflow_dispatch: + inputs: + environment: + description: 'Target environment' + required: true + default: 'staging' + type: choice + options: + - staging + - production + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - run: echo "Deploying to ${{ inputs.environment }}" +``` +Verification: In the Actions tab, I clicked "Run workflow," selected "production" from the dropdown, and saw the runner print "Deploying to production" in the logs. +### Task 4: Matrix Builds (matrix.yml) + +I used the strategy key to test my code across multiple configurations simultaneously. +``` +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.10', '3.11', '3.12'] + steps: + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - run: python --version +``` +Total Jobs: When I extended the matrix to include 2 operating systems (ubuntu-latest, windows-latest) and 3 Python versions, GitHub ran 6 total jobs in parallel (2 OS × 3 Python versions). +### Task 5: Exclude & Fail-Fast +I refined my matrix to skip specific combinations and control pipeline behavior. +``` +strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] + python-version: ['3.10', '3.11'] + exclude: + - os: windows-latest + python-version: '3.10' +``` +#### Answers: +What does fail-fast: true (default) do vs false? +-> If true, as soon as one job in the matrix fails, GitHub cancels all other in-progress jobs in the same matrix. If false, GitHub will allow all other jobs in the matrix to finish, even if one of them fails. + +Why choose false? +-> fail-fast: false is much better for debugging because you can see the results of all environment combinations, rather than stopping after the first failure and hiding potential issues in other configurations. From a0555fc22f8b9add9345178d1082ccafb583e0f5 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 10:42:38 +0530 Subject: [PATCH 61/76] Add Day 43 documentation on GitHub Actions Documented tasks related to multi-job workflows, environment variables, job outputs, conditionals, and smart pipelines in GitHub Actions. --- 2026/day-43/day-43-jobs-steps.md | 147 +++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 2026/day-43/day-43-jobs-steps.md diff --git a/2026/day-43/day-43-jobs-steps.md b/2026/day-43/day-43-jobs-steps.md new file mode 100644 index 0000000000..1531de8d0b --- /dev/null +++ b/2026/day-43/day-43-jobs-steps.md @@ -0,0 +1,147 @@ +# Day 43 – Jobs, Steps, Env Vars & Conditionals + +## Task 1: Multi-Job Workflow +I created a workflow with three jobs (`build`, `test`, `deploy`) that run in a specific sequence using the `needs` keyword. + +### `.github/workflows/multi-job.yml` +```yaml +name: Multi-Job Workflow + +on: push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo "Building the app" + + test: + needs: build + runs-on: ubuntu-latest + steps: + - run: echo "Running tests" + + deploy: + needs: test + runs-on: ubuntu-latest + steps: + - run: echo "Deploying" +``` +Verification: In the Actions tab, the workflow graph clearly displays the dependency chain: build -> test -> deploy. The subsequent jobs only run if the previous ones succeed. +### Task 2: Environment Variables +I tested environment variables defined at three different scopes (workflow, job, and step), alongside standard GitHub context variables. +``` +name: Environment Variables & Context + +on: push + +env: + APP_NAME: myapp # Workflow level + +jobs: + env-test: + runs-on: ubuntu-latest + env: + ENVIRONMENT: staging # Job level + steps: + - name: Print Environment Variables + env: + VERSION: 1.0.0 # Step level + run: | + echo "App Name: $APP_NAME" + echo "Environment: $ENVIRONMENT" + echo "Version: $VERSION" + + - name: Print GitHub Context + run: | + echo "Commit SHA: ${{ github.sha }}" + echo "Triggered by: ${{ github.actor }}" +``` +### Task 3: Job Outputs +I passed a dynamically generated value from one job to another using $GITHUB_OUTPUT. +``` +name: Job Outputs + +on: push + +jobs: + set-date: + runs-on: ubuntu-latest + outputs: + today_date: ${{ steps.date-step.outputs.date }} + steps: + - id: date-step + run: echo "date=$(date)" >> $GITHUB_OUTPUT + + print-date: + needs: set-date + runs-on: ubuntu-latest + steps: + - run: echo "The date from the previous job is ${{ needs.set-date.outputs.today_date }}" +``` +#### Note: Why pass outputs between jobs? +You pass outputs between jobs to share dynamic data generated during runtime that subsequent jobs require. For example: passing a dynamically generated Docker image tag, an AWS resource ID, or the status of a specific test run from a build job to a deployment job. +### Task 4: Conditionals +I experimented with if statements and error handling to control when specific steps and jobs execute. +``` +name: Conditionals Practice + +on: + push: + pull_request: + +jobs: + conditional-job: + # Runs ONLY on push events, skips on pull requests + if: github.event_name == 'push' + runs-on: ubuntu-latest + steps: + - name: Step for Main Branch Only + if: github.ref == 'refs/heads/main' + run: echo "This step only runs on the main branch!" + + - name: Step that fails intentionally + continue-on-error: true + run: exit 1 + + - name: Runs only if the previous step failed + if: failure() + run: echo "The previous step failed, but we are recovering!" +``` +#### Note: What does continue-on-error: true do? +By default, if a step fails (returns a non-zero exit code), the entire job stops. Setting continue-on-error: true tells GitHub Actions to ignore the failure and proceed to the next step anyway. This is highly useful for non-critical steps like uploading optional logs or running experimental tests. +### Task 5: Putting It Together +I combined triggers, parallel jobs, dependencies, and contexts into a single "smart pipeline." +``` +name: Smart Pipeline + +on: push + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - run: echo "Linting code..." + + test: + runs-on: ubuntu-latest + steps: + - run: echo "Testing code..." + + summary: + needs: [lint, test] # Waits for BOTH parallel jobs to finish + runs-on: ubuntu-latest + steps: + - name: Print Summary + run: | + if [ "${{ github.ref }}" == "refs/heads/main" ]; then + echo "This is a Main Branch Push" + else + echo "This is a Feature Branch Push" + fi + echo "Commit Message: ${{ github.event.commits[0].message }}" +``` +### 📝 Key Concepts Documentation +needs: Defines dependencies between jobs. By default, all jobs run in parallel. Adding needs: [job_name] forces the current job to wait until the specified job(s) complete successfully before starting. + +outputs: A mechanism to expose variables generated in one job so they can be read by a downstream job. You map a step's output ($GITHUB_OUTPUT) to a job output, which is then accessed using ${{ needs..outputs. }}. From 357c9a6656eefe600d86011632c49d9e3980e17c Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 10:51:48 +0530 Subject: [PATCH 62/76] Add Kubernetes Pod examples and explanations Added examples of Kubernetes Pod manifests for BusyBox and multi-label configurations. Explained imperative vs. declarative approaches and the implications of deleting standalone Pods. --- 2026/day-51/day-51-pods.md | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 2026/day-51/day-51-pods.md diff --git a/2026/day-51/day-51-pods.md b/2026/day-51/day-51-pods.md new file mode 100644 index 0000000000..ffd5d02ba7 --- /dev/null +++ b/2026/day-51/day-51-pods.md @@ -0,0 +1,68 @@ +# Day 51 – Kubernetes Manifests and Your First Pods + + +## 1. The Anatomy of a Kubernetes Manifest +Every Kubernetes resource is defined using a YAML manifest. Here are the four required top-level fields and what they do: + +1. **`apiVersion`**: Tells Kubernetes which version of its API to use to create the object. For Pods, this is always `v1`. Other resources (like Deployments) use different API groups (like `apps/v1`). +2. **`kind`**: Specifies the type of Kubernetes resource you are trying to create. For today's tasks, this is `Pod`. +3. **`metadata`**: Contains data that helps uniquely identify the object. This must include a `name`, and optionally (but highly recommended) includes `labels` for organizing and selecting resources. +4. **`spec`**: The most important part—it defines the *desired state* for the resource. For a Pod, this specifies which containers to run, the Docker images to use, exposed ports, and commands. + +--- + +## 2. Pod Manifests + +Below are the three pod manifests I created today. + +### `nginx-pod.yaml` +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx-pod + labels: + app: nginx +spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 +``` +### `busybox-pod.yaml` +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: busybox-pod + labels: + app: busybox + environment: dev +spec: + containers: + - name: busybox + image: busybox:latest + command: ["sh", "-c", "echo Hello from BusyBox && sleep 3600"] +``` +### `multi-label-pod.yaml` +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: multi-label-pod + labels: + app: database + environment: staging + team: backend +spec: + containers: + - name: redis + image: redis:alpine +``` +### 3. Imperative vs. Declarative Approaches +Imperative (kubectl run): You are giving Kubernetes a specific command of how to do something (e.g., kubectl run my-pod --image=nginx). It is fast for quick tests and scaffolding, but it is not easily repeatable, version-controlled, or good for complex setups. + +Declarative (kubectl apply -f): You write a YAML manifest describing exactly what you want the final state to look like, and Kubernetes figures out how to make it happen. This is the industry standard (Infrastructure as Code) because the manifests can be tracked in Git, reviewed, and consistently applied across environments. +### 4. What happens when you delete a standalone Pod? +When you delete a standalone Pod, it is permanently destroyed. Because there is no higher-level controller (like a ReplicaSet or Deployment) managing it, Kubernetes will not automatically recreate it. If a node fails or the pod crashes, it is gone. This is why standalone Pods are almost never used in production. From f308b54557cef91cd6796b83877aa729cbdf07e5 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 11:02:30 +0530 Subject: [PATCH 63/76] Remove self-note about screenshots in markdown Removed note to self about inserting screenshots before pushing. --- 2026/day-52/day-52-namespaces-deployments.md | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 2026/day-52/day-52-namespaces-deployments.md diff --git a/2026/day-52/day-52-namespaces-deployments.md b/2026/day-52/day-52-namespaces-deployments.md new file mode 100644 index 0000000000..18cac7e835 --- /dev/null +++ b/2026/day-52/day-52-namespaces-deployments.md @@ -0,0 +1,22 @@ +## 📝 Key Concepts Documentation + +1. **What namespaces are and why you would use them:** + Namespaces are virtual clusters backed by the same physical cluster hardware. They are used to isolate resources, divide cluster resources between multiple users/teams, and separate environments (like `dev`, `staging`, and `prod`) so that names don't conflict and accidental deletions are contained. + +2. **The Deployment Manifest Explained:** + * `apiVersion: apps/v1` & `kind: Deployment`: Specifies we are using the Deployment API to manage applications. + * `replicas: 3`: The Deployment Controller will ensure exactly 3 pods exist at all times. + * `selector.matchLabels`: Tells the Deployment *how* to find the Pods it is supposed to manage. + * `template`: The actual blueprint for the Pods. The `labels` in the template must match the `matchLabels` in the selector. + +3. **Standalone Pod vs. Deployment-Managed Pod:** + If a standalone pod is deleted or crashes, it is gone forever. If a Deployment-managed pod crashes or is deleted, the Deployment's underlying ReplicaSet notices the count dropped below the desired state and instantly spins up a replacement. + +4. **Scaling Imperatively vs. Declaratively:** + * **Imperative:** Running `kubectl scale deployment --replicas=N`. Fast and easy, but not version-controlled. + * **Declarative:** Editing the `replicas` field in the `.yaml` file and running `kubectl apply -f`. Preferred in production because the infrastructure code matches the cluster state. + +5. **Rolling Updates and Rollbacks:** + A rolling update replaces old pods with new ones gradually (e.g., spinning up one new pod, ensuring it is healthy, then terminating one old pod) to ensure zero downtime. If the new version fails, a rollback (`kubectl rollout undo`) quickly reverts the Deployment to its previous stable state using stored ReplicaSet history. + +--- From 90a26312b466e51dba5c8097e347887271b85521 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 14 Jul 2026 11:10:49 +0530 Subject: [PATCH 64/76] Document Kubernetes Services and Networking Added detailed documentation on Kubernetes Services, including types, manifests, DNS functionality, and endpoints. --- 2026/day-53/day-53.md | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 2026/day-53/day-53.md diff --git a/2026/day-53/day-53.md b/2026/day-53/day-53.md new file mode 100644 index 0000000000..26b23a2f37 --- /dev/null +++ b/2026/day-53/day-53.md @@ -0,0 +1,111 @@ +# Day 53 – Kubernetes Services: Networking and Discovery + + + +## 1. The Problem Services Solve +**The Problem:** In Kubernetes, Pods are ephemeral (short-lived). When a Deployment scales up, scales down, or recreates a Pod after a crash, the new Pods are assigned entirely new IP addresses. If your frontend application is trying to communicate with your backend database, it cannot rely on hardcoded Pod IP addresses because they are constantly changing. + +**The Solution:** A **Service** provides a stable, permanent IP address and DNS name that sits in front of a group of Pods. +* **Deployments** manage the *lifecycle* of the Pods (making sure the right number are running). +* **Services** manage the *network routing* to those Pods. As Pods die and respawn behind the scenes, the Service keeps track of their new IPs automatically, while the frontend only ever has to talk to the unchanging Service IP. + +--- + +## 2. Service Types & Manifests + +There are three primary types of Kubernetes Services. Below are the manifests I created for each, along with an explanation of how they differ. + +### Type 1: ClusterIP (The Default) +A `ClusterIP` service provides an internal IP address. The service is **only reachable from inside the Kubernetes cluster**. This is perfect for backend databases or internal microservices that the outside world should never access directly. + +```yaml +# clusterip-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: backend-service + namespace: dev +spec: + type: ClusterIP + selector: + app: backend-app + ports: + - protocol: TCP + port: 80 # The port the Service listens on + targetPort: 8080 # The port the actual container is listening on +``` +### Type 2: NodePort +A NodePort service opens a specific port (between 30000–32767) on every single Node (server) in the cluster. Any traffic sent to : is automatically routed to the Service. This is a basic way to expose an app to the outside world. +``` +# nodeport-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: frontend-nodeport + namespace: dev +spec: + type: NodePort + selector: + app: frontend-app + ports: + - protocol: TCP + port: 80 + targetPort: 80 + nodePort: 30080 # External port (optional: K8s will pick one randomly if omitted) +``` +### Type 3: LoadBalancer +A LoadBalancer service is the standard way to expose an application in a cloud environment (AWS, GCP, Azure). It automatically provisions an external cloud load balancer, gives you a public IP/URL, and routes that external traffic to your NodePorts/ClusterIPs. +``` +# loadbalancer-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: web-loadbalancer + namespace: dev +spec: + type: LoadBalancer + selector: + app: web-app + ports: + - protocol: TCP + port: 80 + targetPort: 80 +``` + +### 3. How Kubernetes DNS Works for Service Discovery + +Kubernetes runs an internal DNS server (usually CoreDNS in the kube-system namespace). + +Whenever you create a Service, Kubernetes automatically creates a DNS record for it. Because of this, Pods don't even need to know the Service's IP address—they can just call the Service by its name! + +The fully qualified domain name (FQDN) looks like this: + +service-name.namespace.svc.cluster.local +#### Example: +If a frontend pod in the dev namespace needs to talk to the backend-service in the same namespace, it can simply make a request to: +http://backend-service + +If it needs to talk to a service in a different namespace (e.g., prod), it would use: +http://backend-service.prod.svc.cluster.local + +### 4. What are Endpoints? + +While a Service provides the stable IP, the Endpoints object is what actually holds the list of the dynamic Pod IP addresses. + + +When you create a Service with a selector (like app: web-app), Kubernetes continuously scans the cluster for Pods with that exact label. When it finds them, it takes their IPs and adds them to an Endpoints list. When traffic hits the Service, the Service forwards it to one of the IPs in that Endpoints list. + + +How to inspect Endpoints: + +```bash +# View the endpoints for a specific service +kubectl get endpoints backend-service -n dev + +# See detailed routing info +kubectl describe service backend-service -n dev +``` +If a Service is not working, checking the Endpoints is the first debugging step. If the Endpoints list is empty, it means your Service's selector labels don't match your Pods' labels! + +### 5. Verification & Testing +kubectl run test-pod --image=busybox:1.28 -it --rm --restart=Never -- nslookup backend-service From c84da41cc5e9c91498687acaa58baa17e44f12bd Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Wed, 15 Jul 2026 15:55:21 +0530 Subject: [PATCH 65/76] Add guide on ConfigMaps and Secrets in Kubernetes Introduced a comprehensive guide on managing dynamic configurations in Kubernetes, covering ConfigMaps, Secrets, injection methods, security considerations, and propagation behavior. --- 2026/day-54/day-54.md | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2026/day-54/day-54.md diff --git a/2026/day-54/day-54.md b/2026/day-54/day-54.md new file mode 100644 index 0000000000..ab51315da6 --- /dev/null +++ b/2026/day-54/day-54.md @@ -0,0 +1,54 @@ +# Managing Dynamic Configurations in Kubernetes: ConfigMaps & Secrets + +## Overview +To maintain immutable container images, configuration must be decoupled from the application logic. Kubernetes provides two native primitives for this purpose: **ConfigMaps** and **Secrets**. + +--- + +## 1. ConfigMaps vs. Secrets +Both objects store key-value data to be injected into containers, but their use cases differ based on the sensitivity of the data. + +### ConfigMaps +* **What they are:** Objects used to store non-sensitive configuration data (e.g., application settings, port numbers, log levels, configuration file contents). +* **When to use:** Use for any data that is not a secret or sensitive credential. + +### Secrets +* **What they are:** Objects designed to store sensitive information (e.g., database passwords, API tokens, TLS certificates). +* **When to use:** Use for credentials, keys, or any data that requires restricted access via RBAC (Role-Based Access Control). + +--- + +## 2. Injection Methods: Environment Variables vs. Volume Mounts + +| Feature | Environment Variables | Volume Mounts | +| :--- | :--- | :--- | +| **Data Format** | Key-Value pairs | Files on a filesystem | +| **Update Behavior** | Requires Pod restart to pick up changes | Can be updated without a Pod restart | +| **Best For** | Single, small configuration values | Large files, complex configurations, certificates | + +### Environment Variables +Environment variables are populated at the time the container process starts. They are injected as static strings into the process environment. + +### Volume Mounts +Volume mounts expose the ConfigMap or Secret data as files within a directory in the container. This approach treats the configuration as if it were a physical file existing on the disk, which is ideal for applications that read configuration from files (e.g., `nginx.conf`, `settings.yaml`). + +--- + +## 3. A Note on Security: Base64 Encoding vs. Encryption +A common misconception is that Kubernetes Secrets are "encrypted" because they appear as Base64-encoded strings when viewed in YAML. + +* **Encoding is NOT Encryption:** Base64 is a simple encoding scheme that transforms binary data into ASCII characters. It is **not** a security measure, and it can be trivially decoded by anyone with access to the cluster's API. +* **True Security:** To protect secrets at rest, you should enable **Encryption at Rest** in your Kubernetes cluster (e.g., using a KMS provider) and strictly enforce RBAC to ensure only authorized users and ServiceAccounts can read Secret objects. + +--- + +## 4. Propagation Behavior +The way Kubernetes updates configuration depends entirely on the injection method chosen: + +### Environment Variables (Static) +Environment variables are immutable once the container process has launched. If the underlying ConfigMap or Secret changes, the Pod **will not** see those changes until the Pod is deleted and recreated (restarted). + +### Volume Mounts (Dynamic) +When a ConfigMap or Secret is mounted as a volume, Kubernetes periodically synchronizes the data from the API server to the kubelet on the node. +* **The Propagation:** When you update the object in the cluster, the kubelet eventually updates the files in the mounted directory. +* **Application Handling:** While the file itself updates automatically, the application **must be designed** to handle this (e.g., by watching the file for changes using `inotify` or by periodically polling the file system for updates) in order to reload the configuration without a restart. From 4878c2ca71cd0cf19d8ed992dbeb757b52dd8abd Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 16 Jul 2026 12:01:40 +0530 Subject: [PATCH 66/76] F Day 55 documentation Corrected formatting for Day 55 title in markdown. --- 2026/day-55/day-55.md | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 2026/day-55/day-55.md diff --git a/2026/day-55/day-55.md b/2026/day-55/day-55.md new file mode 100644 index 0000000000..2dcfad8dab --- /dev/null +++ b/2026/day-55/day-55.md @@ -0,0 +1,52 @@ +# Day 55 – Kubernetes Persistent Volumes (PV) and Persistent Volume Claims (PVC) +## Why Containers Need Persistent Storage +One of the golden rules of containers is that they are ephemeral. When a Pod crashes or is deleted, its local file system goes down with it. Everything inside is wiped out. This is a serious problem for databases, stateful applications, or anything that needs data to survive a restart. Kubernetes solves this by decoupling the lifecycle of your data from the lifecycle of your Pods using persistent storage. + +## What PVs and PVCs Are and How They Relate +To manage storage, Kubernetes uses two main resources: +* **Persistent Volume (PV):** A PV is a cluster-wide resource representing a physical piece of storage that has been provisioned for use by Pods. It acts as an abstraction layer over the actual underlying storage (like a local disk, AWS EBS, or NFS). +* **Persistent Volume Claim (PVC):** A PVC is a namespaced request for storage by a user. + +**How they relate:** Instead of a Pod directly interacting with the underlying storage, the Pod uses a PVC. Kubernetes matches the PVC to an available PV that meets the requested specifications (like capacity and access modes) and binds them together. + +## Static vs Dynamic Provisioning +* **Static Provisioning:** The cluster administrator manually creates the `PersistentVolume` (PV) objects ahead of time, defining the exact storage details. A developer then creates a PVC, which binds to one of these pre-created PVs. +* **Dynamic Provisioning:** Eliminates the overhead of manual creation. Developers simply create a PVC specifying a `StorageClass`. The `StorageClass` automatically provisions the underlying storage and creates the PV on demand the moment it is requested (or when the first consumer Pod is scheduled). + +## Access Modes and Reclaim Policies + +### Access Modes +Access modes dictate how a volume can be mounted by nodes: +* **ReadWriteOnce (RWO):** The volume can be mounted as read-write by a single node at a time. +* **ReadOnlyMany (ROX):** The volume can be mounted read-only by many nodes simultaneously. +* **ReadWriteMany (RWX):** The volume can be mounted read-write by many nodes simultaneously. + +### Reclaim Policies +Reclaim policies dictate what happens to the PV when its associated PVC is deleted: +* **Retain:** The PV is not automatically deleted. The data persists, allowing for manual recovery. Often used for manually created (static) PVs. +* **Delete:** The underlying storage is automatically destroyed along with the PV. This is typically the default for dynamically provisioned volumes. + +--- + +## Troubleshooting Journey: Issues Faced & Resolved +During our hands-on tasks, we ran into several real-world scenarios and blockers that required deep-dive troubleshooting. Here is a log of the issues faced and how we solved them: + +### 1. PVC Stuck in `Pending` (WaitForFirstConsumer) +* **Issue:** After creating a PVC, its status remained `Pending` with the event message: *"waiting for first consumer to be created before binding"*. +* **Resolution:** This was expected behavior. The cluster's default StorageClass was set to `volumeBindingMode: WaitForFirstConsumer`. The solution was to deploy a Pod that referenced the PVC, prompting the Kubernetes scheduler to nominate a node and trigger the volume binding process. + +### 2. StorageClass Mismatch in Static Provisioning +* **Issue:** A statically created PV and a new PVC were not binding, despite matching capacity and access modes. The PVC stayed in `Pending`. +* **Resolution:** Kubernetes automatically assigned the default `standard` StorageClass to the PVC, while the manual PV had no StorageClass. We resolved this by explicitly defining `storageClassName: ""` in the PVC manifest, forcing it to look for a PV with no StorageClass. + +### 3. Dynamic Provisioner CrashLoopBackOff +* **Issue:** During dynamic provisioning, the PVC threw an `ExternalProvisioning` error. Investigating the `local-path-provisioner` Pod in the `local-path-storage` namespace showed it was crashing continuously. +* **Resolution:** Checking the pod logs revealed it was failing due to cluster networking issues. + +### 4. Kubernetes API Connection Refused in `kind` +* **Issue:** The provisioner logs showed: `dial tcp 10.96.0.1:443: connect: connection refused`. Because we were using `kind` (Kubernetes IN Docker), the internal Docker network bridge had hung, preventing Pods from communicating with the Kubernetes Control Plane. +* **Resolution:** We opted to delete and recreate the `kind` cluster to flush out the corrupted IP tables and Docker network state. + +### 5. Inotify Watch Limit Exhausted (`Too many open files`) +* **Issue:** While trying to recreate the `kind` cluster, it failed to start with a host OS error: `Failed to allocate directory watch: Too many open files`. +* **Resolution:** Linux's `inotify` limits were too low for Docker and Kubernetes. We fixed this by increasing the max user watches and instances directly on the host machine: From 0011eb6da654610b0ca4c161862a4021aa9f48ad Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 16 Jul 2026 14:57:41 +0530 Subject: [PATCH 67/76] Document Kubernetes StatefulSets and their features Added detailed explanation of Kubernetes StatefulSets, including their use cases, comparison with Deployments, and core concepts like Headless Services and VolumeClaimTemplates. --- 2026/day-56/day-56.md | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 2026/day-56/day-56.md diff --git a/2026/day-56/day-56.md b/2026/day-56/day-56.md new file mode 100644 index 0000000000..a23e60b117 --- /dev/null +++ b/2026/day-56/day-56.md @@ -0,0 +1,47 @@ +# Day 56: Kubernetes StatefulSets + +## What are StatefulSets and When to Use Them? + +A **StatefulSet** is the workload API object used to manage stateful applications. While standard Deployments are designed for stateless applications where any pod can handle any request and pods are entirely interchangeable, StatefulSets manage the deployment and scaling of a set of Pods while providing guarantees about the ordering and uniqueness of these Pods. + +### When to use StatefulSets vs. Deployments: +* **Use Deployments** for stateless applications (e.g., web servers like Nginx, frontend apps, API gateways) where pods are ephemeral, interchangeable, and do not need to persist unique data locally. +* **Use StatefulSets** for stateful applications (e.g., databases like MySQL, PostgreSQL, MongoDB, or message brokers like Kafka, RabbitMQ) that require: + * Stable, unique network identifiers. + * Stable, persistent storage (each replica needs its own volume). + * Ordered, graceful deployment and scaling. + * Ordered, automated rolling updates. + +--- + +## Comparison Table: Deployments vs. StatefulSets + +| Feature | Deployment | StatefulSet | +| :--- | :--- | :--- | +| **Pod Names** | Random (e.g., `app-xyz-abc`) | Stable, ordered (e.g., `app-0`, `app-1`) | +| **Startup Order** | All at once (in parallel) | Ordered (e.g., `pod-0` first, then `pod-1`) | +| **Storage** | Typically shared PVC | Each pod gets its own unique PVC | +| **Network Identity** | No stable hostname per pod | Stable DNS entry per pod | + +--- + +## Core Concepts Explained + +### 1. Headless Services +A Headless Service is a Kubernetes Service created with `clusterIP: None`. +* **How it works:** By setting the ClusterIP to `None`, you tell Kubernetes not to assign a single load-balancing IP to the service. Instead, it bypasses the standard `kube-proxy` load balancing. +* **Why StatefulSets need it:** It allows Kubernetes internal DNS (CoreDNS) to create individual DNS A/AAAA records for each Pod backing the service. This allows other applications to connect directly to a specific replica (e.g., connecting directly to the primary database node). + +### 2. Stable DNS +Because of the Headless Service, each Pod in a StatefulSet gets a reliable, unchanging DNS name. +* **Format:** `...svc.cluster.local` +* **Example:** `web-0.my-headless-service.default.svc.cluster.local` +* Even if a pod crashes and is rescheduled to a completely different node (getting a new internal IP), its DNS name remains exactly the same, ensuring other services can always find it. + +### 3. VolumeClaimTemplates +Instead of creating one single PersistentVolumeClaim (PVC) that all pods share, StatefulSets use a `volumeClaimTemplates` section. +* **How it works:** This template automatically generates a unique PVC for each individual pod as it is created. +* **Naming Convention:** `-` (e.g., `web-data-web-0`). +* **Data Persistence:** If a pod dies or is deleted, the StatefulSet controller spins up a replacement with the exact same name (`web-0`) and automatically reconnects it to its exact original PVC (`web-data-web-0`). The data survives pod deletion! + +--- From 2f400356f22cac037a908e958bea4591ce3700ed Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Thu, 16 Jul 2026 23:18:53 +0530 Subject: [PATCH 68/76] Add Day 57: Kubernetes Resource Management and Probes This document outlines Kubernetes resource management, including the importance of Requests, Limits, and Probes for maintaining cluster health. It explains the consequences of not using these controls and details the functionality of various probes. --- 2026/day-57/day-57.md | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 2026/day-57/day-57.md diff --git a/2026/day-57/day-57.md b/2026/day-57/day-57.md new file mode 100644 index 0000000000..4ef07fccf9 --- /dev/null +++ b/2026/day-57/day-57.md @@ -0,0 +1,73 @@ +# Day 57: Kubernetes Resource Management and Probes + +Running Pods without defined limits or health checks is like driving a car blindfolded without a fuel gauge. Kubernetes assumes everything is fine until the entire cluster crashes. + +This document breaks down the difference between running a cluster blindly versus using Requests, Limits, and Probes to create a self-healing environment. + +--- + +## The Scenario: Without vs. With Controls + +### ❌ What Happens If We DON'T Use Them +* **Resource Starvation:** A memory-leaking application consumes all the RAM on a worker node. Essential system processes crash, and other Pods on the same node get evicted. +* **Traffic Blackholes:** An application starts up but takes 30 seconds to connect to the database. Kubernetes sends user traffic to it instantly, resulting in 30 seconds of HTTP 500 errors. +* **Zombie Containers:** A web server deadlocks. The container process is technically still running, so Kubernetes thinks it's healthy, but users just see spinning loading screens. No automatic restart occurs. + +### ✅ What Happens If We DO Use Them +* **Smart Placement:** Kubernetes reads the `requests` and places the Pod only on a node that actually has the capacity for it. +* **Containment:** The memory-leaking app hits its `limit` and is instantly isolated and killed (OOMKilled) before it can take down the node. +* **Traffic Control:** A `readinessProbe` blocks traffic from reaching the app until the database connection is fully established. +* **Self-Healing:** A `livenessProbe` detects the deadlocked web server and automatically restarts the container, restoring service without human intervention. + +--- + +## Requests vs. Limits (Scheduling vs. Enforcement) + +Kubernetes manages resources using two distinct concepts: + +* **Requests (The Guarantee):** This is for the **Scheduler**. When you set a request (e.g., `cpu: 100m`, `memory: 128Mi`), the scheduler looks for a node with at least that much unallocated capacity. If the cluster is full, the Pod stays in a `Pending` state. +* **Limits (The Maximum):** This is for the **Kubelet** (the agent running on the node). Limits enforce a hard ceiling at runtime. If an application tries to use more resources than its limit, the Kubelet steps in to stop it. + +**Quality of Service (QoS) Classes:** +* **Guaranteed:** Requests and Limits are exactly the same. +* **Burstable:** Requests are lower than Limits. +* **BestEffort:** No Requests or Limits are set (these are the first to be evicted if the node runs out of resources). + +--- + +## What Happens When Limits Are Exceeded? + +How Kubernetes reacts depends entirely on the type of resource being abused. + +### Exceeding CPU Limits (Compressible) +CPU is a compressible resource. If a container tries to use more CPU than its limit, Kubernetes **throttles** the container. +* **Result:** The application slows down, latency increases, but the container is **not** killed. + +### Exceeding Memory Limits (Incompressible) +Memory cannot be compressed. If a container tries to allocate more memory than its limit allows, the Linux kernel steps in immediately. +* **Result:** The container is terminated instantly with no warning. +* **Symptoms:** You will see `Reason: OOMKilled` and `Exit Code: 137` (which is standard exit code 128 + SIGKILL) when you run `kubectl describe pod`. + +--- + +## Liveness vs. Readiness vs. Startup Probes + +Probes are how Kubernetes checks the actual health of your application, not just whether the container process is running. + +### 1. Startup Probe (The Shield) +* **Purpose:** Gives heavy, slow-starting legacy applications extra time to initialize. +* **Action on Failure:** Kills and restarts the container. +* **Key Detail:** While a startup probe is running, all liveness and readiness probes are disabled. They only take over once the startup probe succeeds. + +### 2. Liveness Probe (The Defibrillator) +* **Purpose:** Detects if an application is stuck, deadlocked, or in a broken state that it cannot recover from. +* **Action on Failure:** Restarts the container. +* **Example:** Checking if a background worker is still processing queue items. If it hangs for 3 minutes, the liveness probe fails, and Kubernetes restarts it. + +### 3. Readiness Probe (The Traffic Cop) +* **Purpose:** Detects if an application is ready to accept HTTP traffic. +* **Action on Failure:** Removes the Pod's IP address from the Service endpoints. **It does NOT restart the container.** +* **Example:** An app is doing heavy background processing and cannot handle web requests temporarily. The readiness probe fails, Kubernetes stops sending user traffic, and once the app catches up, the probe passes and traffic resumes. + +--- +*(Note: Attach your screenshots of the OOMKilled, Pending, and probe events below this section as required by your submission).* From 583269a2fdd33267fc1e04362775acdcea3cda1c Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 19 Jul 2026 10:09:59 +0530 Subject: [PATCH 69/76] Document Metrics Server and HPA functionality Added documentation for Metrics Server and Horizontal Pod Autoscaler, explaining their roles and functionality in Kubernetes. --- 2026/day-58/day-58-metrics-hpa.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 2026/day-58/day-58-metrics-hpa.md diff --git a/2026/day-58/day-58-metrics-hpa.md b/2026/day-58/day-58-metrics-hpa.md new file mode 100644 index 0000000000..967a243ebf --- /dev/null +++ b/2026/day-58/day-58-metrics-hpa.md @@ -0,0 +1,23 @@ +### Day 58 - Metrics Server and Horizontal Pod Autoscaler (HPA) + +**What the Metrics Server is and why HPA needs it** +By default, Kubernetes does not track how much CPU or Memory your pods are actively using; it only knows the resource limits and requests you configured[cite: 9437, 9438]. The Metrics Server is a cluster-wide aggregator of resource usage data. It constantly polls the kubelet on every node (usually every 15 seconds) to ask: *"How much CPU and RAM are your pods actually consuming right now?"* [cite: 9438] + +Without the Metrics Server, the Horizontal Pod Autoscaler (HPA) is completely blind[cite: 9455]. HPA relies on real-time metrics to evaluate whether your application is under heavy load or sitting idle[cite: 9456]. If it doesn't have this data, it cannot make scaling decisions. + +**How HPA calculates desired replicas** +The HPA controller continually adjusts the number of replicas in a deployment to match the observed metrics against your desired target. It uses the following mathematical formula[cite: 9465]: + +`desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]` + +**Example Scenario:** +* You have **1** pod running. +* Your target CPU utilization is **50%**. +* Due to heavy load, your pod's CPU usage spikes to **150%**[cite: 9466, 9467]. + +The calculation will be: `1 * ( 150 / 50 ) = 3` [cite: 9468] +The HPA will automatically scale your deployment up to **3 pods** to balance the load[cite: 9468]. + +**The difference between autoscaling/v1 and v2** +* **`autoscaling/v1`**: This is the older API version. It only supports scaling based on **CPU utilization**[cite: 9430]. +* **`autoscaling/v2`**: This is the modern, advanced API version. It supports scaling based on **CPU, Memory, and custom external metrics**[cite: 9431]. Additionally, it allows you to define fine-grained scaling behaviors, such as controlling exactly how fast the HPA is allowed to scale up or scale down[cite: 9423]. From 4a9db2d5c76f451760dd961528361f818d2d1551 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 19 Jul 2026 11:58:52 +0530 Subject: [PATCH 70/76] Revise Day 59 Helm documentation Updated the Helm documentation to improve clarity and structure, including detailed explanations of core concepts and installation tasks. --- 2026/day-59/day-59.md | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 2026/day-59/day-59.md diff --git a/2026/day-59/day-59.md b/2026/day-59/day-59.md new file mode 100644 index 0000000000..df683805d4 --- /dev/null +++ b/2026/day-59/day-59.md @@ -0,0 +1,90 @@ +# Day 59 - Helm: The Kubernetes Package Manager + +## What is Helm? +When you build an application in Kubernetes, you usually have to write many different YAML files (like Deployments, Services, and ConfigMaps). Managing all of these separately can get very confusing. + +Helm solves this problem. It acts as a package manager for Kubernetes, similar to how `apt` works for Ubuntu or `brew` works for Mac. It groups all your YAML files together into one easy-to-manage package. + +### The Three Core Concepts +To use Helm, you just need to understand these three basic terms: +1. **Chart:** This is the package itself. It contains all the template files needed to run your application. +2. **Release:** This is a running instance of a chart. Every time you install a chart into your cluster, Helm creates a new release. +3. **Repository:** This is an online collection where people store and share charts (like an app store for Kubernetes). + +--- + +## Managing Your Applications with Helm + +### 1. Install +To install a chart and create a release, you simply use the install command. This replaces the need to run `kubectl apply` on dozens of files. +```bash +helm install my-app bitnami/nginx +``` + +### 2. Customize +You do not have to accept the default settings. You can change things like the number of pods by passing custom values using `--set`. +```bash +helm install my-app bitnami/nginx --set replicaCount=3 +``` + +### 3. Upgrade +If you need to make changes to an application that is already running, you can upgrade it without taking it offline. +```bash +helm upgrade my-app bitnami/nginx --set replicaCount=5 +``` + +### 4. Rollback +If an upgrade breaks your application, Helm keeps a history of your changes. You can easily go back to a previous, working version. +```bash +helm rollback my-app 1 +``` + +--- + +## The Structure of a Helm Chart +When you create your own chart using `helm create my-chart`, it builds a specific folder structure for you: + +* **`Chart.yaml`:** This file contains basic information about the chart, like its name and version. +* **`values.yaml`:** This is the default configuration file. It holds the standard settings for your app. +* **`templates/`:** This folder holds all your Kubernetes YAML files (Deployments, Services, etc.). + +### How Go Templating Works +Inside the `templates/` folder, the YAML files do not have hardcoded values. Instead, they use **Go Templating** to pull data from your `values.yaml` file. + +For example, instead of writing `replicas: 3` directly in your Deployment file, you write: +```yaml +replicas: {{ .Values.replicaCount }} +``` +When Helm installs the chart, it looks at `values.yaml`, finds the number for `replicaCount`, and automatically fills it in for you. + +--- + +## My custom-values.yaml +To customize an installation without writing long commands, you can pass a custom file. Here is my `custom-values.yaml` file: + +```yaml +# custom-values.yaml + +# This tells Helm to run 3 pods instead of the default 1 +replicaCount: 3 + +service: + # This changes the service type to NodePort so we can access it from outside the cluster + type: NodePort + port: 80 + +resources: + # This sets limits so the pods do not consume too much power + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi +``` + +**How to use it:** +Instead of using `--set`, you just tell Helm to read this file during installation: +```bash +helm install custom-nginx bitnami/nginx -f custom-values.yaml +``` From b9464adbe29e125aa6f89c982f4d852ec6a23b05 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 21 Jul 2026 22:25:48 +0530 Subject: [PATCH 71/76] Add files via upload --- 2026/day-60/image.png | Bin 0 -> 55117 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2026/day-60/image.png diff --git a/2026/day-60/image.png b/2026/day-60/image.png new file mode 100644 index 0000000000000000000000000000000000000000..37dcc7ade03c6b474342dbab4d429921c93e0c1c GIT binary patch literal 55117 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 literal 0 HcmV?d00001 From 92368566ec3c90709eb6af3c611963d3c7d08224 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Tue, 21 Jul 2026 22:33:26 +0530 Subject: [PATCH 72/76] Document Kubernetes deployment and test results Added detailed documentation on Kubernetes deployment architecture, self-healing tests, curriculum mapping, reflections, and toolchain story for the WordPress and MySQL application. --- 2026/day-60/last-day-kubernets.md | 83 +++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 2026/day-60/last-day-kubernets.md diff --git a/2026/day-60/last-day-kubernets.md b/2026/day-60/last-day-kubernets.md new file mode 100644 index 0000000000..bf9d816031 --- /dev/null +++ b/2026/day-60/last-day-kubernets.md @@ -0,0 +1,83 @@ +# Day 60 Capstone Project: Cloud-Native WordPress & MySQL on Kubernetes + +## Executive Summary +This document concludes the 60-day Kubernetes journey by detailing the architecture, testing, reflections, and tool ecosystem behind deploying a self-healing, auto-scaling, stateful web application (WordPress + MySQL) in Kubernetes. + +--- + +## 1. System Architecture + +The application is deployed in an isolated namespace (`capstone`) following a microservices pattern that decouples stateful storage from stateless web application layers. +### Resource Connection Breakdown +* **Namespace (`capstone`)**: Logical boundary isolating all project resources. +* **Database Layer (`StatefulSet`)**: Runs a single MySQL 8.0 pod (`mysql-statefulset-0`). It connects to a **1Gi Persistent Volume Claim** (`ReadWriteOnce`) mounted at `/var/lib/mysql` to guarantee data persistence across pod restarts. +* **Database Network Layer (`Service`)**: A headless `ClusterIP` service (`mysql-service`) exposes port `3306`, giving the database a predictable cluster-internal DNS domain (`mysql-service.capstone.svc.cluster.local`). +* **Secrets & Configuration**: + * **`mysql-secret`**: Stores sensitive credentials (`MYSQL_ROOT_PASSWORD`, `MYSQL_USER`, `MYSQL_PASSWORD`) mounted safely into both MySQL and WordPress. + * **`wordpress-config`**: Stores non-sensitive variables (`WORDPRESS_DB_HOST`, `WORDPRESS_DB_NAME`). +* **Application Layer (`Deployment`)**: Runs 2 identical WordPress replicas. Probes are configured on `/wp-login.php` for liveness and readiness. +* **Ingress Access (`Service`)**: A `NodePort` service routes external traffic on port `30080` to target port `80` across the WordPress pods. +* **Autoscaling (`HPA`)**: Evaluates CPU utilization across WordPress pods, dynamically scaling between **2 and 10 replicas** when average CPU usage exceeds **50%**. + +--- + +## 2. Self-Healing & Data Persistence Test Results + +| Test Scenario | Executed Command | Observed Behavior | Final Result | +| :--- | :--- | :--- | :--- | +| **1. WordPress Pod Deletion (Stateless Self-Healing)** | `kubectl delete pod -n capstone` | The WordPress Deployment detected a drop in desired replicas (2 -> 1). Within seconds, a new replacement pod was scheduled, initialized, and passed its readiness probe. Port forwarding / site access remained active via the second replica. | **PASSED** (Zero app downtime) | +| **2. MySQL Pod Deletion (Stateful Self-Healing)** | `kubectl delete pod mysql-statefulset-0 -n capstone` | The StatefulSet controller automatically recreated `mysql-statefulset-0`. The newly spawned pod re-attached to the existing PVC (`mysql-persistent-storage`). | **PASSED** (Identity preserved) | +| **3. Data Persistence Verification** | Refreshed site at `http://localhost:8080` after MySQL recovery | WordPress successfully reconnected to MySQL. The blog post created prior to pod deletion was completely intact. | **PASSED** (Data retained) | + +--- + +## 3. Curriculum Concept Mapping (Days 50–60) + +| Kubernetes Concept | Learned Day | Capstone Implementation | +| :--- | :--- | :--- | +| **Architecture & `kubectl`** | **Day 50** | Built the local cluster environment and used `kubectl` commands to inspect and manage cluster health. | +| **Manifests & Pods** | **Day 51** | Structured YAML definition files for individual Pod configurations and container specifications. | +| **Namespaces & Deployments** | **Day 52** | Created `capstone` namespace for workload isolation and used Deployments to maintain stateless WordPress replicas. | +| **Services (ClusterIP & NodePort)** | **Day 53** | Exposed MySQL internally (`ClusterIP`) and WordPress externally (`NodePort` service on port 30080). | +| **ConfigMaps & Secrets** | **Day 54** | Managed non-sensitive variables (`wordpress-config`) and sensitive credentials (`mysql-secret`) independently of container images. | +| **Persistent Volumes (PV/PVC)** | **Day 55** | Created Persistent Volume Claims to allow database files to survive container restarts. | +| **StatefulSets** | **Day 56** | Deployed MySQL as a StatefulSet (`mysql-statefulset-0`) ensuring stable network identity and dedicated storage binding. | +| **Requests, Limits & Probes** | **Day 57** | Configured CPU/Memory limits and added Liveness/Readiness probes targeting `/wp-login.php` on port 80. | +| **Metrics Server & HPA** | **Day 58** | Set up Horizontal Pod Autoscaler (`wordpress-hpa`) to automatically scale WordPress replicas from 2 to 10 based on a 50% CPU threshold. | +| **Helm Package Manager** | **Day 59** | Installed the Bitnami WordPress chart in an isolated `helm-wp` namespace to contrast manual YAML manifests against package management. | +| **End-to-End Capstone** | **Day 60** | Integrated all components into a production-grade, self-healing WordPress + MySQL deployment. | + +--- + +## 4. Retrospective & Reflections + +### What Was Hardest? +Debugging the initial database connection handshake. Specifically: +1. **`stringData` vs `data` encoding in Secrets**: Passing pre-base64-encoded strings under `stringData` caused double-encoding, leading to `Access Denied` errors. +2. **DNS Service Naming**: Connecting WordPress to `mysql-0` (the pod) versus `mysql-service` (the service abstraction). Routing via the Service proved far more robust during restarts. + +### What Clicked? +The fundamental distinction between **Stateless** and **Stateful** workloads. Seeing a MySQL pod die, get completely replaced by a new container, and seamlessly re-attach to its exact same 1Gi volume—without losing a single blog post—made the power of StatefulSets and PersistentVolumeClaims fully click. + +### What I Would Add for Production +If taking this deployment to a live production environment, I would add: +1. **Managed Database / High Availability**: Replace single-node MySQL with a replicated InnoDB Cluster or an external cloud DB (e.g., AWS RDS). +2. **Ingress Controller & TLS**: Deploy NGINX Ingress Controller with `cert-manager` for automatic HTTPS/SSL certificate provisioning instead of NodePort. +3. **Disaster Recovery**: Implement automated volume snapshots using **Velero**. +4. **Observability Stack**: Deploy Prometheus & Grafana to monitor container CPU/RAM metrics and query response times. + +--- + +## 5. The Complete Toolchain Story + +To bring this cloud-native application to life, a whole ecosystem of specialized tools worked in unison: + +It all began on the local developer machine with **Docker**, containerizing application code and bundling WordPress with **Apache** and **PHP**, alongside **MySQL** database engines. To run these containers in an enterprise-grade environment without provisioning actual cloud servers, **Minikube** (or **Kind**) was spun up to simulate a multi-node Kubernetes cluster locally. + +Every infrastructure requirement was translated into structured **YAML** manifest files. Using **`kubectl`**, the primary CLI command-line driver, these manifests were sent to the Kubernetes API server. Kubernetes configured **Secrets** to encrypt sensitive passwords and **ConfigMaps** to inject dynamic application parameters. + +When the **MySQL StatefulSet** was deployed, Kubernetes provisioned a **Persistent Volume Claim (PVC)**, locking MySQL’s data directory to non-volatile storage. To make the database discoverable, a **ClusterIP Service** established an internal DNS endpoint. + +Next, the **WordPress Deployment** spun up redundant application pods. Integrated **Liveness and Readiness Probes** continuously pinged Apache on `/wp-login.php` to guarantee traffic only routed to healthy containers. To handle sudden traffic spikes, the **Metrics Server** fed real-time CPU data into the **Horizontal Pod Autoscaler (HPA)**, empowering the cluster to scale WordPress pods automatically from 2 up to 10. External user access was delivered through a **NodePort Service**, mapping local browser requests straight into the container network. + +Finally, to understand enterprise application packaging, **Helm** was introduced. With a single command, Helm auto-generated complex multi-tier charts containing dozens of pre-configured resources, demonstrating how modern DevOps teams streamline deployment pipelines at scale. From c5e78258359d69869c67ec26c8455878842f99b6 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 24 Jul 2026 12:46:37 +0530 Subject: [PATCH 73/76] Add Terraform introduction and IaC conceptual notes Introduced conceptual notes on Infrastructure as Code (IaC) and its importance in DevOps. Included sections on problems solved by IaC, tool comparisons, and key concepts like 'Declarative' and 'Cloud-Agnostic'. --- 2026/day-61/day-61-terraform-intro.md | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 2026/day-61/day-61-terraform-intro.md diff --git a/2026/day-61/day-61-terraform-intro.md b/2026/day-61/day-61-terraform-intro.md new file mode 100644 index 0000000000..30c687ac1d --- /dev/null +++ b/2026/day-61/day-61-terraform-intro.md @@ -0,0 +1,45 @@ +# Infrastructure as Code (IaC) - Conceptual Notes + +## 1. What is IaC & Why It Matters in DevOps + +**Infrastructure as Code (IaC)** is the practice of defining, deploying, and managing IT infrastructure—such as servers, databases, networks, and storage—using machine-readable definition files (like HCL, YAML, or JSON) rather than clicking through a web console or running one-off terminal scripts. + +In DevOps, IaC is essential because it treats infrastructure with the same rigor as application software: +* Infrastructure changes are submitted via **pull requests** and peer-reviewed. +* Environments are automatically tested and validated in **CI/CD pipelines**. +* Every change is tracked in **version control** (Git) with a complete audit trail. + +--- + +## 2. Problems IaC Solves vs. Manual AWS Console Work + +* **Eliminates Human Error ("ClickOps"):** Manual console setups lead to subtle typos and missed security settings. Code enforces identical, repeatable deployments every time. +* **Prevents Environment Drift:** Guarantees that Dev, Staging, and Production environments share the exact same configuration baseline, eliminating "it worked in staging" failures. +* **Rapid Disaster Recovery:** If an entire cloud region fails, rebuilding manually takes days. With IaC, an entire multi-region architecture can be redeployed in minutes. +* **Living Documentation:** Your codebase serves as an accurate, single source of truth for what resources are actively deployed. + +--- + +## 3. Tool Comparison: Terraform vs. Others + +| Tool | Core Focus | Configuration Language | Multi-Cloud Capability | +| :--- | :--- | :--- | :--- | +| **Terraform** | Provisioning | HCL (HashiCorp Configuration Language) | **Cloud-Agnostic** (AWS, GCP, Azure, K8s) | +| **AWS CloudFormation** | Provisioning | JSON / YAML | **AWS Native** | +| **Ansible** | Configuration Management | YAML | Best for configuring software *inside* running servers | +| **Pulumi** | Provisioning | TypeScript, Python, Go, C# | **Cloud-Agnostic** | + +--- + +## 4. Key Concepts + +### What "Declarative" Means +In a **declarative** approach, you define the *desired end state*, not the step-by-step commands to get there. + +* **Imperative approach:** *"Create an EC2 instance, wait 30 seconds, attach an EBS volume, open port 80."* +* **Declarative approach (Terraform):** *"I need an EC2 instance with an attached EBS volume and port 80 open."* + +Terraform reads the current state, compares it against your code, and calculates only the necessary actions required to reach that end state. + +### What "Cloud-Agnostic" Means +Terraform is not tied to a specific cloud provider. Through its **provider-based architecture**, you use the same toolchain and core workflow whether you are provisioning resources on AWS, Google Cloud, Azure, or Kubernetes. From 7d7f4538916f92a82486fa0fa9e965e31d62689e Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Fri, 24 Jul 2026 14:04:34 +0530 Subject: [PATCH 74/76] Enhance Terraform introduction with detailed explanations Expanded the Terraform introduction with detailed explanations on initialization, state management, and core commands. --- 2026/day-61/day-61-terraform-intro.md | 137 ++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/2026/day-61/day-61-terraform-intro.md b/2026/day-61/day-61-terraform-intro.md index 30c687ac1d..45d175812c 100644 --- a/2026/day-61/day-61-terraform-intro.md +++ b/2026/day-61/day-61-terraform-intro.md @@ -43,3 +43,140 @@ Terraform reads the current state, compares it against your code, and calculates ### What "Cloud-Agnostic" Means Terraform is not tied to a specific cloud provider. Through its **provider-based architecture**, you use the same toolchain and core workflow whether you are provisioning resources on AWS, Google Cloud, Azure, or Kubernetes. + + +# What Happens During `terraform init`? + +Running `terraform init` sets up your working environment so Terraform can talk to your cloud provider and run your code. + +## 1. What got downloaded? + +* **Provider Plugins:** The actual binary code (translators) for the services you're using—like the AWS, GCP, or Azure plugin. These translate your HCL code into API calls to the cloud provider. +* **Modules:** Copies of any reusable code modules you referenced in your configuration (from GitHub or the Terraform Registry). +* **Backend Drivers:** The necessary code to talk to your state storage (like an AWS S3 bucket), if you configured one. + +--- + +## 2. What's inside the `.terraform/` directory? + +Think of the hidden `.terraform/` folder as a **local cache**. Inside, you'll find: + +* **`providers/`**: The plugin binaries Terraform downloaded to manage your resources. +* **`modules/`**: Downloaded module files and a `modules.json` manifest mapping them to your code. +* **Environment/State metadata:** Files tracking your active workspace and backend connection settings. + +> **Tip:** Never commit `.terraform/` to Git! It contains large, system-specific binary files. Always list it in your `.gitignore`. + +# How Terraform Knows What to Create (State & Plan) + +When you run `terraform apply`, Terraform doesn't guess what to build—it checks two sources of truth: your **state file** (`terraform.tfstate`) and the **real-world cloud infrastructure**. + +Here is how it figures out that the S3 bucket already exists and only the EC2 instance needs to be created: + +## 1. It checks the `terraform.tfstate` file +Terraform maintains a hidden tracking ledger called the **state file**. +* When you previously created the S3 bucket, Terraform recorded its unique ID, attributes, and resource mapping in `terraform.tfstate`. +* Before making changes, Terraform reads this file to see what resources it previously created and is currently managing. + +## 2. It refreshes real-world infrastructure +Terraform calls the AWS API to perform a **refresh**. It inspects the actual S3 bucket in your AWS account to verify it still exists and check its current settings against what is recorded in the state file. + +## 3. It calculates the "Delta" (The Execution Plan) +Terraform compares three things: +1. **Your Code** (*Desired state*: S3 Bucket + EC2 Instance) +2. **The State File** (*Known state*: S3 Bucket recorded) +3. **AWS Real World** (*Actual state*: S3 Bucket exists) + +Since the S3 bucket exists in all three places, Terraform marks it as **unchanged**. Since the EC2 instance is in your code but *missing* from the state file and AWS, Terraform concludes: +> *"The bucket is already good to go. I only need to issue an API call to create the EC2 instance."* + +--- + +> **Key Takeaway:** Terraform relies on its **state file** to track managed resources and compares it against your **code** to determine exactly what needs to be created, updated, or destroyed. + +# Understanding the Terraform State File (`terraform.tfstate`) + +The state file is the backbone of Terraform. It acts as a single source of truth mapping your code to real-world cloud resources. Here is a breakdown of what it stores and how to safely manage it. + +--- + +## 1. What Information Does the State File Store? + +For every resource defined in your code, the state file stores: + +* **Resource Metadata & Bindings:** Maps your local code names (e.g., `aws_instance.web`) to real cloud unique IDs (e.g., `i-0a1b2c3d4e5f6g7h8`). +* **Resource Attributes & Properties:** Complete configuration details returned by the cloud API after creation—including calculated attributes not written in your code (e.g., private/public IP addresses, MAC addresses, ARN strings, and creation timestamps). +* **Dependencies:** Tracks implicit and explicit relationships between resources so Terraform knows the correct order to create, update, or destroy them. +* **Sensitive Values:** Sensitive outputs or provider data (such as auto-generated passwords, private keys, database connection strings, and IAM tokens). + +--- + +## 2. Why Should You Never Manually Edit the State File? + +* **Risk of State Corruption:** The state file is formatted in precise JSON. A single typo, misplaced bracket, or invalid attribute name will break Terraform's ability to read the file, rendering your workspace unusable. +* **Loss of Resource Tracking (Orphaned Resources):** If you manually delete or alter a resource's metadata, Terraform will lose track of it. This can lead to duplicate resources being created or, worse, Terraform accidentally destroying the wrong live infrastructure. +* **Race Conditions & Desync:** Manually tweaking values bypasses Terraform's built-in dependency checks and lock mechanisms, causing the actual cloud state and state file to fall out of sync. + +> **Safe Alternative:** Always use built-in CLI commands to modify state safely: +> * `terraform state list` — View tracked resources. +> * `terraform state mv` — Rename or move resources in state. +> * `terraform state rm` — Remove a resource from state management without deleting it in the cloud. +> * `terraform import` — Bring existing real-world resources into state. + +--- + +## 3. Why Should the State File NOT Be Committed to Git? + +* **Exposes Unencrypted Secrets:** The state file stores **all resource attributes in plain text**. This includes database passwords, API tokens, TLS private keys, and SSH keys. Committing it to a Git repository exposes those credentials to anyone with read access. +* **Merge Conflicts & State Corruption:** If multiple team members make changes simultaneously, Git will attempt to merge conflicting JSON lines. Merging state files manually almost always results in corrupted JSON or overwritten infrastructure tracking. +* **Concurrence & Race Conditions:** Git is designed for code collaboration, not real-time state locking. It cannot prevent two developers from applying changes at the exact same moment. + +> **Best Practice:** Always use a **Remote Backend** (such as AWS S3 with DynamoDB locking, Terraform Cloud, or Azure Blob Storage) with encryption at rest enabled and state locking turned on. Add `*.tfstate` and `*.tfstate.backup` to your `.gitignore` file. + +# Reading the `terraform plan` Output + +When you run `terraform plan`, Terraform gives you a preview of the changes it is about to make. It uses a simple symbol system to show you exactly what will happen. + +## 1. What do the symbols mean? + +* **`+` (Green): Create** — Terraform is going to build a brand new resource. +* **`-` (Red): Destroy** — Terraform is going to delete this resource. +* **`~` (Yellow): Update in-place** — Terraform will modify an existing resource without tearing it down. + +## 2. How to spot In-Place vs. Destroy-and-Recreate + +You can tell exactly how a modification will be handled by looking closely at the plan output: + +* **In-Place Update (`~`):** + If you only see the yellow `~`, the resource stays online. Terraform is just tweaking a setting (like adding a tag or changing a description) without interrupting the resource. + +* **Destroy and Recreate (`-/+`):** + If you see a red minus and a green plus together (`-/+`), Terraform is forced to replace the resource. It will delete the existing one and build a fresh one. This happens when you change a foundational setting that the cloud provider won't let you change on the fly (like changing the region of an S3 bucket or the base AMI of an EC2 instance). + +# day-61-terraform-intro.md + +## 1. What is Infrastructure as Code (IaC)? +Infrastructure as Code (IaC) is the practice of building and managing IT resources—like servers, networks, and databases—using configuration files instead of clicking through a web interface. By writing our infrastructure as code, we can track changes in Git, peer-review deployments, and automate environment setups just like we do with application software. This eliminates human error from manual configurations and ensures our staging and production environments are identical, repeatable, and fast to recover. + +--- + +## 2. Core Terraform Commands + +Here is a quick reference for the daily Terraform workflow: + +* **`terraform init`**: Prepares your working directory. It downloads the necessary provider plugins (like the AWS translator) and sets up your local cache so Terraform can execute your code. +* **`terraform plan`**: The "dry run." It compares your code to the real world and shows you a blueprint of what it will do (Create `+`, Update `~`, or Destroy `-`) without actually changing anything yet. +* **`terraform apply`**: Executes the plan. This command actually makes the API calls to your cloud provider to build, update, or tear down your real-world infrastructure. +* **`terraform destroy`**: The cleanup command. It reads your state file and safely deletes every single resource managed by this specific project. +* **`terraform show`**: Prints out a human-readable summary of exactly what is currently deployed based on your state file, or inspects a saved plan. +* **`terraform state list`**: Outputs a simple, quick list of all the resource names that Terraform is currently tracking in your state file. + +--- + +## 3. The State File (`terraform.tfstate`) + +### What it contains: +The state file is a JSON ledger that acts as Terraform's memory. It maps the resources written in your code to the actual unique IDs of the resources running in AWS. It stores all the metadata, relationships, and generated attributes (like public IP addresses or auto-generated passwords) that the cloud provider returns after a resource is created. + +### Why it matters: +Terraform relies entirely on the state file to figure out what to do next. When you run a plan, Terraform compares your code against this file and the real world to calculate the "delta"—identifying exactly what needs to be added, changed, or removed. Without the state file, Terraform would lose track of your infrastructure and blindly try to recreate everything from scratch every time you run it. From a85d05529ec33e72439131241d74d013a0930bc1 Mon Sep 17 00:00:00 2001 From: Sachin Chaturvedi Date: Sun, 26 Jul 2026 00:07:08 +0530 Subject: [PATCH 75/76] Enhance day-62.md with Terraform insights Added explanations for `depends_on` usage and lifecycle rules in Terraform. --- 2026/day-62/day-62.md | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 2026/day-62/day-62.md diff --git a/2026/day-62/day-62.md b/2026/day-62/day-62.md new file mode 100644 index 0000000000..012ec27205 --- /dev/null +++ b/2026/day-62/day-62.md @@ -0,0 +1,97 @@ +# Day 62: Providers, Resources, and Dependencies 🚀 + +Until today, I've mostly been creating standalone resources. But in the real world, cloud infrastructure is deeply connected. A server lives inside a subnet, which lives inside a VPC, which relies on a route table and an internet gateway to talk to the outside world. + +Today, I built a complete, fully connected AWS networking stack from scratch and learned how Terraform is smart enough to figure out the exact order to build things. Here's a breakdown of my tasks and what I learned. + +--- + +## Task 1: Exploring the AWS Provider + +I started by creating a new directory `terraform-aws-infra` and setting up my `providers.tf` file. I pinned the AWS provider to version `~> 5.0`. + +**What I learned about versioning:** +* **`~> 5.0` (Pessimistic Constraint):** This is the sweet spot. It tells Terraform to accept any minor or patch updates (like 5.1, 5.2), but *never* upgrade to 6.0. This keeps things updated but prevents breaking changes. +* **`>= 5.0`:** This would allow *any* version above 5.0, including major releases like 6.0 or 7.0. It's a bit risky for production. +* **`= 5.0.0`:** This pins it strictly to one exact version. Safe, but you miss out on bug fixes. + +**What is that `.terraform.lock.hcl` file?** +When I ran `terraform init`, Terraform downloaded the provider and created a lock file. Think of this as a "receipt." It locks in the exact version and hash of the provider I downloaded so that if my teammate clones this repo tomorrow, they get the exact same version. It prevents the "it works on my machine" problem! + +--- + +## Task 2 & 4: Building the VPC, Security Group, and EC2 Instance + +I wrote out my `main.tf` file to build a custom networking environment. Instead of using default AWS resources, I built: +1. A **VPC** (`10.0.0.0/16`) +2. A **Public Subnet** (`10.0.1.0/24`) +3. An **Internet Gateway** so my network can reach the web. +4. A **Route Table** and **Association** to route `0.0.0.0/0` (internet traffic) to the Gateway. +5. A **Security Group** allowing Port 22 (SSH) and Port 80 (HTTP) from `0.0.0.0/0`. +6. An **EC2 Instance** (Amazon Linux 2) sitting right inside that subnet. + +After fixing a quick typo in my Security Group (making sure my `cidr_ipv4` allowed outside traffic instead of just VPC traffic), I ran `terraform apply`. My instance spun up, got a public IP, and was completely reachable! + +--- + +## Task 3: Understanding Implicit Dependencies + +When I looked at my code, I didn't explicitly tell Terraform to build the VPC first. So how did it know? + +**How Terraform figures out the order:** +Terraform automatically builds a Dependency Graph. Because my Subnet code contained `vpc_id = aws_vpc.vpc.id`, Terraform realized, *"Hey, I can't build the subnet until I know the VPC's ID. I better build the VPC first."* This is called an **Implicit Dependency**. + +**What if I tried to force the subnet first?** +If Terraform tried to create the subnet before the VPC existed, the AWS API would immediately reject the request because the `vpc_id` would be invalid or null, and Terraform would crash with an error. + +**Implicit Dependencies in my config:** +* **Subnet** depends on the **VPC**. +* **Internet Gateway** depends on the **VPC**. +* **Route Table** depends on the **VPC** and **Internet Gateway**. +* **Route Table Association** depends on the **Subnet** and the **Route Table**. +* **Security Group** depends on the **VPC**. +* **EC2 Instance** depends on the **Subnet** and the **Security Group**. + +--- + +## Task 5: Explicit Dependencies (`depends_on`) + +Sometimes Terraform's brain needs a little help. I added an S3 bucket for application logs. S3 buckets are global and don't require a VPC ID, so Terraform would normally just create it immediately. + +However, I wanted to ensure the EC2 server was fully created *before* the S3 bucket. Since there was no implicit link between them, I used an explicit dependency: + +```hcl +resource "aws_s3_bucket" "app_logs" { + bucket = "terraweek-app-logs-unique-id-123" + depends_on = [aws_instance.web_server] +} + +``` +### When would you use `depends_on` in the real world? + +* **Application-to-Database:** You have an EC2 instance that runs a startup script expecting a database to be fully available. Even if the EC2 doesn't reference the DB ID in Terraform, you use `depends_on` so the server waits for the DB to finish provisioning. +* **IAM Role Propagation:** Sometimes IAM roles take a few seconds to propagate through AWS. You might make a resource depend on a specific IAM attachment finishing before trying to assume that role. + +*(Side note: I ran `terraform graph | dot -Tpng > graph.png` to visualize this, and the resulting dependency tree was awesome to look at!)* + +--- + +## Task 6: Lifecycle Rules and Destroying + +Finally, I played around with lifecycle blocks. I added this to my EC2 instance: + +```hcl +lifecycle { + create_before_destroy = true +} +``` +When I changed the AMI ID and ran terraform plan, Terraform didn't just kill my server. Instead, it planned to build the new server first, and only destroy the old one once the new one was ready. This is amazing for zero-downtime updates! + +### The 3 main lifecycle arguments: +create_before_destroy: Perfect for web servers or load balancers where you want the new version up and running before terminating the old one to avoid dropping traffic. + +prevent_destroy: The ultimate safety net. Use this on critical databases or state files so no one can accidentally delete them with a careless terraform destroy. + +ignore_changes: Great if a resource is managed partly by Terraform and partly by something else (like an auto-scaling group that changes its own desired capacity). Terraform will ignore those specific changes instead of trying to revert them. + +To wrap up the day, I ran terraform destroy. I watched Terraform tear everything down in exact reverse-dependency order. A perfectly clean slate. From 61274103caf79e6aa4da4f3bbd893d9267cb7c01 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 29 Jul 2026 09:22:58 +0000 Subject: [PATCH 76/76] added documentation --- 2026/day-63/code-part/.terraform.lock.hcl | 45 ++++++++ 2026/day-63/code-part/main.tf | 126 ++++++++++++++++++++++ 2026/day-63/code-part/outputs.tf | 19 ++++ 2026/day-63/code-part/prod.tfvars | 5 + 2026/day-63/code-part/providers.tf | 12 +++ 2026/day-63/code-part/terraform.tfvars | 3 + 2026/day-63/code-part/variables.tf | 40 +++++++ 2026/day-63/day-63-documentatio.md | 120 +++++++++++++++++++++ 8 files changed, 370 insertions(+) create mode 100644 2026/day-63/code-part/.terraform.lock.hcl create mode 100644 2026/day-63/code-part/main.tf create mode 100644 2026/day-63/code-part/outputs.tf create mode 100644 2026/day-63/code-part/prod.tfvars create mode 100644 2026/day-63/code-part/providers.tf create mode 100644 2026/day-63/code-part/terraform.tfvars create mode 100644 2026/day-63/code-part/variables.tf create mode 100644 2026/day-63/day-63-documentatio.md diff --git a/2026/day-63/code-part/.terraform.lock.hcl b/2026/day-63/code-part/.terraform.lock.hcl new file mode 100644 index 0000000000..eb7c420273 --- /dev/null +++ b/2026/day-63/code-part/.terraform.lock.hcl @@ -0,0 +1,45 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "5.100.0" + constraints = "~> 5.0" + hashes = [ + "h1:edXOJWE4ORX8Fm+dpVpICzMZJat4AX0VRCAy/xkcOc0=", + "zh:054b8dd49f0549c9a7cc27d159e45327b7b65cf404da5e5a20da154b90b8a644", + "zh:0b97bf8d5e03d15d83cc40b0530a1f84b459354939ba6f135a0086c20ebbe6b2", + "zh:1589a2266af699cbd5d80737a0fe02e54ec9cf2ca54e7e00ac51c7359056f274", + "zh:6330766f1d85f01ae6ea90d1b214b8b74cc8c1badc4696b165b36ddd4cc15f7b", + "zh:7c8c2e30d8e55291b86fcb64bdf6c25489d538688545eb48fd74ad622e5d3862", + "zh:99b1003bd9bd32ee323544da897148f46a527f622dc3971af63ea3e251596342", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9f8b909d3ec50ade83c8062290378b1ec553edef6a447c56dadc01a99f4eaa93", + "zh:aaef921ff9aabaf8b1869a86d692ebd24fbd4e12c21205034bb679b9caf883a2", + "zh:ac882313207aba00dd5a76dbd572a0ddc818bb9cbf5c9d61b28fe30efaec951e", + "zh:bb64e8aff37becab373a1a0cc1080990785304141af42ed6aa3dd4913b000421", + "zh:dfe495f6621df5540d9c92ad40b8067376350b005c637ea6efac5dc15028add4", + "zh:f0ddf0eaf052766cfe09dea8200a946519f653c384ab4336e2a4a64fdd6310e9", + "zh:f1b7e684f4c7ae1eed272b6de7d2049bb87a0275cb04dbb7cda6636f600699c9", + "zh:ff461571e3f233699bf690db319dfe46aec75e58726636a0d97dd9ac6e32fb70", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.9.0" + hashes = [ + "h1:UlBuNVuCGJ39tTv2c5gz2NRZnQbXfbIWbTzWcth5o74=", + "zh:161ad0bd9a75768c82f53fb6e7172a9d8be2d4889b012645a34795031aaf1bf1", + "zh:19dc9a5b17729725ccfc4f45b0500af0ee5bc6b6b160c7adb8f2bf617d2c80ea", + "zh:269eda8fe42daa7974d5a34d166c3ba9defe80cde86c01e4dadcfdf2e1f05e5f", + "zh:373f7c65566f8f2cc7f45d698654feb9d988996957e1266a69ca00c52d6d16d0", + "zh:5599d16804c41c83009ec621b6d6b6f74e102f5827678a4750f8809055546b61", + "zh:583be0440469a22bff70dcfa56593b01566860b29607437264adb51060cf46fc", + "zh:5f211d8ec3f2e1f414870d9584bfe26e6995560ef81c748f8447a48164767398", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7b547fd16216761ef86efc3ed516ac5ac0c5c42b7c7eb24a08cef2d93f69ed5e", + "zh:7e7c0679daf2a382151d05068c8c3f0dae6b7b7dccf818827b73dd08638df2ef", + "zh:8089dec888a8038b9b4fb23b3df7e1057293dbc5b60b42cc47ff690d69d4b61b", + "zh:c51f15a031edfd6f23ce8ced3446ca7f8d8d647e2499890d7d5d10d5016d7257", + "zh:c94784f005708890dc6895afd53636ec00ec1e430b15d41e5aebfb1d4b39bd04", + ] +} diff --git a/2026/day-63/code-part/main.tf b/2026/day-63/code-part/main.tf new file mode 100644 index 0000000000..a68606acbb --- /dev/null +++ b/2026/day-63/code-part/main.tf @@ -0,0 +1,126 @@ +locals { + name_prefix = "${var.project_name}-${var.environment}" + common_tags = { + Project = var.project_name + Environment = var.environment + ManagedBy = "Terraform" + } +} + + +# --- Task 2: VPC from Scratch --- +resource "aws_vpc" "main" { + cidr_block = var.vpc_cidr + + tags = { + Name = "${local.name_prefix}-vpc" + } +} + +resource "aws_subnet" "public" { + vpc_id = aws_vpc.main.id + cidr_block = var.subnet_cidr + map_public_ip_on_launch = true + + tags = { + Name = "${local.name_prefix}-subnet" + } +} + +resource "aws_internet_gateway" "igw" { + vpc_id = aws_vpc.main.id + + tags = { + Name = "TerraWeek-IGW" + } +} + +resource "aws_route_table" "public" { + vpc_id = aws_vpc.main.id + + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.igw.id + } + +tags = merge(local.common_tags, { + Name = "${local.name_prefix}-Rout-Table" +}) +} + +resource "aws_route_table_association" "public" { + subnet_id = aws_subnet.public.id + route_table_id = aws_route_table.public.id +} + +# --- Task 4: Security Group & EC2 Instance --- +resource "aws_security_group" "web_sg" { + name = "TerraWeek-SG" + description = "Allow SSH and HTTP inbound traffic" + vpc_id = aws_vpc.main.id + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + tags = { + Name = "TerraWeek-SG" + } +} + +# Fetching latest Amazon Linux 2 AMI +data "aws_ami" "amazon_linux" { + most_recent = true + owners = ["amazon"] + + filter { + name = "name" + values = ["amzn2-ami-hvm-*-x86_64-gp2"] + } +} + +resource "aws_instance" "main" { + ami = data.aws_ami.amazon_linux.id + instance_type = var.environment == "prod" ? "t3.small" : "t2.micro" + subnet_id = aws_subnet.public.id + vpc_security_group_ids = [aws_security_group.web_sg.id] + associate_public_ip_address = true + + tags = { + Name = "${local.name_prefix}-server" + } + + # Task 6: Lifecycle Rule + lifecycle { + create_before_destroy = true + } +} + +# --- Task 5: Explicit Dependencies --- +resource "aws_s3_bucket" "app_logs" { + bucket = "terraweek-logs-bucket-${random_id.bucket_id.hex}" # S3 bucket names must be globally unique + + # Explicitly tell Terraform to create the EC2 instance BEFORE the S3 bucket + depends_on = [aws_instance.main] +} + +resource "random_id" "bucket_id" { + byte_length = 4 +} \ No newline at end of file diff --git a/2026/day-63/code-part/outputs.tf b/2026/day-63/code-part/outputs.tf new file mode 100644 index 0000000000..1bc3ec775f --- /dev/null +++ b/2026/day-63/code-part/outputs.tf @@ -0,0 +1,19 @@ +output "vpc_id" { + value = aws_vpc.main.id +} +output "subnet_id" { + value = aws_subnet.public.id +} +output "instance_id" { + value = aws_instance.main.id +} +output "public_ip" { + value = aws_instance.main.public_ip +} +output "instance_public_dns" { + value = aws_instance.main.public_dns +} +output "security_group_id" { + value = aws_security_group.web_sg.id + +} diff --git a/2026/day-63/code-part/prod.tfvars b/2026/day-63/code-part/prod.tfvars new file mode 100644 index 0000000000..c4dd51f1f5 --- /dev/null +++ b/2026/day-63/code-part/prod.tfvars @@ -0,0 +1,5 @@ +project_name = "terraweek" +environment = "prod" +instance_type = "t3.small" +vpc_cidr = "10.1.0.0/16" +subnet_cidr = "10.1.1.0/24" \ No newline at end of file diff --git a/2026/day-63/code-part/providers.tf b/2026/day-63/code-part/providers.tf new file mode 100644 index 0000000000..4ea23dacce --- /dev/null +++ b/2026/day-63/code-part/providers.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + } +} + +provider "aws" { + region = var.region # preferred region +} \ No newline at end of file diff --git a/2026/day-63/code-part/terraform.tfvars b/2026/day-63/code-part/terraform.tfvars new file mode 100644 index 0000000000..bb906491d0 --- /dev/null +++ b/2026/day-63/code-part/terraform.tfvars @@ -0,0 +1,3 @@ +project_name = "terraweek" +environment = "dev" +instance_type = "t3.micro" \ No newline at end of file diff --git a/2026/day-63/code-part/variables.tf b/2026/day-63/code-part/variables.tf new file mode 100644 index 0000000000..8464a189da --- /dev/null +++ b/2026/day-63/code-part/variables.tf @@ -0,0 +1,40 @@ +variable "region" { + type = string + description = "The region of the ec2" + default = "us-west-1" +} +variable "vpc_cidr" { + type = string + description = "This tell tottal number of ip in the vpc" + default = "10.0.0.0/16" +} +variable "subnet_cidr" { + type = string + description = "This tell tottal number of ip in the subnets" + default = "10.0.1.0/24" +} + +variable "instance_type" { + type = string + description = "This tell which instance u are using" + default = "t3.micro" +} + +variable "project_name" { + type = string + description = "Enter the name of the project" +} +variable "environment" { + type = string + default = "dev" +} +variable "allowed_ports" { + type = list(number) + default = [ 20, 80, 443 ] +} +variable "extra_tags" { + type = map(string) + + default = {} + +} diff --git a/2026/day-63/day-63-documentatio.md b/2026/day-63/day-63-documentatio.md new file mode 100644 index 0000000000..225bfe4440 --- /dev/null +++ b/2026/day-63/day-63-documentatio.md @@ -0,0 +1,120 @@ +# Day 63: Variables, Outputs, Data Sources, and Expressions + +Making Terraform dynamic is what changes it from a one-time script into a reusable tool. Here is the documentation of what I learned and built today. + +--- + +## 1. My Variables Configuration (`variables.tf`) + +Here is how I extracted all the hardcoded values from my previous code into dynamic input variables. It includes different types of variables like strings, lists, and maps. + +```hcl +variable "region" { + type = string + default = "us-east-1" +} + +variable "vpc_cidr" { + type = string + default = "10.0.0.0/16" +} + +variable "subnet_cidr" { + type = string + default = "10.0.1.0/24" +} + +variable "instance_type" { + type = string + default = "t2.micro" +} + +variable "project_name" { + type = string + description = "The name of the project. This has no default, so Terraform will ask for it." +} + +variable "environment" { + type = string + default = "dev" +} + +variable "allowed_ports" { + type = list(number) + default = [22, 80, 443] +} + +variable "extra_tags" { + type = map(string) + default = {} +} +``` +## 2. Environment Variable Files (.tfvars) + +By keeping .tfvars files, I can use the exact same infrastructure code for different environments just by swapping the file. + +### Default (terraform.tfvars): + +``` +project_name = "terraweek" +environment = "dev" +instance_type = "t2.micro" + +``` +### Production (prod.tfvars): + +``` +project_name = "terraweek" +environment = "prod" +instance_type = "t3.small" +vpc_cidr = "10.1.0.0/16" +subnet_cidr = "10.1.1.0/24" + +``` +## 3. The Five Main Variable Types in Terraform + +Terraform variables act like containers for our data. Here are the five basic types: + +* **String:** Just regular text (e.g., `"t2.micro"` or `"dev"`). +* **Number:** A solid number without quotes (e.g., `80` or `443`). +* **Bool:** A simple `true` or `false` statement (e.g., `true`). +* **List:** An ordered collection of items of the same type (e.g., `[22, 80, 443]`). +* **Map:** A collection of key-value pairs, great for tagging (e.g., `{ Environment = "dev", Team = "DevOps" }`). + +--- + +## 4. Variable Precedence (Who wins?) + +If I set the exact same variable in five different places, Terraform has a strict "chain of command" to decide which value to actually use. + +Here is the priority order, from **lowest priority to highest priority**: + +1. **Environment Variables:** Things set in my terminal like `export TF_VAR_environment="staging"`. +2. **`terraform.tfvars`:** The default file Terraform automatically looks for. +3. **`*.auto.tfvars` files:** Any file ending in this extension gets loaded automatically and overrides the basic `terraform.tfvars`. +4. **`-var-file` flag:** Telling Terraform exactly which file to use in the command line (e.g., `terraform apply -var-file="prod.tfvars"`). +5. **`-var` flag:** Passing a specific value right in the command line (e.g., `terraform apply -var="instance_type=t2.nano"`). This overrides absolutely everything else. + +--- + +## 5. Terminology: Variables, Locals, Outputs, Data Sources, and Resources + +It's easy to get these confused, so here is the simple difference: + +* **Variable:** An input. It's how I pass information into my Terraform code from the outside (like asking a user for a project name). +* **Local:** An internal shortcut. If I have a complex calculation or a long name (like `"terraweek-dev-vpc"`), I define it once as a local and reuse it inside the code so I don't have to type it out every time. +* **Output:** A result. It's the information Terraform prints out on my screen after it finishes building things (like giving me the new EC2 Public IP so I can log in). +* **Resource:** A creator. This tells Terraform to actually go out and build or manage something in AWS (like creating a brand new VPC). +* **Data Source:** A reader. This just queries AWS to fetch existing information (like looking up the ID of the latest Amazon Linux 2 AMI) without creating or changing anything. + +--- + +## 6. Five Really Useful Terraform Functions + +Functions let us manipulate data easily. Here are five great ones: + +* **`upper()`:** Converts a string to all uppercase letters. Great for making sure naming conventions are consistent. +* **`join()`:** Glues a list of strings together using a separator (like a hyphen). Example: `join("-", ["my", "app"])` becomes `"my-app"`. +* **`length()`:** Counts how many items are in a list or map. This is incredibly useful if I want to create exactly as many subnets as there are items in my CIDR block list. +* **`merge()`:** Combines two or more maps together. I use this to take my standard `common_tags` and merge them with specific tags for an individual resource. +* **`cidrsubnet()`:** Does network math for me! Instead of hardcoding subnet IPs, it calculates the correct subnet CIDR blocks dynamically based on the main VPC network. \ No newline at end of file