Commit Graph
17746 Commits
Author SHA1 Message Date
github-actions[bot] ff10e34fcf Merge remote-tracking branch 'origin/main' into next 2026-10-07 07:34:17 +00:00
Andras Bacsai 58db0eba6f feat(backups): notify teams of volume backup results
Send success and failure notifications through enabled backup channels.
Route successful backups with warnings through failure channels.
2026-10-07 09:24:10 +02:00
github-actions[bot] c67c026bb7 Merge remote-tracking branch 'origin/main' into next 2026-10-06 21:20:02 +00:00
Andras Bacsai d54c03730d feat(scheduler): make scheduled job dispatch mode configurable
Default to sequential dispatch on self-hosted instances and concurrent
per-type dispatch on Coolify Cloud. Allow SCHEDULED_JOBS_DISPATCH_MODE
to override the default, falling back for invalid values.

Cover defaults, overrides, and fallback behavior in scheduler tests.
2026-10-06 23:16:40 +02:00
github-actions[bot] 217b47e001 Merge remote-tracking branch 'origin/main' into next 2026-10-06 20:49:12 +00:00
Andras Bacsai cd70dbf03a chore(versions): bump sentinel to 1.0.2 and pin sentinel-host image 2026-10-06 22:42:59 +02:00
github-actions[bot] 8aa52094a8 Merge remote-tracking branch 'origin/main' into next 2026-10-06 20:20:00 +00:00
Andras Bacsai 393dcbb6cd fix(logs): wrap viewer in a root element for parent re-renders 2026-10-06 22:09:27 +02:00
Andras Bacsai 56497d50cf fix(deployments): include scheduled jobs in progress checks
Count running scheduled tasks, database backups, and volume backups,
excluding runs older than their job timeout. Report scheduled job counts
and keep the progress check active while any scheduled jobs are running.
2026-10-06 21:59:16 +02:00
Andras Bacsai be72005980 fix(deployments): expire missing Horizon jobs after deployment timeout
Keep reserved jobs active and bound missing Horizon records by the server's
 deployment timeout. Add regression coverage for active and finished jobs.

Use UTC PostgreSQL sessions and bump the release version to 4.4.1.
2026-10-06 21:51:58 +02:00
github-actions[bot] 76a8bf16b4 Merge remote-tracking branch 'origin/main' into next 2026-10-06 11:18:51 +00:00
Andras Bacsai 41ed5b7a69 test: fix stale and flaky tests
- Update tests whose expectations no longer matched intended changes
  (GitHub App redirect, wildcard domains, container IDs, nightly
  install folders, localhost metadata, Sentinel restart on save)
- Seed the instance settings the 2FA profile test needs
- Run the global Pest hooks for all test folders and release the
  Laravel application after each test, so tests do not leak state
- Replace a class alias mock that broke later tests
- Generate factory names that always pass name validation; Faker names
  with apostrophes or short words made form tests fail at random
