Merge remote-tracking branch 'origin/next' into feat/hetzner-firewalls-and-internal-networks

This commit is contained in:
Andras Bacsai committed 2026-07-07 13:47:51 +02:00
commit 2ad11fdd9a
1068 files changed
+64737 -17770

No files matched your search

+382 -105
View File
@@ -59,7 +59,6 @@ paths:
- git_repository
- git_branch
- build_pack
- ports_exposes
properties:
project_uuid:
type: string
@@ -81,7 +80,7 @@ paths:
description: 'The git branch.'
build_pack:
type: string
enum: [nixpacks, static, dockerfile, dockercompose]
enum: [nixpacks, railpack, static, dockerfile, dockercompose]
description: 'The build pack type.'
ports_exposes:
type: string
@@ -119,6 +118,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
static_image:
type: string
enum: ['nginx:alpine']
@@ -344,7 +346,6 @@ paths:
- git_repository
- git_branch
- build_pack
- ports_exposes
properties:
project_uuid:
type: string
@@ -375,7 +376,7 @@ paths:
description: 'The destination UUID.'
build_pack:
type: string
enum: [nixpacks, static, dockerfile, dockercompose]
enum: [nixpacks, railpack, static, dockerfile, dockercompose]
description: 'The build pack type.'
name:
type: string
@@ -407,6 +408,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
static_image:
type: string
enum: ['nginx:alpine']
@@ -632,7 +636,6 @@ paths:
- git_repository
- git_branch
- build_pack
- ports_exposes
properties:
project_uuid:
type: string
@@ -663,7 +666,7 @@ paths:
description: 'The destination UUID.'
build_pack:
type: string
enum: [nixpacks, static, dockerfile, dockercompose]
enum: [nixpacks, railpack, static, dockerfile, dockercompose]
description: 'The build pack type.'
name:
type: string
@@ -695,6 +698,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
static_image:
type: string
enum: ['nginx:alpine']
@@ -935,7 +941,7 @@ paths:
description: 'The Dockerfile content.'
build_pack:
type: string
enum: [nixpacks, static, dockerfile, dockercompose]
enum: [dockerfile]
description: 'The build pack type.'
ports_exposes:
type: string
@@ -1066,6 +1072,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
use_build_server:
type: boolean
nullable: true
@@ -1141,7 +1150,6 @@ paths:
- environment_name
- environment_uuid
- docker_registry_image_name
- ports_exposes
properties:
project_uuid:
type: string
@@ -1281,6 +1289,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
use_build_server:
type: boolean
nullable: true
@@ -1337,95 +1348,6 @@ paths:
security:
-
bearerAuth: []
/applications/dockercompose:
post:
tags:
- Applications
summary: 'Create (Docker Compose)'
description: 'Deprecated: Use POST /api/v1/services instead.'
operationId: create-dockercompose-application
requestBody:
description: 'Application object that needs to be created.'
required: true
content:
application/json:
schema:
required:
- project_uuid
- server_uuid
- environment_name
- environment_uuid
- docker_compose_raw
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. You need to provide at least one of environment_name or environment_uuid.'
environment_uuid:
type: string
description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'
docker_compose_raw:
type: string
description: 'The Docker Compose raw content.'
destination_uuid:
type: string
description: 'The destination UUID if the server has more than one destinations.'
name:
type: string
description: 'The application name.'
description:
type: string
description: 'The application description.'
instant_deploy:
type: boolean
description: 'The flag to indicate if the application should be deployed instantly.'
use_build_server:
type: boolean
nullable: true
description: 'Use build server.'
connect_to_docker_network:
type: boolean
description: 'The flag to connect the service to the predefined Docker network.'
force_domain_override:
type: boolean
description: 'Force domain usage even if conflicts are detected. Default is false.'
is_container_label_escape_enabled:
type: boolean
default: true
description: 'Escape special characters in labels. By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$. If you want to use env variables inside the labels, turn this off.'
type: object
responses:
'201':
description: 'Application created successfully.'
content:
application/json:
schema:
properties:
uuid: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'409':
description: 'Domain conflicts detected.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'Domain conflicts detected. Use force_domain_override=true to proceed.' }
warning: { type: string, example: 'Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior.' }
conflicts: { type: array, items: { properties: { domain: { type: string, example: example.com }, resource_name: { type: string, example: 'My Application' }, resource_uuid: { type: string, nullable: true, example: abc123-def456 }, resource_type: { type: string, enum: [application, service, instance], example: application }, message: { type: string, example: "Domain example.com is already in use by application 'My Application'" } }, type: object } }
type: object
deprecated: true
security:
-
bearerAuth: []
'/applications/{uuid}':
get:
tags:
@@ -1568,7 +1490,7 @@ paths:
description: 'The destination UUID.'
build_pack:
type: string
enum: [nixpacks, static, dockerfile, dockercompose]
enum: [nixpacks, railpack, static, dockerfile, dockercompose]
description: 'The build pack type.'
name:
type: string
@@ -1600,6 +1522,9 @@ paths:
is_force_https_enabled:
type: boolean
description: 'The flag to indicate if HTTPS is forced. Defaults to true.'
is_preview_deployments_enabled:
type: boolean
description: 'Enable preview deployments for pull requests.'
install_command:
type: string
description: 'The install command.'
@@ -1756,6 +1681,9 @@ paths:
is_preserve_repository_enabled:
type: boolean
description: 'Preserve git repository during application update. If false, the existing repository will be removed and replaced with the new one. If true, the existing repository will be kept and the new one will be ignored. Default is false.'
include_source_commit_in_build:
type: boolean
description: 'Include source commit information in the build. Default is false.'
type: object
responses:
'200':
@@ -1809,6 +1737,14 @@ paths:
type: integer
format: int32
default: 100
-
name: show_timestamps
in: query
description: 'Show timestamps in the logs.'
required: false
schema:
type: boolean
default: false
responses:
'200':
description: 'Get application logs by UUID.'
@@ -2398,6 +2334,48 @@ paths:
security:
-
bearerAuth: []
'/applications/{uuid}/previews/{pull_request_id}':
delete:
tags:
- Applications
summary: 'Delete Preview Deployment'
description: 'Delete a preview deployment for a pull request. Cancels active deployments, stops containers, removes volumes/networks, and deletes the preview record.'
operationId: delete-preview-deployment-by-pull-request-id
parameters:
-
name: uuid
in: path
description: 'UUID of the application.'
required: true
schema:
type: string
-
name: pull_request_id
in: path
description: 'Pull request ID of the preview to delete.'
required: true
schema:
type: integer
responses:
'200':
description: 'Preview deletion queued.'
content:
application/json:
schema:
properties:
message: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
'422':
$ref: '#/components/responses/422'
security:
-
bearerAuth: []
/cloud-tokens:
get:
tags:
@@ -2723,8 +2701,8 @@ paths:
type: integer
description: 'Number of days to retain backups locally'
database_backup_retention_max_storage_locally:
type: integer
description: 'Max storage (MB) for local backups'
type: number
description: 'Max storage (GB) for local backups'
database_backup_retention_amount_s3:
type: integer
description: 'Number of backups to retain in S3'
@@ -2732,8 +2710,8 @@ paths:
type: integer
description: 'Number of days to retain backups in S3'
database_backup_retention_max_storage_s3:
type: integer
description: 'Max storage (MB) for S3 backups'
type: number
description: 'Max storage (GB) for S3 backups'
timeout:
type: integer
description: 'Backup job timeout in seconds (min: 60, max: 36000)'
@@ -2997,6 +2975,30 @@ paths:
mysql_conf:
type: string
description: 'MySQL conf'
health_check_enabled:
type: boolean
description: 'Enable the database healthcheck probe.'
default: true
health_check_interval:
type: integer
description: 'Healthcheck interval in seconds.'
minimum: 1
default: 15
health_check_timeout:
type: integer
description: 'Healthcheck timeout in seconds.'
minimum: 1
default: 5
health_check_retries:
type: integer
description: 'Healthcheck retries count.'
minimum: 1
default: 5
health_check_start_period:
type: integer
description: 'Healthcheck start period in seconds.'
minimum: 0
default: 5
type: object
responses:
'200':
@@ -3118,7 +3120,7 @@ paths:
type: integer
description: 'Retention days of the backup locally'
database_backup_retention_max_storage_locally:
type: integer
type: number
description: 'Max storage of the backup locally'
database_backup_retention_amount_s3:
type: integer
@@ -3127,7 +3129,7 @@ paths:
type: integer
description: 'Retention days of the backup in s3'
database_backup_retention_max_storage_s3:
type: integer
type: number
description: 'Max storage of the backup in S3'
timeout:
type: integer
@@ -3935,6 +3937,57 @@ paths:
security:
-
bearerAuth: []
'/databases/{uuid}/logs':
get:
tags:
- Databases
summary: 'Get database logs.'
description: 'Get database logs by UUID.'
operationId: get-database-logs-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the database.'
required: true
schema:
type: string
format: uuid
-
name: lines
in: query
description: 'Number of lines to show from the end of the logs.'
required: false
schema:
type: integer
format: int32
default: 100
-
name: show_timestamps
in: query
description: 'Show timestamps in the logs.'
required: false
schema:
type: boolean
default: false
responses:
'200':
description: 'Get database logs by UUID.'
content:
application/json:
schema:
properties:
logs: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/databases/{uuid}/backups/{scheduled_backup_uuid}/executions/{execution_uuid}':
delete:
tags:
@@ -4833,7 +4886,6 @@ paths:
schema:
required:
- name
- api_url
- html_url
- app_id
- installation_id
@@ -5272,6 +5324,86 @@ paths:
security:
-
bearerAuth: []
/hetzner/firewalls:
get:
tags:
- Hetzner
summary: 'Get Hetzner Firewalls'
description: 'Get all existing Hetzner firewalls for the current project.'
operationId: get-hetzner-firewalls
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner firewalls.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/hetzner/networks:
get:
tags:
- Hetzner
summary: 'Get Hetzner Networks'
description: 'Get all existing Hetzner private networks for the current project.'
operationId: get-hetzner-networks
parameters:
-
name: cloud_provider_token_uuid
in: query
description: 'Cloud provider token UUID. Required if cloud_provider_token_id is not provided.'
required: false
schema:
type: string
-
name: cloud_provider_token_id
in: query
description: 'Deprecated: Use cloud_provider_token_uuid instead. Cloud provider token UUID.'
required: false
deprecated: true
schema:
type: string
responses:
'200':
description: 'List of Hetzner networks.'
content:
application/json:
schema:
type: array
items:
properties: { id: { type: integer }, name: { type: string }, ip_range: { type: string } }
type: object
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
/servers/hetzner:
post:
tags:
@@ -5328,10 +5460,22 @@ paths:
type: boolean
example: true
description: 'Enable IPv6 (default: true)'
enable_backups:
type: boolean
example: false
description: 'Enable Hetzner server backups after creation (adds 20% to the monthly server fee)'
hetzner_ssh_key_ids:
type: array
items: { type: integer }
description: 'Additional Hetzner SSH key IDs'
hetzner_firewall_ids:
type: array
items: { type: integer }
description: 'Existing Hetzner firewall IDs to apply during server creation'
hetzner_network_ids:
type: array
items: { type: integer }
description: 'Existing Hetzner network IDs to attach during server creation'
cloud_init_script:
type: string
description: 'Cloud-init YAML script (optional)'
@@ -5442,6 +5586,64 @@ paths:
security:
-
bearerAuth: []
/mcp/enable:
post:
summary: 'Enable MCP Server'
description: 'Enable the MCP server endpoint at /mcp (only with root permissions).'
operationId: enable-mcp
responses:
'200':
description: 'MCP server enabled.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'MCP server enabled.' }
type: object
'403':
description: 'You are not allowed to enable the MCP server.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'You are not allowed to enable the MCP server.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/mcp/disable:
post:
summary: 'Disable MCP Server'
description: 'Disable the MCP server endpoint at /mcp (only with root permissions).'
operationId: disable-mcp
responses:
'200':
description: 'MCP server disabled.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'MCP server disabled.' }
type: object
'403':
description: 'You are not allowed to disable the MCP server.'
content:
application/json:
schema:
properties:
message: { type: string, example: 'You are not allowed to disable the MCP server.' }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
security:
-
bearerAuth: []
/health:
get:
summary: Healthcheck
@@ -6692,6 +6894,9 @@ paths:
server_disk_usage_check_frequency:
type: string
description: 'Cron expression for disk usage check frequency.'
connection_timeout:
type: integer
description: 'SSH connection timeout in seconds (1-300). Default: 10.'
type: object
responses:
'201':
@@ -7116,6 +7321,65 @@ paths:
security:
-
bearerAuth: []
'/services/{uuid}/logs':
get:
tags:
- Services
summary: 'Get service logs.'
description: 'Get logs for a specific service sub-resource by service UUID. The `sub_service_name` query parameter must match the `name` field of one of the service applications or databases returned by `GET /services/{uuid}`.'
operationId: get-service-logs-by-uuid
parameters:
-
name: uuid
in: path
description: 'UUID of the service.'
required: true
schema:
type: string
format: uuid
-
name: sub_service_name
in: query
description: 'Sub-service name from `GET /services/{uuid}` under `applications[].name` or `databases[].name`. Do not use `human_name` or the Docker container name with the service UUID suffix.'
required: true
schema:
type: string
example: appwrite-console
-
name: lines
in: query
description: 'Number of lines to show from the end of the logs.'
required: false
schema:
type: integer
format: int32
default: 100
-
name: show_timestamps
in: query
description: 'Show timestamps in the logs.'
required: false
schema:
type: boolean
default: false
responses:
'200':
description: 'Get service logs by UUID.'
content:
application/json:
schema:
properties:
logs: { type: string }
type: object
'401':
$ref: '#/components/responses/401'
'400':
$ref: '#/components/responses/400'
'404':
$ref: '#/components/responses/404'
security:
-
bearerAuth: []
'/services/{uuid}/envs':
get:
tags:
@@ -7874,6 +8138,7 @@ components:
description: 'Build pack.'
enum:
- nixpacks
- railpack
- static
- dockerfile
- dockercompose
@@ -8143,6 +8408,15 @@ components:
docker_registry_image_tag:
type: string
nullable: true
configuration_hash:
type: string
nullable: true
configuration_snapshot:
type: object
nullable: true
configuration_diff:
type: object
nullable: true
force_rebuild:
type: boolean
commit:
@@ -8496,6 +8770,9 @@ components:
delete_unused_networks:
type: boolean
description: 'The flag to indicate if the unused networks should be deleted.'
connection_timeout:
type: integer
description: 'SSH connection timeout in seconds.'
type: object
Service:
description: 'Service model'