2179 Commits
Author SHA1 Message Date
Andras BacsaiandClaude Opus 5.5 d9a22ce10e fix(api): keep omitted flags when patching application env variables
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:14:24 +02:00
Andras BacsaiandClaude Opus 5.5 9395c415b3 fix(env): keep preview copies of locked variables locked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:12:23 +02:00
Andras BacsaiandClaude Opus 5.5 386539ee30 fix(gitea): only instance admins can make a Gitea source system wide
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:08:14 +02:00
Andras BacsaiandClaude Opus 5.5 7e612422b6 fix(proxy): keep proxy status current and stop auto-start during restarts
- Refresh the navbar proxy status on the 30 s poll
- Skip Sentinel and server check auto-start while a proxy start or restart runs
- Use the StartProxy commands in RestartProxyJob, so Caddy restarts keep the
  maintenance blocks and remove the Traefik logrotate sidecar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:02:17 +02:00
Andras Bacsai 8aed790a78 fix(migration): block server migration when the target proxy is not running 2026-10-24 17:55:11 +02:00
Andras BacsaiandClaude Opus 5.5 32427a20f6 fix(ui): soften list separators and fix the page size control
- Row and section separators use a softer translucent divider token on all themes
- Page size trigger is an aligned bordered button ("10 / page")
- Pagination footer stays visible when a larger page size fits all rows
- Custom page size warns above the 100 maximum and the menu closes on select

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 14:04:43 +02:00
Andras BacsaiandClaude Opus 5.5 1527917523 feat(ui): make live refresh a toggle for any metrics and analytics range
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:24:52 +02:00
Andras Bacsai 3b92248309 fix(webhook): match repositories under self-hosted sub-paths 2026-10-24 12:08:35 +02:00
Andras BacsaiandClaude Opus 5.5 0eb78dcf9b feat(dev): pass the host NVIDIA GPU through to the KVM dev VM
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:16:47 +02:00
Andras Bacsai a3712f8902 fix(deploy): stop 502 errors during rolling updates
Traefik and Caddy routes of applications now retry a failed connection
on another container, and the rolling update waits a configurable drain
time (default 5 seconds) after the new container is healthy before it
stops the old containers. The wait is skipped when no old container runs
or when the proxy labels changed, because the proxy drops a route that
two containers define differently.

Fixes #8627
2026-10-24 11:16:46 +02:00
Andras BacsaiandClaude Opus 5.5 465344f1bc fix(ui): load no favicon from domains behind HTTP basic auth
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:23:49 +02:00
Andras BacsaiandClaude Opus 5.5 6c270a42db fix(service): remove the "Remove from Coolify only" delete option
A normal delete now removes a resource from Coolify also when its server
is not reachable, so the separate option only left untracked containers
running. The danger zone button is gone, and the services API rejects
delete_from_coolify_only with 422 instead of ignoring it, so old clients
do not delete Docker resources they asked to keep.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:18:51 +02:00
Andras BacsaiandClaude Opus 5.5 029827db9e fix(compose): load the Compose file from inside a Git submodule
The Compose file read uses a sparse clone without a checkout, so submodules
were never cloned. Now only the submodule that contains the Compose file is
cloned, with the credentials of the clone.

Closes #11018

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:13:00 +02:00
Andras BacsaiandClaude Opus 5.5 e49e540ec0 fix(applications): report a failed stop instead of failing silently
- Do not ignore errors of the docker stop and rm commands, so a failed SSH call
  does not mark a running application as exited.
- Log the failure and broadcast ApplicationStopFailed; the application page
  shows an error toast.

Closes #11063

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:45:13 +02:00
Andras Bacsai 18f74536e4 fix(server): validate servers without a proxy
Closes #11048
2026-10-24 00:45:06 +02:00
Andras BacsaiandClaude Opus 5.5 d542f13b9c fix(docker-cleanup): keep new images of deploying and Docker Compose applications
Each Docker Compose service image now has its own retention, images used by
any container count as in use, and applications with an active deployment
keep all their images.

Closes #11069

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:44:43 +02:00
Andras Bacsai bb3c400459 test(previews): cover portless compose links in pull request comments
Regression test for #11065. Since v4.3.15 (#11594) preview domains are
stored without the internal port, and every deployment regenerates them
before the ready comment is posted.
2026-10-24 00:44:35 +02:00
Andras Bacsai 14cdafdbe6 fix(previews): stop the preview DNS poll from re-queuing file sync jobs
The preview Domains component parsed the compose file on every render,
also on the 2-second DNS poll. Each parse queues a ServerFilesFromServerJob,
so a new file sync ran each time a worker started the previous one.

- Parse the compose services once on mount and on save, and keep them in
  a locked property.

Refs #11062
2026-10-24 00:43:59 +02:00
Andras Bacsai e0b6ac1121 fix(api): accept settings that the UI can change but the API rejected
- Applications: is_container_label_readonly_enabled (turning it back on
  regenerates labels), include_coolify_default_variables, and
  dockerfile_target_build on create.