v4.4.0
2026-10-06 13:01:49 +02:00
Andras Bacsai aa16cfb420 fix(servers): change the server role only through its checked flow 2026-10-06 12:56:57 +02:00
Andras Bacsai 9e20084302 fix(auth): build email verification links from the instance URL 2026-10-06 12:56:57 +02:00
Andras Bacsai f1d3883ab2 fix(servers): authorize every Docker images request 2026-10-06 12:56:57 +02:00
Andras Bacsai 5e92a7267c fix(cleanup): prune audit events in batches and delete old finished runner executions 2026-10-06 12:56:57 +02:00
Andras Bacsai ecf969e35d fix(audit): remove credentials from URLs before storing audit changes 2026-10-06 12:56:57 +02:00
Andras Bacsai 5d20f54f71 fix(webhooks): use a neutral reply for manual webhooks without a match 2026-10-06 12:56:50 +02:00
Andras Bacsai c2a3333df4 fix(runners): limit stored workflow and job names to the column length 2026-10-06 12:56:50 +02:00
Andras Bacsai 8c5fe1c85b fix(runners): create the runner secret file readable only by its owner 2026-10-06 12:56:50 +02:00
Andras Bacsai 055f5c0622 fix(api): accept numeric resource limits when creating databases 2026-10-06 12:56:50 +02:00
Andras Bacsai 78f52310e5 fix(dns): only create or replace records for the resource's own domains 2026-10-06 12:56:50 +02:00
Andras Bacsai 804d05b9b6 fix(backups): close backup directories to other users on non-root servers 2026-10-06 12:56:50 +02:00
Andras Bacsai 3e6f6bfdad fix(ssh): keep the command and its secrets out of timeout errors 2026-10-06 12:56:50 +02:00
Andras Bacsai 3645c4747e fix(sudo): do not follow symlinks when chown gives Coolify paths to a non-root SSH user 2026-10-06 12:56:50 +02:00
github-actions[bot] 980d3ca662 Merge remote-tracking branch 'origin/main' into next 2026-10-06 09:45:37 +00:00
Andras Bacsai e79347295a fix(compose): allow upgrades with legacy soketi overrides
Add an inactive soketi placeholder to production and nightly Compose
files so old custom overrides remain valid without starting soketi.
Cover partial and full legacy overrides with regression tests.
2026-10-06 11:29:33 +02:00
github-actions[bot] a56b8372fc Merge remote-tracking branch 'origin/main' into next 2026-10-06 09:25:55 +00:00
Andras Bacsai 116806df1b fix(compose): allow content files outside the resource directory again
Since aabd12737 a Compose bind volume with a content block had to stay
inside the resource directory. Services and Compose applications saved
in v4.3.23 with other paths, and Git Compose files with them, no longer
started or deployed.

Only admins and owners can edit Compose files, and they can already
write any host file with a plain bind mount, so the rule added no
security.

- Write content files to their host path again, as in v4.3.23
- Keep shell escaping and the safe-character checks on volume sources,
  so injection attempts are still rejected
2026-10-06 11:03:39 +02:00
github-actions[bot] c956551c81 Merge remote-tracking branch 'origin/main' into next 2026-10-06 08:47:53 +00:00
Andras Bacsai 06b5a708b8 refactor(traffic): remove fallbacks for unreleased Sentinel builds
Every released Sentinel with traffic analytics (1.0.0 and later) has
the dashboard and series routes and the requests, bytes_in and app
fields, so the fallbacks for builds without them are not needed.

- Keep "no data" handling for Sentinel without traffic routes (0.0.x)
- Keep the resource-scope fallback, which Sentinel 1.0.1 needs
2026-10-06 10:29:04 +02:00
Andras Bacsai 460bb67d63 fix(server): avoid a burst of patch and Sentinel checks after the upgrade
The per-server schedules reused the cache keys of the old schedule, so
every server ran these checks at once on the first run after the
upgrade. New keys start fresh, so each server runs at its own slot.
2026-10-06 10:29:04 +02:00
Andras Bacsai c5bcb31f73 fix(databases): import from the source the user selected
A staged upload always won over a server path, so an old upload that
was never imported could be restored instead of the chosen file.

- Record the selected source (checked server file or finished upload)
  and import only from it
- Delete a stale staged upload when another source is used
2026-10-06 10:29:04 +02:00
Andras Bacsai 203b8804f0 fix(deployments): continue the queue when a deployment cannot be dispatched
- A dispatch failure for one additional server no longer skips the
  other servers or the combined notification
- After a deployment fails to dispatch, the queue starts the next
  queued deployment; nested queue advances run in a loop, not as
  recursion, so repeated failures end
2026-10-06 10:29:04 +02:00
Andras Bacsai 105584da06 fix(auth): check the resource team for cloud tokens and cloud-init scripts
The policies checked the admin role in the session team. A user who was
demoted in the owning team could still edit its cloud tokens and
cloud-init scripts after switching to a team they administer. View,
update and delete now need admin of the resource's team, as for
integration tokens.
2026-10-06 10:29:04 +02:00
Andras Bacsai c3a8a44e46 fix(audit): log security resource changes under the resource team
Integration token, cloud provider token and cloud-init script edits
were audit-logged under the session team. After a team switch in
another tab, the owning team missed the entry and the other team saw
the resource name.

