Open source · Self-hosted · Zero backend

See every attack your server blocks

Real-time fail2ban intelligence. No database. No build step. Just static files.

12,847 Attacks blocked
142 Active bans
67 Countries
View on GitHub

Built for servers, not for clouds

A dashboard that respects your infrastructure. No containers to tune, no databases to back up.

Self-hosted

All data stays on your server. No external telemetry, no third-party dashboards.

No database

Results are written as static JSON. Cron refreshes them on your schedule.

Static web page

Pure HTML, CSS, and JavaScript. Open it with any static file server or directly in a browser.

GeoIP enriched

Attack sources are mapped to countries and cities using the free IP-API tier.

Maps, timelines, and jail reports

Everything you want to know about incoming attacks, organized in one place.

Attack timeline & trends

See attack volume over time with interactive ECharts visualizations and time-range filtering.

World map by source IP

Geo-locate attackers on a world map. Spot patterns by country and region at a glance.

Per-jail breakdown

Dive into each fail2ban jail: top IPs, ban ratio, unique attackers, and configuration.

Recent log entries

Browse and filter recent fail2ban events without leaving the dashboard.

Four moving parts. Zero magic.

The parser reads your logs, GeoIP enriches the IPs, and the static UI renders the JSON.

fail2ban.log
Your existing fail2ban log file is the only data source.
f2b-parse.sh
Aggregates bans, unbans, found events, and jail stats into JSON.
f2b-geoip.sh
Looks up each IP with IP-API and caches results locally.
dashboard/index.html
The static dashboard renders the enriched JSON with ECharts.

Run it in two minutes

Clone the repo to /opt, run the parser once, and open the dashboard. Then add a cron job to keep it fresh.

Clone and prepare

Install into /opt/f2b-dashboard and make the scripts executable.

Parse and enrich

Generate dashboard.json from your logs, then add GeoIP data.

Add to cron

Let the scripts refresh automatically every 5 minutes.

terminal
# Note: installing under /opt/f2b-dashboard requires root privileges. # Run as root, or prefix each command with sudo. # Clone and prepare $ sudo git clone https://github.com/a-lang/f2b-dashboard.git /opt/f2b-dashboard $ cd /opt/f2b-dashboard $ mkdir -p dashboard/data $ chmod +x bin/f2b-parse.sh bin/f2b-geoip.sh # Parse and enrich once $ /opt/f2b-dashboard/bin/f2b-parse.sh /var/log/fail2ban.log /opt/f2b-dashboard/dashboard/data $ /opt/f2b-dashboard/bin/f2b-geoip.sh /opt/f2b-dashboard/dashboard/data/dashboard.json /opt/f2b-dashboard/dashboard/data/geo-cache.json # Add to cron (every 5 minutes) $ crontab -e */5 * * * * /opt/f2b-dashboard/bin/f2b-parse.sh /var/log/fail2ban.log /opt/f2b-dashboard/dashboard/data && /opt/f2b-dashboard/bin/f2b-geoip.sh /opt/f2b-dashboard/dashboard/data/dashboard.json /opt/f2b-dashboard/dashboard/data/geo-cache.json # Serve dashboard/ with any static server $ python3 -m http.server 8080 --directory /opt/f2b-dashboard/dashboard