Commit Graph
14924 Commits
Author SHA1 Message Date
Andras Bacsai fb76b68c08 feat(api): support comments in bulk environment variable endpoints
Add support for optional comment field on environment variables created or
updated through the bulk API endpoints. Comments are validated to a maximum
of 256 characters and are nullable. Updates preserve existing comments when
not provided in the request.
2026-03-19 22:17:55 +01:00
Andras Bacsai 8a164735cb fix(api): extract resource UUIDs from route parameters
Extract resource UUIDs from route parameters instead of request body
in ApplicationsController and ServicesController environment variable
endpoints. This prevents UUID parameters from being spoofed in the
request body.

- Replace $request->uuid with $request->route('uuid')
- Replace $request->env_uuid with $request->route('env_uuid')
- Add tests verifying route parameters are used and body UUIDs ignored
2026-03-19 21:56:58 +01:00
Andras BacsaiandGitHub d0b4dc1c63 fix(stripe): add error handling and resilience to subscription operations (#9030) 2026-03-18 15:38:59 +01:00
Andras Bacsai 566744b2e0 fix(stripe): add error handling and resilience to subscription operations
- Record refunds immediately before cancellation to prevent retry issues if cancel fails
- Wrap Stripe API calls in try-catch for refunds and quantity reverts with internal notifications
- Add null check in Team.subscriptionEnded() to prevent NPE when subscription doesn't exist
- Fix control flow bug in StripeProcessJob (add missing break statement)
- Cap dynamic server limit with MAX_SERVER_LIMIT in subscription updates
- Add comprehensive tests for refund failures, event handling, and null safety
2026-03-18 15:21:59 +01:00
Andras Bacsai 426a708374 feat(subscription): display next billing date and billing interval
Add current_period_end to refund eligibility checks and display next billing
date and billing interval in the subscription overview. Refactor the plan
overview layout to show subscription status more prominently.
2026-03-18 15:11:19 +01:00
Andras Bacsai 23f9156c73 Squashed commit from 'qqrq-r9h4-x6wp-authenticated-rce' 2026-03-18 13:53:01 +01:00
Andras Bacsai f896d47b99 feat(environment-variable): add placeholder hint for magic variables
Add a placeholder message to the comment field indicating when an
environment variable is handled by Coolify and cannot be edited manually.
2026-03-17 10:11:26 +01:00
Andras Bacsai ed3b5d096c refactor(environment-variable): remove buildtime/runtime options and improve comment field
Remove buildtime and runtime availability checkboxes from service-type environment variables across all permission levels. Always show the comment field with a conditional placeholder for magic variables instead of hiding it. Add a lock button for service-type variables.
2026-03-17 09:52:29 +01:00
Andras Bacsai d4bf011a8e Merge remote-tracking branch 'origin/next' into next 2026-03-16 21:38:07 +01:00
Andras BacsaiandGitHub fd3fc17b2f fix: prevent sporadic SSH permission denied on key rotation (#8990) 2026-03-16 21:37:29 +01:00
Andras Bacsai 6325e41aec fix(ssh): handle chmod failures gracefully and simplify key management
- Log warnings instead of silently failing when chmod 0600 fails
- Remove redundant refresh() call before SSH key validation
- Remove storeInFileSystem() call from updatePrivateKey() transaction
- Remove @unlink() of lock file after filesystem store
- Refactor unit tests to use real temp disk and anonymous class stub
  instead of reflection-only checks
2026-03-16 21:27:10 +01:00
Andras Bacsai b448322a0c docs(sponsors): add ScreenshotOne as a huge sponsor 2026-03-16 21:22:42 +01:00
Andras Bacsai 2ba62ffe02 Merge remote-tracking branch 'origin/next' into next 2026-03-16 21:22:32 +01:00
Andras Bacsai 9976645c25 Merge remote-tracking branch 'origin/next' into fix/ssh-sporadic-permission-denied 2026-03-16 21:15:30 +01:00
Andras BacsaiandGitHub c09127c54b fix(preview): enable per-volume control of PR suffix in preview deployments (#9006) 2026-03-16 21:13:37 +01:00
Andras Bacsai 15d6de9f41 fix(storages): hide PR suffix for services and fix instantSave logic
- Restrict "Add suffix for PR deployments" checkbox to non-service
  resources in both shared and service file-storage views
- Replace condition `is_preview_deployments_enabled` with `!$isService`
  for PR suffix visibility in storages/show.blade.php
- Fix FileStorage::instantSave() to use authorize + syncData instead
  of delegating to submit(), preventing unintended side effects
- Add $this->validate() to Storages/Show::instantSave() before saving
- Add response content schemas to storages API OpenAPI annotations
- Add additionalProperties: false to storage update request schema
- Rewrite PreviewDeploymentBindMountTest with behavioral tests of
  addPreviewDeploymentSuffix instead of file-content inspection
2026-03-16 21:10:00 +01:00
Andras Bacsai fe1aa94144 Merge remote-tracking branch 'origin/next' into fix/ssh-sporadic-permission-denied 2026-03-16 20:26:56 +01:00
Andras Bacsai 0ffcee7a4d Squashed commit from '4fhp-investigate-os-command-injection' 2026-03-16 16:40:16 +01:00
Andras Bacsai 3ffe900b31 Merge remote-tracking branch 'origin/next' into 7802-volume-mappings-bug 2026-03-16 15:40:15 +01:00
Andras Bacsai 38df686718 Merge remote-tracking branch 'origin/next' into next 2026-03-16 15:40:05 +01:00
Andras Bacsai 1b0b230de2 fix(compose): include git branch in compose file not found error
Add the git branch to the "Docker Compose file not found" error message
to help diagnose cases where the file exists on one branch but not the
checked-out branch.
2026-03-16 15:39:24 +01:00
Andras Bacsai 9d745fca75 feat(api): expand update_storage to support name, mount_path, host_path, content fields
Add support for updating additional storage fields via the API while
enforcing read-only restrictions for storages managed by docker-compose
or service definitions (only is_preview_suffix_enabled remains editable
for those).
2026-03-16 15:37:46 +01:00
Andras Bacsai 0488a188a0 feat(api): add storages endpoints for applications
Add GET and PATCH /applications/{uuid}/storages routes to list and
update persistent and file storages for an application, including
support for toggling is_preview_suffix_enabled.
2026-03-16 15:34:27 +01:00
Andras Bacsai c9861e08e3 fix(preview): sync isPreviewSuffixEnabled property on file storage save 2026-03-16 15:13:36 +01:00
Andras Bacsai add16853a8 feat(preview): add configurable PR suffix toggle for volumes
Add `is_preview_suffix_enabled` flag to `local_file_volumes` and
`local_persistent_volumes` tables, allowing per-volume control over
whether a `-pr-N` suffix is appended during preview deployments.

Defaults to `true` to preserve existing behavior. Users can disable
it for volumes containing shared config or repository scripts that
should not be isolated per PR.
2026-03-16 14:54:22 +01:00
Andras BacsaiandGitHub c61d71966e feat(service): update databasus to v3.16.2 (#8586) 2026-03-16 13:46:14 +01:00
Andras BacsaiandGitHub b5e03c3a56 feat(service): Add librespeed (#8626) 2026-03-16 13:46:02 +01:00
Andras BacsaiandGitHub 44a36d0df9 chore(service): Update SeaweedFS images to version 4.13 (#8738) 2026-03-16 13:45:54 +01:00
Andras BacsaiandGitHub a8d3522653 fix(template): fix heyform template (#8747) 2026-03-16 13:45:44 +01:00
Andras BacsaiandGitHub 2d1bad5f39 feat(templates): Add imgcompress service, for offline image processing (#8763) 2026-03-16 13:45:34 +01:00
Andras Bacsai 1b484a56b0 chore: remove coolify-examples-1 submodule 2026-03-16 13:37:14 +01:00
Andras Bacsai 5b424f1f0e fix(preview): exclude bind mounts from preview deployment suffix
Bind mount volumes reference files at the repository's original path and
should not receive the -pr-N suffix. Only named Docker volumes require
the suffix for isolation between preview deployments.

Adds PreviewDeploymentBindMountTest to verify the correct behavior.

Fixes #7802
2026-03-16 13:33:58 +01:00
pannous 2f96a759df test: add behavioral ssh key stale-file regression 2026-03-16 10:40:22 +01:00
pannous 4bf94fac2d fix: prevent sporadic SSH permission denied by validating key content
The root cause of sporadic "Permission denied (publickey)" errors was
that validateSshKey() only checked if the key file existed on disk,
never verifying its content matched the database. When keys were rotated
or updated, the stale file persisted and SSH used the wrong key.

Changes:
- validateSshKey() now refreshes key from DB and compares file content
- Server saved event detects private_key_id changes to invalidate mux
- PrivateKey storeInFileSystem() uses file locking to prevent races
- PrivateKey saved event auto-resyncs file on key content changes
- Enforces 0600 permissions on key files

Fixes coollabsio/coolify#7724
2026-03-15 03:06:21 +01:00
Andras BacsaiandGitHub 74d591e6e9 feat(server): auto-fetch server metadata after validation (#8964) 2026-03-13 17:08:15 +01:00
Andras Bacsai 1936bb08bf feat(server): auto-fetch server metadata after validation
Server metadata is now automatically gathered when server validation completes successfully, both in the async job and Livewire component. This ensures server details (OS, CPU count, etc.) are populated immediately after validation passes, improving the user experience without requiring manual metadata fetching.

Tests added to verify gatherServerMetadata is called on successful validation and skipped when validation fails.
2026-03-13 17:07:50 +01:00
Andras BacsaiandGitHub 9c0966c08a feat(compose-preview): populate fqdn from docker_compose_domains (#8963) 2026-03-13 17:02:26 +01:00
Andras Bacsai c39a287b47 feat(compose-preview): populate fqdn from docker_compose_domains
The generate_preview_fqdn_compose method now extracts and populates the fqdn field from docker_compose_domains, making it available for webhook notifications. This handles multiple domains across services and gracefully sets fqdn to null when no domains are configured.
2026-03-13 17:02:05 +01:00
Andras BacsaiandGitHub cde0bebfd4 feat(server): allow force deletion of servers with resources (#8962) 2026-03-13 17:00:37 +01:00
Andras Bacsai b8390482b8 feat(server): allow force deletion of servers with resources
Add ability to force delete servers along with their defined resources:
- API: Accept ?force=true query parameter in DELETE /servers endpoint
- UI: Display checkbox option to delete all resources in deletion dialog

When force deletion is enabled, all associated resources are dispatched
via DeleteResourceJob before the server is removed, enabling one-step
deletion instead of requiring manual resource cleanup first.
2026-03-13 16:58:26 +01:00
Andras BacsaiandGitHub d5b3a0380c fix(docker-compose): respect preserveRepository when injecting --project-directory (#8956) 2026-03-13 13:55:50 +01:00
Andras BacsaiandGitHub c8046c6cd1 fix(api): allow is_container_label_escape_enabled in service operations (#8955) 2026-03-13 13:55:46 +01:00
Andras Bacsai a97612b29e fix(docker-compose): respect preserveRepository when injecting --project-directory
When adding --project-directory to custom docker compose start commands,
use the application's host workdir if preserveRepository is true, otherwise
use the container workdir. Add tests for both scenarios and explicit paths.
2026-03-13 13:53:03 +01:00
Andras Bacsai b9cae51c5d feat(service): add container label escape control to services API
Add `is_container_label_escape_enabled` boolean field to services API,
allowing users to control whether special characters in container labels
are escaped. Defaults to true (escaping enabled).

When disabled, users can use environment variables within labels.
Includes validation rules and comprehensive test coverage.
2026-03-13 13:32:58 +01:00
ShadowArcanistandGitHub c25e59e7ed chore(service): pin imgcompress to a static version instead of latest 2026-03-13 12:28:25 +05:30
ShadowArcanistandGitHub 35eb5cf937 chore(service): remove unused attributes on imgcompress service 2026-03-13 12:27:55 +05:30
Andras BacsaiandGitHub 6408718ad1 fix(service): hoppscotch fails to start due to db unhealthy (#8949) 2026-03-13 07:56:47 +01:00
Andras BacsaiandGitHub 0cfc930ec8 Change Castopod service port from 8000 to 8080 (#8817) 2026-03-13 07:55:47 +01:00
Andras BacsaiandGitHub 413d0747cf feat(service): update n8n-with-postgres-and-worker to 2.10.4 (#8807) 2026-03-13 07:55:23 +01:00
ShadowArcanistandGitHub 963e335621 chore(service): pin castopod service to a static version instead of latest 2026-03-13 12:05:06 +05:30