- Databases: save is_log_drain_enabled on update instead of dropping it,
  include_coolify_default_variables, and disable_local_backup on backups
  (only with save_s3).
- Services: include_coolify_default_variables, and redirect on service
  applications (www/non-www needs both hosts).
- Servers: wildcard_domain, server_timezone,
  backup_compression_cpu_percentage, and the proxy error page.

Closes #11092
2026-10-24 00:40:19 +02:00
Andras BacsaiandClaude Opus 5.5 2ea1afb811 fix(server): explain why the Docker Engine version check failed
When "docker version --format json" did not return clean JSON (for
example, text from a shell startup file), validation stored 0.0.0 and
said that Docker was older than version 24. Validation now stores no
version and tells the user to run the command on the server. When the
version is too old, the message shows the detected version.

Closes #11089

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:32:14 +02:00
Andras BacsaiandClaude Opus 5.5 b76ffeec74 fix(deploy): stop false pending changes for apps without a configuration snapshot
The legacy configuration hash encoded serialized environment variable rows,
so hashes from older versions never matched after an upgrade, and the
fallback compared the configuration with an empty one. Apps without a
deployment snapshot now report no pending changes, and their next
deployment rebuilds the image.

Closes #11101

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:16:06 +02:00
Andras BacsaiandClaude Opus 5.5 e3ee4a99c5 fix(compose): create one service on repeated submits and reject compose without services
Closes #11078

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:14:46 +02:00
Andras BacsaiandClaude Opus 5.5 a836756e9b fix(backup): explain why a dump stopped without an error
Closes #11549

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:56:29 +02:00
Andras BacsaiandClaude Opus 5.5 35f6092127 fix(mcp): show only tools and actions the token can use in help and hints
Closes #12295

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:54:31 +02:00
Andras BacsaiandClaude Opus 5.5 3d4df5e06f fix(rollback): find the current image of containers with any name
The rollback image list inspected a container named after the bare
application UUID, so `current` was null for timestamped, prefixed, and
custom-named containers. Find the running production containers by their
owner labels instead.

Closes #12296

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:51:24 +02:00
Andras BacsaiandClaude Opus 5.5 1bebdffaff fix(deploy): keep the healthy new container when a rolling update fails late
Laravel runs failed() on a fresh copy of the job, so the in-memory
newVersionIsHealthy flag was always false there and a failure after the
old container stopped removed the only running container. Keep the flag
in the cache, keyed by the deployment UUID.

Closes #12253

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:03:33 +02:00
Andras BacsaiandClaude Opus 5.5 2a7faa1210 fix(docker-cleanup): skip scheduled cleanups while a deployment is running
Closes #12183

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:59:22 +02:00
Andras BacsaiandClaude Opus 5.5 19afd36084 fix(backup): keep privileges in PostgreSQL database backups
pg_dump ran with --no-acl --no-owner, so single-database backups lost
all GRANTs and a restored Supabase database did not work. The import
already skips owners and privileges unless "Keep owners and privileges"
is selected, so the backup now keeps them.

Closes #12244

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:35:45 +02:00
Andras BacsaiandClaude Opus 5.5 1e71561239 fix(backups): sign S3 uploads with the storage region
Closes #12264

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:28:48 +02:00
Andras Bacsai ab65fdccf9 fix(updates): report a failed manual update check instead of "No new version available"
Closes #12266
2026-10-23 22:27:07 +02:00
Andras BacsaiandClaude Opus 5.5 5131832cd8 fix(infisical): include imported secrets when fetching secrets
Closes #12267

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:26:32 +02:00
Andras BacsaiandClaude Opus 5.5 f72041c513 fix(metrics): even out chart density on long ranges
Sentinel keeps raw samples for the last 24-48 hours and one-minute
averages before that. LTTB buckets by point count, so 7-day and 30-day
charts gave most points to the raw part. Average those ranges per
minute before LTTB.

Closes #12281

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:26:24 +02:00
Andras BacsaiandClaude Opus 5.5 fdb77415a0 fix(api): scope database backup endpoints to the database type
Closes #12279

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:21:01 +02:00
Andras BacsaiandClaude Opus 5.5 f9649d753d fix(init): keep a detected public IP when the other family's lookup times out
Wait for each ifconfig.io lookup alone instead of through
Process::concurrently(), which throws on the first timeout and discards
the sibling result. Add --max-time 10 so a stalled lookup ends early.

Closes #12275

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:20:46 +02:00
Andras BacsaiandClaude Opus 5.5 9db8d55473 feat(canvas): let admins drag server zones on the servers and dashboard canvases
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:13:29 +02:00
Andras BacsaiandClaude Opus 5.5 9d82a76fc4 perf(metrics): fetch all Sentinel metric types in one SSH command
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:07:37 +02:00
Andras BacsaiandClaude Opus 5.5 c6fbeb84eb Merge branch 'fix/server-transfer-cloud-hardening' into main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 21:25:28 +02:00
Andras BacsaiandClaude Opus 5.5 cf9f254507 fix(server-transfer): close security holes in import, claim, and archives
Import:
- Check every uuid in a bundle against a strict id format before any
  write, and quote the SSH mux socket and key paths in local shell
  commands. A bundle uuid could run commands in the Coolify container.
