2220 Commits
Author SHA1 Message Date
Andras BacsaiandClaude Opus 5.5 bf4b6ad921 feat(github): sync deployment status to GitHub Deployments (#12451)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:37:10 +01:00
Andras Bacsai cc996a1d9f fix(api): accept gitea_app_uuid when creating and updating applications
Add gitea_app_uuid to the allowed fields for application create and
update endpoints, with string validation on update, so Gitea App
sources can be set through the API.

Add a test checking that a closed GitLab merge request on the manual
webhook closes the matching preview and loads only applications of
that repository.
2026-11-05 11:32:50 +01:00
Andras BacsaiandClaude Opus 5.5 6ab538d0f1 fix(deploy): keep short-lived containers out of build --add-host
BuildKit keys every RUN step on the --add-host names, so a container
that joins or leaves the network between two builds rebuilt all layers.
Leave out database backup and S3 import helpers, Sentinel, and the
proxy error page container.

Closes #12452

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:31:49 +01:00
Andras BacsaiandClaude Opus 5.5 05e52fc41d fix(compose): keep dotted service names literal and validate service names
Updating the image of a service named like "api.test" wrote a nested
"test" key into the "api" service, because data_get/data_set split the
name on dots. Use array key paths instead. Also refuse service names that
Docker cannot use as a container name prefix, with a clear error on save.

Closes #12456

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:31:47 +01:00
Andras BacsaiandClaude Opus 5.5 32541a32ce fix(api): validate resource names and descriptions like the UI
The API and MCP saved names and descriptions that the UI rejects, so the
resource could not be saved in the UI after that. Applications, services,
databases, servers, and private keys now use the UI name and description
rules on create and update, with the UI error messages.

Closes #12466

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:29:05 +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 59481c7bb6 fix(api-tokens): keep token search in sync after create, edit, and revoke
Closes #12465

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:29:24 +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 25b4236e35 fix(api): check deploy access before a deploy writes a Docker image preview
The deploy endpoint now checks the deploy permission before it creates a
preview or changes its image tag, not only before it queues the deployment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:32:42 +01:00
Andras BacsaiandClaude Opus 5.5 997396b926 feat(cloud): save deleted users' emails and keep unsubscribed teams for 60 days
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 23:12:34 +01:00
Andras BacsaiandClaude Opus 5.5 232e8b8616 fix(backups): back up all databases by default for Odoo services
Odoo keeps its data in databases that the user creates in Odoo, so the
POSTGRES_DB=postgres database that the backup used was empty. Also show the
sections of the edit backup schedule modal without nested cards.

Closes #7555

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:49:38 +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 8d07d178f0 fix(log-drain): send Coolify labels to Fluent Bit drains
Containers without the Coolify default variables sent no project,
environment, or service to the drain. The fluentd driver now also sends
the Coolify container labels; the built-in configs use them as a
fallback and add coolify.service_name.

Closes #8415

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:42:37 +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 19e3918831 test(webhook): cover manual webhooks for two applications of one repository
Closes #7483

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:34:54 +01:00
Andras BacsaiandClaude Opus 5.5 0b45d8dd6c fix(env): quote old multi-line JSON values in the .env file
Variables saved before exact escaping wrote JSON objects and arrays
without quotes. A multi-line JSON value broke the .env file, so Docker
Compose stopped the deployment. These values now use exact escaping,
which gives the container the same value as before beta.463.

Closes #8279

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:34:42 +01:00
Andras BacsaiandClaude Opus 5.5 a7b7aa350a fix(telegram): send button links as text when Telegram rejects the button URL
Closes #8269

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:34:39 +01:00
Andras Bacsai c3e5b4ba73 test(env): cover spaced shared variable inside a longer value (#7202) 2026-11-03 22:34:25 +01:00
Andras BacsaiandClaude Opus 5.5 960471984c fix(cleanup): delete sessions older than the session lifetime
Closes #7394

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:33:27 +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 Bacsai 1b571f4509 fix(logs): cap streamed log reads so dockerd does not scan the full log file
Closes #7693
2026-11-03 22:22:22 +01:00
Andras BacsaiandClaude Opus 5.5 dec776025e fix(upgrade): finish the upgrade modal when the new version answers
Read the running version from the container that answers the status request, not from the old page state, so the modal shows success as soon as the new version is up. Hide all Livewire error pages while an upgrade runs.

Closes #8024

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:19:56 +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 4b9fe035dc fix(deployment): trust the server CA bundle in the helper container
BuildKit lets the Docker CLI in the helper fetch the registry token, and
the helper trusts only its own CAs. Behind a TLS-inspecting proxy, builds
failed with x509 errors although the server trusts the proxy CA. Mount
the server CA bundle read-only into the helper.

Closes #7568
2026-11-03 22:15:06 +01:00
Andras BacsaiandClaude Opus 5.5 3c87879e6b fix(compose): keep service names as hostnames in preview deployments
A preview renames its services to <name>-pr-<id>, so services that call
each other by their Compose names failed to start. Add the original name as an alias on the preview network.

Closes #8030

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:02:23 +01:00
Andras BacsaiandClaude Opus 5.5 5c71067481 fix(backups): limit the full backup run to its timeout
Each dump and S3 upload got the full backup timeout, so a long dump plus
an upload passed the worker timeout. The worker then killed the job
without cleanup: the execution stayed running, and the upload container
and the dump file stayed on the server.

- Give each step only the time that is left of the backup timeout, so a
  run that takes too long fails inside the job and cleans up.
- Run the dump once. An SSH retry started a second dump into the same
  file while the first could still run in the container.
- Explain exit code 124 and say in the timeout help that it covers the
  complete run.
- Remove backup upload containers of executions that are not running
  in the daily helper container cleanup.

Closes #8139

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 21:59:03 +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 33cb5e3c6a test: cover OAuth redirect URI, multi-domain previews, server clones
- Add SettingsOauth tests that reject redirect URIs off the provider
  callback route and accept the callback route with or without a
  trailing slash
- Add a compose preview test checking that every domain of a
  multi-domain service gets a PR-prefixed domain and its own Traefik
  Host rule
- Add a clone test checking that cloning a service to another server
  keeps its generated database credentials and copies its volumes
- Refresh template_last_updated_at timestamps in the service templates
2026-11-03 21:21:34 +01:00
Andras BacsaiandClaude Opus 5.5 2fbe9d2abe fix(proxy): notify once for each new Traefik patch version
Closes #9727

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:43:10 +01:00
Andras BacsaiandClaude Opus 5.5 1ff99b0dc8 fix(logs): start the log copy during the click so it works on iOS
Closes #9408

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:41: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 a05fe524f8 fix(storage): confirm volume renames because the data stays in the old volume
Closes #8816

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:34:55 +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 d6405d5545 fix(deployment): remove the helper container before restarting it with the same name
Docker frees the name of a stopped --rm container in the background, so
the second helper docker run for build secrets could fail with a name
conflict. Remove the old helper with docker rm -f before the run.

Closes #9363

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:31:55 +01:00
Andras BacsaiandClaude Opus 5.5 8c6774e17f fix(deploy): keep the helper Docker CLI on its buildx plugin
A build-time HOME or DOCKER_CONFIG variable moved the Docker CLI in the
helper away from /root/.docker/cli-plugins, so BuildKit builds failed with
"buildx component is missing or broken". Force DOCKER_CONFIG=/root/.docker
for the build command and for the helper when build secrets are passed.

Closes #9726

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:31:16 +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 Bacsai f21acdc3e4 fix(notifications): notify when a resource stops unexpectedly
Status checks now queue a delayed check for each application, preview,
service part, or database that goes from up to exited. After 2 minutes
it sends the "Resource status changes" notification if the resource is
still stopped, no deployment runs, and Coolify did not stop it. Each
resource sends at most one notification in 15 minutes.

Closes #9493
2026-11-03 20:18:50 +01:00
Andras BacsaiandClaude Opus 5.5 e20e652c00 fix(dns): check the closest Cloudflare wildcard for deeper domain names
Closes #12436

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:42:14 +01:00
Andras BacsaiandClaude Opus 5.5 d70801aaa1 fix(github): retry GitHub API reads on server and connection errors
Retry GET requests of githubApi() up to three times when GitHub answers
with a 5xx error or the connection fails. One 502 or one timeout on the
repository lookup before a deployment failed the deployment. Writes are
not retried, so a pull request comment is not posted two times. The
installation token request uses the same retry rule.

Closes #9785

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:42:04 +01:00
Andras Bacsai b7a2c75739 fix(github): check clock skew only from failed GitHub App responses
Stop calling /zen before each installation token request. A short
network problem to GitHub failed deployments with a cURL timeout on
/zen. assertGithubClockInSync now takes the failed response and reads
its Date header, so the "System time is out of sync" error still shows
when GitHub rejects the JWT.

Call it on failed JWT requests in the webhook installation check, the
permission job, the source connection test, and the server transfer
checklist. Remove the /zen fakes from the tests.
2026-11-03 19:29:45 +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 b7defddc32 fix(dns): verify the Cloudflare origin and add records for clones and API-created resources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:17:53 +01:00
Andras BacsaiandClaude Opus 5.5 f057aaf2e6 fix(rollback): list the commit images of Docker Compose applications
Closes #12446

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:14:32 +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 bb6dfd147e fix(mcp): queue MCP deployments behind a deployment in progress
The MCP deploy tool and control start skipped the deployment queue, so
two rolling updates of one application could run at once and remove the
new container of each other. A rolling update now also removes only the
containers that ran before it started.

Closes #12442

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:12:58 +01:00
Andras BacsaiandClaude Opus 5.5 777362cd97 feat(proxy): mark unused Traefik certificates and delete them in one step
Traefik renews every certificate in acme.json, also when no route uses
its domain. The TLS certificates page now marks certificates that no
Traefik label, proxy config file, or resource domain on the server uses,
and a "Delete unused" button removes them in one write with one backup.

Closes #12447

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:12:40 +01:00