<?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>SwiftDeploy: Building a Self-Configuring DevOps Engine with Observability, Policy Enforcement &amp; Auditing</title>
      <dc:creator>George-Adaba</dc:creator>
      <pubDate>Wed, 06 May 2026 20:18:26 +0000</pubDate>
      <link>https://dev.to/georgeadaba/swiftdeploy-building-a-self-configuring-devops-engine-with-observability-policy-enforcement--1p7n</link>
      <guid>https://dev.to/georgeadaba/swiftdeploy-building-a-self-configuring-devops-engine-with-observability-policy-enforcement--1p7n</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is not just a project—it’s a mini DevOps platform.&lt;br&gt;
In this guide, you will build SwiftDeploy, a system that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates its own infrastructure from a single file&lt;/li&gt;
&lt;li&gt;Monitors itself using real-time metrics&lt;/li&gt;
&lt;li&gt;Enforces deployment safety using policy-as-code&lt;/li&gt;
&lt;li&gt;Logs and audits every decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you will be able to replicate the entire system locally from scratch.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;1. The Design: A Tool That Writes Its Own Infrastructure&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Core Idea&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everything is driven by manifest.yaml&lt;br&gt;
This is your single source of truth.&lt;/p&gt;

&lt;p&gt;Instead of manually writing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;br&gt;
&lt;code&gt;nginx.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your CLI (&lt;code&gt;SwiftDeploy&lt;/code&gt;) generates them.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;Python or Go&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. Project Structure&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;swiftdeploy/&lt;br&gt;
├── manifest.yaml&lt;br&gt;
├── swiftdeploy&lt;br&gt;
├── app/&lt;br&gt;
├── templates/&lt;br&gt;
├── policies/&lt;br&gt;
├── history.jsonl&lt;br&gt;
├── README.md&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;4. Example manifest.yaml&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;swift-deploy-1-node:latest&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;

&lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;

&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;swiftdeploy-net&lt;/span&gt;
  &lt;span class="na"&gt;driver_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This file controls everything.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;5. Setup &amp;amp; Run (Step-by-Step)&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;git clone &lt;code&gt;https://github.com/YOUR_USERNAME/swiftdeploy.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;cd &lt;code&gt;swiftdeploy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swiftdeploy init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swiftdeploy validate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swiftdeploy deploy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expected Output (Deploy)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manifest valid&lt;/li&gt;
&lt;li&gt;Docker image found&lt;/li&gt;
&lt;li&gt;Nginx config valid&lt;/li&gt;
&lt;li&gt;Services starting...&lt;/li&gt;
&lt;li&gt;Health check passed&lt;/li&gt;
&lt;li&gt;Deployment successful&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;6. Observability: Metrics (/metrics)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Your API exposes metrics in Prometheus format.&lt;br&gt;
Access Metrics&lt;br&gt;
&lt;code&gt;http://localhost:8080/metrics&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example Metrics Output&lt;br&gt;
&lt;code&gt;http_requests_total{method="GET",path="/",status="200"} 120&lt;/code&gt;&lt;br&gt;
&lt;code&gt;http_requests_total{method="GET",path="/",status="500"} 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http_request_duration_seconds_bucket{le="0.5"} 100&lt;/code&gt;&lt;br&gt;
&lt;code&gt;http_request_duration_seconds_bucket{le="1"} 110&lt;/code&gt;&lt;br&gt;
&lt;code&gt;http_request_duration_seconds_bucket{le="+Inf"} 125&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app_uptime_seconds 360&lt;/code&gt;&lt;br&gt;
&lt;code&gt;app_mode 1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;chaos_active 2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Metrics Interpretation&lt;br&gt;
Total requests = 125&lt;br&gt;
Errors = 5&lt;br&gt;
Error rate = 5 / 125 = 4%&lt;/p&gt;

&lt;p&gt;This feeds directly into policy decisions.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;7. Policy Enforcement (OPA)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SwiftDeploy uses Open Policy Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy Flow&lt;/strong&gt;&lt;br&gt;
CLI → Collect Data → Send to OPA → Receive Decision → Act&lt;/p&gt;

