FINAL PUSH
This commit is contained in:
commit
8a2caa16f4
BIN
noc-docker/Documentation.pdf
Normal file
BIN
noc-docker/Documentation.pdf
Normal file
Binary file not shown.
575
noc-docker/README.md
Normal file
575
noc-docker/README.md
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
# Network Monitoring System - Docker Multi-Container Application
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This project implements a lightweight **Network Monitoring System** using a multi-container Docker architecture. The application continuously monitors network connectivity and latency to predefined targets (public DNS servers) and displays real-time monitoring data through an interactive web dashboard.
|
||||||
|
|
||||||
|
The system demonstrates core Docker concepts including:
|
||||||
|
- Multi-container orchestration with Docker Compose
|
||||||
|
- Custom Docker image creation from Dockerfiles
|
||||||
|
- Container networking and inter-service communication
|
||||||
|
- Persistent data storage using Docker named volumes
|
||||||
|
- Service isolation and containerization
|
||||||
|
- Port mapping and exposure control
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Requirements for Deployment and Launching
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
The following software and tools must be installed and configured on your Linux system:
|
||||||
|
|
||||||
|
1. **Linux Operating System**
|
||||||
|
- Ubuntu 20.04 LTS or later (or equivalent Linux distribution)
|
||||||
|
- Kernel version 5.x or higher
|
||||||
|
|
||||||
|
2. **Docker Engine**
|
||||||
|
- Version 20.10 or higher
|
||||||
|
- Installation: https://docs.docker.com/engine/install/
|
||||||
|
- Verify installation: `docker --version`
|
||||||
|
|
||||||
|
3. **Docker Compose**
|
||||||
|
- Version 1.29.0 or higher (standalone or included with Docker Desktop)
|
||||||
|
- Verify installation: `docker-compose --version`
|
||||||
|
|
||||||
|
4. **Bash Shell**
|
||||||
|
- GNU Bash 4.0 or higher
|
||||||
|
- Already available on most Linux systems
|
||||||
|
|
||||||
|
5. **User Permissions**
|
||||||
|
- Docker daemon must be accessible (either as root or with sudo privileges)
|
||||||
|
- Recommended: Add user to docker group for non-root access
|
||||||
|
- Command: `sudo usermod -aG docker $USER`
|
||||||
|
|
||||||
|
6. **Network Access**
|
||||||
|
- Internet connectivity required for ping operations to external DNS servers
|
||||||
|
- No firewall restrictions blocking ICMP ping requests
|
||||||
|
|
||||||
|
7. **Available Resources**
|
||||||
|
- Minimum: 512 MB RAM, 500 MB disk space
|
||||||
|
- Recommended: 1 GB RAM, 1 GB disk space
|
||||||
|
- CPU: Single core minimum, multi-core recommended
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Application Description
|
||||||
|
|
||||||
|
### Purpose
|
||||||
|
|
||||||
|
The Network Monitoring System is a simplified Network Operations Center (NOC) that provides real-time visibility into network connectivity and performance metrics. It continuously probes network targets and visualizes the results through a web dashboard.
|
||||||
|
|
||||||
|
### Functionality
|
||||||
|
|
||||||
|
**Core Features:**
|
||||||
|
|
||||||
|
1. **Network Probing**
|
||||||
|
- Continuous ICMP ping requests to multiple targets
|
||||||
|
- Monitoring targets include:
|
||||||
|
- Google DNS: `8.8.8.8`
|
||||||
|
- Cloudflare DNS: `1.1.1.1`
|
||||||
|
- Quad9 DNS: `9.9.9.9`
|
||||||
|
- Measures network latency (response time in milliseconds)
|
||||||
|
- Detects host reachability and availability
|
||||||
|
|
||||||
|
2. **Data Processing & Storage**
|
||||||
|
- Backend API receives probe data
|
||||||
|
- Processes and validates monitoring metrics
|
||||||
|
- Stores data persistently in SQLite database
|
||||||
|
- Maintains historical records across container restarts
|
||||||
|
|
||||||
|
3. **Web Dashboard**
|
||||||
|
- Real-time visualization of network status
|
||||||
|
- Shows last known state of each monitored target
|
||||||
|
- Displays latency metrics and availability status
|
||||||
|
- Accessible via web browser at `http://localhost:5000`
|
||||||
|
|
||||||
|
### System Behavior
|
||||||
|
|
||||||
|
- Probe service runs network checks every 10 seconds
|
||||||
|
- Backend API listens for probe updates and processes them
|
||||||
|
- Frontend dashboard updates to reflect latest monitoring data
|
||||||
|
- Data persists even if containers are stopped and restarted
|
||||||
|
- All services communicate over isolated Docker network
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Virtual Networks and Named Volumes
|
||||||
|
|
||||||
|
### Docker Network Architecture
|
||||||
|
|
||||||
|
**Network Name:** `monitoring-network`
|
||||||
|
|
||||||
|
**Type:** Custom Bridge Network (user-defined)
|
||||||
|
|
||||||
|
**Purpose:** Isolates application containers from the host and enables service-to-service communication
|
||||||
|
|
||||||
|
**Connected Services:**
|
||||||
|
- `probe` service: Generates monitoring data
|
||||||
|
- `backend` service: Processes and stores data
|
||||||
|
- `frontend` service: Displays data via web interface
|
||||||
|
|
||||||
|
**Communication Features:**
|
||||||
|
- Automatic DNS resolution: Services reference each other by name
|
||||||
|
- Isolated from default Docker bridge network
|
||||||
|
- Host machine accesses frontend via port mapping: `5000:5000`
|
||||||
|
|
||||||
|
**Network Topology:**
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────┐
|
||||||
|
│ monitoring-network (Bridge) │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ probe │ │ backend │ │
|
||||||
|
│ │ container │──│ container │ │
|
||||||
|
│ │ │ │ │ │
|
||||||
|
│ └─────────────┘ └─────────────┘ │
|
||||||
|
│ ▲ │
|
||||||
|
│ │ │
|
||||||
|
│ ┌─────────────┐ │ │
|
||||||
|
│ │ frontend │─────────┘ │
|
||||||
|
│ │ container │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ └─────────────┘ │
|
||||||
|
│ │ (port 5000) │
|
||||||
|
│ └─────────────────────────── │
|
||||||
|
└─────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
│ (exposed to host)
|
||||||
|
▼
|
||||||
|
localhost:5000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Persistent Volumes
|
||||||
|
|
||||||
|
**Volume Name:** `monitoring-data`
|
||||||
|
|
||||||
|
**Type:** Named Volume (Docker-managed)
|
||||||
|
|
||||||
|
**Mount Path:** `/data` inside backend container
|
||||||
|
|
||||||
|
**Purpose:** Persists SQLite database file (`monitoring.db`) across container lifecycle events
|
||||||
|
|
||||||
|
**Storage Location:** Docker volume storage area (typically `/var/lib/docker/volumes/`)
|
||||||
|
|
||||||
|
**Data Preservation:**
|
||||||
|
- Survives container stop/start cycles
|
||||||
|
- Survives container removal (volume independent of container)
|
||||||
|
- Accessible by backend service for read/write operations
|
||||||
|
- Database remains intact when application is paused
|
||||||
|
|
||||||
|
**Volume Details:**
|
||||||
|
- Driver: local
|
||||||
|
- Capacity: Limited by host filesystem
|
||||||
|
- Backup: Can be backed up using `docker volume inspect` and `docker run` commands
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Container Configuration
|
||||||
|
|
||||||
|
### Container Specifications
|
||||||
|
|
||||||
|
#### 1. Probe Container
|
||||||
|
- **Image:** Custom image built from `Dockerfile.probe`
|
||||||
|
- **Container Name:** `network-probe`
|
||||||
|
- **Port Mapping:** Internal only (not exposed to host)
|
||||||
|
- **Network:** monitoring-network
|
||||||
|
- **Restart Policy:** `unless-stopped`
|
||||||
|
- **Environment Variables:**
|
||||||
|
- `BACKEND_URL`: Set to `http://backend:5001` for internal communication
|
||||||
|
- `PROBE_INTERVAL`: Interval between probes (10 seconds)
|
||||||
|
- **Volumes:** None
|
||||||
|
- **Resources:** No specific limits defined (uses host defaults)
|
||||||
|
- **Dependencies:** Requires `backend` service to be running
|
||||||
|
|
||||||
|
#### 2. Backend Container
|
||||||
|
- **Image:** Custom image built from `Dockerfile.backend`
|
||||||
|
- **Container Name:** `network-backend`
|
||||||
|
- **Port Mapping:** `5001:5001` (internal network only)
|
||||||
|
- **Network:** monitoring-network
|
||||||
|
- **Restart Policy:** `unless-stopped`
|
||||||
|
- **Environment Variables:**
|
||||||
|
- `FLASK_ENV`: Set to `development`
|
||||||
|
- `DATABASE_PATH`: `/data/monitoring.db`
|
||||||
|
- **Volumes:**
|
||||||
|
- Named volume `monitoring-data` mounted at `/data`
|
||||||
|
- **Resources:** No specific limits defined
|
||||||
|
- **Startup:** Flask API server on port 5001
|
||||||
|
- **Dependencies:** None (but required by probe and frontend)
|
||||||
|
|
||||||
|
#### 3. Frontend Container
|
||||||
|
- **Image:** Custom image built from `Dockerfile.frontend`
|
||||||
|
- **Container Name:** `network-frontend`
|
||||||
|
- **Port Mapping:** `5000:5000` (exposed to host)
|
||||||
|
- **Network:** monitoring-network
|
||||||
|
- **Restart Policy:** `unless-stopped`
|
||||||
|
- **Environment Variables:**
|
||||||
|
- `BACKEND_API_URL`: Set to `http://backend:5001` for internal communication
|
||||||
|
- **Volumes:** None
|
||||||
|
- **Resources:** No specific limits defined
|
||||||
|
- **Startup:** Static file server on port 5000
|
||||||
|
- **Dependencies:** Requires `backend` service for API calls
|
||||||
|
|
||||||
|
### Dockerfile Details
|
||||||
|
|
||||||
|
**Probe Dockerfile** (`Dockerfile.probe`):
|
||||||
|
- Base Image: `python:3.9-slim`
|
||||||
|
- Python application using `requests` library
|
||||||
|
- Sends ICMP ping requests via network calls
|
||||||
|
- Periodically posts monitoring data to backend API
|
||||||
|
- Lightweight image (~500 MB)
|
||||||
|
|
||||||
|
**Backend Dockerfile** (`Dockerfile.backend`):
|
||||||
|
- Base Image: `python:3.9-slim`
|
||||||
|
- Flask web framework for API endpoints
|
||||||
|
- SQLite database integration
|
||||||
|
- RESTful API for receiving probe data and serving historical data
|
||||||
|
- Lightweight image (~500 MB)
|
||||||
|
|
||||||
|
**Frontend Dockerfile** (`Dockerfile.frontend`):
|
||||||
|
- Base Image: `nginx:alpine`
|
||||||
|
- Nginx web server for static file serving
|
||||||
|
- HTML/CSS/JavaScript dashboard interface
|
||||||
|
- Communicates with backend via JavaScript fetch API
|
||||||
|
- Minimal image size (~40 MB)
|
||||||
|
|
||||||
|
### Configuration Methods
|
||||||
|
|
||||||
|
**1. Docker Compose (Primary Method)**
|
||||||
|
- All configurations defined in `docker-compose.yaml`
|
||||||
|
- Environment variables specified in service definitions
|
||||||
|
- Volume mounts declared in service sections
|
||||||
|
- Network configuration defined at compose level
|
||||||
|
|
||||||
|
**2. Environment Variables**
|
||||||
|
- Used for dynamic configuration without rebuilding images
|
||||||
|
- Set in `docker-compose.yaml` under `environment` section
|
||||||
|
- Read by application startup scripts
|
||||||
|
|
||||||
|
**3. Startup Arguments**
|
||||||
|
- Python services accept command-line arguments
|
||||||
|
- Flask runs with host `0.0.0.0` and specified port
|
||||||
|
- Nginx configured via configuration file in container
|
||||||
|
|
||||||
|
**4. Configuration Files**
|
||||||
|
- Nginx config embedded in `Dockerfile.frontend`
|
||||||
|
- Flask app configuration in Python source code
|
||||||
|
- Database initialization handled by Flask ORM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## List of Containers Used
|
||||||
|
|
||||||
|
### Container Summary Table
|
||||||
|
|
||||||
|
| Container Name | Image Type | Base Image | Port | Purpose | Service |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| `network-probe` | Custom | python:3.9-slim | Internal | Network monitoring probe sending ICMP pings | probe |
|
||||||
|
| `network-backend` | Custom | python:3.9-slim | 5001 | Flask API receiving probe data and managing database | backend |
|
||||||
|
| `network-frontend` | Custom | nginx:alpine | 5000 | Web server serving dashboard UI and assets | frontend |
|
||||||
|
|
||||||
|
### Detailed Container Descriptions
|
||||||
|
|
||||||
|
**1. network-probe (Probe Service)**
|
||||||
|
|
||||||
|
*Description:* The probe container continuously monitors network connectivity by sending ICMP ping requests to predefined external targets and reporting results to the backend.
|
||||||
|
|
||||||
|
*Functionality:*
|
||||||
|
- Runs Python application that implements probing logic
|
||||||
|
- Sends HTTP POST requests to backend API with monitoring data
|
||||||
|
- Executes ping operations to DNS servers (8.8.8.8, 1.1.1.1, 9.9.9.9)
|
||||||
|
- Measures response latency in milliseconds
|
||||||
|
- Handles unreachable targets gracefully
|
||||||
|
- Reports monitoring data every 10 seconds
|
||||||
|
|
||||||
|
*Image Contents:*
|
||||||
|
- Python 3.9 runtime
|
||||||
|
- `requests` library for HTTP communications
|
||||||
|
- Standard system utilities for network operations
|
||||||
|
- Minimal footprint for efficient resource usage
|
||||||
|
|
||||||
|
**2. network-backend (Backend Service)**
|
||||||
|
|
||||||
|
*Description:* The backend container provides a RESTful API for receiving monitoring data from the probe and serving it to the frontend while maintaining persistent storage.
|
||||||
|
|
||||||
|
*Functionality:*
|
||||||
|
- Runs Flask web framework application
|
||||||
|
- Exposes `/metrics` endpoint for receiving probe data (POST requests)
|
||||||
|
- Exposes `/metrics` endpoint for retrieving data (GET requests)
|
||||||
|
- Manages SQLite database (`monitoring.db`) on persistent volume
|
||||||
|
- Stores monitoring records with timestamps
|
||||||
|
- Returns latest monitoring status to frontend clients
|
||||||
|
- Handles data validation and error conditions
|
||||||
|
|
||||||
|
*Image Contents:*
|
||||||
|
- Python 3.9 runtime
|
||||||
|
- Flask web framework
|
||||||
|
- SQLite3 database library
|
||||||
|
- Additional Python dependencies as needed
|
||||||
|
|
||||||
|
**3. network-frontend (Frontend Service)**
|
||||||
|
|
||||||
|
*Description:* The frontend container serves a web-based dashboard that displays real-time network monitoring data fetched from the backend API.
|
||||||
|
|
||||||
|
*Functionality:*
|
||||||
|
- Runs Nginx web server for high performance
|
||||||
|
- Serves static HTML/CSS/JavaScript files
|
||||||
|
- Hosts dashboard UI accessible at port 5000
|
||||||
|
- Implements JavaScript fetch API calls to backend
|
||||||
|
- Displays monitoring status with color coding
|
||||||
|
- Refreshes data at regular intervals (typically every 5 seconds)
|
||||||
|
- Responsive design suitable for different screen sizes
|
||||||
|
|
||||||
|
*Image Contents:*
|
||||||
|
- Nginx Alpine Linux distribution (minimal base)
|
||||||
|
- Nginx web server configuration
|
||||||
|
- HTML/CSS dashboard files
|
||||||
|
- JavaScript code for frontend logic and API communication
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
### 1. Preparing the Application
|
||||||
|
|
||||||
|
**Command:** `./prepare-app.sh`
|
||||||
|
|
||||||
|
**What it does:**
|
||||||
|
- Creates custom Docker bridge network `monitoring-network`
|
||||||
|
- Creates named volume `monitoring-data` for database persistence
|
||||||
|
- Builds three custom Docker images from Dockerfiles:
|
||||||
|
- `network-probe:latest` from `Dockerfile.probe`
|
||||||
|
- `network-backend:latest` from `Dockerfile.backend`
|
||||||
|
- `network-frontend:latest` from `Dockerfile.frontend`
|
||||||
|
- Performs any necessary initialization tasks
|
||||||
|
|
||||||
|
**Prerequisites:**
|
||||||
|
- Docker daemon must be running
|
||||||
|
- Sufficient disk space for image layers (~1.5 GB)
|
||||||
|
- User must have Docker permissions
|
||||||
|
|
||||||
|
**Expected Output:**
|
||||||
|
```
|
||||||
|
Preparing app...
|
||||||
|
Creating network: monitoring-network
|
||||||
|
Creating volume: monitoring-data
|
||||||
|
Building probe image...
|
||||||
|
Building backend image...
|
||||||
|
Building frontend image...
|
||||||
|
Setup complete!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Time Required:** 2-5 minutes (varies based on system performance and internet speed)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Launching the Application
|
||||||
|
|
||||||
|
**Command:** `./start-app.sh`
|
||||||
|
|
||||||
|
**What it does:**
|
||||||
|
- Starts all three containers in detached mode
|
||||||
|
- Configures automatic restart on failure (`unless-stopped` policy)
|
||||||
|
- Establishes communication between containers via Docker network
|
||||||
|
- Mounts persistent volume to backend container
|
||||||
|
- Maps port 5000 from frontend container to host
|
||||||
|
|
||||||
|
**Prerequisites:**
|
||||||
|
- `prepare-app.sh` must have been run successfully
|
||||||
|
- Port 5000 must be available on host machine
|
||||||
|
- Docker daemon must be running
|
||||||
|
|
||||||
|
**Expected Output:**
|
||||||
|
```
|
||||||
|
Running app...
|
||||||
|
Starting probe container...
|
||||||
|
Starting backend container...
|
||||||
|
Starting frontend container...
|
||||||
|
The app is available at http://localhost:5000
|
||||||
|
```
|
||||||
|
|
||||||
|
**Startup Sequence:**
|
||||||
|
1. Backend container starts first and initializes database
|
||||||
|
2. Frontend container starts and serves dashboard
|
||||||
|
3. Probe container starts and begins monitoring
|
||||||
|
|
||||||
|
**Verification:**
|
||||||
|
- Check running containers: `docker ps`
|
||||||
|
- Access dashboard: Open browser to `http://localhost:5000`
|
||||||
|
- Should see network monitoring dashboard with target status
|
||||||
|
|
||||||
|
**Time Required:** 30-60 seconds for all containers to be ready
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Pausing the Application
|
||||||
|
|
||||||
|
**Command:** `./stop-app.sh`
|
||||||
|
|
||||||
|
**What it does:**
|
||||||
|
- Gracefully stops all running containers
|
||||||
|
- Preserves all data in named volumes
|
||||||
|
- Preserves Docker network configuration
|
||||||
|
- Allows containers to be restarted without data loss
|
||||||
|
|
||||||
|
**Important Notes:**
|
||||||
|
- Containers are **stopped** but not **removed**
|
||||||
|
- Database data persists in named volume
|
||||||
|
- Network and volume remain available
|
||||||
|
- Paused containers consume minimal resources
|
||||||
|
|
||||||
|
**Expected Output:**
|
||||||
|
```
|
||||||
|
Stopping app...
|
||||||
|
Stopping probe container...
|
||||||
|
Stopping backend container...
|
||||||
|
Stopping frontend container...
|
||||||
|
All containers stopped.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Data Preservation:**
|
||||||
|
- Application state is maintained in database
|
||||||
|
- Monitoring history is preserved
|
||||||
|
- Restarting with `start-app.sh` resumes with previous state
|
||||||
|
|
||||||
|
**Verification:**
|
||||||
|
- Check stopped containers: `docker ps -a`
|
||||||
|
- Verify volume still exists: `docker volume ls | grep monitoring-data`
|
||||||
|
- Verify network still exists: `docker network ls | grep monitoring-network`
|
||||||
|
|
||||||
|
**Time Required:** 10-20 seconds
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Resuming After Pause
|
||||||
|
|
||||||
|
**Command:** `./start-app.sh` (same as initial launch)
|
||||||
|
|
||||||
|
**Behavior:**
|
||||||
|
- Restarts existing containers (not creating new ones)
|
||||||
|
- Reconnects containers to existing network
|
||||||
|
- Mounts existing volume with preserved data
|
||||||
|
- Previous monitoring data is immediately available
|
||||||
|
|
||||||
|
**No Data Loss:**
|
||||||
|
- All metrics collected before pause are retained
|
||||||
|
- Database state is exactly as it was before stopping
|
||||||
|
- Frontend dashboard displays previous monitoring history
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Deleting the Application
|
||||||
|
|
||||||
|
**Command:** `./remove-app.sh`
|
||||||
|
|
||||||
|
**What it does:**
|
||||||
|
- Stops all running containers
|
||||||
|
- Removes all stopped containers
|
||||||
|
- Removes custom Docker network `monitoring-network`
|
||||||
|
- Removes named volume `monitoring-data` (database deleted)
|
||||||
|
- Removes custom Docker images
|
||||||
|
|
||||||
|
**Important:** This command is **destructive** and **cannot be undone**:
|
||||||
|
- All monitoring data is permanently deleted
|
||||||
|
- All containers are removed
|
||||||
|
- Network and volumes are removed
|
||||||
|
- Only images can be rebuilt by running `prepare-app.sh`
|
||||||
|
|
||||||
|
**Expected Output:**
|
||||||
|
```
|
||||||
|
Removing app...
|
||||||
|
Stopping containers...
|
||||||
|
Removing containers...
|
||||||
|
Removing network...
|
||||||
|
Removing volume...
|
||||||
|
Removing images...
|
||||||
|
Removed app. All traces deleted.
|
||||||
|
```
|
||||||
|
|
||||||
|
**After Removal:**
|
||||||
|
- System is returned to clean state
|
||||||
|
- To run application again, start with `prepare-app.sh`
|
||||||
|
- No artifacts or data remain
|
||||||
|
|
||||||
|
**Caution:** Before running this command, ensure:
|
||||||
|
- You have backed up any critical monitoring data
|
||||||
|
- You will not need historical metrics
|
||||||
|
- This is your intention (no confirmation prompt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Viewing the Application in Web Browser
|
||||||
|
|
||||||
|
### Access Method
|
||||||
|
|
||||||
|
1. **Ensure Application is Running**
|
||||||
|
```bash
|
||||||
|
docker ps # Should show three running containers
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Open Web Browser**
|
||||||
|
- Use any modern web browser (Chrome, Firefox, Safari, Edge)
|
||||||
|
- Recommended: Chrome 90+, Firefox 88+, Safari 14+
|
||||||
|
|
||||||
|
3. **Navigate to Dashboard**
|
||||||
|
- URL: `http://localhost:5000`
|
||||||
|
- Alternative: `http://127.0.0.1:5000`
|
||||||
|
|
||||||
|
### Dashboard Features
|
||||||
|
|
||||||
|
**Main Display:**
|
||||||
|
- Table showing monitored DNS servers (targets)
|
||||||
|
- Current status of each target (reachable/unreachable)
|
||||||
|
- Last measured latency (response time in milliseconds)
|
||||||
|
- Last update timestamp
|
||||||
|
|
||||||
|
**Target Information:**
|
||||||
|
- Target IP Address
|
||||||
|
- Target Name (e.g., "Google DNS")
|
||||||
|
- Current Status Badge
|
||||||
|
- Green: Reachable (last ping successful)
|
||||||
|
- Red: Unreachable (last ping failed)
|
||||||
|
- Latency Value
|
||||||
|
- Status Message
|
||||||
|
|
||||||
|
**Auto-Refresh:**
|
||||||
|
- Dashboard automatically updates every 5 seconds
|
||||||
|
- Data fetched from backend API
|
||||||
|
- No manual refresh needed
|
||||||
|
|
||||||
|
### Troubleshooting Access
|
||||||
|
|
||||||
|
**If Page Won't Load:**
|
||||||
|
1. Verify containers are running: `docker ps`
|
||||||
|
2. Check frontend logs: `docker logs network-frontend`
|
||||||
|
3. Verify port 5000 is listening: `netstat -tlnp | grep 5000`
|
||||||
|
|
||||||
|
**If Data Shows as Unavailable:**
|
||||||
|
1. Verify backend container is running: `docker ps | grep backend`
|
||||||
|
2. Check backend logs: `docker logs network-backend`
|
||||||
|
3. Wait 10-15 seconds for first probe results
|
||||||
|
|
||||||
|
**If Port 5000 is Already in Use:**
|
||||||
|
1. Find what's using port 5000: `lsof -i :5000` or `netstat -tlnp`
|
||||||
|
2. Either stop that service or use port mapping modification
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### AI Assistance Used in This Project
|
||||||
|
|
||||||
|
**1. Flask Backend Development**
|
||||||
|
- AI generated RESTful API endpoints
|
||||||
|
- Database schema design and SQLite integration
|
||||||
|
- Error handling and data validation logic
|
||||||
|
|
||||||
|
**2. Frontend Dashboard**
|
||||||
|
- AI generated HTML/CSS dashboard template
|
||||||
|
- JavaScript fetch API implementation
|
||||||
|
- Real-time data refresh and status visualization
|
||||||
|
|
||||||
|
**3. Documentation**
|
||||||
|
- Technical accuracy and completeness
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
10
noc-docker/backend/Dockerfile
Normal file
10
noc-docker/backend/Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
VOLUME ["/data"]
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
||||||
46
noc-docker/backend/app.py
Normal file
46
noc-docker/backend/app.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
from flask import Flask, jsonify, request
|
||||||
|
import sqlite3
|
||||||
|
import time
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
DB = "/data/metrics.db"
|
||||||
|
|
||||||
|
def init_db():
|
||||||
|
conn = sqlite3.connect(DB)
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS metrics (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
target TEXT,
|
||||||
|
latency REAL,
|
||||||
|
status TEXT,
|
||||||
|
timestamp TEXT
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
@app.route("/report", methods=["POST"])
|
||||||
|
def report():
|
||||||
|
data = request.json
|
||||||
|
conn = sqlite3.connect(DB)
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("INSERT INTO metrics (target, latency, status, timestamp) VALUES (?, ?, ?, ?)",
|
||||||
|
(data["target"], data["latency"], data["status"], time.ctime()))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return {"message": "stored"}
|
||||||
|
|
||||||
|
@app.route("/metrics")
|
||||||
|
def metrics():
|
||||||
|
conn = sqlite3.connect(DB)
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("SELECT target, latency, status, timestamp FROM metrics ORDER BY id DESC LIMIT 20")
|
||||||
|
rows = c.fetchall()
|
||||||
|
conn.close()
|
||||||
|
return jsonify(rows)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
init_db()
|
||||||
|
app.run(host="0.0.0.0", port=5000)
|
||||||
1
noc-docker/backend/requirements.txt
Normal file
1
noc-docker/backend/requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
34
noc-docker/docker-compose.yml
Normal file
34
noc-docker/docker-compose.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build: ./backend
|
||||||
|
container_name: noc-backend
|
||||||
|
volumes:
|
||||||
|
- noc-data:/data
|
||||||
|
networks:
|
||||||
|
- noc-net
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
build: ./frontend
|
||||||
|
container_name: noc-frontend
|
||||||
|
ports:
|
||||||
|
- "5000:5001"
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- noc-net
|
||||||
|
|
||||||
|
probe:
|
||||||
|
build: ./probe
|
||||||
|
container_name: noc-probe
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- noc-net
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
noc-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
noc-net:
|
||||||
9
noc-docker/frontend/Dockerfile
Normal file
9
noc-docker/frontend/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
||||||
17
noc-docker/frontend/app.py
Normal file
17
noc-docker/frontend/app.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from flask import Flask, render_template
|
||||||
|
import requests
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
BACKEND = "http://backend:5000"
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
try:
|
||||||
|
data = requests.get(f"{BACKEND}/metrics").json()
|
||||||
|
except:
|
||||||
|
data = []
|
||||||
|
return render_template("index.html", data=data)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=5001)
|
||||||
2
noc-docker/frontend/requirements.txt
Normal file
2
noc-docker/frontend/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
flask
|
||||||
|
requests
|
||||||
25
noc-docker/frontend/templates/index.html
Normal file
25
noc-docker/frontend/templates/index.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>NOC Dashboard</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Network Monitoring Dashboard</h1>
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<th>Target</th>
|
||||||
|
<th>Latency</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th>Time</th>
|
||||||
|
</tr>
|
||||||
|
{% for row in data %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ row[0] }}</td>
|
||||||
|
<td>{{ row[1] }}</td>
|
||||||
|
<td>{{ row[2] }}</td>
|
||||||
|
<td>{{ row[3] }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
7
noc-docker/prepare-app.sh
Normal file
7
noc-docker/prepare-app.sh
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Preparing app..."
|
||||||
|
|
||||||
|
docker network create noc-net 2>/dev/null
|
||||||
|
docker volume create noc-data 2>/dev/null
|
||||||
|
|
||||||
|
docker compose build
|
||||||
10
noc-docker/probe/Dockerfile
Normal file
10
noc-docker/probe/Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y iputils-ping
|
||||||
|
RUN pip install requests
|
||||||
|
|
||||||
|
CMD ["python", "probe.py"]
|
||||||
27
noc-docker/probe/probe.py
Normal file
27
noc-docker/probe/probe.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
import requests
|
||||||
|
|
||||||
|
BACKEND = "http://backend:5000/report"
|
||||||
|
TARGETS = ["147.232.22.34", "147.232.22.35", "147.232.205.116"]
|
||||||
|
|
||||||
|
def ping(target):
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output(["ping", "-c", "1", target]).decode()
|
||||||
|
latency = float(output.split("time=")[1].split(" ")[0])
|
||||||
|
return latency, "UP"
|
||||||
|
except:
|
||||||
|
return 0, "DOWN"
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for t in TARGETS:
|
||||||
|
latency, status = ping(t)
|
||||||
|
try:
|
||||||
|
requests.post(BACKEND, json={
|
||||||
|
"target": t,
|
||||||
|
"latency": latency,
|
||||||
|
"status": status
|
||||||
|
})
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
time.sleep(5)
|
||||||
8
noc-docker/remove-app.sh
Normal file
8
noc-docker/remove-app.sh
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Removing app..."
|
||||||
|
|
||||||
|
docker compose down -v
|
||||||
|
docker network rm noc-net 2>/dev/null
|
||||||
|
docker volume rm noc-data 2>/dev/null
|
||||||
|
|
||||||
|
echo "Removed."
|
||||||
6
noc-docker/start-app.sh
Normal file
6
noc-docker/start-app.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Starting app..."
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
echo "App running at: http://localhost:5000"
|
||||||
4
noc-docker/stop-app.sh
Normal file
4
noc-docker/stop-app.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Stopping app..."
|
||||||
|
|
||||||
|
docker compose down
|
||||||
Loading…
Reference in New Issue
Block a user