Monitors DNS records across multiple domains and be notified when problems are detected.
10K+
A containerized Progressive Web App (PWA) that monitors DNS records across multiple domains, detects dead endpoints, identifies subdomain takeover risks, and sends notifications when issues are found.
| Service | Technology | Purpose |
|---|---|---|
| app | Node.js 22 + Express | API server, web UI, background worker |
| db | PostgreSQL 16 | Primary data store |
./start.sh
This generates a .env file with random secrets and starts the containers. If you prefer to manage secrets manually, copy .env.example to .env, fill in your own values, and run docker compose up -d.
Open http://localhost:8080 in your browser.
The first user to register automatically becomes an admin.
All configuration is via environment variables (see .env.example):
| Variable | Required | Default | Description |
|---|---|---|---|
DB_PASSWORD | No | auto-generated | PostgreSQL password |
SESSION_SECRET | No | auto-generated | Session encryption key (min 32 chars) |
ENCRYPTION_KEY | No | auto-generated | SMTP credential encryption key (min 32 chars) |
REGISTRATION_ENABLED | No | true | Allow new user registration |
ALLOW_PRIVATE_RANGES | No | false | Allow scanning private IP ranges |
MAX_DOMAINS | No | 50 | Maximum domains per instance |
APP_PORT | No | 8080 | Host port for web UI |
textContent only (no XSS via innerHTML)| Service | Container Port | Host Port | Description |
|---|---|---|---|
| app | 8080 | ${APP_PORT:-8080} | Web UI and API |
| db | 5432 | not exposed | PostgreSQL (internal only) |
Only the app is exposed to the host network. The database communicates over an internal Docker bridge network.
| Volume | Container | Mount Path | Purpose |
|---|---|---|---|
pgdata | db (PostgreSQL) | /var/lib/postgresql/data | Database storage — all domains, records, scan history, and user accounts |
This volume persists across container restarts and rebuilds. To manage it:
# Back up the database
docker compose exec db pg_dump -U dnsscanner dnsscanner > backup.sql
# Restore from backup
docker compose exec -T db psql -U dnsscanner dnsscanner < backup.sql
# Reset all data (destructive — removes everything)
docker compose down -v
A record is dead only when nothing responds at all — no HTTP, no TCP port, no ICMP ping. A server returning HTTP 500 or having an expired SSL certificate is still considered alive (the server is responding, just unhealthy).
Records are marked dead after 3 consecutive failed health checks across scans to avoid false positives from transient issues.
| Type | Checks (stops at first success) |
|---|---|
| A/AAAA | HTTPS -> HTTP -> TCP ports (443,80,22,8443,8080,3389,21) -> ICMP |
| CNAME | Resolve target, then same as A/AAAA |
| MX | TCP 25 -> TCP 587 -> TCP 465 -> ICMP |
| NS | DNS query -> ICMP |
| SRV | TCP host:port -> ICMP |
| TXT/CAA/SOA | Skipped (informational) |
All endpoints require authentication unless noted. Admin-only endpoints require role: admin.
POST /api/auth/register - Create accountPOST /api/auth/login - LoginPOST /api/auth/logout - LogoutGET /api/auth/me - Current userGET /api/domains - List domainsPOST /api/domains - Add domainPUT /api/domains/:id - Update domainDELETE /api/domains/:id - Delete domainPOST /api/domains/import - Bulk CSV importPOST /api/domains/:id/scan - Manual scanPOST /api/scan-all - Scan all domainsGET /api/domains/:id/scans - Scan historyGET /api/domains/:id/records - DNS records with health statusGET /api/records/:id/history - Health check historyGET /api/records/:id/changes - DNS change historyGET /api/dashboard - Summary stats, dead records, recent changesGET /api/domains/:id/export/csv - CSV downloadGET /api/domains/:id/export/report - HTML reportGET/PUT /api/notifications/settings - User notification preferencesPOST /api/push/subscribe - Register push subscriptionGET/POST/PUT/DELETE /api/webhooks - Webhook managementGET /api/events - Server-Sent Events stream# Run without Docker (requires PostgreSQL)
npm install
DB_PASSWORD=dev SESSION_SECRET=$(openssl rand -hex 32) ENCRYPTION_KEY=$(openssl rand -hex 32) node server.js
MIT
Content type
Image
Digest
sha256:aa92ec862…
Size
60.8 MB
Last updated
3 months ago
docker pull djlactose/dnsscaner:sha-17e7280b03c73ddd071e89b5d60a87114aa36a68