- Use the team of the edited resource for every audit row
- Remove credentials, query and fragment from secret manager base URLs
  in the audit log
2026-10-06 10:29:04 +02:00
github-actions[bot] b48311cf93 Merge remote-tracking branch 'origin/main' into next 2026-10-06 05:43:18 +00:00
Andras Bacsai 86d84e21c0 perf(databases): load Redis-family passwords once for database lists
Connection URLs of KeyDB, Dragonfly and Redis queried their password
variables once per database, so the database list API ran extra queries
for every database.

- Read REDIS_PASSWORD and REDIS_USERNAME from the loaded relation
- Load the variables once per type in the database list and the
  environment details API
2026-10-06 06:59:22 +02:00
Andras Bacsai 88ba00db2b fix(ui): pass values to Alpine correctly in component attributes
Blade does not compile @js() inside component tag attributes, so Alpine
got the literal text and threw an expression error.

- The environment variable editor closes again after an update
- The change email button in the profile gets a valid disabled state
2026-10-06 06:59:22 +02:00
Andras Bacsai e1f9e6fb39 fix(ui): deny members on cloud tokens and OAuth settings without a 500
- /security/cloud-tokens returns 403 for members instead of crashing
  on a null token list
- /settings/oauth redirects non-admins to the dashboard; it used the
  missing route "home" and a wrong redirect return type
2026-10-06 06:59:22 +02:00
Andras Bacsai ca203bc9fa fix(ui): keep the light custom theme rule for white surfaces
A comment in app.css contained "*/", which ended the comment early.
The minifier then dropped the next rule, so white panels in the light
custom theme were not tinted.
2026-10-06 06:59:22 +02:00
github-actions[bot] f905d8d6a9 Merge remote-tracking branch 'origin/main' into next 2026-10-05 21:48:09 +00:00
Andras Bacsai 93e7fa7f34 feat(dashboard): show pending team invitations
Login no longer accepts invitations, so the dashboard lists the
unexpired invitations for the user's email with a link to the
invitation page, where the user accepts them.
2026-10-05 23:42:01 +02:00
Andras Bacsai 248eca7d51 fix(auth): do not accept team invitations on login
A password login added the user to the first team that invited their
email and switched to it, without asking. The user now accepts the
invitation on the invitation page. The invitation link login flow
works again, because login no longer consumes the invitation.
2026-10-05 23:42:01 +02:00
Andras Bacsai 58fb36544a fix(ui): lock the server-built domain state of applications and services
The domain rows of applications and previews, and the DNS validation
flags of application and service domains, were not locked. A user
could change them from the browser to skip the DNS check or store
fake DNS results.
2026-10-05 23:42:01 +02:00
Andras Bacsai 0798f84c2c fix(auth): protect the root user and owners from deletion by admins
An admin of the root team could delete the root user (id 0) and the
owners of the root team from the user list.

- Never delete the root user here
- Refuse a user whose root-team role is higher than the caller's
- Refuse the caller's own account; the profile has its own flow
2026-10-05 23:42:01 +02:00
github-actions[bot] 2293cfedcf Merge remote-tracking branch 'origin/main' into next 2026-10-05 21:19:10 +00:00
Andras Bacsai ed6d6b1e45 fix(server): reset disk alerts only after usage recovers
Require usage to fall five percentage points below the threshold before releasing the notification throttle. Reset it after Sentinel reports recovery so a new spike alerts immediately.

Add regression coverage for recovery and usage fluctuating near the threshold.
2026-10-05 23:14:52 +02:00
Andras Bacsai 3f62f4d80a fix(server): fail the queued deployments of a deleted server
Queued deployments of a deleted server could never start and stayed in
the queue. Deleting a server now marks them failed with the log entry
"The server was deleted."
2026-10-05 23:10:52 +02:00
Andras Bacsai 6cc6f1081d fix(deployments): advance the queue on all servers after a cancel
- A queued deployment on a deleted server no longer stops the queue;
  one deployment that fails to start does not stop the others
- Cancelling a deployment starts the queued deployments of the same
  application on all servers, as a finished deployment does
2026-10-05 23:10:52 +02:00