DEV Community

Cover image for I got tired of grepping auth.log — so I built a live SSH attack dashboard in Go + Vue 3
Piotr Mora
Piotr Mora

Posted on

I got tired of grepping auth.log — so I built a live SSH attack dashboard in Go + Vue 3

Your VPS is being attacked right now. Thousands of SSH brute-force
attempts per day, and all you get is this:

Mar 02 03:14:07 sshd: Failed password for root from
185.220.101.45 port 54321

So... I built PewPew to turn that noise into signal.

## What it looks like

One binary. Drop it on your server, open localhost:9090, and you get:

  • Live attack map — animated arcs from attacker's country to your server, WebSocket-powered
  • Top attackers — leaderboard with attempt count, country, one-click UFW ban
  • Open ports — exposed services with risk assessment
  • Hardening recommendations — based on your actual server state
  • System status — firewall backend, DB size, uptime

The embed.FS trick (my favorite part)

The entire Vue 3 SPA is embedded inside the Go binary:

//go:embed static/dist
var staticFiles embed.FS
Enter fullscreen mode Exit fullscreen mode

Single file. ~20MB. No Node in production. No docker-compose.
No config files. Just:

./bin/pewpew start

How the SSH tailer works

Most tools load the entire log file into memory. PewPew uses a
streaming reader that:

  1. Opens auth.log and seeks to EOF — only reads new lines
  2. Detects logrotate: if the file shrinks or inode changes, reopens the new file without missing a line
  3. Batches events every 500ms before writing to SQLite — avoids write amplification on small VPS

The parser uses regex to extract: event type, IP, username,
port from each line. Handles Failed password, Invalid user,
Accepted publickey, kex errors and disconnects.

WebSocket broadcaster

One goroutine tails the log. N dashboard clients connect via
WebSocket. The broadcaster pattern fans out events:

tail goroutine → channel → broadcaster → []client connections

No mutex on the client list — channels handle the concurrency.

Stack

Go 1.22 · Vue 3 + Vite · SQLite · WebSocket · UFW integration

Clean Architecture · ~20MB RAM · MIT

Get it

https://github.com/awakeelectronik/pewpew

Early stage. I'm actively building — next up: real GeoIP with
MaxMind GeoLite2, auth, and auto-ban rules.

What monitoring features would you want on your VPS dashboard?``

Top comments (1)

Collapse
 
awakeelectronik profile image
Piotr Mora

If you found this useful, I'd love to hear what monitoring features you'd want on a self-hosted security dashboard —
drop a comment below.