Open-source tool for network discovery, visualization, and monitoring. Built with Go, FastAPI, and React, supports Docker host scanning.
Open-source tool for network discovery, visualization, and monitoring. Built with Go, FastAPI, and React, supports Docker host scanning.
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.
URL: https://atlasdemo.vnerd.nl/
Username: admin
Password: change-me
Atlas performs three key functions:
Scans Docker Containers running on the host to extract:
Scans Local & Neighboring Hosts on the subnet to:
Visualizes Data in Real-Time:
Dashboard - Circular Layout
Dashboard - Hierarchical Layout
Hosts Table View
Logs Panel
Dashboard - Collapsed
Dashboard - Horizontal
Hosts Table
Logs Panel
Tip: Click on any screenshot to view the full-size image
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' \
-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:
http://localhost:ATLAS_UI_PORThttp://localhost:ATLAS_API_PORT/api/docshttp://localhost:ATLAS_UI_PORT/api/docsAtlas authentication is optional and disabled by default.
ATLAS_ADMIN_PASSWORD (and optionally ATLAS_ADMIN_USER).Relevant auth endpoints:
GET /api/auth/enabled – returns whether auth is enabledPOST /api/auth/login – returns a bearer tokenGET /api/auth/me – validates current tokenPOST /api/auth/logout – invalidates the current tokenScan Scheduling: Atlas automatically runs scans at the configured intervals. You can:
The scheduler starts automatically when the container starts and runs scans in the background.
Go CLI (atlas)
initdb: Creates SQLite DB with required schemafastscan: Fast host scan using ARP/Nmapdockerscan: Gathers Docker container info from docker inspectdeepscan: Enriches data with port scans, OS info, etc.FastAPI Backend
port 8889/api/hosts – all discovered hosts (regular + Docker)/api/external – external IP and metadataNGINX
port 8888/api/) to FastAPI (localhost:8889)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 and 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
v3.2).keinstien/atlas:$VERSION and keinstien/atlas:latest to Docker Hub.Why push both tags?
keinstien/atlas:v3.2).docker pull keinstien/atlas:latest.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
New scheduler management endpoints:
GET /api/scheduler/intervals - Get current scan intervals for all scan typesPUT /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 intervalsExample:
# 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
To edit Go logic:
internal/scan/main.goTo edit API:
scripts/app.pyTo edit UI:
/react-ui/htmlAtlas runs automatically on container start.
All Go scan tasks run sequentially:
initdb → fastscan → deepscan → dockerscanScheduled 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!
No open issues yet, or sync has not completed.