<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Merdi Lukongo</title>
    <description>The latest articles on DEV Community by Merdi Lukongo (@merdi_lukongo_0d8287489b7).</description>
    <link>https://dev.to/merdi_lukongo_0d8287489b7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3164760%2F61735ebd-6952-4b6b-9988-577f73d3100c.jpg</url>
      <title>DEV Community: Merdi Lukongo</title>
      <link>https://dev.to/merdi_lukongo_0d8287489b7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/merdi_lukongo_0d8287489b7"/>
    <language>en</language>
    <item>
      <title>Monitor Your Server and Receive an Email Report Every Minute Using Python and Cron (Amazon Linux)</title>
      <dc:creator>Merdi Lukongo</dc:creator>
      <pubDate>Fri, 16 May 2025 12:01:01 +0000</pubDate>
      <link>https://dev.to/merdi_lukongo_0d8287489b7/monitor-your-server-and-receive-an-email-report-every-minute-using-python-and-cron-amazon-linux-k2j</link>
      <guid>https://dev.to/merdi_lukongo_0d8287489b7/monitor-your-server-and-receive-an-email-report-every-minute-using-python-and-cron-amazon-linux-k2j</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
Monitoring your server's health in real time is essential to prevent issues before they escalate. In this article, we’ll create a Python script that:&lt;/p&gt;

