An open API service indexing awesome lists of open source software.

https://github.com/karam-ajaj/atlas

Open-source tool for network discovery, visualization, and monitoring. Built with Go, FastAPI, and React, supports Docker host scanning.
https://github.com/karam-ajaj/atlas

container devops devops-tools docker docker-monitoring docker-swarm fastapi golang homelab host-discovery infrastructure-automation network-discovery network-monitoring network-visualization networking open-source react self-hosted

Last synced: 18 days ago
JSON representation

Open-source tool for network discovery, visualization, and monitoring. Built with Go, FastAPI, and React, supports Docker host scanning.

Awesome Lists containing this project

README

          

# ๐ŸŒ Atlas - Network Infrastructure Visualizer (Go-powered)

**Atlas** is a full-stack containerized tool to **scan**, **analyze**, and **visualize** network infrastructure dynamically. Built with Go, FastAPI, NGINX, and a custom React frontend, it provides automated scanning, storage, and rich dashboards for insight into your infrastructure.

---

## ๐ŸŒ Live Demo

๐Ÿ”— **URL:** https://atlasdemo.vnerd.nl/
๐Ÿ‘ค **Username:** `admin`
๐Ÿ”‘ **Password:** `change-me`

---
## ๐Ÿš€ What It Does

Atlas performs three key functions:

1. **Scans Docker Containers** running on the host to extract:
- IP addresses **(supports multiple IPs per container)**
- MAC addresses **(supports multiple MACs per container)**
- Open ports
- Network names
- OS type (from image metadata)
- **Each network interface is tracked separately**

2. **Scans Local & Neighboring Hosts** on the subnet to:
- Detect reachable devices
- Retrieve OS fingerprints, MACs, and open ports
- Populate a full map of the infrastructure

3. **Visualizes Data in Real-Time**:
- Serves an interactive HTML dashboard via Nginx
- Hosts a FastAPI backend for data access and control
- Uses a React frontend to render dynamic network graphs

---

## ๐Ÿ–ผ๏ธ Screenshots

### ๐Ÿ–ฅ๏ธ Desktop View


Dashboard - Collapsed Layout

Dashboard - Circular Layout



Dashboard - Horizontal Layout

Dashboard - Hierarchical Layout



Hosts Table View

Hosts Table View



Logs Panel

Logs Panel


### ๐Ÿ“ฑ Mobile View


Mobile Dashboard - Collapsed

Dashboard - Collapsed



Mobile Dashboard - Horizontal

Dashboard - Horizontal



Mobile Hosts Table

Hosts Table



Mobile Logs Panel

Logs Panel


> ๐Ÿ’ก **Tip:** Click on any screenshot to view the full-size image

---

## ๐Ÿš€ Deployment (Docker)

Run Atlas with optional port configuration:

```bash
docker run -d \
--name atlas \
--network=host \
--cap-add=NET_RAW \
--cap-add=NET_ADMIN \
-v /var/run/docker.sock:/var/run/docker.sock \
-e ATLAS_UI_PORT='8884' \
-e ATLAS_API_PORT='8885' \
-e ATLAS_ADMIN_USER='admin' \
-e ATLAS_ADMIN_PASSWORD='change-me' \
-e ATLAS_AUTH_TTL_SECONDS='86400'
-e FASTSCAN_INTERVAL='3600' \
-e DOCKERSCAN_INTERVAL='3600' \
-e DEEPSCAN_INTERVAL='7200' \
-e SCAN_SUBNETS="192.168.1.0/24,10.0.0.0/24" \
keinstien/atlas:{tag}
```

**Environment Variables:**
- `ATLAS_UI_PORT` โ€“ Sets the port for the Atlas UI (Nginx). Default: `8888`.
- `ATLAS_API_PORT` โ€“ Sets the port for the FastAPI backend. Default: `8889`.
- `ATLAS_ADMIN_USER` โ€“ Admin username for login (single user). Default: `admin`.
- `ATLAS_ADMIN_PASSWORD` โ€“ Enables UI/API authentication when set (required password for login). Default: `disabled`.
- `ATLAS_AUTH_TTL_SECONDS` โ€“ Session lifetime in seconds. Default: `86400` (24h).
- `FASTSCAN_INTERVAL` โ€“ Interval in seconds between fast scans. Default: `3600` (1 hour).
- `DOCKERSCAN_INTERVAL` โ€“ Interval in seconds between Docker scans. Default: `3600` (1 hour).
- `DEEPSCAN_INTERVAL` โ€“ Interval in seconds between deep scans. Default: `7200` (2 hours).
- `SCAN_SUBNETS` โ€“ Comma-separated list of subnets to scan (e.g., "192.168.1.0/24,10.0.0.0/24"). If not set, Atlas will auto-detect the local subnet. This allows scanning multiple networks including LAN and remote servers.

