Commit graph

1106 commits

Author SHA1 Message Date
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
d71a72a45d fix(applications): flatten mobile config nav and pin domain save
Replace the collapsible mobile configuration menu with an always-visible
responsive grid, stack the mobile heading, and swap the domain editor
unsaved bar for a sticky Save footer with a scrollable form body.
2026-09-08 22:21:32 +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
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
peaklabs-dev
b81381e85b
fix(profile): show an enabled badge for two-factor authentication 2026-09-08 13:07:40 +02:00
Andras Bacsai
0615c784ac fix(server): remove duplicate Disabled badge from metrics empty state
The metrics-disabled empty state already titles itself "Metrics are disabled", so the extra status badge was redundant. Cover the Sentinel-enabled branch so that badge does not return.
2026-09-08 12:53:57 +02:00
peaklabs-dev
37ddbdc37f
fix(auth): redirect authenticated stale-token login submissions to the dashboard 2026-09-08 12:14:29 +02:00
Andras Bacsai
3271fbdd67 fix(ui): render service domain groups as separate cards
Move the settings-section body class onto each domain group so apps
render as stacked cards instead of a single bordered list. Update the
ServiceDomains view assertions to match.
2026-09-08 11:53:11 +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
22ce20a045 fix(ui): weld the deployment log sidebar to the main sidebar
Remove :flush="true" from the deployment show configuration sidebar so it stays fixed beside the main nav instead of sitting flush in the page layout.
2026-09-08 10:19:22 +02:00
Andras Bacsai
7f25af3785 feat(ui): capitalize button labels and speed depth transitions
Standard buttons now capitalize each word in their labels. Movement and
depth-shadow changes use an 80ms duration while color transitions stay
at 120ms.
2026-09-08 10:14:03 +02:00
Andras Bacsai
0aba440a94 fix(ui): match dark-mode button depth to the regular border
Neutral buttons in dark mode now use a white 8% depth edge so it matches
the regular border. Highlighted buttons keep the accent-mixed edge.
Document the behavior and assert the dark-mode selector in CSS tests.
2026-09-08 09:47:54 +02:00
Andras Bacsai
3ae1eb9d10 feat(ui): add raised hover and pressed depth to standard buttons
Standard .button controls now use a compact 2px bottom edge, lift 1px on
hover, and press down with the depth removed. Highlighted buttons mix the
accent with black for a matching edge, and focus-visible keeps the accent
ring. Other button-like controls still use the lighter scale press.
2026-09-08 09:40:19 +02:00
Andras Bacsai
0afa59bc02 fix(ui): keep settings subnav in-page and persist sidebar collapse
Scroll active application settings sections with buttons instead of Livewire navigation, persist sidebar collapse even with auto-collapse, drop the unused modal id, and right-align destination status.
2026-09-08 09:20:38 +02:00
Aditya Tripathi
6bb8fcd5c7 feat(theme): extract shared Alpine theme controls into components
Introduce theme-controls and theme-controls/picker Blade components
housing the theme/page-width/custom-color logic previously duplicated
in top-user-menu and profile/appearance, and fix custom theme surface
colors to use oklch mixes instead of raw white/black/hex for correct
contrast.
2026-09-08 07:05:01 +02:00
Andras Bacsai
ba30c64d7d
fix(stripe): prevent duplicate subscription checkouts (#11666) 2026-09-07 20:25:06 +02:00
Andras Bacsai
8a03647a70 feat(domains): compact mobile domain rows and isolate preview modals
Show routing summaries on domain tables below 600px instead of squeezing desktop columns. Scope preview add/edit Livewire events by preview id, authorize preview domain actions, and add search plus unsaved-edit handling.
2026-09-07 20:24:46 +02:00
Andras Bacsai
d75881fa96 feat(domains): keep domain drafts and move preview settings
Preserve in-progress domain edits and redirects across Livewire
refreshes, copy www port overrides for service redirect pairs, and
relocate preview deployment toggles from Advanced to Previews.
Unsaved bars can stay dirty via Alpine while a modal is closed, and
service domain tables stack at narrow widths.
2026-09-07 18:29:58 +02:00
Andras Bacsai
b123356acd feat: add backup controls, resource search, and Sentinel enablement
Unify service backup history with pagination, schedule settings actions, S3 destination details, and team-safe access checks. Display server built-ins as read-only variables and add loading and empty states for searchable resources.
2026-09-07 16:46:37 +02:00
Andras Bacsai
183e28682c fix(domains): route Compose domains using service ports
Resolve routing ports per Compose service, preserve legacy embedded ports, and ignore non-TCP declarations.
2026-09-07 15:17:23 +02:00
Andras Bacsai
0b462f6a58
feat(backups): alert when scheduled backups are missing (#11433) 2026-09-07 14:09:42 +02:00
Andras Bacsai
778a698553 fix(api): align service domain validation with UI rules 2026-09-07 14:01:48 +02:00
Andras Bacsai
6293cd418c
feat(backups): stream S3-only volume archives directly (#11642) 2026-09-05 21:10:10 +02:00
Andras Bacsai
08f68016dd
fix(storage): prevent PR suffix dropdown clipping (#11637) 2026-09-05 15:58:12 +02:00
Andras Bacsai
3764771293
fix(webhooks): handle closed PRs after base branch changes (#11634) 2026-09-05 15:18:59 +02:00
Andras Bacsai
b351e94c98
fix(api): return task execution duration as float (#11636) 2026-09-05 15:18:51 +02:00
Andras Bacsai
2a25e0490e
fix(storage): persist S3 settings for new volume backups (#11635) 2026-09-05 15:18:26 +02:00
Andras Bacsai
47c61feb84 fix(api): persist Docker Compose domain ports as overrides
Normalize Compose domains on create and update, retaining explicit ports in
`domain_port_overrides` while storing port-free domain values. Preserve empty
Compose FQDNs and cover both API flows with feature tests.
2026-09-05 14:24:24 +02:00
Andras Bacsai
208f7720bc fix: avoid inherited compose ports and defer archive inspection
Prevent multi-service Compose domains from inheriting the application port, and defer PostgreSQL custom-format archive inspection to pg_restore.
2026-09-05 14:19:38 +02:00
Andras Bacsai
3c0e43f482 feat(settings): configure CDN URL for stored images
Add a persisted instance setting for S3 image CDN URLs and use it when building image links. Cache profile avatars and project icons with immutable one-year headers.
2026-09-04 21:15:06 +02:00
Andras Bacsai
9c3fb1da39 fix(domains): limit instance addresses to localhost DNS hints 2026-09-04 20:56:08 +02:00
Andras Bacsai
5ff2110397 fix(environment-variables): preserve generated Compose variables
Exclude protected Compose variables from bulk deletion and developer views, and propagate deletion failures correctly.
2026-09-04 17:01:42 +02:00
Andras Bacsai
851a902346 fix(domains): preserve removed compose service domains 2026-09-04 16:47:12 +02:00
Andras Bacsai
a04c2ecb44 fix(docker): preserve restart policies when stopping containers 2026-09-04 16:38:24 +02:00
Andras Bacsai
053b030c42 fix: remove database restart limits and clear stale Traefik state
Drop restart-limit fields and enforcement from database resources, clear cached Traefik version data when proxies change, and show missing service environment variables from disabled deploy actions.
2026-09-04 15:42:26 +02:00
🏔️ Peak
7ca584877a
fix: build notification and deployment log links from the instance url (#11623) 2026-09-04 15:20:03 +02:00
Andras Bacsai
51cab061be fix(domains): sync Docker Compose domains for noindex settings 2026-09-04 15:19:21 +02:00
peaklabs-dev
306d4833a9
fix(notifications): build restart limit links from the instance url 2026-09-04 15:03:27 +02:00
peaklabs-dev
6abbf84520
fix(notifications): build api token expiry notification link from the instance url 2026-09-04 14:44:07 +02:00
Andras Bacsai
89a66dd255 fix(service): show disabled deploy action when variables are missing 2026-09-04 06:30:35 +02:00
Andras Bacsai
986ece457d fix(domains): use Compose service ports for internal routing
Detect Docker Compose service ports for domain internal ports and proxy labels, with application ports as a fallback.
2026-09-03 20:38:19 +02:00
Andras Bacsai
1d0d6b4a79 fix(scheduler): run stuck resource cleanup in background at 03:17
Bump the Coolify release version to 4.3.16 and update schedule coverage.
2026-09-03 19:23:08 +02:00
Devin Dissanayaka
45466b5069
fix(notifications): send traefik outdated alerts to the correct topic id (#11526) 2026-09-03 18:35:07 +02:00
Andras Bacsai
b8866b87e8
fix(livewire): authorize exposed resource mutations (#11596) 2026-09-02 19:58:28 +02:00