- Validate bundle fqdns, git source URLs, paths, networks, cron
  expressions, and database ports; cap the number of items.
- Do not confirm that another team has a uuid.
- Refuse a project icon path with a uuid that is not a plain id.

Claim, finish, and migrate:
- Pass checklist step keys to wire:click with Js::from (stored XSS).
- Link only to https target server URLs.
- Validate target_instance_url in /transfer/complete; never prefill an
  unverified URL for a transfer back; scope the transfer-back token to
  write+deploy for 1 hour.
- Release on an owner marker only when it is newer than the own claim.
- Do not touch apps that only use the server as an additional
  destination when an archive is released or deleted.
- Give Sentinel a new token on claim.
- Add a checklist step to remove the previous instance's SSH key.
- Block a transfer while backups or scheduled tasks run.
- Authorize refreshMigration and PrivateKey checkConnection, clear
  tokens from Livewire state, hide migration log/error from members.

Archives:
- Refuse ip, user, port, private key, and Cloudflare tunnel changes.
- Throttle Enable management and require a free server slot for it and
  for a transfer back.
- Skip cloud provider calls.
- Re-read force_disabled before each SSH command, so running jobs stop.
- Probe the import check target at the resolved address only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 21:02:32 +02:00
Andras BacsaiandClaude Opus 5.5 7fa3110f0b feat(canvas): let admins drag project zones on the projects canvas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:57:56 +02:00
Andras BacsaiandClaude Opus 5.5 c410f355e7 fix(ui): declutter domains toolbar with DNS menu and card header
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:28:02 +02:00
Andras BacsaiandClaude Opus 5.5 95a3a22fdf fix(server-transfer): harden import on Cloud and stop archives from using server slots
- Rate limit the import check probe and refuse private, loopback, and
  link-local targets on Cloud.
- Rate limit the SSH validation that an import starts, like other
  server validations.
- Count only managed servers for the server limit, the limit check job,
  and the subscription page. Archives of transferred servers are left out.
- Do not show the name of another team's archived server in the import check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:12:59 +02:00
Andras Bacsai 6022073519 fix(notifications): use instance URL in volume backup notification links
Volume backup notifications built links with route(), which uses APP_URL
in queue jobs and gave http://localhost links. Build them from base_url().

Closes #12285
2026-10-23 20:05:23 +02:00
Andras Bacsai dcbad815fe fix(previews): keep compose preview data out of production pending changes
Closes #12284
2026-10-23 19:46:44 +02:00
Andras Bacsai b3bac27630 fix(ui): disable server menus that need a validated server 2026-10-23 19:32:03 +02:00
Andras BacsaiandClaude Opus 5.5 50243278fd fix(ui): show traffic analytics loading state on the button
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:31:57 +02:00
Andras BacsaiandClaude Opus 5.5 7de0e4cee8 fix(ui): quiet the dark sidebar and theme brand surfaces
- Make the dark sidebar a flat neutral #0d0d0d with neutral tiles, text,
  search, and account button; only the current item stays purple.
- Remove the resource row and spacer at the top of the main menu, so
  Dashboard sits under Search, and drop the unused nav context name.
- Route hard-coded brand purple, canvas, and card colors through tokens
  that the custom theme overrides, so sidebar, buttons, accents, cards,
  and tables follow the picked color.
- Paint page-level button and view-toggle tints over the canvas so the
  floating navigation dots do not show through.
- Document the new sidebar and token rules in DESIGN.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:15:32 +02:00
Andras BacsaiandClaude Opus 5.5 9a8b4eb53c fix(metrics): keep reachable servers online when Sentinel has no summary
Closes #12289

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:05:48 +02:00
Andras BacsaiandClaude Opus 5.5 95d796e922 feat(deployments): compact history beside logs with in-place switching
- Fit the embedded history to the logs height and page size to the screen
- Show status as a dot with short start time; add source, duration, and
  server as a second line; make whole rows clickable
- Switch the logs viewer to another deployment without a page load
- Use View and Export menus and the runtime logs search in the toolbar
- Export visible logs from the server with secrets hidden; redact app
  secrets in the full log download

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 12:34:08 +02:00
Andras Bacsai 2e7cf8633b feat(logs): pick runtime log streams from service selectors
Replace the container accordion with Deployment and Service selectors
that show one stream, merging replica containers by timestamp. The
viewer fills the page, opens in text view, keeps whitespace, and only
lets grid rows expand when the detail shows more than the row.

Based on the proposal in discussion #12176 by PhilippMolitor.
2026-10-23 11:55:44 +02:00
Andras Bacsai 6012232e97 fix(server): rate limit failed server validations on cloud 2026-10-23 11:10:02 +02:00