<?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: George-Adaba</title>
    <description>The latest articles on DEV Community by George-Adaba (@georgeadaba).</description>
    <link>https://dev.to/georgeadaba</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%2F3905043%2F16bb088c-5c93-4b6c-8437-825d7e3c8016.png</url>
      <title>DEV Community: George-Adaba</title>
      <link>https://dev.to/georgeadaba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/georgeadaba"/>
    <language>en</language>
    <item>
      <title>How I Built a Real-Time DDoS Detection System with Python, Docker, and Nginx (Beginner-Friendly Guide)</title>
      <dc:creator>George-Adaba</dc:creator>
      <pubDate>Wed, 29 Apr 2026 21:14:23 +0000</pubDate>
      <link>https://dev.to/georgeadaba/how-i-built-a-real-time-ddos-detection-system-with-python-docker-and-nginx-beginner-friendly-5b56</link>
      <guid>https://dev.to/georgeadaba/how-i-built-a-real-time-ddos-detection-system-with-python-docker-and-nginx-beginner-friendly-5b56</guid>
      <description>&lt;p&gt;👋 Introduction&lt;/p&gt;

&lt;p&gt;As a beginner stepping into DevOps and cybersecurity, I wanted to build something practical and impactful — not just theory.&lt;/p&gt;

&lt;p&gt;So I built a real-time DDoS detection and mitigation system that:&lt;/p&gt;

&lt;p&gt;Monitors live traffic from Nginx logs&lt;br&gt;
Detects suspicious spikes using statistics&lt;br&gt;
Automatically blocks attacking IPs&lt;br&gt;
Sends alerts to Slack&lt;br&gt;
Displays everything on a live dashboard&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through exactly how it works — in a simple, beginner-friendly way.&lt;/p&gt;

&lt;p&gt;🧠 What Problem Am I Solving?&lt;/p&gt;

&lt;p&gt;A DDoS (Distributed Denial of Service) attack happens when a server gets flooded with too many requests.&lt;/p&gt;

&lt;p&gt;This can:&lt;/p&gt;

&lt;p&gt;Slow down your app&lt;br&gt;
Crash your server&lt;br&gt;
Make your service unavailable&lt;/p&gt;

&lt;p&gt;👉 My solution:&lt;br&gt;
Build a system that can detect abnormal traffic and stop it automatically&lt;/p&gt;

&lt;p&gt;🏗️ Project Architecture&lt;/p&gt;

&lt;p&gt;Here’s what I used:&lt;/p&gt;

&lt;p&gt;Nginx → Handles incoming traffic&lt;br&gt;
Nextcloud → Sample app (target)&lt;br&gt;
Python daemon → Detects attacks&lt;br&gt;
Docker Compose → Runs everything&lt;br&gt;
Slack Webhook → Sends alerts&lt;br&gt;
Dashboard UI → Shows live metrics&lt;br&gt;
🔍 Step 1: Monitoring Nginx Logs&lt;/p&gt;

&lt;p&gt;Nginx logs every request like this:&lt;/p&gt;

&lt;p&gt;127.0.0.1 - - [timestamp] "GET /index.html" 200&lt;/p&gt;

&lt;p&gt;My system:&lt;/p&gt;

&lt;p&gt;Reads logs in real-time&lt;br&gt;
Extracts:&lt;br&gt;
IP address&lt;br&gt;
Timestamp&lt;br&gt;
Status code&lt;br&gt;
⏱️ Step 2: Sliding Window (Core Idea)&lt;/p&gt;

&lt;p&gt;To detect attacks, I track requests over time using a sliding window.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;p&gt;“How many requests happened in the last 60 seconds?”&lt;/p&gt;

&lt;p&gt;I used Python’s deque to:&lt;/p&gt;

&lt;p&gt;Add new requests&lt;br&gt;
Remove old ones automatically&lt;br&gt;
📊 Step 3: Building a Baseline&lt;/p&gt;

&lt;p&gt;Instead of guessing what’s “too much traffic”, I calculate a baseline:&lt;/p&gt;

&lt;p&gt;Track requests per second over 30 minutes&lt;br&gt;
Compute:&lt;br&gt;
Mean (average traffic)&lt;br&gt;
Standard deviation&lt;/p&gt;

