Commit Graph
2294 Commits
Author SHA1 Message Date
Aditya Tripathi faca466cd6 fix(metrics): align fleet series by time bucket, harden fleet page inputs
Address review findings on the fleet metrics page.

Data correctness:
- bucket raw Sentinel samples into epoch-aligned windows (5m/30m/2h per range)
  and average them, replacing per-server LTTB. Every server now reports the
  same bucket timestamps, so the fleet sums add up point by point instead of
  zigzagging between servers (and RX+TX really combine)
- keep only the root mount in disk history, matching HasMetrics::getDiskMetrics
- leave sparkline gaps as null instead of 0, so absent samples read as gaps

Robustness:
- normalize containerMetric in mount()/updatedContainerMetric(), so
  /metrics?cmetric=foo no longer throws an undefined array key
- include the server uuid in the container row wire:key; system containers
  share one Sentinel id across servers
- round the range start to the minute so the 60s history cache can hit
- cap the Sentinel curl with --max-time 10, so one hung request cannot stall
  the serial per-server loop

UI:
- pass the spark time axis on first paint, so tooltips no longer show 1970
- show the active series name (RX/TX) in the server network chart tooltip
2026-09-18 07:44:22 +00:00
Aditya Tripathi ab436942c9 feat(metrics): polish fleet + server metrics UI/UX
Refine the /metrics fleet page and align the per-server metrics page with it.

Fleet overview:
- add live sparklines to the CPU/Memory/Disk/Network KPI tiles (shared axis,
  capped to ~40 points per sparkline)
- fill the Servers online + Containers tiles (fleet-health bar, hottest
  container) so all six tiles read as one system
- scope-aware labels: drop the "Fleet" prefix and helper copy when a single
  server is selected

Trend charts:
- hero layout: CPU spans full width, the other four form a 2x2 grid
- apply the same hero layout + skeleton to the per-server page for consistency

Hottest containers table:
- add a rank column and a per-row magnitude bar scaled to the busiest container
- fix a leaked Blade @break directive that rendered literally and forced
  horizontal scroll on the Network tab
- keep the value column a fixed width so bars align across rows

Live refresh:
- add analytics-style loading feedback to the range tabs and server filter
- stable wire:key on table rows + width transitions on bars so data glides
  on live refresh instead of snapping

