document all request-body fields in the openapi annotations

This commit is contained in:
Jarek Krochmalski committed 2026-09-06 17:38:22 +05:30
1 parent aa30a8dc0a
commit a78bd46578
6 files changed
+657 -61

No files matched your search

+250 -3
View File
@@ -4276,6 +4276,12 @@
"type": "object", "type": "object",
"properties": {} "properties": {}
} }
},
"restoreSecrets": {
"type": "boolean"
},
"skipStackFiles": {
"type": "boolean"
} }
}, },
"required": [ "required": [
@@ -4343,6 +4349,37 @@
}, },
"targetEnvId": { "targetEnvId": {
"type": "integer" "type": "integer"
},
"environmentId": {
"type": "integer"
},
"mode": {
"type": "string"
},
"targetType": {
"type": "string"
},
"targetName": {
"type": "string"
},
"targetPath": {
"type": "string"
},
"volumeDestinations": {
"type": "object",
"properties": {}
},
"volumes": {
"type": "array",
"items": {
"type": "string"
}
},
"skipStackFiles": {
"type": "boolean"
},
"mergeStackFiles": {
"type": "boolean"
} }
}, },
"required": [ "required": [
@@ -4354,7 +4391,18 @@
"destinationId": 0, "destinationId": 0,
"snapshotId": "string", "snapshotId": "string",
"includeTargets": true, "includeTargets": true,
"targetEnvId": 0 "targetEnvId": 0,
"environmentId": 0,
"mode": "string",
"targetType": "string",
"targetName": "string",
"targetPath": "string",
"volumeDestinations": {},
"volumes": [
"string"
],
"skipStackFiles": true,
"mergeStackFiles": true
} }
} }
} }
@@ -14954,7 +15002,23 @@
} }
}, },
"security": [], "security": [],
"description": "Public endpoint authenticated by the repository's webhook secret via `X-Hub-Signature-256` (GitHub) or `X-Gitlab-Token` (GitLab); the raw request body is used for HMAC verification. A secret is required by default; set ALLOW_WEBHOOKS_WITHOUT_SECRET=true to accept a secret-less trigger on an isolated network." "description": "Public endpoint authenticated by the repository's webhook secret via `X-Hub-Signature-256` (GitHub) or `X-Gitlab-Token` (GitLab); the raw request body is used for HMAC verification. A secret is required by default; set ALLOW_WEBHOOKS_WITHOUT_SECRET=true to accept a secret-less trigger on an isolated network.",
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"ref": {
"type": "string"
}
},
"description": "Fields auto-detected from the handler's destructuring of the request body - generic string type, no @openapi annotation for this body yet."
}
}
}
}
} }
}, },
"/api/hawser/connect": { "/api/hawser/connect": {
@@ -23673,6 +23737,138 @@
}, },
"externalStackPaths": { "externalStackPaths": {
"type": "string" "type": "string"
},
"actionIconSize": {
"type": "string"
},
"compactPorts": {
"type": "boolean"
},
"confirmDestructive": {
"type": "boolean"
},
"dateFormat": {
"type": "string"
},
"defaultBackupImage": {
"type": "string"
},
"defaultComposeTemplate": {
"type": "string"
},
"defaultGrypeArgs": {
"type": "string"
},
"defaultGrypeImage": {
"type": "string"
},
"defaultScannerDns": {
"type": "array",
"items": {
"type": "string"
}
},
"defaultScannerNetworkMode": {
"type": "string"
},
"defaultTrivyArgs": {
"type": "string"
},
"defaultTrivyImage": {
"type": "string"
},
"downloadFormat": {
"type": "string"
},
"editorFont": {
"type": "string"
},
"eventCleanupCron": {
"type": "string"
},
"eventCleanupEnabled": {
"type": "boolean"
},
"eventCollectionMode": {
"type": "string"
},
"eventPollInterval": {
"type": "integer"
},
"eventRetentionDays": {
"type": "integer"
},
"font": {
"type": "string"
},
"fontSize": {
"type": "string"
},
"formatLogTimestamps": {
"type": "boolean"
},
"gridFontSize": {
"type": "string"
},
"highlightUpdates": {
"type": "boolean"
},
"honorProxyLabels": {
"type": "boolean"
},
"labelFilterMode": {
"type": "string"
},
"logMaxLines": {
"type": "integer"
},
"metricsCollectionInterval": {
"type": "integer"
},
"primaryStackLocation": {
"type": "string"
},
"protectScannerImages": {
"type": "boolean"
},
"scannerCleanupCron": {
"type": "string"
},
"scannerCleanupEnabled": {
"type": "boolean"
},
"scheduleCleanupCron": {
"type": "string"
},
"scheduleCleanupEnabled": {
"type": "boolean"
},
"scheduleRetentionDays": {
"type": "integer"
},
"showExposedPorts": {
"type": "boolean"
},
"showGitCommitHash": {
"type": "boolean"
},
"showImageChangelogLinks": {
"type": "boolean"
},
"showStoppedContainers": {
"type": "boolean"
},
"showWhatsNew": {
"type": "boolean"
},
"terminalFont": {
"type": "string"
},
"timeFormat": {
"type": "string"
},
"useSelfhstIcons": {
"type": "boolean"
} }
} }
}, },
@@ -23684,7 +23880,52 @@
"darkTheme": "string", "darkTheme": "string",
"defaultTimezone": "string", "defaultTimezone": "string",
"logBufferSizeKb": 0, "logBufferSizeKb": 0,
"externalStackPaths": "string" "externalStackPaths": "string",
"actionIconSize": "string",
"compactPorts": true,
"confirmDestructive": true,
"dateFormat": "string",
"defaultBackupImage": "string",
"defaultComposeTemplate": "string",
"defaultGrypeArgs": "string",
"defaultGrypeImage": "string",
"defaultScannerDns": [
"string"
],
"defaultScannerNetworkMode": "string",
"defaultTrivyArgs": "string",
"defaultTrivyImage": "string",
"downloadFormat": "string",
"editorFont": "string",
"eventCleanupCron": "string",
"eventCleanupEnabled": true,
"eventCollectionMode": "string",
"eventPollInterval": 0,
"eventRetentionDays": 0,
"font": "string",
"fontSize": "string",
"formatLogTimestamps": true,
"gridFontSize": "string",
"highlightUpdates": true,
"honorProxyLabels": true,
"labelFilterMode": "string",
"logMaxLines": 0,
"metricsCollectionInterval": 0,
"primaryStackLocation": "string",
"protectScannerImages": true,
"scannerCleanupCron": "string",
"scannerCleanupEnabled": true,
"scheduleCleanupCron": "string",
"scheduleCleanupEnabled": true,
"scheduleRetentionDays": 0,
"showExposedPorts": true,
"showGitCommitHash": true,
"showImageChangelogLinks": true,
"showStoppedContainers": true,
"showWhatsNew": true,
"terminalFont": "string",
"timeFormat": "string",
"useSelfhstIcons": true
} }
} }
} }
@@ -23978,6 +24219,12 @@
}, },
"envId": { "envId": {
"type": "integer" "type": "integer"
},
"grypeImage": {
"type": "string"
},
"trivyImage": {
"type": "string"
} }
} }
}, },
+1 -1
View File
@@ -14,7 +14,7 @@ import { guardSnapshotEnvAccess } from '$lib/server/backups/route-guards';
* @openapi * @openapi
* summary: Restore a backup snapshot in-place or to a new location, streaming progress as a Server-Sent Events job * summary: Restore a backup snapshot in-place or to a new location, streaming progress as a Server-Sent Events job
* description: Returns a text/event-stream that emits `progress` events and a final `result` event. An in-place restore is destructive and requires confirmOverwrite:true. Authorization and snapshot-environment access are checked before the request shape is validated. destinationId from GET /api/backup/destinations. snapshotId from GET /api/backup/snapshots. environmentId from GET /api/environments. * description: Returns a text/event-stream that emits `progress` events and a final `result` event. An in-place restore is destructive and requires confirmOverwrite:true. Authorization and snapshot-environment access are checked before the request shape is validated. destinationId from GET /api/backup/destinations. snapshotId from GET /api/backup/snapshots. environmentId from GET /api/environments.
* body: {destinationId:integer!, snapshotId:string!, mode:string, targetType:string, volumes:array<string>, environmentId:integer, confirmOverwrite:boolean, targetPath:string, targetName:string, postRestore:string, volumeDestinations:array<{}>} * body: {destinationId:integer!, snapshotId:string!, mode:string, targetType:string, volumes:array<string>, environmentId:integer, confirmOverwrite:boolean, targetPath:string, targetName:string, postRestore:string, volumeDestinations:array<{}>, restoreSecrets:boolean, skipStackFiles:boolean}
* body-example: {"destinationId":3,"snapshotId":"a1b2c3d4","mode":"new-location","targetType":"container","targetName":"nextcloud-restored","environmentId":1,"confirmOverwrite":false} * body-example: {"destinationId":3,"snapshotId":"a1b2c3d4","mode":"new-location","targetType":"container","targetName":"nextcloud-restored","environmentId":1,"confirmOverwrite":false}
* resp-200: Server-Sent Events stream of progress and a final result event (status "success" or "error") * resp-200: Server-Sent Events stream of progress and a final result event (status "success" or "error")
* resp-400: Invalid restore request; the response "issues" array lists the validation problems * resp-400: Invalid restore request; the response "issues" array lists the validation problems
@@ -11,7 +11,7 @@ import { jobResult } from '$lib/server/sse';
* @openapi * @openapi
* summary: Preview what a restore would write (resolved targets + volume/stack contents) * summary: Preview what a restore would write (resolved targets + volume/stack contents)
* description: With includeTargets it also resolves the concrete restore targets (host paths / volumes); without it, returns the metadata-only preview the initial modal load relies on. * description: With includeTargets it also resolves the concrete restore targets (host paths / volumes); without it, returns the metadata-only preview the initial modal load relies on.
* body: {destinationId:integer!, snapshotId:string!, includeTargets:boolean, targetEnvId:integer} * body: {destinationId:integer!, snapshotId:string!, includeTargets:boolean, targetEnvId:integer, environmentId:integer, mode:string, targetType:string, targetName:string, targetPath:string, volumeDestinations:object, volumes:array<string>, skipStackFiles:boolean, mergeStackFiles:boolean}
* resp-200: object * resp-200: object
* resp-200-desc: The snapshot preview, optionally with a resolved targets list * resp-200-desc: The snapshot preview, optionally with a resolved targets list
* resp-400: Missing required fields (destinationId, snapshotId) * resp-400: Missing required fields (destinationId, snapshotId)
+1 -1
View File
@@ -407,7 +407,7 @@ export const GET: RequestHandler = async ({ cookies }) => {
* @openapi * @openapi
* summary: Update global general settings (all fields optional; only supplied keys are written) * summary: Update global general settings (all fields optional; only supplied keys are written)
* description: A large flat settings bag - theme/fonts, scanner defaults, cleanup schedules, event/metrics collection, editor options (e.g. editorIndentGuides), and more. * description: A large flat settings bag - theme/fonts, scanner defaults, cleanup schedules, event/metrics collection, editor options (e.g. editorIndentGuides), and more.
* body: {animateIcons:boolean, editorIndentGuides:boolean, coloredActionButtons:boolean, lightTheme:string, darkTheme:string, defaultTimezone:string, logBufferSizeKb:integer, externalStackPaths:string} * body: {animateIcons:boolean, editorIndentGuides:boolean, coloredActionButtons:boolean, lightTheme:string, darkTheme:string, defaultTimezone:string, logBufferSizeKb:integer, externalStackPaths:string, actionIconSize:string, compactPorts:boolean, confirmDestructive:boolean, dateFormat:string, defaultBackupImage:string, defaultComposeTemplate:string, defaultGrypeArgs:string, defaultGrypeImage:string, defaultScannerDns:array<string>, defaultScannerNetworkMode:string, defaultTrivyArgs:string, defaultTrivyImage:string, downloadFormat:string, editorFont:string, eventCleanupCron:string, eventCleanupEnabled:boolean, eventCollectionMode:string, eventPollInterval:integer, eventRetentionDays:integer, font:string, fontSize:string, formatLogTimestamps:boolean, gridFontSize:string, highlightUpdates:boolean, honorProxyLabels:boolean, labelFilterMode:string, logMaxLines:integer, metricsCollectionInterval:integer, primaryStackLocation:string, protectScannerImages:boolean, scannerCleanupCron:string, scannerCleanupEnabled:boolean, scheduleCleanupCron:string, scheduleCleanupEnabled:boolean, scheduleRetentionDays:integer, showExposedPorts:boolean, showGitCommitHash:boolean, showImageChangelogLinks:boolean, showStoppedContainers:boolean, showWhatsNew:boolean, terminalFont:string, timeFormat:string, useSelfhstIcons:boolean}
* resp-403: Permission denied (needs settings:edit) * resp-403: Permission denied (needs settings:edit)
* resp-500: Failed to save settings * resp-500: Failed to save settings
*/ */
+1 -1
View File
@@ -92,7 +92,7 @@ export const GET: RequestHandler = async ({ url, cookies }) => {
/** /**
* @openapi * @openapi
* summary: Save the vulnerability-scanner settings for an environment * summary: Save the vulnerability-scanner settings for an environment
* body: {scanner:string, grypeArgs:string, trivyArgs:string, envId:integer} * body: {scanner:string, grypeArgs:string, trivyArgs:string, envId:integer, grypeImage:string, trivyImage:string}
* body-example: {"scanner":"grype","grypeArgs":"-o json -v {image}","trivyArgs":"image --format json {image}","envId":1} * body-example: {"scanner":"grype","grypeArgs":"-o json -v {image}","trivyArgs":"image --format json {image}","envId":1}
* resp-200: {success:boolean!, settings:{scanner:string!, grypeArgs:string!, trivyArgs:string!}} * resp-200: {success:boolean!, settings:{scanner:string!, grypeArgs:string!, trivyArgs:string!}}
* resp-400: Invalid scanner type (must be none, grype, trivy or both) * resp-400: Invalid scanner type (must be none, grype, trivy or both)
+403 -54
View File
@@ -2,7 +2,7 @@
"openapi": "3.0.3", "openapi": "3.0.3",
"info": { "info": {
"title": "Dockhand API", "title": "Dockhand API",
"version": "1.0.45", "version": "1.0.46",
"description": "Auto-generated from src/routes/**/+server.ts by scripts/generate-openapi.ts. Path, HTTP method, tag, and auth requirement are derived automatically from the route tree and hooks.server.ts PUBLIC_PATHS. Parameters, response status codes, and request body fields are additionally auto-detected from each handler’s own source (query params via url.searchParams, status codes via status:/error(), body fields via destructuring) — adding a new endpoint therefore requires ZERO manual spec edits to show up with real params/responses. An optional, additive `@openapi` JSDoc annotation on a handler replaces the generic auto-descriptions with hand-written summaries, exact types, and examples." "description": "Auto-generated from src/routes/**/+server.ts by scripts/generate-openapi.ts. Path, HTTP method, tag, and auth requirement are derived automatically from the route tree and hooks.server.ts PUBLIC_PATHS. Parameters, response status codes, and request body fields are additionally auto-detected from each handler’s own source (query params via url.searchParams, status codes via status:/error(), body fields via destructuring) — adding a new endpoint therefore requires ZERO manual spec edits to show up with real params/responses. An optional, additive `@openapi` JSDoc annotation on a handler replaces the generic auto-descriptions with hand-written summaries, exact types, and examples."
}, },
"servers": [ "servers": [
@@ -4276,6 +4276,12 @@
"type": "object", "type": "object",
"properties": {} "properties": {}
} }
},
"restoreSecrets": {
"type": "boolean"
},
"skipStackFiles": {
"type": "boolean"
} }
}, },
"required": [ "required": [
@@ -4343,6 +4349,37 @@
}, },
"targetEnvId": { "targetEnvId": {
"type": "integer" "type": "integer"
},
"environmentId": {
"type": "integer"
},
"mode": {
"type": "string"
},
"targetType": {
"type": "string"
},
"targetName": {
"type": "string"
},
"targetPath": {
"type": "string"
},
"volumeDestinations": {
"type": "object",
"properties": {}
},
"volumes": {
"type": "array",
"items": {
"type": "string"
}
},
"skipStackFiles": {
"type": "boolean"
},
"mergeStackFiles": {
"type": "boolean"
} }
}, },
"required": [ "required": [
@@ -4354,7 +4391,18 @@
"destinationId": 0, "destinationId": 0,
"snapshotId": "string", "snapshotId": "string",
"includeTargets": true, "includeTargets": true,
"targetEnvId": 0 "targetEnvId": 0,
"environmentId": 0,
"mode": "string",
"targetType": "string",
"targetName": "string",
"targetPath": "string",
"volumeDestinations": {},
"volumes": [
"string"
],
"skipStackFiles": true,
"mergeStackFiles": true
} }
} }
} }
@@ -6872,7 +6920,7 @@
"description": "Directory listing (entries with name, type, size and permission metadata)" "description": "Directory listing (entries with name, type, size and permission metadata)"
}, },
"403": { "403": {
"description": "Permission denied" "description": "Permission denied (needs containers:exec)"
}, },
"404": { "404": {
"description": "Container not found" "description": "Container not found"
@@ -7075,7 +7123,7 @@
"description": "Path is missing, the target is a directory, or the container is not running" "description": "Path is missing, the target is a directory, or the container is not running"
}, },
"403": { "403": {
"description": "Permission denied to read the file" "description": "Permission denied to read the file (needs containers:exec)"
}, },
"404": { "404": {
"description": "File not found" "description": "File not found"
@@ -9473,7 +9521,8 @@
"type": "boolean" "type": "boolean"
}, },
"newerVersion": { "newerVersion": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -9500,7 +9549,7 @@
"currentImage": "string", "currentImage": "string",
"checkedAt": "string", "checkedAt": "string",
"hasImageUpdate": true, "hasImageUpdate": true,
"newerVersion": "string" "newerVersion": {}
} }
] ]
} }
@@ -10028,7 +10077,8 @@
"type": "string" "type": "string"
}, },
"uptime": { "uptime": {
"type": "string" "type": "object",
"properties": {}
}, },
"gcForced": { "gcForced": {
"type": "boolean" "type": "boolean"
@@ -10037,19 +10087,24 @@
"type": "boolean" "type": "boolean"
}, },
"process": { "process": {
"type": "string" "type": "object",
"properties": {}
}, },
"growth": { "growth": {
"type": "string" "type": "object",
"properties": {}
}, },
"v8Heap": { "v8Heap": {
"type": "string" "type": "object",
"properties": {}
}, },
"system": { "system": {
"type": "string" "type": "object",
"properties": {}
}, },
"rssTracker": { "rssTracker": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -10090,7 +10145,7 @@
} }
}, },
"403": { "403": {
"description": "Memory monitor not enabled (set MEMORY_MONITOR=true)" "description": "Memory monitor not enabled (set MEMORY_MONITOR=true), or the caller is not an admin"
} }
}, },
"security": [ "security": [
@@ -11979,6 +12034,9 @@
} }
} }
}, },
"403": {
"description": "Permission denied"
},
"404": { "404": {
"description": "Environment not found" "description": "Environment not found"
} }
@@ -12474,6 +12532,9 @@
}, },
"400": { "400": {
"description": "Host is required for direct/hawser-standard connection types" "description": "Host is required for direct/hawser-standard connection types"
},
"403": {
"description": "The caller cannot access the environment named by environmentId"
} }
}, },
"security": [ "security": [
@@ -12484,6 +12545,7 @@
"bearerAuth": [] "bearerAuth": []
} }
], ],
"description": "Pass environmentId to fall back to that saved environment's stored secrets (hawserToken, tlsKey) for any secret field left blank in the body, so Test connection works when editing without re-entering the token.",
"requestBody": { "requestBody": {
"required": true, "required": true,
"content": { "content": {
@@ -12520,6 +12582,9 @@
}, },
"hawserToken": { "hawserToken": {
"type": "string" "type": "string"
},
"environmentId": {
"type": "integer"
} }
}, },
"required": [ "required": [
@@ -12587,7 +12652,8 @@
"branches": { "branches": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "object",
"properties": {}
} }
} }
}, },
@@ -13165,10 +13231,12 @@
"type": "object", "type": "object",
"properties": { "properties": {
"vars": { "vars": {
"type": "string" "type": "object",
"properties": {}
}, },
"sources": { "sources": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -13177,8 +13245,8 @@
] ]
}, },
"example": { "example": {
"vars": "string", "vars": {},
"sources": "string" "sources": {}
} }
} }
} }
@@ -14489,7 +14557,8 @@
"type": "object", "type": "object",
"properties": { "properties": {
"vars": { "vars": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -14933,7 +15002,23 @@
} }
}, },
"security": [], "security": [],
"description": "Public endpoint authenticated by the repository's webhook secret via `X-Hub-Signature-256` (GitHub) or `X-Gitlab-Token` (GitLab); the raw request body is used for HMAC verification. A secret is required by default; set ALLOW_WEBHOOKS_WITHOUT_SECRET=true to accept a secret-less trigger on an isolated network." "description": "Public endpoint authenticated by the repository's webhook secret via `X-Hub-Signature-256` (GitHub) or `X-Gitlab-Token` (GitLab); the raw request body is used for HMAC verification. A secret is required by default; set ALLOW_WEBHOOKS_WITHOUT_SECRET=true to accept a secret-less trigger on an isolated network.",
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"ref": {
"type": "string"
}
},
"description": "Fields auto-detected from the handler's destructuring of the request body - generic string type, no @openapi annotation for this body yet."
}
}
}
}
} }
}, },
"/api/hawser/connect": { "/api/hawser/connect": {
@@ -15478,7 +15563,8 @@
"type": "integer" "type": "integer"
}, },
"environment": { "environment": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -15588,7 +15674,8 @@
"type": "object", "type": "object",
"properties": { "properties": {
"icons": { "icons": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -16346,7 +16433,8 @@
"type": "boolean" "type": "boolean"
}, },
"result": { "result": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -16506,7 +16594,7 @@
"tags": [ "tags": [
"jobs" "jobs"
], ],
"summary": "Poll a background job's status and accumulated output lines (no auth — job ids are unguessable UUIDs)", "summary": "Poll a background job's status and accumulated output lines (owner or admin only)",
"parameters": [ "parameters": [
{ {
"name": "id", "name": "id",
@@ -16590,7 +16678,7 @@
"tags": [ "tags": [
"jobs" "jobs"
], ],
"summary": "Request cancellation of a running background job (no auth — job ids are unguessable UUIDs)", "summary": "Request cancellation of a running background job (owner or admin only)",
"parameters": [ "parameters": [
{ {
"name": "id", "name": "id",
@@ -16623,6 +16711,9 @@
} }
} }
} }
},
"404": {
"description": "Job not found"
} }
}, },
"security": [ "security": [
@@ -18501,6 +18592,9 @@
"400": { "400": {
"description": "Invalid ID (not a number)" "description": "Invalid ID (not a number)"
}, },
"403": {
"description": "Permission denied (needs notifications:edit)"
},
"404": { "404": {
"description": "Notification setting not found" "description": "Notification setting not found"
}, },
@@ -21008,6 +21102,9 @@
"400": { "400": {
"description": "Missing registry parameter, or Docker Hub was targeted (catalog listing unsupported)" "description": "Missing registry parameter, or Docker Hub was targeted (catalog listing unsupported)"
}, },
"403": {
"description": "Permission denied (requires registries:view)"
},
"404": { "404": {
"description": "Registry not found, or the registry does not implement the V2 catalog API" "description": "Registry not found, or the registry does not implement the V2 catalog API"
}, },
@@ -21206,6 +21303,9 @@
"400": { "400": {
"description": "The term query parameter is missing" "description": "The term query parameter is missing"
}, },
"403": {
"description": "Permission denied (requires registries:view)"
},
"404": { "404": {
"description": "The referenced registry does not exist" "description": "The referenced registry does not exist"
}, },
@@ -21292,6 +21392,9 @@
"400": { "400": {
"description": "image and tag are required" "description": "image and tag are required"
}, },
"403": {
"description": "Permission denied (requires registries:view)"
},
"404": { "404": {
"description": "Registry not found" "description": "Registry not found"
} }
@@ -21426,6 +21529,9 @@
"400": { "400": {
"description": "The image query parameter is missing" "description": "The image query parameter is missing"
}, },
"403": {
"description": "Permission denied (requires registries:view)"
},
"404": { "404": {
"description": "The referenced registry does not exist" "description": "The referenced registry does not exist"
}, },
@@ -22788,7 +22894,8 @@
"type": "string" "type": "string"
}, },
"config": { "config": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -22800,7 +22907,7 @@
"example": { "example": {
"name": "string", "name": "string",
"type": "string", "type": "string",
"config": "string" "config": {}
} }
} }
} }
@@ -22843,21 +22950,46 @@
"type": "string" "type": "string"
}, },
"config": { "config": {
"type": "string" "type": "object",
"properties": {}
},
"stacksUsing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"stackName": {
"type": "string"
},
"environmentId": {
"type": "integer"
}
},
"required": [
"stackName"
]
}
} }
}, },
"required": [ "required": [
"id", "id",
"name", "name",
"type", "type",
"config" "config",
"stacksUsing"
] ]
}, },
"example": { "example": {
"id": 0, "id": 0,
"name": "string", "name": "string",
"type": "string", "type": "string",
"config": "string" "config": {},
"stacksUsing": [
{
"stackName": "string",
"environmentId": 0
}
]
} }
} }
} }
@@ -22965,14 +23097,15 @@
"type": "string" "type": "string"
}, },
"config": { "config": {
"type": "string" "type": "object",
"properties": {}
} }
} }
}, },
"example": { "example": {
"name": "string", "name": "string",
"type": "string", "type": "string",
"config": "string" "config": {}
} }
} }
} }
@@ -23219,7 +23352,8 @@
"type": "object", "type": "object",
"properties": { "properties": {
"config": { "config": {
"type": "string" "type": "object",
"properties": {}
} }
} }
}, },
@@ -23294,7 +23428,8 @@
"type": "string" "type": "string"
}, },
"config": { "config": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -23602,6 +23737,138 @@
}, },
"externalStackPaths": { "externalStackPaths": {
"type": "string" "type": "string"
},
"actionIconSize": {
"type": "string"
},
"compactPorts": {
"type": "boolean"
},
"confirmDestructive": {
"type": "boolean"
},
"dateFormat": {
"type": "string"
},
"defaultBackupImage": {
"type": "string"
},
"defaultComposeTemplate": {
"type": "string"
},
"defaultGrypeArgs": {
"type": "string"
},
"defaultGrypeImage": {
"type": "string"
},
"defaultScannerDns": {
"type": "array",
"items": {
"type": "string"
}
},
"defaultScannerNetworkMode": {
"type": "string"
},
"defaultTrivyArgs": {
"type": "string"
},
"defaultTrivyImage": {
"type": "string"
},
"downloadFormat": {
"type": "string"
},
"editorFont": {
"type": "string"
},
"eventCleanupCron": {
"type": "string"
},
"eventCleanupEnabled": {
"type": "boolean"
},
"eventCollectionMode": {
"type": "string"
},
"eventPollInterval": {
"type": "integer"
},
"eventRetentionDays": {
"type": "integer"
},
"font": {
"type": "string"
},
"fontSize": {
"type": "string"
},
"formatLogTimestamps": {
"type": "boolean"
},
"gridFontSize": {
"type": "string"
},
"highlightUpdates": {
"type": "boolean"
},
"honorProxyLabels": {
"type": "boolean"
},
"labelFilterMode": {
"type": "string"
},
"logMaxLines": {
"type": "integer"
},
"metricsCollectionInterval": {
"type": "integer"
},
"primaryStackLocation": {
"type": "string"
},
"protectScannerImages": {
"type": "boolean"
},
"scannerCleanupCron": {
"type": "string"
},
"scannerCleanupEnabled": {
"type": "boolean"
},
"scheduleCleanupCron": {
"type": "string"
},
"scheduleCleanupEnabled": {
"type": "boolean"
},
"scheduleRetentionDays": {
"type": "integer"
},
"showExposedPorts": {
"type": "boolean"
},
"showGitCommitHash": {
"type": "boolean"
},
"showImageChangelogLinks": {
"type": "boolean"
},
"showStoppedContainers": {
"type": "boolean"
},
"showWhatsNew": {
"type": "boolean"
},
"terminalFont": {
"type": "string"
},
"timeFormat": {
"type": "string"
},
"useSelfhstIcons": {
"type": "boolean"
} }
} }
}, },
@@ -23613,7 +23880,52 @@
"darkTheme": "string", "darkTheme": "string",
"defaultTimezone": "string", "defaultTimezone": "string",
"logBufferSizeKb": 0, "logBufferSizeKb": 0,
"externalStackPaths": "string" "externalStackPaths": "string",
"actionIconSize": "string",
"compactPorts": true,
"confirmDestructive": true,
"dateFormat": "string",
"defaultBackupImage": "string",
"defaultComposeTemplate": "string",
"defaultGrypeArgs": "string",
"defaultGrypeImage": "string",
"defaultScannerDns": [
"string"
],
"defaultScannerNetworkMode": "string",
"defaultTrivyArgs": "string",
"defaultTrivyImage": "string",
"downloadFormat": "string",
"editorFont": "string",
"eventCleanupCron": "string",
"eventCleanupEnabled": true,
"eventCollectionMode": "string",
"eventPollInterval": 0,
"eventRetentionDays": 0,
"font": "string",
"fontSize": "string",
"formatLogTimestamps": true,
"gridFontSize": "string",
"highlightUpdates": true,
"honorProxyLabels": true,
"labelFilterMode": "string",
"logMaxLines": 0,
"metricsCollectionInterval": 0,
"primaryStackLocation": "string",
"protectScannerImages": true,
"scannerCleanupCron": "string",
"scannerCleanupEnabled": true,
"scheduleCleanupCron": "string",
"scheduleCleanupEnabled": true,
"scheduleRetentionDays": 0,
"showExposedPorts": true,
"showGitCommitHash": true,
"showImageChangelogLinks": true,
"showStoppedContainers": true,
"showWhatsNew": true,
"terminalFont": "string",
"timeFormat": "string",
"useSelfhstIcons": true
} }
} }
} }
@@ -23907,6 +24219,12 @@
}, },
"envId": { "envId": {
"type": "integer" "type": "integer"
},
"grypeImage": {
"type": "string"
},
"trivyImage": {
"type": "string"
} }
} }
}, },
@@ -24291,7 +24609,7 @@
"schema": { "schema": {
"type": "integer" "type": "integer"
}, },
"description": "Target environment id" "description": "Target environment id (takes precedence over envId/environmentId in the body)"
} }
], ],
"responses": { "responses": {
@@ -24316,7 +24634,7 @@
"bearerAuth": [] "bearerAuth": []
} }
], ],
"description": "Writes the compose + .env to the stack dir, stores secrets in the DB, and with start deploys it. Can bind a secret provider.", "description": "Writes the compose + .env to the stack dir, stores secrets in the DB, and with start deploys it. Can bind a secret provider. Target environment comes from the env query param, or from envId/environmentId in the body when the query is absent.",
"requestBody": { "requestBody": {
"required": true, "required": true,
"content": { "content": {
@@ -24339,7 +24657,8 @@
"envVars": { "envVars": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"rawEnvContent": { "rawEnvContent": {
@@ -24350,6 +24669,12 @@
}, },
"start": { "start": {
"type": "boolean" "type": "boolean"
},
"envId": {
"type": "integer"
},
"environmentId": {
"type": "integer"
} }
}, },
"required": [ "required": [
@@ -24363,11 +24688,13 @@
"composePath": "string", "composePath": "string",
"envPath": "string", "envPath": "string",
"envVars": [ "envVars": [
"string" {}
], ],
"rawEnvContent": "string", "rawEnvContent": "string",
"secretProviderId": 0, "secretProviderId": 0,
"start": true "start": true,
"envId": 0,
"environmentId": 0
} }
} }
} }
@@ -24522,6 +24849,9 @@
}, },
"currentComposePath": { "currentComposePath": {
"type": "string" "type": "string"
},
"persistenceWarning": {
"type": "string"
} }
}, },
"required": [ "required": [
@@ -25036,7 +25366,8 @@
} }
}, },
"secretProvider": { "secretProvider": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -25054,7 +25385,7 @@
"injectedSecretKeys": [ "injectedSecretKeys": [
"string" "string"
], ],
"secretProvider": "string" "secretProvider": {}
} }
} }
} }
@@ -25791,7 +26122,10 @@
"description": "oldDir and newComposePath are required, or the source directory does not exist" "description": "oldDir and newComposePath are required, or the source directory does not exist"
}, },
"403": { "403": {
"description": "Permission denied (requires stacks:edit)" "description": "Permission denied (requires stacks:edit), or a supplied path is not allowed"
},
"404": {
"description": "No stack source row for this name and environment"
}, },
"500": { "500": {
"description": "Failed to relocate stack" "description": "Failed to relocate stack"
@@ -26076,7 +26410,8 @@
"type": "integer" "type": "integer"
}, },
"fix": { "fix": {
"type": "string" "type": "object",
"properties": {}
}, },
"fixDescription": { "fixDescription": {
"type": "string" "type": "string"
@@ -26149,6 +26484,7 @@
"bearerAuth": [] "bearerAuth": []
} }
], ],
"description": "Set existing:true when validating an already-deployed stack, so the stack's own running containers/ports are excluded from the cross-stack collision checks; omit it (or false) for a brand-new stack, where a name/port clash with a running stack of the same name must still be reported.",
"requestBody": { "requestBody": {
"required": true, "required": true,
"content": { "content": {
@@ -26159,6 +26495,9 @@
"compose": { "compose": {
"type": "string" "type": "string"
}, },
"existing": {
"type": "boolean"
},
"config": { "config": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -26169,12 +26508,14 @@
} }
}, },
"severity": { "severity": {
"type": "string" "type": "object",
"properties": {}
} }
} }
}, },
"envVars": { "envVars": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -26782,19 +27123,24 @@
"type": "object", "type": "object",
"properties": { "properties": {
"docker": { "docker": {
"type": "string" "type": "object",
"properties": {}
}, },
"host": { "host": {
"type": "string" "type": "object",
"properties": {}
}, },
"runtime": { "runtime": {
"type": "string" "type": "object",
"properties": {}
}, },
"database": { "database": {
"type": "string" "type": "object",
"properties": {}
}, },
"stats": { "stats": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"required": [ "required": [
@@ -26880,7 +27226,8 @@
"type": "object", "type": "object",
"properties": { "properties": {
"diskUsage": { "diskUsage": {
"type": "string" "type": "object",
"properties": {}
} }
} }
}, },
@@ -29460,7 +29807,8 @@
"findings": { "findings": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "object",
"properties": {}
} }
}, },
"total": { "total": {
@@ -29518,7 +29866,8 @@
"type": "integer" "type": "integer"
}, },
"summary": { "summary": {
"type": "string" "type": "object",
"properties": {}
}, },
"images": { "images": {
"type": "array", "type": "array",