Commit Graph
32 Commits
Author SHA1 Message Date
Andras Bacsai 936a2566c6 fix(analytics): hide traffic UI when disabled and skip default-on (#11700) 2026-09-09 14:28:15 +02:00
Andras Bacsai 327842a75c style(analytics): use coollabs-base KPI tiles and fix chevron-down
Switch analytics overview cards and skeleton tiles from white/base
backgrounds to --coollabs-base, show metric labels on skeletons, and
replace the scaled chevron-down path with a 24px polyline. Update
feature tests for the new tile classes and icon.
2026-09-08 14:40:39 +02:00
Andras Bacsai 16ec32cf65 style(dashboard): apply surface treatment to analytics KPI cards
Add a light/dark ring around the dashboard analytics KPI group and use canvas-tinted dark card backgrounds instead of dark:bg-base so the cards match other dashboard surfaces.
2026-09-08 14:26:39 +02:00
Andras Bacsai f17cdc1c74 feat(analytics): add server analytics page and split settings
Add a per-server Analytics page scoped to that host, move traffic
settings out of Sentinel, and put metrics settings on Charts.
Surface 4xx/5xx on path rows and restyle deployment logs.
2026-09-08 14:20:41 +02:00
Andras Bacsai bd7d0b5de1 feat(charts): show local and UTC times in metric tooltips
Chart tooltips now list the viewer's local time and UTC with short
timezone names, instead of a UTC-only stamp. Also add a little left
padding on the traffic requests chart so axis labels are not clipped.
2026-09-08 13:31:40 +02:00
Andras Bacsai a25231683e feat(analytics): add chart categories, loading states, and apply action
Pass series bucket timestamps to sparkline payloads so charts align with the selected range. Show loading overlays on analytics filters and range tabs, restyle the analytics header, and replace Sentinel custom-image autosave with an Apply and restart button so the unsaved bar no longer flashes.
2026-09-08 13:24:39 +02:00
Andras Bacsai 498d9b9b2c fix(sentinel): mount dev proxy volume for local traffic logs
Use the Coolify data volume path in local env so Sentinel can read access.log instead of the production proxy path. Cover the directory and TRAFFIC_ACCESS_LOG_PATH in tests.
2026-09-07 22:31:17 +02:00
Aditya Tripathi dd422e6608 fix(traffic-analytics): clear stale chart and cache dashboard 404s
- Dispatch the chart refresh event even when loadData() finds no
  overviews, so a wire:ignore'd chart flips to its no-data state
  instead of keeping stale data.
- Cache dashboard-route absence for 60s in SentinelTrafficClient so
  older Sentinel installs that 404 the dashboard endpoint aren't
  re-probed over SSH on every refresh within the same window.
- Make Pest's loadLazy() throw when no __lazyLoad trigger is found
  instead of silently testing the un-mounted placeholder.
2026-08-22 11:42:41 +00:00
Aditya Tripathi 19752da6af feat(analytics): lazy-load traffic pages and batch Sentinel calls
- Mark Analytics, Dashboard\TrafficAnalytics and Project\Application\Analytics
  Livewire components #[Lazy] with skeleton placeholder() views so pages render
  instantly while Sentinel data loads in a deferred request
- Add SentinelTrafficClient::prefetchServerWide() to warm all server-wide
  endpoints in a single batched docker exec instead of ~14-15 serial SSH
  round-trips, and refactor overview/paths/breakdown URL building into shared
  helpers
- Cap per-app leaderboard overviews fetched via MAX_LEADERBOARD_APPS to bound
  requests on servers with many apps
- Add hasRequestSeries() to detect empty request charts and render a no-data
  state instead of a blank chart
- Gate ServerSetting's automatic Sentinel restart on is_sentinel_enabled so
  tuning geoip/traffic settings no longer silently enables Sentinel
- Add reusable skeleton UI components (skeleton, skeleton/table, skeleton/tiles)
  for the new placeholder views
2026-08-22 11:13:49 +00:00
Aditya Tripathi 7c01f63f53 fix(traffic-analytics): stop leaking geoip key and gate sentinel restart
- Only send GEOIP_MAXMIND_LICENSE_KEY to Sentinel when GeoIP is enabled
- Skip restarting Sentinel when disabling analytics unless it was already running
- Validate Sentinel API responses are JSON objects before reading them
- Restore "live" toggle state from localStorage instead of only disabling it
- Use content-based wire:key for breakdown/path rows instead of loop index
- Add missing Kosovo country code and require update permission for geoip listbox
2026-08-21 11:22:36 +00:00
Aditya Tripathi d887d1cbdc fix(dashboard): remove traffic analytics enablement nudge
Drop the dashboard banner that prompted enabling traffic analytics
on eligible servers. Keep nudge coverage on the analytics page and
update tests accordingly.
2026-08-20 10:40:45 +00:00
Aditya Tripathi 825a5206ad feat(traffic): add traffic and GeoIP Sentinel config settings
Expose top-n, sampling threshold, retention, and GeoIP options on
server settings; pass them into Sentinel env and the API/UI.
2026-08-13 07:58:51 +00:00
Aditya Tripathi b436a7a814 feat(traffic): split traffic chart into requests and status codes
Replace the stacked status-over-time chart with a single requests
area series and a separate status-codes breakdown. Add p95 latency
sparklines to KPI cards, wire requests/latency into chart payloads,
and hide live refresh outside the 24h range.
2026-08-12 18:05:28 +00:00
Aditya Tripathi 415489632b feat(traffic): add bandwidth and visitor sparklines to KPI cards
Extend TrafficSeriesBucketData with requests, bytesIn, bytesOut,
uniqueVisitors, and p95 fields, and aggregate them per bucket in the
global, dashboard, and application analytics Livewire components.
Add bandwidthSpark() and uniquesSpark() to BuildsTrafficChartPayload
and wire them into the chart payloads and blade views.

Also add a compactNumber() helper for dense metric columns, a
--chart-spark-bandwidth CSS variable, and improve the traffic globe
with focus/resume controls, shortest-path angle interpolation, and
brighter base/marker theme colors.
2026-08-12 15:55:34 +00:00
Aditya Tripathi a74eaa49a6 feat(traffic): replace world map with interactive globe visualization
Swap the static world-map partial for a cobe-based 3D globe
(traffic-globe.js) driven by per-country marker data. Extract shared
sparkline/device/geo derivations into BuildsTrafficChartPayload and
reuse it across global, dashboard, and per-application analytics
components. Add device-donut, hosts-list, and sparkline partials, and
extend breakdown dimensions with protocol/cache/status. Default live
refresh to off until manually armed.
2026-08-12 09:31:05 +00:00
Aditya Tripathi a5cfa7c238 feat(traffic): add global analytics page with status time series
Replace the server-scoped Analytics Livewire component with an
app-wide one that filters by server/application and supports live
refresh. Add a per-bucket status-class time series endpoint/data
class for a stacked-area chart, falling back to the donut when the
Sentinel build doesn't support it. Decorate top-path rows with their
owning domain, expand breakdown dimensions to agent/ip/useragent, and
raise path/breakdown result limits. Capture X-Forwarded-For,
User-Agent, and Referer headers in traefik access logs (now enabled
in dev too) so IP, browser, and referrer breakdowns work. Add
flag-image and referer-host helpers for geo/referrer rendering.
2026-08-12 08:50:58 +00:00
Aditya Tripathi 872f8aafb8 feat(traffic): add live refresh, geo maps, and app overview widget
- Add live 24h polling toggle to server/application analytics views
- Add geo visualization (world map, country flags/names) for traffic
- Add dashboard nudge for servers eligible but not yet analytics-enabled
- Add lazy-loaded TrafficOverview widget to application General page
- Default-enable traffic analytics on new eligible server settings
- Rotate Caddy access logs via lumberjack roll options
- Add Traefik logrotate sidecar for copytruncate access-log rotation
2026-08-11 10:55:50 +00:00
Aditya Tripathi 0c06b5e0d1 fix(traffic): validate sentinel app keys, gate caddy log volume + swarm toggle, null-safe link 2026-08-11 03:32:16 +00:00
Aditya Tripathi d1f6fd4906 fix(traffic): show empty-state when all dashboard analytics fetches fail 2026-08-10 20:46:42 +00:00
Aditya Tripathi 70f7d7452e feat(traffic): add team dashboard traffic analytics 2026-08-10 20:41:08 +00:00
Aditya Tripathi 3e7972349d feat(traffic): add server analytics view 2026-08-10 20:32:31 +00:00
Aditya Tripathi 3439f0fe63 feat(traffic): add application analytics view 2026-08-10 20:23:24 +00:00
Aditya Tripathi 045a222164 feat(traffic): add server traffic analytics toggle
Adds toggleTrafficAnalytics() to the Sentinel settings component (restarts
proxy + recreates Sentinel via ConfigureTrafficAnalytics), plus an optional
MaxMind GeoIP license key field, with a wire:confirm warning about the
brief connectivity blip.
2026-08-10 20:09:04 +00:00
Aditya Tripathi 94e5da192a feat(traffic): add team traffic aggregation service
Implements pure service to sum traffic overviews across multiple servers
for team dashboard. Additive fields (requests, bytes, statuses) are summed;
latency percentiles take the max and are flagged approximate when
aggregating multiple servers.
2026-08-10 20:00:37 +00:00
Aditya Tripathi 9ad210c7b0 feat(traffic): cache Sentinel traffic responses for 60s 2026-08-10 19:58:13 +00:00
Aditya Tripathi 2ce3bce608 feat(traffic): add Sentinel traffic pull client 2026-08-10 19:52:17 +00:00
Aditya Tripathi b4a5236e4e feat(traffic): add traffic analytics DTOs 2026-08-10 19:46:39 +00:00
Aditya Tripathi 859258e0a1 feat(traffic): add enable/disable orchestration action
Adds ConfigureTrafficAnalytics::run(Server, bool) which sets the
is_traffic_analytics_enabled flag, force-regenerates the proxy config,
dispatches RestartProxyJob, and recreates Sentinel with restart: true.
2026-08-10 19:41:18 +00:00
Aditya Tripathi 1ce21d7174 feat(traffic): pass traffic env + proxy log mount to Sentinel 2026-08-10 19:35:01 +00:00
Aditya Tripathi bb7ad7ab12 feat(traffic): stamp coolify_app_id + JSON access log on Caddy sites 2026-08-10 19:27:57 +00:00
Aditya Tripathi e8e651bd7e feat(traffic): enable Traefik JSON access log when analytics on 2026-08-10 19:19:42 +00:00
Aditya Tripathi 99b25fbd8a feat(traffic): add traffic analytics server settings 2026-08-10 19:15:46 +00:00