If not set, defaults are used (UI: `8888`, API: `8889`, scan intervals as shown above).

Example endpoints:
- UI: `http://localhost:ATLAS_UI_PORT`
- API (from exposed API port): `http://localhost:ATLAS_API_PORT/api/docs`
- API (based on nginx conf): `http://localhost:ATLAS_UI_PORT/api/docs`

### ๐Ÿ” Authentication

Atlas authentication is optional and disabled by default.

- **Enable auth:** set `ATLAS_ADMIN_PASSWORD` (and optionally `ATLAS_ADMIN_USER`).
- **UI behavior:** when auth is enabled, the UI shows a login gate before any data is rendered.
- **API behavior:** when auth is enabled, core endpoints (hosts, external, scripts, logs, scheduler, containers) require a token.

Relevant auth endpoints:
- `GET /api/auth/enabled` โ€“ returns whether auth is enabled
- `POST /api/auth/login` โ€“ returns a bearer token
- `GET /api/auth/me` โ€“ validates current token
- `POST /api/auth/logout` โ€“ invalidates the current token

**Scan Scheduling:**
Atlas automatically runs scans at the configured intervals. You can:
- Set initial intervals via environment variables (see above)
- Change intervals dynamically through the Scripts Panel in the UI
- Manually trigger scans via the UI or API at any time

The scheduler starts automatically when the container starts and runs scans in the background.

---

## โš™๏ธ How it Works

### ๐Ÿ”น Backend Architecture

- **Go CLI (`atlas`)**
- Built using Go 1.22
- Handles:
- `initdb`: Creates SQLite DB with required schema
- `fastscan`: Fast host scan using ARP/Nmap
- `dockerscan`: Gathers Docker container info from `docker inspect`
- `deepscan`: Enriches data with port scans, OS info, etc.

- **FastAPI Backend**
- Runs on `port 8889`
- Serves:
- `/api/hosts` โ€“ all discovered hosts (regular + Docker)
- `/api/external` โ€“ external IP and metadata

- **NGINX**
- Serves frontend (React static build) on `port 8888`
- Proxies API requests (`/api/`) to FastAPI (`localhost:8889`)

---

## ๐Ÿ“‚ Project Structure

**Source Code (Host Filesystem)**

```
atlas/
โ”œโ”€โ”€ config/
โ”‚ โ”œโ”€โ”€ atlas_go/ # Go source code (main.go, scan, db)
โ”‚ โ”œโ”€โ”€ bin/ # Compiled Go binary (atlas)
โ”‚ โ”œโ”€โ”€ db/ # SQLite file created on runtime
โ”‚ โ”œโ”€โ”€ logs/ # Uvicorn logs
โ”‚ โ”œโ”€โ”€ nginx/ # default.conf for port 8888
โ”‚ โ””โ”€โ”€ scripts/ # startup shell scripts
โ”œโ”€โ”€ data/
โ”‚ โ”œโ”€โ”€ html/ # Static files served by Nginx
โ”‚ โ””โ”€โ”€ react-ui/ # Frontend source (React)
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ LICENSE
โ””โ”€โ”€ README.md
```

**Inside Container (/config)**
```
/config/
โ”œโ”€โ”€ bin/atlas # Go binary entrypoint
โ”œโ”€โ”€ db/atlas.db # Persistent SQLite3 DB
โ”œโ”€โ”€ logs/ # Logs for FastAPI
โ”œโ”€โ”€ nginx/default.conf # Nginx config
โ””โ”€โ”€ scripts/atlas_check.sh # Entrypoint shell script

```

---

## ๐Ÿงช React Frontend (Dev Instructions)

This is a new React-based UI.

### ๐Ÿ› ๏ธ Setup and Build

```bash
cd /swarm/data/atlas/react-ui
npm install
npm run build
```

The built output will be in:
```
/swarm/data/atlas/react-ui/dist/
```

For development CI/CD (for UI and backend and build a new docker version):
```bash
/swarm/github-repos/atlas/deploy.sh
```

## ๐Ÿš€ CI/CD: Build and Publish a New Atlas Docker Image

To deploy a new version and upload it to Docker Hub, use the provided CI/CD script:

1. Build and publish a new image:

```bash
/swarm/github-repos/atlas/deploy.sh
```