&lt;p&gt;Example Input to OPA (Pre-Promote)&lt;br&gt;
{&lt;br&gt;
  "error_rate": 0.04,&lt;br&gt;
  "p99_latency": 600,&lt;br&gt;
  "mode": "canary"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Example OPA Response&lt;br&gt;
{&lt;br&gt;
  "allow": false,&lt;br&gt;
  "reason": "Error rate exceeds 1% threshold"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policies Implemented&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure Policy&lt;br&gt;
Block deploy if:&lt;br&gt;
Disk &amp;lt; 10GB&lt;br&gt;
CPU &amp;gt; 2.0&lt;/p&gt;

&lt;p&gt;Canary Safety Policy&lt;br&gt;
Block promote if:&lt;br&gt;
Error rate &amp;gt; 1%&lt;br&gt;
P99 latency &amp;gt; 500ms&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;8. Chaos Testing (Failure Simulation)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Trigger Chaos&lt;/p&gt;

&lt;p&gt;Slow Mode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/chaos&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"slow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Error Mode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/chaos&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reproduce Failure Scenario&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy system&lt;/li&gt;
&lt;li&gt;Trigger chaos&lt;/li&gt;
&lt;li&gt;Run swiftdeploy status&lt;/li&gt;
&lt;li&gt;Run swiftdeploy promote&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Expected Result&lt;/strong&gt;&lt;br&gt;
DENIED: P99 latency exceeds 500ms&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;9. Live Dashboard (swiftdeploy status)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;swiftdeploy status&lt;/p&gt;

&lt;p&gt;Example Output&lt;br&gt;
Mode: canary&lt;br&gt;
Requests/sec: 15&lt;br&gt;
P99 latency: 620ms&lt;br&gt;
Error rate: 3%&lt;/p&gt;

&lt;p&gt;Policy Status:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure: PASS&lt;/li&gt;
&lt;li&gt;Canary Safety: FAIL (latency too high)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;10. Logging (history.jsonl)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Each snapshot is stored as:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "timestamp": "2026-05-06T12:00:00Z",&lt;br&gt;
  "mode": "canary",&lt;br&gt;
  "req_per_sec": 15,&lt;br&gt;
  "p99_latency": 620,&lt;br&gt;
  "error_rate": 0.03,&lt;br&gt;
  "policy": "FAIL"&lt;br&gt;
}&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;11. Audit Report&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Generate:&lt;br&gt;
swiftdeploy audit&lt;/p&gt;

&lt;p&gt;Example Output (audit_report.md)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Timeline&lt;/span&gt;
12:00 - Mode switched to canary
12:02 - Chaos injected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Violations&lt;/span&gt;
12:03 - Error rate exceeded threshold
12:04 - Promotion denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;12. Failure Testing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Test Disk Failure&lt;br&gt;
Fill disk → run deploy&lt;br&gt;
DENIED: Disk space below 10GB&lt;/p&gt;

&lt;p&gt;Test Error Rate Failure&lt;br&gt;
Inject chaos → run promote&lt;br&gt;
DENIED: Error rate exceeds threshold&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;13. Security Requirement&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;OPA:&lt;br&gt;
Must NOT be exposed via NGINX&lt;br&gt;
Only accessible internally&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;14. Lessons Learned&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Metrics Design is Critical&lt;/strong&gt;&lt;br&gt;
Bad metrics = wrong decisions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Policy Separation Improves Safety&lt;/strong&gt;&lt;br&gt;
OPA removes logic from the CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Observability Enables Automation&lt;/strong&gt;&lt;br&gt;
No metrics → no intelligence&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Failure Handling Matters&lt;/strong&gt;&lt;br&gt;
The system must never crash&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Build Incrementally&lt;/strong&gt;&lt;br&gt;
Each layer depends on the previous&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;System Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;manifest.yaml&lt;/strong&gt;&lt;br&gt;
     ↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;swiftdeploy CLI&lt;/strong&gt;&lt;br&gt;
     ↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generated configs (Docker + Nginx)&lt;/strong&gt;&lt;br&gt;
     ↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers (App + Nginx + OPA)&lt;/strong&gt;&lt;br&gt;
     ↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt;  →  &lt;strong&gt;CLI&lt;/strong&gt;  →  &lt;strong&gt;OPA&lt;/strong&gt;  → &lt;strong&gt;Decision&lt;/strong&gt;&lt;br&gt;
     ↓&lt;br&gt;
&lt;strong&gt;history.jsonl&lt;/strong&gt; → &lt;strong&gt;audit_report.md&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SwiftDeploy is now a system that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writes its own infrastructure&lt;/li&gt;
&lt;li&gt;Observes its own behaviour.&lt;/li&gt;
&lt;li&gt;Enforces its own safety&lt;/li&gt;
&lt;li&gt;Records its own history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your system can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See itself&lt;/li&gt;
&lt;li&gt;Evaluate itself&lt;/li&gt;
&lt;li&gt;Protect itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you’re not just deploying apps…&lt;br&gt;
You’re building intelligent, resilient systems.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>tutorial</category>
    </item>
    <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;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&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;ul&gt;
&lt;li&gt;Monitors live traffic from Nginx logs&lt;/li&gt;
&lt;li&gt;Detects suspicious spikes using statistics&lt;/li&gt;
&lt;li&gt;Automatically blocks attacking IPs&lt;/li&gt;
&lt;li&gt;Sends alerts to Slack&lt;/li&gt;
&lt;li&gt;Displays everything on a live dashboard&lt;/li&gt;
&lt;/ul&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;h2&gt;
  
  
  &lt;strong&gt;What Problem Am I Solving?&lt;/strong&gt;
&lt;/h2&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;ul&gt;
&lt;li&gt;Slow down your app&lt;/li&gt;
&lt;li&gt;Crash your server&lt;/li&gt;
&lt;li&gt;Make your service unavailable&lt;/li&gt;
&lt;/ul&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;br&gt;
&lt;strong&gt;Nginx&lt;/strong&gt; → Handles incoming traffic&lt;br&gt;
&lt;strong&gt;Nextcloud&lt;/strong&gt; → Sample app (target)&lt;br&gt;
&lt;strong&gt;Python daemon&lt;/strong&gt; → Detects attacks&lt;br&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; → Runs everything&lt;br&gt;
&lt;strong&gt;Slack Webhook&lt;/strong&gt; → Sends alerts&lt;br&gt;
&lt;strong&gt;Dashboard UI&lt;/strong&gt; → Shows live metrics&lt;/p&gt;

&lt;p&gt;Step 1: Monitoring Nginx Logs&lt;br&gt;
Nginx logs every request like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;127.0.0.1 - - [timestamp] "GET /index.html" 200&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
My system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads logs in real-time&lt;/li&gt;
&lt;li&gt;Extracts:

&lt;ul&gt;
&lt;li&gt;IP address&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Status code
Here's the link to how I implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/monitor.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 2: Sliding Window (Core Idea)&lt;br&gt;
To detect attacks, I track requests over time using a sliding window.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;br&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;ul&gt;
&lt;li&gt;Add new requests&lt;/li&gt;
&lt;li&gt;Remove old ones automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 3: Building a Baseline&lt;br&gt;
Instead of guessing what’s “too much traffic”, I calculate a baseline:&lt;br&gt;
Track requests per second over 30 minutes&lt;/p&gt;

&lt;p&gt;Compute:&lt;br&gt;
Mean (average traffic)&lt;br&gt;
Standard deviation&lt;/p&gt;

&lt;p&gt;This helps answer:&lt;br&gt;
“What does normal traffic look like?”&lt;br&gt;
Here is how i implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/baseline.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Detecting Anomalies&lt;br&gt;
I detect attacks using two methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Z-score&lt;br&gt;
If traffic is far above normal:&lt;br&gt;
&lt;code&gt;z-score &amp;gt; 3&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spike detection&lt;br&gt;
If traffic are:&lt;br&gt;
&lt;code&gt;&amp;gt; 5x the average&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If either condition is true, it’s an attack&lt;br&gt;
Here is how i implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/detector.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Blocking Attackers&lt;br&gt;
When an IP is suspicious:&lt;br&gt;
I block it using iptables&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;iptables -A INPUT -s &amp;lt;IP&amp;gt; -j DROP&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Auto-Unban System&lt;br&gt;
Not every spike is an attack forever.&lt;br&gt;
So I implemented a backoff unban system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 minutes&lt;/li&gt;
&lt;li&gt;30 minutes&lt;/li&gt;
&lt;li&gt;2 hours&lt;/li&gt;
&lt;li&gt;Permanent (if repeated)
Here is how I implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/unbanner.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 7: Slack Alerts&lt;br&gt;
I used Slack webhooks to send alerts like the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global traffic spike&lt;/li&gt;
&lt;li&gt;IP blocked&lt;/li&gt;
&lt;li&gt;IP unbanned
Here is how I implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/notifier.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 8: Live Dashboard&lt;br&gt;
I built a simple dashboard that shows the following:&lt;/p&gt;

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

&lt;p&gt;It refreshes every 3 seconds.&lt;br&gt;
Here is how I implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/detector/dashboard.py" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 9: Dockerizing Everything&lt;br&gt;
I used Docker Compose to run the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Nextcloud&lt;/li&gt;
&lt;li&gt;Detector service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made setup easy and reproducible.&lt;br&gt;
Here is how i implemented that &lt;a href="https://github.com/George-Adaba/anomaly-detection-ddos/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Challenges I Faced&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Secrets in GitHub
GitHub blocked my push because of a Slack webhook.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Container Not Starting
My app kept crashing because of config. YAML was missing.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;No Slack Alerts
The container couldn’t access environment variables.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fix: Passed variables via docker-compose. yml&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What I Learned&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How real-time log monitoring works&lt;/li&gt;
&lt;li&gt;How to detect anomalies using statistics&lt;/li&gt;
&lt;li&gt;How to automate security responses&lt;/li&gt;
&lt;li&gt;How to use Docker in real projects&lt;/li&gt;
&lt;li&gt;Why never commit secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This project helped me move from the following:&lt;br&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>