&lt;p&gt;collects system data: memory, CPU, and disk usage,&lt;br&gt;
sends a performance report by email every minute to a system administrator,&lt;br&gt;
runs automatically on an Amazon EC2 instance using cron.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
Before we start, make sure you have:&lt;br&gt;
An Amazon EC2 instance running Amazon Linux 2&lt;br&gt;
Python 3 installed (python3 --version)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Gmail account with two-factor authentication enabled&lt;/li&gt;
&lt;li&gt;An app password generated (explained below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Python Monitoring Script&lt;/strong&gt;&lt;br&gt;
Create a file called monitoring.py:&lt;/p&gt;

&lt;h1&gt;
  
  
  !/usr/bin/env python3
&lt;/h1&gt;

&lt;p&gt;import psutil&lt;br&gt;
import shutil&lt;br&gt;
import smtplib&lt;br&gt;
import os&lt;br&gt;
from email.message import EmailMessage&lt;/p&gt;

&lt;h1&gt;
  
  
  Collect system stats
&lt;/h1&gt;

&lt;p&gt;cpu_percent = psutil.cpu_percent(interval=1)&lt;br&gt;
memory = psutil.virtual_memory()&lt;br&gt;
disk = shutil.disk_usage("/")&lt;/p&gt;

&lt;h1&gt;
  
  
  Format the message
&lt;/h1&gt;

&lt;p&gt;message = f"""&lt;br&gt;
[Server Monitoring Report]&lt;/p&gt;

&lt;p&gt;CPU Usage: {cpu_percent}%&lt;br&gt;
Memory Usage: {memory.percent}%&lt;br&gt;
Available Storage: {disk.free // (2*&lt;em&gt;30)} GB / {disk.total // (2&lt;/em&gt;*30)} GB&lt;br&gt;
"""&lt;/p&gt;

&lt;h1&gt;
  
  
  Email setup
&lt;/h1&gt;

&lt;p&gt;email = EmailMessage()&lt;br&gt;
email.set_content(message)&lt;br&gt;
email["Subject"] = "Server Performance Report"&lt;br&gt;
email["From"] = os.getenv("EMAIL_SENDER")&lt;br&gt;
email["To"] = "&lt;a href="mailto:testemail@gmail.com"&gt;testemail@gmail.com&lt;/a&gt;"&lt;/p&gt;

&lt;h1&gt;
  
  
  Send the email
&lt;/h1&gt;

&lt;p&gt;with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:&lt;br&gt;
    smtp.login(os.getenv("EMAIL_SENDER"), os.getenv("EMAIL_PASSWORD"))&lt;br&gt;
    smtp.send_message(email)&lt;br&gt;
🔒 Secure Your Credentials with Environment Variables&lt;br&gt;
Never hard-code your credentials into your scripts. Instead, add them to your ~/.bashrc or ~/.bash_profile:&lt;/p&gt;

&lt;p&gt;export EMAIL_SENDER="&lt;a href="mailto:your.email@gmail.com"&gt;your.email@gmail.com&lt;/a&gt;"&lt;br&gt;
export EMAIL_PASSWORD="your_app_password" &lt;/p&gt;

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

&lt;p&gt;Then reload the file:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate with Cron&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Cron (if not already installed):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;sudo yum install cronie -y&lt;br&gt;
sudo systemctl start crond&lt;br&gt;
sudo systemctl enable crond&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Cron Job&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Edit your crontab:&lt;br&gt;
crontab -e&lt;/p&gt;

&lt;p&gt;Add the following line to run the script every minute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;* * * * /usr/bin/python3 /home/ec2-user/monitoring.py
Adjust the path as necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;br&gt;
Every minute, you’ll receive an email like this:&lt;/p&gt;

&lt;p&gt;[Server Monitoring Report]&lt;br&gt;
CPU Usage: 12.3%&lt;br&gt;
Memory Usage: 55.7%&lt;br&gt;
Available Storage: 19 GB / 40 GB&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With this simple project, you’ve learned how to:&lt;/p&gt;

&lt;p&gt;monitor a server using Python, send emails programmatically using SMTP, automate tasks with cron on Amazon Linux. This script can easily be extended to alert you when thresholds are exceeded, monitor multiple servers, or log performance stats to a database.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>aws</category>
      <category>linux</category>
      <category>automation</category>
    </item>
    <item>
      <title>Enable Versioning on an S3 Bucket and Never Lose a File Again</title>
      <dc:creator>Merdi Lukongo</dc:creator>
      <pubDate>Thu, 15 May 2025 04:42:57 +0000</pubDate>
      <link>https://dev.to/merdi_lukongo_0d8287489b7/enable-versioning-on-an-s3-bucket-and-never-lose-a-file-again-53ek</link>
      <guid>https://dev.to/merdi_lukongo_0d8287489b7/enable-versioning-on-an-s3-bucket-and-never-lose-a-file-again-53ek</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have you ever accidentally overwritten or deleted a file in AWS S3? Don't worry - there's a simple feature to save you: S3 Versioning.&lt;br&gt;
In this quick tutorial, I'll show you how to enable versioning on a bucket, test it by uploading multiple versions of the same file, and view or restore previous versions - all for free.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AWS account (Free Tier)&lt;br&gt;
A test file (e.g., test.txt)&lt;/p&gt;

&lt;p&gt;Step-by-Step&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create an S3 Bucket&lt;/strong&gt;
Go to the Amazon S3 console&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Click "Create bucket&lt;/p&gt;

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

&lt;p&gt;Click "Create bucket"&lt;/p&gt;

&lt;p&gt;Choose a unique name (e.g., my-versioning-demo-bucket)&lt;/p&gt;

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

&lt;p&gt;Leave all other settings as default&lt;br&gt;
Click "Create bucket&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enable Versioning&lt;/strong&gt;
Open your newly created bucket&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Go to the Properties tab&lt;/p&gt;

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

&lt;p&gt;Scroll down to Bucket Versioning&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Upload a File&lt;/strong&gt;&lt;br&gt;
Go to the Objects tab&lt;br&gt;
Click Upload&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What You Get&lt;/strong&gt;&lt;br&gt;
You've now enabled automatic version tracking for your S3 bucket.&lt;br&gt;
Each time you upload a file with the same name, S3 silently keeps the old version - no backup scripts needed.&lt;br&gt;
Why Use S3 Versioning?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔁 Restore files deleted or overwritten by mistake&lt;br&gt;
🕓 Roll back to a known good version&lt;br&gt;
🧪 Test changes without fear of data loss&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
S3 Versioning is a hidden gem that acts like a built-in time machine for your files. Whether you're building apps or hosting a static website, it's a simple and powerful way to stay safe.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>awschallenge</category>
    </item>
  </channel>
</rss>