&lt;p&gt;This helps answer:&lt;/p&gt;

&lt;p&gt;“What does normal traffic look like?”&lt;/p&gt;

&lt;p&gt;🚨 Step 4: Detecting Anomalies&lt;/p&gt;

&lt;p&gt;I detect attacks using two methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Z-score&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If traffic is far above normal:&lt;/p&gt;

&lt;p&gt;z-score &amp;gt; 3&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spike detection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If traffic is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;5x the average&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 If either condition is true → it’s an attack&lt;/p&gt;

&lt;p&gt;🔥 Step 5: Blocking Attackers&lt;/p&gt;

&lt;p&gt;When an IP is suspicious:&lt;/p&gt;

&lt;p&gt;I block it using iptables&lt;br&gt;
Example:&lt;br&gt;
iptables -A INPUT -s  -j DROP&lt;br&gt;
🔄 Step 6: Auto-Unban System&lt;/p&gt;

&lt;p&gt;Not every spike is an attack forever.&lt;/p&gt;

&lt;p&gt;So I implemented a backoff unban system:&lt;/p&gt;

&lt;p&gt;10 minutes&lt;br&gt;
30 minutes&lt;br&gt;
2 hours&lt;br&gt;
Permanent (if repeated)&lt;br&gt;
🔔 Step 7: Slack Alerts&lt;/p&gt;

&lt;p&gt;I used Slack webhooks to send alerts like:&lt;/p&gt;

&lt;p&gt;🚨 Global traffic spike&lt;br&gt;
🚨 IP blocked&lt;br&gt;
✅ IP unbanned&lt;br&gt;
📊 Step 8: Live Dashboard&lt;/p&gt;

&lt;p&gt;I built a simple dashboard that shows:&lt;/p&gt;

&lt;p&gt;Global requests per second&lt;br&gt;
Top 10 IPs&lt;br&gt;
Banned IPs&lt;br&gt;
CPU &amp;amp; memory usage&lt;br&gt;
Baseline stats&lt;/p&gt;

&lt;p&gt;It refreshes every 3 seconds.&lt;/p&gt;

&lt;p&gt;🐳 Step 9: Dockerizing Everything&lt;/p&gt;

&lt;p&gt;I used Docker Compose to run:&lt;/p&gt;

&lt;p&gt;Nginx&lt;br&gt;
Nextcloud&lt;br&gt;
Detector service&lt;/p&gt;

&lt;p&gt;This made setup easy and reproducible.&lt;/p&gt;

&lt;p&gt;⚠️ Challenges I Faced&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secrets in GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub blocked my push because of a Slack webhook.&lt;/p&gt;

&lt;p&gt;👉 Fix:&lt;/p&gt;

&lt;p&gt;Moved webhook to environment variables&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Container Not Starting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My app kept crashing because config.yaml was missing.&lt;/p&gt;

&lt;p&gt;👉 Fix:&lt;/p&gt;

&lt;p&gt;Added it to Docker image&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No Slack Alerts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The container couldn’t access environment variables.&lt;/p&gt;

&lt;p&gt;👉 Fix:&lt;/p&gt;

&lt;p&gt;Passed variables via docker-compose.yml&lt;br&gt;
🎯 What I Learned&lt;br&gt;
How real-time log monitoring works&lt;br&gt;
How to detect anomalies using statistics&lt;br&gt;
How to automate security responses&lt;br&gt;
How to use Docker in real projects&lt;br&gt;
Why never to commit secrets&lt;br&gt;
🚀 Final Thoughts&lt;/p&gt;

&lt;p&gt;This project helped me move from:&lt;/p&gt;

&lt;p&gt;“Just learning DevOps” → “Building real-world systems”&lt;/p&gt;

&lt;p&gt;If you’re a beginner, I highly recommend building something like this.&lt;/p&gt;

&lt;p&gt;Dashboard URL  &lt;a href="http://52.203.164.199:5000/" rel="noopener noreferrer"&gt;http://52.203.164.199:5000/&lt;/a&gt;&lt;br&gt;
Github Repo  &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos.git" rel="noopener noreferrer"&gt;https://github.com/George-Adaba/anomaly-detection-ddos.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
