1670 Commits
Author SHA1 Message Date
Andras Bacsai bf957e425f fix(docker): parse quoted and hyphenated custom docker option values (#12208) 2026-10-19 23:12:16 +02:00
Andras Bacsai cf71fda5c1 feat(gitea): add Gitea App sources and private repo deployments (#12234) 2026-10-19 21:58:30 +02:00
Andras Bacsai 62be8674bc feat(proxy): add optional permanent redirects for apps and services (#12233) 2026-10-19 21:46:12 +02:00
Andras Bacsai fb6d3e7c9b fix(proxy): exclude SSE streams from Traefik compression (#12229) 2026-10-19 21:43:51 +02:00
Andras Bacsai 54315b10e5 fix(compose): strip UTF-8 BOM before parsing Docker Compose YAML (#12223) 2026-10-19 21:21:15 +02:00
Andras Bacsai b4c3101b29 fix(compose): reject scale and replicas greater than one (#12213) 2026-10-19 21:08:06 +02:00
Andras Bacsai dd456625ec Merge remote-tracking branch 'origin/release/v4.5' into release/v4.5 2026-10-19 15:03:38 +02:00
Andras BacsaiandClaude Opus 5.5 ad6e929a93 feat(gpu): fix GPU compose settings and show detected server GPUs
- Build a valid compose device request (device_ids list, options mapping, blank driver)
- Map --gpus N to count and drop --gpus when GPU settings are enabled
- Validate only changed GPU values so stored legacy values keep working
- Detect NVIDIA GPUs and the container toolkit with the server details
- Show detected GPUs with a refresh button in the application GPU section

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 15:00:31 +02:00
Andras BacsaiandClaude Opus 5.5 fb317d7129 chore: remove Sentry integration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:14:35 +02:00
22a8c09dd6 Next (#12202)
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rosslh <ross@rosshill.ca>
Co-authored-by: Abdulfetah Suudi <suudiabdulfetah@gmail.com>
Co-authored-by: Dharmveer <51308779+dharmveer97@users.noreply.github.com>
Co-authored-by: Maxwell <136101+mxswd@users.noreply.github.com>
2026-10-19 10:07:23 +02:00
Andras Bacsai 32096d53f1 Merge remote-tracking branch 'origin/release/v4.5' into pr-12202-next
# Conflicts:
#	.ai/lessons.md
#	app/Actions/Server/CleanupDocker.php
#	app/Http/Controllers/Api/DatabasesController.php
#	app/Http/Controllers/Api/ServerCanvasController.php
#	app/Http/Controllers/Api/ServicesController.php
#	app/Http/Middleware/ApiIpAllowed.php
#	app/Jobs/VolumeBackupJob.php
#	app/Livewire/Concerns/RemembersCanvasView.php
#	app/Livewire/Fleet/Metrics.php
#	app/Livewire/Project/Database/BackupEdit.php
#	app/Livewire/Project/Service/BackupExecutions.php
#	app/Livewire/Project/Shared/EnvironmentVariable/All.php
#	app/Livewire/Project/Shared/Storages/VolumeBackups.php
#	app/Livewire/Security/ApiTokens.php
#	app/Livewire/Tags/Show.php
#	app/Models/ApplicationSetting.php
#	app/Models/Service.php
#	app/Rules/ValidGitRepositoryUrl.php
#	app/Services/EnvironmentCanvas.php
#	app/Services/ProjectCanvas.php
#	app/Services/ServerCanvas.php
#	app/Services/ServerTransfer/ServerTransferExporter.php
#	app/Services/ServerTransfer/ServerTransferImporter.php
#	app/Services/ServerTransfer/ServerTransferMigrator.php
#	app/Services/SharedVariableCanvas.php
#	app/Traits/ExecutesDatabaseStartCommands.php
#	app/Traits/HasS3Replicas.php
#	bootstrap/helpers/shared.php
#	config/constants.php
#	other/nightly/versions.json
#	resources/css/app.css
#	resources/js/canvas-core.js
#	resources/js/canvas/deploy/DeployCanvas.svelte
#	resources/js/canvas/deploy/state.svelte.js
#	resources/js/canvas/deploy/styles.js
#	resources/js/canvas/environment/Card.svelte
#	resources/js/canvas/environment/EnvironmentCanvas.svelte
#	resources/js/canvas/environment/Panel.svelte
#	resources/js/canvas/environment/StatusDot.svelte
#	resources/js/canvas/environment/Toolbar.svelte
#	resources/js/canvas/environment/Zone.svelte
#	resources/js/deploy-canvas.test.js
#	resources/js/environment-canvas.js
#	resources/js/environment-canvas.test.js
#	resources/views/components/canvas-view-toggle.blade.php
#	resources/views/components/navbar.blade.php
#	resources/views/components/server/sidebar.blade.php
#	resources/views/components/shared-variables/layout.blade.php
#	resources/views/components/shared-variables/sidebar.blade.php
#	resources/views/components/top-user-menu.blade.php
#	resources/views/layouts/app.blade.php
#	resources/views/livewire/fleet/metrics.blade.php
#	resources/views/livewire/project/database/backup-edit/s3.blade.php
#	resources/views/livewire/project/database/backup-executions.blade.php
#	resources/views/livewire/project/environment-canvas.blade.php
#	resources/views/livewire/project/new/select.blade.php
#	resources/views/livewire/project/project-canvas.blade.php
#	resources/views/livewire/project/projects-canvas.blade.php
#	resources/views/livewire/project/shared/environment-variable/all.blade.php
#	resources/views/livewire/project/shared/storages/volume-backups/s3.blade.php
#	resources/views/livewire/security/api-tokens.blade.php
#	resources/views/livewire/server/canvas.blade.php
#	resources/views/livewire/server/index.blade.php
#	resources/views/livewire/server/navbar.blade.php
#	resources/views/livewire/server/partials/localhost-general.blade.php
#	resources/views/livewire/server/show.blade.php
#	resources/views/livewire/settings/advanced.blade.php
#	resources/views/livewire/shared-variables/canvas.blade.php
#	resources/views/livewire/tags/canvas.blade.php
#	resources/views/livewire/tags/show.blade.php
#	routes/web.php
#	tests/Feature/ApiDisabledCalloutTest.php
#	tests/Feature/BackupS3DestinationsFormTest.php
#	tests/Feature/DatabaseStartContentFilesTest.php
#	tests/Feature/DockerCleanupJobTest.php
#	tests/Feature/EnvironmentCanvasTest.php
#	tests/Feature/InstanceBackupMultipleS3DestinationsTest.php
#	tests/Feature/Livewire/Fleet/MetricsChartPayloadTest.php
#	tests/Feature/Livewire/Fleet/MetricsDataTest.php
#	tests/Feature/Mcp/McpEndpointTest.php
#	tests/Feature/Mcp/McpToggleApiTest.php
#	tests/Feature/ProjectCanvasTest.php
#	tests/Feature/ServerCanvasTest.php
#	tests/Feature/SharedVariableCanvasTest.php
#	tests/Feature/VolumeBackupTest.php
#	tests/Unit/ScpStyleGitUrlTest.php
#	tests/Unit/ServerTransfer/ServerTransferS3DestinationsTest.php
#	tests/v4/Browser/DeployCanvasTest.php
#	versions.json
2026-10-19 10:00:21 +02:00
Andras BacsaiandClaude Opus 5.5 a82d32c946 chore: merge main into release/v4.5
Resolve conflicts between main's security fixes and v4.5 features:
- Keep v4.5 features (log redaction, multi-S3 backups, transfer flow,
  scheduled task modal, sidebar) and port main's fixes into them.
- Reuse RequiresDeployAbility for the Hostinger create endpoint.
- Align MCP tool abilities and descriptions with main's new deploy
  requirements, and use deploy tokens in the affected MCP tests.
- Drop the duplicate DockerCleanupJobTest helper and tests, and the
  exportBundle test for a method v4.5 removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:00:05 +02:00
Andras Bacsai 7fe40f4cf6 fix(api): require deploy ability for server side effects
Require deploy permission for API changes that trigger server side effects, including resource deletion, storage access, provider operations, and database imports. Also escape Docker cleanup filters and sanitize log drain server names.
2026-10-19 09:07:42 +02:00
e3d4411ff2 chore: merge main into release/v4.5 (#12192)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Furox <177975472+Furox-Art@users.noreply.github.com>
Co-authored-by: johandenhollander <johan.den.hollander@finalist.nl>
Co-authored-by: João Cruz <161638790+SrJooJ@users.noreply.github.com>
Co-authored-by: Saim Hashmi <hashmisaim037@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-18 23:43:20 +02:00
MaxwellandAndras Bacsai 0bc1288e81 Added docker awslogs driver to log drains (#11972)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
2026-10-18 23:20:42 +02:00
Andras BacsaiandClaude Opus 5.5 8ed31bb96e feat(env): restore Coolify default variables with a per-resource option
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 12:55:53 +02:00
Andras Bacsai fc4562ede7 fix(services): treat SERVICE_FQDN_ twin as a copy of SERVICE_URL_ declaration
A service that declares SERVICE_FQDN_X_PORT while the named service declares
SERVICE_URL_X_PORT (same value) now counts as a copy, like an exact copy, so it
does not take the named service's domain. Also replace the Postgres-only
regex in the magic variable loop with the same check in PHP.
2026-10-18 11:29:39 +02:00
Andras Bacsai 699cd361b4 fix(services): keep SERVICE_URL_* on the named service domain
When a compose service copies another service's SERVICE_URL_/SERVICE_FQDN_
declaration (old Twenty template: worker repeats SERVICE_URL_TWENTY_3000),
the parser and updateCompose wrote the variable from the copier's generated
domain, so a custom domain on the named service was lost on every deploy.
Skip exact copies; declarations with another path or port are unchanged.

Closes #11924
2026-10-16 23:05:06 +02:00
Andras Bacsai 1f08c62564 Merge remote-tracking branch 'origin/main' 2026-10-16 00:27:17 +02:00
Andras BacsaiandClaude Opus 5.5 ea483d179b feat(settings): add Detect button for instance public IPs
Closes #11802

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 00:24:13 +02:00
Saim Hashmi d712afbc04 fix(media): stop building unauthenticated public URLs for S3-compatible avatars/icons (#11865) 2026-10-16 00:18:36 +02:00
Andras BacsaiandClaude Opus 5.5 70d4dad494 fix(settings): keep manually set instance public IPs on restart
Closes #11802

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 00:16:20 +02:00
Andras Bacsai d60d3a5b9d fix(service): replace removed MinIO images with pgsty/silo
Closes #11975
2026-10-15 23:32:06 +02:00
Andras BacsaiandClaude Opus 5.5 2a202d9fe9 fix(domains): apply noindex to domains that include a port
Closes #11965

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 23:20:23 +02:00
Andras Bacsai bcf4663f0c fix(domains): resolve server hostname to IP for sslip.io domains
Closes #12009
2026-10-15 23:15:30 +02:00
Andras BacsaiandClaude Opus 5.5 7466da12a2 fix(git): accept ssh:// repository URLs with custom ports
The repository URL rule rejected ssh://user@host:port/path, so deploy-key
resources on servers with a custom SSH port needed a manual URL edit after
creation. Accept ssh:// URLs and keep them unchanged for deploy keys so the
port reaches the clone. Rename scpStyleGitUrlToHttps to sshGitUrlToHttps and
let it convert ssh:// URLs too, so public flows, repository links and GitHub
App repository slugs handle them.

Closes #12161

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:30:26 +02:00
Andras BacsaiandClaude Opus 5.5 00678a12f0 fix(deployments): retry transient GitHub token and clone failures
Retry the installation token request on GitHub 5xx and connection errors,
and report the HTTP status when GitHub sends no error message. Retry the
repository import when SSH drops the connection (exit code 255), after
stopping the interrupted clone and removing the partial checkout.

Closes #8004

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:06:57 +02:00
Andras BacsaiandClaude Opus 5.5 19430b461a fix(github): check push watch paths against the net change of the push
Closes #10937

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:06:30 +02:00
cf6350e665 feat(analytics): city-level traffic analytics, sortable tables, lighter globe (#12158)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:24:06 +02:00
Andras Bacsai 2c973d68c4 fix(github): paginate PR files for watch paths and reuse installation tokens
- Fetch every page of pull request files so watch paths match PRs with more than 30 files.
- Deploy the preview and log a warning when the changed-file list is unknown (API error or truncated compare list).
- Log when watch paths decline a preview deployment.
- Keep the GitHub App installation token in memory per instance, so a deployment requests one token instead of 3-5.

Closes #12169
2026-10-15 14:45:45 +02:00
Andras Bacsai fdd69977a4 feat(canvas): show empty environments as placeholder cards
Environments without resources now appear as placeholder cards on the
project, team projects and server canvases. They sit in the zone that
holds most of their project's cards, or in a new "Empty environments"
zone when there is none. A new EmptyCard component renders them.

- Project canvas: admins can move groups and cards, and the moves are
  saved on their environment canvas. Environments are ordered by id.
- Server canvas: admins can move single cards as well as groups.
- Shared variable canvas: built-in COOLIFY_SERVER_UUID/NAME variables
  and their links are hidden on server scope.
- Main nav: resource menus register through registerMainNavContext()
  with depth levels (#main-nav-context-{depth}). Back goes one level
  lower, and Back at depth 0 returns to the main menu.
- The deploy canvas state, styles and controls are simplified, and the
  related sidebar, navbar and dashboard views are updated.

Tests are added or updated for the canvases and the main nav resource
menus.
2026-10-15 08:46:44 +02:00
6b07f03107 feat(terminal): interactive console mode for containers (docker attach) (#11538)
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rosslh <ross@rosshill.ca>
2026-10-14 14:32:02 +02:00
Andras Bacsai 33ee09fa87 feat(canvas): add interactive resource views and team avatars (#12160) 2026-10-14 09:28:10 +02:00
Andras Bacsai 448dc8ea0a feat(logging): strengthen secret redaction and add admin controls (#12151) 2026-10-13 20:43:19 +02:00
Andras Bacsai 4f92d3c094 feat(auth): add passkey sign-in (#12154) 2026-10-13 10:10:03 +02:00
Andras Bacsai 2fa4d06ed6 fix(auth): allow restricted accounts to confirm passwords for passkeys 2026-10-13 10:09:48 +02:00
Aditya Tripathi 7bed78c81e feat(auth): add passkey sign-in
Enable Fortify passkeys (laravel/passkeys) with the @laravel/passkeys
client. Users can sign in with a passkey, confirm sensitive actions with
one, and add, rename, and delete passkeys on the Profile page.

- Resolve the relying party for each request from the instance URL, then
  APP_URL, then localhost. Passkey routes return 404 on other hosts.
- Add the is_passkey_enabled instance setting (Settings > Advanced).
- Use a hex user handle (laravel/passkeys-server#41).
- Rate limit the passkey routes by client IP.
- Record audit events for registered, verified, and deleted passkeys.
2026-10-13 04:01:40 +00:00
Andras Bacsai 83384a7b95 Merge remote-tracking branch 'origin/release/v4.5' into automation/sync-main-to-release-v4.5 2026-10-12 22:30:41 +02:00
Andras Bacsai 200af07225 Merge remote-tracking branch 'origin/release/v4.5' into automation/sync-main-to-release-v4.5 2026-10-12 21:38:45 +02:00
Andras BacsaiandClaude Opus 5.5 213a61b7ab fix(env): pass exact env values to containers, keep old escaping for existing variables (#12024)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 13:06:45 +02:00
Andras Bacsai 1d7bee0b83 fix(compose): preserve long bind options and non-creating sources (#12135) 2026-10-11 21:02:29 +02:00
Andras Bacsai cdd8f82840 fix(compose): preserve environment variable semantics (#11794) 2026-10-11 21:02:11 +02:00
Andras Bacsai 1e42284db0 feat(proxy): override the Traefik certificate resolver per resource
Applications and service applications can now use the server resolver,
no resolver ("none"), or a custom resolver name. This allows servers
that mix Let's Encrypt domains with domains that use their own
certificates, such as Cloudflare Origin CA. The setting is available in
the UI and the API.

Closes #12138
2026-10-11 19:01:27 +02:00
Andras Bacsai af589f6da4 feat(proxy): make the Traefik certificate resolver configurable per server
Coolify always added tls.certresolver=letsencrypt to generated HTTPS
routers, so Traefik logged errors when the proxy used its own
certificates (for example Cloudflare Origin CA) without that resolver.
Add a server setting (default letsencrypt) in the proxy page and API.
An empty value omits the resolver from resource labels, the Coolify
dashboard routes, and the catch-all router.

Closes #12138
2026-10-11 10:19:40 +02:00
Andras Bacsai 0873616a7f fix(dns): retry custom DNS queries over TCP when UDP answer is truncated
Closes #12076
2026-10-09 15:34:26 +02:00
Andras Bacsai 8e0f4d0dfa fix(database): prevent duplicate environment variables on start and clone
- Stop the Redis username accessor from creating REDIS_USERNAME on read
- Keep source values when cloning applications (no duplicate NIXPACKS_NODE_VERSION)
- Match exact keys when adding default database environment variables
- Write content files before database containers start
- Resolve the database proxy upstream through Docker DNS on each connection
- Remove existing duplicate REDIS_USERNAME and NIXPACKS_NODE_VERSION rows
2026-10-09 14:53:05 +02:00
Andras Bacsai f39c884cc7 fix(servers): support IPv6 server addresses everywhere
Store server IPs in one form (no brackets, short lower-case IPv6) and
write each address in the form its context needs:

- URLs and host:port (Sentinel, database URLs, SFTP backup download,
  DNS servers, SMTP, webhook base URLs, links, health checks) get
  brackets through formatHostForUrl().
- Traefik Host() rules use the address without brackets, so IPv6
  domains no longer return 404; saved labels are fixed at deploy.
  Caddy keeps the brackets.
- SSH keeps the plain address.
- Hetzner gives an IPv6 /64 network; IPv6-only servers now get the
  server address (prefix::1) instead of the unusable prefix::64.
- sslip labels, registry image names with an IPv6 host, the API domain
  list, allowlist matching and duplicate checks handle IPv6.

A migration normalizes stored IPv6 server addresses, repairs Hetzner
servers saved as ::64 that are not reachable, and adds brackets to
saved Sentinel URLs.
2026-10-09 13:50:28 +02:00
Andras Bacsai 8c4aa7bb00 feat(git): allow IPv4 and IPv6 addresses in repository URLs
Accept HTTP(S), git:// and SCP-style SSH repository URLs whose host is an
IP address, including bracketed IPv6 such as git@[2a01:4f8::1]:org/repo.git.
The clone runs on the user's deployment server, so the IP block did not
protect Coolify, and SSH URLs with IPv4 already passed.

Loopback, link-local and other reserved addresses are still rejected as
internal hosts. Brackets are allowed only around a valid IPv6 host.
2026-10-09 09:31:07 +02:00
Andras Bacsai 247015e30a fix(docker): match legacy Compose containers by UUID in names
Resolve application owners from dash-separated UUIDs in Compose service or coolify.name labels, and include service-prefixed names in Docker filters.

Add regression coverage for custom Compose start commands, status updates, and UUID boundary matching.
2026-10-09 08:45:32 +02:00
Andras Bacsai ea1199bf8e fix(compose): allow required and alternative variables in network names
Accept the `?`, `:?`, `+` and `:+` interpolation operators in Compose
network names, such as `${CONTAINER_NAME?error}`. The validation added
in v4.4.0 only knew `-` and `:-`, so these valid files stopped deploying.

The text after `?` is an error message and is not used as the default of
the created environment variable. Unsafe operands are still rejected.

Fixes #12126
2026-10-09 08:45:03 +02:00