Commit graph

1031 commits

Author SHA1 Message Date
Andras Bacsai
58af19b378
fix(auth): enforce policies across API and Livewire (#8628) 2026-06-15 13:18:29 +02:00
Andras Bacsai
dfd4d7e802 feat(resource-details): make copy fields visible and accessible 2026-06-15 13:17:53 +02:00
Andras Bacsai
371eb1e38c fix(upgrade): hide upgrade labels in collapsed sidebar 2026-06-15 12:56:19 +02:00
Andras Bacsai
22d05c78aa Merge remote-tracking branch 'origin/next' into ghe-support-helpers 2026-06-15 12:55:34 +02:00
Andras Bacsai
507a8afa20 fix(github): sync app slug before generating installation path 2026-06-15 12:55:29 +02:00
Andras Bacsai
b9bda7301a Merge remote-tracking branch 'origin/next' into fix-ghe-app-install-url 2026-06-15 12:55:08 +02:00
Andras Bacsai
d2deaa8363 fix(auth): restrict Sentinel access and register S3 policy 2026-06-15 12:31:30 +02:00
Andras Bacsai
2ebe2e8dbb Merge remote-tracking branch 'origin/next' into api-sensitive-data-scrubber 2026-06-15 12:30:15 +02:00
Andras Bacsai
46a9578d69 test: align mobile application actions expectations 2026-06-15 12:06:54 +02:00
Andras Bacsai
78d8afa602 Merge remote-tracking branch 'origin/next' into audit-policies 2026-06-15 12:05:19 +02:00
Andras Bacsai
9302a49bbf Merge remote-tracking branch 'origin/next' into 10633-invitation-link-redirect 2026-06-15 11:58:03 +02:00
Andras Bacsai
45d9426690 test(auth): expect invitation link to use auth.link route 2026-06-15 11:55:03 +02:00
Osamaali313
74b1077010 fix: accept underscores in domain hostnames for API URL validation
PHP's FILTER_VALIDATE_URL rejects underscores in the host, so domains
like https://myapp_service.example.com were rejected by the API and
never got a Let's Encrypt certificate. Add an isValidDomainUrl() helper
that validates a copy with underscores replaced by hyphens, and route
domain validation in the Applications and Services API controllers
through it.

Fixes #10597
2026-06-13 22:46:04 +03:00
Andras Bacsai
52739141ee
fix(previews): clean up closed PR previews after update failures (#10180) 2026-06-12 20:08:34 +02:00
Andras Bacsai
403f8abcb4 Merge remote-tracking branch 'origin/next' into fix-ghe-app-install-url 2026-06-12 20:02:23 +02:00
Andras Bacsai
78d7291929 fix(github): keep provided api_url on GitHub app updates 2026-06-12 19:56:13 +02:00
Andras Bacsai
4f509c02be fix(auth): validate invitation magic link tokens
Accept invitation links across configured public origins while still
rejecting stored invitations whose token no longer matches.
2026-06-12 16:17:45 +02:00
Andras Bacsai
442ed98169 feat(project): add mobile action controls for resources
Show restart, stop, redeploy, and update actions directly in the mobile
headers for applications, databases, and services, with coverage for the
mobile resource menu behavior.
2026-06-12 16:09:26 +02:00
Andras Bacsai
1aca7ead8c fix(logs): constrain activity monitor output width 2026-06-12 16:06:20 +02:00
Andras Bacsai
61d2d17f52 feat(subscription): add Stripe action controls
Add subscription action handling and tests for cancel, resume, and refund flows while resolving StripeClient through the container.
2026-06-12 15:54:21 +02:00
Andras Bacsai
018d267b3f
fix(service): limit Grafana extra fields to Grafana images (#10562) 2026-06-09 22:16:52 +02:00
Andras Bacsai
ee74889f19 feat(resources): show mobile action buttons 2026-06-09 18:45:06 +02:00
Andras Bacsai
281184c040 fix(github): derive app API URLs from HTML hosts
Normalize GitHub organization values and derive API URLs for GitHub.com,
GHE.com, and enterprise hosts when creating or updating GitHub Apps.
2026-06-09 18:31:06 +02:00
Andras Bacsai
bc2c6068ea fix(github): sync app slug before building install URL
Move GitHub App JWT generation and slug synchronization into shared helpers so installation URLs use the canonical GitHub slug. Encode GHE organization path segments and keep the app-scoped fallback for blank organizations.
2026-06-09 15:27:35 +02:00
Andras Bacsai
96adf9b0f4 Merge remote-tracking branch 'origin/next' into fix-ghe-app-install-url 2026-06-09 15:26:44 +02:00
Cornelis Terblanche
3f46710309 Refine cloud provider token form 2026-06-08 18:38:08 +02:00
vuguul
5e37024f10 fix(git): use cloud install path for ghe apps 2026-06-06 17:23:22 -06:00
vuguul
4c77504b5e fix(service): limit Grafana extra fields to Grafana images 2026-06-05 14:29:29 -06:00
Andras Bacsai
a9d9bfdbe3 feat(resources): add responsive mobile navigation menus
Unify application, database, and service headings with mobile-friendly
resource menus, route-aware configuration tabs, and confirmation triggers for
advanced actions. Standardize restart warnings with status badges and cover the
responsive menu and badge rendering behavior with feature tests.
2026-06-05 14:57:57 +02:00
Andras Bacsai
51583069f4 feat(status): unify resource status badges
Introduce a shared status badge component and reuse it across resource status views, service cards, and the server navbar. Replace icon-only refresh controls with consistent badge buttons and cover the new status layout with feature tests.
2026-06-05 13:31:20 +02:00
vaguul
63ba33261b fix(api): allow source commit build setting 2026-06-04 17:51:17 -06:00
Andras Bacsai
70eda65d19 fix(api): hide nested server secrets from read tokens
Require read:sensitive for nested server logdrain and sentinel fields in
application and database API responses.

Limit deployment configuration column migration SQL to PostgreSQL.
2026-06-04 16:51:52 +02:00
Andras Bacsai
7053f560c5 chore(navbar): replace theme selector with cycle button 2026-06-04 15:41:38 +02:00
Andras Bacsai
2fcc42b0a9 Merge remote-tracking branch 'origin/next' into api-sensitive-data-scrubber 2026-06-04 15:27:32 +02:00
Andras Bacsai
22f9f96db6 chore: inspect staged changes for commit message 2026-06-04 15:24:53 +02:00
Andras Bacsai
8a2373e49f fix(ui): standardize permission denial callouts 2026-06-04 11:37:16 +02:00
Andras Bacsai
5973bb4d4f fix(security): hide notification secrets from non-admins
Prevent users without update permission from reading notification credentials and manual webhook secrets in Livewire state or rendered forms.
2026-06-04 11:24:19 +02:00
Andras Bacsai
062ad57740 fix(security): enforce team access on mutable actions
Authorize cloud provider token access, audit sensitive operations, and
standardize public IDs across deployment and resource flows.
2026-06-04 11:03:06 +02:00
Andras Bacsai
b01c2dd52b Merge remote-tracking branch 'origin/next' into api-sensitive-data-scrubber 2026-06-04 10:58:07 +02:00
Andras Bacsai
9dca7ca351 Merge remote-tracking branch 'origin/next' into audit-policies 2026-06-04 10:18:54 +02:00
Andras Bacsai
981b670eb4 feat(services): show template update timestamps 2026-06-04 09:34:11 +02:00
Cornelis Terblanche
f7150a1d6c Fix Vultr power controls for stopped instances 2026-06-03 21:32:18 +02:00
Cornelis Terblanche
94abbe1590 Add Vultr cloud provider integration 2026-06-03 21:32:18 +02:00
Andras Bacsai
33f3a0b100
fix(git): write deploy key to per-deployment path, not root's id_rsa (#10440) 2026-06-03 15:09:45 +02:00
Andras Bacsai
bc165f1976 fix(postgres): preserve Coolify image tag during upgrade
Keep the running Coolify image tag when restarting the stack after
PostgreSQL upgrade or rollback so compose does not fall back to latest.
2026-06-03 14:54:23 +02:00
Andras Bacsai
e39a9ad827 fix(git): use deploy key path for PR fetches 2026-06-03 14:39:05 +02:00
Andras Bacsai
08735e6cc8 feat(postgres): add internal database upgrade script
Publish upgrade-postgres.sh with install and upgrade flows, include the
PostgreSQL compose override when present, and sync the script to BunnyCDN.
2026-06-03 14:27:01 +02:00
Andras Bacsai
3eb5463e3e Merge remote-tracking branch 'origin/next' into fix/deploy-key-dedicated-path-race 2026-06-03 14:00:34 +02:00
Andras Bacsai
f8960f44fa
fix(api): apply private_key_uuid in update_server (#10416) 2026-06-03 13:49:36 +02:00
Andras Bacsai
217541a987 fix(api): allow disabling build server mode 2026-06-03 13:48:31 +02:00
Andras Bacsai
acc929a7b0
feat(ui): add search functionality for environment variables (#10421) 2026-06-03 13:48:03 +02:00
Andras Bacsai
1802522c60 fix(env-vars): treat search wildcards literally
Escape SQL LIKE wildcard characters in environment variable searches and hide production or preview sections when the filtered results are empty.
2026-06-03 13:43:26 +02:00
Andras Bacsai
c329749c74
fix(logs): html tags is removed in log viewer (#10346) 2026-06-03 13:40:53 +02:00
Andras Bacsai
09d8ba0d89 fix(api): prevent partial server updates on invalid disk schedule 2026-06-03 13:03:12 +02:00
Andras Bacsai
36d44faaf9 fix(git): apply HTTP transport config to PR checkouts 2026-06-03 12:59:45 +02:00
Andras Bacsai
ffe37fc892 Merge remote-tracking branch 'origin/next' into 5251-large-repo-deploy-bug 2026-06-03 12:56:27 +02:00
Andras Bacsai
d7524a743d fix(env-vars): show single empty state for searches
Move the environment variable search field above the production section
and hide production and preview headings when a search has no results.
2026-06-03 12:54:50 +02:00
Andras Bacsai
d300ddf902 Merge remote-tracking branch 'origin/next' into feat/search-to-envs 2026-06-03 12:47:37 +02:00
Andras Bacsai
46e70597e6 Merge remote-tracking branch 'origin/next' into fix/escape-html-log 2026-06-03 12:46:12 +02:00
Andras Bacsai
b3f3ddf0ce Merge remote-tracking branch 'origin/next' into fix/api-update-server-private-key 2026-06-03 12:44:31 +02:00
Andras Bacsai
9dabaabdf1 fix(git): force HTTP/1.1 for repository imports
Apply HTTP/1.1 transport config to HTTPS git clone and submodule commands,
including GitHub App credential rewrites, to avoid flaky large repo imports.
2026-06-03 12:42:04 +02:00
Andras Bacsai
cb6a2de529 chore(logs): simplify log viewer XSS tests 2026-06-03 12:28:56 +02:00
Andras Bacsai
8b8ec9c4f9 Merge remote-tracking branch 'origin/next' into fix/api-update-server-private-key 2026-06-03 12:27:41 +02:00
Andras Bacsai
ec7a8b5ea9 fix(scheduled-jobs): link skipped service database backups
Render skipped service database backups with the service database backup route while preserving standalone database backup links.
2026-06-03 12:25:13 +02:00
Andras Bacsai
c0c918f1c5 Merge remote-tracking branch 'origin/next' into fix/clipboard-https-secure-context 2026-06-03 12:05:09 +02:00
Andras Bacsai
419a551d76 fix(server): return SSH username validation messages 2026-06-03 11:57:46 +02:00
Andras Bacsai
da70e34472 test(api): cover server private key updates
Add feature coverage for updating a server from private_key_uuid, rejecting unknown or cross-team private keys, and preserving the existing key when the field is omitted.
2026-06-03 11:43:52 +02:00
Andras Bacsai
d525c12457 fix(env): keep dev view env saves independent of search
Search environment variables case-insensitively by key, add accessible search
labeling, and ensure switching to developer view after searching loads the full
variable set so non-matching entries are not removed on save.
2026-06-03 11:40:54 +02:00
Andras Bacsai
9aa40bb5f0 Merge remote-tracking branch 'origin/next' into jean/allow-dots-username 2026-06-03 11:38:55 +02:00
Andras Bacsai
bc2afdf02e fix(server): share SSH username validation
Centralize SSH username rules and sanitization so dotted usernames are
accepted consistently across API, onboarding, and Livewire server forms.
2026-06-03 11:38:48 +02:00
Andras Bacsai
d742b4a678 Merge remote-tracking branch 'origin/next' into fix/clipboard-https-secure-context
# Conflicts:
#	resources/views/livewire/project/application/deployment/show.blade.php
2026-06-03 11:38:47 +02:00
Andras Bacsai
13e94a499d feat(destinations): split Docker resources into separate page
Move standalone Docker destination resource listings out of the general
settings view and add a searchable resources page with team-scoped tests.
2026-06-03 11:24:36 +02:00
Andras Bacsai
c0c8fd7f11 Merge remote-tracking branch 'origin/next' into jean/sentinel-ux 2026-06-03 11:10:19 +02:00
Andras Bacsai
d892d0ad10 fix(sentinel): refresh server nav after toggles
Dispatch server show refreshes after Sentinel and metrics toggles, preserve editable Sentinel form fields during restart events, and gate custom image editing by update permission.
2026-06-03 11:10:13 +02:00
Andras Bacsai
aaa540421f feat(application): preserve crash restart limit status
Stop applications after they hit the crash restart limit without clearing
restart tracking, surface the stopped-limit warning in status UI, and use
the application link in restart limit notifications.
2026-06-03 11:01:28 +02:00
Andras Bacsai
07f381b88c Merge remote-tracking branch 'origin/next' into jean/port-exposes-improvement 2026-06-03 10:32:57 +02:00
Andras Bacsai
d5a64d93bc
feat: support --dns custom Docker option (#10516) 2026-06-03 10:21:30 +02:00
Andras Bacsai
a047971bc1 fix(github): use provided app for installation URLs
Generate GitHub App installation links and setup cache state from the
current app instance, and keep the Livewire app name in sync after
permission checks.
2026-06-03 10:07:57 +02:00
Andras Bacsai
858b1906ec Improve GitHub App setup flow 2026-06-03 09:33:46 +02:00
Ömer Faruk ŞAHİN
903f7a7177
Merge branch 'next' into fix/deploy-key-dedicated-path-race 2026-06-03 10:28:34 +03:00
Andras Bacsai
6c3ea7f1db
fix(navigation): remove stale cloak after Livewire navigation (#10518) 2026-06-02 17:13:59 +02:00
Andras Bacsai
50c07eb8e4
fix(forms): focus password fields before visibility toggles (#10519) 2026-06-02 17:13:03 +02:00
Andras Bacsai
a3c80c9778 fix(forms): focus password fields before visibility toggles
Render password inputs and textareas before their visibility toggle buttons so tab navigation reaches the editable field first.
2026-06-02 17:09:14 +02:00
Andras Bacsai
5acf4d9af2 fix(navigation): strip stale x-cloak after Livewire navigation
Remove leftover x-cloak attributes after wire:navigate events so morphed
pages do not stay hidden, while keeping the initial-load cloak guard covered
by a feature test.
2026-06-02 17:00:55 +02:00
tikimo
6692ff3e36 feat: support dns custom docker option 2026-06-02 17:46:47 +03:00
Andras Bacsai
d681e656c7 fix(server): preserve remote HOME in Railpack buildx prune 2026-06-02 16:36:00 +02:00
Andras Bacsai
67687efc65 Merge remote-tracking branch 'origin/next' into 10507-railpack-cache-volume 2026-06-02 15:14:13 +02:00
Andras Bacsai
a75dc07567 fix(server): prune Railpack buildx cache via helper container 2026-06-02 15:14:01 +02:00
Andras Bacsai
d87ab279fb fix(log-drain): connect drain to service networks
Ensure the log drain container joins enabled service destination networks
when services start or the log drain restarts.
2026-06-02 14:33:57 +02:00
Andras Bacsai
5eec212ade fix(deploy): persist Railpack buildx metadata
Mount the host buildx metadata directory into helper containers so the
Railpack builder can be pruned during Docker cleanup.
2026-06-02 14:30:49 +02:00
Andras Bacsai
40294bc3b3 chore: inspect staged changes 2026-06-02 14:05:26 +02:00
Andras Bacsai
cd06e10b1b fix(auth): bind magic links to their invitation
Include the invitation UUID in generated magic link tokens and validate the
matching stored invitation link before logging the user in, preventing stale
or same-email invitations from being reused.
2026-06-02 12:57:30 +02:00
Andras Bacsai
40d570f195 chore: update team invitation handling 2026-06-02 12:22:27 +02:00
Andras Bacsai
973632b49c Merge remote-tracking branch 'origin/next' into audit-policies 2026-06-02 12:03:38 +02:00
Andras Bacsai
0038a8f5c9 Merge remote-tracking branch 'origin/next' into api-sensitive-data-scrubber 2026-06-02 11:57:13 +02:00
Andras Bacsai
88622ba7ea fix(ui): prevent persisted sidebar restore animation
Remove Railpack example applications from the default seed data and update
seed tests to assert they are no longer created.
2026-06-02 11:54:38 +02:00
Andras Bacsai
47682a3085 fix(db): skip postgres tuning outside pgsql
Guard the fillfactor/autovacuum migration on non-Postgres connections.
Add API regression coverage for command-substitution git_branch payloads.
2026-06-02 11:41:24 +02:00
Andras Bacsai
1bad82cf43 Merge remote-tracking branch 'origin/next' into chore/update-deployment-validation 2026-06-02 11:28:42 +02:00
Andras Bacsai
fb4c3aa22e fix(applications): allow repeated hyphens in image names 2026-06-02 11:27:25 +02:00
Andras Bacsai
098b098509 Merge remote-tracking branch 'origin/next' into chore/update-deployment-validation 2026-06-02 11:20:29 +02:00
Andras Bacsai
507ecfdf54 Merge remote-tracking branch 'origin/next' into fix/application-image-validation 2026-06-02 11:14:35 +02:00
Andras Bacsai
6dae53a0e5 Merge remote-tracking branch 'origin/next' into fix/application-image-validation 2026-06-02 11:13:36 +02:00
Andras Bacsai
d72c1e2a47 fix(applications): harden image validation 2026-06-02 11:11:33 +02:00
Andras Bacsai
c7c8107dcd Merge remote-tracking branch 'origin/next' into fix/application-branch-validation 2026-06-02 11:10:33 +02:00
Andras Bacsai
62caa30056 Merge remote-tracking branch 'origin/next' into chore/update-deployment-validation 2026-06-02 11:10:32 +02:00
Andras Bacsai
1ce36926f6 Merge remote-tracking branch 'origin/next' into fix/proxy-config-validation 2026-06-02 11:07:07 +02:00
Andras Bacsai
7193a5d0f6 fix(tests): reuse instance settings in API token team tests 2026-06-02 11:05:51 +02:00
Andras Bacsai
51894d9c05 chore: defer server policy changes 2026-06-02 10:57:14 +02:00
Andras Bacsai
a511bd9b67 fix(api): validate token team context 2026-06-01 15:17:55 +02:00
Andras Bacsai
5e4873322e chore: improve deployment input handling 2026-06-01 15:15:38 +02:00
Andras Bacsai
419593e7d4 fix(proxy): tighten config validation 2026-06-01 15:14:28 +02:00
Andras Bacsai
2bb07bbe9e fix: validate application branch updates 2026-06-01 15:13:04 +02:00
Andras Bacsai
4b2dfa7c77 Merge remote-tracking branch 'origin/next' into 2731-investigate-failed-git-clone 2026-06-01 11:44:09 +02:00
Andras Bacsai
92d6b577fd Merge remote-tracking branch 'origin/next' into 7616-conditional-image-tags 2026-06-01 11:15:55 +02:00
Andras Bacsai
538e7467e2 Merge remote-tracking branch 'origin/next' into 2731-investigate-failed-git-clone 2026-06-01 10:57:43 +02:00
Andras Bacsai
e7483f591f fix(deployments): scope submodule git credentials per command
Use per-command git config for GitHub App HTTPS credentials so private submodules authenticate without persisting global git config. Preserve configured git options for checkout, fetch, submodule, and LFS commands, and cover GitLab PR submodule checkout with tests.
2026-06-01 10:54:14 +02:00
Andras Bacsai
bc8928fdc4 Merge remote-tracking branch 'origin/next' into 2731-investigate-failed-git-clone 2026-06-01 10:40:02 +02:00
Andras Bacsai
906717a936 Merge remote-tracking branch 'origin/next' into mobile-terminal-toolbar-controls 2026-06-01 10:38:58 +02:00
Andras Bacsai
a5313a78cf
fix(deployments): filter generated compose service env vars (#10186) 2026-06-01 10:38:36 +02:00
Andras Bacsai
e37f9401bc Merge remote-tracking branch 'origin/next' into 7552-pr-previews-not-working 2026-06-01 10:35:37 +02:00
Andras Bacsai
8e30035031 Merge remote-tracking branch 'origin/next' into s3-backup-validation 2026-06-01 10:32:17 +02:00
Andras Bacsai
24fc8db8db fix(terminal): exit fullscreen when PTY exits
Reset fullscreen and mobile toolbar state on PTY exit so the terminal UI returns to its normal layout. Update packaging coverage for the PTY exit behavior and mobile fullscreen height.
2026-06-01 10:21:30 +02:00
Andras Bacsai
a8db2864f3 Merge remote-tracking branch 'origin/next' into mobile-terminal-toolbar-controls 2026-06-01 10:15:23 +02:00
Andras Bacsai
ec367549b4 feat(terminal): add mobile shell controls
Add a compact mobile toolbar for fullscreen terminal control keys and adjust terminal sizing so the toolbar does not cover rows.
2026-06-01 10:13:56 +02:00
Andras Bacsai
d4ff7ea791 Merge remote-tracking branch 'origin/next' into s3-backup-validation 2026-06-01 10:02:12 +02:00
Andras Bacsai
3db41a83a8 Merge remote-tracking branch 'origin/next' into terminal-long-session-disconnects 2026-06-01 09:52:34 +02:00
Andras Bacsai
51062e73a6 fix(database): honor disabled standalone health checks
Skip Docker healthcheck configuration when standalone database health checks are disabled, and document default health check settings in the database API schema.
2026-06-01 08:55:03 +02:00
Andras Bacsai
094e64ed2d Merge remote-tracking branch 'origin/next' into terminal-long-session-disconnects 2026-06-01 06:56:11 +02:00
Andras Bacsai
4f053bf5b4 Merge remote-tracking branch 'origin/next' into 10444-database-healthchecks 2026-06-01 06:55:40 +02:00
Andras Bacsai
b46d8e2601 fix(terminal): keep sessions alive without hard timeouts 2026-05-31 21:52:46 +02:00
Andras Bacsai
8a52307255
fix(cleanup): preserve self-hosted server IPs (#10480) 2026-05-31 21:50:28 +02:00
Andras Bacsai
d423223d38 feat(database): configure standalone health checks
Add configurable health check settings for standalone databases and apply them to generated Docker Compose services. Allow disabling health checks and cover the behavior with feature tests.
2026-05-31 21:50:10 +02:00
Andras Bacsai
1b68f11ec0 fix(cleanup): disable unreachable self-hosted servers
Preserve self-hosted server IPs during unreachable cleanup and force-disable them instead. Keep cloud cleanup behavior overwriting the IP, with test coverage for both paths.
2026-05-31 21:47:18 +02:00
Andras Bacsai
34f15c106c fix(webhook): match GitLab SSH repos with custom ports
Strip leading port segments from scp-style GitLab repository URLs so manual webhook matching compares the repository path consistently. Cover both ported and unported SSH URL forms.
2026-05-31 21:46:23 +02:00
Andras Bacsai
c9fcc0bc44 fix(service): defer stop when pulling latest images
Ensure restart actions flow through StartService so pull-latest restarts can
avoid stopping the service before image pulls. Also raise the changelog modal
above the desktop sidebar toggle.
2026-05-31 21:19:18 +02:00
Andras Bacsai
ea80649b6b fix(settings): update What's New menu icon 2026-05-29 14:02:41 +02:00
Andras Bacsai
b81bfc7f32 feat(profile): add appearance preferences page
Add a profile appearance section for theme, page width, and zoom preferences.
Move changelog access into the sidebar and bump the Coolify version to 4.1.2.
2026-05-29 13:59:01 +02:00
Andras Bacsai
c5fbf78bd8 fix(database): quote S3 restore temp paths
Escape generated restore file paths before composing docker and shell cleanup commands so paths with spaces or metacharacters cannot break command execution. Update import form security coverage to target ImportForm directly.
2026-05-29 12:27:33 +02:00
Andras Bacsai
bbbd46ca26 fix(database): always include MongoDB archive path in restores 2026-05-29 08:27:45 +02:00
Andras Bacsai
37a99e5f94 fix(application): only show server warning for false status
Treat unknown server status separately from false so the unreachable badge is not shown until a server is confirmed unreachable. Add feature coverage for the badge rendering.
2026-05-28 20:50:14 +02:00
Andras Bacsai
eb7da5c082 fix(database): gate import form controls by update access
Require database import form controls to declare update authorization against the resource and add coverage to prevent unguarded controls.
2026-05-28 20:48:18 +02:00
Andras Bacsai
322bf7c1b2 refactor(database): split import form into Livewire child
Extract the database import form into its own component and add realtime
status refresh components for application server badges and service resource
cards.
2026-05-28 19:30:12 +02:00
Ömer Faruk ŞAHİN
ddd84e5adc fix(git): write deploy key to per-deployment path, not root's id_rsa 2026-05-28 19:13:29 +03:00
Andras Bacsai
4401bee941 Merge remote-tracking branch 'origin/next' into fix/form-state 2026-05-28 17:34:52 +02:00
Andras Bacsai
dd8a0d501d fix(s3): cap connection checks at 15 seconds
Return a friendly timeout error for failed S3 endpoint checks while
preserving the original exception as the previous throwable.
2026-05-28 17:31:11 +02:00
Julien Bouquillon
a0d3da372e
Merge branch 'v4.x' into api-application-preview-deployments 2026-05-28 10:26:02 +02:00
Andras Bacsai
90aa4e7e73 chore(sentinel): remove stale resource exit check 2026-05-27 16:55:03 +02:00
Andras Bacsai
626cfb4a22 fix(sentinel): reduce resource churn from health flaps
Ignore health status changes in Sentinel push deduplication when the container lifecycle state is unchanged.

Scope stale resource checks to Sentinel servers whose heartbeat is stale, and avoid refreshing resource last_online_at on unchanged statuses.
2026-05-27 16:48:38 +02:00
Andras Bacsai
1c5d5676ef fix(crons): dispatch due schedules across chunks
Interleave due backups and tasks so one schedule type cannot starve the
other, and defer task job context loading until execution.
2026-05-27 16:35:41 +02:00
Andras Bacsai
9d1ede0733 fix(github): require opt-in custom webhook endpoint 2026-05-27 09:11:23 +02:00
Andras Bacsai
a07cee7ad6 fix(github): support custom webhook override 2026-05-27 09:05:55 +02:00
Andras Bacsai
499a8666db fix(github): allow custom webhook endpoint input 2026-05-27 08:37:10 +02:00
Andras Bacsai
9b996b4dc9 chore: inspect commit message guidance 2026-05-27 07:14:54 +02:00
Andras Bacsai
d443758b03 fix(github): allow system-wide private apps across teams
Use the shared GitHub app scope when listing and loading private apps so system-wide apps owned by another team remain available. Update coverage for mounting and loading repositories through those apps.
2026-05-26 17:36:02 +02:00
Andras Bacsai
9f29df4cc3 fix(sentinel): accept empty container heartbeats
Allow Sentinel pushes with an empty containers array so servers with no
running containers still refresh their heartbeat and enqueue an update.
2026-05-26 17:31:27 +02:00
Andras Bacsai
081bd6ef8c fix(seeding): ensure root user joins root team
Create the root team before production seeding depends on it, reuse the
existing root team when creating root users, and cover the production seeder
flow with a feature test.
2026-05-26 17:05:54 +02:00
Andras Bacsai
6da907f1c8 chore: inspect commit message guidance 2026-05-26 15:35:09 +02:00
Andras Bacsai
0c6a233b27 fix(deployment): unregister Livewire morph hook on teardown
Store the morph.updated cleanup callback and invoke it during Alpine destroy so deployment log search hooks do not survive component teardown.
2026-05-26 14:57:20 +02:00
Andras Bacsai
b751628545 fix(database): normalize read/write host lists
Trim comma-separated database host values and fall back to DB_HOST or the default host when write hosts are empty. Add unit coverage for read/write host parsing.
2026-05-26 14:52:25 +02:00
Andras Bacsai
8e033c5bc3 fix(destination): promote networks atomically
Wrap destination promotion in a transaction so the main destination swap and additional network updates stay consistent. Add coverage for promoting an owned team network while preserving the previous main destination as an additional network.
2026-05-26 14:50:29 +02:00
Andras Bacsai
f44ace3965 fix(destination): validate network server pairing
Ensure destination attach and promote operations only accept networks that belong to the selected server, preventing mismatched same-team server/network pairs.
2026-05-26 14:48:36 +02:00
Andras Bacsai
097efd14ce fix(storage): clear stale disk usage cache
Forget cached storage threshold state when reported disk usage drops below the alert threshold, allowing future threshold crossings to dispatch a fresh storage check.
2026-05-26 14:45:49 +02:00
Andras Bacsai
43884823c6 chore(ssh): remove stale mux cleanup job
Drop the scheduled stale multiplexed connection cleanup job, its SSH mux
health/orphan config, and the tests that covered that cleanup path.
2026-05-26 14:40:38 +02:00
Andras Bacsai
b5be9fe9e8 fix(sentinel): lock push dedupe decisions
Guard Sentinel push hash checks and cache updates with a server-scoped atomic cache lock to prevent concurrent duplicate dispatches.
2026-05-26 14:12:56 +02:00
Andras Bacsai
7677fac2f5 fix(sentinel): validate push containers payload
Reject malformed sentinel push payloads before updating heartbeat state,
dispatching jobs, or writing deduplication cache entries.
2026-05-26 14:07:41 +02:00
Andras Bacsai
ed3780b2a7 fix(schedule): run stale multiplex cleanup on crons queue
Dispatch CleanupStaleMultiplexedConnections through the crons queue and
cover the scheduled job queue assignment with a feature test.
2026-05-26 13:51:22 +02:00
Andras Bacsai
ebf23f4874 fix(ssh): escape scp source and destination
Quote SCP operands when building commands to prevent shell injection through source or destination paths, and cover the escaping behavior in the SSH command injection tests.
2026-05-26 13:48:10 +02:00
Andras Bacsai
8a40c4e348 chore(sync-bunny): remove GitHub release sync paths
Drop the unused GitHub release and version sync options from sync:bunny,
leaving the command focused on BunnyCDN template, release, and nightly syncs.
Update the nightly test to assert it does not invoke gh or git.
2026-05-26 11:51:38 +02:00
Andras Bacsai
21db1fd374 fix(sync-bunny): sync nightly CDN files to nested paths
Write nightly versions and releases under json/nightly in the CDN repo, and cover both release and versions-only sync flows with feature tests.
2026-05-26 11:41:04 +02:00
Andras Bacsai
8e6e3551f3
fix(ui): improve configuration changes modal values, colors and spacing (#10365) 2026-05-26 11:09:54 +02:00
Andras Bacsai
27b76a4e97 Merge remote-tracking branch 'origin/next' into fix/form-state 2026-05-25 16:08:19 +02:00
Andras Bacsai
33e172ac24 fix(backups): revalidate S3 storage on scheduled backup submit
Check the selected S3 storage against the database at submit time so
stale Livewire state cannot schedule backups with storage that was
reassigned or marked unusable after the component mounted.
2026-05-23 21:06:22 +02:00
Andras Bacsai
a4d75ff0e2 fix(backups): validate S3 storage before backup scheduling
Prevent scheduled database backups from enabling S3 uploads without a valid team-owned storage configuration, and preserve the previous S3 storage ID in missing-storage error messages.

Add coverage for backup edit/create validation and S3 upload failure messaging.
2026-05-23 13:06:36 +02:00
Andras Bacsai
ffe8cfd76f fix(changelog): use configurable GitHub releases source
Default changelog pulls to the GitHub raw releases JSON and cover the
configured URL, file writing, and draft-release filtering with feature tests.
2026-05-22 18:39:37 +02:00
Andras Bacsai
a058786509 fix(ssh): remove mux first-use lock wrapper
Rely on OpenSSH lazy multiplexing directly for SSH and SCP commands,
removing the shell lock wrapper and related readiness checks.
2026-05-22 18:27:40 +02:00
Andras Bacsai
a13fb3cf00 fix(ssh): verify mux readiness before reusing socket
Use ssh -O check in the first-use mux lock flow so commands only reuse a multiplexed socket after the control master is actually ready.
2026-05-22 18:22:22 +02:00
Andras Bacsai
5c67766f41 fix(ssh): serialize initial mux connection creation
Wrap first-use SSH and SCP multiplexed commands with a lock to avoid racing while the control socket is created. Also detect native OpenSSH mux master process names during stale connection cleanup and cover both orphaned and duplicate mux processes with tests.
2026-05-22 18:17:37 +02:00
Andras Bacsai
54a020cf1b fix(ssh): rely on lazy multiplexed connections
Remove explicit SSH master pre-warming and lock handling so OpenSSH manages ControlMaster creation lazily from real ssh/scp commands. Add cleanup for duplicate mux processes and update coverage around mux command options and stale process cleanup.
2026-05-22 18:01:53 +02:00
ShadowArcanist
bd744eb8dd
fix(ui): configuration changes modal values, colors and spacing 2026-05-22 21:22:50 +05:30
Andras Bacsai
57d879263d fix(ssh): prevent orphaned multiplexed connections
Serialize multiplexed SSH master creation per server to avoid concurrent workers spawning orphaned processes. Enable scheduled cleanup for stale mux connections and add guarded orphan process reaping with tests.
2026-05-22 17:31:38 +02:00
Andras Bacsai
b35524bdf8 Merge remote-tracking branch 'origin/next' into improve-github-app-setup-flow 2026-05-22 17:04:47 +02:00
Andras Bacsai
182df1cb07 fix(logs): keep stream polling active without collapsible panel
Move log stream polling off the loading indicator so non-collapsible log panels continue polling while streaming, and cover the behavior with a Livewire feature test.
2026-05-22 17:00:08 +02:00
Andras Bacsai
5a7408a919 fix(github): improve GitHub App setup and installation flow
- resolve the GitHub App by a stable identifier during installation
  callbacks so installing and re-installing keeps working over the
  full lifetime of the App
- verify the installation id received from the callback against the
  GitHub API before persisting it
- support re-installing an already configured GitHub App instead of
  blocking it
- require an authenticated session and rate limit the setup callback
  routes
- extend manifest setup state validity to match GitHub's manifest
  code lifetime

Adds feature coverage for the GitHub App setup and installation
callbacks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:34:36 +02:00
Andras Bacsai
fcd63f40eb fix(queue): route scheduled jobs through crons helper
Centralize scheduled job queue selection with crons_queue() and use it for scheduler, task, and database backup jobs so cloud runs on crons while self-hosted stays on high.
2026-05-22 16:26:15 +02:00
Andras Bacsai
e2199f1223 fix(queue): route cloud jobs to dedicated queues
Use config-based queue selection for deployment and scheduled jobs so cloud dispatches deployments to `deployments` and scheduled jobs to `crons`, while self-hosted keeps using `high`.

Add coverage for deployment queue helper, start action routing, and scheduled job manager routing.
2026-05-22 16:11:24 +02:00
Andras Bacsai
809d9b21fa fix(webhook): match manual webhook repositories case-insensitively
Git hosts treat owner/repo names case-insensitively, but the exact
repository match used a case-sensitive comparison, so a payload whose
casing differed from the stored git remote would fail to match and
skip a legitimate deployment.

Lowercase both canonical repository paths before comparing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:59:20 +02:00
Andras Bacsai
c1518ba1c0 fix(webhook): match manual webhook repositories exactly
The manual webhook handlers selected target applications with a
`git_repository LIKE %full_name%` substring query, so a payload
repository name could match unintended applications when repository
names overlap.

Add a `MatchesManualWebhookApplications` trait that validates the
incoming `owner/repo` value and matches `Application.git_repository`
by exact normalized path. Github, Gitlab, Gitea and Bitbucket manual
handlers now use it, reject invalid repository input early, and return
a consistent generic webhook failure payload.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:32:44 +02:00
Andras Bacsai
00ce43a9d0
Refine service resource routing (#10358) 2026-05-22 13:40:18 +02:00
Andras Bacsai
beaad0a722 Refine service resource routing 2026-05-22 13:39:26 +02:00
Andras Bacsai
7f135e0f6d Harden token permission handling 2026-05-22 13:12:17 +02:00
Andras Bacsai
e9b8320d5f Fix source selection flow 2026-05-22 13:00:53 +02:00
Andras Bacsai
783344c875
fix(environment): scope DeleteEnvironment lookups to current team (#10349) 2026-05-22 12:57:57 +02:00
Andras Bacsai
59111e8cf3 fix(destination): scope server and network selection to current team
Resolve the server and network in Destination::addServer() and
::promote() through ownedByCurrentTeam() before use, authorize the
update against the resource, and pass the validated IDs into
attach()/detach()/update(). Errors are routed through handleError()
to match the sibling removeServer() method.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:53:14 +02:00
Andras Bacsai
36526928df feat(sentinel): deduplicate metrics push processing
Move Sentinel push handling into a controller and dispatch server update jobs only when container state changes or the force interval elapses. Add opt-in PostgreSQL read/write replica configuration and tune periodic proxy network and storage checks to reduce unnecessary work.

Add feature coverage for replica config, Sentinel push deduplication, deployment log scrolling, and server update job optimizations.
2026-05-22 12:48:48 +02:00
Andras Bacsai
df166ac689 fix(environment): scope DeleteEnvironment lookups to current team
Scope DeleteEnvironment::mount() and delete() lookups through
Environment::ownedByCurrentTeam() so an environment_id that belongs to
another team resolves to a 404 instead of loading the foreign record.
Mark $environment_id as #[Locked] so the public Livewire property can no
longer be reassigned from the client.

Add tests/Feature/DeleteEnvironmentTeamScopingTest.php covering mount,
delete, the #[Locked] guard, and the team-scoped helper for both the
cross-team and own-team cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:37:48 +02:00
Andras Bacsai
5dda39e588 fix(source): scope private key and source selection to current team
The Source component now resolves the supplied private key and Git
source IDs through team-scoped queries before persisting them, so a
selection can only ever reference a resource owned by the current
team. The source type is additionally restricted to the supported
GitHub/GitLab app classes.

The privateKeyId property is marked #[Locked] so it can only change
through the dedicated handler rather than a direct property update.

Adds feature tests covering team-scoped selection of private keys and
Git sources.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:30:00 +02:00
Andras Bacsai
b124397613 fix(schedule): prevent duplicate SSL certificate regeneration
Run RegenerateSslCertJob on one server only and add coverage to ensure scheduled production jobs use onOneServer.
2026-05-21 19:19:43 +02:00
Aditya Tripathi
7a3fcd37d5 fix(livewire): scope DatabaseProxyStopped to proxy fields, harden status trait
Clickhouse, Dragonfly, and Keydb still called syncData() inside the
DatabaseProxyStopped broadcast handler, clobbering in-progress edits to
name/description/credentials. Refresh only is_public/public_port/
public_port_timeout instead, matching the pattern used elsewhere.

Also null-guard HasDatabaseStatusInfo::getListeners() against an absent
Auth::user()/currentTeam(), add explicit return types on getListeners()
and render(), and convert inline comments in the SSL refresh test to a
PHPDoc block.
2026-05-21 10:24:49 +00:00
Aditya Tripathi
e7e65831a7 fix(livewire): preserve wire:dirty across DB status broadcasts
The earlier refreshStatus fix kept user-typed values intact but Livewire still
absorbed deferred wire:model values into the snapshot on every broadcast-
triggered roundtrip, clearing the unsaved-changes indicator and making the form
look auto-saved. Move all status-derived display (DB URLs, SSL toggle/mode,
cert expiry) out of each DB General form into a sibling StatusInfo Livewire
component, so the form never roundtrips on broadcasts.

Shared scaffolding lives in App\Traits\HasDatabaseStatusInfo plus an x-database-
status-info Blade component, leaving each per-DB StatusInfo class as a ~20-50
line declaration of label, SSL mode options, and SSL save hooks. Parents
dispatch databaseUpdated from save methods so the sibling refreshes after writes.

Tests cover the architecture (no DB form subscribes to status broadcasts) and
the sibling's refresh-on-status-change behavior.
2026-05-21 08:31:08 +00:00
Aditya Tripathi
b9f773c1d9 fix(livewire): stop broadcast handlers from wiping in-progress form input 2026-05-20 19:04:43 +00:00