Commit Graph
1986 Commits
Author SHA1 Message Date
Andras Bacsai f7ea962145 fix(server): enable disabled self-hosted servers again on validation
On self-hosted, a validation that connects now clears force_disabled. The unreachable cleanup skips the localhost server, and the server page explains why a server is disabled. Cloud and transferred servers stay disabled.

Closes #12475
2026-11-06 18:57:06 +01:00
Andras BacsaiandClaude Opus 5.5 c648f4ec6a feat(ui): star servers and resources for quick access on the dashboard
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:16:25 +01:00
Andras BacsaiandClaude Opus 5.5 53e21abe97 fix(services): do not warn about the port when a domain has no port
An empty port routes to the required port, so it needs no confirmation.
The edit dialog shows the effective port, the warning buttons name the
ports, and domain conflicts ignore the container port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:17:35 +01:00
033f0c84da v4.7 (#12478)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
2026-11-06 14:25:02 +01:00
Andras BacsaiandClaude Opus 5.5 00d0b4be1d fix(ui): add coolify.io ref to integration token provider links
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 11:28:15 +01:00
Andras BacsaiandClaude Opus 5.5 3379fa448a fix(audit): keep personal data and credentials out of audit events
Anonymize the audit events of a deleted user, store only the ID and
name of other users, and drop the metadata copy of actor_email.
Store URLs without query strings, registries without user info, and
the exception class instead of raw SSH errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:31:44 +01:00
Andras BacsaiandClaude Opus 5.5 b7d0e6be2a fix(audit): stop duplicate and empty audit rows
- Set env var version and compose parsing version while creating, so a create writes one row
- Record no rows for the auto-created preview copy of an env var
- Record env and application API updates only with the fields that really changed
- Store no change data for new env vars, and null for empty change data
- Store metadata team_id as an integer
- Drop the unused level and resource indexes of audit_events

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:49:17 +01:00
Andras BacsaiandClaude Opus 5.5 e7e952fcad fix(deploy): keep preview and build server hosts out of build --add-host
Preview containers (-pr-<id>) came and went with pull requests and
invalidated the build cache of every app on the network. A build server
got the IPs of the deployment server network, which it cannot reach.
Add a per-app setting to turn off network hosts during the build.

Closes #12452

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:34:53 +01:00
Andras BacsaiandClaude Opus 5.5 3bc82eb71d feat(api): add Gitea App endpoints for sources and applications
Add GET /gitea-apps, POST /applications/private-gitea-app, and
gitea_app_uuid in PATCH /applications/{uuid}, with OpenAPI docs and MCP tool support.

Closes #12459

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:27:24 +01:00
Andras BacsaiandClaude Opus 5.5 51a7e97619 fix(healthcheck): import Dockerfile HEALTHCHECK options like Docker
Read compound and fractional durations (1m30s, 1.5m), quoted values,
only the flags before CMD, the escape parser directive, and NONE with
flags. Zero and sub-second values no longer become 0 seconds.

Closes #12455

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:36:21 +01:00
Andras Bacsai 455b22f26c fix(deploy): explain SSH exit 255 and handle non-map compose services
- Add a hint to failed command messages when the exit code is 255,
  which explains that the SSH connection to the server closed before
  the command finished.
- Return no services from applicationParser and serviceParser when the
  compose `services` key is empty or is not a map, so parsing does not
  fail.
- Move Server::getIp() out of the sshEndpointInUse() docblock, where it
  was misplaced and broke the class.
- Add tests for the SSH hint, for services keys that are not maps, and
  for saved compose variable values that must survive a redeploy
  (#6995).
2026-11-05 09:49:35 +01:00
Andras Bacsai f9bde1cd7a fix(env): prevent duplicate environment variables and allow removing extra copies
Closes #8041
2026-11-05 09:47:18 +01:00
Andras BacsaiandClaude Opus 5.5 da7779d061 fix(env): keep locked variables locked but allow a new value
A locked variable used by Docker Compose could not be changed, unlocked,
or deleted, so a lock by mistake had no fix in the UI. A locked value can
now be replaced without showing it. The lock is permanent in the UI, the
API, and MCP, and Lock asks for confirmation.

Closes #6803

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:42:52 +01:00
Andras BacsaiandClaude Opus 5.5 b83b97f7e6 fix(server): show the SSH error when a new private key cannot connect
Closes #7980

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:37:38 +01:00
Andras BacsaiandClaude Opus 5.5 8126a5c128 fix(backups): limit S3 uploads to 1000 parts for providers like Scaleway
Closes #8411

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:31:54 +01:00
Andras BacsaiandClaude Opus 5.5 31c3fcf50d feat(scheduled-tasks): add an option to run a task without a shell
Containers without sh (distroless or scratch images) could not run
scheduled tasks, because Coolify always ran the command with sh -c.
Turn off "Run in a shell" to split the command into arguments and run
it directly. The option is also in the API, the MCP tools, and the
server transfer.

Closes #8244

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:19:37 +01:00
Andras Bacsai e0b94662e9 fix(deployments): apply the concurrent build limit of build servers
The queue counted every running deployment against the deployment server,
and the job picked a build server at random. So the deployment server
limit capped builds on build servers, and the build server limit was
never read. Count each build on the server that runs it, reserve a build
server with a free slot when the deployment starts, and start waiting
deployments of other servers when a build server slot is freed.

Closes #7649
2026-11-03 22:16:14 +01:00
Andras Bacsai f4a1e3e427 fix(proxy): keep Caddy WebSockets open across config reloads
caddy-docker-proxy reloads Caddy whenever any proxied container changes,
and Caddy closes every WebSocket on reload by default. Set
stream_close_delay on app, service, and dashboard reverse_proxy routes.

Closes #7942
2026-11-03 22:06:54 +01:00
Andras BacsaiandClaude Opus 5.5 ecb14e6cd5 fix(server): allow servers with the same IP and different SSH ports
Closes #7573

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 21:51:22 +01:00
Andras BacsaiandClaude Opus 5.5 21d1ad4874 fix(backups): upload to S3 endpoints with a path, like Supabase Storage
The MinIO client rejects endpoints such as `/storage/v1/s3`. Transfers to
these endpoints now use curl with a presigned URL that Coolify signs, for
database backups, volume backups, and S3 restores.

Closes #8530

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 21:43:47 +01:00
Andras Bacsai a5b4e1d32e feat(email): add a separate notification sender to the instance email settings
Team notifications sent through the instance email settings, the S3
connection error alert, and the channel disabled alert now use the
optional notification from address and name. Account mails keep the
default sender. Remove the unused emails command and its views.
2026-11-03 21:19:50 +01:00
Andras BacsaiandClaude Opus 5.5 fcf92b751f fix(healthcheck): read the Dockerfile HEALTHCHECK only from the built stage
Closes #9475

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:46:44 +01:00
Andras Bacsai 06c41f57d6 feat(notifications): throttle repeated scheduled job failures and disable failing tasks 2026-11-03 20:42:03 +01:00
Andras BacsaiandClaude Opus 5.5 5431d4954d fix(server): run the connection check Docker commands through SSH mux
Each new SSH connection opens a systemd-logind session. Some systemd
versions leak closed sessions until the host refuses logins at 8192.
The connection check now opens one new login (the probe), not three.

Closes #9148

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:40:21 +01:00
Andras BacsaiandClaude Opus 5.5 e29dcf70d9 fix(service): mark parts that are no longer in the Compose file
Closes #9591

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:34:37 +01:00
Andras BacsaiandClaude Opus 5.5 52a78cdb0f fix(env): keep the trailing newline of multiline environment variables
Closes #9438

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:30:59 +01:00
Andras BacsaiandClaude Opus 5.5 71814b4541 fix(deployment): use one COOLIFY_BRANCH value for preview deployments
A preview deployment set COOLIFY_BRANCH in three places with three
values: the Compose shell variables used the application branch
(main), the Compose parser used pull/<id>/head, and other build packs
used the fetched refspec (pull/<id>/head:pr-<id>-coolify) or the
application branch. A variable that refers to ${COOLIFY_BRANCH} then
got a different value than the container. All paths now use
Application::coolifyBranch(), which gives pull/<id>/head for previews
and git_branch for production deployments.

Closes #9572

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:25:28 +01:00
Andras BacsaiandClaude Opus 5.5 7f521e496d fix(s3): add a setting to skip TLS verification for S3 storages
S3 storages with a self-signed or private CA certificate failed with
"cURL error 60", because the Coolify container and the backup helper do
not use the CA certificates of the host. The new opt-in setting turns off
the certificate check in the PHP S3 clients and sets MC_INSECURE for mc.

Closes #9762

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:59:52 +01:00
Andras BacsaiandClaude Opus 5.5 83a5667387 fix(server): detach additional-destination apps instead of deleting them on server delete
Deleting a server with "Delete all resources" (UI) or ?force=true (API)
deleted every application that used the server, also applications that
use it only as an additional destination, for example after Promote.

Server delete now deletes only resources whose main destination is on
the server. Applications that use it only as an additional destination
lose their additional_destinations row for the server, and their
containers on it are stopped (best effort). The check for resources and
the transfer archive path use the same Server::primaryResources().
The delete confirmation lists the resources to delete and the
applications that keep running on another server.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:23:52 +01:00
Andras BacsaiandClaude Opus 5.5 9c6138fe18 fix(cleanup): stop loading deployment logs and unused backup executions
The stuck resources cleanup selected every column of every deployment,
including logs, and ran out of memory during app:init. Select only the
id and application_id. Also drop the unused executions property on the
backup pages and an unused execution loader.

Closes #12435

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:14:23 +01:00
Andras BacsaiandClaude Opus 5.5 ed03a31b3a fix(server): keep ip and user as strings after save
Closes #12444

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 17:52:35 +01:00
Andras Bacsai cf1e0e70c5 feat(deployments): cancel superseded deployments when a newer one is queued 2026-11-03 14:31:52 +01:00
Andras Bacsai 37b4a8b4e7 fix(mcp): keep the deployment source on additional servers and audit MCP calls as MCP 2026-11-03 14:00:17 +01:00
Andras Bacsai b063a41624 fix(mcp): save MCP deployments as MCP, not as API deployments 2026-11-03 13:56:43 +01:00
peaklabs-dev 32574d76b1 Merge remote-tracking branch 'origin/main' into next 2026-11-02 16:12:51 +01:00
Andras BacsaiandClaude Opus 5.5 5cf1abc0fc fix(env): keep pre-upgrade values for legacy compose variables
Closes #12408

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:49:11 +01:00
Andras BacsaiandClaude Opus 5.5 1af7de8a85 fix(backups): pin a reachable IP for S3 uploads on IPv6-only servers
mc keeps one --resolve IP per host, and Coolify always pinned the IPv4
address of a dual-stack endpoint. On servers without IPv4, uploads failed
with "network is unreachable". A helper container on the upload network
now connects to each validated IP, IPv4 first, and the first IP that
connects is pinned. S3 restores are now pinned in the same way.

Closes #12397

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:38:49 +01:00
peaklabs-dev bcd165a909 feat(install): add --preview and --nightly flags to install.sh
- Once Coolify is healthy, install.sh switches the instance to that update channel with php artisan app:update-channel
- The command and the update page share the rule that keeps the updates of the old channel after a switch to a more stable one
2026-11-02 00:07:20 +01:00
peaklabs-dev a608a37d8b feat: add update settings to the instance settings
- Adds the channels stable, preview, nightly and custom
- Preview and nightly read /coolify/release.json on the CDN and take the newest version of their channel and the more stable ones, nightly gets a new build of next or the release branch twice a day
- Custom installs any image tag of ghcr.io by hand, such as pr-1234 for the build of pull request 1234
- After a switch to a more stable channel, the instance keeps the updates of the channel it left until the stable release of its version is out
- The local versions.json moves to storage/app and is replaced in one step, a channel change replaces it without the version of the old channel
2026-11-02 00:04:26 +01:00
Andras Bacsai 091654ce7f feat(access): set member grants when inviting 2026-10-30 16:41:30 +01:00
Andras Bacsai 6f1905b7b0 fix(access): enforce member grants on more actions
- Require write access on the target environment to clone or move a resource
- Check read access on shared variables before a reference is added or resolved
- Limit team credentials, git sources, and imports of other backups to team-wide writers
- Require the delete level for backup, volume, storage, and task deletes
- Require create access for previews, new projects, and git sources
- Use the token team for the access scope, and check team-wide access on Livewire updates
- Require instance admin to toggle the API and MCP server
- Hide server pickers and broadcast details from members without access
2026-10-30 16:11:10 +01:00
Andras BacsaiandClaude Opus 5.5 5116a93f42 feat(api): add DNS, integration token and secret manager management (#12374)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:37:32 +01:00
Andras BacsaiandClaude Opus 5.5 76b89fa8e9 feat(api-tokens): edit token access and pause or resume tokens (#12396)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:20:19 +01:00
Andras BacsaiandClaude Opus 5.5 263eab5d27 feat(api-tokens): roll a token to replace its secret
Keep the description, permissions, scopes, and expiry. Move the row actions into a dropdown menu and measure the dropdown panel after it is shown, so menus at the right edge stay on screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:06:43 +01:00
github-actions[bot] edee5ccfd6 Merge remote-tracking branch 'origin/main' into next 2026-10-30 11:16:06 +00:00
Andras BacsaiandClaude Opus 5.5 b3ec26c3b1 fix(proxy): stop routing the Reverb HTTP API through the dashboard domain
The browser uses only the /app/{key} WebSocket. Laravel sends events to
Reverb over 127.0.0.1, so the generated Traefik and Caddy configs no longer
route /apps to port 6001, and the WebSocket rule only matches /app/.

Closes #12390

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 12:01:21 +01:00
github-actions[bot] 82764c6d79 Merge remote-tracking branch 'origin/main' into next 2026-10-29 22:37:14 +00:00
Andras Bacsai 72c8209285 feat(subscription): email checkout reminders for expired sessions
Enable Stripe checkout recovery links and send rate-limited reminders to the
admin who started an unfinished subscription checkout.
2026-10-29 23:35:34 +01:00
b85a9197a1 chore: merge main into next (#12382)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 21:10:39 +01:00
340de2684f chore: merge main into next (#12371)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 19:02:19 +01:00