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 π atlasdemo.vnerd.nl
Atlas performs three key functions:
-
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
-
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
-
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
Run Atlas with optional port configuration:
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 \
keinstien/atlas:3.2.29
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.
If not set, defaults are used (UI: 8888, API: 8889).
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
Auto-scanning of Docker and local subnets runs on container start.
-
Go CLI (
atlas
)- Built using Go 1.22
- Handles:
initdb
: Creates SQLite DB with required schemafastscan
: Fast host scan using ARP/Nmapdockerscan
: Gathers Docker container info fromdocker 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
- Runs on
-
NGINX
- Serves frontend (React static build) on
port 8888
- Proxies API requests (
/api/
) to FastAPI (localhost:8889
)
- Serves frontend (React static build) on
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
This is a new React-based UI.
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 anf build a new docker version):
/swarm/github-repos/atlas/deploy.sh
To deploy a new version and upload it to Docker Hub, use the provided CI/CD script:
-
Build and publish a new image:
/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
andkeinstien/atlas:latest
to Docker Hub.
- The script will prompt you for a version tag (e.g.
-
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
.
- Version tag: Allows you to pin deployments to a specific release (e.g.
-
The script will also redeploy the running container with the new version.
Example output:
π 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.
-
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
- Fast network scans (ping/ARP)
- Docker container inspection with multi-network support
- Multiple IPs and MACs per container - Containers on multiple networks show all interfaces
- External IP discovery
- Deep port scans with OS enrichment
- React-based dynamic frontend
- NGINX + FastAPI routing
- SQLite persistence
- Scheduled auto scans using Go timers
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
-
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.
Karam Ajaj
Infrastructure & Automation Engineer
https://github.com/karam-ajaj
MIT License β free for personal or commercial use.
Suggestions, bug reports, and pull requests are welcome!