1670 Commits
Author SHA1 Message Date
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 106a6d7ac0 fix(env): resolve and redact server-scoped shared variables in compose
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 12:16:39 +01:00
Andras BacsaiandClaude Opus 5.5 70adcc2b0e feat(databases): use newer default images for standalone databases
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:46:01 +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 Bacsai 13298591d8 fix(api): throttle API clients that keep failing and notify the token's team
- Return 429 after 30 failed (401/403/404) requests per minute for one
  token or IP, also for unknown API routes (API_FAILED_REQUEST_RATE_LIMIT)
- Notify the team once a day when a token reaches the limit
- Deduplicate ability_denied and scope_denied audit events for 5 minutes
2026-11-05 23:38:37 +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 5c34a1b3d4 fix(sentinel): stop rejected Sentinel pushes and reduce their audit rows
- Reply 410 for deleted servers and 402 for unpaid teams, with Retry-After
- Remove the Sentinel container of unpaid servers once a day, and before a server is deleted
- Record server_not_found and subscription_unpaid push failures once per hour
- Audit scheduled task API updates only for fields that really changed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:19:14 +01:00
Andras BacsaiandClaude Opus 5.5 9a6cc8316e fix(horizon): route Sentinel push jobs to a dedicated cloud sentinel queue
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 22:49:56 +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 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 4bdf03db69 fix(keys): generate 4096-bit RSA keys
GitHub rejects new RSA SSH keys smaller than 3072 bits, and phpseclib
made 2048-bit keys by default, so new RSA deploy keys from Coolify
could not authenticate.

Closes #12461

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:26:31 +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 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 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 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 780d67ccbb fix(storage): stop a deleted volume from coming back after a redeploy
Docker Compose gives a recreated container the old mount at each path
that the image declares with VOLUME, also a volume deleted in Coolify.
Before `up`, remove only containers that still mount a Coolify volume
whose storage entry was deleted. The stale volume delete dialog now
warns when a container still uses the volume.

Closes #6875

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:01:54 +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 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 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 d3ef4d1c57 fix(service): route the rybbit /api path to the backend
The Rybbit template had a proxy route only for the client, so the
/api requests of the browser got a 404 from the client and sign-up
and login failed. The backend now declares SERVICE_URL_RYBBIT_3001=/api
on the same host and keeps the /api prefix. The backend is listed
before the client, so SERVICE_URL_RYBBIT (used in BASE_URL) stays the
root URL.

Closes #9055

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:19:27 +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 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 c94411fb92 fix(clone): do not copy preview records when an application is cloned
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:05:11 +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 Bacsai 6977caaa9b fix(service): store the Compose default for bare variable references
Closes #12412
2026-11-02 14:55:44 +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 972ab7f6f4 fix(deployments): keep build secret values out of Compose runtime
Unset the helper's build secret variables before Compose pulls or starts
services, so containers get the runtime .env values. Give build secrets
the raw stored value instead of the quoted .env form.

Closes #12409

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:22:47 +01:00
peaklabs-dev 0e30950793 feat(release): streamline versions.json on the CDN
- Every channel has a block of its own, every version after this one reads only these blocks
- Every stable sync also fills the coolify and traefik keys older instances read
- An instance keeps a copy of versions.json and reads upstream.json of the image until it has 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
peaklabs-dev 06ad71439c build: move the helper image to coollabsio/coolify-helper
- Docker Compose builds the development helper from the main branch of that repository, scripts/dev-helper from there or from a local checkout
- Remove buildHelperImage from the settings, nothing calls it since its button was removed
2026-11-02 00:03:45 +01:00
peaklabs-dev 02c370d34b ci: use the new release process
- build.yaml and release.yaml replace the main, next, rc, release and hotfix workflows
2026-11-01 15:16:40 +01:00
peaklabs-dev f780d7429c feat(database): bump the SQLite image to 3.54.1-v0.2.0 2026-10-30 18:27:16 +01:00
github-actions[bot] a0b56bc42f Merge remote-tracking branch 'origin/main' into next 2026-10-30 16:29:43 +00:00
Andras BacsaiandClaude Opus 5.5 49346aeb29 fix(ui): restore the main menu row that reopens the resource menu
- On a resource page, the main menu starts with a row that shows the
  resource name and opens the deepest resource menu again.
- Pass the resource name to registerMainNavContext() again.
- Document the row in DESIGN.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 17:21:08 +01:00
github-actions[bot] edee5ccfd6 Merge remote-tracking branch 'origin/main' into next 2026-10-30 11:16:06 +00:00
Andras Bacsai 98b7de0ea7 fix(api): accept the same port mappings as the UI
Closes #12388
2026-10-30 11:43:13 +01:00
Andras BacsaiandClaude Opus 5.5 4b541011c9 fix(api): hide locked values in resource and environment lists
Closes #12391

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 11:23:16 +01:00
github-actions[bot] 25bbb69381 Merge remote-tracking branch 'origin/main' into next 2026-10-28 21:17:02 +00:00
Andras Bacsai 57cdd92f7c fix(upgrade): count only scheduled jobs running on this host 2026-10-28 22:13:40 +01:00