Architektura
Cely analytics + watchdog stack bezi na existujucej infrastrukture bez externych zavislosti (okrem SendGrid pre emaily).
ASCII diagram
Frontend (Next.js) Server (162.55.89.156)
+----------------------+ +----------------------------+
| useAnalytics() hook |--POST------->| /api/analytics |
| - buffer 50 events | | - visitor upsert |
| - flush 10s / 20+ | | - session create/update |
| - keepalive on hide | | - batch event insert |
| | | - heatmap aggregation |
| Stats page /v3/stats|--GET-------->| /api/analytics/stats |
| | | (admin auth required) |
| Watch UI |--POST------->| /api/watches |
| | | - CRUD watches |
| | | /api/watches/match |
| | | - geo matching engine |
+----------------------+ +----------+-----------------+
|
+----------v-----------------+
| PostgreSQL (portal-db) |
| analytics_visitors |
| analytics_sessions |
| analytics_events |
| analytics_heatmap |
| analytics_watches |
| watch_notifications |
+----------+-----------------+
|
+----------v-----------------+
| Grafana (:3002) |
| - auto-provisioned PG |
| - internal dashboards |
+----------------------------+
Email flow (buduce):
+---------------------------------------------+
| Cron/Trigger -> Match -> Puppeteer screenshot |
| -> /internal/watch-map -> PNG -> SendGrid API |
+---------------------------------------------+