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
This commit is contained in:
Andras Bacsai
2026-10-19 10:00:21 +02:00
525 changed files with 51706 additions and 5132 deletions
+314 -20
View File
@@ -846,7 +846,7 @@
},
"watch_paths": {
"type": "string",
"description": "The watch paths."
"description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns."
},
"use_build_server": {
"type": "boolean",
@@ -1476,7 +1476,7 @@
},
"watch_paths": {
"type": "string",
"description": "The watch paths."
"description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns."
},
"use_build_server": {
"type": "boolean",
@@ -2106,7 +2106,7 @@
},
"watch_paths": {
"type": "string",
"description": "The watch paths."
"description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns."
},
"use_build_server": {
"type": "boolean",
@@ -3586,18 +3586,6 @@
"application\/json": {
"schema": {
"properties": {
"project_uuid": {
"type": "string",
"description": "The project UUID."
},
"server_uuid": {
"type": "string",
"description": "The server UUID."
},
"environment_name": {
"type": "string",
"description": "The environment name."
},
"github_app_uuid": {
"type": "string",
"description": "The Github App UUID."
@@ -3614,10 +3602,6 @@
"type": "string",
"description": "The ports to expose."
},
"destination_uuid": {
"type": "string",
"description": "The destination UUID."
},
"build_pack": {
"type": "string",
"enum": [
@@ -3887,7 +3871,7 @@
},
"watch_paths": {
"type": "string",
"description": "The watch paths."
"description": "Watch path patterns, one per line (newline-separated). Commas do not separate patterns."
},
"use_build_server": {
"type": "boolean",
@@ -7302,6 +7286,10 @@
"type": "integer",
"description": "CPU shares of the database"
},
"instant_deploy": {
"type": "boolean",
"description": "Restart the database after the update. Requires the deploy ability."
},
"postgres_user": {
"type": "string",
"description": "PostgreSQL user"
@@ -13120,6 +13108,9 @@
"401": {
"$ref": "#\/components\/responses\/401"
},
"403": {
"description": "The token needs the deploy ability to set post_install_script_id or public_key_ids."
},
"422": {
"description": "Validation failed."
},
@@ -17655,6 +17646,304 @@
]
}
},
"\/servers\/{uuid}\/migrate": {
"post": {
"tags": [
"Servers"
],
"summary": "Migrate server to another Coolify instance",
"description": "Start a transfer in the background: export this server, import and claim it on the target instance (with the given token), then disable automations here. Follow the progress with GET \/servers\/{uuid}\/transfer. The target URL must use https. Requires read:sensitive and write.",
"operationId": "migrate-server-between-instances",
"parameters": [
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application\/json": {
"schema": {
"required": [
"target_url",
"target_token"
],
"properties": {
"target_url": {
"type": "string",
"example": "https:\/\/coolify-b.example.com"
},
"target_token": {
"description": "API token on the target instance (root or write)",
"type": "string"
}
},
"type": "object"
}
}
}
},
"responses": {
"202": {
"description": "Transfer started"
},
"403": {
"description": "Missing sensitive permission"
},
"404": {
"$ref": "#\/components\/responses\/404"
},
"422": {
"description": "Validation or remote import failed"
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"\/servers\/{uuid}\/transfer": {
"get": {
"tags": [
"Servers"
],
"summary": "Get server transfer status",
"description": "Show the transfer state of a server on this instance: the import\/claim state (transfer) and the state of a running or finished transfer to another instance (migration).",
"operationId": "get-server-transfer-status",
"parameters": [
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Transfer status"
},
"401": {
"$ref": "#\/components\/responses\/401"
},
"404": {
"$ref": "#\/components\/responses\/404"
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"\/servers\/import\/check": {
"get": {
"tags": [
"Servers"
],
"summary": "Check server import",
"description": "Check that this instance can import a server, before the source instance starts the transfer. It checks the token, the bundle version, the server limit, servers with the same UUID or IP, and that this instance can reach the SSH port of the server.",
"operationId": "check-server-import",
"parameters": [
{
"name": "server_uuid",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "ip",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "port",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 22
}
},
{
"name": "schema_version",
"in": "query",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "system_github_apps[]",
"in": "query",
"description": "UUIDs of system-wide GitHub Apps that the server uses. The response lists the ones this instance does not have.",
"required": false,
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "system_gitlab_apps[]",
"in": "query",
"description": "UUIDs of system-wide GitLab Apps that the server uses. The response lists the ones this instance does not have.",
"required": false,
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
],
"responses": {
"200": {
"description": "The server can be imported. Lists every check with its result."
},
"401": {
"$ref": "#\/components\/responses\/401"
},
"422": {
"description": "One or more checks failed. Lists every check with its result."
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"\/servers\/import": {
"post": {
"tags": [
"Servers"
],
"summary": "Import server transfer bundle",
"description": "Import a server transfer bundle into this Coolify instance (adopt mode by default). This instance then manages the server, and Sentinel reports to it.",
"operationId": "import-server-transfer-bundle",
"requestBody": {
"required": true,
"content": {
"application\/json": {
"schema": {
"properties": {
"bundle": {
"description": "Transfer bundle",
"type": "object"
},
"dry_run": {
"type": "boolean",
"default": false
},
"preserve_uuids": {
"type": "boolean",
"default": true
},
"adopt_mode": {
"description": "Import without forcing redeploy; keep statuses for adoption",
"type": "boolean",
"default": true
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Dry-run result"
},
"201": {
"description": "Imported"
},
"401": {
"$ref": "#\/components\/responses\/401"
},
"422": {
"description": "Validation failed"
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"\/servers\/{uuid}\/transfer\/complete": {
"post": {
"tags": [
"Servers"
],
"summary": "Mark server transferred",
"description": "Source-instance recovery step: disable automations here when the target already manages the server but the transfer could not finish on this instance.",
"operationId": "complete-server-transfer",
"parameters": [
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application\/json": {
"schema": {
"properties": {
"export_id": {
"type": [
"string",
"null"
]
},
"target_instance_url": {
"type": [
"string",
"null"
]
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Marked transferred"
},
"404": {
"$ref": "#\/components\/responses\/404"
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"\/servers": {
"get": {
"tags": [
@@ -19651,6 +19940,11 @@
"type": "string",
"description": "The base64 encoded Docker Compose content."
},
"connect_to_docker_network": {
"type": "boolean",
"default": false,
"description": "Connect the service to the predefined docker network."
},
"urls": {
"type": "array",
"description": "Array of URLs to be applied to containers of a service.",