Generalize the shared _sparkline partial (optional color/label/format) so it
serves non-traffic metrics without changing analytics behaviour.
2026-09-17 06:30:59 +00:00
Aditya Tripathi 90e6efadad fix(metrics): rAF chart render, container image resolution, tab loading state, hi-fi skeleton 2026-09-16 09:29:32 +00:00
Aditya Tripathi 6b0c97211a fix(metrics): downsample history, re-rank containers without refetch, add live refresh 2026-09-16 09:18:05 +00:00
Aditya Tripathi 2aa656bece refactor(metrics): mirror analytics header/overview card, declutter KPI tiles 2026-09-16 08:49:20 +00:00
Aditya Tripathi f3fdee90da feat(metrics): add disk/network/load charts to the per-server metrics page 2026-09-16 08:43:37 +00:00
Aditya Tripathi 9fced09bd1 fix(metrics): div-grid tables, chart initial render, metrics skeleton, graph icon 2026-09-16 08:39:14 +00:00
Aditya Tripathi 6b9086795f feat(metrics): render fleet KPIs, tables, and trend charts 2026-09-16 08:05:41 +00:00
Aditya Tripathi 5273a4c035 feat(metrics): build and dispatch fleet trend chart payloads 2026-09-16 08:01:11 +00:00
Aditya Tripathi fb021c3d9d feat(metrics): populate fleet KPIs, server rows, and container ranking 2026-09-16 07:58:55 +00:00
Aditya Tripathi dbcef807ae feat(metrics): add reachable /metrics fleet page skeleton 2026-09-16 07:54:34 +00:00
github-actions[bot] 69d1e89ac2 Merge remote-tracking branch 'origin/main' into next 2026-09-16 03:14:20 +00:00
Andras Bacsai ab30f95ad9 feat(restarts): make resource restart limits opt-in
Default restart limits to zero for applications, previews, and services, and bump the Coolify version to 4.3.21.
2026-09-15 12:58:59 +02:00
Andras Bacsai 2c1744fbd2 Merge remote-tracking branch 'origin/next' into pr-11784-automation/sync-main-to-next 2026-09-14 13:30:17 +02:00
Andras Bacsai 6a8cee4630 Merge remote-tracking branch 'origin/next' into automation/sync-main-to-next 2026-09-14 13:26:19 +02:00
Andras Bacsai 7d11bc92f7 feat(logs): accept all for log lines and keep -1
API log endpoints and the GetLogs UI now treat `all` as unbounded
output, with `-1` remaining as a compatibility alias. MCP still
falls back to a positive default. Traefik version checks run from
CheckForUpdatesJob instead of a weekly schedule.
2026-09-13 15:25:20 +02:00
Andras Bacsai 6f58ad4b97 fix(backups): keep service DB context after deleting a schedule
Cache the related database before deleting the backup so authorization,
server lookup, and the service redirect do not touch a deleted morph.
Skip rendering after delete and cover the service-database path.
2026-09-12 08:54:17 +02:00
Andras Bacsai fc9e61b7b4 feat(services): open resource settings in a modal with restart limits
Move service application and database settings into an embedded modal with a footer, subtitle helper, and Docker restart-count control. Accept max_restart_count on the service applications API, cap compose YAML collection aliases, and tighten status, backup, and database sidebar layouts.
2026-09-10 17:39:56 +02:00
Andras Bacsai d24ee35824 fix(s3): allow uppercase letters in S3 bucket names
S3-compatible and legacy buckets may include uppercase letters. Relax the bucket name pattern, validation messages, and tests so those names are accepted while still rejecting invalid characters and formats.
2026-09-10 15:12:53 +02:00
Andras Bacsai 6028461f92 fix(domains): unify editing and queued DNS checks
Add indexing, redirect, and hostname regeneration controls to domain editors. Queue DNS checks only for scheme or hostname changes and show progress consistently across application, service, and preview domains.
2026-09-10 14:00:50 +02:00
Andras Bacsai 36befcfecd fix(service): avoid storing inherited ports as overrides 2026-09-10 12:08:06 +02:00
Andras Bacsai d85a7800fa feat(notifications): allow toggling restart-limit email events
Add restartLimitReached to the notification event toggle list so admins can disable restart-limit email notifications. Cover the toggle with an authorization test.
2026-09-10 09:06:17 +02:00
peaklabs-dev 9faa4f4b7c Merge branch 'main' into next 2026-09-09 15:32:27 +02:00
peaklabs-dev 6ad739a53c feat(docker): limit container name prefixes to 30 characters 2026-09-09 15:01:57 +02:00
peaklabs-dev 7efece06c4 feat(ui): add container name prefix to application container settings 2026-09-09 15:01:57 +02:00
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 7109a11826 fix: queue import cleanup and scope DNS record updates
Move database import temp/container cleanup into a queued listener with retries, and clear the import running state on failed restore starts. Tighten Cloudflare replace/delete to the current server IP and owning resource, notify when DNS jobs fail, and pass domain-removal confirmation through remove-by-key. Document import request oneOf schemas without extra properties.
2026-09-09 13:43:56 +02:00
Andras Bacsai 27bb601e66 fix(dns): skip auto DNS jobs when server IP is invalid
ConfigureDnsRecordJob requires a string content value. Guard
configureDnsAfterDomainAdd with the same blank and FILTER_VALIDATE_IP
checks used by createManagedDnsRecord so a missing or hostname-only
server address cannot TypeError after the domain is saved.
2026-09-09 13:07:55 +02:00
Andras Bacsai 4accae95b5 feat(database): add replace-existing option for PostgreSQL restores
Allow single-database PostgreSQL imports to drop matching objects before restore. The API and import form accept replace_existing, which adds --clean --if-exists to pg_restore, and pg_restore now uses --exit-on-error.
2026-09-09 11:48:17 +02:00
Andras Bacsai ab3b3926aa feat: add database import API and Cloudflare DNS management
Queue database imports from upload, S3, or server paths via REST, and
manage Cloudflare DNS records from integration tokens and domain UIs.
2026-09-09 11:14:22 +02:00
Andras Bacsai 424dbd36ff feat(sentinel): make sentinel mandatory on regular servers
Remove the enable/disable toggle from the server UI, logs page, and
Sentinel API so is_sentinel_enabled is derived and read-only. Enable
existing regular servers via migration, start Sentinel after validate-
and-install, and drop the daily ServerManagerJob restart.
2026-09-09 06:30:32 +02:00
Andras Bacsai b39928d631 fix: support generic SSH Git usernames (#11685) 2026-09-08 20:51:15 +02:00
Andras Bacsai 83714ea395 fix(git): parse generic scp-style SSH URLs with custom users
Centralize scp-style Git URL parsing so user@host:path (including custom
usernames and embedded ports) is accepted and converted to HTTPS for
public clones, API create, webhooks, validation, and commit/branch links.
2026-09-08 20:33:45 +02:00
peaklabs-dev d25edb8551 fix(terminal): distinguish application containers across servers 2026-09-08 19:43:05 +02:00
Florian Pfitzer e9bf2551ed fix: support generic SSH Git usernames 2026-09-08 16:11:56 +02:00
Aditya Tripathi e52390ec03 fix(team): resolve stored team on deletion and impersonation
Use resolveStoredTeam() instead of teams()->first() when picking the
next active team after a team deletion or when an admin switches into
a user's account, so a valid stored preference wins over an arbitrary
first team. DeleteTeam now returns null when the deletion leaves the
owner with multiple teams, deferring to the selection screen instead
of guessing. refreshSession also stops persisting current_team_id
while impersonating, so viewing another user's account no longer
overwrites their real last-active team.
2026-09-08 14:44:42 +02:00
Aditya Tripathi f511921895 fix(teams): guard current_team_id clear against concurrent writes
Make clearStoredTeamIfMatches perform an atomic conditional UPDATE
so a concurrent team switch isn't clobbered, and call it for the
deleting owner in DeleteTeam so their stored team id doesn't point
at a deleted team. refreshSession now falls back to
resolveStoredTeam() instead of an arbitrary first team. Add a
return type to SelectTeam::render() and tests covering owner
deletion and concurrent-selection preservation.
2026-09-08 14:44:39 +02:00
Aditya Tripathi 2b92fb86b5 fix(teams): clear stale current_team_id when membership ends
Reset the user's persisted current_team_id when they are removed from
a team, when their team is deleted, or when refreshSession finds no
team left, so a dangling reference is never restored on next login.
2026-09-08 14:44:39 +02:00
Aditya Tripathi 12498b4b86 feat(teams): persist active team and add team selection screen
Add current_team_id to users so the last active team is restored on
login instead of always defaulting to the personal team. When a user
belongs to multiple teams and has no valid stored choice, redirect
them to a new team.select screen (SelectTeam Livewire component) to
pick one, rather than silently choosing the first team. Update
Fortify and OAuth login flows to use the new resolveStoredTeam()
logic.
2026-09-08 14:44:39 +02:00
Andras Bacsai c927df0a1d Merge remote-tracking branch 'origin/next' into coolify-analytics-traefik-caddy 2026-09-08 14:28:24 +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 9708b78bee Merge remote-tracking branch 'origin/next' into automation/sync-main-to-next
# Conflicts:
#	resources/css/app.css
2026-09-08 13:47:44 +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 f359778115 Merge remote-tracking branch 'origin/next' into coolify-analytics-traefik-caddy
# Conflicts:
#	resources/views/components/forms/listbox.blade.php
2026-09-08 11:55:49 +02:00
Andras Bacsai 4a3dc11958 feat(ui): polish env editor, error buttons, and modal layout 2026-09-08 11:49:02 +02:00
Andras Bacsai abc701ac65 fix(application): allow general saves with wildcard domains (#11683) 2026-09-08 10:23:51 +02:00
Andras Bacsai 4cb806b472 feat(ui): move preview deployment toggle into section actions
Replace the preview deployments listbox with an Enable/Disable action
button that calls togglePreviewDeployments and persists the setting.
2026-09-08 10:21:34 +02:00
Andras Bacsai 09e9822264 Merge remote-tracking branch 'origin/next' into automation/sync-main-to-next
# Conflicts:
#	app/Actions/Database/StartDatabase.php
#	app/Models/StandaloneClickhouse.php
#	app/Models/StandaloneDragonfly.php
#	app/Models/StandaloneKeydb.php
#	app/Models/StandaloneMariadb.php
#	app/Models/StandaloneMongodb.php
#	app/Models/StandaloneMysql.php
#	app/Models/StandalonePostgresql.php
#	app/Models/StandaloneRedis.php
#	resources/views/livewire/project/shared/storages/all.blade.php
#	tests/Feature/PersistentStorageVolumesLayoutTest.php
#	tests/Feature/UserSeederTest.php
2026-09-08 10:02:12 +02:00
Andras Bacsai c68259cddf Merge remote-tracking branch 'origin/next' into coolify-analytics-traefik-caddy 2026-09-07 20:28:42 +02:00
Andras Bacsai ba30c64d7d fix(stripe): prevent duplicate subscription checkouts (#11666) 2026-09-07 20:25:06 +02:00