- The script will prompt you for a version tag (e.g. `v3.2`).
- It will build the React frontend, copy to NGINX, build the Docker image, and push **both** `keinstien/atlas:$VERSION` and `keinstien/atlas:latest` to Docker Hub.

2. Why push both tags?

- **Version tag:** Allows you to pin deployments to a specific release (e.g. `keinstien/atlas:v3.2`).
- **Latest tag:** Users can always pull the most recent stable build via `docker pull keinstien/atlas:latest`.

3. The script will also redeploy the running container with the new version.

**Example output:**
```shell
๐Ÿ”„ Tagging Docker image as latest
๐Ÿ“ค Pushing Docker image to Docker Hub...
โœ… Deployment complete for version: v3.2
```

> **Note:** Make sure you are logged in to Docker Hub (`docker login`) before running the script.

---

## ๐ŸŒ URLs

- **Swagger API docs:**
- `๐ŸŒ http://localhost:8888/api/docs` (Host Data API endpoint)

- **Frontend UI:**
- `๐Ÿ–ฅ๏ธ UI http://localhost:8888/` (main dashboard)
- `๐Ÿ“Š http://localhost:8888/hosts.html` (Hosts Table)
- `๐Ÿงช http://localhost:8888/visuals/vis.js_node_legends.html` (legacy test UI)

> Default exposed port is: `8888`

### ๐Ÿ“ก Scheduler API Endpoints

New scheduler management endpoints:

- `GET /api/scheduler/intervals` - Get current scan intervals for all scan types
- `PUT /api/scheduler/intervals/{scan_type}` - Update interval for a specific scan type (fastscan, dockerscan, or deepscan)
- `GET /api/scheduler/status` - Get scheduler status and current intervals

Example:
```bash
# Get current intervals
curl http://localhost:8888/api/scheduler/intervals

# Update fastscan interval to 30 minutes (1800 seconds)
curl -X PUT http://localhost:8888/api/scheduler/intervals/fastscan \
-H "Content-Type: application/json" \
-d '{"interval": 1800}'

# Check scheduler status
curl http://localhost:8888/api/scheduler/status
```

---

## โœ… Features

- [x] **Multi-interface scanning** - Automatically detects and scans all physical network interfaces on the host
- [x] Fast network scans (ping/ARP)
- [x] **Multiple subnet scanning** - Scan your LAN, remote servers, and multiple networks simultaneously via SCAN_SUBNETS environment variable
- [x] Docker container inspection with **multi-network support**
- [x] **Multiple IPs and MACs per container** - Containers on multiple networks show all interfaces
- [x] **Interface-aware host tracking** - Same host on multiple interfaces appears separately with interface labels
- [x] External IP discovery
- [x] Deep port scans with OS enrichment
- [x] React-based dynamic frontend
- [x] NGINX + FastAPI routing
- [x] SQLite persistence
- [x] **Scheduled auto scans with configurable intervals** - Configure via environment variables or UI
- [x] **Dynamic interval management** - Change scan intervals without restarting the container

---

## ๐Ÿ“Œ Dev Tips

To edit Go logic:
- Main binary: `internal/scan/`
- Commands exposed via: `main.go`

To edit API:
- Python FastAPI app: `scripts/app.py`

To edit UI:
- Modify React app under `/react-ui`
- Rebuild and copy static files to `/html`
- _automated deplolyment and publish to dockerhub using the script deploy.sh_
---

## โš™๏ธ Automation Notes
- Atlas runs automatically on container start.

- All Go scan tasks run sequentially:
- `initdb โ†’ fastscan โ†’ deepscan โ†’ dockerscan`

- Scheduled scans are run every 30 minutes via Go timers.

- No cron dependency required inside the container.

- Scans can also be manually triggered via the UI using API post request.
---
## ๐Ÿ‘จโ€๐Ÿ’ป Author

**Karam Ajaj**
Infrastructure & Automation Engineer
[https://github.com/karam-ajaj](https://github.com/karam-ajaj)

---

## ๐Ÿ“ License

MIT License โ€” free for personal or commercial use.

---

## ๐Ÿ“š Documentation

- [Multi-Interface Support](MULTI_INTERFACE_SUPPORT.md) - Detailed guide on the multi-interface scanning feature
- [Migration Guide](MIGRATION_GUIDE.md) - Guide for migrating from bash scripts to Go implementation

## ๐Ÿค Contributing

Suggestions, bug reports, and pull requests are welcome!

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=karam-ajaj/atlas&type=date&legend=top-left)](https://www.star-history.com/#karam-ajaj/atlas&type=date&legend=top-left)