Dashboard
Live infrastructure overview — data pulled from NPM REST API
CMMC Level 2 Compliance Status LIVE
Active Proxy Hosts
| Domain(s) | Backend | SSL Type | Status | Expiry | Actions |
|---|---|---|---|---|---|
| Loading proxy hosts... | |||||
⏱ Recent Activity
Proxy Hosts
All reverse proxy routing rules — click Edit to modify any host
All Proxy Hosts
| ID | Domain(s) | Forward To | Scheme | SSL Cert | Enabled | Actions |
|---|---|---|---|---|---|---|
| Loading... | ||||||
Redirection Hosts
HTTP redirections — redirect one domain to another URL with 301/302 codes
All Redirection Hosts
| ID | Source Domain(s) | HTTP Code | Scheme | Destination | SSL | Status | Actions |
|---|---|---|---|---|---|---|---|
| Loading... | |||||||
SSL Certificates
TLS certificate inventory with expiry tracking and renewal method details
New Domain Wizard
Guided setup — creates a proxy host via NPM API and shows required DNS records
herricklabs.com, herricktechlabs.com) are applied automatically below. The resulting A records must be added to GoDaddy DNS before the domain will work.nginx-htl (172.16.177.224).71.246.225.101 (SonicWall public IP). SonicWall NATs port 443 to NPM at 172.16.177.224. NPM uses the Host header to route to the correct backend.Network Topology
Interactive architecture view — hover to see live traffic flow
Backend Server Map LIVE
Routing table generated from NPM API
| Server IP | Port | Scheme | Domains Served |
|---|
SSL Certificate Coverage
🔒 Wildcard Certificate (DNS-01)
herricklabs.com, *.herricklabs.com, *.herricktechlabs.com⚠ Let's Encrypt Certificates (HTTP-01)
Audit Log
5W1H activity trail — CMMC AU.L2-3.3.1
| Timestamp ▼ | User ▼ | Source IP ▼ | Action ▼ | Detail |
|---|---|---|---|---|
| Loading audit trail... | ||||
Firewall Management
sudo iptables. Changes are runtime-only until saved with iptables-save.Active chains: HTL-SAFE (anti-lockout), HTL-MGMT (management gate), HTL-SSH-LIMIT (brute-force), HTL-GEOIP (country blocking: CN, RU, KP, IR, BY). GeoIP database auto-updates monthly via cron.
Fail2ban
Log Viewer
System Overview
Active Connections
Listening Ports
Network Tools
Settings
| Event | Discord | Teams | SMTP | SMS | Syslog |
|---|
User Management
When OFF: password-only login is allowed (troubleshooting mode). All bypass events are audit-logged.
/npm-admin/.
CMMC: AC.L2-3.1.1, IA.L2-3.5.1, IA.L2-3.5.3
Changelog
Maintenance history, release notes, and audit trail for this portal
- FEATUser Management Redesign — Status dashboard with 4 live cards, clear NPM vs Portal sections with distinct color coding, TOTP enforcement toggle with server-side bypass and audit logging.
- FEATTOTP Unification — Portal and NPM now share the same TOTP secret. One authenticator app entry, one code, works for both systems. Syncs on enrollment, reset, and delete.
- FEATProfile Menu — Top-right avatar button with dropdown: change password (NPM API validated), TOTP status view, quick access to settings, sign out.
- FEATFirewall Quick Templates — 7 one-click buttons for common rules (Allow SSH, HTTPS, HTTP, NPM, Ping, Block IP, Log Traffic). Auto-fills the form and scrolls to it.
- FEATNetwork Topology Upgrade — Expanded SVG with service name detection, hover detail panels, better connection curves. Recognizes PRTG, UniFi, Mail, VPN, NAS, Git, RDP services.
- UXGlobal Visual Polish — Micro-interactions, staggered card animations, table row accents, custom scrollbars, cert expiry progress bars, proxy status dots, sidebar live badges (8 indicators).
- UXLog Viewer Enhancement — Syntax highlighting: IPs in blue, timestamps in grey, ports in orange, severity levels color-coded. Line count display.
- UXModal Modernization — All confirm()/prompt() dialogs replaced with styled modals. Dark modal headers, type-to-confirm for destructive actions, input validation.
- SECProduction Hardening — healthcheck.sh (5-point check), disk-cleanup.sh, logrotate config, systemd v5.1 update. All branding updated to Herrick Technology Labs.
- FIXHelp Button — Page guide ? button redesigned from bare circle to labeled pill. All 14 pages have complete guide content with export buttons.
- FEATCMMC Compliance Scanner (20 controls) — Server-side live scan replacing 6 client-side checks. Covers AC, IA, AU, SC, SI, IR, CM, RA, AT families. Each control: ID, title, description, verification method, PASS/WARN/FAIL status, live evidence. Expandable evidence panels. Export Evidence Package button downloads JSON.server.py — /portal-api/cmmc-scan | index.html — runCMMCChecks()
- FEATTriple-redundant notification engine — 5 channel types x 3 endpoints each (15 total). Cascade failover: try Primary, fail to Backup, fail to Tertiary. Priority ordering (drag to reorder). 7 event types routed per channel.server.py — fire_alert(), _fire_channel() | settings.json
- FEATSettings page rebuilt — Security config (timeout, lockout, max failures), Discord x3 with test, Teams x3 with test, SMTP x3 with test, Syslog x3, Alert Event Matrix (events x channels grid), Notification Priority (reorderable), Cascade toggle. All persistent in vault (chmod 600).index.html — page-settings | server.py — /portal-api/settings
- SECSettings persistence — /opt/npm/portal/settings.json auto-created on first boot, chmod 600. SMTP passwords redacted in GET responses. Partial updates supported (POST merges with existing). Audit-logged.server.py — load_portal_settings(), save_portal_settings()
- FEATPage Guide system — Every page header now has a ? button that opens a slide-out panel with: what the page does, what actions are available, quick tips, and export options. Written in plain English for busy operators.index.html — 14 guide buttons, ~23KB of CSS + JS
- FEATExport engine — 16 export functions across the portal. Proxy hosts (CSV/JSON), certificates (CSV), audit log (CSV/JSON), firewall rules, Fail2Ban status, system report, user list (CSV), topology data (JSON), dashboard summary, changelog (HTML), log viewer (clipboard). All exports include timestamps and proper formatting for compliance packages.index.html — Export functions in JS block
- FEATChangelog page — New 16th SPA page with structured version history. Each entry has version number, date, session ID, change items with category badges (FIX/FEAT/PERF/SEC), file paths, and evidence. Known limitations section at bottom.index.html — page-changelog div + sidebar nav
- FIXCMMC Compliance Panel stuck on spinning icons
Dashboard panel never resolved because JS targeted nonexistent element IDcmmc-itemsand used wrong CSS classes. Fixed 4 references: element ID and 3 class names.index.html — Lines 1825, 1851cmmc-items → cmmc-checks | cmmc-icon → check-icon | cmmc-name → check-label | cmmc-sub → check-detail - FIXClassic NPM Admin white screen / API not healthy
Three-layer nginx sub_filter fix. NPM v2.13.6 uses JS backtick template literals for API URLs, React Router needed basename injection, and Vite chunk loader needed base path rewrite.server_proxy.conf — 5 new sub_filter rulesLayer 1: backtick /api/ rewrite | Layer 2: React Router basename="/npm-admin" | Layer 3: Vite VO() base URL resolver - FIXServer 500 on /?native=1
Called undefined function_proxy_npm_raw(). Addedredirectto Flask imports, replaced with redirect to/npm-admin/.server.py — Lines 33, 1162 - FEATDNS Lookup tool implemented
Previously a stub showing "coming in v5." Now calls/portal-api/network/toolwithdig. Output XSS-escaped. Auth usesBearer TOKENpattern matching all other portal API calls.index.html — Line 2564 - PERFRemoved unused Archivo font import
Google Fonts link loaded Archivo (4 weights, ~100KB) but no CSS rule ever referenced it. Removed from link tag, keeping JetBrains Mono.index.html — Line 14 - PERFCSS deduplication — 16 rules removed
7 selectors had 2-4 duplicate definitions. CSS cascade means last definition wins, so earlier copies were dead code. Removed:.f2b-jail×3,.f2b-jail-name×3,.f2b-stat×3,.sys-card×3,.log-viewer×1,.conn-table×1,.sb-section×2. Zero visual change due to cascade.index.html — Multiple lines in CSS block - SECXSS fix in DNS error rendering
DNS lookup error path renderedd.errordirectly into innerHTML without escaping. Added.replace(/</g,'<')to prevent injection from server error messages.index.html — Line 2573 - FIXConnections table monospace font restored
Pre-existing bug: last CSS definition of.conn-tablewas missingfont-family:var(--mono). Network connections were rendering in sans-serif instead of monospace. Added the missing property.index.html — Line 762 - FIXBandwidth section shows informative message
loadBandwidth()was an empty stub causing "Loading..." to display forever. Now shows "Bandwidth monitoring not yet configured for this host."index.html — Line 2596
- FEATFlask-based portal with SPA architecture
Single-page application with 15 integrated pages: Dashboard, Proxy Hosts, Certificates, Wizard, Topology, Audit Log, Documentation, Firewall, Fail2Ban, Log Viewer, System, Network Tools, Settings, Users, Changelog. - SECTwo-step authentication
Step 1: NPM username/password via NPM API. Step 2: Portal TOTP via pyotp. 15-minute sliding session window. Per-IP rate limiting with 5-attempt lockout. - SECSecurity headers
CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cache-Control. All enforced via Flask after_request hook. - FEATCMMC L2 audit logging
5W1H JSONL audit trail: WHO (user + session + IP + UA), WHAT (action), WHEN (UTC), WHERE (resource), HOW (detail). Append-only at/opt/npm/portal/audit.jsonl. - FEATIntegrated NPM proxy
All NPM API calls proxied through/npm-api/*to localhost:81. Supports GET/POST/PUT/DELETE with auth passthrough.
- Classic NPM Admin — sub_filter rules target minified JS variable names (
VG,VO). An NPM container upgrade will change these names and require updatingserver_proxy.conf. - Session keepalive race — If the NPM bearer token expires independently, the portal session remains "valid" until the next real API call triggers a 401.
- Bandwidth monitoring — No backend data source exists. The Network Tools page shows an informational message.