diff --git a/.github/workflows/dokploy.yml b/.github/workflows/dokploy.yml
index 1c228d27e..e30b5d06a 100644
--- a/.github/workflows/dokploy.yml
+++ b/.github/workflows/dokploy.yml
@@ -140,6 +140,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get_version.outputs.version }}
+ npm_version: ${{ steps.get_version.outputs.npm_version }}
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -151,6 +152,7 @@ jobs:
run: |
VERSION=$(node -p "require('./apps/dokploy/package.json').version")
echo "version=$VERSION" >> $GITHUB_OUTPUT
+ echo "npm_version=${VERSION#v}" >> $GITHUB_OUTPUT
- name: Fetch install.sh
run: |
@@ -164,6 +166,7 @@ jobs:
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.get_version.outputs.version }}
+ target_commitish: ${{ github.sha }}
name: ${{ steps.get_version.outputs.version }}
generate_release_notes: true
draft: false
@@ -180,15 +183,18 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10.22.0
+
- name: Sync version to MCP repository
run: |
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/mcp.git /tmp/mcp-repo
cd /tmp/mcp-repo
- jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
+ jq --arg v "${{ needs.generate-release.outputs.npm_version }}" '.version = $v' package.json > package.json.tmp
mv package.json.tmp package.json
- npm install -g pnpm
pnpm install
pnpm run fetch-openapi
pnpm run generate
@@ -196,55 +202,53 @@ jobs:
git config user.name "Dokploy Bot"
git config user.email "bot@dokploy.com"
git add -A
- git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
+ git commit -m "chore: bump version to ${{ needs.generate-release.outputs.npm_version }}" \
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
--allow-empty
git push
- echo "✅ MCP repo synced to version ${{ needs.generate-release.outputs.version }}"
+ echo "✅ MCP repo synced to version ${{ needs.generate-release.outputs.npm_version }}"
- name: Sync version to CLI repository
run: |
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/cli.git /tmp/cli-repo
cd /tmp/cli-repo
- jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
+ jq --arg v "${{ needs.generate-release.outputs.npm_version }}" '.version = $v' package.json > package.json.tmp
mv package.json.tmp package.json
cp ${{ github.workspace }}/openapi.json ./openapi.json
- npm install -g pnpm
pnpm install
pnpm run generate
git config user.name "Dokploy Bot"
git config user.email "bot@dokploy.com"
git add -A
- git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
+ git commit -m "chore: bump version to ${{ needs.generate-release.outputs.npm_version }}" \
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
--allow-empty
git push
- echo "✅ CLI repo synced to version ${{ needs.generate-release.outputs.version }}"
+ echo "✅ CLI repo synced to version ${{ needs.generate-release.outputs.npm_version }}"
- name: Sync version to SDK repository
run: |
git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/sdk.git /tmp/sdk-repo
cd /tmp/sdk-repo
- jq --arg v "${{ needs.generate-release.outputs.version }}" '.version = $v' package.json > package.json.tmp
+ jq --arg v "${{ needs.generate-release.outputs.npm_version }}" '.version = $v' package.json > package.json.tmp
mv package.json.tmp package.json
cp ${{ github.workspace }}/openapi.json ./openapi.json
- npm install -g pnpm
pnpm install
pnpm run generate
git config user.name "Dokploy Bot"
git config user.email "bot@dokploy.com"
git add -A
- git commit -m "chore: bump version to ${{ needs.generate-release.outputs.version }}" \
+ git commit -m "chore: bump version to ${{ needs.generate-release.outputs.npm_version }}" \
-m "Source: ${{ github.repository }}@${{ github.sha }}" \
--allow-empty
git push
- echo "✅ SDK repo synced to version ${{ needs.generate-release.outputs.version }}"
+ echo "✅ SDK repo synced to version ${{ needs.generate-release.outputs.npm_version }}"
diff --git a/.github/workflows/hotfix-cherry-pick.yml b/.github/workflows/hotfix-cherry-pick.yml
new file mode 100644
index 000000000..9632917d4
--- /dev/null
+++ b/.github/workflows/hotfix-cherry-pick.yml
@@ -0,0 +1,36 @@
+name: Hotfix Cherry-Pick
+
+on:
+ pull_request_target:
+ types: [closed, labeled]
+
+concurrency:
+ group: hotfix-to-main
+ cancel-in-progress: false
+
+jobs:
+ cherry-pick:
+ if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'hotfix')
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout main
+ uses: actions/checkout@v4
+ with:
+ ref: main
+ fetch-depth: 0
+ token: ${{ secrets.HOTFIX_PUSH_TOKEN }}
+
+ - name: Cherry-pick fix to main
+ run: |
+ git config user.name "Dokploy Bot"
+ git config user.email "bot@dokploy.com"
+ SHA="${{ github.event.pull_request.merge_commit_sha }}"
+ if [ "$(git rev-list --parents -n1 "$SHA" | wc -w)" -gt 2 ]; then
+ git cherry-pick -x -m 1 "$SHA"
+ else
+ git cherry-pick -x "$SHA"
+ fi
+ git commit --amend -m "$(git log -1 --format=%B)" -m "[skip ci]"
+ git push origin main
diff --git a/.github/workflows/hotfix-release.yml b/.github/workflows/hotfix-release.yml
new file mode 100644
index 000000000..7e473b3d2
--- /dev/null
+++ b/.github/workflows/hotfix-release.yml
@@ -0,0 +1,28 @@
+name: Hotfix Release
+
+on:
+ workflow_dispatch:
+
+concurrency:
+ group: hotfix-to-main
+ cancel-in-progress: false
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout main
+ uses: actions/checkout@v4
+ with:
+ ref: main
+ token: ${{ secrets.HOTFIX_PUSH_TOKEN }}
+
+ - name: Bump patch version and push
+ run: |
+ git config user.name "Dokploy Bot"
+ git config user.email "bot@dokploy.com"
+ CURRENT=$(node -p "require('./apps/dokploy/package.json').version")
+ NEW=$(echo "$CURRENT" | awk -F. -v OFS=. '{$NF++; print}')
+ sed -i "s/\"version\": \"$CURRENT\"/\"version\": \"$NEW\"/" apps/dokploy/package.json
+ git commit -am "chore: release ${NEW}"
+ git push origin main
diff --git a/.gitignore b/.gitignore
index d531bab01..602556df8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,4 +43,7 @@ yarn-error.log*
*.pem
-.db
\ No newline at end of file
+.db
+
+.playwright-*
+.credentials
\ No newline at end of file
diff --git a/apps/dokploy/__test__/api/api-key-name.test.ts b/apps/dokploy/__test__/api/api-key-name.test.ts
new file mode 100644
index 000000000..677a52757
--- /dev/null
+++ b/apps/dokploy/__test__/api/api-key-name.test.ts
@@ -0,0 +1,26 @@
+import { describe, expect, it } from "vitest";
+import { API_KEY_NAME_MAX_LENGTH, apiKeyNameSchema } from "@/lib/api-keys";
+
+describe("apiKeyNameSchema", () => {
+ it("rejects an empty name", () => {
+ const result = apiKeyNameSchema.safeParse("");
+ expect(result.success).toBe(false);
+ });
+
+ it("accepts a name at the maximum length", () => {
+ const name = "a".repeat(API_KEY_NAME_MAX_LENGTH);
+ const result = apiKeyNameSchema.safeParse(name);
+ expect(result.success).toBe(true);
+ });
+
+ it("rejects a name over the maximum length instead of passing it to better-auth", () => {
+ const name = "a".repeat(API_KEY_NAME_MAX_LENGTH + 1);
+ const result = apiKeyNameSchema.safeParse(name);
+ expect(result.success).toBe(false);
+ if (!result.success) {
+ expect(result.error.issues[0]?.message).toBe(
+ `Name must be at most ${API_KEY_NAME_MAX_LENGTH} characters`,
+ );
+ }
+ });
+});
diff --git a/apps/dokploy/__test__/backups/db-backup-restore-injection.test.ts b/apps/dokploy/__test__/backups/db-backup-restore-injection.test.ts
new file mode 100644
index 000000000..d48644c95
--- /dev/null
+++ b/apps/dokploy/__test__/backups/db-backup-restore-injection.test.ts
@@ -0,0 +1,106 @@
+import { execSync } from "node:child_process";
+import { chmodSync, existsSync, rmSync, writeFileSync } from "node:fs";
+import {
+ getLibsqlBackupCommand,
+ getMariadbBackupCommand,
+ getMongoBackupCommand,
+ getMysqlBackupCommand,
+ getPostgresBackupCommand,
+} from "@dokploy/server/utils/backups/utils";
+import {
+ getMariadbRestoreCommand,
+ getMongoRestoreCommand,
+ getMysqlRestoreCommand,
+ getPostgresRestoreCommand,
+} from "@dokploy/server/utils/restore/utils";
+import { afterAll, beforeAll, describe, expect, it } from "vitest";
+
+// A stub replacing the real `docker` binary. It ignores exec/-i/$CONTAINER_ID,
+// exports the -e VAR=val pairs, and runs the inner `sh -c
+
+ >
+ );
+};
+
+/**
+ * The HubSpot script is loaded app-wide for marketing tracking, but the
+ * conversations (chat) widget stays restricted to startup plan customers.
+ */
+export const useHubSpotChat = (enabled: boolean) => {
+ useEffect(() => {
+ if (!enabled) {
+ return;
+ }
+ const loadWidget = () => {
+ window.HubSpotConversations?.widget.load();
+ };
+ if (window.HubSpotConversations) {
+ loadWidget();
+ } else {
+ window.hsConversationsOnReady = [
+ ...(window.hsConversationsOnReady || []),
+ loadWidget,
+ ];
+ }
+ }, [enabled]);
+};
diff --git a/apps/dokploy/components/shared/code-editor.tsx b/apps/dokploy/components/shared/code-editor.tsx
index f0347da60..475032bab 100644
--- a/apps/dokploy/components/shared/code-editor.tsx
+++ b/apps/dokploy/components/shared/code-editor.tsx
@@ -3,6 +3,7 @@ import {
type Completion,
type CompletionContext,
type CompletionResult,
+ type CompletionSource,
} from "@codemirror/autocomplete";
import { css } from "@codemirror/lang-css";
import { json } from "@codemirror/lang-json";
@@ -135,6 +136,7 @@ interface Props extends ReactCodeMirrorProps {
language?: "yaml" | "json" | "properties" | "shell" | "css";
lineWrapping?: boolean;
lineNumbers?: boolean;
+ completionSource?: CompletionSource;
}
export const CodeEditor = ({
@@ -142,6 +144,7 @@ export const CodeEditor = ({
wrapperClassName,
language = "yaml",
lineNumbers = true,
+ completionSource,
...props
}: Props) => {
const { resolvedTheme } = useTheme();
@@ -175,11 +178,15 @@ export const CodeEditor = ({
languageData: { commentTokens: { line: "#" } },
}),
props.lineWrapping ? EditorView.lineWrapping : [],
- language === "yaml"
+ completionSource
? autocompletion({
- override: [dockerComposeComplete],
+ override: [completionSource],
})
- : [],
+ : language === "yaml"
+ ? autocompletion({
+ override: [dockerComposeComplete],
+ })
+ : [],
]}
{...props}
editable={!props.disabled}
diff --git a/apps/dokploy/components/shared/drawer-logs.tsx b/apps/dokploy/components/shared/drawer-logs.tsx
index 38f8b5db4..301a0fe0d 100644
--- a/apps/dokploy/components/shared/drawer-logs.tsx
+++ b/apps/dokploy/components/shared/drawer-logs.tsx
@@ -47,7 +47,7 @@ export const DrawerLogs = ({ isOpen, onClose, filteredLogs }: Props) => {
onClose();
}}
>
-
+
Deployment Logs
Details of the request log entry.
diff --git a/apps/dokploy/components/shared/env-autocomplete.ts b/apps/dokploy/components/shared/env-autocomplete.ts
new file mode 100644
index 000000000..0b6039976
--- /dev/null
+++ b/apps/dokploy/components/shared/env-autocomplete.ts
@@ -0,0 +1,193 @@
+import {
+ type Completion,
+ type CompletionContext,
+ type CompletionResult,
+ startCompletion,
+} from "@codemirror/autocomplete";
+import type { EditorView } from "@codemirror/view";
+import { useCallback } from "react";
+import { api } from "@/utils/api";
+
+interface Options {
+ projectEnv?: string | null;
+ environmentEnv?: string | null;
+ includeShared?: boolean;
+ projectId?: string;
+ environmentId?: string;
+}
+
+const parseKeys = (env?: string | null) =>
+ (env ?? "")
+ .split("\n")
+ .map((line) => line.trim())
+ .filter((line) => line && !line.startsWith("#") && line.includes("="))
+ .map((line) => line.slice(0, line.indexOf("=")).trim())
+ .filter((key) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(key));
+
+const applyAndContinue = (
+ view: EditorView,
+ completion: Completion,
+ from: number,
+ to: number,
+) => {
+ view.dispatch({
+ changes: { from, to, insert: completion.label },
+ selection: { anchor: from + completion.label.length },
+ });
+ startCompletion(view);
+};
+
+const applyAndClose = (
+ view: EditorView,
+ completion: Completion,
+ from: number,
+ to: number,
+) => {
+ const alreadyClosed = view.state.sliceDoc(to, to + 2) === "}}";
+ const insert = completion.label + (alreadyClosed ? "" : "}}");
+ view.dispatch({
+ changes: { from, to, insert },
+ selection: {
+ anchor: from + completion.label.length + 2,
+ },
+ });
+};
+
+export const useEnvCompletionSource = ({
+ projectEnv,
+ environmentEnv,
+ includeShared = true,
+ projectId,
+ environmentId,
+}: Options = {}) => {
+ const { data: allProviders } = api.vaultProvider.all.useQuery();
+ const utils = api.useUtils();
+ const providers = projectId
+ ? allProviders?.filter((provider) =>
+ provider.assignments?.some(
+ (assignment) =>
+ assignment.projectId === projectId &&
+ (assignment.environmentIds.length === 0 ||
+ !environmentId ||
+ assignment.environmentIds.includes(environmentId)),
+ ),
+ )
+ : [];
+
+ return useCallback(
+ async (context: CompletionContext): Promise => {
+ const match = context.matchBefore(/\$\{\{[^}\n]*$/);
+ if (!match) return null;
+
+ const inner = match.text.slice(3);
+ const innerFrom = match.from + 3;
+
+ const vaultSecret = /^vault\.([a-zA-Z0-9_-]+)\.([^}\n]*)$/.exec(inner);
+ if (vaultSecret) {
+ const provider = providers?.find((p) => p.name === vaultSecret[1]);
+ if (!provider || !projectId) return null;
+ const names = await utils.vaultProvider.listSecretNames
+ .fetch({
+ vaultProviderId: provider.vaultProviderId,
+ projectId,
+ environmentId,
+ })
+ .catch(() => [] as string[]);
+ return {
+ from: innerFrom + `vault.${vaultSecret[1]}.`.length,
+ options: names.map((name) => ({
+ label: name,
+ type: "variable",
+ apply: applyAndClose,
+ })),
+ validFor: /^[^}\n]*$/,
+ };
+ }
+
+ const vaultProviderPrefix = /^vault\.([a-zA-Z0-9_-]*)$/.exec(inner);
+ if (vaultProviderPrefix) {
+ return {
+ from: innerFrom + "vault.".length,
+ options: (providers ?? []).map((provider) => ({
+ label: `${provider.name}.`,
+ detail: provider.providerType,
+ type: "namespace",
+ apply: applyAndContinue,
+ })),
+ validFor: /^[a-zA-Z0-9_-]*$/,
+ };
+ }
+
+ if (includeShared) {
+ const shared: [RegExp, string, string | null | undefined][] = [
+ [/^project\.([^}\n]*)$/, "project.", projectEnv],
+ [/^environment\.([^}\n]*)$/, "environment.", environmentEnv],
+ ];
+ for (const [regex, prefix, env] of shared) {
+ if (regex.test(inner)) {
+ return {
+ from: innerFrom + prefix.length,
+ options: parseKeys(env).map((key) => ({
+ label: key,
+ type: "variable",
+ apply: applyAndClose,
+ })),
+ validFor: /^[A-Za-z0-9_]*$/,
+ };
+ }
+ }
+ }
+
+ if (!inner.includes(".")) {
+ const options: Completion[] = [];
+ if (includeShared) {
+ options.push(
+ {
+ label: "project.",
+ type: "namespace",
+ info: "Shared project variables",
+ apply: applyAndContinue,
+ },
+ {
+ label: "environment.",
+ type: "namespace",
+ info: "Shared environment variables",
+ apply: applyAndContinue,
+ },
+ );
+ }
+ options.push({
+ label: "vault.",
+ type: "namespace",
+ info: "Secrets from an external vault provider",
+ apply: applyAndContinue,
+ });
+ if (includeShared) {
+ for (const key of parseKeys(context.state.doc.toString())) {
+ options.push({
+ label: key,
+ type: "variable",
+ apply: applyAndClose,
+ });
+ }
+ }
+ return {
+ from: innerFrom,
+ options,
+ validFor: /^[A-Za-z0-9_.-]*$/,
+ };
+ }
+
+ return null;
+ },
+ [
+ providers,
+ projectEnv,
+ environmentEnv,
+ includeShared,
+ projectId,
+ environmentId,
+ utils,
+ ],
+ );
+};
diff --git a/apps/dokploy/components/ui/badge.tsx b/apps/dokploy/components/ui/badge.tsx
index bcd0ffe05..ef7e697dd 100644
--- a/apps/dokploy/components/ui/badge.tsx
+++ b/apps/dokploy/components/ui/badge.tsx
@@ -5,7 +5,7 @@ import type * as React from "react";
import { cn } from "@/lib/utils";
const badgeVariants = cva(
- "group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2.5 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
+ "group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2.5 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg:not(.cursor-pointer)]:pointer-events-none [&>svg]:size-3!",
{
variants: {
variant: {
diff --git a/apps/dokploy/components/ui/button.tsx b/apps/dokploy/components/ui/button.tsx
index 67f4405b0..f31410ab4 100644
--- a/apps/dokploy/components/ui/button.tsx
+++ b/apps/dokploy/components/ui/button.tsx
@@ -6,7 +6,7 @@ import type * as React from "react";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
- "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+ "group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
diff --git a/apps/dokploy/components/ui/command.tsx b/apps/dokploy/components/ui/command.tsx
index 5946df786..634e4c1aa 100644
--- a/apps/dokploy/components/ui/command.tsx
+++ b/apps/dokploy/components/ui/command.tsx
@@ -151,13 +151,15 @@ function CommandItem({
{children}
-
+ {"data-checked" in props && (
+
+ )}
);
}
diff --git a/apps/dokploy/components/ui/dropdown-menu.tsx b/apps/dokploy/components/ui/dropdown-menu.tsx
index bf06bb708..dcb1520f2 100644
--- a/apps/dokploy/components/ui/dropdown-menu.tsx
+++ b/apps/dokploy/components/ui/dropdown-menu.tsx
@@ -1,21 +1,37 @@
import { CheckIcon, ChevronRightIcon } from "lucide-react";
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
-import type * as React from "react";
+import * as React from "react";
import { markNestedPopupClosed } from "@/components/ui/nested-popup-context";
import { cn } from "@/lib/utils";
function DropdownMenu({
+ open,
+ defaultOpen,
onOpenChange,
...props
}: React.ComponentProps) {
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(
+ defaultOpen ?? false,
+ );
+ const isControlled = open !== undefined;
+ const isOpen = isControlled ? open : uncontrolledOpen;
+
return (
{
- if (!open) {
+ open={isOpen}
+ onOpenChange={(nextOpen) => {
+ // Radix closes menus on window blur, unmounting any dialog rendered inside
+ if (!nextOpen && !document.hasFocus()) {
+ return;
+ }
+ if (!isControlled) {
+ setUncontrolledOpen(nextOpen);
+ }
+ if (!nextOpen) {
markNestedPopupClosed();
}
- onOpenChange?.(open);
+ onOpenChange?.(nextOpen);
}}
{...props}
/>
diff --git a/apps/dokploy/components/ui/secrets.tsx b/apps/dokploy/components/ui/secrets.tsx
index 9e0ba194f..61b7f8a83 100644
--- a/apps/dokploy/components/ui/secrets.tsx
+++ b/apps/dokploy/components/ui/secrets.tsx
@@ -1,3 +1,4 @@
+import type { CompletionSource } from "@codemirror/autocomplete";
import { EyeIcon, EyeOffIcon } from "lucide-react";
import { type CSSProperties, type ReactNode, useState } from "react";
import { useFormContext } from "react-hook-form";
@@ -21,6 +22,7 @@ interface Props {
title: string;
description: ReactNode;
placeholder: string;
+ completionSource?: CompletionSource;
}
export const Secrets = (props: Props) => {
@@ -61,6 +63,7 @@ export const Secrets = (props: Props) => {
} as CSSProperties
}
language="properties"
+ completionSource={props.completionSource}
disabled={isVisible}
lineWrapping
placeholder={props.placeholder}
diff --git a/apps/dokploy/components/ui/select.tsx b/apps/dokploy/components/ui/select.tsx
index a78df1b44..e4c7518bd 100644
--- a/apps/dokploy/components/ui/select.tsx
+++ b/apps/dokploy/components/ui/select.tsx
@@ -80,7 +80,7 @@ function SelectContent({
@@ -114,7 +114,7 @@ function SelectItem({
) {
}
const sidebarMenuButtonVariants = cva(
- "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
+ "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
{
variants: {
variant: {
@@ -473,8 +473,8 @@ const sidebarMenuButtonVariants = cva(
"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]",
},
size: {
- default: "h-8 text-sm",
- sm: "h-7 text-xs",
+ default: "h-8 text-sm group-data-[collapsible=icon]:p-2!",
+ sm: "h-7 text-xs group-data-[collapsible=icon]:p-2!",
lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!",
},
},
diff --git a/apps/dokploy/components/ui/textarea.tsx b/apps/dokploy/components/ui/textarea.tsx
index 959d789e2..4a8168211 100644
--- a/apps/dokploy/components/ui/textarea.tsx
+++ b/apps/dokploy/components/ui/textarea.tsx
@@ -7,7 +7,7 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
)}
- {error && (
-
- )}
-
{
- const statusCode = res ? res.statusCode : err ? err.statusCode : 404;
- return { statusCode, error: err };
+ErrorPage.getInitialProps = ({ res, err }: NextPageContext) => {
+ const statusCode = res ? res.statusCode : err ? (err.statusCode ?? 500) : 404;
+ return { statusCode };
};
diff --git a/apps/dokploy/pages/api/deploy/[refreshToken].ts b/apps/dokploy/pages/api/deploy/[refreshToken].ts
index bb6eb06d3..9cf6142d2 100644
--- a/apps/dokploy/pages/api/deploy/[refreshToken].ts
+++ b/apps/dokploy/pages/api/deploy/[refreshToken].ts
@@ -119,9 +119,11 @@ export default async function handler(
}
// If webhook doesn't provide image info, we'll use the configured image (old behavior)
} else if (sourceType === "github") {
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
application.watchPaths,
@@ -150,21 +152,29 @@ export default async function handler(
let normalizedCommits: string[] = [];
if (provider === "github") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
} else if (provider === "gitlab") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
} else if (provider === "gitea") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
} else if (provider === "soft-serve") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
}
const shouldDeployPaths = shouldDeploy(
@@ -179,9 +189,11 @@ export default async function handler(
} else if (sourceType === "gitlab") {
const branchName = extractBranchName(req.headers, req.body);
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
application.watchPaths,
@@ -225,9 +237,11 @@ export default async function handler(
} else if (sourceType === "gitea") {
const branchName = extractBranchName(req.headers, req.body);
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
application.watchPaths,
diff --git a/apps/dokploy/pages/api/deploy/compose/[refreshToken].ts b/apps/dokploy/pages/api/deploy/compose/[refreshToken].ts
index 85a379eb3..0d83c1017 100644
--- a/apps/dokploy/pages/api/deploy/compose/[refreshToken].ts
+++ b/apps/dokploy/pages/api/deploy/compose/[refreshToken].ts
@@ -54,9 +54,11 @@ export default async function handler(
if (sourceType === "github") {
const branchName = extractBranchName(req.headers, req.body);
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
composeResult.watchPaths,
@@ -74,9 +76,11 @@ export default async function handler(
}
} else if (sourceType === "gitlab") {
const branchName = extractBranchName(req.headers, req.body);
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
composeResult.watchPaths,
@@ -125,17 +129,23 @@ export default async function handler(
let normalizedCommits: string[] = [];
if (provider === "github") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
} else if (provider === "gitlab") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
} else if (provider === "gitea") {
- normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
}
const shouldDeployPaths = shouldDeploy(
@@ -150,9 +160,11 @@ export default async function handler(
} else if (sourceType === "gitea") {
const branchName = extractBranchName(req.headers, req.body);
- const normalizedCommits = req.body?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = req.body?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const shouldDeployPaths = shouldDeploy(
composeResult.watchPaths,
diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts
index f03bf786e..4fc75fc50 100644
--- a/apps/dokploy/pages/api/deploy/github.ts
+++ b/apps/dokploy/pages/api/deploy/github.ts
@@ -223,9 +223,11 @@ export default async function handler(
const deploymentTitle = extractCommitMessage(req.headers, req.body);
const deploymentHash = extractHash(req.headers, req.body);
const owner = getGithubRepositoryOwner(githubBody);
- const normalizedCommits = githubBody?.commits?.flatMap(
- (commit: any) => commit.modified,
- );
+ const normalizedCommits = githubBody?.commits?.flatMap((commit: any) => [
+ ...(commit.added || []),
+ ...(commit.modified || []),
+ ...(commit.removed || []),
+ ]);
const apps = await db.query.applications.findMany({
where: and(
diff --git a/apps/dokploy/pages/api/providers/github/setup.ts b/apps/dokploy/pages/api/providers/github/setup.ts
index 663939c5e..ecf86e2d0 100644
--- a/apps/dokploy/pages/api/providers/github/setup.ts
+++ b/apps/dokploy/pages/api/providers/github/setup.ts
@@ -1,5 +1,11 @@
-import { createGithub } from "@dokploy/server";
+import {
+ createGithub,
+ deriveGithubApiUrl,
+ parseGithubBaseUrl,
+ validateRequest,
+} from "@dokploy/server";
import { db } from "@dokploy/server/db";
+import { hasPermission } from "@dokploy/server/services/permission";
import { eq } from "drizzle-orm";
import type { NextApiRequest, NextApiResponse } from "next";
import { Octokit } from "octokit";
@@ -10,30 +16,43 @@ type Query = {
state: string;
installation_id: string;
setup_action: string;
+ githubUrl?: string;
};
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
- const { code, state, installation_id }: Query = req.query as Query;
+ const { code, state, installation_id, githubUrl }: Query = req.query as Query;
if (!code) {
return res.status(400).json({ error: "Missing code parameter" });
}
- const [action, ...rest] = state?.split(":");
- // For gh_init: rest[0] = organizationId, rest[1] = userId
- // For gh_setup: rest[0] = githubProviderId
+
+ const { user, session } = await validateRequest(req);
+ if (!user || !session?.activeOrganizationId) {
+ return res.status(401).json({ error: "Unauthorized" });
+ }
+ const ctx = {
+ user: { id: user.id },
+ session: { activeOrganizationId: session.activeOrganizationId },
+ };
+
+ const [action] = state?.split(":") ?? [];
+ if (!(await hasPermission(ctx, { gitProviders: ["create"] }))) {
+ return res.status(403).json({ error: "Forbidden" });
+ }
if (action === "gh_init") {
- const organizationId = rest[0];
- const userId = rest[1] || (req.query.userId as string);
-
- if (!userId) {
- return res.status(400).json({ error: "Missing userId parameter" });
+ // Reject before any outbound request: this runs on a GET the user can be
+ // linked into, so the host is not trusted.
+ const parsed = parseGithubBaseUrl(githubUrl);
+ if ("error" in parsed) {
+ return res.status(400).json({ error: parsed.error });
}
- const octokit = new Octokit({});
+ const baseUrl = parsed.url;
+ const octokit = new Octokit({ baseUrl: deriveGithubApiUrl(baseUrl) });
const { data } = await octokit.request(
"POST /app-manifests/{code}/conversions",
{
@@ -50,17 +69,34 @@ export default async function handler(
githubClientSecret: data.client_secret,
githubWebhookSecret: data.webhook_secret,
githubPrivateKey: data.pem,
+ githubUrl: baseUrl,
},
- organizationId as string,
- userId,
+ session.activeOrganizationId,
+ user.id,
);
} else if (action === "gh_setup") {
+ const githubId = state?.split(":")[1];
+ if (!githubId) {
+ return res.status(400).json({ error: "Missing github provider id" });
+ }
+
+ const provider = await db.query.github.findFirst({
+ where: eq(github.githubId, githubId),
+ with: { gitProvider: true },
+ });
+ if (
+ !provider ||
+ provider.gitProvider.organizationId !== session.activeOrganizationId
+ ) {
+ return res.status(404).json({ error: "Github provider not found" });
+ }
+
await db
.update(github)
.set({
githubInstallationId: installation_id,
})
- .where(eq(github.githubId, rest[0] as string))
+ .where(eq(github.githubId, githubId))
.returning();
}
diff --git a/apps/dokploy/pages/dashboard/docker.tsx b/apps/dokploy/pages/dashboard/docker.tsx
index df1b2e5ed..a8c1eef1e 100644
--- a/apps/dokploy/pages/dashboard/docker.tsx
+++ b/apps/dokploy/pages/dashboard/docker.tsx
@@ -1,17 +1,84 @@
import { validateRequest } from "@dokploy/server/lib/auth";
import { createServerSideHelpers } from "@trpc/react-query/server";
import type { GetServerSidePropsContext } from "next";
+import { useRouter } from "next/router";
import type { ReactElement } from "react";
import superjson from "superjson";
import { ShowContainers } from "@/components/dashboard/docker/show/show-containers";
+import { ShowVolumes } from "@/components/dashboard/docker/volumes/show-volumes";
+import { ShowNetworks } from "@/components/dashboard/networks/show-networks";
+import { ShowSwarmContainers } from "@/components/dashboard/swarm/containers/show-swarm-containers";
+import SwarmMonitorCard from "@/components/dashboard/swarm/monitoring-card";
import { DashboardLayout } from "@/components/layouts/dashboard-layout";
import { ServerFilter } from "@/components/shared/server-filter";
+import { Card } from "@/components/ui/card";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { appRouter } from "@/server/api/root";
+import { api } from "@/utils/api";
+
+const DEFAULT_TAB = "containers";
const Dashboard = () => {
+ const router = useRouter();
+ const { data: isCloud } = api.settings.isCloud.useQuery();
+
+ const queryTab =
+ typeof router.query.tab === "string" ? router.query.tab : DEFAULT_TAB;
+ const activeTab = isCloud && queryTab === "networks" ? DEFAULT_TAB : queryTab;
+
+ const setTab = (value: string) => {
+ const { tab: _current, ...query } = router.query;
+ router.replace(
+ {
+ pathname: router.pathname,
+ query: value === DEFAULT_TAB ? query : { ...query, tab: value },
+ },
+ undefined,
+ { shallow: true },
+ );
+ };
+
return (
- {(serverId) => }
+ {(serverId) => (
+
+
+ Containers
+ Swarm
+ Volumes
+ {!isCloud && Networks}
+
+
+
+
+
+
+
+ Overview
+ Containers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {!isCloud && (
+
+
+
+ )}
+
+ )}
);
};
diff --git a/apps/dokploy/pages/dashboard/networks.tsx b/apps/dokploy/pages/dashboard/networks.tsx
new file mode 100644
index 000000000..f19de36ad
--- /dev/null
+++ b/apps/dokploy/pages/dashboard/networks.tsx
@@ -0,0 +1,21 @@
+import type { GetServerSidePropsContext } from "next";
+
+const Networks = () => {
+ return null;
+};
+
+export default Networks;
+
+export async function getServerSideProps(ctx: GetServerSidePropsContext) {
+ const serverId =
+ typeof ctx.query.serverId === "string" ? ctx.query.serverId : undefined;
+
+ return {
+ redirect: {
+ permanent: false,
+ destination: `/dashboard/docker?tab=networks${
+ serverId ? `&serverId=${encodeURIComponent(serverId)}` : ""
+ }`,
+ },
+ };
+}
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId].tsx
index 469941446..a75510239 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId].tsx
@@ -259,6 +259,7 @@ export const extractServicesFromEnvironment = (
serverId: item.serverId,
serverName: item?.server?.name || null,
lastDeployDate,
+ icon: item.icon || null,
};
}) || [];
@@ -1701,9 +1702,17 @@ const EnvironmentPage = (
) : (
))}
- {service.type === "compose" && (
-
- )}
+ {service.type === "compose" &&
+ (service.icon ? (
+ // biome-ignore lint/performance/noImgElement: compose icon is data URL
+

+ ) : (
+
+ ))}
{service.type === "libsql" && (
)}
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/application/[applicationId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/application/[applicationId].tsx
index 86e75fd2d..af9b8cd04 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/application/[applicationId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/application/[applicationId].tsx
@@ -35,6 +35,7 @@ import { ShowVolumeBackups } from "@/components/dashboard/application/volume-bac
import { DeleteService } from "@/components/dashboard/compose/delete-service";
import { ContainerFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-container-monitoring";
import { ContainerPaidMonitoring } from "@/components/dashboard/monitoring/paid/container/show-paid-container-monitoring";
+import { AssignNetworks } from "@/components/dashboard/networks/assign-networks";
import { DashboardLayout } from "@/components/layouts/dashboard-layout";
import { AdvanceBreadcrumb } from "@/components/shared/advance-breadcrumb";
import { StatusTooltip } from "@/components/shared/status-tooltip";
@@ -126,7 +127,8 @@ const Service = (
@@ -347,6 +349,7 @@ const Service = (
@@ -417,6 +420,7 @@ const Service = (
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/compose/[composeId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/compose/[composeId].tsx
index 76ad824ca..fcd408618 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/compose/[composeId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/compose/[composeId].tsx
@@ -1,7 +1,7 @@
import { validateRequest } from "@dokploy/server/lib/auth";
import { createServerSideHelpers } from "@trpc/react-query/server";
import copy from "copy-to-clipboard";
-import { CircuitBoard, HelpCircle, ServerOff } from "lucide-react";
+import { HelpCircle, ServerOff } from "lucide-react";
import type {
GetServerSidePropsContext,
InferGetServerSidePropsType,
@@ -17,6 +17,7 @@ import { ShowVolumes } from "@/components/dashboard/application/advanced/volumes
import { ShowDeployments } from "@/components/dashboard/application/deployments/show-deployments";
import { ShowDomains } from "@/components/dashboard/application/domains/show-domains";
import { ShowEnvironment } from "@/components/dashboard/application/environment/show-environment";
+import { ShowIconSettings } from "@/components/dashboard/application/icon/show-icon-settings";
import { ShowPatches } from "@/components/dashboard/application/patches/show-patches";
import { ShowSchedules } from "@/components/dashboard/application/schedules/show-schedules";
import { ShowVolumeBackups } from "@/components/dashboard/application/volume-backups/show-volume-backups";
@@ -31,6 +32,7 @@ import { UpdateCompose } from "@/components/dashboard/compose/update-compose";
import { ShowBackups } from "@/components/dashboard/database/backups/show-backups";
import { ComposeFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-compose-monitoring";
import { ComposePaidMonitoring } from "@/components/dashboard/monitoring/paid/container/show-paid-compose-monitoring";
+import { AssignComposeNetworks } from "@/components/dashboard/networks/assign-compose-networks";
import { DashboardLayout } from "@/components/layouts/dashboard-layout";
import { AdvanceBreadcrumb } from "@/components/shared/advance-breadcrumb";
import { StatusTooltip } from "@/components/shared/status-tooltip";
@@ -112,13 +114,16 @@ const Service = (
-
-
-
+
+
{data?.name}
@@ -312,6 +317,7 @@ const Service = (
serverId={data?.serverId || undefined}
appName={data?.appName || ""}
appType={data?.composeType || "docker-compose"}
+ serviceId={data?.composeId}
/>
@@ -380,11 +386,13 @@ const Service = (
serverId={data?.serverId || ""}
appName={data?.appName || ""}
appType={data?.composeType || "docker-compose"}
+ serviceId={data?.composeId}
/>
) : (
)}
@@ -424,6 +432,7 @@ const Service = (
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/libsql/[libsqlId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/libsql/[libsqlId].tsx
index 9a633c176..9996d4fb1 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/libsql/[libsqlId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/libsql/[libsqlId].tsx
@@ -185,7 +185,7 @@ const Libsql = (
router.push(newPath, undefined, { shallow: true });
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mariadb/[mariadbId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mariadb/[mariadbId].tsx
index 47ec1a6ff..ddbb47a86 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mariadb/[mariadbId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mariadb/[mariadbId].tsx
@@ -199,7 +199,7 @@ const Mariadb = (
router.push(newPath, undefined, { shallow: true });
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mongo/[mongoId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mongo/[mongoId].tsx
index 6074ed7ed..851500fd5 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mongo/[mongoId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mongo/[mongoId].tsx
@@ -199,7 +199,7 @@ const Mongo = (
router.push(newPath, undefined, { shallow: true });
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mysql/[mysqlId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mysql/[mysqlId].tsx
index 3b6edf170..2c689e602 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mysql/[mysqlId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/mysql/[mysqlId].tsx
@@ -199,7 +199,7 @@ const MySql = (
router.push(newPath, undefined, { shallow: true });
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/postgres/[postgresId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/postgres/[postgresId].tsx
index 36cef637d..13c50fe61 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/postgres/[postgresId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/postgres/[postgresId].tsx
@@ -200,7 +200,7 @@ const Postgresql = (
});
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/redis/[redisId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/redis/[redisId].tsx
index 7adc36c66..bc131fc84 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/redis/[redisId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/environment/[environmentId]/services/redis/[redisId].tsx
@@ -198,7 +198,7 @@ const Redis = (
router.push(newPath, undefined, { shallow: true });
}}
>
-
+
diff --git a/apps/dokploy/pages/dashboard/settings/secrets.tsx b/apps/dokploy/pages/dashboard/settings/secrets.tsx
new file mode 100644
index 000000000..cd7aa0358
--- /dev/null
+++ b/apps/dokploy/pages/dashboard/settings/secrets.tsx
@@ -0,0 +1,53 @@
+import { validateRequest } from "@dokploy/server";
+import { createServerSideHelpers } from "@trpc/react-query/server";
+import type { GetServerSidePropsContext } from "next";
+import type { ReactElement } from "react";
+import superjson from "superjson";
+import { ShowVaultProviders } from "@/components/dashboard/settings/vault/show-vault-providers";
+import { DashboardLayout } from "@/components/layouts/dashboard-layout";
+import { appRouter } from "@/server/api/root";
+
+const Page = () => {
+ return (
+
+
+
+ );
+};
+
+export default Page;
+
+Page.getLayout = (page: ReactElement) => {
+ return
{page};
+};
+export async function getServerSideProps(ctx: GetServerSidePropsContext) {
+ const { req, res } = ctx;
+ const { user, session } = await validateRequest(req);
+ if (!user || user.role === "member") {
+ return {
+ redirect: {
+ permanent: false,
+ destination: "/",
+ },
+ };
+ }
+ const helpers = createServerSideHelpers({
+ router: appRouter,
+ ctx: {
+ req: req as any,
+ res: res as any,
+ db: null as any,
+ session: session as any,
+ user: user as any,
+ },
+ transformer: superjson,
+ });
+ await helpers.user.get.prefetch();
+ await helpers.settings.isCloud.prefetch();
+
+ return {
+ props: {
+ trpcState: helpers.dehydrate(),
+ },
+ };
+}
diff --git a/apps/dokploy/pages/dashboard/swarm.tsx b/apps/dokploy/pages/dashboard/swarm.tsx
index 77fc2b309..03e34da45 100644
--- a/apps/dokploy/pages/dashboard/swarm.tsx
+++ b/apps/dokploy/pages/dashboard/swarm.tsx
@@ -1,94 +1,21 @@
-import { validateRequest } from "@dokploy/server/lib/auth";
-import { createServerSideHelpers } from "@trpc/react-query/server";
import type { GetServerSidePropsContext } from "next";
-import type { ReactElement } from "react";
-import superjson from "superjson";
-import { ShowSwarmContainers } from "@/components/dashboard/swarm/containers/show-swarm-containers";
-import SwarmMonitorCard from "@/components/dashboard/swarm/monitoring-card";
-import { DashboardLayout } from "@/components/layouts/dashboard-layout";
-import { ServerFilter } from "@/components/shared/server-filter";
-import { Card } from "@/components/ui/card";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
-import { appRouter } from "@/server/api/root";
-const Dashboard = () => {
- return (
-
- {(serverId) => (
-
-
-
- Overview
- Containers
-
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
- );
+const Swarm = () => {
+ return null;
};
-export default Dashboard;
+export default Swarm;
-Dashboard.getLayout = (page: ReactElement) => {
- return
{page};
-};
-export async function getServerSideProps(
- ctx: GetServerSidePropsContext<{ serviceId: string }>,
-) {
- const { user, session } = await validateRequest(ctx.req);
- if (!user) {
- return {
- redirect: {
- permanent: false,
- destination: "/",
- },
- };
- }
- const { req, res } = ctx;
+export async function getServerSideProps(ctx: GetServerSidePropsContext) {
+ const serverId =
+ typeof ctx.query.serverId === "string" ? ctx.query.serverId : undefined;
- const helpers = createServerSideHelpers({
- router: appRouter,
- ctx: {
- req: req as any,
- res: res as any,
- db: null as any,
- session: session as any,
- user: user as any,
+ return {
+ redirect: {
+ permanent: false,
+ destination: `/dashboard/docker?tab=swarm${
+ serverId ? `&serverId=${encodeURIComponent(serverId)}` : ""
+ }`,
},
- transformer: superjson,
- });
- try {
- await helpers.project.all.prefetch();
-
- const userPermissions = await helpers.user.getPermissions.fetch();
-
- if (!userPermissions?.docker.read) {
- return {
- redirect: {
- permanent: false,
- destination: "/",
- },
- };
- }
- return {
- props: {
- trpcState: helpers.dehydrate(),
- },
- };
- } catch {
- return {
- props: {},
- };
- }
+ };
}
diff --git a/apps/dokploy/pages/index.tsx b/apps/dokploy/pages/index.tsx
index eeac73226..e8381c1cb 100644
--- a/apps/dokploy/pages/index.tsx
+++ b/apps/dokploy/pages/index.tsx
@@ -6,6 +6,7 @@ import {
import { validateRequest } from "@dokploy/server/lib/auth";
import { standardSchemaResolver as zodResolver } from "@hookform/resolvers/standard-schema";
import { REGEXP_ONLY_DIGITS } from "input-otp";
+import { Fingerprint } from "lucide-react";
import type { GetServerSidePropsContext } from "next";
import Link from "next/link";
import { useRouter } from "next/router";
@@ -68,6 +69,7 @@ export default function Home({ IS_CLOUD, enforceSSO }: Props) {
const { config: whitelabeling } = useWhitelabelingPublic();
const { data: showSignInWithSSO } = api.sso.showSignInWithSSO.useQuery();
const [isLoginLoading, setIsLoginLoading] = useState(false);
+ const [isPasskeyLoading, setIsPasskeyLoading] = useState(false);
const [isTwoFactorLoading, setIsTwoFactorLoading] = useState(false);
const [isBackupCodeLoading, setIsBackupCodeLoading] = useState(false);
const [isTwoFactor, setIsTwoFactor] = useState(false);
@@ -123,6 +125,34 @@ export default function Home({ IS_CLOUD, enforceSSO }: Props) {
setIsLoginLoading(false);
}
};
+ const onPasskeySignIn = async () => {
+ setIsPasskeyLoading(true);
+ try {
+ const { data, error } = await authClient.signIn.passkey();
+
+ if (error) {
+ const errorCode = "code" in error ? error.code : undefined;
+ if (
+ errorCode !== "AUTH_CANCELLED" &&
+ errorCode !== "ERROR_CEREMONY_ABORTED"
+ ) {
+ toast.error(error.message || "Failed to sign in with passkey");
+ setError(error.message || "Failed to sign in with passkey");
+ }
+ return;
+ }
+
+ if (data) {
+ toast.success("Logged in successfully");
+ router.push("/dashboard/home");
+ }
+ } catch {
+ toast.error("An error occurred while signing in with passkey");
+ } finally {
+ setIsPasskeyLoading(false);
+ }
+ };
+
const onTwoFactorSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (twoFactorCode.length !== 6) {
@@ -227,6 +257,16 @@ export default function Home({ IS_CLOUD, enforceSSO }: Props) {
+
>
);
diff --git a/apps/dokploy/public/icon-dark.svg b/apps/dokploy/public/icon-dark.svg
new file mode 100644
index 000000000..5faafdb37
--- /dev/null
+++ b/apps/dokploy/public/icon-dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/apps/dokploy/public/icon-light.svg b/apps/dokploy/public/icon-light.svg
new file mode 100644
index 000000000..6121a89dd
--- /dev/null
+++ b/apps/dokploy/public/icon-light.svg
@@ -0,0 +1,5 @@
+
diff --git a/apps/dokploy/public/locales/az/common.json b/apps/dokploy/public/locales/az/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/az/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/az/settings.json b/apps/dokploy/public/locales/az/settings.json
deleted file mode 100644
index fb286bf04..000000000
--- a/apps/dokploy/public/locales/az/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Yadda saxla",
- "settings.common.enterTerminal": "Terminala daxil ol",
- "settings.server.domain.title": "Server Domeni",
- "settings.server.domain.description": "Server tətbiqinizə domen əlavə edin.",
- "settings.server.domain.form.domain": "Domen",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-poçtu",
- "settings.server.domain.form.certificate.label": "Sertifikat Təminatçısı",
- "settings.server.domain.form.certificate.placeholder": "Sertifikat seçin",
- "settings.server.domain.form.certificateOptions.none": "Heç biri",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Veb Server",
- "settings.server.webServer.description": "Veb serveri yenidən yüklə və ya təmizlə.",
- "settings.server.webServer.actions": "Əməliyyatlar",
- "settings.server.webServer.reload": "Yenidən yüklə",
- "settings.server.webServer.watchLogs": "Logları izlə",
- "settings.server.webServer.updateServerIp": "Server IP-ni Yenilə",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Mühiti Dəyişdir",
- "settings.server.webServer.traefik.managePorts": "Əlavə Port Təyinatları",
- "settings.server.webServer.traefik.managePortsDescription": "Traefik üçün əlavə portlar əlavə edin və ya silin",
- "settings.server.webServer.traefik.targetPort": "Hədəf Port",
- "settings.server.webServer.traefik.publishedPort": "Dərc Edilmiş Port",
- "settings.server.webServer.traefik.addPort": "Port Əlavə Et",
- "settings.server.webServer.traefik.portsUpdated": "Portlar uğurla yeniləndi",
- "settings.server.webServer.traefik.portsUpdateError": "Portların yenilənməsi uğursuz oldu",
- "settings.server.webServer.traefik.publishMode": "Dərc Rejimi",
- "settings.server.webServer.storage.label": "Yer",
- "settings.server.webServer.storage.cleanUnusedImages": "İstifadə edilməyən şəkilləri təmizlə",
- "settings.server.webServer.storage.cleanUnusedVolumes": "İstifadə edilməyən həcmləri təmizlə",
- "settings.server.webServer.storage.cleanStoppedContainers": "Dayandırılmış konteynerləri təmizlə",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder və Sistemi təmizlə",
- "settings.server.webServer.storage.cleanMonitoring": "Monitorinqi təmizlə",
- "settings.server.webServer.storage.cleanAll": "Hamısını təmizlə",
-
- "settings.profile.title": "Hesab",
- "settings.profile.description": "Profilinizin məlumatlarını buradan dəyişin.",
- "settings.profile.email": "E-poçt",
- "settings.profile.password": "Şifrə",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Görünüş",
- "settings.appearance.description": "İdarəetmə panelinizin görünüşünü fərdiləşdirin.",
- "settings.appearance.theme": "Mövzu",
- "settings.appearance.themeDescription": "İdarəetmə paneliniz üçün mövzu seçin",
- "settings.appearance.themes.light": "İşıqlı",
- "settings.appearance.themes.dark": "Qaranlıq",
- "settings.appearance.themes.system": "Sistem",
- "settings.appearance.language": "Dil",
- "settings.appearance.languageDescription": "İdarəetmə paneliniz üçün dil seçin",
-
- "settings.terminal.connectionSettings": "Bağlantı parametrləri",
- "settings.terminal.ipAddress": "IP Ünvanı",
- "settings.terminal.port": "Port",
- "settings.terminal.username": "İstifadəçi adı"
-}
diff --git a/apps/dokploy/public/locales/de/common.json b/apps/dokploy/public/locales/de/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/de/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/de/settings.json b/apps/dokploy/public/locales/de/settings.json
deleted file mode 100644
index e2ba06236..000000000
--- a/apps/dokploy/public/locales/de/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "Speichern",
- "settings.server.domain.title": "Server-Domain",
- "settings.server.domain.description": "Füg eine Domain zu deiner Server-Anwendung hinzu.",
- "settings.server.domain.form.domain": "Domain",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-Mail",
- "settings.server.domain.form.certificate.label": "Zertifikat",
- "settings.server.domain.form.certificate.placeholder": "Wähl ein Zertifikat aus",
- "settings.server.domain.form.certificateOptions.none": "Keins",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Standard)",
-
- "settings.server.webServer.title": "Web-Server",
- "settings.server.webServer.description": "Lade den Web-Server neu oder reinige ihn.",
- "settings.server.webServer.actions": "Aktionen",
- "settings.server.webServer.reload": "Neu laden",
- "settings.server.webServer.watchLogs": "Logs anschauen",
- "settings.server.webServer.updateServerIp": "Server-IP Aktualisieren",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Umgebungsvariablen ändern",
- "settings.server.webServer.storage.label": "Speicherplatz",
- "settings.server.webServer.storage.cleanUnusedImages": "Nicht genutzte Bilder löschen",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Nicht genutzte Volumes löschen",
- "settings.server.webServer.storage.cleanStoppedContainers": "Gestoppte Container löschen",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & System bereinigen",
- "settings.server.webServer.storage.cleanMonitoring": "Monitoring bereinigen",
- "settings.server.webServer.storage.cleanAll": "Alles bereinigen",
-
- "settings.profile.title": "Konto",
- "settings.profile.description": "Ändere die Details deines Profiles hier.",
- "settings.profile.email": "E-Mail",
- "settings.profile.password": "Passwort",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Aussehen",
- "settings.appearance.description": "Pass das Design deines Dashboards an.",
- "settings.appearance.theme": "Theme",
- "settings.appearance.themeDescription": "Wähl ein Theme für dein Dashboard aus",
- "settings.appearance.themes.light": "Hell",
- "settings.appearance.themes.dark": "Dunkel",
- "settings.appearance.themes.system": "System",
- "settings.appearance.language": "Sprache",
- "settings.appearance.languageDescription": "Wähl eine Sprache für dein Dashboard aus"
-}
diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/en/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json
deleted file mode 100644
index 699a456e7..000000000
--- a/apps/dokploy/public/locales/en/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Save",
- "settings.common.enterTerminal": "Terminal",
- "settings.server.domain.title": "Server Domain",
- "settings.server.domain.description": "Add a domain to your server application.",
- "settings.server.domain.form.domain": "Domain",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email",
- "settings.server.domain.form.certificate.label": "Certificate Provider",
- "settings.server.domain.form.certificate.placeholder": "Select a certificate",
- "settings.server.domain.form.certificateOptions.none": "None",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Web Server",
- "settings.server.webServer.description": "Reload or clean the web server.",
- "settings.server.webServer.actions": "Actions",
- "settings.server.webServer.reload": "Reload",
- "settings.server.webServer.watchLogs": "View Logs",
- "settings.server.webServer.updateServerIp": "Update Server IP",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Modify Environment",
- "settings.server.webServer.traefik.managePorts": "Additional Port Mappings",
- "settings.server.webServer.traefik.managePortsDescription": "Add or remove additional ports for Traefik",
- "settings.server.webServer.traefik.targetPort": "Target Port",
- "settings.server.webServer.traefik.publishedPort": "Published Port",
- "settings.server.webServer.traefik.addPort": "Add Port",
- "settings.server.webServer.traefik.portsUpdated": "Ports updated successfully",
- "settings.server.webServer.traefik.portsUpdateError": "Failed to update ports",
- "settings.server.webServer.traefik.publishMode": "Publish Mode",
- "settings.server.webServer.storage.label": "Space",
- "settings.server.webServer.storage.cleanUnusedImages": "Clean unused images",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Clean unused volumes",
- "settings.server.webServer.storage.cleanStoppedContainers": "Clean stopped containers",
- "settings.server.webServer.storage.cleanDockerBuilder": "Clean Docker Builder & System",
- "settings.server.webServer.storage.cleanMonitoring": "Clean Monitoring",
- "settings.server.webServer.storage.cleanAll": "Clean all",
-
- "settings.profile.title": "Account",
- "settings.profile.description": "Change the details of your profile here.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Password",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Appearance",
- "settings.appearance.description": "Customize the theme of your dashboard.",
- "settings.appearance.theme": "Theme",
- "settings.appearance.themeDescription": "Select a theme for your dashboard",
- "settings.appearance.themes.light": "Light",
- "settings.appearance.themes.dark": "Dark",
- "settings.appearance.themes.system": "System",
- "settings.appearance.language": "Language",
- "settings.appearance.languageDescription": "Select a language for your dashboard",
-
- "settings.terminal.connectionSettings": "Connection settings",
- "settings.terminal.ipAddress": "IP Address",
- "settings.terminal.port": "Port",
- "settings.terminal.username": "Username"
-}
diff --git a/apps/dokploy/public/locales/es/common.json b/apps/dokploy/public/locales/es/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/es/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/es/settings.json b/apps/dokploy/public/locales/es/settings.json
deleted file mode 100644
index 90a41cd05..000000000
--- a/apps/dokploy/public/locales/es/settings.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "settings.common.save": "Guardar",
- "settings.server.domain.title": "Dominio del Servidor",
- "settings.server.domain.description": "Añade un dominio a tu aplicación de servidor.",
- "settings.server.domain.form.domain": "Dominio",
- "settings.server.domain.form.letsEncryptEmail": "Correo de Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Proveedor de Certificado",
- "settings.server.domain.form.certificate.placeholder": "Selecciona un certificado",
- "settings.server.domain.form.certificateOptions.none": "Ninguno",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Servidor Web",
- "settings.server.webServer.description": "Recarga o limpia el servidor web.",
- "settings.server.webServer.actions": "Acciones",
- "settings.server.webServer.reload": "Recargar",
- "settings.server.webServer.watchLogs": "Ver registros",
- "settings.server.webServer.updateServerIp": "Actualizar IP del Servidor",
- "settings.server.webServer.server.label": "Servidor",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Modificar Entorno",
- "settings.server.webServer.traefik.managePorts": "Asignación Adicional de Puertos",
- "settings.server.webServer.traefik.managePortsDescription": "Añadir o eliminar puertos adicionales para Traefik",
- "settings.server.webServer.traefik.targetPort": "Puerto de Destino",
- "settings.server.webServer.traefik.publishedPort": "Puerto Publicado",
- "settings.server.webServer.traefik.addPort": "Añadir Puerto",
- "settings.server.webServer.traefik.portsUpdated": "Puertos actualizados correctamente",
- "settings.server.webServer.traefik.portsUpdateError": "Error al actualizar los puertos",
- "settings.server.webServer.traefik.publishMode": "Modo de Publicación",
- "settings.server.webServer.storage.label": "Espacio",
- "settings.server.webServer.storage.cleanUnusedImages": "Limpiar imágenes no utilizadas",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Limpiar volúmenes no utilizados",
- "settings.server.webServer.storage.cleanStoppedContainers": "Limpiar contenedores detenidos",
- "settings.server.webServer.storage.cleanDockerBuilder": "Limpiar Constructor de Docker y Sistema",
- "settings.server.webServer.storage.cleanMonitoring": "Limpiar Monitoreo",
- "settings.server.webServer.storage.cleanAll": "Limpiar todo",
-
- "settings.profile.title": "Cuenta",
- "settings.profile.description": "Cambia los detalles de tu perfil aquí.",
- "settings.profile.email": "Correo electrónico",
- "settings.profile.password": "Contraseña",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Apariencia",
- "settings.appearance.description": "Personaliza el tema de tu panel.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Selecciona un tema para tu panel",
- "settings.appearance.themes.light": "Claro",
- "settings.appearance.themes.dark": "Oscuro",
- "settings.appearance.themes.system": "Sistema",
- "settings.appearance.language": "Idioma",
- "settings.appearance.languageDescription": "Selecciona un idioma para tu panel"
-}
diff --git a/apps/dokploy/public/locales/fa/common.json b/apps/dokploy/public/locales/fa/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/fa/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/fa/settings.json b/apps/dokploy/public/locales/fa/settings.json
deleted file mode 100644
index f28aaa27c..000000000
--- a/apps/dokploy/public/locales/fa/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "ذخیره",
- "settings.server.domain.title": "دامنه سرور",
- "settings.server.domain.description": "یک دامنه به برنامه سرور خود اضافه کنید.",
- "settings.server.domain.form.domain": "دامنه",
- "settings.server.domain.form.letsEncryptEmail": "ایمیل Let's Encrypt",
- "settings.server.domain.form.certificate.label": "گواهینامه",
- "settings.server.domain.form.certificate.placeholder": "یک گواهینامه انتخاب کنید",
- "settings.server.domain.form.certificateOptions.none": "هیچکدام",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (پیشفرض)",
-
- "settings.server.webServer.title": "وب سرور",
- "settings.server.webServer.description": "وب سرور را بازنشانی یا پاک کنید.",
- "settings.server.webServer.actions": "اقدامات",
- "settings.server.webServer.reload": "بارگذاری مجدد",
- "settings.server.webServer.watchLogs": "مشاهده گزارشها",
- "settings.server.webServer.updateServerIp": "بهروزرسانی آیپی سرور",
- "settings.server.webServer.server.label": "سرور",
- "settings.server.webServer.traefik.label": "ترافیک",
- "settings.server.webServer.traefik.modifyEnv": "ویرایش محیط",
- "settings.server.webServer.storage.label": "فضا",
- "settings.server.webServer.storage.cleanUnusedImages": "پاکسازی Image های بدون استفاده",
- "settings.server.webServer.storage.cleanUnusedVolumes": "پاکسازی ولومهای بدون استفاده",
- "settings.server.webServer.storage.cleanStoppedContainers": "پاکسازی کانتینرهای متوقفشده",
- "settings.server.webServer.storage.cleanDockerBuilder": "پاکسازی بیلدر و سیستم داکر",
- "settings.server.webServer.storage.cleanMonitoring": "پاکسازی پایش",
- "settings.server.webServer.storage.cleanAll": "پاکسازی همه",
-
- "settings.profile.title": "حساب کاربری",
- "settings.profile.description": "جزئیات پروفایل خود را در اینجا تغییر دهید.",
- "settings.profile.email": "ایمیل",
- "settings.profile.password": "رمز عبور",
- "settings.profile.avatar": "تصویر پروفایل",
-
- "settings.appearance.title": "ظاهر",
- "settings.appearance.description": "تم داشبورد خود را سفارشی کنید.",
- "settings.appearance.theme": "تم",
- "settings.appearance.themeDescription": "یک تم برای داشبورد خود انتخاب کنید",
- "settings.appearance.themes.light": "روشن",
- "settings.appearance.themes.dark": "تاریک",
- "settings.appearance.themes.system": "سیستم",
- "settings.appearance.language": "زبان",
- "settings.appearance.languageDescription": "یک زبان برای داشبورد خود انتخاب کنید"
-}
diff --git a/apps/dokploy/public/locales/fr/common.json b/apps/dokploy/public/locales/fr/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/fr/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/fr/settings.json b/apps/dokploy/public/locales/fr/settings.json
deleted file mode 100644
index 8901cf1fc..000000000
--- a/apps/dokploy/public/locales/fr/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "Sauvegarder",
- "settings.server.domain.title": "Nom de domaine du serveur",
- "settings.server.domain.description": "Ajouter un nom de domaine au serveur de votre application.",
- "settings.server.domain.form.domain": "Domaine",
- "settings.server.domain.form.letsEncryptEmail": "Adresse email Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Certificat",
- "settings.server.domain.form.certificate.placeholder": "Choisir un certificat",
- "settings.server.domain.form.certificateOptions.none": "Aucun",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Par défaut)",
-
- "settings.server.webServer.title": "Serveur web",
- "settings.server.webServer.description": "Recharger ou nettoyer le serveur web.",
- "settings.server.webServer.actions": "Actions",
- "settings.server.webServer.reload": "Recharger",
- "settings.server.webServer.watchLogs": "Consulter les logs",
- "settings.server.webServer.updateServerIp": "Mettre à jour l'IP du serveur",
- "settings.server.webServer.server.label": "Serveur",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Modifier les variables d'environnement",
- "settings.server.webServer.storage.label": "Stockage",
- "settings.server.webServer.storage.cleanUnusedImages": "Supprimer les images inutilisées",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Supprimer les volumes inutilisés",
- "settings.server.webServer.storage.cleanStoppedContainers": "Supprimer les conteneurs arrêtés",
- "settings.server.webServer.storage.cleanDockerBuilder": "Nettoyer le Docker Builder & System",
- "settings.server.webServer.storage.cleanMonitoring": "Nettoyer le monitoring",
- "settings.server.webServer.storage.cleanAll": "Tout nettoyer",
-
- "settings.profile.title": "Compte",
- "settings.profile.description": "Modifier les informations de votre compte ici.",
- "settings.profile.email": "Adresse Email",
- "settings.profile.password": "Mot de passe",
- "settings.profile.avatar": "Photo de profil",
-
- "settings.appearance.title": "Apparence",
- "settings.appearance.description": "Customiser le thème de votre dashboard.",
- "settings.appearance.theme": "Thème",
- "settings.appearance.themeDescription": "Choisir un thème pour votre dashboard",
- "settings.appearance.themes.light": "Clair",
- "settings.appearance.themes.dark": "Sombre",
- "settings.appearance.themes.system": "Système",
- "settings.appearance.language": "Langue",
- "settings.appearance.languageDescription": "Sélectionner une langue pour votre dashboard"
-}
diff --git a/apps/dokploy/public/locales/id/common.json b/apps/dokploy/public/locales/id/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/id/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/id/settings.json b/apps/dokploy/public/locales/id/settings.json
deleted file mode 100644
index 489ddc015..000000000
--- a/apps/dokploy/public/locales/id/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Simpan",
- "settings.common.enterTerminal": "Buka Terminal",
- "settings.server.domain.title": "Domain Server",
- "settings.server.domain.description": "Tambahkan domain ke aplikasi server anda.",
- "settings.server.domain.form.domain": "Domain",
- "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Penyedia Sertifikat",
- "settings.server.domain.form.certificate.placeholder": "Pilih sertifikat",
- "settings.server.domain.form.certificateOptions.none": "Tidak ada",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Server Web",
- "settings.server.webServer.description": "Muat ulang atau bersihkan server web.",
- "settings.server.webServer.actions": "Opsi",
- "settings.server.webServer.reload": "Muat ulang",
- "settings.server.webServer.watchLogs": "Lihat log",
- "settings.server.webServer.updateServerIp": "Perbarui IP Server",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Ubah Environment",
- "settings.server.webServer.traefik.managePorts": "Pengaturan Port Tambahan",
- "settings.server.webServer.traefik.managePortsDescription": "Tambahkan atau hapus port tambahan untuk Traefik",
- "settings.server.webServer.traefik.targetPort": "Port Tujuan",
- "settings.server.webServer.traefik.publishedPort": "Port saai ini",
- "settings.server.webServer.traefik.addPort": "Tambah Port",
- "settings.server.webServer.traefik.portsUpdated": "Port berhasil diperbarui",
- "settings.server.webServer.traefik.portsUpdateError": "Gagal memperbarui Port",
- "settings.server.webServer.traefik.publishMode": "Pilihan mode Port",
- "settings.server.webServer.storage.label": "Penyimpanan",
- "settings.server.webServer.storage.cleanUnusedImages": "Hapus Image tidak terpakai",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Hapus Volume tidak terpakai",
- "settings.server.webServer.storage.cleanStoppedContainers": "Hapus Container tidak aktif",
- "settings.server.webServer.storage.cleanDockerBuilder": "Bersihkan Docker Builder & System",
- "settings.server.webServer.storage.cleanMonitoring": "Bersihkan Monitoring",
- "settings.server.webServer.storage.cleanAll": "Bersihkan",
-
- "settings.profile.title": "Akun",
- "settings.profile.description": "Ubah detail profil Anda di sini.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Kata Sandi",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Tampilan",
- "settings.appearance.description": "Sesuaikan tema dasbor Anda.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Pilih tema untuk dasbor Anda",
- "settings.appearance.themes.light": "Terang",
- "settings.appearance.themes.dark": "Gelap",
- "settings.appearance.themes.system": "Sistem",
- "settings.appearance.language": "Bahasa",
- "settings.appearance.languageDescription": "Pilih bahasa untuk dasbor Anda",
-
- "settings.terminal.connectionSettings": "Pengaturan koneksi",
- "settings.terminal.ipAddress": "Alamat IP",
- "settings.terminal.port": "Port",
- "settings.terminal.username": "Username"
-}
diff --git a/apps/dokploy/public/locales/it/common.json b/apps/dokploy/public/locales/it/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/it/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/it/settings.json b/apps/dokploy/public/locales/it/settings.json
deleted file mode 100644
index 6280e44eb..000000000
--- a/apps/dokploy/public/locales/it/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "Salva",
- "settings.server.domain.title": "Dominio del server",
- "settings.server.domain.description": "Aggiungi un dominio alla tua applicazione server.",
- "settings.server.domain.form.domain": "Dominio",
- "settings.server.domain.form.letsEncryptEmail": "Email di Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Certificato",
- "settings.server.domain.form.certificate.placeholder": "Seleziona un certificato",
- "settings.server.domain.form.certificateOptions.none": "Nessuno",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Predefinito)",
-
- "settings.server.webServer.title": "Server Web",
- "settings.server.webServer.description": "Ricarica o pulisci il server web.",
- "settings.server.webServer.actions": "Azioni",
- "settings.server.webServer.reload": "Ricarica",
- "settings.server.webServer.watchLogs": "Guarda i log",
- "settings.server.webServer.updateServerIp": "Aggiorna IP del server",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Modifica Env",
- "settings.server.webServer.storage.label": "Spazio",
- "settings.server.webServer.storage.cleanUnusedImages": "Pulisci immagini inutilizzate",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Pulisci volumi inutilizzati",
- "settings.server.webServer.storage.cleanStoppedContainers": "Pulisci container fermati",
- "settings.server.webServer.storage.cleanDockerBuilder": "Pulisci Docker Builder e sistema",
- "settings.server.webServer.storage.cleanMonitoring": "Pulisci monitoraggio",
- "settings.server.webServer.storage.cleanAll": "Pulisci tutto",
-
- "settings.profile.title": "Account",
- "settings.profile.description": "Modifica i dettagli del tuo profilo qui.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Password",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Aspetto",
- "settings.appearance.description": "Personalizza il tema della tua dashboard.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Seleziona un tema per la tua dashboard",
- "settings.appearance.themes.light": "Chiaro",
- "settings.appearance.themes.dark": "Scuro",
- "settings.appearance.themes.system": "Sistema",
- "settings.appearance.language": "Lingua",
- "settings.appearance.languageDescription": "Seleziona una lingua per la tua dashboard"
-}
diff --git a/apps/dokploy/public/locales/ja/common.json b/apps/dokploy/public/locales/ja/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/ja/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/ja/settings.json b/apps/dokploy/public/locales/ja/settings.json
deleted file mode 100644
index 757586b73..000000000
--- a/apps/dokploy/public/locales/ja/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "保存",
- "settings.server.domain.title": "サーバードメイン",
- "settings.server.domain.description": "サーバーアプリケーションにドメインを追加",
- "settings.server.domain.form.domain": "ドメイン",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt メールアドレス",
- "settings.server.domain.form.certificate.label": "証明書",
- "settings.server.domain.form.certificate.placeholder": "証明書を選択",
- "settings.server.domain.form.certificateOptions.none": "なし",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (デフォルト)",
-
- "settings.server.webServer.title": "ウェブサーバー",
- "settings.server.webServer.description": "ウェブサーバーをリロードまたはクリーンアップします",
- "settings.server.webServer.actions": "アクション",
- "settings.server.webServer.reload": "リロード",
- "settings.server.webServer.watchLogs": "ログを監視",
- "settings.server.webServer.updateServerIp": "サーバーIPを更新",
- "settings.server.webServer.server.label": "サーバー",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "環境設定を変更",
- "settings.server.webServer.storage.label": "ストレージ",
- "settings.server.webServer.storage.cleanUnusedImages": "未使用のイメージを削除",
- "settings.server.webServer.storage.cleanUnusedVolumes": "未使用のボリュームを削除",
- "settings.server.webServer.storage.cleanStoppedContainers": "停止中のコンテナを削除",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker ビルダー&システムをクリーンアップ",
- "settings.server.webServer.storage.cleanMonitoring": "モニタリングをクリーンアップ",
- "settings.server.webServer.storage.cleanAll": "すべてをクリーンアップ",
-
- "settings.profile.title": "アカウント",
- "settings.profile.description": "ここでプロフィールの詳細を変更できます",
- "settings.profile.email": "メールアドレス",
- "settings.profile.password": "パスワード",
- "settings.profile.avatar": "アバター",
-
- "settings.appearance.title": "外観",
- "settings.appearance.description": "ダッシュボードのテーマをカスタマイズ",
- "settings.appearance.theme": "テーマ",
- "settings.appearance.themeDescription": "ダッシュボードのテーマを選択してください",
- "settings.appearance.themes.light": "ライト",
- "settings.appearance.themes.dark": "ダーク",
- "settings.appearance.themes.system": "システム",
- "settings.appearance.language": "言語",
- "settings.appearance.languageDescription": "ダッシュボードの言語を選択してください"
-}
diff --git a/apps/dokploy/public/locales/ko/common.json b/apps/dokploy/public/locales/ko/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/ko/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/ko/settings.json b/apps/dokploy/public/locales/ko/settings.json
deleted file mode 100644
index db877ee6a..000000000
--- a/apps/dokploy/public/locales/ko/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "저장",
- "settings.server.domain.title": "서버 도메인",
- "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.",
- "settings.server.domain.form.domain": "도메인",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일",
- "settings.server.domain.form.certificate.label": "인증서",
- "settings.server.domain.form.certificate.placeholder": "인증서 선택",
- "settings.server.domain.form.certificateOptions.none": "없음",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)",
-
- "settings.server.webServer.title": "웹 서버",
- "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.",
- "settings.server.webServer.actions": "작업",
- "settings.server.webServer.reload": "재시작",
- "settings.server.webServer.watchLogs": "로그 보기",
- "settings.server.webServer.updateServerIp": "서버 IP 갱신",
- "settings.server.webServer.server.label": "서버",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정",
- "settings.server.webServer.storage.label": "저장 공간",
- "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리",
- "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리",
- "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리",
- "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리",
- "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리",
- "settings.server.webServer.storage.cleanAll": "전체 정리",
-
- "settings.profile.title": "계정",
- "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.",
- "settings.profile.email": "이메일",
- "settings.profile.password": "비밀번호",
- "settings.profile.avatar": "아바타",
-
- "settings.appearance.title": "외관",
- "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.",
- "settings.appearance.theme": "테마",
- "settings.appearance.themeDescription": "대시보드 테마 선택",
- "settings.appearance.themes.light": "라이트",
- "settings.appearance.themes.dark": "다크",
- "settings.appearance.themes.system": "시스템",
- "settings.appearance.language": "언어",
- "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택"
-}
diff --git a/apps/dokploy/public/locales/kz/common.json b/apps/dokploy/public/locales/kz/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/kz/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/kz/settings.json b/apps/dokploy/public/locales/kz/settings.json
deleted file mode 100644
index bf8f41372..000000000
--- a/apps/dokploy/public/locales/kz/settings.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "settings.common.save": "Сақтау",
- "settings.server.domain.title": "Сервер домені",
- "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.",
- "settings.server.domain.form.domain": "Домен",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы",
- "settings.server.domain.form.certificate.label": "Сертификат",
- "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз",
- "settings.server.domain.form.certificateOptions.none": "Жоқ",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)",
- "settings.server.webServer.title": "Веб-Сервер",
- "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.",
- "settings.server.webServer.actions": "Әрекеттер",
- "settings.server.webServer.reload": "Қайта жүктеу",
- "settings.server.webServer.watchLogs": "Журналдарды қарау",
- "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту",
- "settings.server.webServer.server.label": "Сервер",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту",
- "settings.server.webServer.storage.label": "Диск кеңістігі",
- "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау",
- "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау",
- "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау",
- "settings.server.webServer.storage.cleanAll": "Барлығын тазалау",
- "settings.profile.title": "Аккаунт",
- "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.",
- "settings.profile.email": "Эл. пошта",
- "settings.profile.password": "Құпия сөз",
- "settings.profile.avatar": "Аватар",
- "settings.appearance.title": "Сыртқы түрі",
- "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.",
- "settings.appearance.theme": "Келбеті",
- "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз",
- "settings.appearance.themes.light": "Жарық",
- "settings.appearance.themes.dark": "Қараңғы",
- "settings.appearance.themes.system": "Жүйелік",
- "settings.appearance.language": "Тіл",
- "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз"
-}
diff --git a/apps/dokploy/public/locales/ml/common.json b/apps/dokploy/public/locales/ml/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/ml/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/ml/settings.json b/apps/dokploy/public/locales/ml/settings.json
deleted file mode 100644
index cb62b6ec3..000000000
--- a/apps/dokploy/public/locales/ml/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "സേവ് ചെയ്യുക",
- "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക",
- "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ",
- "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.",
- "settings.server.domain.form.domain": "ഡോമെയ്ൻ",
- "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ",
- "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ",
- "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക",
- "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല",
- "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്",
-
- "settings.server.webServer.title": "വെബ് സർവർ",
- "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.",
- "settings.server.webServer.actions": "നടപടികൾ",
- "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക",
- "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക",
- "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക",
- "settings.server.webServer.server.label": "സർവർ",
- "settings.server.webServer.traefik.label": "ട്രാഫിക്",
- "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക",
- "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്",
- "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക",
- "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്",
- "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്",
- "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക",
- "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു",
- "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു",
- "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്",
- "settings.server.webServer.storage.label": "ഇടം",
- "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക",
- "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക",
- "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്നറുകൾ ശുചീകരിക്കുക",
- "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക",
- "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക",
- "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക",
-
- "settings.profile.title": "അക്കൗണ്ട്",
- "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.",
- "settings.profile.email": "ഇമെയിൽ",
- "settings.profile.password": "പാസ്വേഡ്",
- "settings.profile.avatar": "അവതാർ",
-
- "settings.appearance.title": "ദൃശ്യമാനം",
- "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.",
- "settings.appearance.theme": "തീം",
- "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക",
- "settings.appearance.themes.light": "ലൈറ്റ്",
- "settings.appearance.themes.dark": "ഡാർക്ക്",
- "settings.appearance.themes.system": "സിസ്റ്റം",
- "settings.appearance.language": "ഭാഷ",
- "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക",
-
- "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ",
- "settings.terminal.ipAddress": "IP വിലാസം",
- "settings.terminal.port": "പോർട്ട്",
- "settings.terminal.username": "ഉപയോക്തൃനാമം"
-}
diff --git a/apps/dokploy/public/locales/nl/common.json b/apps/dokploy/public/locales/nl/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/nl/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/nl/settings.json b/apps/dokploy/public/locales/nl/settings.json
deleted file mode 100644
index c76d9bb9b..000000000
--- a/apps/dokploy/public/locales/nl/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Opslaan",
- "settings.common.enterTerminal": "Terminal",
- "settings.server.domain.title": "Server Domein",
- "settings.server.domain.description": "Voeg een domein toe aan jouw server applicatie.",
- "settings.server.domain.form.domain": "Domein",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email",
- "settings.server.domain.form.certificate.label": "Certificaat Aanbieder",
- "settings.server.domain.form.certificate.placeholder": "Select een certificaat",
- "settings.server.domain.form.certificateOptions.none": "Geen",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Web Server",
- "settings.server.webServer.description": "Herlaad of maak de web server schoon.",
- "settings.server.webServer.actions": "Acties",
- "settings.server.webServer.reload": "Herladen",
- "settings.server.webServer.watchLogs": "Bekijk Logs",
- "settings.server.webServer.updateServerIp": "Update de Server IP",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Bewerk Omgeving",
- "settings.server.webServer.traefik.managePorts": "Extra Poort Mappings",
- "settings.server.webServer.traefik.managePortsDescription": "Bewerk extra Poorten voor Traefik",
- "settings.server.webServer.traefik.targetPort": "Doel Poort",
- "settings.server.webServer.traefik.publishedPort": "Gepubliceerde Poort",
- "settings.server.webServer.traefik.addPort": "Voeg Poort toe",
- "settings.server.webServer.traefik.portsUpdated": "Poorten succesvol aangepast",
- "settings.server.webServer.traefik.portsUpdateError": "Poorten niet succesvol aangepast",
- "settings.server.webServer.traefik.publishMode": "Publiceer Mode",
- "settings.server.webServer.storage.label": "Opslag",
- "settings.server.webServer.storage.cleanUnusedImages": "Maak ongebruikte images schoon",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Maak ongebruikte volumes schoon",
- "settings.server.webServer.storage.cleanStoppedContainers": "Maak gestopte containers schoon",
- "settings.server.webServer.storage.cleanDockerBuilder": "Maak Docker Builder & Systeem schoon",
- "settings.server.webServer.storage.cleanMonitoring": "Maak monitoor schoon",
- "settings.server.webServer.storage.cleanAll": "Maak alles schoon",
-
- "settings.profile.title": "Account",
- "settings.profile.description": "Veramder details van account.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Wachtwoord",
- "settings.profile.avatar": "Profiel Icoon",
-
- "settings.appearance.title": "Uiterlijk",
- "settings.appearance.description": "Verander het thema van je dashboard.",
- "settings.appearance.theme": "Thema",
- "settings.appearance.themeDescription": "Selecteer een thema voor je dashboard.",
- "settings.appearance.themes.light": "Licht",
- "settings.appearance.themes.dark": "Donker",
- "settings.appearance.themes.system": "Systeem",
- "settings.appearance.language": "Taal",
- "settings.appearance.languageDescription": "Selecteer een taal voor je dashboard.",
-
- "settings.terminal.connectionSettings": "Verbindings instellingen",
- "settings.terminal.ipAddress": "IP Address",
- "settings.terminal.port": "Poort",
- "settings.terminal.username": "Gebruikersnaam"
-}
diff --git a/apps/dokploy/public/locales/no/common.json b/apps/dokploy/public/locales/no/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/no/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/no/settings.json b/apps/dokploy/public/locales/no/settings.json
deleted file mode 100644
index 03c6bc4a1..000000000
--- a/apps/dokploy/public/locales/no/settings.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "settings.common.save": "Lagre",
- "settings.server.domain.title": "Serverdomene",
- "settings.server.domain.description": "Legg til et domene i serverapplikasjonen din.",
- "settings.server.domain.form.domain": "Domene",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Epost",
- "settings.server.domain.form.certificate.label": "Sertifikatleverandør",
- "settings.server.domain.form.certificate.placeholder": "Velg et sertifikat",
- "settings.server.domain.form.certificateOptions.none": "Ingen",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Webserver",
- "settings.server.webServer.description": "Last på nytt eller rens webserveren.",
- "settings.server.webServer.actions": "Handlinger",
- "settings.server.webServer.reload": "Last på nytt",
- "settings.server.webServer.watchLogs": "Se logger",
- "settings.server.webServer.updateServerIp": "Oppdater server-IP",
- "settings.server.webServer.server.label": "Server",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Endre miljø",
- "settings.server.webServer.traefik.managePorts": "Ytterligere portkartlegginger",
- "settings.server.webServer.traefik.managePortsDescription": "Legg til eller fjern flere porter for Traefik",
- "settings.server.webServer.traefik.targetPort": "Målport",
- "settings.server.webServer.traefik.publishedPort": "Publisert port",
- "settings.server.webServer.traefik.addPort": "Legg til port",
- "settings.server.webServer.traefik.portsUpdated": "Portene ble oppdatert",
- "settings.server.webServer.traefik.portsUpdateError": "Kunne ikke oppdatere portene",
- "settings.server.webServer.traefik.publishMode": "Publiseringsmodus",
- "settings.server.webServer.storage.label": "Lagring",
- "settings.server.webServer.storage.cleanUnusedImages": "Rens ubrukte bilder",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Rens ubrukte volumer",
- "settings.server.webServer.storage.cleanStoppedContainers": "Rens stoppete containere",
- "settings.server.webServer.storage.cleanDockerBuilder": "Rens Docker Builder og System",
- "settings.server.webServer.storage.cleanMonitoring": "Rens overvåking",
- "settings.server.webServer.storage.cleanAll": "Rens alt",
-
- "settings.profile.title": "Konto",
- "settings.profile.description": "Endre detaljene for profilen din her.",
- "settings.profile.email": "Epost",
- "settings.profile.password": "Passord",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Utseende",
- "settings.appearance.description": "Tilpass temaet for dashbordet ditt.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Velg et tema for dashbordet ditt",
- "settings.appearance.themes.light": "Lys",
- "settings.appearance.themes.dark": "Mørk",
- "settings.appearance.themes.system": "System",
- "settings.appearance.language": "Språk",
- "settings.appearance.languageDescription": "Velg et språk for dashbordet ditt"
-}
diff --git a/apps/dokploy/public/locales/pl/common.json b/apps/dokploy/public/locales/pl/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/pl/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/pl/settings.json b/apps/dokploy/public/locales/pl/settings.json
deleted file mode 100644
index 9899fc13e..000000000
--- a/apps/dokploy/public/locales/pl/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Zapisz",
- "settings.common.enterTerminal": "Otwórz terminal",
- "settings.server.domain.title": "Domena",
- "settings.server.domain.description": "Dodaj domenę do aplikacji",
- "settings.server.domain.form.domain": "Domena",
- "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Certyfikat",
- "settings.server.domain.form.certificate.placeholder": "Wybierz certyfikat",
- "settings.server.domain.form.certificateOptions.none": "Brak",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Domyślny)",
-
- "settings.server.webServer.title": "Serwer",
- "settings.server.webServer.description": "Przeładuj lub wyczyść serwer",
- "settings.server.webServer.actions": "Akcje",
- "settings.server.webServer.reload": "Przeładuj",
- "settings.server.webServer.watchLogs": "Obserwuj logi",
- "settings.server.webServer.updateServerIp": "Zaktualizuj IP serwera",
- "settings.server.webServer.server.label": "Serwer",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Zmodyfikuj środowisko",
- "settings.server.webServer.traefik.managePorts": "Dodatkowe mapowania portów",
- "settings.server.webServer.traefik.managePortsDescription": "Dodaj lub usuń dodatkowe porty dla Traefik",
- "settings.server.webServer.traefik.targetPort": "Port docelowy",
- "settings.server.webServer.traefik.publishedPort": "Port opublikowany",
- "settings.server.webServer.traefik.addPort": "Dodaj port",
- "settings.server.webServer.traefik.portsUpdated": "Porty zaktualizowane pomyślnie",
- "settings.server.webServer.traefik.portsUpdateError": "Nie udało się zaktualizować portów",
- "settings.server.webServer.traefik.publishMode": "Tryb publikacji",
- "settings.server.webServer.storage.label": "Przestrzeń",
- "settings.server.webServer.storage.cleanUnusedImages": "Wyczyść nieużywane obrazy",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Wyczyść nieużywane wolumeny",
- "settings.server.webServer.storage.cleanStoppedContainers": "Wyczyść zatrzymane kontenery",
- "settings.server.webServer.storage.cleanDockerBuilder": "Wyczyść Docker Builder i System",
- "settings.server.webServer.storage.cleanMonitoring": "Wyczyść monitorowanie",
- "settings.server.webServer.storage.cleanAll": "Wyczyść wszystko",
-
- "settings.profile.title": "Konto",
- "settings.profile.description": "Zmień szczegóły swojego profilu",
- "settings.profile.email": "Email",
- "settings.profile.password": "Hasło",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Wygląd",
- "settings.appearance.description": "Dostosuj motyw swojego pulpitu",
- "settings.appearance.theme": "Motyw",
- "settings.appearance.themeDescription": "Wybierz motyw swojego pulpitu",
- "settings.appearance.themes.light": "Jasny",
- "settings.appearance.themes.dark": "Ciemny",
- "settings.appearance.themes.system": "System",
- "settings.appearance.language": "Język",
- "settings.appearance.languageDescription": "Wybierz język swojego pulpitu",
-
- "settings.terminal.connectionSettings": "Ustawienia połączenia",
- "settings.terminal.ipAddress": "Adres IP",
- "settings.terminal.port": "Port",
- "settings.terminal.username": "Nazwa użytkownika"
-}
diff --git a/apps/dokploy/public/locales/pt-br/common.json b/apps/dokploy/public/locales/pt-br/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/pt-br/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/pt-br/settings.json b/apps/dokploy/public/locales/pt-br/settings.json
deleted file mode 100644
index f4d90a2f8..000000000
--- a/apps/dokploy/public/locales/pt-br/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "Salvar",
- "settings.server.domain.title": "Domínio do Servidor",
- "settings.server.domain.description": "Configure o domínio do servidor",
- "settings.server.domain.form.domain": "Domínio",
- "settings.server.domain.form.letsEncryptEmail": "Email do Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Certificado",
- "settings.server.domain.form.certificate.placeholder": "Selecione um Certificado",
- "settings.server.domain.form.certificateOptions.none": "Nenhum",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Padrão)",
-
- "settings.server.webServer.title": "Servidor web",
- "settings.server.webServer.description": "Limpar e recarregar servidor web.",
- "settings.server.webServer.actions": "Ações",
- "settings.server.webServer.reload": "Recarregar",
- "settings.server.webServer.watchLogs": "Ver logs",
- "settings.server.webServer.updateServerIp": "Atualizar IP do Servidor",
- "settings.server.webServer.server.label": "Servidor",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Alterar Env",
- "settings.server.webServer.storage.label": "Armazenamento",
- "settings.server.webServer.storage.cleanUnusedImages": "Limpar imagens não utilizadas",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Limpar volumes não utilizados",
- "settings.server.webServer.storage.cleanStoppedContainers": "Limpar containers parados",
- "settings.server.webServer.storage.cleanDockerBuilder": "Limpar Docker Builder & System",
- "settings.server.webServer.storage.cleanMonitoring": "Limpar Monitoramento",
- "settings.server.webServer.storage.cleanAll": "Limpar Tudo",
-
- "settings.profile.title": "Conta",
- "settings.profile.description": "Altere os detalhes do seu perfil aqui.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Senha",
- "settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Aparencia",
- "settings.appearance.description": "Personalize o tema do seu dashboard.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Selecione um tema para o dashboard",
- "settings.appearance.themes.light": "Claro",
- "settings.appearance.themes.dark": "Escuro",
- "settings.appearance.themes.system": "Automático",
- "settings.appearance.language": "Linguagem",
- "settings.appearance.languageDescription": "Selecione o idioma do dashboard"
-}
diff --git a/apps/dokploy/public/locales/ru/common.json b/apps/dokploy/public/locales/ru/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/ru/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/ru/settings.json b/apps/dokploy/public/locales/ru/settings.json
deleted file mode 100644
index 0d87ed159..000000000
--- a/apps/dokploy/public/locales/ru/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Сохранить",
- "settings.common.enterTerminal": "Открыть терминал",
- "settings.server.domain.title": "Домен сервера",
- "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.",
- "settings.server.domain.form.domain": "Домен",
- "settings.server.domain.form.letsEncryptEmail": "Email для Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Сертификат",
- "settings.server.domain.form.certificate.placeholder": "Выберите сертификат",
- "settings.server.domain.form.certificateOptions.none": "Нет",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Веб-сервер",
- "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.",
- "settings.server.webServer.actions": "Действия",
- "settings.server.webServer.reload": "Перезагрузить",
- "settings.server.webServer.watchLogs": "Просмотр логов",
- "settings.server.webServer.updateServerIp": "Изменить IP адрес",
- "settings.server.webServer.server.label": "Сервер",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения",
- "settings.server.webServer.traefik.managePorts": "Назначение портов",
- "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik",
- "settings.server.webServer.traefik.targetPort": "Внутренний порт",
- "settings.server.webServer.traefik.publishedPort": "Внешний порт",
- "settings.server.webServer.traefik.addPort": "Добавить порт",
- "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены",
- "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты",
- "settings.server.webServer.traefik.publishMode": "Режим сопоставления",
- "settings.server.webServer.storage.label": "Дисковое пространство",
- "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома",
- "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры",
- "settings.server.webServer.storage.cleanDockerBuilder": "Очистить Docker Builder и систему",
- "settings.server.webServer.storage.cleanMonitoring": "Очистить мониторинг",
- "settings.server.webServer.storage.cleanAll": "Очистить все",
-
- "settings.profile.title": "Аккаунт",
- "settings.profile.description": "Измените данные вашего профиля.",
- "settings.profile.email": "Email",
- "settings.profile.password": "Пароль",
- "settings.profile.avatar": "Аватар",
-
- "settings.appearance.title": "Внешний вид",
- "settings.appearance.description": "Настройте тему Dokploy.",
- "settings.appearance.theme": "Тема",
- "settings.appearance.themeDescription": "Выберите тему системной панели",
- "settings.appearance.themes.light": "Светлая",
- "settings.appearance.themes.dark": "Темная",
- "settings.appearance.themes.system": "Системная",
- "settings.appearance.language": "Язык",
- "settings.appearance.languageDescription": "Выберите язык для панели управления",
-
- "settings.terminal.connectionSettings": "Настройки подключения",
- "settings.terminal.ipAddress": "IP адрес",
- "settings.terminal.port": "Порт",
- "settings.terminal.username": "Имя пользователя"
-}
diff --git a/apps/dokploy/public/locales/tr/common.json b/apps/dokploy/public/locales/tr/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/tr/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/tr/settings.json b/apps/dokploy/public/locales/tr/settings.json
deleted file mode 100644
index 47a6629f5..000000000
--- a/apps/dokploy/public/locales/tr/settings.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "settings.common.save": "Kaydet",
- "settings.server.domain.title": "Sunucu Alanı",
- "settings.server.domain.description": "Sunucu uygulamanıza bir alan adı ekleyin.",
- "settings.server.domain.form.domain": "Alan Adı",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-postası",
- "settings.server.domain.form.certificate.label": "Sertifika",
- "settings.server.domain.form.certificate.placeholder": "Bir sertifika seçin",
- "settings.server.domain.form.certificateOptions.none": "Hiçbiri",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Varsayılan)",
-
- "settings.server.webServer.title": "Web Sunucusu",
- "settings.server.webServer.description": "Web sunucusunu yeniden yükleyin veya temizleyin.",
- "settings.server.webServer.actions": "İşlemler",
- "settings.server.webServer.reload": "Yeniden Yükle",
- "settings.server.webServer.watchLogs": "Günlükleri İzle",
- "settings.server.webServer.updateServerIp": "Sunucu IP'sini Güncelle",
- "settings.server.webServer.server.label": "Sunucu",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Env Değiştir",
- "settings.server.webServer.storage.label": "Alan",
- "settings.server.webServer.storage.cleanUnusedImages": "Kullanılmayan görüntüleri temizle",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Kullanılmayan birimleri temizle",
- "settings.server.webServer.storage.cleanStoppedContainers": "Durmuş konteynerleri temizle",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder ve Sistemi Temizle",
- "settings.server.webServer.storage.cleanMonitoring": "İzlemeyi Temizle",
- "settings.server.webServer.storage.cleanAll": "Hepsini temizle",
-
- "settings.profile.title": "Hesap",
- "settings.profile.description": "Profil detaylarınızı buradan değiştirebilirsiniz.",
- "settings.profile.email": "E-posta",
- "settings.profile.password": "Şifre",
- "settings.profile.avatar": "Profil Resmi",
-
- "settings.appearance.title": "Görünüm",
- "settings.appearance.description": "Kontrol panelinin temasını özelleştirin.",
- "settings.appearance.theme": "Tema",
- "settings.appearance.themeDescription": "Kontrol paneli için bir tema seçin",
- "settings.appearance.themes.light": "Açık",
- "settings.appearance.themes.dark": "Koyu",
- "settings.appearance.themes.system": "Sistem",
- "settings.appearance.language": "Dil",
- "settings.appearance.languageDescription": "Kontrol paneli için bir dil seçin"
-}
diff --git a/apps/dokploy/public/locales/uk/common.json b/apps/dokploy/public/locales/uk/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/uk/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/uk/settings.json b/apps/dokploy/public/locales/uk/settings.json
deleted file mode 100644
index 766a1bff9..000000000
--- a/apps/dokploy/public/locales/uk/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "Зберегти",
- "settings.common.enterTerminal": "Увійти в термінал",
- "settings.server.domain.title": "Домен сервера",
- "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.",
- "settings.server.domain.form.domain": "Домен",
- "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt",
- "settings.server.domain.form.certificate.label": "Постачальник сертифікатів",
- "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат",
- "settings.server.domain.form.certificateOptions.none": "Відсутній",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "Веб-сервер",
- "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.",
- "settings.server.webServer.actions": "Дії",
- "settings.server.webServer.reload": "Перезавантажити",
- "settings.server.webServer.watchLogs": "Перегляд логів",
- "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера",
- "settings.server.webServer.server.label": "Сервер",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Змінити середовище",
- "settings.server.webServer.traefik.managePorts": "Додаткові порти",
- "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik",
- "settings.server.webServer.traefik.targetPort": "Цільовий порт",
- "settings.server.webServer.traefik.publishedPort": "Опублікований порт",
- "settings.server.webServer.traefik.addPort": "Додати порт",
- "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено",
- "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти",
- "settings.server.webServer.traefik.publishMode": "Режим публікації",
- "settings.server.webServer.storage.label": "Дисковий простір",
- "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи",
- "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери",
- "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему",
- "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг",
- "settings.server.webServer.storage.cleanAll": "Очистити все",
-
- "settings.profile.title": "Обліковий запис",
- "settings.profile.description": "Змініть дані вашого профілю.",
- "settings.profile.email": "Електронна пошта",
- "settings.profile.password": "Пароль",
- "settings.profile.avatar": "Аватар",
-
- "settings.appearance.title": "Зовнішній вигляд",
- "settings.appearance.description": "Налаштуйте тему вашої панелі керування.",
- "settings.appearance.theme": "Тема",
- "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування",
- "settings.appearance.themes.light": "Світла",
- "settings.appearance.themes.dark": "Темна",
- "settings.appearance.themes.system": "Системна",
- "settings.appearance.language": "Мова",
- "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування",
-
- "settings.terminal.connectionSettings": "Налаштування з'єднання",
- "settings.terminal.ipAddress": "IP-адреса",
- "settings.terminal.port": "Порт",
- "settings.terminal.username": "Ім'я користувача"
-}
diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json
deleted file mode 100644
index 91af07ff2..000000000
--- a/apps/dokploy/public/locales/zh-Hans/common.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
- "dashboard.title": "仪表盘",
- "dashboard.overview": "概览",
- "dashboard.projects": "项目",
- "dashboard.servers": "服务器",
- "dashboard.docker": "Docker",
- "dashboard.monitoring": "监控",
- "dashboard.settings": "设置",
- "dashboard.logout": "退出登录",
- "dashboard.profile": "个人资料",
- "dashboard.terminal": "终端",
- "dashboard.containers": "容器",
- "dashboard.images": "镜像",
- "dashboard.volumes": "卷",
- "dashboard.networks": "网络",
- "button.create": "创建",
- "button.edit": "编辑",
- "button.delete": "删除",
- "button.cancel": "取消",
- "button.save": "保存",
- "button.confirm": "确认",
- "button.back": "返回",
- "button.next": "下一步",
- "button.finish": "完成",
- "status.running": "运行中",
- "status.stopped": "已停止",
- "status.error": "错误",
- "status.pending": "等待中",
- "status.success": "成功",
- "status.failed": "失败",
- "form.required": "必填",
- "form.invalid": "无效",
- "form.submit": "提交",
- "form.reset": "重置",
- "notification.success": "操作成功",
- "notification.error": "操作失败",
- "notification.warning": "警告",
- "notification.info": "信息",
- "time.now": "刚刚",
- "time.minutes": "分钟前",
- "time.hours": "小时前",
- "time.days": "天前",
- "filter.all": "全部",
- "filter.active": "活跃",
- "filter.inactive": "不活跃",
- "sort.asc": "升序",
- "sort.desc": "降序",
- "search.placeholder": "搜索...",
- "search.noResults": "无结果",
- "pagination.prev": "上一页",
- "pagination.next": "下一页",
- "pagination.of": "共 {0} 页",
- "error.notFound": "未找到",
- "error.serverError": "服务器错误",
- "error.unauthorized": "未授权",
- "error.forbidden": "禁止访问",
- "loading": "加载中...",
- "empty": "暂无数据",
- "more": "更多",
- "less": "收起",
- "project.create": "创建项目",
- "project.edit": "编辑项目",
- "project.delete": "删除项目",
- "project.name": "项目名称",
- "project.description": "项目描述",
- "service.create": "创建服务",
- "service.edit": "编辑服务",
- "service.delete": "删除服务",
- "service.name": "服务名称",
- "service.type": "服务类型",
- "domain.add": "添加域名",
- "domain.remove": "移除域名",
- "environment.variables": "环境变量",
- "environment.add": "添加环境变量",
- "environment.edit": "编辑环境变量",
- "environment.name": "变量名",
- "environment.value": "变量值"
-}
diff --git a/apps/dokploy/public/locales/zh-Hans/settings.json b/apps/dokploy/public/locales/zh-Hans/settings.json
deleted file mode 100644
index d70676d6a..000000000
--- a/apps/dokploy/public/locales/zh-Hans/settings.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "settings.common.save": "保存",
- "settings.common.enterTerminal": "终端",
- "settings.server.domain.title": "服务器域名",
- "settings.server.domain.description": "为您的服务器应用添加域名。",
- "settings.server.domain.form.domain": "域名",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 邮箱",
- "settings.server.domain.form.certificate.label": "证书提供商",
- "settings.server.domain.form.certificate.placeholder": "选择证书",
- "settings.server.domain.form.certificateOptions.none": "无",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
- "settings.server.webServer.title": "Web 服务器",
- "settings.server.webServer.description": "重载或清理 Web 服务器。",
- "settings.server.webServer.actions": "操作",
- "settings.server.webServer.reload": "重新加载",
- "settings.server.webServer.watchLogs": "查看日志",
- "settings.server.webServer.updateServerIp": "更新服务器 IP",
- "settings.server.webServer.server.label": "服务器",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "修改环境变量",
- "settings.server.webServer.traefik.managePorts": "额外端口映射",
- "settings.server.webServer.traefik.managePortsDescription": "为 Traefik 添加或删除额外端口",
- "settings.server.webServer.traefik.targetPort": "目标端口",
- "settings.server.webServer.traefik.publishedPort": "发布端口",
- "settings.server.webServer.traefik.addPort": "添加端口",
- "settings.server.webServer.traefik.portsUpdated": "端口更新成功",
- "settings.server.webServer.traefik.portsUpdateError": "端口更新失败",
- "settings.server.webServer.traefik.publishMode": "发布模式",
- "settings.server.webServer.storage.label": "存储空间",
- "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的镜像",
- "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷",
- "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器",
- "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系统",
- "settings.server.webServer.storage.cleanMonitoring": "清理监控数据",
- "settings.server.webServer.storage.cleanAll": "清理所有内容",
- "settings.profile.title": "账户",
- "settings.profile.description": "在此更改您的个人资料详情。",
- "settings.profile.email": "邮箱",
- "settings.profile.password": "密码",
- "settings.profile.avatar": "头像",
- "settings.appearance.title": "外观",
- "settings.appearance.description": "自定义您的仪表盘主题。",
- "settings.appearance.theme": "主题",
- "settings.appearance.themeDescription": "为您的仪表盘选择主题",
- "settings.appearance.themes.light": "明亮",
- "settings.appearance.themes.dark": "暗黑",
- "settings.appearance.themes.system": "跟随系统",
- "settings.appearance.language": "语言",
- "settings.appearance.languageDescription": "为您的仪表盘选择语言",
- "settings.terminal.connectionSettings": "连接设置",
- "settings.terminal.ipAddress": "IP 地址",
- "settings.terminal.port": "端口",
- "settings.terminal.username": "用户名",
- "settings.settings": "设置",
- "settings.general": "通用设置",
- "settings.security": "安全",
- "settings.users": "用户管理",
- "settings.roles": "角色管理",
- "settings.permissions": "权限",
- "settings.api": "API设置",
- "settings.certificates": "证书管理",
- "settings.ssh": "SSH密钥",
- "settings.backups": "备份",
- "settings.logs": "日志",
- "settings.updates": "更新",
- "settings.network": "网络"
-}
diff --git a/apps/dokploy/public/locales/zh-Hant/common.json b/apps/dokploy/public/locales/zh-Hant/common.json
deleted file mode 100644
index 0967ef424..000000000
--- a/apps/dokploy/public/locales/zh-Hant/common.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/apps/dokploy/public/locales/zh-Hant/settings.json b/apps/dokploy/public/locales/zh-Hant/settings.json
deleted file mode 100644
index 9d6900377..000000000
--- a/apps/dokploy/public/locales/zh-Hant/settings.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "settings.common.save": "儲存",
- "settings.common.enterTerminal": "進入終端機",
- "settings.server.domain.title": "網域設定",
- "settings.server.domain.description": "新增網域至伺服器",
- "settings.server.domain.form.domain": "網域",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 信箱",
- "settings.server.domain.form.certificate.label": "憑證",
- "settings.server.domain.form.certificate.placeholder": "選擇一個憑證",
- "settings.server.domain.form.certificateOptions.none": "無",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt",
-
- "settings.server.webServer.title": "伺服器設定",
- "settings.server.webServer.description": "管理伺服器",
- "settings.server.webServer.actions": "操作",
- "settings.server.webServer.reload": "重新載入",
- "settings.server.webServer.watchLogs": "查看日誌",
- "settings.server.webServer.updateServerIp": "更新伺服器 IP",
- "settings.server.webServer.server.label": "伺服器",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "修改環境變數",
- "settings.server.webServer.traefik.managePorts": "埠轉發",
- "settings.server.webServer.traefik.managePortsDescription": "新增或移除 Traefik 的其他埠",
- "settings.server.webServer.traefik.targetPort": "目標埠",
- "settings.server.webServer.traefik.publishedPort": "對外埠",
- "settings.server.webServer.traefik.addPort": "新增埠",
- "settings.server.webServer.traefik.portsUpdated": "埠更新成功",
- "settings.server.webServer.traefik.portsUpdateError": "埠更新失敗",
- "settings.server.webServer.traefik.publishMode": "埠對應模式",
- "settings.server.webServer.storage.label": "儲存空間",
- "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔",
- "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷",
- "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器",
- "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取",
- "settings.server.webServer.storage.cleanMonitoring": "清理監控數據",
- "settings.server.webServer.storage.cleanAll": "清理所有內容",
-
- "settings.profile.title": "帳戶",
- "settings.profile.description": "更改您的個人資料",
- "settings.profile.email": "信箱",
- "settings.profile.password": "密碼",
- "settings.profile.avatar": "頭像",
-
- "settings.appearance.title": "外觀",
- "settings.appearance.description": "自訂面板主題",
- "settings.appearance.theme": "主題",
- "settings.appearance.themeDescription": "選擇面板主題",
- "settings.appearance.themes.light": "明亮",
- "settings.appearance.themes.dark": "黑暗",
- "settings.appearance.themes.system": "系統",
- "settings.appearance.language": "語言",
- "settings.appearance.languageDescription": "選擇面板語言",
-
- "settings.terminal.connectionSettings": "終端機設定",
- "settings.terminal.ipAddress": "IP 位址",
- "settings.terminal.port": "埠",
- "settings.terminal.username": "使用者名稱"
-}
diff --git a/apps/dokploy/server/api/root.ts b/apps/dokploy/server/api/root.ts
index 9003726a9..c9467ccac 100644
--- a/apps/dokploy/server/api/root.ts
+++ b/apps/dokploy/server/api/root.ts
@@ -10,6 +10,7 @@ import { composeRouter } from "./routers/compose";
import { deploymentRouter } from "./routers/deployment";
import { destinationRouter } from "./routers/destination";
import { dockerRouter } from "./routers/docker";
+import { dockerVolumeRouter } from "./routers/docker-volume";
import { domainRouter } from "./routers/domain";
import { environmentRouter } from "./routers/environment";
import { gitProviderRouter } from "./routers/git-provider";
@@ -21,6 +22,7 @@ import { mariadbRouter } from "./routers/mariadb";
import { mongoRouter } from "./routers/mongo";
import { mountRouter } from "./routers/mount";
import { mysqlRouter } from "./routers/mysql";
+import { networkRouter } from "./routers/network";
import { notificationRouter } from "./routers/notification";
import { organizationRouter } from "./routers/organization";
import { patchRouter } from "./routers/patch";
@@ -48,6 +50,7 @@ import { stripeRouter } from "./routers/stripe";
import { swarmRouter } from "./routers/swarm";
import { tagRouter } from "./routers/tag";
import { userRouter } from "./routers/user";
+import { vaultProviderRouter } from "./routers/vault-provider";
import { volumeBackupsRouter } from "./routers/volume-backups";
/**
* This is the primary router for your server.
@@ -60,12 +63,14 @@ export const appRouter = createTRPCRouter({
application: applicationRouter,
backup: backupRouter,
bitbucket: bitbucketRouter,
+ network: networkRouter,
certificates: certificateRouter,
cluster: clusterRouter,
compose: composeRouter,
deployment: deploymentRouter,
destination: destinationRouter,
docker: dockerRouter,
+ dockerVolume: dockerVolumeRouter,
domain: domainRouter,
gitea: giteaRouter,
gitProvider: gitProviderRouter,
@@ -91,6 +96,7 @@ export const appRouter = createTRPCRouter({
stripe: stripeRouter,
swarm: swarmRouter,
user: userRouter,
+ vaultProvider: vaultProviderRouter,
ai: aiRouter,
organization: organizationRouter,
licenseKey: licenseKeyRouter,
diff --git a/apps/dokploy/server/api/routers/ai.ts b/apps/dokploy/server/api/routers/ai.ts
index 81e03fe26..169a32b07 100644
--- a/apps/dokploy/server/api/routers/ai.ts
+++ b/apps/dokploy/server/api/routers/ai.ts
@@ -1,6 +1,7 @@
import { IS_CLOUD } from "@dokploy/server/constants";
import {
apiCreateAi,
+ apiSaveAiCustomProviders,
apiUpdateAi,
deploySuggestionSchema,
} from "@dokploy/server/db/schema/ai";
@@ -13,7 +14,9 @@ import {
deleteAiSettings,
getAiSettingById,
getAiSettingsByOrganizationId,
+ getCustomAiProviders,
saveAiSettings,
+ saveCustomAiProviders,
suggestVariants,
} from "@dokploy/server/services/ai";
import { createComposeByTemplate } from "@dokploy/server/services/compose";
@@ -200,6 +203,19 @@ export const aiRouter = createTRPCRouter({
return await deleteAiSettings(input.aiId);
}),
+ getCustomProviders: protectedProcedure.query(async ({ ctx }) => {
+ return await getCustomAiProviders(ctx.session.activeOrganizationId);
+ }),
+
+ saveCustomProviders: adminProcedure
+ .input(apiSaveAiCustomProviders)
+ .mutation(async ({ ctx, input }) => {
+ return await saveCustomAiProviders(
+ ctx.session.activeOrganizationId,
+ input.providers,
+ );
+ }),
+
getEnabledProviders: protectedProcedure.query(async ({ ctx }) => {
const settings = await getAiSettingsByOrganizationId(
ctx.session.activeOrganizationId,
@@ -346,7 +362,6 @@ ${input.logs}`,
name: input.name,
sourceType: "raw",
appName: `${projectName}-${generatePassword(6)}`,
- isolatedDeployment: true,
environmentId: input.environmentId,
});
diff --git a/apps/dokploy/server/api/routers/application.ts b/apps/dokploy/server/api/routers/application.ts
index e1bbedcb9..b6e2a3ee4 100644
--- a/apps/dokploy/server/api/routers/application.ts
+++ b/apps/dokploy/server/api/routers/application.ts
@@ -4,6 +4,7 @@ import {
deleteAllMiddlewares,
findApplicationById,
findEnvironmentById,
+ findPreviewDeploymentsByApplicationId,
findProjectById,
getAccessibleServerIds,
getApplicationStats,
@@ -16,6 +17,7 @@ import {
removeDeployments,
removeDirectoryCode,
removeMonitoringDirectory,
+ removePreviewDeployment,
removeService,
removeTraefikConfig,
startService,
@@ -234,6 +236,15 @@ export const applicationRouter = createTRPCRouter({
});
}
+ const previewDeploymentsList =
+ await findPreviewDeploymentsByApplicationId(input.applicationId);
+
+ for (const previewDeployment of previewDeploymentsList) {
+ try {
+ await removePreviewDeployment(previewDeployment.previewDeploymentId);
+ } catch (_) {}
+ }
+
const result = await db
.delete(applications)
.where(eq(applications.applicationId, input.applicationId))
diff --git a/apps/dokploy/server/api/routers/backup.ts b/apps/dokploy/server/api/routers/backup.ts
index c324f5cc1..9bc73ce77 100644
--- a/apps/dokploy/server/api/routers/backup.ts
+++ b/apps/dokploy/server/api/routers/backup.ts
@@ -49,6 +49,7 @@ import {
restoreWebServerBackup,
} from "@dokploy/server/utils/restore";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
import { z } from "zod";
import {
createTRPCRouter,
@@ -510,7 +511,7 @@ export const backupRouter = createTRPCRouter({
: input.search;
const searchPath = baseDir ? `${bucketPath}/${baseDir}` : bucketPath;
- const listCommand = `rclone lsjson ${rcloneFlags.join(" ")} "${searchPath}" --no-mimetype --no-modtime 2>/dev/null`;
+ const listCommand = `rclone lsjson ${rcloneFlags.join(" ")} ${quote([searchPath])} --no-mimetype --no-modtime 2>/dev/null`;
let stdout = "";
diff --git a/apps/dokploy/server/api/routers/bitbucket.ts b/apps/dokploy/server/api/routers/bitbucket.ts
index 7830b6b4c..be1437cbd 100644
--- a/apps/dokploy/server/api/routers/bitbucket.ts
+++ b/apps/dokploy/server/api/routers/bitbucket.ts
@@ -1,4 +1,5 @@
import {
+ assertGitProviderAccess,
createBitbucket,
findBitbucketById,
getAccessibleGitProviderIds,
@@ -51,8 +52,10 @@ export const bitbucketRouter = createTRPCRouter({
}),
one: protectedProcedure
.input(apiFindOneBitbucket)
- .query(async ({ input }) => {
- return await findBitbucketById(input.bitbucketId);
+ .query(async ({ input, ctx }) => {
+ const bitbucket = await findBitbucketById(input.bitbucketId);
+ await assertGitProviderAccess(ctx.session, bitbucket.gitProvider);
+ return bitbucket;
}),
bitbucketProviders: protectedProcedure.query(async ({ ctx }) => {
const accessibleIds = await getAccessibleGitProviderIds(ctx.session);
@@ -78,18 +81,26 @@ export const bitbucketRouter = createTRPCRouter({
getBitbucketRepositories: protectedProcedure
.input(apiFindOneBitbucket)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ const bitbucket = await findBitbucketById(input.bitbucketId);
+ await assertGitProviderAccess(ctx.session, bitbucket.gitProvider);
return await getBitbucketRepositories(input.bitbucketId);
}),
getBitbucketBranches: protectedProcedure
.input(apiFindBitbucketBranches)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.bitbucketId) {
+ const bitbucket = await findBitbucketById(input.bitbucketId);
+ await assertGitProviderAccess(ctx.session, bitbucket.gitProvider);
+ }
return await getBitbucketBranches(input);
}),
testConnection: protectedProcedure
.input(apiBitbucketTestConnection)
- .mutation(async ({ input }) => {
+ .mutation(async ({ input, ctx }) => {
try {
+ const bitbucket = await findBitbucketById(input.bitbucketId);
+ await assertGitProviderAccess(ctx.session, bitbucket.gitProvider);
const result = await testBitbucketConnection(input);
return `Found ${result} repositories`;
diff --git a/apps/dokploy/server/api/routers/cluster.ts b/apps/dokploy/server/api/routers/cluster.ts
index 441410182..ff0bc4de6 100644
--- a/apps/dokploy/server/api/routers/cluster.ts
+++ b/apps/dokploy/server/api/routers/cluster.ts
@@ -6,6 +6,7 @@ import {
getRemoteDocker,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
import { z } from "zod";
import { audit } from "@/server/api/utils/audit";
import { getLocalServerIp } from "@/server/wss/terminal";
@@ -51,8 +52,8 @@ export const clusterRouter = createTRPCRouter({
}
}
try {
- const drainCommand = `docker node update --availability drain ${input.nodeId}`;
- const removeCommand = `docker node rm ${input.nodeId} --force`;
+ const drainCommand = `docker node update --availability drain ${quote([input.nodeId])}`;
+ const removeCommand = `docker node rm ${quote([input.nodeId])} --force`;
if (input.serverId) {
await execAsyncRemote(input.serverId, drainCommand);
diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts
index 403dc25d9..50614c7ef 100644
--- a/apps/dokploy/server/api/routers/compose.ts
+++ b/apps/dokploy/server/api/routers/compose.ts
@@ -43,6 +43,7 @@ import {
import {
type CompleteTemplate,
fetchTemplateFiles,
+ fetchTemplateLogo,
fetchTemplatesList,
} from "@dokploy/server/templates/github";
import { processTemplate } from "@dokploy/server/templates/processors";
@@ -211,6 +212,7 @@ export const composeRouter = createTRPCRouter({
});
const updated = await updateCompose(input.composeId, {
env: input.env,
+ createEnvFile: input.createEnvFile,
});
if (!updated) {
@@ -601,7 +603,10 @@ export const composeRouter = createTRPCRouter({
}
}
- const template = await fetchTemplateFiles(input.id, input.baseUrl);
+ const [template, templateLogo] = await Promise.all([
+ fetchTemplateFiles(input.id, input.baseUrl),
+ fetchTemplateLogo(input.id, input.baseUrl),
+ ]);
let serverIp = "127.0.0.1";
@@ -639,7 +644,7 @@ export const composeRouter = createTRPCRouter({
name: input.id,
sourceType: "raw",
appName: appName,
- isolatedDeployment: template.config.config?.isolated !== false,
+ icon: templateLogo,
});
await addNewService(ctx, compose.composeId);
@@ -997,7 +1002,6 @@ export const composeRouter = createTRPCRouter({
composeFile: templateData.compose,
sourceType: "raw",
env: processedTemplate.envs?.join("\n"),
- isolatedDeployment: true,
});
if (processedTemplate.mounts && processedTemplate.mounts.length > 0) {
diff --git a/apps/dokploy/server/api/routers/destination.ts b/apps/dokploy/server/api/routers/destination.ts
index cf7395a3f..3d2ad6057 100644
--- a/apps/dokploy/server/api/routers/destination.ts
+++ b/apps/dokploy/server/api/routers/destination.ts
@@ -10,6 +10,7 @@ import {
import { db } from "@dokploy/server/db";
import { TRPCError } from "@trpc/server";
import { desc, eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import { createTRPCRouter, withPermission } from "@/server/api/trpc";
import { audit } from "@/server/api/utils/audit";
import {
@@ -58,10 +59,10 @@ export const destinationRouter = createTRPCRouter({
} = input;
try {
const rcloneFlags = [
- `--s3-access-key-id="${accessKey}"`,
- `--s3-secret-access-key="${secretAccessKey}"`,
- `--s3-region="${region}"`,
- `--s3-endpoint="${endpoint}"`,
+ `--s3-access-key-id=${quote([accessKey])}`,
+ `--s3-secret-access-key=${quote([secretAccessKey])}`,
+ `--s3-region=${quote([region])}`,
+ `--s3-endpoint=${quote([endpoint])}`,
"--s3-no-check-bucket",
"--s3-force-path-style",
"--retries 1",
@@ -70,13 +71,13 @@ export const destinationRouter = createTRPCRouter({
"--contimeout 5s",
];
if (provider) {
- rcloneFlags.unshift(`--s3-provider="${provider}"`);
+ rcloneFlags.unshift(`--s3-provider=${quote([provider])}`);
}
if (additionalFlags?.length) {
rcloneFlags.push(...additionalFlags);
}
const rcloneDestination = `:s3:${bucket}`;
- const rcloneCommand = `rclone ls ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
+ const rcloneCommand = `rclone ls ${rcloneFlags.join(" ")} ${quote([rcloneDestination])}`;
if (IS_CLOUD && !input.serverId) {
throw new TRPCError({
diff --git a/apps/dokploy/server/api/routers/docker-volume.ts b/apps/dokploy/server/api/routers/docker-volume.ts
new file mode 100644
index 000000000..643dff5d4
--- /dev/null
+++ b/apps/dokploy/server/api/routers/docker-volume.ts
@@ -0,0 +1,215 @@
+import {
+ deleteVolumeFile,
+ findServerById,
+ getVolumeConfig,
+ getVolumes,
+ getVolumesSize,
+ listVolumeFiles,
+ readVolumeFile,
+ removeVolume,
+ writeVolumeFile,
+} from "@dokploy/server";
+import { TRPCError } from "@trpc/server";
+import { z } from "zod";
+import { audit } from "@/server/api/utils/audit";
+import { createTRPCRouter, withPermission } from "../trpc";
+
+export const volumeNameRegex = /^[a-zA-Z0-9.\-_]+$/;
+
+const volumePathSchema = z
+ .string()
+ .min(1)
+ .max(4096)
+ .refine(
+ (path) => path.startsWith("/") && !path.includes("\0"),
+ "Path must be absolute.",
+ );
+
+export const dockerVolumeRouter = createTRPCRouter({
+ getVolumes: withPermission("docker", "read")
+ .input(
+ z.object({
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await getVolumes(input.serverId);
+ }),
+
+ getVolumesSize: withPermission("docker", "read")
+ .input(
+ z.object({
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await getVolumesSize(input.serverId);
+ }),
+
+ listVolumeFiles: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ path: volumePathSchema,
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await listVolumeFiles(
+ input.volumeName,
+ input.path,
+ input.serverId,
+ );
+ }),
+
+ readVolumeFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ path: volumePathSchema,
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await readVolumeFile(input.volumeName, input.path, input.serverId);
+ }),
+
+ writeVolumeFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ path: volumePathSchema,
+ content: z.string(),
+ serverId: z.string().optional(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ await writeVolumeFile(
+ input.volumeName,
+ input.path,
+ input.content,
+ input.serverId,
+ );
+ await audit(ctx, {
+ action: "update",
+ resourceType: "docker",
+ resourceId: input.volumeName,
+ resourceName: `${input.volumeName}:${input.path}`,
+ });
+ }),
+
+ deleteVolumeFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ path: volumePathSchema.refine(
+ (path) => path !== "/",
+ "Cannot delete the volume root.",
+ ),
+ serverId: z.string().optional(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ await deleteVolumeFile(input.volumeName, input.path, input.serverId);
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "docker",
+ resourceId: input.volumeName,
+ resourceName: `${input.volumeName}:${input.path}`,
+ });
+ }),
+
+ getVolumeConfig: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await getVolumeConfig(input.volumeName, input.serverId);
+ }),
+
+ removeVolume: withPermission("docker", "read")
+ .input(
+ z.object({
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(volumeNameRegex, "Invalid volume name."),
+ serverId: z.string().optional(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ await removeVolume(input.volumeName, input.serverId);
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "docker",
+ resourceId: input.volumeName,
+ resourceName: input.volumeName,
+ });
+ }),
+});
diff --git a/apps/dokploy/server/api/routers/docker.ts b/apps/dokploy/server/api/routers/docker.ts
index 838ab83a0..cc7fbc4c0 100644
--- a/apps/dokploy/server/api/routers/docker.ts
+++ b/apps/dokploy/server/api/routers/docker.ts
@@ -4,6 +4,7 @@ import {
containerRestart,
containerStart,
containerStop,
+ deleteContainerFile,
findServerById,
getConfig,
getContainers,
@@ -11,7 +12,10 @@ import {
getContainersByAppNameMatch,
getServiceContainersByAppName,
getStackContainersByAppName,
+ listContainerFiles,
+ readContainerFile,
uploadFileToContainer,
+ writeContainerFile,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { z } from "zod";
@@ -21,6 +25,15 @@ import { createTRPCRouter, withPermission } from "../trpc";
export const containerIdRegex = /^[a-zA-Z0-9.\-_]+$/;
+const containerPathSchema = z
+ .string()
+ .min(1)
+ .max(4096)
+ .refine(
+ (path) => path.startsWith("/") && !path.includes("\0"),
+ "Path must be absolute.",
+ );
+
export const dockerRouter = createTRPCRouter({
getContainers: withPermission("docker", "read")
.input(
@@ -298,4 +311,117 @@ export const dockerRouter = createTRPCRouter({
return { success: true, message: "File uploaded successfully" };
}),
+
+ listContainerFiles: withPermission("docker", "read")
+ .input(
+ z.object({
+ containerId: z
+ .string()
+ .min(1)
+ .regex(containerIdRegex, "Invalid container id."),
+ path: containerPathSchema,
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await listContainerFiles(
+ input.containerId,
+ input.path,
+ input.serverId,
+ );
+ }),
+
+ readContainerFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ containerId: z
+ .string()
+ .min(1)
+ .regex(containerIdRegex, "Invalid container id."),
+ path: containerPathSchema,
+ serverId: z.string().optional(),
+ }),
+ )
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ return await readContainerFile(
+ input.containerId,
+ input.path,
+ input.serverId,
+ );
+ }),
+
+ writeContainerFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ containerId: z
+ .string()
+ .min(1)
+ .regex(containerIdRegex, "Invalid container id."),
+ path: containerPathSchema,
+ content: z.string(),
+ serverId: z.string().optional(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ await writeContainerFile(
+ input.containerId,
+ input.path,
+ input.content,
+ input.serverId,
+ );
+ await audit(ctx, {
+ action: "update",
+ resourceType: "docker",
+ resourceId: input.containerId,
+ resourceName: `${input.containerId}:${input.path}`,
+ });
+ }),
+
+ deleteContainerFile: withPermission("docker", "read")
+ .input(
+ z.object({
+ containerId: z
+ .string()
+ .min(1)
+ .regex(containerIdRegex, "Invalid container id."),
+ path: containerPathSchema.refine(
+ (path) => path !== "/",
+ "Cannot delete the container root.",
+ ),
+ serverId: z.string().optional(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({ code: "UNAUTHORIZED" });
+ }
+ }
+ await deleteContainerFile(input.containerId, input.path, input.serverId);
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "docker",
+ resourceId: input.containerId,
+ resourceName: `${input.containerId}:${input.path}`,
+ });
+ }),
});
diff --git a/apps/dokploy/server/api/routers/environment.ts b/apps/dokploy/server/api/routers/environment.ts
index c11673ea7..fb7c8f0ab 100644
--- a/apps/dokploy/server/api/routers/environment.ts
+++ b/apps/dokploy/server/api/routers/environment.ts
@@ -153,6 +153,7 @@ export const environmentRouter = createTRPCRouter({
return environments;
} catch (error) {
+ console.log(error);
throw new TRPCError({
code: "BAD_REQUEST",
message: `Error fetching environments: ${error instanceof Error ? error.message : error}`,
diff --git a/apps/dokploy/server/api/routers/git-provider.ts b/apps/dokploy/server/api/routers/git-provider.ts
index 376b803c9..8f92ade3f 100644
--- a/apps/dokploy/server/api/routers/git-provider.ts
+++ b/apps/dokploy/server/api/routers/git-provider.ts
@@ -49,6 +49,7 @@ export const gitProviderRouter = createTRPCRouter({
githubAppName: r.github.githubAppName,
githubAppId: r.github.githubAppId,
githubInstallationId: r.github.githubInstallationId,
+ githubUrl: r.github.githubUrl,
isConfigured: !!(
r.github.githubPrivateKey &&
r.github.githubAppId &&
diff --git a/apps/dokploy/server/api/routers/gitea.ts b/apps/dokploy/server/api/routers/gitea.ts
index b16a351c1..0ec08964d 100644
--- a/apps/dokploy/server/api/routers/gitea.ts
+++ b/apps/dokploy/server/api/routers/gitea.ts
@@ -1,4 +1,5 @@
import {
+ assertGitProviderAccess,
createGitea,
findGiteaById,
getAccessibleGitProviderIds,
@@ -53,9 +54,13 @@ export const giteaRouter = createTRPCRouter({
}
}),
- one: protectedProcedure.input(apiFindOneGitea).query(async ({ input }) => {
- return await findGiteaById(input.giteaId);
- }),
+ one: protectedProcedure
+ .input(apiFindOneGitea)
+ .query(async ({ input, ctx }) => {
+ const gitea = await findGiteaById(input.giteaId);
+ await assertGitProviderAccess(ctx.session, gitea.gitProvider);
+ return gitea;
+ }),
giteaProviders: protectedProcedure.query(async ({ ctx }) => {
const accessibleIds = await getAccessibleGitProviderIds(ctx.session);
@@ -89,7 +94,7 @@ export const giteaRouter = createTRPCRouter({
getGiteaRepositories: protectedProcedure
.input(apiFindOneGitea)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
const { giteaId } = input;
if (!giteaId) {
@@ -99,6 +104,9 @@ export const giteaRouter = createTRPCRouter({
});
}
+ const gitea = await findGiteaById(giteaId);
+ await assertGitProviderAccess(ctx.session, gitea.gitProvider);
+
try {
const repositories = await getGiteaRepositories(giteaId);
return repositories;
@@ -113,7 +121,7 @@ export const giteaRouter = createTRPCRouter({
getGiteaBranches: protectedProcedure
.input(apiFindGiteaBranches)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
const { giteaId, owner, repositoryName } = input;
if (!giteaId || !owner || !repositoryName) {
@@ -124,6 +132,9 @@ export const giteaRouter = createTRPCRouter({
});
}
+ const gitea = await findGiteaById(giteaId);
+ await assertGitProviderAccess(ctx.session, gitea.gitProvider);
+
try {
return await getGiteaBranches({
giteaId,
@@ -141,9 +152,12 @@ export const giteaRouter = createTRPCRouter({
testConnection: protectedProcedure
.input(apiGiteaTestConnection)
- .mutation(async ({ input }) => {
+ .mutation(async ({ input, ctx }) => {
const giteaId = input.giteaId ?? "";
+ const gitea = await findGiteaById(giteaId);
+ await assertGitProviderAccess(ctx.session, gitea.gitProvider);
+
try {
const result = await testGiteaConnection({
giteaId,
diff --git a/apps/dokploy/server/api/routers/github.ts b/apps/dokploy/server/api/routers/github.ts
index f337a05fc..8650c5a23 100644
--- a/apps/dokploy/server/api/routers/github.ts
+++ b/apps/dokploy/server/api/routers/github.ts
@@ -1,4 +1,5 @@
import {
+ assertGitProviderAccess,
findGithubById,
getAccessibleGitProviderIds,
getGithubBranches,
@@ -22,17 +23,27 @@ import {
} from "@/server/db/schema";
export const githubRouter = createTRPCRouter({
- one: protectedProcedure.input(apiFindOneGithub).query(async ({ input }) => {
- return await findGithubById(input.githubId);
- }),
+ one: protectedProcedure
+ .input(apiFindOneGithub)
+ .query(async ({ input, ctx }) => {
+ const github = await findGithubById(input.githubId);
+ await assertGitProviderAccess(ctx.session, github.gitProvider);
+ return github;
+ }),
getGithubRepositories: protectedProcedure
.input(apiFindOneGithub)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ const github = await findGithubById(input.githubId);
+ await assertGitProviderAccess(ctx.session, github.gitProvider);
return await getGithubRepositories(input.githubId);
}),
getGithubBranches: protectedProcedure
.input(apiFindGithubBranches)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.githubId) {
+ const github = await findGithubById(input.githubId);
+ await assertGitProviderAccess(ctx.session, github.gitProvider);
+ }
return await getGithubBranches(input);
}),
githubProviders: protectedProcedure.query(async ({ ctx }) => {
@@ -56,6 +67,7 @@ export const githubRouter = createTRPCRouter({
.map((provider) => {
return {
githubId: provider.githubId,
+ githubUrl: provider.githubUrl,
gitProvider: {
...provider.gitProvider,
},
@@ -67,8 +79,10 @@ export const githubRouter = createTRPCRouter({
testConnection: protectedProcedure
.input(apiFindOneGithub)
- .mutation(async ({ input }) => {
+ .mutation(async ({ input, ctx }) => {
try {
+ const github = await findGithubById(input.githubId);
+ await assertGitProviderAccess(ctx.session, github.gitProvider);
const result = await getGithubRepositories(input.githubId);
return `Found ${result.length} repositories`;
} catch (err) {
diff --git a/apps/dokploy/server/api/routers/gitlab.ts b/apps/dokploy/server/api/routers/gitlab.ts
index ff42a8bbe..c93637bd1 100644
--- a/apps/dokploy/server/api/routers/gitlab.ts
+++ b/apps/dokploy/server/api/routers/gitlab.ts
@@ -1,4 +1,5 @@
import {
+ assertGitProviderAccess,
createGitlab,
findGitlabById,
getAccessibleGitProviderIds,
@@ -51,9 +52,13 @@ export const gitlabRouter = createTRPCRouter({
});
}
}),
- one: protectedProcedure.input(apiFindOneGitlab).query(async ({ input }) => {
- return await findGitlabById(input.gitlabId);
- }),
+ one: protectedProcedure
+ .input(apiFindOneGitlab)
+ .query(async ({ input, ctx }) => {
+ const gitlab = await findGitlabById(input.gitlabId);
+ await assertGitProviderAccess(ctx.session, gitlab.gitProvider);
+ return gitlab;
+ }),
gitlabProviders: protectedProcedure.query(async ({ ctx }) => {
const accessibleIds = await getAccessibleGitProviderIds(ctx.session);
@@ -86,19 +91,27 @@ export const gitlabRouter = createTRPCRouter({
}),
getGitlabRepositories: protectedProcedure
.input(apiFindOneGitlab)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ const gitlab = await findGitlabById(input.gitlabId);
+ await assertGitProviderAccess(ctx.session, gitlab.gitProvider);
return await getGitlabRepositories(input.gitlabId);
}),
getGitlabBranches: protectedProcedure
.input(apiFindGitlabBranches)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.gitlabId) {
+ const gitlab = await findGitlabById(input.gitlabId);
+ await assertGitProviderAccess(ctx.session, gitlab.gitProvider);
+ }
return await getGitlabBranches(input);
}),
testConnection: protectedProcedure
.input(apiGitlabTestConnection)
- .mutation(async ({ input }) => {
+ .mutation(async ({ input, ctx }) => {
try {
+ const gitlab = await findGitlabById(input.gitlabId);
+ await assertGitProviderAccess(ctx.session, gitlab.gitProvider);
const result = await testGitlabConnection(input);
return `Found ${result} repositories`;
diff --git a/apps/dokploy/server/api/routers/network.ts b/apps/dokploy/server/api/routers/network.ts
new file mode 100644
index 000000000..14301d1eb
--- /dev/null
+++ b/apps/dokploy/server/api/routers/network.ts
@@ -0,0 +1,151 @@
+import {
+ createNetwork,
+ findNetworkById,
+ findNetworksToSync,
+ importDockerNetworks,
+ inspectNetwork,
+ recreateNetwork,
+ removeNetwork,
+} from "@dokploy/server";
+import { TRPCError } from "@trpc/server";
+import { and, desc, eq, isNull } from "drizzle-orm";
+import { z } from "zod";
+import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
+import { db } from "@/server/db";
+import {
+ apiCreateNetwork,
+ apiFindOneNetwork,
+ apiRemoveNetwork,
+ network as networkTable,
+} from "@/server/db/schema";
+import { audit } from "../utils/audit";
+
+export const networkRouter = createTRPCRouter({
+ all: protectedProcedure
+ .input(z.object({ serverId: z.string().optional() }))
+ .query(async ({ ctx, input }) => {
+ const rows = await db.query.network.findMany({
+ where: and(
+ eq(networkTable.organizationId, ctx.session.activeOrganizationId),
+ input.serverId
+ ? eq(networkTable.serverId, input.serverId)
+ : isNull(networkTable.serverId),
+ ),
+ orderBy: desc(networkTable.createdAt),
+ });
+ return rows;
+ }),
+
+ one: protectedProcedure
+ .input(apiFindOneNetwork)
+ .query(async ({ ctx, input }) => {
+ const row = await findNetworkById(input.networkId);
+ if (row.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Network not found",
+ });
+ }
+ return row;
+ }),
+ create: protectedProcedure
+ .input(apiCreateNetwork)
+ .mutation(async ({ ctx, input }) => {
+ const created = await createNetwork(
+ input,
+ ctx.session.activeOrganizationId,
+ );
+ await audit(ctx, {
+ action: "create",
+ resourceType: "network",
+ resourceId: created.networkId,
+ resourceName: created.name,
+ });
+ return created;
+ }),
+ networksToSync: protectedProcedure
+ .input(z.object({ serverId: z.string().optional() }))
+ .query(async ({ ctx, input }) => {
+ return findNetworksToSync(
+ ctx.session.activeOrganizationId,
+ input.serverId ?? null,
+ );
+ }),
+
+ import: protectedProcedure
+ .input(
+ z.object({
+ serverId: z.string().optional(),
+ names: z.array(z.string().min(1)).min(1),
+ }),
+ )
+ .mutation(async ({ ctx, input }) => {
+ const result = await importDockerNetworks(
+ ctx.session.activeOrganizationId,
+ input.serverId ?? null,
+ input.names,
+ );
+ if (result.imported.length > 0) {
+ await audit(ctx, {
+ action: "create",
+ resourceType: "network",
+ resourceName: result.imported.join(", "),
+ metadata: { imported: result.imported },
+ });
+ }
+ return result;
+ }),
+
+ inspect: protectedProcedure
+ .input(apiFindOneNetwork)
+ .query(async ({ ctx, input }) => {
+ const network = await findNetworkById(input.networkId);
+ if (network.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Network not found",
+ });
+ }
+ return inspectNetwork(input.networkId);
+ }),
+
+ recreate: protectedProcedure
+ .input(apiFindOneNetwork)
+ .mutation(async ({ ctx, input }) => {
+ const network = await findNetworkById(input.networkId);
+ if (network.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Network not found",
+ });
+ }
+ const recreated = await recreateNetwork(input.networkId);
+ await audit(ctx, {
+ action: "reload",
+ resourceType: "network",
+ resourceId: recreated.networkId,
+ resourceName: recreated.name,
+ });
+ return recreated;
+ }),
+
+ remove: protectedProcedure
+ .input(apiRemoveNetwork)
+ .mutation(async ({ ctx, input }) => {
+ const network = await findNetworkById(input.networkId);
+ if (network.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "Not authorized to delete this network",
+ });
+ }
+ const removed = await removeNetwork(input.networkId);
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "network",
+ resourceId: removed.networkId,
+ resourceName: removed.name,
+ });
+ return removed;
+ }),
+});
diff --git a/apps/dokploy/server/api/routers/registry.ts b/apps/dokploy/server/api/routers/registry.ts
index 1b156c069..c93da5a22 100644
--- a/apps/dokploy/server/api/routers/registry.ts
+++ b/apps/dokploy/server/api/routers/registry.ts
@@ -5,6 +5,7 @@ import {
findRegistryById,
IS_CLOUD,
removeRegistry,
+ safeDockerLoginCommand,
updateRegistry,
} from "@dokploy/server";
import { db } from "@dokploy/server/db";
@@ -122,7 +123,11 @@ export const registryRouter = createTRPCRouter({
if (input.serverId && input.serverId !== "none") {
await execAsyncRemote(
input.serverId,
- `echo ${input.password} | docker ${args.join(" ")}`,
+ safeDockerLoginCommand(
+ input.registryUrl,
+ input.username,
+ input.password,
+ ),
);
} else {
await execFileAsync("docker", args, {
@@ -182,7 +187,11 @@ export const registryRouter = createTRPCRouter({
if (input.serverId && input.serverId !== "none") {
await execAsyncRemote(
input.serverId,
- `echo ${registryData.password} | docker ${args.join(" ")}`,
+ safeDockerLoginCommand(
+ registryData.registryUrl,
+ registryData.username,
+ registryData.password,
+ ),
);
} else {
await execFileAsync("docker", args, {
diff --git a/apps/dokploy/server/api/routers/schedule.ts b/apps/dokploy/server/api/routers/schedule.ts
index 2bec813a7..d69760124 100644
--- a/apps/dokploy/server/api/routers/schedule.ts
+++ b/apps/dokploy/server/api/routers/schedule.ts
@@ -13,6 +13,7 @@ import {
findMemberByUserId,
} from "@dokploy/server/services/permission";
import {
+ assertHostScheduleAccess,
createSchedule,
deleteSchedule,
findScheduleById,
@@ -31,6 +32,8 @@ export const scheduleRouter = createTRPCRouter({
create: protectedProcedure
.input(createScheduleSchema)
.mutation(async ({ input, ctx }) => {
+ await assertHostScheduleAccess(ctx, input.scheduleType, input.serverId);
+
const serviceId = input.applicationId || input.composeId;
if (serviceId) {
await checkServicePermissionAndAccess(ctx, serviceId, {
@@ -44,51 +47,14 @@ export const scheduleRouter = createTRPCRouter({
);
}
} else {
- if (input.scheduleType === "dokploy-server" && IS_CLOUD) {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Host-level schedules are not available in the cloud version.",
- });
- }
-
await checkPermission(ctx, { schedule: ["create"] });
- if (
- input.scheduleType === "server" ||
- input.scheduleType === "dokploy-server"
- ) {
- const member = await findMemberByUserId(
- ctx.user.id,
+ if (IS_CLOUD && input.scheduleType === "server" && input.serverId) {
+ await assertScheduledJobLimit(
ctx.session.activeOrganizationId,
+ "server",
+ input.serverId,
);
- if (member.role !== "owner" && member.role !== "admin") {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Only owners and admins can manage server-level schedules.",
- });
- }
- }
-
- if (input.scheduleType === "server" && input.serverId) {
- const targetServer = await findServerById(input.serverId);
- if (
- targetServer.organizationId !== ctx.session.activeOrganizationId
- ) {
- throw new TRPCError({
- code: "UNAUTHORIZED",
- message: "You don't have access to this server.",
- });
- }
-
- if (IS_CLOUD) {
- await assertScheduledJobLimit(
- ctx.session.activeOrganizationId,
- "server",
- input.serverId,
- );
- }
}
}
const newSchedule = await createSchedule({
@@ -135,6 +101,22 @@ export const scheduleRouter = createTRPCRouter({
});
}
+ await assertHostScheduleAccess(
+ ctx,
+ existingSchedule.scheduleType,
+ existingSchedule.serverId,
+ );
+ if (
+ input.scheduleType &&
+ input.scheduleType !== existingSchedule.scheduleType
+ ) {
+ await assertHostScheduleAccess(
+ ctx,
+ input.scheduleType,
+ input.serverId ?? existingSchedule.serverId,
+ );
+ }
+
const serviceId =
existingSchedule.applicationId || existingSchedule.composeId;
if (serviceId) {
@@ -142,47 +124,7 @@ export const scheduleRouter = createTRPCRouter({
schedule: ["update"],
});
} else {
- if (existingSchedule.scheduleType === "dokploy-server" && IS_CLOUD) {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Host-level schedules are not available in the cloud version.",
- });
- }
-
await checkPermission(ctx, { schedule: ["update"] });
-
- if (
- existingSchedule.scheduleType === "server" ||
- existingSchedule.scheduleType === "dokploy-server"
- ) {
- const member = await findMemberByUserId(
- ctx.user.id,
- ctx.session.activeOrganizationId,
- );
- if (member.role !== "owner" && member.role !== "admin") {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Only owners and admins can manage server-level schedules.",
- });
- }
- }
-
- if (
- existingSchedule.scheduleType === "server" &&
- existingSchedule.serverId
- ) {
- const targetServer = await findServerById(existingSchedule.serverId);
- if (
- targetServer.organizationId !== ctx.session.activeOrganizationId
- ) {
- throw new TRPCError({
- code: "UNAUTHORIZED",
- message: "You don't have access to this server.",
- });
- }
- }
}
const updatedSchedule = await updateSchedule(input);
@@ -222,50 +164,19 @@ export const scheduleRouter = createTRPCRouter({
.input(z.object({ scheduleId: z.string() }))
.mutation(async ({ input, ctx }) => {
const scheduleItem = await findScheduleById(input.scheduleId);
+ await assertHostScheduleAccess(
+ ctx,
+ scheduleItem.scheduleType,
+ scheduleItem.serverId,
+ );
+
const serviceId = scheduleItem.applicationId || scheduleItem.composeId;
if (serviceId) {
await checkServicePermissionAndAccess(ctx, serviceId, {
schedule: ["delete"],
});
} else {
- if (scheduleItem.scheduleType === "dokploy-server" && IS_CLOUD) {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Host-level schedules are not available in the cloud version.",
- });
- }
-
await checkPermission(ctx, { schedule: ["delete"] });
-
- if (
- scheduleItem.scheduleType === "server" ||
- scheduleItem.scheduleType === "dokploy-server"
- ) {
- const member = await findMemberByUserId(
- ctx.user.id,
- ctx.session.activeOrganizationId,
- );
- if (member.role !== "owner" && member.role !== "admin") {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Only owners and admins can manage server-level schedules.",
- });
- }
- }
-
- if (scheduleItem.scheduleType === "server" && scheduleItem.serverId) {
- const targetServer = await findServerById(scheduleItem.serverId);
- if (
- targetServer.organizationId !== ctx.session.activeOrganizationId
- ) {
- throw new TRPCError({
- code: "UNAUTHORIZED",
- message: "You don't have access to this server.",
- });
- }
- }
}
await deleteSchedule(input.scheduleId);
@@ -348,9 +259,23 @@ export const scheduleRouter = createTRPCRouter({
where: where[input.scheduleType],
orderBy: [asc(schedules.createdAt)],
with: {
- application: true,
+ application: {
+ columns: {
+ applicationId: true,
+ appName: true,
+ name: true,
+ serverId: true,
+ },
+ },
server: true,
- compose: true,
+ compose: {
+ columns: {
+ composeId: true,
+ appName: true,
+ name: true,
+ serverId: true,
+ },
+ },
deployments: {
orderBy: [desc(deployments.createdAt)],
},
@@ -389,59 +314,32 @@ export const scheduleRouter = createTRPCRouter({
.input(z.object({ scheduleId: z.string().min(1) }))
.mutation(async ({ input, ctx }) => {
const scheduleItem = await findScheduleById(input.scheduleId);
+ await assertHostScheduleAccess(
+ ctx,
+ scheduleItem.scheduleType,
+ scheduleItem.serverId,
+ );
+
const serviceId = scheduleItem.applicationId || scheduleItem.composeId;
if (serviceId) {
await checkServicePermissionAndAccess(ctx, serviceId, {
schedule: ["create"],
});
} else {
- if (scheduleItem.scheduleType === "dokploy-server" && IS_CLOUD) {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Host-level schedules are not available in the cloud version.",
- });
- }
-
await checkPermission(ctx, { schedule: ["create"] });
-
- if (
- scheduleItem.scheduleType === "server" ||
- scheduleItem.scheduleType === "dokploy-server"
- ) {
- const member = await findMemberByUserId(
- ctx.user.id,
- ctx.session.activeOrganizationId,
- );
- if (member.role !== "owner" && member.role !== "admin") {
- throw new TRPCError({
- code: "FORBIDDEN",
- message:
- "Only owners and admins can manage server-level schedules.",
- });
- }
- }
-
- if (scheduleItem.scheduleType === "server" && scheduleItem.serverId) {
- const targetServer = await findServerById(scheduleItem.serverId);
- if (
- targetServer.organizationId !== ctx.session.activeOrganizationId
- ) {
- throw new TRPCError({
- code: "UNAUTHORIZED",
- message: "You don't have access to this server.",
- });
- }
- }
}
try {
- await runCommand(input.scheduleId);
+ const deployment = await runCommand(input.scheduleId);
await audit(ctx, {
action: "run",
resourceType: "schedule",
resourceId: input.scheduleId,
});
- return true;
+ return {
+ status: deployment.status,
+ deploymentId: deployment.deploymentId,
+ logPath: deployment.logPath,
+ };
} catch (error) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
diff --git a/apps/dokploy/server/api/routers/server.ts b/apps/dokploy/server/api/routers/server.ts
index 0233173fa..1f3ed2c3b 100644
--- a/apps/dokploy/server/api/routers/server.ts
+++ b/apps/dokploy/server/api/routers/server.ts
@@ -9,6 +9,7 @@ import {
getPublicIpWithFallback,
haveActiveServices,
IS_CLOUD,
+ redactServerSshKey,
removeDeploymentsByServerId,
serverAudit,
serverSetup,
@@ -105,7 +106,7 @@ export const serverRouter = createTRPCRouter({
});
}
- return server;
+ return redactServerSshKey(server);
}),
getDefaultCommand: withPermission("server", "read")
.input(apiFindOneServer)
@@ -412,6 +413,14 @@ export const serverRouter = createTRPCRouter({
.input(apiRemoveServer)
.mutation(async ({ input, ctx }) => {
try {
+ const currentServer = await findServerById(input.serverId);
+ if (currentServer.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to delete this server",
+ });
+ }
+
const activeServers = await haveActiveServices(input.serverId);
if (activeServers) {
@@ -420,7 +429,6 @@ export const serverRouter = createTRPCRouter({
message: "Server has active services, please delete them first",
});
}
- const currentServer = await findServerById(input.serverId);
await audit(ctx, {
action: "delete",
resourceType: "server",
@@ -436,7 +444,7 @@ export const serverRouter = createTRPCRouter({
await updateServersBasedOnQuantity(admin.id, admin.serversQuantity);
}
- return currentServer;
+ return redactServerSshKey(currentServer);
} catch (error) {
throw error;
}
diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts
index fbc41c459..db2951ae4 100644
--- a/apps/dokploy/server/api/routers/settings.ts
+++ b/apps/dokploy/server/api/routers/settings.ts
@@ -3,7 +3,6 @@ import {
checkGPUStatus,
checkPortInUse,
checkPostgresHealth,
- checkRedisHealth,
checkTraefikHealth,
cleanupAll,
cleanupAllBackground,
@@ -13,7 +12,6 @@ import {
cleanupSystem,
cleanupVolumes,
DEFAULT_UPDATE_DATA,
- execAsync,
findServerById,
getDockerDiskUsage,
getDokployImageTag,
@@ -103,41 +101,6 @@ export const settingsRouter = createTRPCRouter({
});
return true;
}),
- cleanRedis: adminProcedure.mutation(async ({ ctx }) => {
- if (IS_CLOUD) {
- return true;
- }
-
- const { stdout: containerId } = await execAsync(
- `docker ps --filter "name=dokploy-redis" --filter "status=running" -q | head -n 1`,
- );
-
- if (!containerId) {
- throw new Error("Redis container not found");
- }
-
- const redisContainerId = containerId.trim();
-
- await execAsync(`docker exec -i ${redisContainerId} redis-cli flushall`);
- await audit(ctx, {
- action: "update",
- resourceType: "settings",
- resourceName: "clean-redis",
- });
- return true;
- }),
- reloadRedis: adminProcedure.mutation(async ({ ctx }) => {
- if (IS_CLOUD) {
- return true;
- }
- await reloadDockerResource("dokploy-redis");
- await audit(ctx, {
- action: "reload",
- resourceType: "settings",
- resourceName: "dokploy-redis",
- });
- return true;
- }),
cleanAllDeploymentQueue: adminProcedure.mutation(async ({ ctx }) => {
if (IS_CLOUD) {
return true;
@@ -959,18 +922,16 @@ export const settingsRouter = createTRPCRouter({
if (IS_CLOUD) {
return {
postgres: { status: "healthy" as const },
- redis: { status: "healthy" as const },
traefik: { status: "healthy" as const },
};
}
- const [postgres, redis, traefik] = await Promise.all([
+ const [postgres, traefik] = await Promise.all([
checkPostgresHealth(),
- checkRedisHealth(),
checkTraefikHealth(),
]);
- return { postgres, redis, traefik };
+ return { postgres, traefik };
}),
setupGPU: adminProcedure
.input(
diff --git a/apps/dokploy/server/api/routers/swarm.ts b/apps/dokploy/server/api/routers/swarm.ts
index f5c8f02c6..483bccf3e 100644
--- a/apps/dokploy/server/api/routers/swarm.ts
+++ b/apps/dokploy/server/api/routers/swarm.ts
@@ -18,12 +18,30 @@ export const swarmRouter = createTRPCRouter({
serverId: z.string().optional(),
}),
)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to access this server",
+ });
+ }
+ }
return await getSwarmNodes(input.serverId);
}),
getNodeInfo: withPermission("server", "read")
.input(z.object({ nodeId: z.string(), serverId: z.string().optional() }))
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to access this server",
+ });
+ }
+ }
return await getNodeInfo(input.nodeId, input.serverId);
}),
getNodeApps: withPermission("server", "read")
@@ -32,7 +50,16 @@ export const swarmRouter = createTRPCRouter({
serverId: z.string().optional(),
}),
)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to access this server",
+ });
+ }
+ }
return getNodeApplications(input.serverId);
}),
getAppInfos: withPermission("server", "read")
@@ -54,7 +81,16 @@ export const swarmRouter = createTRPCRouter({
serverId: z.string().optional(),
}),
)
- .query(async ({ input }) => {
+ .query(async ({ input, ctx }) => {
+ if (input.serverId) {
+ const server = await findServerById(input.serverId);
+ if (server.organizationId !== ctx.session?.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to access this server",
+ });
+ }
+ }
return await getApplicationInfo(input.appName, input.serverId);
}),
getContainerStats: withPermission("server", "read")
diff --git a/apps/dokploy/server/api/routers/user.ts b/apps/dokploy/server/api/routers/user.ts
index 583014ff6..4f90b2cdc 100644
--- a/apps/dokploy/server/api/routers/user.ts
+++ b/apps/dokploy/server/api/routers/user.ts
@@ -3,6 +3,7 @@ import {
createOrganizationUserWithCredentials,
findNotificationById,
findOrganizationById,
+ findPasskeysByUserId,
findUserById,
getDokployUrl,
getUserByToken,
@@ -35,6 +36,7 @@ import { TRPCError } from "@trpc/server";
import * as bcrypt from "bcrypt";
import { and, asc, eq, gt, ne } from "drizzle-orm";
import { z } from "zod";
+import { apiKeyNameSchema } from "@/lib/api-keys";
import { audit } from "@/server/api/utils/audit";
import {
adminProcedure,
@@ -45,7 +47,7 @@ import {
} from "../trpc";
const apiCreateApiKey = z.object({
- name: z.string().min(1),
+ name: apiKeyNameSchema,
prefix: z.string().optional(),
expiresIn: z.number().optional(),
metadata: z.object({
@@ -172,6 +174,9 @@ export const userRouter = createTRPCRouter({
getPermissions: protectedProcedure.query(async ({ ctx }) => {
return resolvePermissions(ctx);
}),
+ listPasskeys: protectedProcedure.query(async ({ ctx }) => {
+ return findPasskeysByUserId(ctx.user.id);
+ }),
haveRootAccess: protectedProcedure.query(async ({ ctx }) => {
if (!IS_CLOUD) {
return false;
diff --git a/apps/dokploy/server/api/routers/vault-provider.ts b/apps/dokploy/server/api/routers/vault-provider.ts
new file mode 100644
index 000000000..4ca3b5789
--- /dev/null
+++ b/apps/dokploy/server/api/routers/vault-provider.ts
@@ -0,0 +1,164 @@
+import {
+ createVaultProvider,
+ findVaultProviderInOrganization,
+ findVaultProvidersByOrganizationId,
+ isVaultProviderAssigned,
+ listVaultProviderSecretNames,
+ maskVaultProviderConfig,
+ mergeVaultProviderConfig,
+ removeVaultProvider,
+ testVaultProviderConnection,
+ updateVaultProvider,
+} from "@dokploy/server";
+import { findMemberByUserId } from "@dokploy/server/services/permission";
+import { TRPCError } from "@trpc/server";
+import { audit } from "@/server/api/utils/audit";
+import {
+ apiCreateVaultProvider,
+ apiFindOneVaultProvider,
+ apiListVaultSecretNames,
+ apiRemoveVaultProvider,
+ apiTestVaultProvider,
+ apiUpdateVaultProvider,
+} from "@/server/db/schema";
+import { createTRPCRouter, withPermission } from "../trpc";
+
+export const vaultProviderRouter = createTRPCRouter({
+ create: withPermission("vaultProvider", "create")
+ .input(apiCreateVaultProvider)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await createVaultProvider(
+ input,
+ ctx.session.activeOrganizationId,
+ );
+ await audit(ctx, {
+ action: "create",
+ resourceType: "vaultProvider",
+ resourceId: provider.vaultProviderId,
+ resourceName: provider.name,
+ });
+ return { ...provider, config: maskVaultProviderConfig(provider.config) };
+ }),
+
+ update: withPermission("vaultProvider", "update")
+ .input(apiUpdateVaultProvider)
+ .mutation(async ({ ctx, input }) => {
+ await findVaultProviderInOrganization(
+ input.vaultProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ const updated = await updateVaultProvider(
+ input.vaultProviderId,
+ input.name,
+ input.config,
+ input.assignments,
+ );
+ await audit(ctx, {
+ action: "update",
+ resourceType: "vaultProvider",
+ resourceId: updated.vaultProviderId,
+ resourceName: updated.name,
+ });
+ return { ...updated, config: maskVaultProviderConfig(updated.config) };
+ }),
+
+ remove: withPermission("vaultProvider", "delete")
+ .input(apiRemoveVaultProvider)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await findVaultProviderInOrganization(
+ input.vaultProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "vaultProvider",
+ resourceId: provider.vaultProviderId,
+ resourceName: provider.name,
+ });
+ await removeVaultProvider(input.vaultProviderId);
+ return true;
+ }),
+
+ all: withPermission("vaultProvider", "read").query(async ({ ctx }) => {
+ const providers = await findVaultProvidersByOrganizationId(
+ ctx.session.activeOrganizationId,
+ );
+ return providers.map((provider) => ({
+ ...provider,
+ config: maskVaultProviderConfig(provider.config),
+ }));
+ }),
+
+ one: withPermission("vaultProvider", "read")
+ .input(apiFindOneVaultProvider)
+ .query(async ({ ctx, input }) => {
+ const provider = await findVaultProviderInOrganization(
+ input.vaultProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ return { ...provider, config: maskVaultProviderConfig(provider.config) };
+ }),
+
+ testConnection: withPermission("vaultProvider", "create")
+ .input(apiTestVaultProvider)
+ .mutation(async ({ ctx, input }) => {
+ if (!input.config && !input.vaultProviderId) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Provide a config or a vaultProviderId to test",
+ });
+ }
+
+ let config = input.config;
+ if (input.vaultProviderId) {
+ const provider = await findVaultProviderInOrganization(
+ input.vaultProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ config = config
+ ? mergeVaultProviderConfig(config, provider.config)
+ : provider.config;
+ }
+
+ await testVaultProviderConnection(config!);
+ return true;
+ }),
+
+ listSecretNames: withPermission("vaultProvider", "read")
+ .input(apiListVaultSecretNames)
+ .query(async ({ ctx, input }) => {
+ const provider = await findVaultProviderInOrganization(
+ input.vaultProviderId,
+ ctx.session.activeOrganizationId,
+ );
+
+ if (ctx.user.role !== "owner" && ctx.user.role !== "admin") {
+ const { accessedProjects } = await findMemberByUserId(
+ ctx.user.id,
+ ctx.session.activeOrganizationId,
+ );
+ if (!accessedProjects.includes(input.projectId)) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You don't have access to this project",
+ });
+ }
+ }
+
+ if (
+ !isVaultProviderAssigned(
+ provider.assignments,
+ input.projectId,
+ input.environmentId,
+ )
+ ) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message:
+ "This vault provider is not enabled for the given project/environment",
+ });
+ }
+
+ return await listVaultProviderSecretNames(provider.config);
+ }),
+});
diff --git a/apps/dokploy/server/api/routers/volume-backups.ts b/apps/dokploy/server/api/routers/volume-backups.ts
index 4781485fc..8bce3ef31 100644
--- a/apps/dokploy/server/api/routers/volume-backups.ts
+++ b/apps/dokploy/server/api/routers/volume-backups.ts
@@ -13,6 +13,8 @@ import { db } from "@dokploy/server/db";
import {
createVolumeBackupSchema,
updateVolumeBackupSchema,
+ VOLUME_NAME_MESSAGE,
+ VOLUME_NAME_REGEX,
volumeBackups,
} from "@dokploy/server/db/schema";
import { findDestinationById } from "@dokploy/server/services/destination";
@@ -55,14 +57,24 @@ export const volumeBackupsRouter = createTRPCRouter({
return await db.query.volumeBackups.findMany({
where: eq(volumeBackups[`${input.volumeBackupType}Id`], input.id),
with: {
- application: true,
- postgres: true,
- mysql: true,
- mariadb: true,
- mongo: true,
- redis: true,
- compose: true,
- libsql: true,
+ application: {
+ columns: { applicationId: true, appName: true, serverId: true },
+ },
+ postgres: {
+ columns: { postgresId: true, appName: true, serverId: true },
+ },
+ mysql: { columns: { mysqlId: true, appName: true, serverId: true } },
+ mariadb: {
+ columns: { mariadbId: true, appName: true, serverId: true },
+ },
+ mongo: { columns: { mongoId: true, appName: true, serverId: true } },
+ redis: { columns: { redisId: true, appName: true, serverId: true } },
+ compose: {
+ columns: { composeId: true, appName: true, serverId: true },
+ },
+ libsql: {
+ columns: { libsqlId: true, appName: true, serverId: true },
+ },
},
orderBy: [desc(volumeBackups.createdAt)],
});
@@ -275,7 +287,10 @@ export const volumeBackupsRouter = createTRPCRouter({
z.object({
backupFileName: z.string().min(1),
destinationId: z.string().min(1),
- volumeName: z.string().min(1),
+ volumeName: z
+ .string()
+ .min(1)
+ .regex(VOLUME_NAME_REGEX, VOLUME_NAME_MESSAGE),
id: z.string().min(1),
serviceType: z.enum(["application", "compose"]),
serverId: z.string().optional(),
diff --git a/apps/dokploy/server/queues/redis-connection.ts b/apps/dokploy/server/queues/redis-connection.ts
deleted file mode 100644
index 520ce4618..000000000
--- a/apps/dokploy/server/queues/redis-connection.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { ConnectionOptions } from "bullmq";
-
-export const redisConfig: ConnectionOptions = {
- host:
- process.env.NODE_ENV === "production"
- ? process.env.REDIS_HOST || "dokploy-redis"
- : "127.0.0.1",
-};
diff --git a/apps/dokploy/server/utils/docker.ts b/apps/dokploy/server/utils/docker.ts
index 07e4e26e1..d116a45f9 100644
--- a/apps/dokploy/server/utils/docker.ts
+++ b/apps/dokploy/server/utils/docker.ts
@@ -11,10 +11,25 @@ export const isWSL = async () => {
}
};
+/** Returns if running in Docker Desktop. */
+export const isDockerDesktop = async () => {
+ try {
+ const { stdout } = await execAsync("getent hosts host.docker.internal");
+ return !!stdout.trim();
+ } catch {
+ return false;
+ }
+};
+
/** Returns the Docker host IP address. */
export const getDockerHost = async (): Promise
=> {
if (process.env.NODE_ENV === "production") {
- if (process.platform === "linux" && !(await isWSL())) {
+ const isLinux =
+ process.platform === "linux"
+ ? (await Promise.all([isWSL(), isDockerDesktop()])).every((v) => !v)
+ : false;
+
+ if (isLinux) {
try {
// Try to get the Docker bridge IP first
const { stdout } = await execAsync(
diff --git a/apps/dokploy/server/wss/authorize.ts b/apps/dokploy/server/wss/authorize.ts
new file mode 100644
index 000000000..bd6f731af
--- /dev/null
+++ b/apps/dokploy/server/wss/authorize.ts
@@ -0,0 +1,90 @@
+import { getAccessibleServerIds } from "@dokploy/server";
+import {
+ checkServiceAccess,
+ findMemberByUserId,
+ hasPermission,
+} from "@dokploy/server/services/permission";
+
+type WssUser = { id: string } | null | undefined;
+type WssSession = { activeOrganizationId?: string | null } | null | undefined;
+
+const buildCtx = (user: { id: string }, activeOrganizationId: string) => ({
+ user: { id: user.id },
+ session: { activeOrganizationId },
+});
+
+// Authorizes docker/container operations opened over a WebSocket (container
+// terminal, container logs, container stats). Requires the docker permission
+// (owner/admin, or a member explicitly granted canAccessToDocker) and, for a
+// remote server, that the server is accessible to the caller. Previously these
+// handlers only checked session + organization, so any member could reach a
+// root shell / logs of any container.
+export const canAccessDockerOverWss = async (
+ user: WssUser,
+ session: WssSession,
+ serverId?: string | null,
+ serviceId?: string | null,
+): Promise => {
+ // return false;
+ if (!user || !session?.activeOrganizationId) return false;
+
+ const ctx = buildCtx(user, session.activeOrganizationId);
+
+ // When the container belongs to a specific Dokploy service (opened from a
+ // service page, so serviceId is present), access to that service is the
+ // authoritative gate — matching the service tRPC endpoints (e.g.
+ // application.readLogs, which check service access only). A member granted
+ // the service can read its logs / open its terminal even without the broad
+ // "docker" permission or explicit access to the server it runs on.
+ if (serviceId) {
+ try {
+ await checkServiceAccess(ctx, serviceId, "read");
+ return true;
+ } catch {
+ return false;
+ }
+ }
+
+ // Generic Docker overview (no service context): mirror the docker tRPC router
+ // — require the docker permission and access to the target server.
+ if (!(await hasPermission(ctx, { docker: ["read"] }))) return false;
+
+ if (serverId && serverId !== "local") {
+ const accessible = await getAccessibleServerIds({
+ userId: user.id,
+ activeOrganizationId: session.activeOrganizationId,
+ });
+ if (!accessible.has(serverId)) return false;
+ }
+
+ return true;
+};
+
+// Authorizes the host/server SSH terminal opened over a WebSocket. The local
+// host terminal is a root shell on the control-plane host, so it is restricted
+// to owner/admin. A remote server terminal is gated on server access.
+export const canAccessTerminalOverWss = async (
+ user: WssUser,
+ session: WssSession,
+ serverId?: string | null,
+): Promise => {
+ if (!user || !session?.activeOrganizationId) return false;
+
+ if (serverId && serverId !== "local") {
+ const accessible = await getAccessibleServerIds({
+ userId: user.id,
+ activeOrganizationId: session.activeOrganizationId,
+ });
+ return accessible.has(serverId);
+ }
+
+ try {
+ const member = await findMemberByUserId(
+ user.id,
+ session.activeOrganizationId,
+ );
+ return member?.role === "owner" || member?.role === "admin";
+ } catch {
+ return false;
+ }
+};
diff --git a/apps/dokploy/server/wss/docker-container-logs.ts b/apps/dokploy/server/wss/docker-container-logs.ts
index ed4541558..c20110d62 100644
--- a/apps/dokploy/server/wss/docker-container-logs.ts
+++ b/apps/dokploy/server/wss/docker-container-logs.ts
@@ -3,6 +3,7 @@ import { findServerById, IS_CLOUD, validateRequest } from "@dokploy/server";
import { spawn } from "node-pty";
import { Client } from "ssh2";
import { WebSocketServer } from "ws";
+import { canAccessDockerOverWss } from "./authorize";
import {
getShell,
isValidContainerId,
@@ -41,6 +42,7 @@ export const setupDockerContainerLogsWebSocketServer = (
const since = url.searchParams.get("since") ?? "all";
const serverId = url.searchParams.get("serverId");
const runType = url.searchParams.get("runType");
+ const serviceId = url.searchParams.get("serviceId");
const { user, session } = await validateRequest(req);
if (!containerId) {
@@ -74,6 +76,11 @@ export const setupDockerContainerLogsWebSocketServer = (
return;
}
+ if (!(await canAccessDockerOverWss(user, session, serverId, serviceId))) {
+ ws.close(4003, "Not authorized");
+ return;
+ }
+
// Set up keep-alive ping mechanism to prevent timeout
// Send ping every 45 seconds to keep connection alive
const pingInterval = setInterval(() => {
diff --git a/apps/dokploy/server/wss/docker-container-terminal.ts b/apps/dokploy/server/wss/docker-container-terminal.ts
index e752c0651..64e95c3ae 100644
--- a/apps/dokploy/server/wss/docker-container-terminal.ts
+++ b/apps/dokploy/server/wss/docker-container-terminal.ts
@@ -3,6 +3,7 @@ import { findServerById, IS_CLOUD, validateRequest } from "@dokploy/server";
import { spawn } from "node-pty";
import { Client } from "ssh2";
import { WebSocketServer } from "ws";
+import { canAccessDockerOverWss } from "./authorize";
import { isValidContainerId, isValidShell } from "./utils";
export const setupDockerContainerTerminalWebSocketServer = (
@@ -32,6 +33,7 @@ export const setupDockerContainerTerminalWebSocketServer = (
const containerId = url.searchParams.get("containerId");
const activeWay = url.searchParams.get("activeWay");
const serverId = url.searchParams.get("serverId");
+ const serviceId = url.searchParams.get("serviceId");
const { user, session } = await validateRequest(req);
if (!containerId) {
@@ -58,6 +60,11 @@ export const setupDockerContainerTerminalWebSocketServer = (
ws.close();
return;
}
+
+ if (!(await canAccessDockerOverWss(user, session, serverId, serviceId))) {
+ ws.close(4003, "Not authorized");
+ return;
+ }
try {
if (serverId) {
const server = await findServerById(serverId);
diff --git a/apps/dokploy/server/wss/docker-stats.ts b/apps/dokploy/server/wss/docker-stats.ts
index b5f2439bf..a79a5d5b2 100644
--- a/apps/dokploy/server/wss/docker-stats.ts
+++ b/apps/dokploy/server/wss/docker-stats.ts
@@ -9,6 +9,7 @@ import {
validateRequest,
} from "@dokploy/server";
import { WebSocketServer } from "ws";
+import { canAccessDockerOverWss } from "./authorize";
export const setupDockerStatsMonitoringSocketServer = (
server: http.Server,
@@ -44,6 +45,7 @@ export const setupDockerStatsMonitoringSocketServer = (
| "application"
| "stack"
| "docker-compose";
+ const serviceId = url.searchParams.get("serviceId");
const { user, session } = await validateRequest(req);
if (!appName) {
@@ -55,6 +57,11 @@ export const setupDockerStatsMonitoringSocketServer = (
ws.close();
return;
}
+
+ if (!(await canAccessDockerOverWss(user, session, null, serviceId))) {
+ ws.close(4003, "Not authorized");
+ return;
+ }
const intervalId = setInterval(async () => {
try {
// Special case: when monitoring "dokploy", get host system stats instead of container stats
diff --git a/apps/dokploy/server/wss/terminal.ts b/apps/dokploy/server/wss/terminal.ts
index 4825f7301..90c36855e 100644
--- a/apps/dokploy/server/wss/terminal.ts
+++ b/apps/dokploy/server/wss/terminal.ts
@@ -9,6 +9,7 @@ import { publicIpv4, publicIpv6 } from "public-ip";
import { Client, type ConnectConfig } from "ssh2";
import { WebSocketServer } from "ws";
import { getDockerHost } from "../utils/docker";
+import { canAccessTerminalOverWss } from "./authorize";
import { setupLocalServerSSHKey } from "./utils";
const COMMAND_TO_ALLOW_LOCAL_ACCESS = `
@@ -93,6 +94,11 @@ export const setupTerminalWebSocketServer = (
return;
}
+ if (!(await canAccessTerminalOverWss(user, session, serverId))) {
+ ws.close(4003, "Not authorized");
+ return;
+ }
+
let connectionDetails: ConnectConfig = {};
const isLocalServer = serverId === "local";
diff --git a/apps/dokploy/setup.ts b/apps/dokploy/setup.ts
index 0f993e14a..5f76008db 100644
--- a/apps/dokploy/setup.ts
+++ b/apps/dokploy/setup.ts
@@ -6,7 +6,6 @@ const execAsync = promisify(exec);
import { setupDirectories } from "@dokploy/server/setup/config-paths";
import { initializePostgres } from "@dokploy/server/setup/postgres-setup";
-import { initializeRedis } from "@dokploy/server/setup/redis-setup";
import {
initializeNetwork,
initializeSwarm,
@@ -29,7 +28,6 @@ import {
createDefaultServerTraefikConfig();
await execAsync(`docker pull traefik:v${TRAEFIK_VERSION}`);
await initializeStandaloneTraefik();
- await initializeRedis();
await initializePostgres();
console.log("Dokploy setup completed");
exit(0);
diff --git a/apps/dokploy/styles/globals.css b/apps/dokploy/styles/globals.css
index 50c516bd1..ac11be7e5 100644
--- a/apps/dokploy/styles/globals.css
+++ b/apps/dokploy/styles/globals.css
@@ -2,9 +2,9 @@
@import "tw-animate-css";
@import "shadcn/tailwind.css";
-@plugin 'tailwindcss-animate';
-@plugin '@tailwindcss/typography';
-@plugin 'fancy-ansi/plugin';
+@plugin "tailwindcss-animate";
+@plugin "@tailwindcss/typography";
+@plugin "fancy-ansi/plugin";
@custom-variant dark (&:is(.dark *));
@@ -21,8 +21,8 @@
@theme {
--font-sans:
- var(--font-inter), ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
- "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ var(--font-inter), ui-sans-serif, system-ui, sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--breakpoint-3xl: 1920px;
@@ -269,6 +269,12 @@
@apply bg-background text-foreground;
}
+ /* Cursor pointer on buttons */
+ button:not([disabled]),
+ [role="button"]:not([disabled]) {
+ cursor: pointer;
+ }
+
/* Custom scrollbar styling */
::-webkit-scrollbar {
width: 0.3125rem;
diff --git a/apps/dokploy/utils/github-utils.ts b/apps/dokploy/utils/github-utils.ts
new file mode 100644
index 000000000..abf13f0d6
--- /dev/null
+++ b/apps/dokploy/utils/github-utils.ts
@@ -0,0 +1,49 @@
+// utils/github-utils.ts
+// This file contains client-safe utilities for GitHub integration.
+// Duplicates parseGithubBaseUrl from @dokploy/server, which cannot be imported
+// here (node-only modules). Kept in step by github-url-parity.test.ts.
+
+export const DEFAULT_GITHUB_URL = "https://github.com";
+
+interface ResolvedGithubBaseUrl {
+ baseUrl: string;
+ error?: string;
+}
+
+export const resolveGithubBaseUrl = (value: string): ResolvedGithubBaseUrl => {
+ const raw = value.trim() || DEFAULT_GITHUB_URL;
+ const withScheme = /^https?:\/\//i.test(raw) ? raw : `https://${raw}`;
+
+ let parsed: URL;
+ try {
+ parsed = new URL(withScheme);
+ } catch {
+ // Keep the raw value rather than defaulting: the failure stays visible.
+ return { baseUrl: withScheme, error: `"${raw}" is not a valid URL` };
+ }
+
+ if (parsed.protocol !== "https:") {
+ return {
+ baseUrl: parsed.origin,
+ error:
+ "Only https is supported. Creating the app over http would leave it orphaned on your instance.",
+ };
+ }
+
+ // "acme.ghe.com." resolves the same as "acme.ghe.com", but the trailing dot
+ // would slip past the checks below.
+ if (parsed.hostname.endsWith(".")) {
+ parsed.hostname = parsed.hostname.replace(/\.+$/, "");
+ }
+
+ const { hostname } = parsed;
+
+ if (!hostname.includes(".")) {
+ return {
+ baseUrl: parsed.origin,
+ error: `"${hostname}" is not a fully qualified hostname`,
+ };
+ }
+
+ return { baseUrl: parsed.origin };
+};
diff --git a/apps/schedules/src/utils.ts b/apps/schedules/src/utils.ts
index 7caa106af..85de85f9a 100644
--- a/apps/schedules/src/utils.ts
+++ b/apps/schedules/src/utils.ts
@@ -180,6 +180,9 @@ export const initializeJobs = async () => {
where: eq(schedules.enabled, true),
with: {
application: {
+ columns: {
+ applicationId: true,
+ },
with: {
server: true,
},
@@ -227,6 +230,9 @@ export const initializeJobs = async () => {
where: eq(volumeBackups.enabled, true),
with: {
application: {
+ columns: {
+ applicationId: true,
+ },
with: {
server: true,
},
diff --git a/biome.json b/biome.json
index 5f49b47c6..f75baac2b 100644
--- a/biome.json
+++ b/biome.json
@@ -16,8 +16,10 @@
"!node_modules/**",
"!packages/server/package.json"
],
- "maxSize": 2097152
+ "maxSize": 2097152,
+ "experimentalScannerIgnores": [".next", "node_modules", ".docker", "dist"]
},
+ "css": { "parser": { "tailwindDirectives": true } },
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"linter": {
"rules": {
diff --git a/openapi.json b/openapi.json
index bab2a3347..668865d3d 100644
--- a/openapi.json
+++ b/openapi.json
@@ -162,31 +162,38 @@
"type": "object",
"properties": {
"refreshRate": {
- "type": "number"
+ "type": "number",
+ "minimum": 2
},
"port": {
- "type": "number"
+ "type": "number",
+ "minimum": 1
},
"token": {
"type": "string"
},
"urlCallback": {
- "type": "string"
+ "type": "string",
+ "format": "uri"
},
"retentionDays": {
- "type": "number"
+ "type": "number",
+ "minimum": 1
},
"cronJob": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"thresholds": {
"type": "object",
"properties": {
"cpu": {
- "type": "number"
+ "type": "number",
+ "minimum": 0
},
"memory": {
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
},
"required": [
@@ -209,7 +216,8 @@
"type": "object",
"properties": {
"refreshRate": {
- "type": "number"
+ "type": "number",
+ "minimum": 2
},
"services": {
"type": "object",
@@ -304,1449 +312,6 @@
}
}
},
- "/docker.getContainers": {
- "get": {
- "operationId": "docker-getContainers",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.restartContainer": {
- "post": {
- "operationId": "docker-restartContainer",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "containerId": {
- "type": "string"
- }
- },
- "required": [
- "containerId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.getConfig": {
- "get": {
- "operationId": "docker-getConfig",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "containerId",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.getContainersByAppNameMatch": {
- "get": {
- "operationId": "docker-getContainersByAppNameMatch",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "appType",
- "schema": {
- "type": "string",
- "enum": [
- "stack",
- "docker-compose"
- ]
- }
- },
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.getContainersByAppLabel": {
- "get": {
- "operationId": "docker-getContainersByAppLabel",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "type",
- "schema": {
- "type": "string",
- "enum": [
- "standalone",
- "swarm"
- ]
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.getStackContainersByAppName": {
- "get": {
- "operationId": "docker-getStackContainersByAppName",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/docker.getServiceContainersByAppName": {
- "get": {
- "operationId": "docker-getServiceContainersByAppName",
- "tags": [
- "docker"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.create": {
- "post": {
- "operationId": "project-create",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "env": {
- "type": "string"
- }
- },
- "required": [
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.one": {
- "get": {
- "operationId": "project-one",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "projectId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.all": {
- "get": {
- "operationId": "project-all",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.allForPermissions": {
- "get": {
- "operationId": "project-allForPermissions",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.search": {
- "get": {
- "operationId": "project-search",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "q",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "name",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "description",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "limit",
- "schema": {
- "default": 20,
- "type": "number"
- }
- },
- {
- "in": "query",
- "name": "offset",
- "schema": {
- "default": 0,
- "type": "number"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.remove": {
- "post": {
- "operationId": "project-remove",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "projectId": {
- "type": "string"
- }
- },
- "required": [
- "projectId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.update": {
- "post": {
- "operationId": "project-update",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "projectId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "createdAt": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- },
- "env": {
- "type": "string"
- }
- },
- "required": [
- "projectId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/project.duplicate": {
- "post": {
- "operationId": "project-duplicate",
- "tags": [
- "project"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "sourceEnvironmentId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "description": {
- "type": "string"
- },
- "includeServices": {
- "default": true,
- "type": "boolean"
- },
- "selectedServices": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "type": {
- "type": "string",
- "enum": [
- "application",
- "postgres",
- "mariadb",
- "mongo",
- "mysql",
- "redis",
- "compose"
- ]
- }
- },
- "required": [
- "id",
- "type"
- ]
- }
- },
- "duplicateInSameProject": {
- "default": false,
- "type": "boolean"
- }
- },
- "required": [
- "sourceEnvironmentId",
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
"/application.create": {
"post": {
"operationId": "application-create",
@@ -1767,10 +332,14 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"description": {
"anyOf": [
@@ -1876,7 +445,8 @@
"in": "query",
"name": "applicationId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -1967,7 +537,10 @@
"type": "object",
"properties": {
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"applicationId": {
"type": "string"
@@ -2057,7 +630,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -2143,7 +717,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -2229,7 +804,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -2315,7 +891,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"title": {
"type": "string"
@@ -2715,16 +1292,6 @@
}
]
},
- "branch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"owner": {
"anyOf": [
{
@@ -2755,6 +1322,11 @@
}
]
},
+ "branch": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9._\\-/#]+$"
+ },
"triggerType": {
"default": "push",
"type": "string",
@@ -2783,10 +1355,10 @@
"required": [
"applicationId",
"repository",
- "branch",
"owner",
"buildPath",
"githubId",
+ "branch",
"triggerType"
]
}
@@ -2871,16 +1443,6 @@
"applicationId": {
"type": "string"
},
- "gitlabBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"gitlabBuildPath": {
"anyOf": [
{
@@ -2941,6 +1503,11 @@
}
]
},
+ "gitlabBranch": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9._\\-/#]+$"
+ },
"enableSubmodules": {
"type": "boolean"
},
@@ -2960,13 +1527,13 @@
},
"required": [
"applicationId",
- "gitlabBranch",
"gitlabBuildPath",
"gitlabOwner",
"gitlabRepository",
"gitlabId",
"gitlabProjectId",
- "gitlabPathNamespace"
+ "gitlabPathNamespace",
+ "gitlabBranch"
]
}
}
@@ -3047,16 +1614,6 @@
"schema": {
"type": "object",
"properties": {
- "bitbucketBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"bitbucketBuildPath": {
"anyOf": [
{
@@ -3110,6 +1667,11 @@
"applicationId": {
"type": "string"
},
+ "bitbucketBranch": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9._\\-/#]+$"
+ },
"enableSubmodules": {
"type": "boolean"
},
@@ -3128,13 +1690,13 @@
}
},
"required": [
- "bitbucketBranch",
"bitbucketBuildPath",
"bitbucketOwner",
"bitbucketRepository",
"bitbucketRepositorySlug",
"bitbucketId",
- "applicationId"
+ "applicationId",
+ "bitbucketBranch"
]
}
}
@@ -3218,16 +1780,6 @@
"applicationId": {
"type": "string"
},
- "giteaBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"giteaBuildPath": {
"anyOf": [
{
@@ -3268,6 +1820,11 @@
}
]
},
+ "giteaBranch": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9._\\-/#]+$"
+ },
"enableSubmodules": {
"type": "boolean"
},
@@ -3287,11 +1844,11 @@
},
"required": [
"applicationId",
- "giteaBranch",
"giteaBuildPath",
"giteaOwner",
"giteaRepository",
- "giteaId"
+ "giteaId",
+ "giteaBranch"
]
}
}
@@ -3502,16 +2059,6 @@
"schema": {
"type": "object",
"properties": {
- "customGitBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"applicationId": {
"type": "string"
},
@@ -3551,6 +2098,11 @@
"enableSubmodules": {
"type": "boolean"
},
+ "customGitBranch": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9._\\-/#]+$"
+ },
"customGitSSHKeyId": {
"anyOf": [
{
@@ -3563,11 +2115,11 @@
}
},
"required": [
- "customGitBranch",
"applicationId",
"customGitBuildPath",
"customGitUrl",
- "watchPaths"
+ "watchPaths",
+ "customGitBranch"
]
}
}
@@ -3649,7 +2201,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -3735,7 +2288,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -3821,13 +2375,18 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"description": {
"anyOf": [
@@ -4109,6 +2668,24 @@
}
]
},
+ "icon": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "string",
+ "maxLength": 2097152
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"refreshToken": {
"anyOf": [
{
@@ -4821,8 +3398,7 @@
{
"anyOf": [
{
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
{
"type": "null"
@@ -4888,13 +3464,18 @@
"type": "object",
"properties": {
"Name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"Soft": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
},
"Hard": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
}
},
"required": [
@@ -5066,6 +3647,22 @@
"type": "null"
}
]
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
}
},
"required": [
@@ -5151,7 +3748,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -5237,7 +3835,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"title": {
"type": "string"
@@ -5329,7 +3928,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -5415,7 +4015,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -5501,7 +4102,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -5583,7 +4185,8 @@
"in": "query",
"name": "applicationId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -5654,9 +4257,12 @@
}
}
},
- "/drop-deployment": {
+ "/application.dropDeployment": {
"post": {
"operationId": "application-dropDeployment",
+ "tags": [
+ "application"
+ ],
"security": [
{
"Authorization": []
@@ -5674,14 +4280,15 @@
"type": "string"
},
"zip": {
- "format": "binary",
- "type": "string"
+ "type": "string",
+ "format": "binary"
},
"dropBuildPath": {
"type": "string"
}
},
"required": [
+ "applicationId",
"zip"
]
}
@@ -5850,7 +4457,8 @@
"in": "query",
"name": "appName",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -6031,7 +4639,8 @@
"type": "object",
"properties": {
"applicationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -6177,7 +4786,9 @@
"name": "limit",
"schema": {
"default": 20,
- "type": "number"
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
}
},
{
@@ -6185,7 +4796,8 @@
"name": "offset",
"schema": {
"default": 0,
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
}
],
@@ -6255,11 +4867,2266 @@
}
}
},
- "/mysql.create": {
- "post": {
- "operationId": "mysql-create",
+ "/application.readLogs": {
+ "get": {
+ "operationId": "application-readLogs",
"tags": [
- "mysql"
+ "application"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "applicationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.create": {
+ "post": {
+ "operationId": "backup-create",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "schedule": {
+ "type": "string"
+ },
+ "enabled": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "destinationId": {
+ "type": "string"
+ },
+ "keepLatestCount": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "database": {
+ "type": "string",
+ "minLength": 1
+ },
+ "mariadbId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mysqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "postgresId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mongoId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "libsqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "databaseType": {
+ "type": "string",
+ "enum": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo",
+ "web-server",
+ "libsql"
+ ]
+ },
+ "userId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "backupType": {
+ "type": "string",
+ "enum": [
+ "database",
+ "compose"
+ ]
+ },
+ "composeId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "includeEncryptionKey": {
+ "type": "boolean"
+ },
+ "metadata": {
+ "anyOf": [
+ {},
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "schedule",
+ "prefix",
+ "destinationId",
+ "database",
+ "databaseType"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.one": {
+ "get": {
+ "operationId": "backup-one",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "backupId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.update": {
+ "post": {
+ "operationId": "backup-update",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "schedule": {
+ "type": "string"
+ },
+ "enabled": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "backupId": {
+ "type": "string"
+ },
+ "destinationId": {
+ "type": "string"
+ },
+ "database": {
+ "type": "string",
+ "minLength": 1
+ },
+ "keepLatestCount": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "metadata": {
+ "anyOf": [
+ {},
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "databaseType": {
+ "type": "string",
+ "enum": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo",
+ "web-server",
+ "libsql"
+ ]
+ },
+ "includeEncryptionKey": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "schedule",
+ "enabled",
+ "prefix",
+ "backupId",
+ "destinationId",
+ "database",
+ "keepLatestCount",
+ "serviceName",
+ "metadata",
+ "databaseType"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.remove": {
+ "post": {
+ "operationId": "backup-remove",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupPostgres": {
+ "post": {
+ "operationId": "backup-manualBackupPostgres",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupMySql": {
+ "post": {
+ "operationId": "backup-manualBackupMySql",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupMariadb": {
+ "post": {
+ "operationId": "backup-manualBackupMariadb",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupCompose": {
+ "post": {
+ "operationId": "backup-manualBackupCompose",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupMongo": {
+ "post": {
+ "operationId": "backup-manualBackupMongo",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupLibsql": {
+ "post": {
+ "operationId": "backup-manualBackupLibsql",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.manualBackupWebServer": {
+ "post": {
+ "operationId": "backup-manualBackupWebServer",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "backupId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "backupId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/backup.listBackupFiles": {
+ "get": {
+ "operationId": "backup-listBackupFiles",
+ "tags": [
+ "backup"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "destinationId",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.create": {
+ "post": {
+ "operationId": "bitbucket-create",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "bitbucketId": {
+ "type": "string"
+ },
+ "bitbucketUsername": {
+ "type": "string"
+ },
+ "bitbucketEmail": {
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "appPassword": {
+ "type": "string"
+ },
+ "apiToken": {
+ "type": "string"
+ },
+ "bitbucketWorkspaceName": {
+ "type": "string"
+ },
+ "gitProviderId": {
+ "type": "string"
+ },
+ "authId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "authId",
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.one": {
+ "get": {
+ "operationId": "bitbucket-one",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "bitbucketId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.bitbucketProviders": {
+ "get": {
+ "operationId": "bitbucket-bitbucketProviders",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.getBitbucketRepositories": {
+ "get": {
+ "operationId": "bitbucket-getBitbucketRepositories",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "bitbucketId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.getBitbucketBranches": {
+ "get": {
+ "operationId": "bitbucket-getBitbucketBranches",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "owner",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "repo",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "bitbucketId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.testConnection": {
+ "post": {
+ "operationId": "bitbucket-testConnection",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "bitbucketId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "bitbucketUsername": {
+ "type": "string"
+ },
+ "bitbucketEmail": {
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "workspaceName": {
+ "type": "string"
+ },
+ "apiToken": {
+ "type": "string"
+ },
+ "appPassword": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "bitbucketId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/bitbucket.update": {
+ "post": {
+ "operationId": "bitbucket-update",
+ "tags": [
+ "bitbucket"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "bitbucketId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "bitbucketUsername": {
+ "type": "string"
+ },
+ "bitbucketEmail": {
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "appPassword": {
+ "type": "string"
+ },
+ "apiToken": {
+ "type": "string"
+ },
+ "bitbucketWorkspaceName": {
+ "type": "string"
+ },
+ "gitProviderId": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "bitbucketId",
+ "gitProviderId",
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.all": {
+ "get": {
+ "operationId": "network-all",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.one": {
+ "get": {
+ "operationId": "network-one",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "networkId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.create": {
+ "post": {
+ "operationId": "network-create",
+ "tags": [
+ "network"
],
"security": [
{
@@ -6275,13 +7142,10766 @@
"type": "object",
"properties": {
"name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "driver": {
+ "type": "string",
+ "enum": [
+ "bridge",
+ "overlay"
+ ]
+ },
+ "internal": {
+ "type": "boolean"
+ },
+ "attachable": {
+ "type": "boolean"
+ },
+ "enableIPv4": {
+ "type": "boolean"
+ },
+ "enableIPv6": {
+ "type": "boolean"
+ },
+ "ipam": {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "driver": {
+ "type": "string"
+ },
+ "config": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "subnet": {
+ "type": "string"
+ },
+ "gateway": {
+ "type": "string"
+ },
+ "ipRange": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.networksToSync": {
+ "get": {
+ "operationId": "network-networksToSync",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.import": {
+ "post": {
+ "operationId": "network-import",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "type": "string"
+ },
+ "names": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
+ "required": [
+ "names"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.inspect": {
+ "get": {
+ "operationId": "network-inspect",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "networkId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.recreate": {
+ "post": {
+ "operationId": "network-recreate",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "networkId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "networkId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/network.remove": {
+ "post": {
+ "operationId": "network-remove",
+ "tags": [
+ "network"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "networkId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "networkId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/certificates.create": {
+ "post": {
+ "operationId": "certificates-create",
+ "tags": [
+ "certificates"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "certificateId": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "certificateData": {
+ "type": "string",
+ "minLength": 1
+ },
+ "privateKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "certificatePath": {
+ "type": "string"
+ },
+ "autoRenew": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "organizationId": {
+ "type": "string"
+ },
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "certificateData",
+ "privateKey",
+ "organizationId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/certificates.one": {
+ "get": {
+ "operationId": "certificates-one",
+ "tags": [
+ "certificates"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "certificateId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/certificates.remove": {
+ "post": {
+ "operationId": "certificates-remove",
+ "tags": [
+ "certificates"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "certificateId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "certificateId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/certificates.all": {
+ "get": {
+ "operationId": "certificates-all",
+ "tags": [
+ "certificates"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/certificates.update": {
+ "post": {
+ "operationId": "certificates-update",
+ "tags": [
+ "certificates"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "certificateId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "certificateData": {
+ "type": "string",
+ "minLength": 1
+ },
+ "privateKey": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "certificateId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/cluster.getNodes": {
+ "get": {
+ "operationId": "cluster-getNodes",
+ "tags": [
+ "cluster"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/cluster.removeWorker": {
+ "post": {
+ "operationId": "cluster-removeWorker",
+ "tags": [
+ "cluster"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "nodeId": {
+ "type": "string"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "nodeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/cluster.addWorker": {
+ "get": {
+ "operationId": "cluster-addWorker",
+ "tags": [
+ "cluster"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/cluster.addManager": {
+ "get": {
+ "operationId": "cluster-addManager",
+ "tags": [
+ "cluster"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.create": {
+ "post": {
+ "operationId": "compose-create",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "environmentId": {
+ "type": "string"
+ },
+ "composeType": {
+ "type": "string",
+ "enum": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "composeFile": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "environmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.one": {
+ "get": {
+ "operationId": "compose-one",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.update": {
+ "post": {
+ "operationId": "compose-update",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "composeFile": {
+ "type": "string"
+ },
+ "refreshToken": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "sourceType": {
+ "type": "string",
+ "enum": [
+ "git",
+ "github",
+ "gitlab",
+ "bitbucket",
+ "gitea",
+ "raw"
+ ]
+ },
+ "composeType": {
+ "type": "string",
+ "enum": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "repository": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "owner": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "branch": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "autoDeploy": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabProjectId": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabRepository": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabOwner": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabBranch": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabPathNamespace": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "bitbucketRepository": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "bitbucketRepositorySlug": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "bitbucketOwner": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "bitbucketBranch": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "giteaRepository": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "giteaOwner": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "giteaBranch": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customGitUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customGitBranch": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customGitSSHKeyId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "command": {
+ "type": "string"
+ },
+ "enableSubmodules": {
+ "type": "boolean"
+ },
+ "composePath": {
+ "type": "string",
+ "minLength": 1
+ },
+ "suffix": {
+ "type": "string"
+ },
+ "randomize": {
+ "type": "boolean"
+ },
+ "isolatedDeployment": {
+ "type": "boolean"
+ },
+ "isolatedDeploymentsVolume": {
+ "type": "boolean"
+ },
+ "triggerType": {
+ "anyOf": [
+ {
+ "type": "string",
+ "enum": [
+ "push",
+ "tag"
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "composeStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "environmentId": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "watchPaths": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "githubId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "gitlabId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "bitbucketId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "giteaId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceNetworks": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "serviceName": {
+ "type": "string"
+ },
+ "networkIds": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "serviceName",
+ "networkIds",
+ "detachDokployNetwork"
+ ]
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.saveEnvironment": {
+ "post": {
+ "operationId": "compose-saveEnvironment",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string"
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "composeId",
+ "env"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.delete": {
+ "post": {
+ "operationId": "compose-delete",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "deleteVolumes": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "composeId",
+ "deleteVolumes"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.cleanQueues": {
+ "post": {
+ "operationId": "compose-cleanQueues",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.clearDeployments": {
+ "post": {
+ "operationId": "compose-clearDeployments",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.killBuild": {
+ "post": {
+ "operationId": "compose-killBuild",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.loadServices": {
+ "get": {
+ "operationId": "compose-loadServices",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "type",
+ "schema": {
+ "default": "cache",
+ "type": "string",
+ "enum": [
+ "fetch",
+ "cache"
+ ]
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.loadMountsByService": {
+ "get": {
+ "operationId": "compose-loadMountsByService",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serviceName",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.fetchSourceType": {
+ "post": {
+ "operationId": "compose-fetchSourceType",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.randomizeCompose": {
+ "post": {
+ "operationId": "compose-randomizeCompose",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "suffix": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.isolatedDeployment": {
+ "post": {
+ "operationId": "compose-isolatedDeployment",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "suffix": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.getConvertedCompose": {
+ "get": {
+ "operationId": "compose-getConvertedCompose",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.deploy": {
+ "post": {
+ "operationId": "compose-deploy",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.redeploy": {
+ "post": {
+ "operationId": "compose-redeploy",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.stop": {
+ "post": {
+ "operationId": "compose-stop",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.start": {
+ "post": {
+ "operationId": "compose-start",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.getDefaultCommand": {
+ "get": {
+ "operationId": "compose-getDefaultCommand",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.refreshToken": {
+ "post": {
+ "operationId": "compose-refreshToken",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.deployTemplate": {
+ "post": {
+ "operationId": "compose-deployTemplate",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "environmentId": {
+ "type": "string"
+ },
+ "serverId": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "baseUrl": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "environmentId",
+ "id"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.templates": {
+ "get": {
+ "operationId": "compose-templates",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "baseUrl",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.getTags": {
+ "get": {
+ "operationId": "compose-getTags",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "baseUrl",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.disconnectGitProvider": {
+ "post": {
+ "operationId": "compose-disconnectGitProvider",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.move": {
+ "post": {
+ "operationId": "compose-move",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string"
+ },
+ "targetEnvironmentId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "composeId",
+ "targetEnvironmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.processTemplate": {
+ "post": {
+ "operationId": "compose-processTemplate",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "base64": {
+ "type": "string"
+ },
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "base64",
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.previewTemplate": {
+ "post": {
+ "operationId": "compose-previewTemplate",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "base64": {
"type": "string"
},
"appName": {
"type": "string"
},
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "base64",
+ "appName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.import": {
+ "post": {
+ "operationId": "compose-import",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "base64": {
+ "type": "string"
+ },
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "base64",
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.cancelDeployment": {
+ "post": {
+ "operationId": "compose-cancelDeployment",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "composeId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "composeId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.search": {
+ "get": {
+ "operationId": "compose-search",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "q",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "name",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "description",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "projectId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "environmentId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "schema": {
+ "default": 20,
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ {
+ "in": "query",
+ "name": "offset",
+ "schema": {
+ "default": 0,
+ "type": "number",
+ "minimum": 0
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/compose.readLogs": {
+ "get": {
+ "operationId": "compose-readLogs",
+ "tags": [
+ "compose"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "containerId",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.all": {
+ "get": {
+ "operationId": "deployment-all",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "applicationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.allByCompose": {
+ "get": {
+ "operationId": "deployment-allByCompose",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.allByServer": {
+ "get": {
+ "operationId": "deployment-allByServer",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.allCentralized": {
+ "get": {
+ "operationId": "deployment-allCentralized",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.queueList": {
+ "get": {
+ "operationId": "deployment-queueList",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.allByType": {
+ "get": {
+ "operationId": "deployment-allByType",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "id",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "type",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "application",
+ "compose",
+ "server",
+ "schedule",
+ "previewDeployment",
+ "backup",
+ "volumeBackup"
+ ]
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.killProcess": {
+ "post": {
+ "operationId": "deployment-killProcess",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "deploymentId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "deploymentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.removeDeployment": {
+ "post": {
+ "operationId": "deployment-removeDeployment",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "deploymentId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "deploymentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/deployment.readLogs": {
+ "get": {
+ "operationId": "deployment-readLogs",
+ "tags": [
+ "deployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "deploymentId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.create": {
+ "post": {
+ "operationId": "destination-create",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "provider": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "accessKey": {
+ "type": "string"
+ },
+ "bucket": {
+ "type": "string"
+ },
+ "region": {
+ "type": "string"
+ },
+ "endpoint": {
+ "type": "string"
+ },
+ "secretAccessKey": {
+ "type": "string"
+ },
+ "additionalFlags": {
+ "anyOf": [
+ {
+ "default": [],
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^--[a-zA-Z0-9-]+(=[a-zA-Z0-9._:/@-]+)?$"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "provider",
+ "accessKey",
+ "bucket",
+ "region",
+ "endpoint",
+ "secretAccessKey",
+ "additionalFlags"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.testConnection": {
+ "post": {
+ "operationId": "destination-testConnection",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "provider": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "accessKey": {
+ "type": "string"
+ },
+ "bucket": {
+ "type": "string"
+ },
+ "region": {
+ "type": "string"
+ },
+ "endpoint": {
+ "type": "string"
+ },
+ "secretAccessKey": {
+ "type": "string"
+ },
+ "additionalFlags": {
+ "anyOf": [
+ {
+ "default": [],
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^--[a-zA-Z0-9-]+(=[a-zA-Z0-9._:/@-]+)?$"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "provider",
+ "accessKey",
+ "bucket",
+ "region",
+ "endpoint",
+ "secretAccessKey",
+ "additionalFlags"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.one": {
+ "get": {
+ "operationId": "destination-one",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "destinationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.all": {
+ "get": {
+ "operationId": "destination-all",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.remove": {
+ "post": {
+ "operationId": "destination-remove",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "destinationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "destinationId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/destination.update": {
+ "post": {
+ "operationId": "destination-update",
+ "tags": [
+ "destination"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "accessKey": {
+ "type": "string"
+ },
+ "bucket": {
+ "type": "string"
+ },
+ "region": {
+ "type": "string"
+ },
+ "endpoint": {
+ "type": "string"
+ },
+ "secretAccessKey": {
+ "type": "string"
+ },
+ "destinationId": {
+ "type": "string"
+ },
+ "provider": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "additionalFlags": {
+ "anyOf": [
+ {
+ "default": [],
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^--[a-zA-Z0-9-]+(=[a-zA-Z0-9._:/@-]+)?$"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "accessKey",
+ "bucket",
+ "region",
+ "endpoint",
+ "secretAccessKey",
+ "destinationId",
+ "provider",
+ "additionalFlags"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getContainers": {
+ "get": {
+ "operationId": "docker-getContainers",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.restartContainer": {
+ "post": {
+ "operationId": "docker-restartContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.startContainer": {
+ "post": {
+ "operationId": "docker-startContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.stopContainer": {
+ "post": {
+ "operationId": "docker-stopContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.killContainer": {
+ "post": {
+ "operationId": "docker-killContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.removeContainer": {
+ "post": {
+ "operationId": "docker-removeContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getConfig": {
+ "get": {
+ "operationId": "docker-getConfig",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "containerId",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getContainersByAppNameMatch": {
+ "get": {
+ "operationId": "docker-getContainersByAppNameMatch",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "appType",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "stack",
+ "docker-compose"
+ ]
+ }
+ },
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getContainersByAppLabel": {
+ "get": {
+ "operationId": "docker-getContainersByAppLabel",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "type",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "standalone",
+ "swarm"
+ ]
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getStackContainersByAppName": {
+ "get": {
+ "operationId": "docker-getStackContainersByAppName",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.getServiceContainersByAppName": {
+ "get": {
+ "operationId": "docker-getServiceContainersByAppName",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/docker.uploadFileToContainer": {
+ "post": {
+ "operationId": "docker-uploadFileToContainer",
+ "tags": [
+ "docker"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "containerId": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_]+$"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary"
+ },
+ "destinationPath": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9.\\-_/]+$"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "containerId",
+ "file",
+ "destinationPath"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.create": {
+ "post": {
+ "operationId": "domain-create",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "host": {
+ "type": "string",
+ "minLength": 1
+ },
+ "path": {
+ "anyOf": [
+ {
+ "type": "string",
+ "minLength": 1
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "port": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 65535
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customEntrypoint": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "https": {
+ "type": "boolean"
+ },
+ "applicationId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "certificateType": {
+ "type": "string",
+ "enum": [
+ "letsencrypt",
+ "none",
+ "custom"
+ ]
+ },
+ "customCertResolver": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "composeId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "domainType": {
+ "anyOf": [
+ {
+ "type": "string",
+ "enum": [
+ "compose",
+ "application",
+ "preview"
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "previewDeploymentId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "internalPath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stripPath": {
+ "type": "boolean"
+ },
+ "middlewares": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "forwardAuthEnabled": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "host"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.byApplicationId": {
+ "get": {
+ "operationId": "domain-byApplicationId",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "applicationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.byComposeId": {
+ "get": {
+ "operationId": "domain-byComposeId",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "composeId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.generateDomain": {
+ "post": {
+ "operationId": "domain-generateDomain",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appName": {
+ "type": "string"
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "appName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.canGenerateTraefikMeDomains": {
+ "get": {
+ "operationId": "domain-canGenerateTraefikMeDomains",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.update": {
+ "post": {
+ "operationId": "domain-update",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "host": {
+ "type": "string",
+ "minLength": 1
+ },
+ "path": {
+ "anyOf": [
+ {
+ "type": "string",
+ "minLength": 1
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "port": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 65535
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customEntrypoint": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "https": {
+ "type": "boolean"
+ },
+ "certificateType": {
+ "type": "string",
+ "enum": [
+ "letsencrypt",
+ "none",
+ "custom"
+ ]
+ },
+ "customCertResolver": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "domainType": {
+ "anyOf": [
+ {
+ "type": "string",
+ "enum": [
+ "compose",
+ "application",
+ "preview"
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "internalPath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stripPath": {
+ "type": "boolean"
+ },
+ "middlewares": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "forwardAuthEnabled": {
+ "type": "boolean"
+ },
+ "domainId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "host",
+ "domainId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.one": {
+ "get": {
+ "operationId": "domain-one",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "domainId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.delete": {
+ "post": {
+ "operationId": "domain-delete",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "domainId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "domainId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/domain.validateDomain": {
+ "post": {
+ "operationId": "domain-validateDomain",
+ "tags": [
+ "domain"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "domain": {
+ "type": "string"
+ },
+ "serverIp": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "domain"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.create": {
+ "post": {
+ "operationId": "gitea-create",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "giteaId": {
+ "type": "string"
+ },
+ "giteaUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "giteaInternalUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "redirectUri": {
+ "type": "string"
+ },
+ "clientId": {
+ "type": "string"
+ },
+ "clientSecret": {
+ "type": "string"
+ },
+ "gitProviderId": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "refreshToken": {
+ "type": "string"
+ },
+ "expiresAt": {
+ "type": "number"
+ },
+ "scopes": {
+ "type": "string"
+ },
+ "lastAuthenticatedAt": {
+ "type": "number"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "giteaUsername": {
+ "type": "string"
+ },
+ "organizationName": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "giteaUrl",
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.one": {
+ "get": {
+ "operationId": "gitea-one",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "giteaId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.giteaProviders": {
+ "get": {
+ "operationId": "gitea-giteaProviders",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.getGiteaRepositories": {
+ "get": {
+ "operationId": "gitea-getGiteaRepositories",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "giteaId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.getGiteaBranches": {
+ "get": {
+ "operationId": "gitea-getGiteaBranches",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "owner",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "repositoryName",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "giteaId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.testConnection": {
+ "post": {
+ "operationId": "gitea-testConnection",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "giteaId": {
+ "type": "string"
+ },
+ "organizationName": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.update": {
+ "post": {
+ "operationId": "gitea-update",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "giteaId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "giteaUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "giteaInternalUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "redirectUri": {
+ "type": "string"
+ },
+ "clientId": {
+ "type": "string"
+ },
+ "clientSecret": {
+ "type": "string"
+ },
+ "gitProviderId": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "refreshToken": {
+ "type": "string"
+ },
+ "expiresAt": {
+ "type": "number"
+ },
+ "scopes": {
+ "type": "string"
+ },
+ "lastAuthenticatedAt": {
+ "type": "number"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "giteaUsername": {
+ "type": "string"
+ },
+ "organizationName": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "giteaId",
+ "giteaUrl",
+ "gitProviderId",
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitea.getGiteaUrl": {
+ "get": {
+ "operationId": "gitea-getGiteaUrl",
+ "tags": [
+ "gitea"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "giteaId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitProvider.getAll": {
+ "get": {
+ "operationId": "gitProvider-getAll",
+ "tags": [
+ "gitProvider"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitProvider.toggleShare": {
+ "post": {
+ "operationId": "gitProvider-toggleShare",
+ "tags": [
+ "gitProvider"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "gitProviderId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "sharedWithOrganization": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "gitProviderId",
+ "sharedWithOrganization"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitProvider.allForPermissions": {
+ "get": {
+ "operationId": "gitProvider-allForPermissions",
+ "tags": [
+ "gitProvider"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitProvider.remove": {
+ "post": {
+ "operationId": "gitProvider-remove",
+ "tags": [
+ "gitProvider"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "gitProviderId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "gitProviderId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.one": {
+ "get": {
+ "operationId": "github-one",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "githubId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.getGithubRepositories": {
+ "get": {
+ "operationId": "github-getGithubRepositories",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "githubId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.getGithubBranches": {
+ "get": {
+ "operationId": "github-getGithubBranches",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "repo",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "owner",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "githubId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.githubProviders": {
+ "get": {
+ "operationId": "github-githubProviders",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.testConnection": {
+ "post": {
+ "operationId": "github-testConnection",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "githubId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "githubId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/github.update": {
+ "post": {
+ "operationId": "github-update",
+ "tags": [
+ "github"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "githubId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitProviderId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "githubAppName": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "githubId",
+ "name",
+ "gitProviderId",
+ "githubAppName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.create": {
+ "post": {
+ "operationId": "gitlab-create",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "applicationId": {
+ "type": "string"
+ },
+ "secret": {
+ "type": "string"
+ },
+ "groupName": {
+ "type": "string"
+ },
+ "gitProviderId": {
+ "type": "string"
+ },
+ "redirectUri": {
+ "type": "string"
+ },
+ "authId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitlabUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitlabInternalUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "authId",
+ "name",
+ "gitlabUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.one": {
+ "get": {
+ "operationId": "gitlab-one",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "gitlabId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.gitlabProviders": {
+ "get": {
+ "operationId": "gitlab-gitlabProviders",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.getGitlabRepositories": {
+ "get": {
+ "operationId": "gitlab-getGitlabRepositories",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "gitlabId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.getGitlabBranches": {
+ "get": {
+ "operationId": "gitlab-getGitlabBranches",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "id",
+ "schema": {
+ "type": "number"
+ }
+ },
+ {
+ "in": "query",
+ "name": "owner",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "repo",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "gitlabId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.testConnection": {
+ "post": {
+ "operationId": "gitlab-testConnection",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "gitlabId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "groupName": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "gitlabId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/gitlab.update": {
+ "post": {
+ "operationId": "gitlab-update",
+ "tags": [
+ "gitlab"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "applicationId": {
+ "type": "string"
+ },
+ "secret": {
+ "type": "string"
+ },
+ "groupName": {
+ "type": "string"
+ },
+ "redirectUri": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitlabId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitlabUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitProviderId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gitlabInternalUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "gitlabId",
+ "gitlabUrl",
+ "gitProviderId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.create": {
+ "post": {
+ "operationId": "libsql-create",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1
+ },
"dockerImage": {
- "default": "mysql:8",
+ "default": "ghcr.io/tursodatabase/libsql-server:v0.24.32",
"type": "string"
},
"environmentId": {
@@ -6297,18 +17917,1982 @@
}
]
},
- "databaseName": {
- "type": "string"
- },
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "sqldNode": {
+ "type": "string",
+ "enum": [
+ "primary",
+ "replica"
+ ]
+ },
+ "sqldPrimaryUrl": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "enableNamespaces": {
+ "default": false,
+ "type": "boolean"
+ },
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "appName",
+ "dockerImage",
+ "environmentId",
+ "description",
+ "databaseUser",
+ "databasePassword",
+ "sqldNode",
+ "sqldPrimaryUrl",
+ "enableNamespaces",
+ "serverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.one": {
+ "get": {
+ "operationId": "libsql-one",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "libsqlId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.start": {
+ "post": {
+ "operationId": "libsql-start",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.stop": {
+ "post": {
+ "operationId": "libsql-stop",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.saveExternalPorts": {
+ "post": {
+ "operationId": "libsql-saveExternalPorts",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ },
+ "externalPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalGRPCPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalAdminPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.deploy": {
+ "post": {
+ "operationId": "libsql-deploy",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.changeStatus": {
+ "post": {
+ "operationId": "libsql-changeStatus",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ },
+ "applicationStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ }
+ },
+ "required": [
+ "libsqlId",
+ "applicationStatus"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.remove": {
+ "post": {
+ "operationId": "libsql-remove",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.saveEnvironment": {
+ "post": {
+ "operationId": "libsql-saveEnvironment",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "libsqlId",
+ "env"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.reload": {
+ "post": {
+ "operationId": "libsql-reload",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "libsqlId",
+ "appName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.update": {
+ "post": {
+ "operationId": "libsql-update",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "databaseUser": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databasePassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "sqldNode": {
+ "type": "string",
+ "enum": [
+ "primary",
+ "replica"
+ ]
+ },
+ "sqldPrimaryUrl": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "enableNamespaces": {
+ "default": false,
+ "type": "boolean"
+ },
+ "dockerImage": {
+ "default": "ghcr.io/tursodatabase/libsql-server:v0.24.32",
+ "type": "string"
+ },
+ "command": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "memoryReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "memoryLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cpuReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cpuLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalGRPCPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalAdminPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "applicationStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "healthCheckSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Test": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Interval": {
+ "type": "number"
+ },
+ "Timeout": {
+ "type": "number"
+ },
+ "StartPeriod": {
+ "type": "number"
+ },
+ "Retries": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "restartPolicySwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Condition": {
+ "type": "string"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "MaxAttempts": {
+ "type": "number"
+ },
+ "Window": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "placementSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Constraints": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Preferences": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Spread": {
+ "type": "object",
+ "properties": {
+ "SpreadDescriptor": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "SpreadDescriptor"
+ ]
+ }
+ },
+ "required": [
+ "Spread"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "MaxReplicas": {
+ "type": "number"
+ },
+ "Platforms": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Architecture": {
+ "type": "string"
+ },
+ "OS": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Architecture",
+ "OS"
+ ],
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "updateConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "rollbackConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "modeSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Replicated": {
+ "type": "object",
+ "properties": {
+ "Replicas": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Global": {
+ "type": "object",
+ "properties": {}
+ },
+ "ReplicatedJob": {
+ "type": "object",
+ "properties": {
+ "MaxConcurrent": {
+ "type": "number"
+ },
+ "TotalCompletions": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "GlobalJob": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "labelsSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "networkSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Target": {
+ "type": "string"
+ },
+ "Aliases": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DriverOpts": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stopGracePeriodSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "endpointSpecSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Mode": {
+ "type": "string"
+ },
+ "Ports": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Protocol": {
+ "type": "string"
+ },
+ "TargetPort": {
+ "type": "number"
+ },
+ "PublishedPort": {
+ "type": "number"
+ },
+ "PublishMode": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "replicas": {
+ "type": "number"
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "environmentId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.move": {
+ "post": {
+ "operationId": "libsql-move",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ },
+ "targetEnvironmentId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "libsqlId",
+ "targetEnvironmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.rebuild": {
+ "post": {
+ "operationId": "libsql-rebuild",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "libsqlId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "libsqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/libsql.readLogs": {
+ "get": {
+ "operationId": "libsql-readLogs",
+ "tags": [
+ "libsql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "libsqlId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mariadb.create": {
+ "post": {
+ "operationId": "mariadb-create",
+ "tags": [
+ "mariadb"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "dockerImage": {
+ "default": "mariadb:6",
"type": "string"
},
"databaseRootPassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "environmentId": {
"type": "string"
},
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "databaseName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databaseUser": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databasePassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
"serverId": {
"anyOf": [
{
@@ -6387,11 +19971,11 @@
}
}
},
- "/mysql.one": {
+ "/mariadb.one": {
"get": {
- "operationId": "mysql-one",
+ "operationId": "mariadb-one",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6401,9 +19985,10 @@
"parameters": [
{
"in": "query",
- "name": "mysqlId",
+ "name": "mariadbId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -6474,11 +20059,11 @@
}
}
},
- "/mysql.start": {
+ "/mariadb.start": {
"post": {
- "operationId": "mysql-start",
+ "operationId": "mariadb-start",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6493,12 +20078,13 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
- "type": "string"
+ "mariadbId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "mysqlId"
+ "mariadbId"
]
}
}
@@ -6560,11 +20146,11 @@
}
}
},
- "/mysql.stop": {
+ "/mariadb.stop": {
"post": {
- "operationId": "mysql-stop",
+ "operationId": "mariadb-stop",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6579,12 +20165,13 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
- "type": "string"
+ "mariadbId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "mysqlId"
+ "mariadbId"
]
}
}
@@ -6646,11 +20233,11 @@
}
}
},
- "/mysql.saveExternalPort": {
+ "/mariadb.saveExternalPort": {
"post": {
- "operationId": "mysql-saveExternalPort",
+ "operationId": "mariadb-saveExternalPort",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6665,7 +20252,7 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
+ "mariadbId": {
"type": "string"
},
"externalPort": {
@@ -6680,7 +20267,7 @@
}
},
"required": [
- "mysqlId",
+ "mariadbId",
"externalPort"
]
}
@@ -6743,11 +20330,11 @@
}
}
},
- "/mysql.deploy": {
+ "/mariadb.deploy": {
"post": {
- "operationId": "mysql-deploy",
+ "operationId": "mariadb-deploy",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6762,12 +20349,12 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
+ "mariadbId": {
"type": "string"
}
},
"required": [
- "mysqlId"
+ "mariadbId"
]
}
}
@@ -6829,11 +20416,11 @@
}
}
},
- "/mysql.changeStatus": {
+ "/mariadb.changeStatus": {
"post": {
- "operationId": "mysql-changeStatus",
+ "operationId": "mariadb-changeStatus",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6848,7 +20435,7 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
+ "mariadbId": {
"type": "string"
},
"applicationStatus": {
@@ -6862,7 +20449,7 @@
}
},
"required": [
- "mysqlId",
+ "mariadbId",
"applicationStatus"
]
}
@@ -6925,11 +20512,11 @@
}
}
},
- "/mysql.reload": {
+ "/mariadb.remove": {
"post": {
- "operationId": "mysql-reload",
+ "operationId": "mariadb-remove",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -6944,16 +20531,13 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
- "type": "string"
- },
- "appName": {
- "type": "string"
+ "mariadbId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "mysqlId",
- "appName"
+ "mariadbId"
]
}
}
@@ -7015,11 +20599,11 @@
}
}
},
- "/mysql.remove": {
+ "/mariadb.saveEnvironment": {
"post": {
- "operationId": "mysql-remove",
+ "operationId": "mariadb-saveEnvironment",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -7034,93 +20618,7 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
- "type": "string"
- }
- },
- "required": [
- "mysqlId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mysql.saveEnvironment": {
- "post": {
- "operationId": "mysql-saveEnvironment",
- "tags": [
- "mysql"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mysqlId": {
+ "mariadbId": {
"type": "string"
},
"env": {
@@ -7135,7 +20633,7 @@
}
},
"required": [
- "mysqlId",
+ "mariadbId",
"env"
]
}
@@ -7198,11 +20696,11 @@
}
}
},
- "/mysql.update": {
+ "/mariadb.reload": {
"post": {
- "operationId": "mysql-update",
+ "operationId": "mariadb-reload",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -7217,14 +20715,112 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
- "type": "string"
- },
- "name": {
+ "mariadbId": {
"type": "string"
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ }
+ },
+ "required": [
+ "mariadbId",
+ "appName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mariadb.update": {
+ "post": {
+ "operationId": "mariadb-update",
+ "tags": [
+ "mariadb"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mariadbId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"description": {
"anyOf": [
@@ -7237,19 +20833,22 @@
]
},
"databaseName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"databaseRootPassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"dockerImage": {
- "default": "mysql:8",
"type": "string"
},
"command": {
@@ -7687,8 +21286,7 @@
{
"anyOf": [
{
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
{
"type": "null"
@@ -7754,13 +21352,18 @@
"type": "object",
"properties": {
"Name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"Soft": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
},
"Hard": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
}
},
"required": [
@@ -7789,10 +21392,26 @@
},
"environmentId": {
"type": "string"
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
}
},
"required": [
- "mysqlId"
+ "mariadbId"
]
}
}
@@ -7854,11 +21473,11 @@
}
}
},
- "/mysql.move": {
+ "/mariadb.changePassword": {
"post": {
- "operationId": "mysql-move",
+ "operationId": "mariadb-changePassword",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -7873,7 +21492,108 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
+ "mariadbId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "type": {
+ "default": "user",
+ "type": "string",
+ "enum": [
+ "user",
+ "root"
+ ]
+ }
+ },
+ "required": [
+ "mariadbId",
+ "password"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mariadb.move": {
+ "post": {
+ "operationId": "mariadb-move",
+ "tags": [
+ "mariadb"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mariadbId": {
"type": "string"
},
"targetEnvironmentId": {
@@ -7881,7 +21601,7 @@
}
},
"required": [
- "mysqlId",
+ "mariadbId",
"targetEnvironmentId"
]
}
@@ -7944,11 +21664,11 @@
}
}
},
- "/mysql.rebuild": {
+ "/mariadb.rebuild": {
"post": {
- "operationId": "mysql-rebuild",
+ "operationId": "mariadb-rebuild",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -7963,12 +21683,12 @@
"schema": {
"type": "object",
"properties": {
- "mysqlId": {
+ "mariadbId": {
"type": "string"
}
},
"required": [
- "mysqlId"
+ "mariadbId"
]
}
}
@@ -8030,11 +21750,11 @@
}
}
},
- "/mysql.search": {
+ "/mariadb.search": {
"get": {
- "operationId": "mysql-search",
+ "operationId": "mariadb-search",
"tags": [
- "mysql"
+ "mariadb"
],
"security": [
{
@@ -8089,7 +21809,9 @@
"name": "limit",
"schema": {
"default": 20,
- "type": "number"
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
}
},
{
@@ -8097,7 +21819,8 @@
"name": "offset",
"schema": {
"default": 0,
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
}
],
@@ -8167,140 +21890,11 @@
}
}
},
- "/postgres.create": {
- "post": {
- "operationId": "postgres-create",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- },
- "databaseName": {
- "type": "string"
- },
- "databaseUser": {
- "type": "string"
- },
- "databasePassword": {
- "type": "string"
- },
- "dockerImage": {
- "default": "postgres:18",
- "type": "string"
- },
- "environmentId": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "name",
- "databaseName",
- "databaseUser",
- "databasePassword",
- "environmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.one": {
+ "/mariadb.readLogs": {
"get": {
- "operationId": "postgres-one",
+ "operationId": "mariadb-readLogs",
"tags": [
- "postgres"
+ "mariadb"
],
"security": [
{
@@ -8310,3592 +21904,38 @@
"parameters": [
{
"in": "query",
- "name": "postgresId",
+ "name": "mariadbId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
},
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.start": {
- "post": {
- "operationId": "postgres-start",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.stop": {
- "post": {
- "operationId": "postgres-stop",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.saveExternalPort": {
- "post": {
- "operationId": "postgres-saveExternalPort",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "externalPort": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "postgresId",
- "externalPort"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.deploy": {
- "post": {
- "operationId": "postgres-deploy",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.changeStatus": {
- "post": {
- "operationId": "postgres-changeStatus",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "applicationStatus": {
- "type": "string",
- "enum": [
- "idle",
- "running",
- "done",
- "error"
- ]
- }
- },
- "required": [
- "postgresId",
- "applicationStatus"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.remove": {
- "post": {
- "operationId": "postgres-remove",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.saveEnvironment": {
- "post": {
- "operationId": "postgres-saveEnvironment",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "postgresId",
- "env"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.reload": {
- "post": {
- "operationId": "postgres-reload",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- }
- },
- "required": [
- "postgresId",
- "appName"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.update": {
- "post": {
- "operationId": "postgres-update",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- },
- "databaseName": {
- "type": "string"
- },
- "databaseUser": {
- "type": "string"
- },
- "databasePassword": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "dockerImage": {
- "default": "postgres:18",
- "type": "string"
- },
- "command": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "args": {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- {
- "type": "null"
- }
- ]
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "memoryReservation": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "externalPort": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "memoryLimit": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "cpuReservation": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "cpuLimit": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "applicationStatus": {
- "type": "string",
- "enum": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "healthCheckSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Test": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "Interval": {
- "type": "number"
- },
- "Timeout": {
- "type": "number"
- },
- "StartPeriod": {
- "type": "number"
- },
- "Retries": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "restartPolicySwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Condition": {
- "type": "string"
- },
- "Delay": {
- "type": "number"
- },
- "MaxAttempts": {
- "type": "number"
- },
- "Window": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "placementSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Constraints": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "Preferences": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Spread": {
- "type": "object",
- "properties": {
- "SpreadDescriptor": {
- "type": "string"
- }
- },
- "required": [
- "SpreadDescriptor"
- ]
- }
- },
- "required": [
- "Spread"
- ],
- "additionalProperties": false
- }
- },
- "MaxReplicas": {
- "type": "number"
- },
- "Platforms": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Architecture": {
- "type": "string"
- },
- "OS": {
- "type": "string"
- }
- },
- "required": [
- "Architecture",
- "OS"
- ],
- "additionalProperties": false
- }
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "updateConfigSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Parallelism": {
- "type": "number"
- },
- "Delay": {
- "type": "number"
- },
- "FailureAction": {
- "type": "string"
- },
- "Monitor": {
- "type": "number"
- },
- "MaxFailureRatio": {
- "type": "number"
- },
- "Order": {
- "type": "string"
- }
- },
- "required": [
- "Parallelism",
- "Order"
- ],
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "rollbackConfigSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Parallelism": {
- "type": "number"
- },
- "Delay": {
- "type": "number"
- },
- "FailureAction": {
- "type": "string"
- },
- "Monitor": {
- "type": "number"
- },
- "MaxFailureRatio": {
- "type": "number"
- },
- "Order": {
- "type": "string"
- }
- },
- "required": [
- "Parallelism",
- "Order"
- ],
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "modeSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Replicated": {
- "type": "object",
- "properties": {
- "Replicas": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- "Global": {
- "type": "object",
- "properties": {}
- },
- "ReplicatedJob": {
- "type": "object",
- "properties": {
- "MaxConcurrent": {
- "type": "number"
- },
- "TotalCompletions": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- "GlobalJob": {
- "type": "object",
- "properties": {}
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "labelsSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "networkSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Target": {
- "type": "string"
- },
- "Aliases": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "DriverOpts": {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- "additionalProperties": false
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "stopGracePeriodSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "integer",
- "format": "int64"
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "endpointSpecSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Mode": {
- "type": "string"
- },
- "Ports": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Protocol": {
- "type": "string"
- },
- "TargetPort": {
- "type": "number"
- },
- "PublishedPort": {
- "type": "number"
- },
- "PublishMode": {
- "type": "string"
- }
- },
- "additionalProperties": false
- }
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "ulimitsSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Name": {
- "type": "string"
- },
- "Soft": {
- "type": "number"
- },
- "Hard": {
- "type": "number"
- }
- },
- "required": [
- "Name",
- "Soft",
- "Hard"
- ],
- "additionalProperties": false
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "replicas": {
- "type": "number"
- },
- "createdAt": {
- "type": "string"
- },
- "environmentId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.move": {
- "post": {
- "operationId": "postgres-move",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- },
- "targetEnvironmentId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId",
- "targetEnvironmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.rebuild": {
- "post": {
- "operationId": "postgres-rebuild",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "postgresId": {
- "type": "string"
- }
- },
- "required": [
- "postgresId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/postgres.search": {
- "get": {
- "operationId": "postgres-search",
- "tags": [
- "postgres"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
{
"in": "query",
- "name": "q",
+ "name": "tail",
"schema": {
- "type": "string"
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
}
},
{
"in": "query",
- "name": "name",
+ "name": "since",
"schema": {
- "type": "string"
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
}
},
{
"in": "query",
- "name": "appName",
+ "name": "search",
"schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "description",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "projectId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "environmentId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "limit",
- "schema": {
- "default": 20,
- "type": "number"
- }
- },
- {
- "in": "query",
- "name": "offset",
- "schema": {
- "default": 0,
- "type": "number"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.create": {
- "post": {
- "operationId": "redis-create",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- },
- "databasePassword": {
- "type": "string"
- },
- "dockerImage": {
- "default": "redis:8",
- "type": "string"
- },
- "environmentId": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "name",
- "databasePassword",
- "environmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.one": {
- "get": {
- "operationId": "redis-one",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "redisId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.start": {
- "post": {
- "operationId": "redis-start",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.reload": {
- "post": {
- "operationId": "redis-reload",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- }
- },
- "required": [
- "redisId",
- "appName"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.stop": {
- "post": {
- "operationId": "redis-stop",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.saveExternalPort": {
- "post": {
- "operationId": "redis-saveExternalPort",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "externalPort": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "redisId",
- "externalPort"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.deploy": {
- "post": {
- "operationId": "redis-deploy",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.changeStatus": {
- "post": {
- "operationId": "redis-changeStatus",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "applicationStatus": {
- "type": "string",
- "enum": [
- "idle",
- "running",
- "done",
- "error"
- ]
- }
- },
- "required": [
- "redisId",
- "applicationStatus"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.remove": {
- "post": {
- "operationId": "redis-remove",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.saveEnvironment": {
- "post": {
- "operationId": "redis-saveEnvironment",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "redisId",
- "env"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.update": {
- "post": {
- "operationId": "redis-update",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "databasePassword": {
- "type": "string"
- },
- "dockerImage": {
- "default": "redis:8",
- "type": "string"
- },
- "command": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "args": {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- {
- "type": "null"
- }
- ]
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "memoryReservation": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "memoryLimit": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "cpuReservation": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "cpuLimit": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "externalPort": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "createdAt": {
- "type": "string"
- },
- "applicationStatus": {
- "type": "string",
- "enum": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "healthCheckSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Test": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "Interval": {
- "type": "number"
- },
- "Timeout": {
- "type": "number"
- },
- "StartPeriod": {
- "type": "number"
- },
- "Retries": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "restartPolicySwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Condition": {
- "type": "string"
- },
- "Delay": {
- "type": "number"
- },
- "MaxAttempts": {
- "type": "number"
- },
- "Window": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "placementSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Constraints": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "Preferences": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Spread": {
- "type": "object",
- "properties": {
- "SpreadDescriptor": {
- "type": "string"
- }
- },
- "required": [
- "SpreadDescriptor"
- ]
- }
- },
- "required": [
- "Spread"
- ],
- "additionalProperties": false
- }
- },
- "MaxReplicas": {
- "type": "number"
- },
- "Platforms": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Architecture": {
- "type": "string"
- },
- "OS": {
- "type": "string"
- }
- },
- "required": [
- "Architecture",
- "OS"
- ],
- "additionalProperties": false
- }
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "updateConfigSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Parallelism": {
- "type": "number"
- },
- "Delay": {
- "type": "number"
- },
- "FailureAction": {
- "type": "string"
- },
- "Monitor": {
- "type": "number"
- },
- "MaxFailureRatio": {
- "type": "number"
- },
- "Order": {
- "type": "string"
- }
- },
- "required": [
- "Parallelism",
- "Order"
- ],
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "rollbackConfigSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Parallelism": {
- "type": "number"
- },
- "Delay": {
- "type": "number"
- },
- "FailureAction": {
- "type": "string"
- },
- "Monitor": {
- "type": "number"
- },
- "MaxFailureRatio": {
- "type": "number"
- },
- "Order": {
- "type": "string"
- }
- },
- "required": [
- "Parallelism",
- "Order"
- ],
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "modeSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Replicated": {
- "type": "object",
- "properties": {
- "Replicas": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- "Global": {
- "type": "object",
- "properties": {}
- },
- "ReplicatedJob": {
- "type": "object",
- "properties": {
- "MaxConcurrent": {
- "type": "number"
- },
- "TotalCompletions": {
- "type": "number"
- }
- },
- "additionalProperties": false
- },
- "GlobalJob": {
- "type": "object",
- "properties": {}
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "labelsSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "networkSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Target": {
- "type": "string"
- },
- "Aliases": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "DriverOpts": {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- "additionalProperties": false
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "stopGracePeriodSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "integer",
- "format": "int64"
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "endpointSpecSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "object",
- "properties": {
- "Mode": {
- "type": "string"
- },
- "Ports": {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Protocol": {
- "type": "string"
- },
- "TargetPort": {
- "type": "number"
- },
- "PublishedPort": {
- "type": "number"
- },
- "PublishMode": {
- "type": "string"
- }
- },
- "additionalProperties": false
- }
- }
- },
- "additionalProperties": false
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "ulimitsSwarm": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "Name": {
- "type": "string"
- },
- "Soft": {
- "type": "number"
- },
- "Hard": {
- "type": "number"
- }
- },
- "required": [
- "Name",
- "Soft",
- "Hard"
- ],
- "additionalProperties": false
- }
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "replicas": {
- "type": "number"
- },
- "environmentId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.move": {
- "post": {
- "operationId": "redis-move",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- },
- "targetEnvironmentId": {
- "type": "string"
- }
- },
- "required": [
- "redisId",
- "targetEnvironmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.rebuild": {
- "post": {
- "operationId": "redis-rebuild",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redisId": {
- "type": "string"
- }
- },
- "required": [
- "redisId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redis.search": {
- "get": {
- "operationId": "redis-search",
- "tags": [
- "redis"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "q",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "name",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "description",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "projectId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "environmentId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "limit",
- "schema": {
- "default": 20,
- "type": "number"
- }
- },
- {
- "in": "query",
- "name": "offset",
- "schema": {
- "default": 0,
- "type": "number"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
}
}
],
@@ -11985,10 +22025,14 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"dockerImage": {
"default": "mongo:15",
@@ -12008,10 +22052,12 @@
]
},
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"serverId": {
"anyOf": [
@@ -12117,7 +22163,8 @@
"in": "query",
"name": "mongoId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -12208,7 +22255,8 @@
"type": "object",
"properties": {
"mongoId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -12294,7 +22342,8 @@
"type": "object",
"properties": {
"mongoId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -12662,7 +22711,10 @@
"type": "string"
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
}
},
"required": [
@@ -12749,7 +22801,8 @@
"type": "object",
"properties": {
"mongoId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -12932,13 +22985,18 @@
"type": "object",
"properties": {
"mongoId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"description": {
"anyOf": [
@@ -12951,13 +23009,14 @@
]
},
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"dockerImage": {
- "default": "mongo:15",
"type": "string"
},
"command": {
@@ -13395,8 +23454,7 @@
{
"anyOf": [
{
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
{
"type": "null"
@@ -13462,13 +23520,18 @@
"type": "object",
"properties": {
"Name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"Soft": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
},
"Hard": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
}
},
"required": [
@@ -13508,6 +23571,22 @@
"type": "null"
}
]
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
}
},
"required": [
@@ -13573,6 +23652,99 @@
}
}
},
+ "/mongo.changePassword": {
+ "post": {
+ "operationId": "mongo-changePassword",
+ "tags": [
+ "mongo"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mongoId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ }
+ },
+ "required": [
+ "mongoId",
+ "password"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/mongo.move": {
"post": {
"operationId": "mongo-move",
@@ -13808,7 +23980,9 @@
"name": "limit",
"schema": {
"default": 20,
- "type": "number"
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
}
},
{
@@ -13816,7 +23990,8 @@
"name": "offset",
"schema": {
"default": 0,
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
}
],
@@ -13886,11 +24061,871 @@
}
}
},
- "/mariadb.create": {
- "post": {
- "operationId": "mariadb-create",
+ "/mongo.readLogs": {
+ "get": {
+ "operationId": "mongo-readLogs",
"tags": [
- "mariadb"
+ "mongo"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "mongoId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.create": {
+ "post": {
+ "operationId": "mounts-create",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "bind",
+ "volume",
+ "file"
+ ]
+ },
+ "hostPath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "volumeName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "content": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mountPath": {
+ "type": "string",
+ "minLength": 1
+ },
+ "filePath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceType": {
+ "type": "string",
+ "enum": [
+ "application",
+ "postgres",
+ "mysql",
+ "mariadb",
+ "mongo",
+ "redis",
+ "compose",
+ "libsql"
+ ]
+ },
+ "serviceId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "type",
+ "mountPath",
+ "serviceId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.remove": {
+ "post": {
+ "operationId": "mounts-remove",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mountId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "mountId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.one": {
+ "get": {
+ "operationId": "mounts-one",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "mountId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.update": {
+ "post": {
+ "operationId": "mounts-update",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mountId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "bind",
+ "volume",
+ "file"
+ ]
+ },
+ "hostPath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "volumeName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "filePath": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "content": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serviceType": {
+ "type": "string",
+ "enum": [
+ "application",
+ "postgres",
+ "mysql",
+ "mariadb",
+ "mongo",
+ "redis",
+ "compose",
+ "libsql"
+ ]
+ },
+ "mountPath": {
+ "type": "string",
+ "minLength": 1
+ },
+ "applicationId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "composeId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "libsqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mariadbId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mongoId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "mysqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "postgresId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "redisId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "mountId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.allNamedByApplicationId": {
+ "get": {
+ "operationId": "mounts-allNamedByApplicationId",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "applicationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mounts.listByServiceId": {
+ "get": {
+ "operationId": "mounts-listByServiceId",
+ "tags": [
+ "mounts"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serviceType",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "serviceId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mysql.create": {
+ "post": {
+ "operationId": "mysql-create",
+ "tags": [
+ "mysql"
],
"security": [
{
@@ -13906,16 +24941,17 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"dockerImage": {
- "default": "mariadb:6",
- "type": "string"
- },
- "databaseRootPassword": {
+ "default": "mysql:8",
"type": "string"
},
"environmentId": {
@@ -13932,13 +24968,20 @@
]
},
"databaseName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "databaseRootPassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"serverId": {
"anyOf": [
@@ -14018,11 +25061,11 @@
}
}
},
- "/mariadb.one": {
+ "/mysql.one": {
"get": {
- "operationId": "mariadb-one",
+ "operationId": "mysql-one",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14032,9 +25075,10 @@
"parameters": [
{
"in": "query",
- "name": "mariadbId",
+ "name": "mysqlId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -14105,11 +25149,11 @@
}
}
},
- "/mariadb.start": {
+ "/mysql.start": {
"post": {
- "operationId": "mariadb-start",
+ "operationId": "mysql-start",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14124,12 +25168,13 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
- "type": "string"
+ "mysqlId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "mariadbId"
+ "mysqlId"
]
}
}
@@ -14191,11 +25236,11 @@
}
}
},
- "/mariadb.stop": {
+ "/mysql.stop": {
"post": {
- "operationId": "mariadb-stop",
+ "operationId": "mysql-stop",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14210,12 +25255,13 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
- "type": "string"
+ "mysqlId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "mariadbId"
+ "mysqlId"
]
}
}
@@ -14277,11 +25323,11 @@
}
}
},
- "/mariadb.saveExternalPort": {
+ "/mysql.saveExternalPort": {
"post": {
- "operationId": "mariadb-saveExternalPort",
+ "operationId": "mysql-saveExternalPort",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14296,7 +25342,7 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
+ "mysqlId": {
"type": "string"
},
"externalPort": {
@@ -14311,7 +25357,7 @@
}
},
"required": [
- "mariadbId",
+ "mysqlId",
"externalPort"
]
}
@@ -14374,11 +25420,11 @@
}
}
},
- "/mariadb.deploy": {
+ "/mysql.deploy": {
"post": {
- "operationId": "mariadb-deploy",
+ "operationId": "mysql-deploy",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14393,12 +25439,12 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
+ "mysqlId": {
"type": "string"
}
},
"required": [
- "mariadbId"
+ "mysqlId"
]
}
}
@@ -14460,11 +25506,11 @@
}
}
},
- "/mariadb.changeStatus": {
+ "/mysql.changeStatus": {
"post": {
- "operationId": "mariadb-changeStatus",
+ "operationId": "mysql-changeStatus",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14479,7 +25525,7 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
+ "mysqlId": {
"type": "string"
},
"applicationStatus": {
@@ -14493,7 +25539,7 @@
}
},
"required": [
- "mariadbId",
+ "mysqlId",
"applicationStatus"
]
}
@@ -14556,11 +25602,11 @@
}
}
},
- "/mariadb.remove": {
+ "/mysql.reload": {
"post": {
- "operationId": "mariadb-remove",
+ "operationId": "mysql-reload",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14575,198 +25621,18 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
- "type": "string"
- }
- },
- "required": [
- "mariadbId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mariadb.saveEnvironment": {
- "post": {
- "operationId": "mariadb-saveEnvironment",
- "tags": [
- "mariadb"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mariadbId": {
- "type": "string"
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "mariadbId",
- "env"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mariadb.reload": {
- "post": {
- "operationId": "mariadb-reload",
- "tags": [
- "mariadb"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mariadbId": {
+ "mysqlId": {
"type": "string"
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
}
},
"required": [
- "mariadbId",
+ "mysqlId",
"appName"
]
}
@@ -14829,11 +25695,11 @@
}
}
},
- "/mariadb.update": {
+ "/mysql.remove": {
"post": {
- "operationId": "mariadb-update",
+ "operationId": "mysql-remove",
"tags": [
- "mariadb"
+ "mysql"
],
"security": [
{
@@ -14848,14 +25714,203 @@
"schema": {
"type": "object",
"properties": {
- "mariadbId": {
+ "mysqlId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "mysqlId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mysql.saveEnvironment": {
+ "post": {
+ "operationId": "mysql-saveEnvironment",
+ "tags": [
+ "mysql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mysqlId": {
"type": "string"
},
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "mysqlId",
+ "env"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/mysql.update": {
+ "post": {
+ "operationId": "mysql-update",
+ "tags": [
+ "mysql"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "mysqlId": {
+ "type": "string",
+ "minLength": 1
+ },
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"appName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
},
"description": {
"anyOf": [
@@ -14868,19 +25923,22 @@
]
},
"databaseName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databaseUser": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"databasePassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"databaseRootPassword": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
"dockerImage": {
- "default": "mariadb:6",
"type": "string"
},
"command": {
@@ -15318,8 +26376,7 @@
{
"anyOf": [
{
- "type": "integer",
- "format": "int64"
+ "type": "number"
},
{
"type": "null"
@@ -15385,13 +26442,18 @@
"type": "object",
"properties": {
"Name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"Soft": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
},
"Hard": {
- "type": "number"
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
}
},
"required": [
@@ -15420,914 +26482,8 @@
},
"environmentId": {
"type": "string"
- }
- },
- "required": [
- "mariadbId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mariadb.move": {
- "post": {
- "operationId": "mariadb-move",
- "tags": [
- "mariadb"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mariadbId": {
- "type": "string"
},
- "targetEnvironmentId": {
- "type": "string"
- }
- },
- "required": [
- "mariadbId",
- "targetEnvironmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mariadb.rebuild": {
- "post": {
- "operationId": "mariadb-rebuild",
- "tags": [
- "mariadb"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mariadbId": {
- "type": "string"
- }
- },
- "required": [
- "mariadbId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mariadb.search": {
- "get": {
- "operationId": "mariadb-search",
- "tags": [
- "mariadb"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "q",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "name",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "description",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "projectId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "environmentId",
- "schema": {
- "type": "string"
- }
- },
- {
- "in": "query",
- "name": "limit",
- "schema": {
- "default": 20,
- "type": "number"
- }
- },
- {
- "in": "query",
- "name": "offset",
- "schema": {
- "default": 0,
- "type": "number"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.create": {
- "post": {
- "operationId": "compose-create",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "environmentId": {
- "type": "string"
- },
- "composeType": {
- "type": "string",
- "enum": [
- "docker-compose",
- "stack"
- ]
- },
- "appName": {
- "type": "string"
- },
- "serverId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "composeFile": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "environmentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.one": {
- "get": {
- "operationId": "compose-one",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.update": {
- "post": {
- "operationId": "compose-update",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "appName": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "env": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "composeFile": {
- "type": "string"
- },
- "refreshToken": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "sourceType": {
- "type": "string",
- "enum": [
- "git",
- "github",
- "gitlab",
- "bitbucket",
- "gitea",
- "raw"
- ]
- },
- "composeType": {
- "type": "string",
- "enum": [
- "docker-compose",
- "stack"
- ]
- },
- "repository": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "owner": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "branch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "autoDeploy": {
- "anyOf": [
- {
- "type": "boolean"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabProjectId": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabRepository": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabOwner": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabPathNamespace": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "bitbucketRepository": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "bitbucketRepositorySlug": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "bitbucketOwner": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "bitbucketBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "giteaRepository": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "giteaOwner": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "giteaBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "customGitUrl": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "customGitBranch": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "customGitSSHKeyId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "command": {
- "type": "string"
- },
- "enableSubmodules": {
- "type": "boolean"
- },
- "composePath": {
- "type": "string"
- },
- "suffix": {
- "type": "string"
- },
- "randomize": {
- "type": "boolean"
- },
- "isolatedDeployment": {
- "type": "boolean"
- },
- "isolatedDeploymentsVolume": {
- "type": "boolean"
- },
- "triggerType": {
- "anyOf": [
- {
- "type": "string",
- "enum": [
- "push",
- "tag"
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "composeStatus": {
- "type": "string",
- "enum": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "environmentId": {
- "type": "string"
- },
- "createdAt": {
- "type": "string"
- },
- "watchPaths": {
+ "networkIds": {
"anyOf": [
{
"type": "array",
@@ -16340,139 +26496,12 @@
}
]
},
- "githubId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "gitlabId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "bitbucketId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "giteaId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.delete": {
- "post": {
- "operationId": "compose-delete",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- },
- "deleteVolumes": {
+ "detachDokployNetwork": {
"type": "boolean"
}
},
"required": [
- "composeId",
- "deleteVolumes"
+ "mysqlId"
]
}
}
@@ -16534,11 +26563,11 @@
}
}
},
- "/compose.cleanQueues": {
+ "/mysql.changePassword": {
"post": {
- "operationId": "compose-cleanQueues",
+ "operationId": "mysql-changePassword",
"tags": [
- "compose"
+ "mysql"
],
"security": [
{
@@ -16553,642 +26582,27 @@
"schema": {
"type": "object",
"properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.clearDeployments": {
- "post": {
- "operationId": "compose-clearDeployments",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.killBuild": {
- "post": {
- "operationId": "compose-killBuild",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.loadServices": {
- "get": {
- "operationId": "compose-loadServices",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "type",
- "schema": {
- "default": "cache",
- "type": "string",
- "enum": [
- "fetch",
- "cache"
- ]
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.loadMountsByService": {
- "get": {
- "operationId": "compose-loadMountsByService",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serviceName",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.fetchSourceType": {
- "post": {
- "operationId": "compose-fetchSourceType",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.randomizeCompose": {
- "post": {
- "operationId": "compose-randomizeCompose",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
+ "mysqlId": {
+ "type": "string",
+ "minLength": 1
},
- "suffix": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.isolatedDeployment": {
- "post": {
- "operationId": "compose-isolatedDeployment",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
+ "password": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
},
- "suffix": {
- "type": "string"
+ "type": {
+ "default": "user",
+ "type": "string",
+ "enum": [
+ "user",
+ "root"
+ ]
}
},
"required": [
- "composeId"
+ "mysqlId",
+ "password"
]
}
}
@@ -17250,98 +26664,11 @@
}
}
},
- "/compose.getConvertedCompose": {
- "get": {
- "operationId": "compose-getConvertedCompose",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.deploy": {
+ "/mysql.move": {
"post": {
- "operationId": "compose-deploy",
+ "operationId": "mysql-move",
"tags": [
- "compose"
+ "mysql"
],
"security": [
{
@@ -17356,890 +26683,7 @@
"schema": {
"type": "object",
"properties": {
- "composeId": {
- "type": "string"
- },
- "title": {
- "type": "string"
- },
- "description": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.redeploy": {
- "post": {
- "operationId": "compose-redeploy",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- },
- "title": {
- "type": "string"
- },
- "description": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.stop": {
- "post": {
- "operationId": "compose-stop",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.start": {
- "post": {
- "operationId": "compose-start",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.getDefaultCommand": {
- "get": {
- "operationId": "compose-getDefaultCommand",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.refreshToken": {
- "post": {
- "operationId": "compose-refreshToken",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.deployTemplate": {
- "post": {
- "operationId": "compose-deployTemplate",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "environmentId": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- },
- "id": {
- "type": "string"
- },
- "baseUrl": {
- "type": "string"
- }
- },
- "required": [
- "environmentId",
- "id"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.templates": {
- "get": {
- "operationId": "compose-templates",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "baseUrl",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.getTags": {
- "get": {
- "operationId": "compose-getTags",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "baseUrl",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.disconnectGitProvider": {
- "post": {
- "operationId": "compose-disconnectGitProvider",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.move": {
- "post": {
- "operationId": "compose-move",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
+ "mysqlId": {
"type": "string"
},
"targetEnvironmentId": {
@@ -18247,7 +26691,7 @@
}
},
"required": [
- "composeId",
+ "mysqlId",
"targetEnvironmentId"
]
}
@@ -18310,11 +26754,11 @@
}
}
},
- "/compose.processTemplate": {
+ "/mysql.rebuild": {
"post": {
- "operationId": "compose-processTemplate",
+ "operationId": "mysql-rebuild",
"tags": [
- "compose"
+ "mysql"
],
"security": [
{
@@ -18329,16 +26773,12 @@
"schema": {
"type": "object",
"properties": {
- "base64": {
- "type": "string"
- },
- "composeId": {
+ "mysqlId": {
"type": "string"
}
},
"required": [
- "base64",
- "composeId"
+ "mysqlId"
]
}
}
@@ -18400,187 +26840,11 @@
}
}
},
- "/compose.import": {
- "post": {
- "operationId": "compose-import",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "base64": {
- "type": "string"
- },
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "base64",
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.cancelDeployment": {
- "post": {
- "operationId": "compose-cancelDeployment",
- "tags": [
- "compose"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "composeId": {
- "type": "string"
- }
- },
- "required": [
- "composeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/compose.search": {
+ "/mysql.search": {
"get": {
- "operationId": "compose-search",
+ "operationId": "mysql-search",
"tags": [
- "compose"
+ "mysql"
],
"security": [
{
@@ -18635,7 +26899,9 @@
"name": "limit",
"schema": {
"default": 20,
- "type": "number"
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
}
},
{
@@ -18643,7 +26909,8 @@
"name": "offset",
"schema": {
"default": 0,
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
}
],
@@ -18713,88 +26980,11 @@
}
}
},
- "/user.all": {
+ "/mysql.readLogs": {
"get": {
- "operationId": "user-all",
+ "operationId": "mysql-readLogs",
"tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.one": {
- "get": {
- "operationId": "user-one",
- "tags": [
- "user"
+ "mysql"
],
"security": [
{
@@ -18804,242 +26994,39 @@
"parameters": [
{
"in": "query",
- "name": "userId",
+ "name": "mysqlId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
},
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.get": {
- "get": {
- "operationId": "user-get",
- "tags": [
- "user"
- ],
- "security": [
{
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
}
},
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.haveRootAccess": {
- "get": {
- "operationId": "user-haveRootAccess",
- "tags": [
- "user"
- ],
- "security": [
{
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
}
},
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.getBackups": {
- "get": {
- "operationId": "user-getBackups",
- "tags": [
- "user"
- ],
- "security": [
{
- "Authorization": []
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
}
],
"responses": {
@@ -19108,88 +27095,11 @@
}
}
},
- "/user.getServerMetrics": {
- "get": {
- "operationId": "user-getServerMetrics",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.update": {
+ "/notification.createSlack": {
"post": {
- "operationId": "user-update",
+ "operationId": "notification-createSlack",
"tags": [
- "user"
+ "notification"
],
"security": [
{
@@ -19204,1005 +27114,53 @@
"schema": {
"type": "object",
"properties": {
- "id": {
- "type": "string"
- },
- "firstName": {
- "type": "string"
- },
- "lastName": {
- "type": "string"
- },
- "isRegistered": {
+ "appBuildError": {
"type": "boolean"
},
- "expirationDate": {
- "type": "string"
- },
- "createdAt2": {
- "type": "string"
- },
- "createdAt": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "twoFactorEnabled": {
- "anyOf": [
- {
- "type": "boolean"
- },
- {
- "type": "null"
- }
- ]
- },
- "email": {
- "type": "string"
- },
- "emailVerified": {
+ "databaseBackup": {
"type": "boolean"
},
- "image": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "banned": {
- "anyOf": [
- {
- "type": "boolean"
- },
- {
- "type": "null"
- }
- ]
- },
- "banReason": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "banExpires": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "updatedAt": {
- "type": "string"
- },
- "enablePaidFeatures": {
+ "dokployBackup": {
"type": "boolean"
},
- "allowImpersonation": {
+ "volumeBackup": {
"type": "boolean"
},
- "enableEnterpriseFeatures": {
+ "dokployRestart": {
"type": "boolean"
},
- "licenseKey": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "stripeCustomerId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "stripeSubscriptionId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serversQuantity": {
- "type": "number"
- },
- "password": {
- "type": "string"
- },
- "currentPassword": {
- "type": "string"
- }
- }
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.getUserByToken": {
- "get": {
- "operationId": "user-getUserByToken",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "token",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.getMetricsToken": {
- "get": {
- "operationId": "user-getMetricsToken",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.remove": {
- "post": {
- "operationId": "user-remove",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "userId": {
- "type": "string"
- }
- },
- "required": [
- "userId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.assignPermissions": {
- "post": {
- "operationId": "user-assignPermissions",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "accessedProjects": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "accessedEnvironments": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "accessedServices": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "canCreateProjects": {
- "type": "boolean"
- },
- "canCreateServices": {
- "type": "boolean"
- },
- "canDeleteProjects": {
- "type": "boolean"
- },
- "canDeleteServices": {
- "type": "boolean"
- },
- "canAccessToDocker": {
- "type": "boolean"
- },
- "canAccessToTraefikFiles": {
- "type": "boolean"
- },
- "canAccessToAPI": {
- "type": "boolean"
- },
- "canAccessToSSHKeys": {
- "type": "boolean"
- },
- "canAccessToGitProviders": {
- "type": "boolean"
- },
- "canDeleteEnvironments": {
- "type": "boolean"
- },
- "canCreateEnvironments": {
- "type": "boolean"
- }
- },
- "required": [
- "id",
- "accessedProjects",
- "accessedEnvironments",
- "accessedServices",
- "canCreateProjects",
- "canCreateServices",
- "canDeleteProjects",
- "canDeleteServices",
- "canAccessToDocker",
- "canAccessToTraefikFiles",
- "canAccessToAPI",
- "canAccessToSSHKeys",
- "canAccessToGitProviders",
- "canDeleteEnvironments",
- "canCreateEnvironments"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.getInvitations": {
- "get": {
- "operationId": "user-getInvitations",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.getContainerMetrics": {
- "get": {
- "operationId": "user-getContainerMetrics",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "url",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "token",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "appName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "dataPoints",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.generateToken": {
- "post": {
- "operationId": "user-generateToken",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.deleteApiKey": {
- "post": {
- "operationId": "user-deleteApiKey",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "apiKeyId": {
- "type": "string"
- }
- },
- "required": [
- "apiKeyId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/user.createApiKey": {
- "post": {
- "operationId": "user-createApiKey",
- "tags": [
- "user"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
"name": {
"type": "string"
},
- "prefix": {
- "type": "string"
- },
- "expiresIn": {
- "type": "number"
- },
- "metadata": {
- "type": "object",
- "properties": {
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "organizationId"
- ]
- },
- "rateLimitEnabled": {
+ "appDeploy": {
"type": "boolean"
},
- "rateLimitTimeWindow": {
- "type": "number"
+ "dockerCleanup": {
+ "type": "boolean"
},
- "rateLimitMax": {
- "type": "number"
+ "serverThreshold": {
+ "type": "boolean"
},
- "remaining": {
- "type": "number"
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
},
- "refillAmount": {
- "type": "number"
- },
- "refillInterval": {
- "type": "number"
+ "channel": {
+ "type": "string"
}
},
"required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
"name",
- "metadata"
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "webhookUrl",
+ "channel"
]
}
}
@@ -20264,27 +27222,78 @@
}
}
},
- "/user.checkUserOrganizations": {
- "get": {
- "operationId": "user-checkUserOrganizations",
+ "/notification.updateSlack": {
+ "post": {
+ "operationId": "notification-updateSlack",
"tags": [
- "user"
+ "notification"
],
"security": [
{
"Authorization": []
}
],
- "parameters": [
- {
- "in": "query",
- "name": "userId",
- "schema": {
- "type": "string"
- },
- "required": true
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "channel": {
+ "type": "string"
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "slackId": {
+ "type": "string"
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "slackId"
+ ]
+ }
+ }
}
- ],
+ },
"responses": {
"200": {
"description": "Successful response",
@@ -20328,12 +27337,93 @@
}
}
},
- "404": {
- "description": "Not found",
+ "500": {
+ "description": "Internal server error",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testSlackConnection": {
+ "post": {
+ "operationId": "notification-testSlackConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "channel": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "webhookUrl",
+ "channel"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
}
}
}
@@ -20351,11 +27441,11 @@
}
}
},
- "/user.sendInvitation": {
+ "/notification.createTelegram": {
"post": {
- "operationId": "user-sendInvitation",
+ "operationId": "notification-createTelegram",
"tags": [
- "user"
+ "notification"
],
"security": [
{
@@ -20370,15 +27460,1507 @@
"schema": {
"type": "object",
"properties": {
- "invitationId": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
"type": "string"
},
- "notificationId": {
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "botToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "chatId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "messageThreadId": {
"type": "string"
}
},
"required": [
- "invitationId",
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "botToken",
+ "chatId",
+ "messageThreadId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateTelegram": {
+ "post": {
+ "operationId": "notification-updateTelegram",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "botToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "chatId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "messageThreadId": {
+ "type": "string"
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "telegramId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "telegramId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testTelegramConnection": {
+ "post": {
+ "operationId": "notification-testTelegramConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "botToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "chatId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "messageThreadId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "botToken",
+ "chatId",
+ "messageThreadId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createDiscord": {
+ "post": {
+ "operationId": "notification-createDiscord",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "webhookUrl",
+ "decoration"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateDiscord": {
+ "post": {
+ "operationId": "notification-updateDiscord",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "discordId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "discordId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testDiscordConnection": {
+ "post": {
+ "operationId": "notification-testDiscordConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createEmail": {
+ "post": {
+ "operationId": "notification-createEmail",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "smtpServer": {
+ "type": "string",
+ "minLength": 1
+ },
+ "smtpPort": {
+ "type": "number",
+ "minimum": 1
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "smtpServer",
+ "smtpPort",
+ "username",
+ "password",
+ "fromAddress",
+ "toAddresses"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateEmail": {
+ "post": {
+ "operationId": "notification-updateEmail",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "smtpServer": {
+ "type": "string",
+ "minLength": 1
+ },
+ "smtpPort": {
+ "type": "number",
+ "minimum": 1
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "emailId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "emailId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testEmailConnection": {
+ "post": {
+ "operationId": "notification-testEmailConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "smtpServer": {
+ "type": "string",
+ "minLength": 1
+ },
+ "smtpPort": {
+ "type": "number",
+ "minimum": 1
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "smtpServer",
+ "smtpPort",
+ "username",
+ "password",
+ "toAddresses",
+ "fromAddress"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createResend": {
+ "post": {
+ "operationId": "notification-createResend",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "apiKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "apiKey",
+ "fromAddress",
+ "toAddresses"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateResend": {
+ "post": {
+ "operationId": "notification-updateResend",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "apiKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "resendId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "resendId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testResendConnection": {
+ "post": {
+ "operationId": "notification-testResendConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "apiKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "fromAddress": {
+ "type": "string",
+ "minLength": 1
+ },
+ "toAddresses": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "apiKey",
+ "fromAddress",
+ "toAddresses"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.remove": {
+ "post": {
+ "operationId": "notification-remove",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
"notificationId"
]
}
@@ -20441,11 +29023,176 @@
}
}
},
- "/domain.create": {
- "post": {
- "operationId": "domain-create",
+ "/notification.one": {
+ "get": {
+ "operationId": "notification-one",
"tags": [
- "domain"
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "notificationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.all": {
+ "get": {
+ "operationId": "notification-all",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.receiveNotification": {
+ "post": {
+ "operationId": "notification-receiveNotification",
+ "tags": [
+ "notification"
],
"security": [
{
@@ -20460,121 +29207,44 @@
"schema": {
"type": "object",
"properties": {
- "host": {
- "type": "string"
- },
- "path": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "port": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "https": {
- "type": "boolean"
- },
- "applicationId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "certificateType": {
+ "ServerType": {
+ "default": "Dokploy",
"type": "string",
"enum": [
- "letsencrypt",
- "none",
- "custom"
+ "Dokploy",
+ "Remote"
]
},
- "customCertResolver": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
+ "Type": {
+ "type": "string",
+ "enum": [
+ "Memory",
+ "CPU"
]
},
- "composeId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
+ "Value": {
+ "type": "number"
},
- "serviceName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
+ "Threshold": {
+ "type": "number"
},
- "domainType": {
- "anyOf": [
- {
- "type": "string",
- "enum": [
- "compose",
- "application",
- "preview"
- ]
- },
- {
- "type": "null"
- }
- ]
+ "Message": {
+ "type": "string"
},
- "previewDeploymentId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
+ "Timestamp": {
+ "type": "string"
},
- "internalPath": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "stripPath": {
- "type": "boolean"
+ "Token": {
+ "type": "string"
}
},
"required": [
- "host"
+ "Type",
+ "Value",
+ "Threshold",
+ "Message",
+ "Timestamp",
+ "Token"
]
}
}
@@ -20636,185 +29306,11 @@
}
}
},
- "/domain.byApplicationId": {
- "get": {
- "operationId": "domain-byApplicationId",
- "tags": [
- "domain"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "applicationId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/domain.byComposeId": {
- "get": {
- "operationId": "domain-byComposeId",
- "tags": [
- "domain"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/domain.generateDomain": {
+ "/notification.createGotify": {
"post": {
- "operationId": "domain-generateDomain",
+ "operationId": "notification-createGotify",
"tags": [
- "domain"
+ "notification"
],
"security": [
{
@@ -20829,14 +29325,3901 @@
"schema": {
"type": "object",
"properties": {
- "appName": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
"type": "string"
},
- "serverId": {
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverUrl",
+ "appToken",
+ "priority",
+ "decoration"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateGotify": {
+ "post": {
+ "operationId": "notification-updateGotify",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "gotifyId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
"type": "string"
}
},
"required": [
+ "notificationId",
+ "gotifyId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testGotifyConnection": {
+ "post": {
+ "operationId": "notification-testGotifyConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ },
+ "decoration": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "serverUrl",
+ "appToken",
+ "priority"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createNtfy": {
+ "post": {
+ "operationId": "notification-createNtfy",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "topic": {
+ "type": "string",
+ "minLength": 1
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverUrl",
+ "topic",
+ "accessToken",
+ "priority"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateNtfy": {
+ "post": {
+ "operationId": "notification-updateNtfy",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "topic": {
+ "type": "string",
+ "minLength": 1
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "ntfyId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "ntfyId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testNtfyConnection": {
+ "post": {
+ "operationId": "notification-testNtfyConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "topic": {
+ "type": "string",
+ "minLength": 1
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "priority": {
+ "type": "number",
+ "minimum": 1
+ }
+ },
+ "required": [
+ "serverUrl",
+ "topic",
+ "accessToken",
+ "priority"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createMattermost": {
+ "post": {
+ "operationId": "notification-createMattermost",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "format": "uri"
+ },
+ "channel": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateMattermost": {
+ "post": {
+ "operationId": "notification-updateMattermost",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "format": "uri"
+ },
+ "channel": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "mattermostId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "mattermostId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testMattermostConnection": {
+ "post": {
+ "operationId": "notification-testMattermostConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "webhookUrl": {
+ "type": "string",
+ "format": "uri"
+ },
+ "channel": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createCustom": {
+ "post": {
+ "operationId": "notification-createCustom",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "endpoint": {
+ "type": "string",
+ "minLength": 1
+ },
+ "headers": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "name",
+ "endpoint"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateCustom": {
+ "post": {
+ "operationId": "notification-updateCustom",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "endpoint": {
+ "type": "string",
+ "minLength": 1
+ },
+ "headers": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "customId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "customId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testCustomConnection": {
+ "post": {
+ "operationId": "notification-testCustomConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "endpoint": {
+ "type": "string",
+ "minLength": 1
+ },
+ "headers": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "endpoint"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createLark": {
+ "post": {
+ "operationId": "notification-createLark",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateLark": {
+ "post": {
+ "operationId": "notification-updateLark",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "larkId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "larkId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testLarkConnection": {
+ "post": {
+ "operationId": "notification-testLarkConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createTeams": {
+ "post": {
+ "operationId": "notification-createTeams",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "appBuildError",
+ "databaseBackup",
+ "dokployBackup",
+ "volumeBackup",
+ "dokployRestart",
+ "name",
+ "appDeploy",
+ "dockerCleanup",
+ "serverThreshold",
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updateTeams": {
+ "post": {
+ "operationId": "notification-updateTeams",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "teamsId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "notificationId",
+ "teamsId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testTeamsConnection": {
+ "post": {
+ "operationId": "notification-testTeamsConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "webhookUrl": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "webhookUrl"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.createPushover": {
+ "post": {
+ "operationId": "notification-createPushover",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ },
+ "userKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "apiToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "default": 0,
+ "type": "number",
+ "minimum": -2,
+ "maximum": 2
+ },
+ "retry": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 30
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "expire": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 10800
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "userKey",
+ "apiToken"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.updatePushover": {
+ "post": {
+ "operationId": "notification-updatePushover",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "pushoverId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "organizationId": {
+ "type": "string"
+ },
+ "userKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "apiToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "type": "number",
+ "minimum": -2,
+ "maximum": 2
+ },
+ "retry": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 30
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "expire": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 10800
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "appBuildError": {
+ "type": "boolean"
+ },
+ "databaseBackup": {
+ "type": "boolean"
+ },
+ "dokployBackup": {
+ "type": "boolean"
+ },
+ "volumeBackup": {
+ "type": "boolean"
+ },
+ "dokployRestart": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "appDeploy": {
+ "type": "boolean"
+ },
+ "dockerCleanup": {
+ "type": "boolean"
+ },
+ "serverThreshold": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "notificationId",
+ "pushoverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.testPushoverConnection": {
+ "post": {
+ "operationId": "notification-testPushoverConnection",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "userKey": {
+ "type": "string",
+ "minLength": 1
+ },
+ "apiToken": {
+ "type": "string",
+ "minLength": 1
+ },
+ "priority": {
+ "type": "number",
+ "minimum": -2,
+ "maximum": 2
+ },
+ "retry": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 30
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "expire": {
+ "anyOf": [
+ {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 10800
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "userKey",
+ "apiToken",
+ "priority"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/notification.getEmailProviders": {
+ "get": {
+ "operationId": "notification-getEmailProviders",
+ "tags": [
+ "notification"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/port.create": {
+ "post": {
+ "operationId": "port-create",
+ "tags": [
+ "port"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "publishedPort": {
+ "type": "number"
+ },
+ "publishMode": {
+ "default": "ingress",
+ "type": "string",
+ "enum": [
+ "ingress",
+ "host"
+ ]
+ },
+ "targetPort": {
+ "type": "number"
+ },
+ "protocol": {
+ "default": "tcp",
+ "type": "string",
+ "enum": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "applicationId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "publishedPort",
+ "publishMode",
+ "targetPort",
+ "protocol",
+ "applicationId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/port.one": {
+ "get": {
+ "operationId": "port-one",
+ "tags": [
+ "port"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "portId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/port.delete": {
+ "post": {
+ "operationId": "port-delete",
+ "tags": [
+ "port"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "portId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "portId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/port.update": {
+ "post": {
+ "operationId": "port-update",
+ "tags": [
+ "port"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "portId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "publishedPort": {
+ "type": "number"
+ },
+ "publishMode": {
+ "default": "ingress",
+ "type": "string",
+ "enum": [
+ "ingress",
+ "host"
+ ]
+ },
+ "targetPort": {
+ "type": "number"
+ },
+ "protocol": {
+ "default": "tcp",
+ "type": "string",
+ "enum": [
+ "tcp",
+ "udp"
+ ]
+ }
+ },
+ "required": [
+ "portId",
+ "publishedPort",
+ "publishMode",
+ "targetPort",
+ "protocol"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.create": {
+ "post": {
+ "operationId": "postgres-create",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "databaseName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databaseUser": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databasePassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "dockerImage": {
+ "default": "postgres:18",
+ "type": "string"
+ },
+ "environmentId": {
+ "type": "string"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "databaseName",
+ "databaseUser",
+ "databasePassword",
+ "environmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.one": {
+ "get": {
+ "operationId": "postgres-one",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "postgresId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.start": {
+ "post": {
+ "operationId": "postgres-start",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "postgresId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.stop": {
+ "post": {
+ "operationId": "postgres-stop",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "postgresId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.saveExternalPort": {
+ "post": {
+ "operationId": "postgres-saveExternalPort",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ },
+ "externalPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "postgresId",
+ "externalPort"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.deploy": {
+ "post": {
+ "operationId": "postgres-deploy",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "postgresId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.changeStatus": {
+ "post": {
+ "operationId": "postgres-changeStatus",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ },
+ "applicationStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ }
+ },
+ "required": [
+ "postgresId",
+ "applicationStatus"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.remove": {
+ "post": {
+ "operationId": "postgres-remove",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "postgresId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.saveEnvironment": {
+ "post": {
+ "operationId": "postgres-saveEnvironment",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "postgresId",
+ "env"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.reload": {
+ "post": {
+ "operationId": "postgres-reload",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ }
+ },
+ "required": [
+ "postgresId",
"appName"
]
}
@@ -20899,98 +33282,11 @@
}
}
},
- "/domain.canGenerateTraefikMeDomains": {
- "get": {
- "operationId": "domain-canGenerateTraefikMeDomains",
- "tags": [
- "domain"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/domain.update": {
+ "/postgres.update": {
"post": {
- "operationId": "domain-update",
+ "operationId": "postgres-update",
"tags": [
- "domain"
+ "postgres"
],
"security": [
{
@@ -21005,10 +33301,33 @@
"schema": {
"type": "object",
"properties": {
- "host": {
- "type": "string"
+ "postgresId": {
+ "type": "string",
+ "minLength": 1
},
- "path": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "databaseName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databaseUser": {
+ "type": "string",
+ "minLength": 1
+ },
+ "databasePassword": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ },
+ "description": {
"anyOf": [
{
"type": "string"
@@ -21018,7 +33337,53 @@
}
]
},
- "port": {
+ "dockerImage": {
+ "type": "string"
+ },
+ "command": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "args": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "memoryReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalPort": {
"anyOf": [
{
"type": "number"
@@ -21028,45 +33393,76 @@
}
]
},
- "https": {
- "type": "boolean"
+ "memoryLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
- "certificateType": {
+ "cpuReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cpuLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "applicationStatus": {
"type": "string",
"enum": [
- "letsencrypt",
- "none",
- "custom"
+ "idle",
+ "running",
+ "done",
+ "error"
]
},
- "customCertResolver": {
+ "healthCheckSwarm": {
"anyOf": [
{
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serviceName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "domainType": {
- "anyOf": [
- {
- "type": "string",
- "enum": [
- "compose",
- "application",
- "preview"
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Test": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Interval": {
+ "type": "number"
+ },
+ "Timeout": {
+ "type": "number"
+ },
+ "StartPeriod": {
+ "type": "number"
+ },
+ "Retries": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
]
},
{
@@ -21074,26 +33470,437 @@
}
]
},
- "internalPath": {
+ "restartPolicySwarm": {
"anyOf": [
{
- "type": "string"
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Condition": {
+ "type": "string"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "MaxAttempts": {
+ "type": "number"
+ },
+ "Window": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
},
{
"type": "null"
}
]
},
- "stripPath": {
+ "placementSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Constraints": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Preferences": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Spread": {
+ "type": "object",
+ "properties": {
+ "SpreadDescriptor": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "SpreadDescriptor"
+ ]
+ }
+ },
+ "required": [
+ "Spread"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "MaxReplicas": {
+ "type": "number"
+ },
+ "Platforms": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Architecture": {
+ "type": "string"
+ },
+ "OS": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Architecture",
+ "OS"
+ ],
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "updateConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "rollbackConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "modeSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Replicated": {
+ "type": "object",
+ "properties": {
+ "Replicas": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Global": {
+ "type": "object",
+ "properties": {}
+ },
+ "ReplicatedJob": {
+ "type": "object",
+ "properties": {
+ "MaxConcurrent": {
+ "type": "number"
+ },
+ "TotalCompletions": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "GlobalJob": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "labelsSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "networkSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Target": {
+ "type": "string"
+ },
+ "Aliases": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DriverOpts": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stopGracePeriodSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "endpointSpecSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Mode": {
+ "type": "string"
+ },
+ "Ports": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Protocol": {
+ "type": "string"
+ },
+ "TargetPort": {
+ "type": "number"
+ },
+ "PublishedPort": {
+ "type": "number"
+ },
+ "PublishMode": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "ulimitsSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "Soft": {
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
+ },
+ "Hard": {
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
+ }
+ },
+ "required": [
+ "Name",
+ "Soft",
+ "Hard"
+ ],
+ "additionalProperties": false
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "replicas": {
+ "type": "number"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "environmentId": {
+ "type": "string"
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
"type": "boolean"
- },
- "domainId": {
- "type": "string"
}
},
"required": [
- "host",
- "domainId"
+ "postgresId"
]
}
}
@@ -21155,98 +33962,11 @@
}
}
},
- "/domain.one": {
- "get": {
- "operationId": "domain-one",
- "tags": [
- "domain"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "domainId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/domain.delete": {
+ "/postgres.changePassword": {
"post": {
- "operationId": "domain-delete",
+ "operationId": "postgres-changePassword",
"tags": [
- "domain"
+ "postgres"
],
"security": [
{
@@ -21261,929 +33981,19 @@
"schema": {
"type": "object",
"properties": {
- "domainId": {
- "type": "string"
- }
- },
- "required": [
- "domainId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/domain.validateDomain": {
- "post": {
- "operationId": "domain-validateDomain",
- "tags": [
- "domain"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "domain": {
- "type": "string"
- },
- "serverIp": {
- "type": "string"
- }
- },
- "required": [
- "domain"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.create": {
- "post": {
- "operationId": "destination-create",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "provider": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "accessKey": {
- "type": "string"
- },
- "bucket": {
- "type": "string"
- },
- "region": {
- "type": "string"
- },
- "endpoint": {
- "type": "string"
- },
- "secretAccessKey": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "provider",
- "accessKey",
- "bucket",
- "region",
- "endpoint",
- "secretAccessKey"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.testConnection": {
- "post": {
- "operationId": "destination-testConnection",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "provider": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "accessKey": {
- "type": "string"
- },
- "bucket": {
- "type": "string"
- },
- "region": {
- "type": "string"
- },
- "endpoint": {
- "type": "string"
- },
- "secretAccessKey": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "provider",
- "accessKey",
- "bucket",
- "region",
- "endpoint",
- "secretAccessKey"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.one": {
- "get": {
- "operationId": "destination-one",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "destinationId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.all": {
- "get": {
- "operationId": "destination-all",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.remove": {
- "post": {
- "operationId": "destination-remove",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "destinationId": {
- "type": "string"
- }
- },
- "required": [
- "destinationId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/destination.update": {
- "post": {
- "operationId": "destination-update",
- "tags": [
- "destination"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "accessKey": {
- "type": "string"
- },
- "bucket": {
- "type": "string"
- },
- "region": {
- "type": "string"
- },
- "endpoint": {
- "type": "string"
- },
- "secretAccessKey": {
- "type": "string"
- },
- "destinationId": {
- "type": "string"
- },
- "provider": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "accessKey",
- "bucket",
- "region",
- "endpoint",
- "secretAccessKey",
- "destinationId",
- "provider"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.create": {
- "post": {
- "operationId": "backup-create",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "schedule": {
- "type": "string"
- },
- "enabled": {
- "anyOf": [
- {
- "type": "boolean"
- },
- {
- "type": "null"
- }
- ]
- },
- "prefix": {
- "type": "string"
- },
- "destinationId": {
- "type": "string"
- },
- "keepLatestCount": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "database": {
- "type": "string"
- },
- "mariadbId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mysqlId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
"postgresId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mongoId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "databaseType": {
"type": "string",
- "enum": [
- "postgres",
- "mariadb",
- "mysql",
- "mongo",
- "web-server"
- ]
+ "minLength": 1
},
- "userId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "backupType": {
+ "password": {
"type": "string",
- "enum": [
- "database",
- "compose"
- ]
- },
- "composeId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serviceName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "metadata": {
- "anyOf": [
- {},
- {
- "type": "null"
- }
- ]
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
}
},
"required": [
- "schedule",
- "prefix",
- "destinationId",
- "database",
- "databaseType"
+ "postgresId",
+ "password"
]
}
}
@@ -22245,11 +34055,187 @@
}
}
},
- "/backup.one": {
- "get": {
- "operationId": "backup-one",
+ "/postgres.move": {
+ "post": {
+ "operationId": "postgres-move",
"tags": [
- "backup"
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ },
+ "targetEnvironmentId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "postgresId",
+ "targetEnvironmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.rebuild": {
+ "post": {
+ "operationId": "postgres-rebuild",
+ "tags": [
+ "postgres"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "postgresId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "postgresId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/postgres.search": {
+ "get": {
+ "operationId": "postgres-search",
+ "tags": [
+ "postgres"
],
"security": [
{
@@ -22259,11 +34245,64 @@
"parameters": [
{
"in": "query",
- "name": "backupId",
+ "name": "q",
"schema": {
"type": "string"
- },
- "required": true
+ }
+ },
+ {
+ "in": "query",
+ "name": "name",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "description",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "projectId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "environmentId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "schema": {
+ "default": 20,
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ {
+ "in": "query",
+ "name": "offset",
+ "schema": {
+ "default": 0,
+ "type": "number",
+ "minimum": 0
+ }
}
],
"responses": {
@@ -22332,768 +34371,11 @@
}
}
},
- "/backup.update": {
- "post": {
- "operationId": "backup-update",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "schedule": {
- "type": "string"
- },
- "enabled": {
- "anyOf": [
- {
- "type": "boolean"
- },
- {
- "type": "null"
- }
- ]
- },
- "prefix": {
- "type": "string"
- },
- "backupId": {
- "type": "string"
- },
- "destinationId": {
- "type": "string"
- },
- "database": {
- "type": "string"
- },
- "keepLatestCount": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "serviceName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "metadata": {
- "anyOf": [
- {},
- {
- "type": "null"
- }
- ]
- },
- "databaseType": {
- "type": "string",
- "enum": [
- "postgres",
- "mariadb",
- "mysql",
- "mongo",
- "web-server"
- ]
- }
- },
- "required": [
- "schedule",
- "enabled",
- "prefix",
- "backupId",
- "destinationId",
- "database",
- "keepLatestCount",
- "serviceName",
- "metadata",
- "databaseType"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.remove": {
- "post": {
- "operationId": "backup-remove",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupPostgres": {
- "post": {
- "operationId": "backup-manualBackupPostgres",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupMySql": {
- "post": {
- "operationId": "backup-manualBackupMySql",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupMariadb": {
- "post": {
- "operationId": "backup-manualBackupMariadb",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupCompose": {
- "post": {
- "operationId": "backup-manualBackupCompose",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupMongo": {
- "post": {
- "operationId": "backup-manualBackupMongo",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.manualBackupWebServer": {
- "post": {
- "operationId": "backup-manualBackupWebServer",
- "tags": [
- "backup"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "backupId": {
- "type": "string"
- }
- },
- "required": [
- "backupId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/backup.listBackupFiles": {
+ "/postgres.readLogs": {
"get": {
- "operationId": "backup-listBackupFiles",
+ "operationId": "postgres-readLogs",
"tags": [
- "backup"
+ "postgres"
],
"security": [
{
@@ -23103,545 +34385,39 @@
"parameters": [
{
"in": "query",
- "name": "destinationId",
+ "name": "postgresId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
{
"in": "query",
"name": "search",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.all": {
- "get": {
- "operationId": "deployment-all",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "applicationId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.allByCompose": {
- "get": {
- "operationId": "deployment-allByCompose",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "composeId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.allByServer": {
- "get": {
- "operationId": "deployment-allByServer",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.allCentralized": {
- "get": {
- "operationId": "deployment-allCentralized",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.queueList": {
- "get": {
- "operationId": "deployment-queueList",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.allByType": {
- "get": {
- "operationId": "deployment-allByType",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "id",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "type",
"schema": {
"type": "string",
- "enum": [
- "application",
- "compose",
- "server",
- "schedule",
- "previewDeployment",
- "backup",
- "volumeBackup"
- ]
- },
- "required": true
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
}
],
"responses": {
@@ -23710,178 +34486,6 @@
}
}
},
- "/deployment.killProcess": {
- "post": {
- "operationId": "deployment-killProcess",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "deploymentId": {
- "type": "string"
- }
- },
- "required": [
- "deploymentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/deployment.removeDeployment": {
- "post": {
- "operationId": "deployment-removeDeployment",
- "tags": [
- "deployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "deploymentId": {
- "type": "string"
- }
- },
- "required": [
- "deploymentId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
"/previewDeployment.all": {
"get": {
"operationId": "previewDeployment-all",
@@ -23897,6 +34501,94 @@
{
"in": "query",
"name": "applicationId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/previewDeployment.one": {
+ "get": {
+ "operationId": "previewDeployment-one",
+ "tags": [
+ "previewDeployment"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "previewDeploymentId",
"schema": {
"type": "string"
},
@@ -24055,93 +34747,6 @@
}
}
},
- "/previewDeployment.one": {
- "get": {
- "operationId": "previewDeployment-one",
- "tags": [
- "previewDeployment"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "previewDeploymentId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
"/previewDeployment.redeploy": {
"post": {
"operationId": "previewDeployment-redeploy",
@@ -24234,11 +34839,11 @@
}
}
},
- "/mounts.create": {
+ "/project.create": {
"post": {
- "operationId": "mounts-create",
+ "operationId": "project-create",
"tags": [
- "mounts"
+ "project"
],
"security": [
{
@@ -24253,15 +34858,11 @@
"schema": {
"type": "object",
"properties": {
- "type": {
+ "name": {
"type": "string",
- "enum": [
- "bind",
- "volume",
- "file"
- ]
+ "minLength": 1
},
- "hostPath": {
+ "description": {
"anyOf": [
{
"type": "string"
@@ -24271,59 +34872,12 @@
}
]
},
- "volumeName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "content": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mountPath": {
- "type": "string"
- },
- "serviceType": {
- "type": "string",
- "enum": [
- "application",
- "postgres",
- "mysql",
- "mariadb",
- "mongo",
- "redis",
- "compose"
- ]
- },
- "filePath": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serviceId": {
+ "env": {
"type": "string"
}
},
"required": [
- "type",
- "mountPath",
- "serviceId"
+ "name"
]
}
}
@@ -24385,97 +34939,11 @@
}
}
},
- "/mounts.remove": {
- "post": {
- "operationId": "mounts-remove",
- "tags": [
- "mounts"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mountId": {
- "type": "string"
- }
- },
- "required": [
- "mountId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mounts.one": {
+ "/project.one": {
"get": {
- "operationId": "mounts-one",
+ "operationId": "project-one",
"tags": [
- "mounts"
+ "project"
],
"security": [
{
@@ -24485,419 +34953,10 @@
"parameters": [
{
"in": "query",
- "name": "mountId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mounts.update": {
- "post": {
- "operationId": "mounts-update",
- "tags": [
- "mounts"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "mountId": {
- "type": "string"
- },
- "type": {
- "type": "string",
- "enum": [
- "bind",
- "volume",
- "file"
- ]
- },
- "hostPath": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "volumeName": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "filePath": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "content": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serviceType": {
- "type": "string",
- "enum": [
- "application",
- "postgres",
- "mysql",
- "mariadb",
- "mongo",
- "redis",
- "compose"
- ]
- },
- "mountPath": {
- "type": "string"
- },
- "applicationId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "postgresId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mariadbId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mongoId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "mysqlId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "redisId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "composeId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "mountId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mounts.allNamedByApplicationId": {
- "get": {
- "operationId": "mounts-allNamedByApplicationId",
- "tags": [
- "mounts"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "applicationId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/mounts.listByServiceId": {
- "get": {
- "operationId": "mounts-listByServiceId",
- "tags": [
- "mounts"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serviceId",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "serviceType",
+ "name": "projectId",
"schema": {
"type": "string",
- "enum": [
- "application",
- "postgres",
- "mysql",
- "mariadb",
- "mongo",
- "redis",
- "compose"
- ]
+ "minLength": 1
},
"required": true
}
@@ -24968,11 +35027,361 @@
}
}
},
- "/certificates.create": {
- "post": {
- "operationId": "certificates-create",
+ "/project.all": {
+ "get": {
+ "operationId": "project-all",
"tags": [
- "certificates"
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.allForPermissions": {
+ "get": {
+ "operationId": "project-allForPermissions",
+ "tags": [
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.homeStats": {
+ "get": {
+ "operationId": "project-homeStats",
+ "tags": [
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.search": {
+ "get": {
+ "operationId": "project-search",
+ "tags": [
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "q",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "name",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "description",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "schema": {
+ "default": 20,
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ {
+ "in": "query",
+ "name": "offset",
+ "schema": {
+ "default": 0,
+ "type": "number",
+ "minimum": 0
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.remove": {
+ "post": {
+ "operationId": "project-remove",
+ "tags": [
+ "project"
],
"security": [
{
@@ -24987,34 +35396,738 @@
"schema": {
"type": "object",
"properties": {
- "certificateId": {
+ "projectId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "projectId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.update": {
+ "post": {
+ "operationId": "project-update",
+ "tags": [
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "projectId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "organizationId": {
+ "type": "string"
+ },
+ "env": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "projectId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/project.duplicate": {
+ "post": {
+ "operationId": "project-duplicate",
+ "tags": [
+ "project"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "sourceEnvironmentId": {
"type": "string"
},
"name": {
"type": "string"
},
- "certificateData": {
+ "description": {
"type": "string"
},
- "privateKey": {
+ "includeServices": {
+ "default": true,
+ "type": "boolean"
+ },
+ "selectedServices": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "application",
+ "compose",
+ "libsql",
+ "mariadb",
+ "mongo",
+ "mysql",
+ "postgres",
+ "redis"
+ ]
+ }
+ },
+ "required": [
+ "id",
+ "type"
+ ]
+ }
+ },
+ "duplicateInSameProject": {
+ "default": false,
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "sourceEnvironmentId",
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redirects.create": {
+ "post": {
+ "operationId": "redirects-create",
+ "tags": [
+ "redirects"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "regex": {
+ "type": "string",
+ "minLength": 1
+ },
+ "replacement": {
+ "type": "string",
+ "minLength": 1
+ },
+ "permanent": {
+ "type": "boolean"
+ },
+ "applicationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "regex",
+ "replacement",
+ "permanent",
+ "applicationId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redirects.one": {
+ "get": {
+ "operationId": "redirects-one",
+ "tags": [
+ "redirects"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "redirectId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redirects.delete": {
+ "post": {
+ "operationId": "redirects-delete",
+ "tags": [
+ "redirects"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redirectId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "redirectId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redirects.update": {
+ "post": {
+ "operationId": "redirects-update",
+ "tags": [
+ "redirects"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redirectId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "regex": {
+ "type": "string",
+ "minLength": 1
+ },
+ "replacement": {
+ "type": "string",
+ "minLength": 1
+ },
+ "permanent": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "redirectId",
+ "regex",
+ "replacement",
+ "permanent"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.create": {
+ "post": {
+ "operationId": "redis-create",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "databasePassword": {
"type": "string"
},
- "certificatePath": {
+ "dockerImage": {
+ "default": "redis:8",
"type": "string"
},
- "autoRenew": {
+ "environmentId": {
+ "type": "string"
+ },
+ "description": {
"anyOf": [
{
- "type": "boolean"
+ "type": "string"
},
{
"type": "null"
}
]
},
- "organizationId": {
- "type": "string"
- },
"serverId": {
"anyOf": [
{
@@ -25028,9 +36141,8 @@
},
"required": [
"name",
- "certificateData",
- "privateKey",
- "organizationId"
+ "databasePassword",
+ "environmentId"
]
}
}
@@ -25092,11 +36204,11 @@
}
}
},
- "/certificates.one": {
+ "/redis.one": {
"get": {
- "operationId": "certificates-one",
+ "operationId": "redis-one",
"tags": [
- "certificates"
+ "redis"
],
"security": [
{
@@ -25106,9 +36218,10 @@
"parameters": [
{
"in": "query",
- "name": "certificateId",
+ "name": "redisId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -25179,11 +36292,11 @@
}
}
},
- "/certificates.remove": {
+ "/redis.start": {
"post": {
- "operationId": "certificates-remove",
+ "operationId": "redis-start",
"tags": [
- "certificates"
+ "redis"
],
"security": [
{
@@ -25198,12 +36311,13 @@
"schema": {
"type": "object",
"properties": {
- "certificateId": {
- "type": "string"
+ "redisId": {
+ "type": "string",
+ "minLength": 1
}
},
"required": [
- "certificateId"
+ "redisId"
]
}
}
@@ -25265,17 +36379,4577 @@
}
}
},
- "/certificates.all": {
- "get": {
- "operationId": "certificates-all",
+ "/redis.reload": {
+ "post": {
+ "operationId": "redis-reload",
"tags": [
- "certificates"
+ "redis"
],
"security": [
{
"Authorization": []
}
],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ }
+ },
+ "required": [
+ "redisId",
+ "appName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.stop": {
+ "post": {
+ "operationId": "redis-stop",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "redisId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.saveExternalPort": {
+ "post": {
+ "operationId": "redis-saveExternalPort",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ },
+ "externalPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "redisId",
+ "externalPort"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.deploy": {
+ "post": {
+ "operationId": "redis-deploy",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "redisId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.changeStatus": {
+ "post": {
+ "operationId": "redis-changeStatus",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ },
+ "applicationStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ }
+ },
+ "required": [
+ "redisId",
+ "applicationStatus"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.remove": {
+ "post": {
+ "operationId": "redis-remove",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "redisId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.saveEnvironment": {
+ "post": {
+ "operationId": "redis-saveEnvironment",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "redisId",
+ "env"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.update": {
+ "post": {
+ "operationId": "redis-update",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "appName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 63,
+ "pattern": "^[a-zA-Z0-9._-]+$"
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "databasePassword": {
+ "type": "string"
+ },
+ "dockerImage": {
+ "type": "string"
+ },
+ "command": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "args": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "env": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "memoryReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "memoryLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cpuReservation": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cpuLimit": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "externalPort": {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "applicationStatus": {
+ "type": "string",
+ "enum": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "healthCheckSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Test": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Interval": {
+ "type": "number"
+ },
+ "Timeout": {
+ "type": "number"
+ },
+ "StartPeriod": {
+ "type": "number"
+ },
+ "Retries": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "restartPolicySwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Condition": {
+ "type": "string"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "MaxAttempts": {
+ "type": "number"
+ },
+ "Window": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "placementSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Constraints": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Preferences": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Spread": {
+ "type": "object",
+ "properties": {
+ "SpreadDescriptor": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "SpreadDescriptor"
+ ]
+ }
+ },
+ "required": [
+ "Spread"
+ ],
+ "additionalProperties": false
+ }
+ },
+ "MaxReplicas": {
+ "type": "number"
+ },
+ "Platforms": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Architecture": {
+ "type": "string"
+ },
+ "OS": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Architecture",
+ "OS"
+ ],
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "updateConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "rollbackConfigSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Parallelism": {
+ "type": "number"
+ },
+ "Delay": {
+ "type": "number"
+ },
+ "FailureAction": {
+ "type": "string"
+ },
+ "Monitor": {
+ "type": "number"
+ },
+ "MaxFailureRatio": {
+ "type": "number"
+ },
+ "Order": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "Parallelism",
+ "Order"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "modeSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Replicated": {
+ "type": "object",
+ "properties": {
+ "Replicas": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Global": {
+ "type": "object",
+ "properties": {}
+ },
+ "ReplicatedJob": {
+ "type": "object",
+ "properties": {
+ "MaxConcurrent": {
+ "type": "number"
+ },
+ "TotalCompletions": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false
+ },
+ "GlobalJob": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "labelsSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "networkSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Target": {
+ "type": "string"
+ },
+ "Aliases": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DriverOpts": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stopGracePeriodSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "endpointSpecSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "Mode": {
+ "type": "string"
+ },
+ "Ports": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Protocol": {
+ "type": "string"
+ },
+ "TargetPort": {
+ "type": "number"
+ },
+ "PublishedPort": {
+ "type": "number"
+ },
+ "PublishMode": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "ulimitsSwarm": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "Name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "Soft": {
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
+ },
+ "Hard": {
+ "type": "integer",
+ "minimum": -1,
+ "maximum": 9007199254740991
+ }
+ },
+ "required": [
+ "Name",
+ "Soft",
+ "Hard"
+ ],
+ "additionalProperties": false
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "replicas": {
+ "type": "number"
+ },
+ "environmentId": {
+ "type": "string"
+ },
+ "networkIds": {
+ "anyOf": [
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "detachDokployNetwork": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "redisId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.changePassword": {
+ "post": {
+ "operationId": "redis-changePassword",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[a-zA-Z0-9@#%^&*()_+\\-=[\\]{}|;:,.<>?~`]*$"
+ }
+ },
+ "required": [
+ "redisId",
+ "password"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.move": {
+ "post": {
+ "operationId": "redis-move",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ },
+ "targetEnvironmentId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "redisId",
+ "targetEnvironmentId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.rebuild": {
+ "post": {
+ "operationId": "redis-rebuild",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "redisId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "redisId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.search": {
+ "get": {
+ "operationId": "redis-search",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "q",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "name",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "description",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "projectId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "environmentId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "schema": {
+ "default": 20,
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ {
+ "in": "query",
+ "name": "offset",
+ "schema": {
+ "default": 0,
+ "type": "number",
+ "minimum": 0
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/redis.readLogs": {
+ "get": {
+ "operationId": "redis-readLogs",
+ "tags": [
+ "redis"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "redisId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "tail",
+ "schema": {
+ "default": 100,
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 10000
+ }
+ },
+ {
+ "in": "query",
+ "name": "since",
+ "schema": {
+ "default": "all",
+ "type": "string",
+ "pattern": "^(all|\\d+[smhd])$"
+ }
+ },
+ {
+ "in": "query",
+ "name": "search",
+ "schema": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9 ._-]{0,500}$"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.create": {
+ "post": {
+ "operationId": "registry-create",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "registryName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "registryUrl": {
+ "type": "string"
+ },
+ "registryType": {
+ "type": "string",
+ "enum": [
+ "cloud"
+ ]
+ },
+ "imagePrefix": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "registryName",
+ "username",
+ "password",
+ "registryUrl",
+ "registryType",
+ "imagePrefix"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.remove": {
+ "post": {
+ "operationId": "registry-remove",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "registryId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "registryId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.update": {
+ "post": {
+ "operationId": "registry-update",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "registryId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "registryName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "imagePrefix": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "registryUrl": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "registryType": {
+ "type": "string",
+ "enum": [
+ "cloud"
+ ]
+ },
+ "organizationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "registryId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.all": {
+ "get": {
+ "operationId": "registry-all",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.one": {
+ "get": {
+ "operationId": "registry-one",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "registryId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.testRegistry": {
+ "post": {
+ "operationId": "registry-testRegistry",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "registryName": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ },
+ "registryUrl": {
+ "type": "string"
+ },
+ "registryType": {
+ "type": "string",
+ "enum": [
+ "cloud"
+ ]
+ },
+ "imagePrefix": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "username",
+ "password",
+ "registryUrl",
+ "registryType"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/registry.testRegistryById": {
+ "post": {
+ "operationId": "registry-testRegistryById",
+ "tags": [
+ "registry"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "registryId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "serverId": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/security.create": {
+ "post": {
+ "operationId": "security-create",
+ "tags": [
+ "security"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "applicationId": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "applicationId",
+ "username",
+ "password"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/security.one": {
+ "get": {
+ "operationId": "security-one",
+ "tags": [
+ "security"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "securityId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/security.delete": {
+ "post": {
+ "operationId": "security-delete",
+ "tags": [
+ "security"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "securityId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "securityId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/security.update": {
+ "post": {
+ "operationId": "security-update",
+ "tags": [
+ "security"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "securityId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "username": {
+ "type": "string",
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "securityId",
+ "username",
+ "password"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.create": {
+ "post": {
+ "operationId": "server-create",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "ipAddress": {
+ "type": "string"
+ },
+ "port": {
+ "type": "number"
+ },
+ "username": {
+ "type": "string"
+ },
+ "sshKeyId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverType": {
+ "type": "string",
+ "enum": [
+ "deploy",
+ "build"
+ ]
+ },
+ "enableDockerCleanup": {
+ "default": true,
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "name",
+ "description",
+ "ipAddress",
+ "port",
+ "username",
+ "sshKeyId",
+ "serverType"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.one": {
+ "get": {
+ "operationId": "server-one",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.getDefaultCommand": {
+ "get": {
+ "operationId": "server-getDefaultCommand",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.all": {
+ "get": {
+ "operationId": "server-all",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.allForPermissions": {
+ "get": {
+ "operationId": "server-allForPermissions",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.count": {
+ "get": {
+ "operationId": "server-count",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.withSSHKey": {
+ "get": {
+ "operationId": "server-withSSHKey",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.buildServers": {
+ "get": {
+ "operationId": "server-buildServers",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.setup": {
+ "post": {
+ "operationId": "server-setup",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "serverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.validate": {
+ "get": {
+ "operationId": "server-validate",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.security": {
+ "get": {
+ "operationId": "server-security",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.setupMonitoring": {
+ "post": {
+ "operationId": "server-setupMonitoring",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "metricsConfig": {
+ "type": "object",
+ "properties": {
+ "server": {
+ "type": "object",
+ "properties": {
+ "refreshRate": {
+ "type": "number",
+ "minimum": 2
+ },
+ "port": {
+ "type": "number",
+ "minimum": 1
+ },
+ "token": {
+ "type": "string"
+ },
+ "urlCallback": {
+ "type": "string",
+ "format": "uri"
+ },
+ "retentionDays": {
+ "type": "number",
+ "minimum": 1
+ },
+ "cronJob": {
+ "type": "string",
+ "minLength": 1
+ },
+ "thresholds": {
+ "type": "object",
+ "properties": {
+ "cpu": {
+ "type": "number",
+ "minimum": 0
+ },
+ "memory": {
+ "type": "number",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "cpu",
+ "memory"
+ ]
+ }
+ },
+ "required": [
+ "refreshRate",
+ "port",
+ "token",
+ "urlCallback",
+ "retentionDays",
+ "cronJob",
+ "thresholds"
+ ]
+ },
+ "containers": {
+ "type": "object",
+ "properties": {
+ "refreshRate": {
+ "type": "number",
+ "minimum": 2
+ },
+ "services": {
+ "type": "object",
+ "properties": {
+ "include": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "exclude": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "required": [
+ "refreshRate",
+ "services"
+ ]
+ }
+ },
+ "required": [
+ "server",
+ "containers"
+ ]
+ }
+ },
+ "required": [
+ "serverId",
+ "metricsConfig"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.remove": {
+ "post": {
+ "operationId": "server-remove",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "serverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.update": {
+ "post": {
+ "operationId": "server-update",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "ipAddress": {
+ "type": "string"
+ },
+ "port": {
+ "type": "number"
+ },
+ "username": {
+ "type": "string"
+ },
+ "sshKeyId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serverType": {
+ "type": "string",
+ "enum": [
+ "deploy",
+ "build"
+ ]
+ },
+ "enableDockerCleanup": {
+ "default": true,
+ "type": "boolean"
+ },
+ "command": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "description",
+ "serverId",
+ "ipAddress",
+ "port",
+ "username",
+ "sshKeyId",
+ "serverType"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.updateBuildsConcurrency": {
+ "post": {
+ "operationId": "server-updateBuildsConcurrency",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "buildsConcurrency": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ "required": [
+ "serverId",
+ "buildsConcurrency"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.publicIp": {
+ "get": {
+ "operationId": "server-publicIp",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.getServerTime": {
+ "get": {
+ "operationId": "server-getServerTime",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/server.getServerMetrics": {
+ "get": {
+ "operationId": "server-getServerMetrics",
+ "tags": [
+ "server"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "url",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "token",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "dataPoints",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ }
+ ],
"responses": {
"200": {
"description": "Successful response",
@@ -26421,6 +42095,83 @@
}
}
},
+ "/settings.getDockerDiskUsage": {
+ "get": {
+ "operationId": "settings-getDockerDiskUsage",
+ "tags": [
+ "settings"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/settings.saveSSHPrivateKey": {
"post": {
"operationId": "settings-saveSSHPrivateKey",
@@ -26542,7 +42293,9 @@
{
"anyOf": [
{
- "type": "string"
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "string",
@@ -26779,6 +42532,266 @@
}
}
},
+ "/settings.updateRemoteServersOnly": {
+ "post": {
+ "operationId": "settings-updateRemoteServersOnly",
+ "tags": [
+ "settings"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "remoteServersOnly": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "remoteServersOnly"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/settings.updateBuildsConcurrency": {
+ "post": {
+ "operationId": "settings-updateBuildsConcurrency",
+ "tags": [
+ "settings"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "buildsConcurrency": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100
+ }
+ },
+ "required": [
+ "buildsConcurrency"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/settings.updateEnforceSSO": {
+ "post": {
+ "operationId": "settings-updateEnforceSSO",
+ "tags": [
+ "settings"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "enforceSSO": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "enforceSSO"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/settings.readTraefikConfig": {
"get": {
"operationId": "settings-readTraefikConfig",
@@ -26876,7 +42889,8 @@
"type": "object",
"properties": {
"traefikConfig": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -27039,7 +43053,8 @@
"type": "object",
"properties": {
"traefikConfig": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -27202,7 +43217,8 @@
"type": "object",
"properties": {
"traefikConfig": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -27662,10 +43678,12 @@
"type": "object",
"properties": {
"path": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"traefikConfig": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"serverId": {
"type": "string"
@@ -27751,7 +43769,8 @@
"in": "query",
"name": "path",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
@@ -28724,6 +44743,83 @@
}
}
},
+ "/settings.checkInfrastructureHealth": {
+ "get": {
+ "operationId": "settings-checkInfrastructureHealth",
+ "tags": [
+ "settings"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/settings.setupGPU": {
"post": {
"operationId": "settings-setupGPU",
@@ -29339,6475 +45435,6 @@
}
}
},
- "/security.create": {
- "post": {
- "operationId": "security-create",
- "tags": [
- "security"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "applicationId": {
- "type": "string"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- }
- },
- "required": [
- "applicationId",
- "username",
- "password"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/security.one": {
- "get": {
- "operationId": "security-one",
- "tags": [
- "security"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "securityId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/security.delete": {
- "post": {
- "operationId": "security-delete",
- "tags": [
- "security"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "securityId": {
- "type": "string"
- }
- },
- "required": [
- "securityId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/security.update": {
- "post": {
- "operationId": "security-update",
- "tags": [
- "security"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "securityId": {
- "type": "string"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- }
- },
- "required": [
- "securityId",
- "username",
- "password"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redirects.create": {
- "post": {
- "operationId": "redirects-create",
- "tags": [
- "redirects"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "regex": {
- "type": "string"
- },
- "replacement": {
- "type": "string"
- },
- "permanent": {
- "type": "boolean"
- },
- "applicationId": {
- "type": "string"
- }
- },
- "required": [
- "regex",
- "replacement",
- "permanent",
- "applicationId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redirects.one": {
- "get": {
- "operationId": "redirects-one",
- "tags": [
- "redirects"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "redirectId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redirects.delete": {
- "post": {
- "operationId": "redirects-delete",
- "tags": [
- "redirects"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redirectId": {
- "type": "string"
- }
- },
- "required": [
- "redirectId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/redirects.update": {
- "post": {
- "operationId": "redirects-update",
- "tags": [
- "redirects"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "redirectId": {
- "type": "string"
- },
- "regex": {
- "type": "string"
- },
- "replacement": {
- "type": "string"
- },
- "permanent": {
- "type": "boolean"
- }
- },
- "required": [
- "redirectId",
- "regex",
- "replacement",
- "permanent"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/port.create": {
- "post": {
- "operationId": "port-create",
- "tags": [
- "port"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "publishedPort": {
- "type": "number"
- },
- "publishMode": {
- "default": "ingress",
- "type": "string",
- "enum": [
- "ingress",
- "host"
- ]
- },
- "targetPort": {
- "type": "number"
- },
- "protocol": {
- "default": "tcp",
- "type": "string",
- "enum": [
- "tcp",
- "udp"
- ]
- },
- "applicationId": {
- "type": "string"
- }
- },
- "required": [
- "publishedPort",
- "publishMode",
- "targetPort",
- "protocol",
- "applicationId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/port.one": {
- "get": {
- "operationId": "port-one",
- "tags": [
- "port"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "portId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/port.delete": {
- "post": {
- "operationId": "port-delete",
- "tags": [
- "port"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "portId": {
- "type": "string"
- }
- },
- "required": [
- "portId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/port.update": {
- "post": {
- "operationId": "port-update",
- "tags": [
- "port"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "portId": {
- "type": "string"
- },
- "publishedPort": {
- "type": "number"
- },
- "publishMode": {
- "default": "ingress",
- "type": "string",
- "enum": [
- "ingress",
- "host"
- ]
- },
- "targetPort": {
- "type": "number"
- },
- "protocol": {
- "default": "tcp",
- "type": "string",
- "enum": [
- "tcp",
- "udp"
- ]
- }
- },
- "required": [
- "portId",
- "publishedPort",
- "publishMode",
- "targetPort",
- "protocol"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.create": {
- "post": {
- "operationId": "registry-create",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "registryName": {
- "type": "string"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "registryUrl": {
- "type": "string"
- },
- "registryType": {
- "type": "string",
- "enum": [
- "cloud"
- ]
- },
- "imagePrefix": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "registryName",
- "username",
- "password",
- "registryUrl",
- "registryType",
- "imagePrefix"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.remove": {
- "post": {
- "operationId": "registry-remove",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "registryId": {
- "type": "string"
- }
- },
- "required": [
- "registryId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.update": {
- "post": {
- "operationId": "registry-update",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "registryId": {
- "type": "string"
- },
- "registryName": {
- "type": "string"
- },
- "imagePrefix": {
- "anyOf": [
- {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "registryUrl": {
- "type": "string"
- },
- "createdAt": {
- "type": "string"
- },
- "registryType": {
- "type": "string",
- "enum": [
- "cloud"
- ]
- },
- "organizationId": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "registryId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.all": {
- "get": {
- "operationId": "registry-all",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.one": {
- "get": {
- "operationId": "registry-one",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "registryId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.testRegistry": {
- "post": {
- "operationId": "registry-testRegistry",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "registryName": {
- "type": "string"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "registryUrl": {
- "type": "string"
- },
- "registryType": {
- "type": "string",
- "enum": [
- "cloud"
- ]
- },
- "imagePrefix": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "username",
- "password",
- "registryUrl",
- "registryType"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/registry.testRegistryById": {
- "post": {
- "operationId": "registry-testRegistryById",
- "tags": [
- "registry"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "registryId": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- }
- }
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/cluster.getNodes": {
- "get": {
- "operationId": "cluster-getNodes",
- "tags": [
- "cluster"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/cluster.removeWorker": {
- "post": {
- "operationId": "cluster-removeWorker",
- "tags": [
- "cluster"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "nodeId": {
- "type": "string"
- },
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "nodeId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/cluster.addWorker": {
- "get": {
- "operationId": "cluster-addWorker",
- "tags": [
- "cluster"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/cluster.addManager": {
- "get": {
- "operationId": "cluster-addManager",
- "tags": [
- "cluster"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createSlack": {
- "post": {
- "operationId": "notification-createSlack",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "channel": {
- "type": "string"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "webhookUrl",
- "channel"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateSlack": {
- "post": {
- "operationId": "notification-updateSlack",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "channel": {
- "type": "string"
- },
- "notificationId": {
- "type": "string"
- },
- "slackId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "slackId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testSlackConnection": {
- "post": {
- "operationId": "notification-testSlackConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "webhookUrl": {
- "type": "string"
- },
- "channel": {
- "type": "string"
- }
- },
- "required": [
- "webhookUrl",
- "channel"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createTelegram": {
- "post": {
- "operationId": "notification-createTelegram",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "botToken": {
- "type": "string"
- },
- "chatId": {
- "type": "string"
- },
- "messageThreadId": {
- "type": "string"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "botToken",
- "chatId",
- "messageThreadId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateTelegram": {
- "post": {
- "operationId": "notification-updateTelegram",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "botToken": {
- "type": "string"
- },
- "chatId": {
- "type": "string"
- },
- "messageThreadId": {
- "type": "string"
- },
- "notificationId": {
- "type": "string"
- },
- "telegramId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "telegramId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testTelegramConnection": {
- "post": {
- "operationId": "notification-testTelegramConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "botToken": {
- "type": "string"
- },
- "chatId": {
- "type": "string"
- },
- "messageThreadId": {
- "type": "string"
- }
- },
- "required": [
- "botToken",
- "chatId",
- "messageThreadId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createDiscord": {
- "post": {
- "operationId": "notification-createDiscord",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "decoration": {
- "type": "boolean"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "webhookUrl",
- "decoration"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateDiscord": {
- "post": {
- "operationId": "notification-updateDiscord",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "decoration": {
- "type": "boolean"
- },
- "notificationId": {
- "type": "string"
- },
- "discordId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "discordId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testDiscordConnection": {
- "post": {
- "operationId": "notification-testDiscordConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "webhookUrl": {
- "type": "string"
- },
- "decoration": {
- "type": "boolean"
- }
- },
- "required": [
- "webhookUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createEmail": {
- "post": {
- "operationId": "notification-createEmail",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "smtpServer": {
- "type": "string"
- },
- "smtpPort": {
- "type": "number"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "fromAddress": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "smtpServer",
- "smtpPort",
- "username",
- "password",
- "fromAddress",
- "toAddresses"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateEmail": {
- "post": {
- "operationId": "notification-updateEmail",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "smtpServer": {
- "type": "string"
- },
- "smtpPort": {
- "type": "number"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "fromAddress": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "notificationId": {
- "type": "string"
- },
- "emailId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "emailId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testEmailConnection": {
- "post": {
- "operationId": "notification-testEmailConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "smtpServer": {
- "type": "string"
- },
- "smtpPort": {
- "type": "number"
- },
- "username": {
- "type": "string"
- },
- "password": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "fromAddress": {
- "type": "string"
- }
- },
- "required": [
- "smtpServer",
- "smtpPort",
- "username",
- "password",
- "toAddresses",
- "fromAddress"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createResend": {
- "post": {
- "operationId": "notification-createResend",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "apiKey": {
- "type": "string"
- },
- "fromAddress": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "apiKey",
- "fromAddress",
- "toAddresses"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateResend": {
- "post": {
- "operationId": "notification-updateResend",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "apiKey": {
- "type": "string"
- },
- "fromAddress": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "notificationId": {
- "type": "string"
- },
- "resendId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "resendId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testResendConnection": {
- "post": {
- "operationId": "notification-testResendConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "apiKey": {
- "type": "string"
- },
- "fromAddress": {
- "type": "string"
- },
- "toAddresses": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- },
- "required": [
- "apiKey",
- "fromAddress",
- "toAddresses"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.remove": {
- "post": {
- "operationId": "notification-remove",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "notificationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.one": {
- "get": {
- "operationId": "notification-one",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "notificationId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.all": {
- "get": {
- "operationId": "notification-all",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.receiveNotification": {
- "post": {
- "operationId": "notification-receiveNotification",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "ServerType": {
- "default": "Dokploy",
- "type": "string",
- "enum": [
- "Dokploy",
- "Remote"
- ]
- },
- "Type": {
- "type": "string",
- "enum": [
- "Memory",
- "CPU"
- ]
- },
- "Value": {
- "type": "number"
- },
- "Threshold": {
- "type": "number"
- },
- "Message": {
- "type": "string"
- },
- "Timestamp": {
- "type": "string"
- },
- "Token": {
- "type": "string"
- }
- },
- "required": [
- "Type",
- "Value",
- "Threshold",
- "Message",
- "Timestamp",
- "Token"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createGotify": {
- "post": {
- "operationId": "notification-createGotify",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverUrl": {
- "type": "string"
- },
- "appToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "decoration": {
- "type": "boolean"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverUrl",
- "appToken",
- "priority",
- "decoration"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateGotify": {
- "post": {
- "operationId": "notification-updateGotify",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverUrl": {
- "type": "string"
- },
- "appToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "decoration": {
- "type": "boolean"
- },
- "notificationId": {
- "type": "string"
- },
- "gotifyId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "gotifyId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testGotifyConnection": {
- "post": {
- "operationId": "notification-testGotifyConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "serverUrl": {
- "type": "string"
- },
- "appToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "decoration": {
- "type": "boolean"
- }
- },
- "required": [
- "serverUrl",
- "appToken",
- "priority"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createNtfy": {
- "post": {
- "operationId": "notification-createNtfy",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverUrl": {
- "type": "string"
- },
- "topic": {
- "type": "string"
- },
- "accessToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverUrl",
- "topic",
- "accessToken",
- "priority"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateNtfy": {
- "post": {
- "operationId": "notification-updateNtfy",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverUrl": {
- "type": "string"
- },
- "topic": {
- "type": "string"
- },
- "accessToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "notificationId": {
- "type": "string"
- },
- "ntfyId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "ntfyId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testNtfyConnection": {
- "post": {
- "operationId": "notification-testNtfyConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "serverUrl": {
- "type": "string"
- },
- "topic": {
- "type": "string"
- },
- "accessToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- }
- },
- "required": [
- "serverUrl",
- "topic",
- "accessToken",
- "priority"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createCustom": {
- "post": {
- "operationId": "notification-createCustom",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "endpoint": {
- "type": "string"
- },
- "headers": {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- "required": [
- "name",
- "endpoint"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateCustom": {
- "post": {
- "operationId": "notification-updateCustom",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "endpoint": {
- "type": "string"
- },
- "headers": {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- },
- "notificationId": {
- "type": "string"
- },
- "customId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "customId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testCustomConnection": {
- "post": {
- "operationId": "notification-testCustomConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "endpoint": {
- "type": "string"
- },
- "headers": {
- "type": "object",
- "propertyNames": {
- "type": "string"
- },
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- "required": [
- "endpoint"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createLark": {
- "post": {
- "operationId": "notification-createLark",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "webhookUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateLark": {
- "post": {
- "operationId": "notification-updateLark",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "notificationId": {
- "type": "string"
- },
- "larkId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "larkId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testLarkConnection": {
- "post": {
- "operationId": "notification-testLarkConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "webhookUrl": {
- "type": "string"
- }
- },
- "required": [
- "webhookUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createTeams": {
- "post": {
- "operationId": "notification-createTeams",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- }
- },
- "required": [
- "appBuildError",
- "databaseBackup",
- "volumeBackup",
- "dokployRestart",
- "name",
- "appDeploy",
- "dockerCleanup",
- "serverThreshold",
- "webhookUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updateTeams": {
- "post": {
- "operationId": "notification-updateTeams",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "webhookUrl": {
- "type": "string"
- },
- "notificationId": {
- "type": "string"
- },
- "teamsId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "notificationId",
- "teamsId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testTeamsConnection": {
- "post": {
- "operationId": "notification-testTeamsConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "webhookUrl": {
- "type": "string"
- }
- },
- "required": [
- "webhookUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.createPushover": {
- "post": {
- "operationId": "notification-createPushover",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- },
- "userKey": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "priority": {
- "default": 0,
- "type": "number"
- },
- "retry": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "expire": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "name",
- "userKey",
- "apiToken"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.updatePushover": {
- "post": {
- "operationId": "notification-updatePushover",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "notificationId": {
- "type": "string"
- },
- "pushoverId": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- },
- "userKey": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "retry": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "expire": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "appBuildError": {
- "type": "boolean"
- },
- "databaseBackup": {
- "type": "boolean"
- },
- "volumeBackup": {
- "type": "boolean"
- },
- "dokployRestart": {
- "type": "boolean"
- },
- "name": {
- "type": "string"
- },
- "appDeploy": {
- "type": "boolean"
- },
- "dockerCleanup": {
- "type": "boolean"
- },
- "serverThreshold": {
- "type": "boolean"
- }
- },
- "required": [
- "notificationId",
- "pushoverId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.testPushoverConnection": {
- "post": {
- "operationId": "notification-testPushoverConnection",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "userKey": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "priority": {
- "type": "number"
- },
- "retry": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- },
- "expire": {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "userKey",
- "apiToken",
- "priority"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/notification.getEmailProviders": {
- "get": {
- "operationId": "notification-getEmailProviders",
- "tags": [
- "notification"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
"/sshKey.create": {
"post": {
"operationId": "sshKey-create",
@@ -35828,7 +45455,8 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"anyOf": [
@@ -36018,7 +45646,8 @@
"in": "query",
"name": "sshKeyId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -36166,6 +45795,83 @@
}
}
},
+ "/sshKey.allForApps": {
+ "get": {
+ "operationId": "sshKey-allForApps",
+ "tags": [
+ "sshKey"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/sshKey.generate": {
"post": {
"operationId": "sshKey-generate",
@@ -36273,7 +45979,8 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"anyOf": [
@@ -36362,4391 +46069,6 @@
}
}
},
- "/gitProvider.getAll": {
- "get": {
- "operationId": "gitProvider-getAll",
- "tags": [
- "gitProvider"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitProvider.remove": {
- "post": {
- "operationId": "gitProvider-remove",
- "tags": [
- "gitProvider"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "gitProviderId": {
- "type": "string"
- }
- },
- "required": [
- "gitProviderId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.create": {
- "post": {
- "operationId": "gitea-create",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "giteaId": {
- "type": "string"
- },
- "giteaUrl": {
- "type": "string"
- },
- "giteaInternalUrl": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "redirectUri": {
- "type": "string"
- },
- "clientId": {
- "type": "string"
- },
- "clientSecret": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "accessToken": {
- "type": "string"
- },
- "refreshToken": {
- "type": "string"
- },
- "expiresAt": {
- "type": "number"
- },
- "scopes": {
- "type": "string"
- },
- "lastAuthenticatedAt": {
- "type": "number"
- },
- "name": {
- "type": "string"
- },
- "giteaUsername": {
- "type": "string"
- },
- "organizationName": {
- "type": "string"
- }
- },
- "required": [
- "giteaUrl",
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.one": {
- "get": {
- "operationId": "gitea-one",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "giteaId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.giteaProviders": {
- "get": {
- "operationId": "gitea-giteaProviders",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.getGiteaRepositories": {
- "get": {
- "operationId": "gitea-getGiteaRepositories",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "giteaId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.getGiteaBranches": {
- "get": {
- "operationId": "gitea-getGiteaBranches",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "owner",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "repositoryName",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "giteaId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.testConnection": {
- "post": {
- "operationId": "gitea-testConnection",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "giteaId": {
- "type": "string"
- },
- "organizationName": {
- "type": "string"
- }
- }
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.update": {
- "post": {
- "operationId": "gitea-update",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "giteaId": {
- "type": "string"
- },
- "giteaUrl": {
- "type": "string"
- },
- "giteaInternalUrl": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "redirectUri": {
- "type": "string"
- },
- "clientId": {
- "type": "string"
- },
- "clientSecret": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "accessToken": {
- "type": "string"
- },
- "refreshToken": {
- "type": "string"
- },
- "expiresAt": {
- "type": "number"
- },
- "scopes": {
- "type": "string"
- },
- "lastAuthenticatedAt": {
- "type": "number"
- },
- "name": {
- "type": "string"
- },
- "giteaUsername": {
- "type": "string"
- },
- "organizationName": {
- "type": "string"
- }
- },
- "required": [
- "giteaId",
- "giteaUrl",
- "gitProviderId",
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitea.getGiteaUrl": {
- "get": {
- "operationId": "gitea-getGiteaUrl",
- "tags": [
- "gitea"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "giteaId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.create": {
- "post": {
- "operationId": "bitbucket-create",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "bitbucketId": {
- "type": "string"
- },
- "bitbucketUsername": {
- "type": "string"
- },
- "bitbucketEmail": {
- "type": "string"
- },
- "appPassword": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "bitbucketWorkspaceName": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "authId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- }
- },
- "required": [
- "authId",
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.one": {
- "get": {
- "operationId": "bitbucket-one",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "bitbucketId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.bitbucketProviders": {
- "get": {
- "operationId": "bitbucket-bitbucketProviders",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.getBitbucketRepositories": {
- "get": {
- "operationId": "bitbucket-getBitbucketRepositories",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "bitbucketId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.getBitbucketBranches": {
- "get": {
- "operationId": "bitbucket-getBitbucketBranches",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "owner",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "repo",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "bitbucketId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.testConnection": {
- "post": {
- "operationId": "bitbucket-testConnection",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "bitbucketId": {
- "type": "string"
- },
- "bitbucketUsername": {
- "type": "string"
- },
- "bitbucketEmail": {
- "type": "string"
- },
- "workspaceName": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "appPassword": {
- "type": "string"
- }
- },
- "required": [
- "bitbucketId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/bitbucket.update": {
- "post": {
- "operationId": "bitbucket-update",
- "tags": [
- "bitbucket"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "bitbucketId": {
- "type": "string"
- },
- "bitbucketUsername": {
- "type": "string"
- },
- "bitbucketEmail": {
- "type": "string"
- },
- "appPassword": {
- "type": "string"
- },
- "apiToken": {
- "type": "string"
- },
- "bitbucketWorkspaceName": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "organizationId": {
- "type": "string"
- }
- },
- "required": [
- "bitbucketId",
- "gitProviderId",
- "name"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.create": {
- "post": {
- "operationId": "gitlab-create",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "applicationId": {
- "type": "string"
- },
- "secret": {
- "type": "string"
- },
- "groupName": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "redirectUri": {
- "type": "string"
- },
- "authId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "gitlabUrl": {
- "type": "string"
- },
- "gitlabInternalUrl": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "authId",
- "name",
- "gitlabUrl"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.one": {
- "get": {
- "operationId": "gitlab-one",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "gitlabId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.gitlabProviders": {
- "get": {
- "operationId": "gitlab-gitlabProviders",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.getGitlabRepositories": {
- "get": {
- "operationId": "gitlab-getGitlabRepositories",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "gitlabId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.getGitlabBranches": {
- "get": {
- "operationId": "gitlab-getGitlabBranches",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "id",
- "schema": {
- "type": "number"
- }
- },
- {
- "in": "query",
- "name": "owner",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "repo",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "gitlabId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.testConnection": {
- "post": {
- "operationId": "gitlab-testConnection",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "gitlabId": {
- "type": "string"
- },
- "groupName": {
- "type": "string"
- }
- },
- "required": [
- "gitlabId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/gitlab.update": {
- "post": {
- "operationId": "gitlab-update",
- "tags": [
- "gitlab"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "applicationId": {
- "type": "string"
- },
- "secret": {
- "type": "string"
- },
- "groupName": {
- "type": "string"
- },
- "redirectUri": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "gitlabId": {
- "type": "string"
- },
- "gitlabUrl": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "gitlabInternalUrl": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "required": [
- "name",
- "gitlabId",
- "gitlabUrl",
- "gitProviderId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.one": {
- "get": {
- "operationId": "github-one",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "githubId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.getGithubRepositories": {
- "get": {
- "operationId": "github-getGithubRepositories",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "githubId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.getGithubBranches": {
- "get": {
- "operationId": "github-getGithubBranches",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "repo",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "owner",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "githubId",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.githubProviders": {
- "get": {
- "operationId": "github-githubProviders",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.testConnection": {
- "post": {
- "operationId": "github-testConnection",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "githubId": {
- "type": "string"
- }
- },
- "required": [
- "githubId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/github.update": {
- "post": {
- "operationId": "github-update",
- "tags": [
- "github"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "githubId": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "gitProviderId": {
- "type": "string"
- },
- "githubAppName": {
- "type": "string"
- }
- },
- "required": [
- "githubId",
- "name",
- "gitProviderId",
- "githubAppName"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.create": {
- "post": {
- "operationId": "server-create",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "ipAddress": {
- "type": "string"
- },
- "port": {
- "type": "number"
- },
- "username": {
- "type": "string"
- },
- "sshKeyId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverType": {
- "type": "string",
- "enum": [
- "deploy",
- "build"
- ]
- }
- },
- "required": [
- "name",
- "description",
- "ipAddress",
- "port",
- "username",
- "sshKeyId",
- "serverType"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.one": {
- "get": {
- "operationId": "server-one",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.getDefaultCommand": {
- "get": {
- "operationId": "server-getDefaultCommand",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.all": {
- "get": {
- "operationId": "server-all",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.count": {
- "get": {
- "operationId": "server-count",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.withSSHKey": {
- "get": {
- "operationId": "server-withSSHKey",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.buildServers": {
- "get": {
- "operationId": "server-buildServers",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.setup": {
- "post": {
- "operationId": "server-setup",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "serverId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.validate": {
- "get": {
- "operationId": "server-validate",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.security": {
- "get": {
- "operationId": "server-security",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "serverId",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.setupMonitoring": {
- "post": {
- "operationId": "server-setupMonitoring",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "serverId": {
- "type": "string"
- },
- "metricsConfig": {
- "type": "object",
- "properties": {
- "server": {
- "type": "object",
- "properties": {
- "refreshRate": {
- "type": "number"
- },
- "port": {
- "type": "number"
- },
- "token": {
- "type": "string"
- },
- "urlCallback": {
- "type": "string"
- },
- "retentionDays": {
- "type": "number"
- },
- "cronJob": {
- "type": "string"
- },
- "thresholds": {
- "type": "object",
- "properties": {
- "cpu": {
- "type": "number"
- },
- "memory": {
- "type": "number"
- }
- },
- "required": [
- "cpu",
- "memory"
- ]
- }
- },
- "required": [
- "refreshRate",
- "port",
- "token",
- "urlCallback",
- "retentionDays",
- "cronJob",
- "thresholds"
- ]
- },
- "containers": {
- "type": "object",
- "properties": {
- "refreshRate": {
- "type": "number"
- },
- "services": {
- "type": "object",
- "properties": {
- "include": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "exclude": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- }
- },
- "required": [
- "refreshRate",
- "services"
- ]
- }
- },
- "required": [
- "server",
- "containers"
- ]
- }
- },
- "required": [
- "serverId",
- "metricsConfig"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.remove": {
- "post": {
- "operationId": "server-remove",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "serverId": {
- "type": "string"
- }
- },
- "required": [
- "serverId"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.update": {
- "post": {
- "operationId": "server-update",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string"
- },
- "description": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverId": {
- "type": "string"
- },
- "ipAddress": {
- "type": "string"
- },
- "port": {
- "type": "number"
- },
- "username": {
- "type": "string"
- },
- "sshKeyId": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ]
- },
- "serverType": {
- "type": "string",
- "enum": [
- "deploy",
- "build"
- ]
- },
- "command": {
- "type": "string"
- }
- },
- "required": [
- "name",
- "description",
- "serverId",
- "ipAddress",
- "port",
- "username",
- "sshKeyId",
- "serverType"
- ]
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.publicIp": {
- "get": {
- "operationId": "server-publicIp",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.getServerTime": {
- "get": {
- "operationId": "server-getServerTime",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
- "/server.getServerMetrics": {
- "get": {
- "operationId": "server-getServerMetrics",
- "tags": [
- "server"
- ],
- "security": [
- {
- "Authorization": []
- }
- ],
- "parameters": [
- {
- "in": "query",
- "name": "url",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "token",
- "schema": {
- "type": "string"
- },
- "required": true
- },
- {
- "in": "query",
- "name": "dataPoints",
- "schema": {
- "type": "string"
- },
- "required": true
- }
- ],
- "responses": {
- "200": {
- "description": "Successful response",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false
- }
- }
- }
- },
- "400": {
- "description": "Invalid input data",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.BAD_REQUEST"
- }
- }
- }
- },
- "401": {
- "description": "Authorization not provided",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.UNAUTHORIZED"
- }
- }
- }
- },
- "403": {
- "description": "Insufficient access",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.FORBIDDEN"
- }
- }
- }
- },
- "404": {
- "description": "Not found",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.NOT_FOUND"
- }
- }
- }
- },
- "500": {
- "description": "Internal server error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
- }
- }
- }
- }
- }
- }
- },
"/stripe.getCurrentPlan": {
"get": {
"operationId": "stripe-getCurrentPlan",
@@ -40932,7 +46254,8 @@
"type": "string"
},
"serverQuantity": {
- "type": "number"
+ "type": "number",
+ "minimum": 1
},
"isAnnual": {
"type": "boolean"
@@ -41098,7 +46421,8 @@
]
},
"serverQuantity": {
- "type": "number"
+ "type": "number",
+ "minimum": 1
},
"isAnnual": {
"type": "boolean"
@@ -41246,6 +46570,92 @@
}
}
},
+ "/stripe.updateInvoiceNotifications": {
+ "post": {
+ "operationId": "stripe-updateInvoiceNotifications",
+ "tags": [
+ "stripe"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "enabled"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/stripe.getInvoices": {
"get": {
"operationId": "stripe-getInvoices",
@@ -41589,6 +46999,2263 @@
}
}
},
+ "/swarm.getContainerStats": {
+ "get": {
+ "operationId": "swarm-getContainerStats",
+ "tags": [
+ "swarm"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.all": {
+ "get": {
+ "operationId": "user-all",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.one": {
+ "get": {
+ "operationId": "user-one",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "userId",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.session": {
+ "get": {
+ "operationId": "user-session",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.get": {
+ "get": {
+ "operationId": "user-get",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getPermissions": {
+ "get": {
+ "operationId": "user-getPermissions",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.haveRootAccess": {
+ "get": {
+ "operationId": "user-haveRootAccess",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getBackups": {
+ "get": {
+ "operationId": "user-getBackups",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getServerMetrics": {
+ "get": {
+ "operationId": "user-getServerMetrics",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.update": {
+ "post": {
+ "operationId": "user-update",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1
+ },
+ "firstName": {
+ "type": "string"
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "isRegistered": {
+ "type": "boolean"
+ },
+ "expirationDate": {
+ "type": "string"
+ },
+ "createdAt2": {
+ "type": "string"
+ },
+ "createdAt": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "twoFactorEnabled": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "email": {
+ "type": "string",
+ "minLength": 1,
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "emailVerified": {
+ "type": "boolean"
+ },
+ "image": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "banned": {
+ "anyOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "banReason": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "banExpires": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "enablePaidFeatures": {
+ "type": "boolean"
+ },
+ "allowImpersonation": {
+ "type": "boolean"
+ },
+ "enableEnterpriseFeatures": {
+ "type": "boolean"
+ },
+ "licenseKey": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stripeCustomerId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stripeSubscriptionId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "serversQuantity": {
+ "type": "number"
+ },
+ "sendInvoiceNotifications": {
+ "type": "boolean"
+ },
+ "password": {
+ "type": "string"
+ },
+ "currentPassword": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getUserByToken": {
+ "get": {
+ "operationId": "user-getUserByToken",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "token",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getMetricsToken": {
+ "get": {
+ "operationId": "user-getMetricsToken",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.remove": {
+ "post": {
+ "operationId": "user-remove",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "userId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "userId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.assignPermissions": {
+ "post": {
+ "operationId": "user-assignPermissions",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1
+ },
+ "accessedProjects": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "accessedEnvironments": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "accessedServices": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "accessedGitProviders": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "accessedServers": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "canCreateProjects": {
+ "type": "boolean"
+ },
+ "canCreateServices": {
+ "type": "boolean"
+ },
+ "canDeleteProjects": {
+ "type": "boolean"
+ },
+ "canDeleteServices": {
+ "type": "boolean"
+ },
+ "canAccessToDocker": {
+ "type": "boolean"
+ },
+ "canAccessToTraefikFiles": {
+ "type": "boolean"
+ },
+ "canAccessToAPI": {
+ "type": "boolean"
+ },
+ "canAccessToSSHKeys": {
+ "type": "boolean"
+ },
+ "canAccessToGitProviders": {
+ "type": "boolean"
+ },
+ "canDeleteEnvironments": {
+ "type": "boolean"
+ },
+ "canCreateEnvironments": {
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "id",
+ "accessedProjects",
+ "accessedEnvironments",
+ "accessedServices",
+ "accessedGitProviders",
+ "accessedServers",
+ "canCreateProjects",
+ "canCreateServices",
+ "canDeleteProjects",
+ "canDeleteServices",
+ "canAccessToDocker",
+ "canAccessToTraefikFiles",
+ "canAccessToAPI",
+ "canAccessToSSHKeys",
+ "canAccessToGitProviders",
+ "canDeleteEnvironments",
+ "canCreateEnvironments"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getInvitations": {
+ "get": {
+ "operationId": "user-getInvitations",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getContainerMetrics": {
+ "get": {
+ "operationId": "user-getContainerMetrics",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "url",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "token",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "appName",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ },
+ {
+ "in": "query",
+ "name": "dataPoints",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.generateToken": {
+ "post": {
+ "operationId": "user-generateToken",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.deleteApiKey": {
+ "post": {
+ "operationId": "user-deleteApiKey",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "apiKeyId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "apiKeyId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.createApiKey": {
+ "post": {
+ "operationId": "user-createApiKey",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "expiresIn": {
+ "type": "number"
+ },
+ "metadata": {
+ "type": "object",
+ "properties": {
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "organizationId"
+ ]
+ },
+ "rateLimitEnabled": {
+ "type": "boolean"
+ },
+ "rateLimitTimeWindow": {
+ "type": "number"
+ },
+ "rateLimitMax": {
+ "type": "number"
+ },
+ "remaining": {
+ "type": "number"
+ },
+ "refillAmount": {
+ "type": "number"
+ },
+ "refillInterval": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "name",
+ "metadata"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.checkUserOrganizations": {
+ "get": {
+ "operationId": "user-checkUserOrganizations",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "userId",
+ "schema": {
+ "type": "string"
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.createUserWithCredentials": {
+ "post": {
+ "operationId": "user-createUserWithCredentials",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "password": {
+ "type": "string",
+ "minLength": 8
+ },
+ "role": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "email",
+ "password",
+ "role"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.sendInvitation": {
+ "post": {
+ "operationId": "user-sendInvitation",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "invitationId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "notificationId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "invitationId",
+ "notificationId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.getBookmarkedTemplates": {
+ "get": {
+ "operationId": "user-getBookmarkedTemplates",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/user.toggleTemplateBookmark": {
+ "post": {
+ "operationId": "user-toggleTemplateBookmark",
+ "tags": [
+ "user"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "templateId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "templateId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/ai.one": {
"get": {
"operationId": "ai-one",
@@ -41692,7 +49359,8 @@
"in": "query",
"name": "apiUrl",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
@@ -41791,16 +49459,19 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"apiUrl": {
- "type": "string"
+ "type": "string",
+ "format": "uri"
},
"apiKey": {
"type": "string"
},
"model": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"isEnabled": {
"type": "boolean"
@@ -41893,19 +49564,23 @@
"type": "object",
"properties": {
"aiId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"apiUrl": {
- "type": "string"
+ "type": "string",
+ "format": "uri"
},
"apiKey": {
"type": "string"
},
"model": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"isEnabled": {
"type": "boolean"
@@ -42227,6 +49902,459 @@
}
}
},
+ "/ai.getCustomProviders": {
+ "get": {
+ "operationId": "ai-getCustomProviders",
+ "tags": [
+ "ai"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ai.saveCustomProviders": {
+ "post": {
+ "operationId": "ai-saveCustomProviders",
+ "tags": [
+ "ai"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "providers": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "apiUrl": {
+ "type": "string",
+ "format": "uri"
+ }
+ },
+ "required": [
+ "name",
+ "apiUrl"
+ ]
+ }
+ }
+ },
+ "required": [
+ "providers"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ai.getEnabledProviders": {
+ "get": {
+ "operationId": "ai-getEnabledProviders",
+ "tags": [
+ "ai"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ai.analyzeLogs": {
+ "post": {
+ "operationId": "ai-analyzeLogs",
+ "tags": [
+ "ai"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "aiId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "logs": {
+ "type": "string",
+ "minLength": 1
+ },
+ "context": {
+ "type": "string",
+ "enum": [
+ "build",
+ "runtime"
+ ]
+ }
+ },
+ "required": [
+ "aiId",
+ "logs",
+ "context"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ai.testConnection": {
+ "post": {
+ "operationId": "ai-testConnection",
+ "tags": [
+ "ai"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "apiUrl": {
+ "type": "string",
+ "minLength": 1
+ },
+ "apiKey": {
+ "type": "string"
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "apiUrl",
+ "apiKey",
+ "model"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/ai.suggest": {
"post": {
"operationId": "ai-suggest",
@@ -42340,13 +50468,16 @@
"type": "object",
"properties": {
"environmentId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"id": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"dockerCompose": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"envVariables": {
"type": "string"
@@ -42355,7 +50486,8 @@
"type": "string"
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"type": "string"
@@ -42366,13 +50498,16 @@
"type": "object",
"properties": {
"host": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"port": {
- "type": "number"
+ "type": "number",
+ "minimum": 1
},
"serviceName": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -42388,10 +50523,12 @@
"type": "object",
"properties": {
"filePath": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"content": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -42901,6 +51038,99 @@
}
}
},
+ "/organization.inviteMember": {
+ "post": {
+ "operationId": "organization-inviteMember",
+ "tags": [
+ "organization"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
+ },
+ "role": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "email",
+ "role"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/organization.allInvitations": {
"get": {
"operationId": "organization-allInvitations",
@@ -43088,10 +51318,7 @@
},
"role": {
"type": "string",
- "enum": [
- "admin",
- "member"
- ]
+ "minLength": 1
}
},
"required": [
@@ -43178,7 +51405,8 @@
"type": "object",
"properties": {
"organizationId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -43341,7 +51569,8 @@
"type": "object",
"properties": {
"licenseKey": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -43855,6 +52084,83 @@
}
}
},
+ "/sso.enforceSSO": {
+ "get": {
+ "operationId": "sso-enforceSSO",
+ "tags": [
+ "sso"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/sso.listProviders": {
"get": {
"operationId": "sso-listProviders",
@@ -44025,7 +52331,8 @@
"in": "query",
"name": "providerId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -44464,7 +52771,8 @@
"type": "object",
"properties": {
"providerId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -44898,7 +53206,8 @@
"type": "object",
"properties": {
"origin": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -44984,7 +53293,8 @@
"type": "object",
"properties": {
"origin": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -45070,10 +53380,12 @@
"type": "object",
"properties": {
"oldOrigin": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"newOrigin": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -45140,6 +53452,2320 @@
}
}
},
+ "/scim.listProviders": {
+ "get": {
+ "operationId": "scim-listProviders",
+ "tags": [
+ "scim"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/scim.generateToken": {
+ "post": {
+ "operationId": "scim-generateToken",
+ "tags": [
+ "scim"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "providerId": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64,
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
+ }
+ },
+ "required": [
+ "providerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/scim.deleteProvider": {
+ "post": {
+ "operationId": "scim-deleteProvider",
+ "tags": [
+ "scim"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "providerId": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64,
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
+ }
+ },
+ "required": [
+ "providerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.getAuthDomain": {
+ "get": {
+ "operationId": "forwardAuth-getAuthDomain",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "serverId",
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.setAuthDomain": {
+ "post": {
+ "operationId": "forwardAuth-setAuthDomain",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "authDomain": {
+ "type": "string"
+ },
+ "https": {
+ "default": true,
+ "type": "boolean"
+ },
+ "certificateType": {
+ "default": "letsencrypt",
+ "type": "string",
+ "enum": [
+ "none",
+ "letsencrypt",
+ "custom"
+ ]
+ },
+ "customCertResolver": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "serverId",
+ "authDomain"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.removeAuthDomain": {
+ "post": {
+ "operationId": "forwardAuth-removeAuthDomain",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "serverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.listProviders": {
+ "get": {
+ "operationId": "forwardAuth-listProviders",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.serverStatus": {
+ "get": {
+ "operationId": "forwardAuth-serverStatus",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.deployOnServer": {
+ "post": {
+ "operationId": "forwardAuth-deployOnServer",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "providerId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "serverId",
+ "providerId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.removeOnServer": {
+ "post": {
+ "operationId": "forwardAuth-removeOnServer",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "serverId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "serverId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.status": {
+ "get": {
+ "operationId": "forwardAuth-status",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "domainId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.enable": {
+ "post": {
+ "operationId": "forwardAuth-enable",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "domainId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "domainId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/forwardAuth.disable": {
+ "post": {
+ "operationId": "forwardAuth-disable",
+ "tags": [
+ "forwardAuth"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "domainId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "domainId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/whitelabeling.get": {
+ "get": {
+ "operationId": "whitelabeling-get",
+ "tags": [
+ "whitelabeling"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/whitelabeling.update": {
+ "post": {
+ "operationId": "whitelabeling-update",
+ "tags": [
+ "whitelabeling"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "whitelabelingConfig": {
+ "type": "object",
+ "properties": {
+ "appName": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "appDescription": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "logoUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "faviconUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "customCss": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "loginLogoUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "supportUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "docsUrl": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "errorPageTitle": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "errorPageDescription": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "metaTitle": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "footerText": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "appName",
+ "appDescription",
+ "logoUrl",
+ "faviconUrl",
+ "customCss",
+ "loginLogoUrl",
+ "supportUrl",
+ "docsUrl",
+ "errorPageTitle",
+ "errorPageDescription",
+ "metaTitle",
+ "footerText"
+ ]
+ }
+ },
+ "required": [
+ "whitelabelingConfig"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/whitelabeling.reset": {
+ "post": {
+ "operationId": "whitelabeling-reset",
+ "tags": [
+ "whitelabeling"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/whitelabeling.getPublic": {
+ "get": {
+ "operationId": "whitelabeling-getPublic",
+ "tags": [
+ "whitelabeling"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.all": {
+ "get": {
+ "operationId": "customRole-all",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.create": {
+ "post": {
+ "operationId": "customRole-create",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "roleName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "permissions": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": [
+ "roleName",
+ "permissions"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.update": {
+ "post": {
+ "operationId": "customRole-update",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "roleName": {
+ "type": "string",
+ "minLength": 1
+ },
+ "newRoleName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "permissions": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "required": [
+ "roleName",
+ "permissions"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.remove": {
+ "post": {
+ "operationId": "customRole-remove",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "roleName": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "roleName"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.membersByRole": {
+ "get": {
+ "operationId": "customRole-membersByRole",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "roleName",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/customRole.getStatements": {
+ "get": {
+ "operationId": "customRole-getStatements",
+ "tags": [
+ "customRole"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/auditLog.all": {
+ "get": {
+ "operationId": "auditLog-all",
+ "tags": [
+ "auditLog"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "userId",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "userEmail",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "resourceName",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "action",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "create",
+ "update",
+ "delete",
+ "deploy",
+ "cancel",
+ "redeploy",
+ "login",
+ "logout"
+ ]
+ }
+ },
+ {
+ "in": "query",
+ "name": "resourceType",
+ "schema": {
+ "type": "string",
+ "enum": [
+ "project",
+ "service",
+ "environment",
+ "deployment",
+ "user",
+ "customRole",
+ "domain",
+ "certificate",
+ "registry",
+ "server",
+ "sshKey",
+ "gitProvider",
+ "notification",
+ "settings",
+ "session"
+ ]
+ }
+ },
+ {
+ "in": "query",
+ "name": "from",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "to",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "limit",
+ "schema": {
+ "default": 50,
+ "type": "number",
+ "minimum": 1,
+ "maximum": 500
+ }
+ },
+ {
+ "in": "query",
+ "name": "offset",
+ "schema": {
+ "default": 0,
+ "type": "number",
+ "minimum": 0
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/schedule.create": {
"post": {
"operationId": "schedule-create",
@@ -45165,6 +55791,16 @@
"name": {
"type": "string"
},
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"cronExpression": {
"type": "string"
},
@@ -45240,7 +55876,7 @@
}
]
},
- "userId": {
+ "organizationId": {
"anyOf": [
{
"type": "string"
@@ -45352,11 +55988,22 @@
"type": "object",
"properties": {
"scheduleId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
"type": "string"
},
+ "description": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"cronExpression": {
"type": "string"
},
@@ -45432,7 +56079,7 @@
}
]
},
- "userId": {
+ "organizationId": {
"anyOf": [
{
"type": "string"
@@ -45819,7 +56466,8 @@
"type": "object",
"properties": {
"scheduleId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -45905,7 +56553,8 @@
"type": "object",
"properties": {
"rollbackId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -45991,7 +56640,8 @@
"type": "object",
"properties": {
"rollbackId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -46073,7 +56723,8 @@
"in": "query",
"name": "id",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
@@ -46089,7 +56740,8 @@
"mariadb",
"mongo",
"redis",
- "compose"
+ "compose",
+ "libsql"
]
},
"required": true
@@ -46184,7 +56836,8 @@
"type": "string"
},
"volumeName": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
},
"prefix": {
"type": "string"
@@ -46198,7 +56851,8 @@
"mariadb",
"mongo",
"redis",
- "compose"
+ "compose",
+ "libsql"
]
},
"appName": {
@@ -46300,6 +56954,16 @@
}
]
},
+ "libsqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"composeId": {
"anyOf": [
{
@@ -46400,7 +57064,8 @@
"in": "query",
"name": "volumeBackupId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -46491,7 +57156,8 @@
"type": "object",
"properties": {
"volumeBackupId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -46580,7 +57246,8 @@
"type": "string"
},
"volumeName": {
- "type": "string"
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]*$"
},
"prefix": {
"type": "string"
@@ -46594,7 +57261,8 @@
"mariadb",
"mongo",
"redis",
- "compose"
+ "compose",
+ "libsql"
]
},
"appName": {
@@ -46696,6 +57364,16 @@
}
]
},
+ "libsqlId": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"composeId": {
"anyOf": [
{
@@ -46713,7 +57391,8 @@
"type": "string"
},
"volumeBackupId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -46804,7 +57483,8 @@
"type": "object",
"properties": {
"volumeBackupId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -46890,13 +57570,15 @@
"type": "object",
"properties": {
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"type": "string"
},
"projectId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -46979,7 +57661,8 @@
"in": "query",
"name": "environmentId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -47157,7 +57840,8 @@
"type": "object",
"properties": {
"environmentId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -47243,10 +57927,12 @@
"type": "object",
"properties": {
"environmentId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"type": "string"
@@ -47341,10 +58027,12 @@
"type": "object",
"properties": {
"environmentId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"name": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"description": {
"type": "string"
@@ -47459,7 +58147,9 @@
"name": "limit",
"schema": {
"default": 20,
- "type": "number"
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100
}
},
{
@@ -47467,7 +58157,8 @@
"name": "offset",
"schema": {
"default": 0,
- "type": "number"
+ "type": "number",
+ "minimum": 0
}
}
],
@@ -47537,6 +58228,741 @@
}
}
},
+ "/tag.create": {
+ "post": {
+ "operationId": "tag-create",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "color": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.all": {
+ "get": {
+ "operationId": "tag-all",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.one": {
+ "get": {
+ "operationId": "tag-one",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [
+ {
+ "in": "query",
+ "name": "tagId",
+ "schema": {
+ "type": "string",
+ "minLength": 1
+ },
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.NOT_FOUND"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.update": {
+ "post": {
+ "operationId": "tag-update",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "tagId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "color": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "organizationId": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "tagId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.remove": {
+ "post": {
+ "operationId": "tag-remove",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "tagId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "tagId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.assignToProject": {
+ "post": {
+ "operationId": "tag-assignToProject",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "projectId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tagId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "projectId",
+ "tagId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.removeFromProject": {
+ "post": {
+ "operationId": "tag-removeFromProject",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "projectId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tagId": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "projectId",
+ "tagId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/tag.bulkAssign": {
+ "post": {
+ "operationId": "tag-bulkAssign",
+ "tags": [
+ "tag"
+ ],
+ "security": [
+ {
+ "Authorization": []
+ }
+ ],
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "projectId": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tagIds": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
+ "required": [
+ "projectId",
+ "tagIds"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Successful response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid input data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.BAD_REQUEST"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authorization not provided",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.UNAUTHORIZED"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Insufficient access",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.FORBIDDEN"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/patch.create": {
"post": {
"operationId": "patch-create",
@@ -47557,7 +58983,8 @@
"type": "object",
"properties": {
"filePath": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"content": {
"type": "string"
@@ -47674,7 +59101,8 @@
"in": "query",
"name": "patchId",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
}
@@ -47864,7 +59292,8 @@
"type": "object",
"properties": {
"patchId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"type": {
"type": "string",
@@ -47875,7 +59304,8 @@
]
},
"filePath": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"enabled": {
"type": "boolean"
@@ -47980,7 +59410,8 @@
"type": "object",
"properties": {
"patchId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
}
},
"required": [
@@ -48066,7 +59497,8 @@
"type": "object",
"properties": {
"patchId": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"enabled": {
"type": "boolean"
@@ -48246,7 +59678,8 @@
"in": "query",
"name": "id",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
@@ -48353,7 +59786,8 @@
"in": "query",
"name": "id",
"schema": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"required": true
},
@@ -48464,7 +59898,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"type": {
"type": "string",
@@ -48574,7 +60009,8 @@
"type": "object",
"properties": {
"id": {
- "type": "string"
+ "type": "string",
+ "minLength": 1
},
"type": {
"type": "string",
@@ -48739,24 +60175,61 @@
"components": {
"schemas": {
"error.BAD_REQUEST": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "description": "The error message",
+ "example": "Invalid input data"
+ },
+ "code": {
+ "type": "string",
+ "description": "The error code",
+ "example": "BAD_REQUEST"
+ },
+ "issues": {
+ "description": "An array of issues that were responsible for the error",
+ "example": [],
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "message"
+ ],
+ "additionalProperties": false
+ }
+ }
+ },
+ "required": [
+ "message",
+ "code"
+ ],
+ "additionalProperties": false,
"title": "Invalid input data error (400)",
"description": "The error information",
"example": {
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
- },
+ }
+ },
+ "error.UNAUTHORIZED": {
"type": "object",
"properties": {
"message": {
+ "type": "string",
"description": "The error message",
- "example": "Invalid input data",
- "type": "string"
+ "example": "Authorization not provided"
},
"code": {
+ "type": "string",
"description": "The error code",
- "example": "BAD_REQUEST",
- "type": "string"
+ "example": "UNAUTHORIZED"
},
"issues": {
"description": "An array of issues that were responsible for the error",
@@ -48780,27 +60253,27 @@
"message",
"code"
],
- "additionalProperties": false
- },
- "error.UNAUTHORIZED": {
+ "additionalProperties": false,
"title": "Authorization not provided error (401)",
"description": "The error information",
"example": {
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
- },
+ }
+ },
+ "error.FORBIDDEN": {
"type": "object",
"properties": {
"message": {
+ "type": "string",
"description": "The error message",
- "example": "Authorization not provided",
- "type": "string"
+ "example": "Insufficient access"
},
"code": {
+ "type": "string",
"description": "The error code",
- "example": "UNAUTHORIZED",
- "type": "string"
+ "example": "FORBIDDEN"
},
"issues": {
"description": "An array of issues that were responsible for the error",
@@ -48824,27 +60297,27 @@
"message",
"code"
],
- "additionalProperties": false
- },
- "error.FORBIDDEN": {
+ "additionalProperties": false,
"title": "Insufficient access error (403)",
"description": "The error information",
"example": {
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
- },
+ }
+ },
+ "error.INTERNAL_SERVER_ERROR": {
"type": "object",
"properties": {
"message": {
+ "type": "string",
"description": "The error message",
- "example": "Insufficient access",
- "type": "string"
+ "example": "Internal server error"
},
"code": {
+ "type": "string",
"description": "The error code",
- "example": "FORBIDDEN",
- "type": "string"
+ "example": "INTERNAL_SERVER_ERROR"
},
"issues": {
"description": "An array of issues that were responsible for the error",
@@ -48868,27 +60341,27 @@
"message",
"code"
],
- "additionalProperties": false
- },
- "error.INTERNAL_SERVER_ERROR": {
+ "additionalProperties": false,
"title": "Internal server error error (500)",
"description": "The error information",
"example": {
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
- },
+ }
+ },
+ "error.NOT_FOUND": {
"type": "object",
"properties": {
"message": {
+ "type": "string",
"description": "The error message",
- "example": "Internal server error",
- "type": "string"
+ "example": "Not found"
},
"code": {
+ "type": "string",
"description": "The error code",
- "example": "INTERNAL_SERVER_ERROR",
- "type": "string"
+ "example": "NOT_FOUND"
},
"issues": {
"description": "An array of issues that were responsible for the error",
@@ -48912,51 +60385,14 @@
"message",
"code"
],
- "additionalProperties": false
- },
- "error.NOT_FOUND": {
+ "additionalProperties": false,
"title": "Not found error (404)",
"description": "The error information",
"example": {
"code": "NOT_FOUND",
"message": "Not found",
"issues": []
- },
- "type": "object",
- "properties": {
- "message": {
- "description": "The error message",
- "example": "Not found",
- "type": "string"
- },
- "code": {
- "description": "The error code",
- "example": "NOT_FOUND",
- "type": "string"
- },
- "issues": {
- "description": "An array of issues that were responsible for the error",
- "example": [],
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "message": {
- "type": "string"
- }
- },
- "required": [
- "message"
- ],
- "additionalProperties": false
- }
- }
- },
- "required": [
- "message",
- "code"
- ],
- "additionalProperties": false
+ }
}
},
"securitySchemes": {
@@ -48973,4 +60409,4 @@
"apiKey": []
}
]
-}
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 1090a55eb..47622c99d 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"generate:openapi": "pnpm --filter=dokploy run generate:openapi"
},
"devDependencies": {
- "@biomejs/biome": "2.1.1",
+ "@biomejs/biome": "2.5.7",
"@types/node": "^24.4.0",
"dotenv": "16.4.5",
"esbuild": "0.20.2",
diff --git a/packages/server/package.json b/packages/server/package.json
index 65ceb0046..05258ca6a 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -37,7 +37,9 @@
"@ai-sdk/mistral": "^3.0.20",
"@ai-sdk/openai": "^3.0.29",
"@ai-sdk/openai-compatible": "^2.0.30",
+ "@aws-sdk/client-secrets-manager": "^3.1097.0",
"@better-auth/api-key": "1.6.23",
+ "@better-auth/passkey": "1.6.23",
"@better-auth/scim": "1.6.23",
"@better-auth/sso": "1.6.23",
"@better-auth/utils": "0.4.2",
diff --git a/packages/server/src/db/schema/account.ts b/packages/server/src/db/schema/account.ts
index 0ab543177..718193b1f 100644
--- a/packages/server/src/db/schema/account.ts
+++ b/packages/server/src/db/schema/account.ts
@@ -8,6 +8,7 @@ import {
timestamp,
} from "drizzle-orm/pg-core";
import { nanoid } from "nanoid";
+import { network } from "./network";
import { projects } from "./project";
import { server } from "./server";
import { ssoProvider } from "./sso";
@@ -108,6 +109,7 @@ export const organizationRelations = relations(
references: [user.id],
}),
servers: many(server),
+ networks: many(network),
projects: many(projects),
members: many(member),
ssoProviders: many(ssoProvider),
@@ -221,6 +223,36 @@ export const twoFactor = pgTable("two_factor", {
lockedUntil: timestamp("locked_until"),
});
+export const passkey = pgTable(
+ "passkey",
+ {
+ id: text("id").primaryKey(),
+ name: text("name"),
+ publicKey: text("public_key").notNull(),
+ userId: text("user_id")
+ .notNull()
+ .references(() => user.id, { onDelete: "cascade" }),
+ credentialID: text("credential_id").notNull(),
+ counter: integer("counter").notNull(),
+ deviceType: text("device_type").notNull(),
+ backedUp: boolean("backed_up").notNull(),
+ transports: text("transports"),
+ createdAt: timestamp("created_at"),
+ aaguid: text("aaguid"),
+ },
+ (table) => [
+ index("passkey_userId_idx").on(table.userId),
+ index("passkey_credentialID_idx").on(table.credentialID),
+ ],
+);
+
+export const passkeyRelations = relations(passkey, ({ one }) => ({
+ user: one(user, {
+ fields: [passkey.userId],
+ references: [user.id],
+ }),
+}));
+
export const apikey = pgTable("apikey", {
id: text("id").primaryKey(),
name: text("name"),
diff --git a/packages/server/src/db/schema/ai.ts b/packages/server/src/db/schema/ai.ts
index 558f2648e..759bb6e87 100644
--- a/packages/server/src/db/schema/ai.ts
+++ b/packages/server/src/db/schema/ai.ts
@@ -54,6 +54,15 @@ export const apiUpdateAi = createSchema
})
.omit({ organizationId: true });
+export const aiCustomProviderSchema = z.object({
+ name: z.string().min(1, { message: "Name is required" }),
+ apiUrl: z.string().url({ message: "Please enter a valid URL" }),
+});
+
+export const apiSaveAiCustomProviders = z.object({
+ providers: z.array(aiCustomProviderSchema),
+});
+
export const deploySuggestionSchema = z.object({
environmentId: z.string().min(1),
id: z.string().min(1),
diff --git a/packages/server/src/db/schema/application.ts b/packages/server/src/db/schema/application.ts
index c2ad44126..65f1a3629 100644
--- a/packages/server/src/db/schema/application.ts
+++ b/packages/server/src/db/schema/application.ts
@@ -233,6 +233,10 @@ export const applications = pgTable("application", {
onDelete: "set null",
},
),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const applicationsRelations = relations(
@@ -374,6 +378,8 @@ const createSchema = createInsertSchema(applications, {
previewRequireCollaboratorPermissions: z.boolean().optional(),
watchPaths: z.array(z.string()).optional().optional(),
previewLabels: z.array(z.string()).optional(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
cleanCache: z.boolean().optional(),
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
diff --git a/packages/server/src/db/schema/audit-log.ts b/packages/server/src/db/schema/audit-log.ts
index 2b08bde63..377b51d8c 100644
--- a/packages/server/src/db/schema/audit-log.ts
+++ b/packages/server/src/db/schema/audit-log.ts
@@ -91,4 +91,6 @@ export type AuditResourceType =
| "cluster"
| "mount"
| "application"
- | "compose";
+ | "compose"
+ | "network"
+ | "vaultProvider";
diff --git a/packages/server/src/db/schema/compose.ts b/packages/server/src/db/schema/compose.ts
index 958da428c..ee4f248c5 100644
--- a/packages/server/src/db/schema/compose.ts
+++ b/packages/server/src/db/schema/compose.ts
@@ -1,5 +1,12 @@
import { relations } from "drizzle-orm";
-import { boolean, integer, pgEnum, pgTable, text } from "drizzle-orm/pg-core";
+import {
+ boolean,
+ integer,
+ jsonb,
+ pgEnum,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
@@ -80,6 +87,7 @@ export const compose = pgTable("compose", {
),
command: text("command").notNull().default(""),
//
+ createEnvFile: boolean("createEnvFile").notNull().default(true),
enableSubmodules: boolean("enableSubmodules").notNull().default(false),
composePath: text("composePath").notNull().default("./docker-compose.yml"),
suffix: text("suffix").notNull().default(""),
@@ -91,6 +99,7 @@ export const compose = pgTable("compose", {
.default(false),
triggerType: triggerType("triggerType").default("push"),
composeStatus: applicationStatus("composeStatus").notNull().default("idle"),
+ icon: text("icon"),
environmentId: text("environmentId")
.notNull()
.references(() => environments.environmentId, { onDelete: "cascade" }),
@@ -113,6 +122,15 @@ export const compose = pgTable("compose", {
serverId: text("serverId").references(() => server.serverId, {
onDelete: "cascade",
}),
+ serviceNetworks: jsonb("serviceNetworks")
+ .$type<
+ Array<{
+ serviceName: string;
+ networkIds: string[];
+ detachDokployNetwork: boolean;
+ }>
+ >()
+ .default([]),
});
export const composeRelations = relations(compose, ({ one, many }) => ({
@@ -166,6 +184,7 @@ const createSchema = createInsertSchema(compose, {
environmentId: z.string(),
customGitSSHKeyId: z.string().optional(),
command: z.string().optional(),
+ createEnvFile: z.boolean().optional(),
composePath: z.string().min(1),
composeType: z.enum(["docker-compose", "stack"]).optional(),
watchPaths: z.array(z.string()).optional(),
@@ -174,6 +193,20 @@ const createSchema = createInsertSchema(compose, {
.optional(),
triggerType: z.enum(["push", "tag"]).optional(),
composeStatus: z.enum(["idle", "running", "done", "error"]).optional(),
+ icon: z
+ .string()
+ .max(2 * 1024 * 1024, "Icon must be less than 2MB")
+ .nullable()
+ .optional(),
+ serviceNetworks: z
+ .array(
+ z.object({
+ serviceName: z.string(),
+ networkIds: z.array(z.string()),
+ detachDokployNetwork: z.boolean(),
+ }),
+ )
+ .optional(),
});
export const apiCreateCompose = createSchema.pick({
@@ -235,7 +268,10 @@ export const apiSaveEnvironmentVariablesCompose = createSchema
composeId: true,
env: true,
})
- .required();
+ .required()
+ .extend({
+ createEnvFile: z.boolean().optional(),
+ });
export const apiRandomizeCompose = createSchema
.pick({
diff --git a/packages/server/src/db/schema/github.ts b/packages/server/src/db/schema/github.ts
index b943b9945..7414d0449 100644
--- a/packages/server/src/db/schema/github.ts
+++ b/packages/server/src/db/schema/github.ts
@@ -16,6 +16,7 @@ export const github = pgTable("github", {
githubInstallationId: text("githubInstallationId"),
githubPrivateKey: text("githubPrivateKey"),
githubWebhookSecret: text("githubWebhookSecret"),
+ githubUrl: text("githubUrl").default("https://github.com").notNull(),
gitProviderId: text("gitProviderId")
.notNull()
.references(() => gitProvider.gitProviderId, { onDelete: "cascade" }),
@@ -36,6 +37,10 @@ export const apiCreateGithub = z.object({
githubInstallationId: z.string().optional(),
githubPrivateKey: z.string().optional(),
githubWebhookSecret: z.string().nullable(),
+ githubUrl: z
+ .url()
+ .startsWith("https://", "Only https is supported for GitHub instances")
+ .optional(),
gitProviderId: z.string().optional(),
name: z.string().min(1),
});
diff --git a/packages/server/src/db/schema/index.ts b/packages/server/src/db/schema/index.ts
index 5cdab7cd6..a5db69d31 100644
--- a/packages/server/src/db/schema/index.ts
+++ b/packages/server/src/db/schema/index.ts
@@ -20,6 +20,7 @@ export * from "./mariadb";
export * from "./mongo";
export * from "./mount";
export * from "./mysql";
+export * from "./network";
export * from "./notification";
export * from "./patch";
export * from "./port";
@@ -41,5 +42,6 @@ export * from "./sso";
export * from "./tag";
export * from "./user";
export * from "./utils";
+export * from "./vault-provider";
export * from "./volume-backups";
export * from "./web-server-settings";
diff --git a/packages/server/src/db/schema/libsql.ts b/packages/server/src/db/schema/libsql.ts
index e1158fbf7..0307991ae 100644
--- a/packages/server/src/db/schema/libsql.ts
+++ b/packages/server/src/db/schema/libsql.ts
@@ -83,6 +83,10 @@ export const libsql = pgTable("libsql", {
stopGracePeriodSwarm: bigint("stopGracePeriodSwarm", { mode: "number" }),
endpointSpecSwarm: json("endpointSpecSwarm").$type(),
replicas: integer("replicas").default(1).notNull(),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
createdAt: text("createdAt")
.notNull()
.$defaultFn(() => new Date().toISOString()),
@@ -146,6 +150,8 @@ const createSchema = createInsertSchema(libsql, {
networkSwarm: NetworkSwarmSchema.nullable(),
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreateLibsql = createSchema
diff --git a/packages/server/src/db/schema/mariadb.ts b/packages/server/src/db/schema/mariadb.ts
index 8220f2d70..48b48f5b6 100644
--- a/packages/server/src/db/schema/mariadb.ts
+++ b/packages/server/src/db/schema/mariadb.ts
@@ -1,5 +1,12 @@
import { relations } from "drizzle-orm";
-import { bigint, integer, json, pgTable, text } from "drizzle-orm/pg-core";
+import {
+ bigint,
+ boolean,
+ integer,
+ json,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
@@ -88,6 +95,10 @@ export const mariadb = pgTable("mariadb", {
serverId: text("serverId").references(() => server.serverId, {
onDelete: "cascade",
}),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const mariadbRelations = relations(mariadb, ({ one, many }) => ({
@@ -148,6 +159,8 @@ const createSchema = createInsertSchema(mariadb, {
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreateMariaDB = createSchema.pick({
diff --git a/packages/server/src/db/schema/mongo.ts b/packages/server/src/db/schema/mongo.ts
index ef3413ba5..07b1c2556 100644
--- a/packages/server/src/db/schema/mongo.ts
+++ b/packages/server/src/db/schema/mongo.ts
@@ -92,6 +92,10 @@ export const mongo = pgTable("mongo", {
onDelete: "cascade",
}),
replicaSets: boolean("replicaSets").default(false),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const mongoRelations = relations(mongo, ({ one, many }) => ({
@@ -146,6 +150,8 @@ const createSchema = createInsertSchema(mongo, {
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreateMongo = createSchema.pick({
diff --git a/packages/server/src/db/schema/mysql.ts b/packages/server/src/db/schema/mysql.ts
index da0764d57..3a58f5aad 100644
--- a/packages/server/src/db/schema/mysql.ts
+++ b/packages/server/src/db/schema/mysql.ts
@@ -1,5 +1,12 @@
import { relations } from "drizzle-orm";
-import { bigint, integer, json, pgTable, text } from "drizzle-orm/pg-core";
+import {
+ bigint,
+ boolean,
+ integer,
+ json,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
@@ -86,6 +93,10 @@ export const mysql = pgTable("mysql", {
serverId: text("serverId").references(() => server.serverId, {
onDelete: "cascade",
}),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const mysqlRelations = relations(mysql, ({ one, many }) => ({
@@ -145,6 +156,8 @@ const createSchema = createInsertSchema(mysql, {
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreateMySql = createSchema.pick({
diff --git a/packages/server/src/db/schema/network.ts b/packages/server/src/db/schema/network.ts
new file mode 100644
index 000000000..7a98964e2
--- /dev/null
+++ b/packages/server/src/db/schema/network.ts
@@ -0,0 +1,135 @@
+import { relations } from "drizzle-orm";
+import {
+ boolean,
+ integer,
+ jsonb,
+ pgEnum,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
+import { createInsertSchema } from "drizzle-zod";
+import { nanoid } from "nanoid";
+import { z } from "zod";
+import { organization } from "./account";
+import { server } from "./server";
+
+export const networkDriver = pgEnum("networkDriver", ["bridge", "overlay"]);
+
+export const network = pgTable("network", {
+ networkId: text("networkId")
+ .notNull()
+ .primaryKey()
+ .$defaultFn(() => nanoid()),
+ name: text("name").notNull(),
+ driver: networkDriver("driver").notNull().default("bridge"),
+ internal: boolean("internal").notNull().default(false),
+ attachable: boolean("attachable").notNull().default(false),
+ enableIPv4: boolean("enableIPv4").notNull().default(true),
+ enableIPv6: boolean("enableIPv6").notNull().default(false),
+ mtu: integer("mtu"),
+ ipam: jsonb("ipam")
+ .$type<{
+ driver?: string;
+ config?: Array<{ subnet?: string; gateway?: string; ipRange?: string }>;
+ }>()
+ .default({}),
+ createdAt: text("createdAt")
+ .notNull()
+ .$defaultFn(() => new Date().toISOString()),
+ organizationId: text("organizationId")
+ .notNull()
+ .references(() => organization.id, { onDelete: "cascade" }),
+ serverId: text("serverId").references(() => server.serverId, {
+ onDelete: "cascade",
+ }),
+});
+
+export const networkRelations = relations(network, ({ one }) => ({
+ organization: one(organization, {
+ fields: [network.organizationId],
+ references: [organization.id],
+ }),
+ server: one(server, {
+ fields: [network.serverId],
+ references: [server.serverId],
+ }),
+}));
+
+const createSchema = createInsertSchema(network, {
+ networkId: z.string().min(1),
+ name: z.string().min(1),
+ driver: z.enum(["bridge", "overlay"]).optional(),
+ internal: z.boolean().optional(),
+ attachable: z.boolean().optional(),
+ enableIPv4: z.boolean().optional(),
+ enableIPv6: z.boolean().optional(),
+ mtu: z.number().int().min(68).max(65535).optional().nullable(),
+ ipam: z
+ .object({
+ driver: z.string().optional(),
+ config: z
+ .array(
+ z.object({
+ subnet: z.string().optional(),
+ gateway: z.string().optional(),
+ ipRange: z.string().optional(),
+ }),
+ )
+ .optional(),
+ })
+ .optional(),
+ organizationId: z.string().min(1),
+ serverId: z.string().optional().nullable(),
+});
+
+const validateNetworkInput = (
+ input: {
+ enableIPv4?: boolean;
+ enableIPv6?: boolean;
+ ipam?: {
+ config?: Array<{ subnet?: string; gateway?: string; ipRange?: string }>;
+ } | null;
+ },
+ ctx: z.RefinementCtx,
+) => {
+ if (input.enableIPv4 === false && input.enableIPv6 !== true) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ["enableIPv4"],
+ message: "IPv4 or IPv6 must be enabled",
+ });
+ }
+ for (const [index, entry] of (input.ipam?.config ?? []).entries()) {
+ if (!entry.subnet && (entry.gateway || entry.ipRange)) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ["ipam", "config", index, "subnet"],
+ message: "Gateway and IP range require a subnet",
+ });
+ }
+ }
+};
+
+export const apiCreateNetwork = createSchema
+ .pick({
+ name: true,
+ driver: true,
+ internal: true,
+ attachable: true,
+ enableIPv4: true,
+ enableIPv6: true,
+ mtu: true,
+ ipam: true,
+ serverId: true,
+ })
+ .partial()
+ .required({ name: true })
+ .superRefine(validateNetworkInput);
+
+export const apiFindOneNetwork = z.object({
+ networkId: z.string().min(1),
+});
+
+export const apiRemoveNetwork = z.object({
+ networkId: z.string().min(1),
+});
diff --git a/packages/server/src/db/schema/postgres.ts b/packages/server/src/db/schema/postgres.ts
index 1ad7a6674..067b83e43 100644
--- a/packages/server/src/db/schema/postgres.ts
+++ b/packages/server/src/db/schema/postgres.ts
@@ -1,5 +1,12 @@
import { relations } from "drizzle-orm";
-import { bigint, integer, json, pgTable, text } from "drizzle-orm/pg-core";
+import {
+ bigint,
+ boolean,
+ integer,
+ json,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
@@ -86,6 +93,10 @@ export const postgres = pgTable("postgres", {
serverId: text("serverId").references(() => server.serverId, {
onDelete: "cascade",
}),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const postgresRelations = relations(postgres, ({ one, many }) => ({
@@ -140,6 +151,8 @@ const createSchema = createInsertSchema(postgres, {
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreatePostgres = createSchema.pick({
diff --git a/packages/server/src/db/schema/redis.ts b/packages/server/src/db/schema/redis.ts
index 0a63973b8..95ffd8503 100644
--- a/packages/server/src/db/schema/redis.ts
+++ b/packages/server/src/db/schema/redis.ts
@@ -1,5 +1,12 @@
import { relations } from "drizzle-orm";
-import { bigint, integer, json, pgTable, text } from "drizzle-orm/pg-core";
+import {
+ bigint,
+ boolean,
+ integer,
+ json,
+ pgTable,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
@@ -80,6 +87,10 @@ export const redis = pgTable("redis", {
serverId: text("serverId").references(() => server.serverId, {
onDelete: "cascade",
}),
+ networkIds: text("networkIds").array().default([]),
+ detachDokployNetwork: boolean("detachDokployNetwork")
+ .notNull()
+ .default(false),
});
export const redisRelations = relations(redis, ({ one, many }) => ({
@@ -129,6 +140,8 @@ const createSchema = createInsertSchema(redis, {
stopGracePeriodSwarm: z.number().nullable(),
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
+ networkIds: z.array(z.string()).optional(),
+ detachDokployNetwork: z.boolean().optional(),
});
export const apiCreateRedis = createSchema.pick({
diff --git a/packages/server/src/db/schema/rollbacks.ts b/packages/server/src/db/schema/rollbacks.ts
index ec27d683f..5e3d40776 100644
--- a/packages/server/src/db/schema/rollbacks.ts
+++ b/packages/server/src/db/schema/rollbacks.ts
@@ -1,4 +1,5 @@
import type { Application } from "@dokploy/server/services/application";
+import type { Environment } from "@dokploy/server/services/environment";
import type { Mount } from "@dokploy/server/services/mount";
import type { Port } from "@dokploy/server/services/port";
import type { Project } from "@dokploy/server/services/project";
@@ -27,7 +28,7 @@ export const rollbacks = pgTable("rollback", {
.$defaultFn(() => new Date().toISOString()),
fullContext: jsonb("fullContext").$type<
Application & {
- environment: {
+ environment: Environment & {
project: Project;
};
mounts: Mount[];
diff --git a/packages/server/src/db/schema/schedule.ts b/packages/server/src/db/schema/schedule.ts
index 4c679ae36..55c831f54 100644
--- a/packages/server/src/db/schema/schedule.ts
+++ b/packages/server/src/db/schema/schedule.ts
@@ -57,6 +57,7 @@ export const schedules = pgTable("schedule", {
});
export type Schedule = typeof schedules.$inferSelect;
+export type ScheduleType = Schedule["scheduleType"];
export const schedulesRelations = relations(schedules, ({ one, many }) => ({
application: one(applications, {
@@ -78,7 +79,9 @@ export const schedulesRelations = relations(schedules, ({ one, many }) => ({
deployments: many(deployments),
}));
-export const createScheduleSchema = createInsertSchema(schedules);
+export const createScheduleSchema = createInsertSchema(schedules, {
+ scheduleType: z.enum(["application", "compose", "server", "dokploy-server"]),
+});
export const updateScheduleSchema = createScheduleSchema.extend({
scheduleId: z.string().min(1),
diff --git a/packages/server/src/db/schema/server.ts b/packages/server/src/db/schema/server.ts
index 85ba663ef..d888c51f6 100644
--- a/packages/server/src/db/schema/server.ts
+++ b/packages/server/src/db/schema/server.ts
@@ -19,6 +19,7 @@ import { libsql } from "./libsql";
import { mariadb } from "./mariadb";
import { mongo } from "./mongo";
import { mysql } from "./mysql";
+import { network } from "./network";
import { postgres } from "./postgres";
import { redis } from "./redis";
import { schedules } from "./schedule";
@@ -125,6 +126,7 @@ export const serverRelations = relations(server, ({ one, many }) => ({
mysql: many(mysql),
postgres: many(postgres),
certificates: many(certificates),
+ networks: many(network),
organization: one(organization, {
fields: [server.organizationId],
references: [organization.id],
diff --git a/packages/server/src/db/schema/utils.ts b/packages/server/src/db/schema/utils.ts
index 4ba9007e1..4bf140738 100644
--- a/packages/server/src/db/schema/utils.ts
+++ b/packages/server/src/db/schema/utils.ts
@@ -41,6 +41,12 @@ export const APP_NAME_REGEX = /^[a-zA-Z0-9._-]+$/;
export const APP_NAME_MESSAGE =
"App name can only contain letters, numbers, dots, underscores and hyphens";
+/** Docker volume name: must start alphanumeric, then letters/numbers/._- only. Safe for shell. */
+export const VOLUME_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
+
+export const VOLUME_NAME_MESSAGE =
+ "Volume name must start with a letter or number and contain only letters, numbers, dots, underscores and hyphens";
+
/** Database password: blocks shell-dangerous characters like $ ! ' " \ / and spaces. */
export const DATABASE_PASSWORD_REGEX =
/^[a-zA-Z0-9@#%^&*()_+\-=[\]{}|;:,.<>?~`]*$/;
diff --git a/packages/server/src/db/schema/vault-provider.ts b/packages/server/src/db/schema/vault-provider.ts
new file mode 100644
index 000000000..6056e54cf
--- /dev/null
+++ b/packages/server/src/db/schema/vault-provider.ts
@@ -0,0 +1,145 @@
+import { jsonb, pgEnum, pgTable, text, uniqueIndex } from "drizzle-orm/pg-core";
+import { createInsertSchema } from "drizzle-zod";
+import { nanoid } from "nanoid";
+import { z } from "zod";
+import { organization } from "./account";
+
+export const vaultProviderType = pgEnum("VaultProviderType", [
+ "hashicorp",
+ "infisical",
+ "aws",
+ "doppler",
+ "azure",
+]);
+
+export const hashicorpVaultConfigSchema = z.object({
+ providerType: z.literal("hashicorp"),
+ url: z.string().url(),
+ token: z.string().min(1),
+ namespace: z.string().optional(),
+ mount: z.string().min(1).default("secret"),
+});
+
+export const infisicalVaultConfigSchema = z.object({
+ providerType: z.literal("infisical"),
+ siteUrl: z.string().url().default("https://app.infisical.com"),
+ clientId: z.string().min(1),
+ clientSecret: z.string().min(1),
+ projectId: z.string().min(1),
+ environmentSlug: z.string().min(1),
+ secretPath: z.string().default("/"),
+});
+
+export const awsVaultConfigSchema = z.object({
+ providerType: z.literal("aws"),
+ region: z.string().min(1),
+ accessKeyId: z.string().min(1),
+ secretAccessKey: z.string().min(1),
+ endpoint: z.string().url().optional(),
+});
+
+export const dopplerVaultConfigSchema = z.object({
+ providerType: z.literal("doppler"),
+ serviceToken: z.string().min(1),
+ project: z.string().optional(),
+ config: z.string().optional(),
+});
+
+export const azureVaultConfigSchema = z.object({
+ providerType: z.literal("azure"),
+ vaultUri: z.string().url(),
+ tenantId: z.string().min(1),
+ clientId: z.string().min(1),
+ clientSecret: z.string().min(1),
+});
+
+export const vaultProviderConfigSchema = z.discriminatedUnion("providerType", [
+ hashicorpVaultConfigSchema,
+ infisicalVaultConfigSchema,
+ awsVaultConfigSchema,
+ dopplerVaultConfigSchema,
+ azureVaultConfigSchema,
+]);
+
+export type VaultProviderConfig = z.infer;
+
+export const vaultProviderAssignmentSchema = z.object({
+ projectId: z.string().min(1),
+ environmentIds: z.array(z.string().min(1)).default([]),
+});
+
+export type VaultProviderAssignment = z.infer<
+ typeof vaultProviderAssignmentSchema
+>;
+
+export const vaultProvider = pgTable(
+ "vault_provider",
+ {
+ vaultProviderId: text("vaultProviderId")
+ .notNull()
+ .primaryKey()
+ .$defaultFn(() => nanoid()),
+ name: text("name").notNull(),
+ providerType: vaultProviderType("providerType").notNull(),
+ config: jsonb("config").$type().notNull(),
+ assignments: jsonb("assignments")
+ .$type()
+ .notNull()
+ .default([]),
+ organizationId: text("organizationId")
+ .notNull()
+ .references(() => organization.id, { onDelete: "cascade" }),
+ createdAt: text("createdAt")
+ .notNull()
+ .$defaultFn(() => new Date().toISOString()),
+ },
+ (table) => [
+ uniqueIndex("vault_provider_org_name_idx").on(
+ table.organizationId,
+ table.name,
+ ),
+ ],
+);
+
+const vaultProviderNameSchema = z
+ .string()
+ .min(1)
+ .max(64)
+ .regex(
+ /^[a-zA-Z0-9_-]+$/,
+ "Name can only contain letters, numbers, dashes and underscores",
+ );
+
+const createSchema = createInsertSchema(vaultProvider);
+
+export const apiCreateVaultProvider = createSchema.pick({}).extend({
+ name: vaultProviderNameSchema,
+ config: vaultProviderConfigSchema,
+ assignments: z.array(vaultProviderAssignmentSchema),
+});
+
+export const apiUpdateVaultProvider = createSchema.pick({}).extend({
+ vaultProviderId: z.string().min(1),
+ name: vaultProviderNameSchema,
+ config: vaultProviderConfigSchema,
+ assignments: z.array(vaultProviderAssignmentSchema),
+});
+
+export const apiFindOneVaultProvider = z.object({
+ vaultProviderId: z.string().min(1),
+});
+
+export const apiRemoveVaultProvider = z.object({
+ vaultProviderId: z.string().min(1),
+});
+
+export const apiTestVaultProvider = z.object({
+ vaultProviderId: z.string().min(1).optional(),
+ config: vaultProviderConfigSchema.optional(),
+});
+
+export const apiListVaultSecretNames = z.object({
+ vaultProviderId: z.string().min(1),
+ projectId: z.string().min(1),
+ environmentId: z.string().optional(),
+});
diff --git a/packages/server/src/db/schema/volume-backups.ts b/packages/server/src/db/schema/volume-backups.ts
index fd3b48253..bf025126d 100644
--- a/packages/server/src/db/schema/volume-backups.ts
+++ b/packages/server/src/db/schema/volume-backups.ts
@@ -14,7 +14,11 @@ import { serviceType } from "./mount";
import { mysql } from "./mysql";
import { postgres } from "./postgres";
import { redis } from "./redis";
-import { generateAppName } from "./utils";
+import {
+ generateAppName,
+ VOLUME_NAME_MESSAGE,
+ VOLUME_NAME_REGEX,
+} from "./utils";
export const volumeBackups = pgTable("volume_backup", {
volumeBackupId: text("volumeBackupId")
@@ -113,7 +117,9 @@ export const volumeBackupsRelations = relations(
}),
);
-export const createVolumeBackupSchema = createInsertSchema(volumeBackups).omit({
+export const createVolumeBackupSchema = createInsertSchema(volumeBackups, {
+ volumeName: z.string().regex(VOLUME_NAME_REGEX, VOLUME_NAME_MESSAGE),
+}).omit({
volumeBackupId: true,
});
diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts
index 165e1667e..e51864367 100644
--- a/packages/server/src/index.ts
+++ b/packages/server/src/index.ts
@@ -17,6 +17,7 @@ export * from "./services/compose";
export * from "./services/deployment";
export * from "./services/destination";
export * from "./services/docker";
+export * from "./services/docker-volume";
export * from "./services/domain";
export * from "./services/environment";
export * from "./services/git-provider";
@@ -28,6 +29,7 @@ export * from "./services/mariadb";
export * from "./services/mongo";
export * from "./services/mount";
export * from "./services/mysql";
+export * from "./services/network";
export * from "./services/notification";
export * from "./services/patch";
export * from "./services/patch-repo";
@@ -49,13 +51,13 @@ export * from "./services/server";
export * from "./services/settings";
export * from "./services/ssh-key";
export * from "./services/user";
+export * from "./services/vault-provider";
export * from "./services/volume-backups";
export * from "./services/web-server-settings";
export * from "./setup/config-paths";
export * from "./setup/forward-auth-setup";
export * from "./setup/monitoring-setup";
export * from "./setup/postgres-setup";
-export * from "./setup/redis-setup";
export * from "./setup/server-audit";
export * from "./setup/server-setup";
export * from "./setup/server-validate";
@@ -101,6 +103,7 @@ export * from "./utils/docker/compose/volume";
export * from "./utils/docker/domain";
export * from "./utils/docker/types";
export * from "./utils/docker/utils";
+export * from "./utils/vault";
export * from "./utils/filesystem/directory";
export * from "./utils/filesystem/ssh";
export * from "./utils/git-branch-validation";
diff --git a/packages/server/src/lib/access-control.ts b/packages/server/src/lib/access-control.ts
index 72a5a76af..ab761bcc0 100644
--- a/packages/server/src/lib/access-control.ts
+++ b/packages/server/src/lib/access-control.ts
@@ -48,6 +48,7 @@ export const statements = {
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
} as const;
/**
@@ -74,6 +75,7 @@ export const enterpriseOnlyResources = new Set([
"logs",
"monitoring",
"auditLog",
+ "vaultProvider",
]);
export const ac = createAccessControl(statements);
@@ -113,6 +115,7 @@ export const ownerRole = ac.newRole({
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
});
/**
@@ -150,6 +153,7 @@ export const adminRole = ac.newRole({
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
});
/**
@@ -192,4 +196,6 @@ export const memberRole = ac.newRole({
notification: [],
tag: ["read"],
auditLog: [],
+ // Members need provider/secret names for env editor autocomplete; values are never exposed
+ vaultProvider: ["read"],
});
diff --git a/packages/server/src/lib/auth-cli.ts b/packages/server/src/lib/auth-cli.ts
index 4e635179a..f5ad462f5 100644
--- a/packages/server/src/lib/auth-cli.ts
+++ b/packages/server/src/lib/auth-cli.ts
@@ -1,4 +1,5 @@
import { apiKey } from "@better-auth/api-key";
+import { passkey } from "@better-auth/passkey";
import { scim } from "@better-auth/scim";
import { sso } from "@better-auth/sso";
import { betterAuth } from "better-auth";
@@ -33,6 +34,7 @@ export const auth = betterAuth({
apiKey({ enableMetadata: true, references: "user" }),
sso(),
twoFactor(),
+ passkey(),
organization({
ac,
roles: { owner: ownerRole, admin: adminRole, member: memberRole },
diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts
index 7c4d48a95..e5de5a6dc 100644
--- a/packages/server/src/lib/auth.ts
+++ b/packages/server/src/lib/auth.ts
@@ -1,5 +1,6 @@
import type { IncomingMessage } from "node:http";
import { apiKey } from "@better-auth/api-key";
+import { passkey } from "@better-auth/passkey";
import { scim } from "@better-auth/scim";
import { sso } from "@better-auth/sso";
import * as bcrypt from "bcrypt";
@@ -419,7 +420,7 @@ const createBetterAuth = () =>
enableMetadata: true,
references: "user",
}),
- sso(),
+ sso({ trustEmailVerified: true }),
scim({
beforeSCIMTokenGenerated: async ({ user }) => {
const dbUser = await db.query.user.findFirst({
@@ -435,6 +436,7 @@ const createBetterAuth = () =>
},
}),
twoFactor(),
+ passkey(),
organization({
ac,
roles: {
diff --git a/packages/server/src/monitoring/units.ts b/packages/server/src/monitoring/units.ts
new file mode 100644
index 000000000..880e8cdb8
--- /dev/null
+++ b/packages/server/src/monitoring/units.ts
@@ -0,0 +1,41 @@
+const IO_UNIT_FACTORS: Record = {
+ B: 1 / 1e6,
+ kB: 1e-3,
+ KB: 1e-3,
+ MB: 1,
+ GB: 1e3,
+ TB: 1e6,
+ KiB: 1024 / 1e6,
+ MiB: 1024 ** 2 / 1e6,
+ GiB: 1024 ** 3 / 1e6,
+ TiB: 1024 ** 4 / 1e6,
+};
+
+export const toMb = (value: number | string | undefined): number => {
+ if (typeof value === "number") {
+ return value;
+ }
+ if (!value) {
+ return 0;
+ }
+ const parsed = Number.parseFloat(value);
+ if (Number.isNaN(parsed)) {
+ return 0;
+ }
+ const unit = value.replace(/[0-9.\s]/g, "");
+ return parsed * (IO_UNIT_FACTORS[unit] ?? 1);
+};
+
+export const parseIoToMb = (raw: string | undefined): number =>
+ Number(toMb(raw).toFixed(6));
+
+export const formatMb = (value: number | string | undefined): string => {
+ const mb = toMb(value);
+ if (mb >= 1000) {
+ return `${(mb / 1000).toFixed(2)} GB`;
+ }
+ if (mb < 0.01 && mb > 0) {
+ return `${(mb * 1000).toFixed(2)} kB`;
+ }
+ return `${mb.toFixed(2)} MB`;
+};
diff --git a/packages/server/src/monitoring/utils.ts b/packages/server/src/monitoring/utils.ts
index 2c42b99a6..c2eefc8ae 100644
--- a/packages/server/src/monitoring/utils.ts
+++ b/packages/server/src/monitoring/utils.ts
@@ -1,6 +1,7 @@
import { promises } from "node:fs";
import { OSUtils } from "node-os-utils";
import { paths } from "../constants";
+import { parseIoToMb } from "./units";
export interface Container {
BlockIO: string;
@@ -28,13 +29,13 @@ export const recordAdvancedStats = async (
});
await updateStatsFile(appName, "block", {
- readMb: stats.BlockIO.split(" ")[0],
- writeMb: stats.BlockIO.split(" ")[2],
+ readMb: parseIoToMb(stats.BlockIO.split(" ")[0]),
+ writeMb: parseIoToMb(stats.BlockIO.split(" ")[2]),
});
await updateStatsFile(appName, "network", {
- inputMb: stats.NetIO.split(" ")[0],
- outputMb: stats.NetIO.split(" ")[2],
+ inputMb: parseIoToMb(stats.NetIO.split(" ")[0]),
+ outputMb: parseIoToMb(stats.NetIO.split(" ")[2]),
});
if (appName === "dokploy") {
diff --git a/packages/server/src/services/ai.ts b/packages/server/src/services/ai.ts
index 8eace69f1..0554f10db 100644
--- a/packages/server/src/services/ai.ts
+++ b/packages/server/src/services/ai.ts
@@ -1,5 +1,6 @@
import { db } from "@dokploy/server/db";
-import { ai } from "@dokploy/server/db/schema";
+import { ai, organization } from "@dokploy/server/db/schema";
+import { aiCustomProviderSchema } from "@dokploy/server/db/schema/ai";
import { selectAIProvider } from "@dokploy/server/utils/ai/select-ai-provider";
import { TRPCError } from "@trpc/server";
import { generateText, Output } from "ai";
@@ -48,9 +49,74 @@ export const getAiSettingById = async (aiId: string) => {
return aiSetting;
};
+type AiCustomProvider = z.infer;
+
+const parseOrgMetadata = (metadata: string | null) => {
+ try {
+ const parsed = JSON.parse(metadata || "{}");
+ return typeof parsed === "object" && parsed !== null
+ ? (parsed as Record)
+ : {};
+ } catch {
+ return {};
+ }
+};
+
+export const getCustomAiProviders = async (organizationId: string) => {
+ const org = await db.query.organization.findFirst({
+ where: eq(organization.id, organizationId),
+ });
+ const metadata = parseOrgMetadata(org?.metadata ?? null);
+ const result = z
+ .array(aiCustomProviderSchema)
+ .safeParse(metadata.aiProviders);
+ return result.success ? result.data : [];
+};
+
+export const saveCustomAiProviders = async (
+ organizationId: string,
+ providers: AiCustomProvider[],
+) => {
+ const org = await db.query.organization.findFirst({
+ where: eq(organization.id, organizationId),
+ });
+ if (!org) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Organization not found",
+ });
+ }
+ const metadata = parseOrgMetadata(org.metadata);
+ metadata.aiProviders = providers;
+ await db
+ .update(organization)
+ .set({ metadata: JSON.stringify(metadata) })
+ .where(eq(organization.id, organizationId));
+ return providers;
+};
+
+const normalizeApiUrl = (url: string) => url.trim().replace(/\/+$/, "");
+
export const saveAiSettings = async (organizationId: string, settings: any) => {
const aiId = settings.aiId;
+ if (settings.apiUrl) {
+ const customProviders = await getCustomAiProviders(organizationId);
+ if (customProviders.length > 0) {
+ const isAllowed = customProviders.some(
+ (provider) =>
+ normalizeApiUrl(provider.apiUrl) === normalizeApiUrl(settings.apiUrl),
+ );
+ if (!isAllowed) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message:
+ "This API URL is not in your organization's allowed AI providers",
+ });
+ }
+ }
+ }
+
return db
.insert(ai)
.values({
diff --git a/packages/server/src/services/application.ts b/packages/server/src/services/application.ts
index c8ebb3be7..0f2e5a4fc 100644
--- a/packages/server/src/services/application.ts
+++ b/packages/server/src/services/application.ts
@@ -102,10 +102,24 @@ export const findApplicationById = async (applicationId: string) => {
redirects: true,
security: true,
ports: true,
- gitlab: true,
- github: true,
- bitbucket: true,
- gitea: true,
+ gitlab: {
+ columns: { secret: false, accessToken: false, refreshToken: false },
+ },
+ github: {
+ columns: {
+ githubClientSecret: false,
+ githubPrivateKey: false,
+ githubWebhookSecret: false,
+ },
+ },
+ bitbucket: { columns: { appPassword: false, apiToken: false } },
+ gitea: {
+ columns: {
+ clientSecret: false,
+ accessToken: false,
+ refreshToken: false,
+ },
+ },
server: true,
previewDeployments: true,
registry: { columns: { password: false } },
diff --git a/packages/server/src/services/certificate.ts b/packages/server/src/services/certificate.ts
index aa5c3983c..1c6137506 100644
--- a/packages/server/src/services/certificate.ts
+++ b/packages/server/src/services/certificate.ts
@@ -9,6 +9,7 @@ import {
import { removeDirectoryIfExistsContent } from "@dokploy/server/utils/filesystem/directory";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import { stringify } from "yaml";
import type { z } from "zod";
import { encodeBase64 } from "../utils/docker/utils";
@@ -63,7 +64,7 @@ export const removeCertificateById = async (certificateId: string) => {
const certDir = path.join(CERTIFICATES_PATH, certificate.certificatePath);
if (certificate.serverId) {
- await execAsyncRemote(certificate.serverId, `rm -rf ${certDir}`);
+ await execAsyncRemote(certificate.serverId, `rm -rf ${quote([certDir])}`);
} else {
await removeDirectoryIfExistsContent(certDir);
}
@@ -108,10 +109,10 @@ const createCertificateFiles = async (certificate: Certificate) => {
const certificateData = encodeBase64(certificate.certificateData);
const privateKey = encodeBase64(certificate.privateKey);
const command = `
- mkdir -p ${certDir};
- echo "${certificateData}" | base64 -d > "${crtPath}";
- echo "${privateKey}" | base64 -d > "${keyPath}";
- echo "${yamlConfig}" > "${configFile}";
+ mkdir -p ${quote([certDir])};
+ echo "${certificateData}" | base64 -d > ${quote([crtPath])};
+ echo "${privateKey}" | base64 -d > ${quote([keyPath])};
+ echo "${yamlConfig}" > ${quote([configFile])};
`;
await execAsyncRemote(certificate.serverId, command);
diff --git a/packages/server/src/services/compose.ts b/packages/server/src/services/compose.ts
index 7a887cdc4..35b1d5dc7 100644
--- a/packages/server/src/services/compose.ts
+++ b/packages/server/src/services/compose.ts
@@ -33,6 +33,7 @@ import { cloneGitlabRepository } from "@dokploy/server/utils/providers/gitlab";
import { getCreateComposeFileCommand } from "@dokploy/server/utils/providers/raw";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { encodeBase64 } from "../utils/docker/utils";
import { getDokployUrl } from "./admin";
@@ -472,7 +473,7 @@ export const startCompose = async (composeId: string) => {
const projectPath = join(COMPOSE_PATH, compose.appName, "code");
const path =
compose.sourceType === "raw" ? "docker-compose.yml" : compose.composePath;
- const baseCommand = `env -i PATH="$PATH" docker compose -p ${compose.appName} -f ${path} up -d`;
+ const baseCommand = `env -i PATH="$PATH" docker compose -p ${quote([compose.appName])} -f ${quote([path])} up -d`;
if (compose.composeType === "docker-compose") {
if (compose.serverId) {
await execAsyncRemote(
diff --git a/packages/server/src/services/deployment.ts b/packages/server/src/services/deployment.ts
index 0431de18e..b78e6c203 100644
--- a/packages/server/src/services/deployment.ts
+++ b/packages/server/src/services/deployment.ts
@@ -83,8 +83,17 @@ export const findDeploymentById = async (deploymentId: string) => {
const deployment = await db.query.deployments.findFirst({
where: eq(deployments.deploymentId, deploymentId),
with: {
- application: true,
- compose: true,
+ application: {
+ columns: {
+ applicationId: true,
+ appName: true,
+ name: true,
+ serverId: true,
+ },
+ },
+ compose: {
+ columns: { composeId: true, appName: true, name: true, serverId: true },
+ },
schedule: true,
},
});
diff --git a/packages/server/src/services/docker-volume.ts b/packages/server/src/services/docker-volume.ts
new file mode 100644
index 000000000..1fbe12376
--- /dev/null
+++ b/packages/server/src/services/docker-volume.ts
@@ -0,0 +1,161 @@
+import {
+ execAsync,
+ execAsyncRemote,
+} from "@dokploy/server/utils/process/execAsync";
+import { quote } from "shell-quote";
+import { CONTAINER_FILE_SIZE_LIMIT } from "./docker";
+
+export interface DockerVolume {
+ Name: string;
+ Driver: string;
+ Scope: string;
+ Mountpoint: string;
+ Labels: string;
+ Availability?: string;
+ Group?: string;
+ Links?: string;
+ Size?: string;
+ Status?: string;
+}
+
+const VOLUME_MOUNT = "/__volume";
+
+export const getVolumes = async (serverId?: string) => {
+ try {
+ const command = "docker volume ls --format '{{json .}}'";
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ return stdout
+ .trim()
+ .split("\n")
+ .filter(Boolean)
+ .map((line) => JSON.parse(line) as DockerVolume);
+ } catch (error) {
+ console.error(error);
+ return [];
+ }
+};
+
+export const getVolumesSize = async (serverId?: string) => {
+ try {
+ const command = "docker system df -v --format '{{json .}}'";
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ const diskUsage = JSON.parse(stdout.trim());
+ return ((diskUsage?.Volumes ?? []) as Partial[])
+ .filter((volume) => volume?.Name)
+ .map((volume) => ({
+ name: volume.Name as string,
+ size: volume.Size ?? null,
+ }));
+ } catch (error) {
+ console.error(error);
+ return [];
+ }
+};
+
+export const getVolumeConfig = async (
+ volumeName: string,
+ serverId?: string,
+) => {
+ const command = `docker volume inspect ${quote([String(volumeName ?? "")])}`;
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ return JSON.parse(stdout.trim())[0];
+};
+
+export const removeVolume = async (volumeName: string, serverId?: string) => {
+ const command = `docker volume rm ${quote([String(volumeName ?? "")])}`;
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+};
+
+export const listVolumeFiles = async (
+ volumeName: string,
+ path: string,
+ serverId?: string,
+) => {
+ const command = `docker run --rm -v ${quote([`${volumeName}:${VOLUME_MOUNT}:ro`])} busybox ls -1Ap ${quote([`${VOLUME_MOUNT}${path}`])}`;
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ return stdout
+ .split("\n")
+ .filter(Boolean)
+ .map((entry) => ({
+ name: entry.endsWith("/") ? entry.slice(0, -1) : entry,
+ isDirectory: entry.endsWith("/"),
+ }))
+ .sort((a, b) => {
+ if (a.isDirectory !== b.isDirectory) {
+ return a.isDirectory ? -1 : 1;
+ }
+ return a.name.localeCompare(b.name);
+ });
+};
+
+export const readVolumeFile = async (
+ volumeName: string,
+ filePath: string,
+ serverId?: string,
+) => {
+ const command = `docker run --rm -v ${quote([`${volumeName}:${VOLUME_MOUNT}:ro`])} busybox cat ${quote([`${VOLUME_MOUNT}${filePath}`])} | head -c ${CONTAINER_FILE_SIZE_LIMIT + 1} | base64 | tr -d '\\n'`;
+ const { stdout, stderr } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ if (stderr && !stdout) {
+ throw new Error(stderr);
+ }
+
+ const buffer = Buffer.from(stdout.trim(), "base64");
+ return {
+ content: buffer.subarray(0, CONTAINER_FILE_SIZE_LIMIT).toString("base64"),
+ truncated: buffer.byteLength > CONTAINER_FILE_SIZE_LIMIT,
+ };
+};
+
+export const writeVolumeFile = async (
+ volumeName: string,
+ filePath: string,
+ content: string,
+ serverId?: string,
+) => {
+ const base64Content = Buffer.from(content, "utf8").toString("base64");
+ if (base64Content.length > CONTAINER_FILE_SIZE_LIMIT * 2) {
+ throw new Error("File is too large to save from the editor (max 512KB)");
+ }
+
+ const innerCommand = `printf '%s' ${base64Content} | base64 -d > ${quote([`${VOLUME_MOUNT}${filePath}`])}`;
+ const command = `docker run --rm -v ${quote([`${volumeName}:${VOLUME_MOUNT}`])} busybox sh -c ${quote([innerCommand])}`;
+
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+};
+
+export const deleteVolumeFile = async (
+ volumeName: string,
+ path: string,
+ serverId?: string,
+) => {
+ const command = `docker run --rm -v ${quote([`${volumeName}:${VOLUME_MOUNT}`])} busybox rm -rf ${quote([`${VOLUME_MOUNT}${path}`])}`;
+
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+};
diff --git a/packages/server/src/services/docker.ts b/packages/server/src/services/docker.ts
index 226230fbc..9f9cf9100 100644
--- a/packages/server/src/services/docker.ts
+++ b/packages/server/src/services/docker.ts
@@ -1,7 +1,9 @@
import {
+ ExecError,
execAsync,
execAsyncRemote,
} from "@dokploy/server/utils/process/execAsync";
+import { quote } from "shell-quote";
export const getContainers = async (serverId?: string | null) => {
try {
@@ -107,6 +109,9 @@ export const getContainersByAppNameMatch = async (
serverId?: string,
) => {
try {
+ if (appType === "stack") {
+ return await getStackTaskContainers(appName, serverId);
+ }
let result: string[] = [];
const cmd =
"docker ps -a --format 'CONTAINER ID : {{.ID}} | Name: {{.Names}} | State: {{.State}} | Status: {{.Status}}'";
@@ -165,6 +170,66 @@ export const getContainersByAppNameMatch = async (
return [];
};
+const getStackTaskContainers = async (appName: string, serverId?: string) => {
+ try {
+ const divider = "__DOKPLOY_DIVIDER__";
+ const tasksCommand = `docker stack ps ${appName} --no-trunc --filter "desired-state=running" --format 'TASK : {{.ID}} | Name: {{.Name}} | Node: {{.Node}} | CurrentState: {{.CurrentState}} | Error: {{.Error}}'`;
+ const inspectCommand = `docker stack ps ${appName} -q --no-trunc --filter "desired-state=running" | xargs -r docker inspect --format '{{if .Status.ContainerStatus}}TASK : {{.ID}} | ContainerId: {{.Status.ContainerStatus.ContainerID}}{{end}}' 2>/dev/null`;
+ const command = `${tasksCommand} && echo "${divider}" && (${inspectCommand} || true)`;
+
+ let stdout = "";
+
+ if (serverId) {
+ const result = await execAsyncRemote(serverId, command);
+ stdout = result.stdout;
+ } else {
+ const result = await execAsync(command);
+ stdout = result.stdout;
+ }
+
+ if (!stdout) return [];
+
+ const [tasksSection = "", inspectSection = ""] = stdout.split(divider);
+
+ const containerIdByTask = new Map();
+ for (const line of inspectSection.trim().split("\n")) {
+ const parts = line.split(" | ");
+ const taskId = parts[0]?.replace("TASK : ", "").trim();
+ const containerId = parts[1]?.replace("ContainerId: ", "").trim();
+ if (taskId && containerId) {
+ containerIdByTask.set(taskId, containerId);
+ }
+ }
+
+ const containers = [];
+
+ for (const line of tasksSection.trim().split("\n")) {
+ if (!line) continue;
+ const parts = line.split(" | ");
+ const taskId = parts[0]?.replace("TASK : ", "").trim() ?? "";
+ const name = parts[1]?.replace("Name: ", "").trim() ?? "";
+ const node = parts[2]?.replace("Node: ", "").trim() ?? "";
+ const currentState = parts[3]
+ ? parts[3].replace("CurrentState: ", "").trim()
+ : "";
+ const error = parts[4] ? parts[4].replace("Error: ", "").trim() : "";
+ const containerId = containerIdByTask.get(taskId) ?? "";
+
+ containers.push({
+ containerId: containerId.slice(0, 12),
+ name: `${name}.${taskId}`,
+ node,
+ state: currentState.split(" ")[0]?.toLowerCase() ?? "No state",
+ status: error ? `${currentState} (${error})` : currentState,
+ });
+ }
+
+ return containers;
+ } catch {}
+
+ return [];
+};
+
export const getStackContainersByAppName = async (
appName: string,
serverId?: string,
@@ -174,7 +239,6 @@ export const getStackContainersByAppName = async (
const command = `docker stack ps ${appName} --no-trunc --format 'CONTAINER ID : {{.ID}} | Name: {{.Name}} | State: {{.DesiredState}} | Node: {{.Node}} | CurrentState: {{.CurrentState}} | Error: {{.Error}}'`;
- console.log("command ", command);
if (serverId) {
const { stdout, stderr } = await execAsyncRemote(serverId, command);
@@ -519,7 +583,7 @@ export const getSwarmNodes = async (serverId?: string) => {
export const getNodeInfo = async (nodeId: string, serverId?: string) => {
try {
- const command = `docker node inspect ${nodeId} --format '{{json .}}'`;
+ const command = `docker node inspect ${quote([nodeId])} --format '{{json .}}'`;
let stdout = "";
let stderr = "";
if (serverId) {
@@ -697,3 +761,113 @@ export const uploadFileToContainer = async (
);
}
};
+
+export const CONTAINER_FILE_SIZE_LIMIT = 512 * 1024;
+
+const NO_SHELL_UTILITIES_ERROR =
+ "This container image has no shell utilities and its filesystem is not accessible from the Dokploy host.";
+
+const isMissingBinaryError = (error: unknown) =>
+ error instanceof ExecError &&
+ (error.exitCode === 126 ||
+ error.exitCode === 127 ||
+ !!error.stderr?.includes("executable file not found"));
+
+export const listContainerFiles = async (
+ containerId: string,
+ path: string,
+ serverId?: string,
+) => {
+ const command = `docker exec ${quote([containerId])} ls -1Ap ${quote([path])}`;
+ let stdout: string;
+ try {
+ ({ stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command));
+ } catch (error) {
+ if (isMissingBinaryError(error)) {
+ throw new Error(NO_SHELL_UTILITIES_ERROR);
+ }
+ throw error;
+ }
+
+ return stdout
+ .split("\n")
+ .filter(Boolean)
+ .map((entry) => ({
+ name: entry.endsWith("/") ? entry.slice(0, -1) : entry,
+ isDirectory: entry.endsWith("/"),
+ }))
+ .sort((a, b) => {
+ if (a.isDirectory !== b.isDirectory) {
+ return a.isDirectory ? -1 : 1;
+ }
+ return a.name.localeCompare(b.name);
+ });
+};
+
+export const readContainerFile = async (
+ containerId: string,
+ filePath: string,
+ serverId?: string,
+) => {
+ const command = `docker exec ${quote([containerId])} cat ${quote([filePath])} | head -c ${CONTAINER_FILE_SIZE_LIMIT + 1} | base64 | tr -d '\\n'`;
+ const { stdout, stderr } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ if (stderr && !stdout) {
+ if (stderr.includes("executable file not found")) {
+ throw new Error(NO_SHELL_UTILITIES_ERROR);
+ }
+ throw new Error(stderr);
+ }
+
+ const buffer = Buffer.from(stdout.trim(), "base64");
+ return {
+ content: buffer.subarray(0, CONTAINER_FILE_SIZE_LIMIT).toString("base64"),
+ truncated: buffer.byteLength > CONTAINER_FILE_SIZE_LIMIT,
+ };
+};
+
+export const writeContainerFile = async (
+ containerId: string,
+ filePath: string,
+ content: string,
+ serverId?: string,
+) => {
+ const base64Content = Buffer.from(content, "utf8").toString("base64");
+ if (base64Content.length > CONTAINER_FILE_SIZE_LIMIT * 2) {
+ throw new Error("File is too large to save from the editor (max 512KB)");
+ }
+
+ const tempPath = `/tmp/dokploy-edit-${Date.now()}-${Math.random().toString(36).slice(2)}`;
+ const command = `printf '%s' ${quote([base64Content])} | base64 -d > ${quote([tempPath])} && docker cp ${quote([tempPath])} ${quote([`${containerId}:${filePath}`])}; status=$?; rm -f ${quote([tempPath])}; exit $status`;
+
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+};
+
+export const deleteContainerFile = async (
+ containerId: string,
+ path: string,
+ serverId?: string,
+) => {
+ const command = `docker exec ${quote([containerId])} rm -rf ${quote([path])}`;
+
+ try {
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+ } catch (error) {
+ if (isMissingBinaryError(error)) {
+ throw new Error(NO_SHELL_UTILITIES_ERROR);
+ }
+ throw error;
+ }
+};
diff --git a/packages/server/src/services/domain.ts b/packages/server/src/services/domain.ts
index e1460fd48..c651af9fb 100644
--- a/packages/server/src/services/domain.ts
+++ b/packages/server/src/services/domain.ts
@@ -80,7 +80,9 @@ export const findDomainById = async (domainId: string) => {
const domain = await db.query.domains.findFirst({
where: eq(domains.domainId, domainId),
with: {
- application: true,
+ application: {
+ columns: { applicationId: true, appName: true, name: true },
+ },
},
});
if (!domain) {
@@ -96,7 +98,9 @@ export const findDomainsByApplicationId = async (applicationId: string) => {
const domainsArray = await db.query.domains.findMany({
where: eq(domains.applicationId, applicationId),
with: {
- application: true,
+ application: {
+ columns: { applicationId: true, appName: true, name: true },
+ },
},
});
@@ -107,7 +111,9 @@ export const findDomainsByComposeId = async (composeId: string) => {
const domainsArray = await db.query.domains.findMany({
where: eq(domains.composeId, composeId),
with: {
- compose: true,
+ compose: {
+ columns: { composeId: true, appName: true, name: true },
+ },
},
});
diff --git a/packages/server/src/services/environment.ts b/packages/server/src/services/environment.ts
index 09854bf40..c4c08ac02 100644
--- a/packages/server/src/services/environment.ts
+++ b/packages/server/src/services/environment.ts
@@ -168,6 +168,7 @@ export const findEnvironmentById = async (environmentId: string) => {
composeStatus: true,
description: true,
serverId: true,
+ icon: true,
},
},
libsql: {
@@ -201,18 +202,56 @@ export const findEnvironmentById = async (environmentId: string) => {
};
export const findEnvironmentsByProjectId = async (projectId: string) => {
+ const serviceColumns = {
+ name: true,
+ description: true,
+ appName: true,
+ createdAt: true,
+ serverId: true,
+ applicationStatus: true,
+ } as const;
+
const projectEnvironments = await db.query.environments.findMany({
where: eq(environments.projectId, projectId),
orderBy: asc(environments.createdAt),
with: {
- applications: true,
- mariadb: true,
- mongo: true,
- mysql: true,
- postgres: true,
- redis: true,
- compose: true,
- libsql: true,
+ applications: {
+ columns: { ...serviceColumns, applicationId: true, icon: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mariadb: {
+ columns: { ...serviceColumns, mariadbId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mongo: {
+ columns: { ...serviceColumns, mongoId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mysql: {
+ columns: { ...serviceColumns, mysqlId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ postgres: {
+ columns: { ...serviceColumns, postgresId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ redis: {
+ columns: { ...serviceColumns, redisId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ compose: {
+ columns: {
+ ...serviceColumns,
+ composeId: true,
+ composeStatus: true,
+ icon: true,
+ },
+ with: { server: { columns: { name: true } } },
+ },
+ libsql: {
+ columns: { ...serviceColumns, libsqlId: true },
+ with: { server: { columns: { name: true } } },
+ },
project: true,
},
columns: {
diff --git a/packages/server/src/services/git-provider.ts b/packages/server/src/services/git-provider.ts
index 942f94ed2..5a7c6f438 100644
--- a/packages/server/src/services/git-provider.ts
+++ b/packages/server/src/services/git-provider.ts
@@ -119,3 +119,30 @@ export const getAccessibleGitProviderIds = async (session: {
}
return result;
};
+
+/**
+ * Authorizes read access to a specific git provider for the current session.
+ * Throws if the provider belongs to a different organization (cross-org IDOR)
+ * or if the caller is not entitled to it within the active organization.
+ * Must be called before returning any git-provider record that carries secrets
+ * (OAuth tokens, app private keys, webhook secrets).
+ */
+export const assertGitProviderAccess = async (
+ session: { userId: string; activeOrganizationId: string },
+ provider: { gitProviderId: string; organizationId: string },
+) => {
+ if (provider.organizationId !== session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Git provider not found",
+ });
+ }
+
+ const accessibleIds = await getAccessibleGitProviderIds(session);
+ if (!accessibleIds.has(provider.gitProviderId)) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message: "You don't have access to this git provider",
+ });
+ }
+};
diff --git a/packages/server/src/services/libsql.ts b/packages/server/src/services/libsql.ts
index dd2b82667..5a362789a 100644
--- a/packages/server/src/services/libsql.ts
+++ b/packages/server/src/services/libsql.ts
@@ -11,6 +11,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -140,7 +141,7 @@ export const deployLibsql = async (
if (libsql.serverId) {
await execAsyncRemote(
libsql.serverId,
- `docker pull ${libsql.dockerImage}`,
+ `docker pull ${quote([libsql.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/mariadb.ts b/packages/server/src/services/mariadb.ts
index 189ab39ad..54ffb34ba 100644
--- a/packages/server/src/services/mariadb.ts
+++ b/packages/server/src/services/mariadb.ts
@@ -11,6 +11,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -145,7 +146,7 @@ export const deployMariadb = async (
if (mariadb.serverId) {
await execAsyncRemote(
mariadb.serverId,
- `docker pull ${mariadb.dockerImage}`,
+ `docker pull ${quote([mariadb.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/mongo.ts b/packages/server/src/services/mongo.ts
index ad47cf04a..c6ff19f1e 100644
--- a/packages/server/src/services/mongo.ts
+++ b/packages/server/src/services/mongo.ts
@@ -12,6 +12,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -160,7 +161,7 @@ export const deployMongo = async (
if (mongo.serverId) {
await execAsyncRemote(
mongo.serverId,
- `docker pull ${mongo.dockerImage}`,
+ `docker pull ${quote([mongo.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/mount.ts b/packages/server/src/services/mount.ts
index 1987ded27..26e5fc613 100644
--- a/packages/server/src/services/mount.ts
+++ b/packages/server/src/services/mount.ts
@@ -18,6 +18,7 @@ import {
} from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, type SQL, sql } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
export type Mount = typeof mounts.$inferSelect;
@@ -106,81 +107,29 @@ export const createFileMount = async (mountId: string) => {
};
export const findMountById = async (mountId: string) => {
+ const serviceWith = {
+ columns: { serverId: true, appName: true },
+ with: {
+ environment: {
+ columns: {},
+ with: {
+ project: { columns: { organizationId: true } },
+ },
+ },
+ },
+ } as const;
+
const mount = await db.query.mounts.findFirst({
where: eq(mounts.mountId, mountId),
with: {
- application: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- compose: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- libsql: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- mariadb: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- mongo: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- mysql: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- postgres: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- redis: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
+ application: serviceWith,
+ compose: serviceWith,
+ libsql: serviceWith,
+ mariadb: serviceWith,
+ mongo: serviceWith,
+ mysql: serviceWith,
+ postgres: serviceWith,
+ redis: serviceWith,
},
});
if (!mount) {
@@ -317,7 +266,7 @@ export const updateFileMount = async (mountId: string) => {
try {
const serverId = await getServerId(mount);
const encodedContent = encodeBase64(mount.content || "");
- const command = `echo "${encodedContent}" | base64 -d > ${fullPath}`;
+ const command = `echo "${encodedContent}" | base64 -d > ${quote([fullPath])}`;
if (serverId) {
await execAsyncRemote(serverId, command);
} else {
@@ -337,7 +286,7 @@ export const deleteFileMount = async (mountId: string) => {
try {
const serverId = await getServerId(mount);
if (serverId) {
- const command = `rm -rf ${fullPath}`;
+ const command = `rm -rf ${quote([fullPath])}`;
await execAsyncRemote(serverId, command);
} else {
await removeFileOrDirectory(fullPath);
diff --git a/packages/server/src/services/mysql.ts b/packages/server/src/services/mysql.ts
index 974f72f19..288c6fc28 100644
--- a/packages/server/src/services/mysql.ts
+++ b/packages/server/src/services/mysql.ts
@@ -11,6 +11,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -143,7 +144,7 @@ export const deployMySql = async (
if (mysql.serverId) {
await execAsyncRemote(
mysql.serverId,
- `docker pull ${mysql.dockerImage}`,
+ `docker pull ${quote([mysql.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/network.ts b/packages/server/src/services/network.ts
new file mode 100644
index 000000000..9df4fd43f
--- /dev/null
+++ b/packages/server/src/services/network.ts
@@ -0,0 +1,369 @@
+import { db } from "@dokploy/server/db";
+import { type apiCreateNetwork, network } from "@dokploy/server/db/schema";
+import { TRPCError } from "@trpc/server";
+import { and, eq, inArray, isNull } from "drizzle-orm";
+import type { z } from "zod";
+import { IS_CLOUD } from "../constants";
+import type { ApplicationNested } from "../utils/builders";
+import { getRemoteDocker } from "../utils/servers/remote-docker";
+
+const RESERVED_NETWORKS = [
+ "bridge",
+ "host",
+ "none",
+ "ingress",
+ "docker_gwbridge",
+ "dokploy-network",
+];
+
+type DockerNetworkInfo = {
+ Name: string;
+ Driver: string;
+ Internal?: boolean;
+ Attachable?: boolean;
+ Ingress?: boolean;
+ EnableIPv4?: boolean;
+ EnableIPv6?: boolean;
+ Options?: Record | null;
+ IPAM?: {
+ Driver?: string;
+ Config?: Array<{
+ Subnet?: string;
+ Gateway?: string;
+ IPRange?: string;
+ }> | null;
+ };
+};
+
+const parseMtu = (value: string | undefined) => {
+ const mtu = Number.parseInt(value ?? "", 10);
+ return Number.isNaN(mtu) ? null : mtu;
+};
+
+const isImportableDockerNetwork = (dockerNetwork: DockerNetworkInfo) =>
+ !RESERVED_NETWORKS.includes(dockerNetwork.Name) &&
+ !dockerNetwork.Ingress &&
+ (dockerNetwork.Driver === "bridge" || dockerNetwork.Driver === "overlay");
+
+const mapDockerNetworkToRow = (
+ dockerNetwork: DockerNetworkInfo,
+ organizationId: string,
+ serverId: string | null,
+) => ({
+ name: dockerNetwork.Name,
+ driver: dockerNetwork.Driver as "bridge" | "overlay",
+ internal: dockerNetwork.Internal ?? false,
+ attachable: dockerNetwork.Attachable ?? false,
+ // Older daemons don't report EnableIPv4; IPv4 is always on there
+ enableIPv4: dockerNetwork.EnableIPv4 ?? true,
+ enableIPv6: dockerNetwork.EnableIPv6 ?? false,
+ mtu: parseMtu(dockerNetwork.Options?.["com.docker.network.driver.mtu"]),
+ ipam: {
+ driver: dockerNetwork.IPAM?.Driver,
+ config: (dockerNetwork.IPAM?.Config ?? []).map((c) => ({
+ subnet: c.Subnet,
+ gateway: c.Gateway,
+ ipRange: c.IPRange,
+ })),
+ },
+ organizationId,
+ serverId,
+});
+
+const findNetworksByServer = async (
+ organizationId: string,
+ serverId: string | null,
+) => {
+ return await db.query.network.findMany({
+ where: and(
+ eq(network.organizationId, organizationId),
+ serverId ? eq(network.serverId, serverId) : isNull(network.serverId),
+ ),
+ });
+};
+
+export const findNetworksToSync = async (
+ organizationId: string,
+ serverId: string | null,
+) => {
+ if (IS_CLOUD && !serverId) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Server is required",
+ });
+ }
+
+ const docker = await getRemoteDocker(serverId);
+ let dockerNetworks: DockerNetworkInfo[] = [];
+ try {
+ dockerNetworks = (await docker.listNetworks()) as DockerNetworkInfo[];
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Failed to list Docker networks",
+ cause: error,
+ });
+ }
+
+ const existing = await findNetworksByServer(organizationId, serverId);
+ const existingNames = new Set(existing.map((row) => row.name));
+ const dockerNames = new Set(dockerNetworks.map((d) => d.Name));
+
+ const importable = dockerNetworks
+ .filter(
+ (dockerNetwork) =>
+ isImportableDockerNetwork(dockerNetwork) &&
+ !existingNames.has(dockerNetwork.Name),
+ )
+ .map((dockerNetwork) => ({
+ name: dockerNetwork.Name,
+ driver: dockerNetwork.Driver,
+ internal: dockerNetwork.Internal ?? false,
+ attachable: dockerNetwork.Attachable ?? false,
+ subnets: (dockerNetwork.IPAM?.Config ?? [])
+ .map((c) => c.Subnet)
+ .filter((s): s is string => !!s),
+ }));
+
+ // Rows in Dokploy whose network no longer exists in Docker
+ const missing = existing
+ .filter((row) => !dockerNames.has(row.name))
+ .map((row) => ({ networkId: row.networkId, name: row.name }));
+
+ return { importable, missing };
+};
+
+export const importDockerNetworks = async (
+ organizationId: string,
+ serverId: string | null,
+ names: string[],
+) => {
+ if (IS_CLOUD && !serverId) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Server is required",
+ });
+ }
+
+ const docker = await getRemoteDocker(serverId);
+ const existing = await findNetworksByServer(organizationId, serverId);
+ const existingNames = new Set(existing.map((row) => row.name));
+
+ const imported: string[] = [];
+ const errors: { name: string; error: string }[] = [];
+
+ for (const name of names) {
+ if (existingNames.has(name)) {
+ errors.push({ name, error: "Already imported" });
+ continue;
+ }
+ try {
+ const info = (await docker
+ .getNetwork(name)
+ .inspect()) as DockerNetworkInfo;
+ if (!isImportableDockerNetwork(info)) {
+ errors.push({ name, error: "Network is reserved or not supported" });
+ continue;
+ }
+ await db
+ .insert(network)
+ .values(mapDockerNetworkToRow(info, organizationId, serverId));
+ imported.push(name);
+ } catch (error) {
+ errors.push({
+ name,
+ error:
+ error instanceof Error ? error.message : "Failed to inspect network",
+ });
+ }
+ }
+
+ return { imported, errors };
+};
+
+export const findNetworkById = async (networkId: string) => {
+ const [row] = await db
+ .select()
+ .from(network)
+ .where(eq(network.networkId, networkId))
+ .limit(1);
+
+ if (!row) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Network not found",
+ });
+ }
+
+ return row;
+};
+
+export const createNetwork = async (
+ input: z.infer,
+ organizationId: string,
+) => {
+ if (IS_CLOUD) {
+ if (!input.serverId) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Server is required",
+ });
+ }
+ }
+
+ const created = await db.transaction(async (tx) => {
+ const [row] = await tx
+ .insert(network)
+ .values({
+ ...input,
+ organizationId,
+ })
+ .returning();
+
+ if (!row) {
+ throw new TRPCError({
+ code: "INTERNAL_SERVER_ERROR",
+ message: "Failed to create network",
+ });
+ }
+
+ await createDockerNetworkFromRow(row);
+
+ return row;
+ });
+
+ return created;
+};
+
+const createDockerNetworkFromRow = async (row: typeof network.$inferSelect) => {
+ const ipam = row.ipam ?? {};
+ const ipamConfig = (ipam.config ?? [])
+ .map((c) => {
+ const entry: Record = {};
+ if (c.subnet) entry.Subnet = c.subnet;
+ if (c.gateway) entry.Gateway = c.gateway;
+ if (c.ipRange) entry.IPRange = c.ipRange;
+ return entry;
+ })
+ .filter((e) => Object.keys(e).length > 0);
+
+ const docker = await getRemoteDocker(row.serverId ?? null);
+ try {
+ await docker.createNetwork({
+ Name: row.name,
+ Driver: row.driver,
+ CheckDuplicate: true,
+ Internal: row.internal,
+ Attachable: row.attachable,
+ // EnableIPv4 is missing from dockerode's types but supported by
+ // the daemon (API >= 1.47); the body is sent as-is
+ EnableIPv4: row.enableIPv4,
+ EnableIPv6: row.enableIPv6,
+ Options: row.mtu
+ ? { "com.docker.network.driver.mtu": String(row.mtu) }
+ : undefined,
+ IPAM: {
+ Driver: ipam.driver || "default",
+ Config: ipamConfig.length > 0 ? ipamConfig : undefined,
+ },
+ } as Parameters[0]);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Failed to create Docker network",
+ cause: error,
+ });
+ }
+};
+
+export const recreateNetwork = async (networkId: string) => {
+ const row = await findNetworkById(networkId);
+ await createDockerNetworkFromRow(row);
+ return row;
+};
+
+export const resolveServiceNetworks = async (
+ application: Partial,
+) => {
+ if (application.networkSwarm) {
+ return application.networkSwarm;
+ }
+
+ const { networkIds, detachDokployNetwork } = application;
+ const rows =
+ networkIds && networkIds.length > 0
+ ? await db.query.network.findMany({
+ where: and(
+ inArray(network.networkId, networkIds),
+ eq(network.driver, "overlay"),
+ ),
+ columns: { name: true },
+ })
+ : [];
+
+ const networks = detachDokployNetwork ? [] : ["dokploy-network"];
+ for (const row of rows) {
+ networks.push(row.name);
+ }
+
+ return networks.map((name) => ({ Target: name }));
+};
+
+export const inspectNetwork = async (networkId: string) => {
+ const row = await findNetworkById(networkId);
+
+ const docker = await getRemoteDocker(row.serverId ?? null);
+ try {
+ return await docker.getNetwork(row.name).inspect();
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Failed to inspect Docker network",
+ cause: error,
+ });
+ }
+};
+
+export const removeNetwork = async (networkId: string) => {
+ const row = await findNetworkById(networkId);
+
+ const docker = await getRemoteDocker(row.serverId ?? null);
+ try {
+ await docker.getNetwork(row.name).remove();
+ } catch (error) {
+ const statusCode = (error as { statusCode?: number })?.statusCode;
+ if (statusCode !== 404) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Failed to remove Docker network",
+ cause: error,
+ });
+ }
+ }
+
+ const [deleted] = await db
+ .delete(network)
+ .where(eq(network.networkId, networkId))
+ .returning();
+
+ if (!deleted) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Network not found",
+ });
+ }
+
+ return deleted;
+};
diff --git a/packages/server/src/services/patch-repo.ts b/packages/server/src/services/patch-repo.ts
index 35e734533..f946d1dcd 100644
--- a/packages/server/src/services/patch-repo.ts
+++ b/packages/server/src/services/patch-repo.ts
@@ -1,6 +1,7 @@
import { join } from "node:path";
import { paths } from "@dokploy/server/constants";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
import { execAsync, execAsyncRemote } from "../utils/process/execAsync";
import { cloneBitbucketRepository } from "../utils/providers/bitbucket";
import { cloneGitRepository } from "../utils/providers/git";
@@ -85,7 +86,7 @@ export const readPatchRepoDirectory = async (
serverId?: string | null,
): Promise => {
// Use git ls-tree to get tracked files only
- const command = `cd "${repoPath}" && git ls-tree -r --name-only HEAD`;
+ const command = `cd ${quote([repoPath])} && git ls-tree -r --name-only HEAD`;
let stdout: string;
try {
@@ -168,7 +169,7 @@ export const readPatchRepoFile = async (
const repoPath = join(PATCH_REPOS_PATH, type, application.appName);
const fullPath = join(repoPath, filePath);
- const command = `cat "${fullPath}"`;
+ const command = `cat ${quote([fullPath])}`;
if (serverId) {
const result = await execAsyncRemote(serverId, command);
diff --git a/packages/server/src/services/port.ts b/packages/server/src/services/port.ts
index 3ba1b7376..bcc5831a3 100644
--- a/packages/server/src/services/port.ts
+++ b/packages/server/src/services/port.ts
@@ -30,12 +30,8 @@ export const finPortById = async (portId: string) => {
where: eq(ports.portId, portId),
with: {
application: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
+ columns: {
+ applicationId: true,
},
},
},
diff --git a/packages/server/src/services/postgres.ts b/packages/server/src/services/postgres.ts
index d4dddfdaf..3a9754125 100644
--- a/packages/server/src/services/postgres.ts
+++ b/packages/server/src/services/postgres.ts
@@ -11,6 +11,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, getTableColumns } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -155,7 +156,7 @@ export const deployPostgres = async (
if (postgres.serverId) {
await execAsyncRemote(
postgres.serverId,
- `docker pull ${postgres.dockerImage}`,
+ `docker pull ${quote([postgres.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/preview-deployment.ts b/packages/server/src/services/preview-deployment.ts
index 20f64259b..cc3d3dc02 100644
--- a/packages/server/src/services/preview-deployment.ts
+++ b/packages/server/src/services/preview-deployment.ts
@@ -17,7 +17,7 @@ import { manageDomain } from "../utils/traefik/domain";
import { findApplicationById } from "./application";
import { removeDeploymentsByPreviewDeploymentId } from "./deployment";
import { createDomain } from "./domain";
-import { type Github, getIssueComment } from "./github";
+import { findGithubById, getIssueComment } from "./github";
import { getWebServerSettings } from "./web-server-settings";
export type PreviewDeployment = typeof previewDeployments.$inferSelect;
@@ -142,7 +142,17 @@ export const createPreviewDeployment = async (
org?.ownerId || "",
);
- const octokit = authGithub(application?.github as Github);
+ if (!application.githubId) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Github Account not configured correctly",
+ });
+ }
+
+ // `findApplicationById` redacts `githubPrivateKey` from the `github`
+ // relation, so the provider must be refetched to authenticate.
+ const githubProvider = await findGithubById(application.githubId);
+ const octokit = authGithub(githubProvider);
const runningComment = getIssueComment(
application.name,
diff --git a/packages/server/src/services/project.ts b/packages/server/src/services/project.ts
index 1214f3551..52ef679b4 100644
--- a/packages/server/src/services/project.ts
+++ b/packages/server/src/services/project.ts
@@ -48,19 +48,60 @@ export const createProject = async (
};
export const findProjectById = async (projectId: string) => {
+ const serviceColumns = {
+ name: true,
+ description: true,
+ appName: true,
+ createdAt: true,
+ serverId: true,
+ applicationStatus: true,
+ } as const;
+
const project = await db.query.projects.findFirst({
where: eq(projects.projectId, projectId),
with: {
environments: {
with: {
- applications: true,
- compose: true,
- libsql: true,
- mariadb: true,
- mongo: true,
- mysql: true,
- postgres: true,
- redis: true,
+ applications: {
+ columns: {
+ ...serviceColumns,
+ applicationId: true,
+ icon: true,
+ },
+ with: { server: { columns: { name: true } } },
+ },
+ compose: {
+ columns: {
+ ...serviceColumns,
+ composeId: true,
+ composeStatus: true,
+ },
+ with: { server: { columns: { name: true } } },
+ },
+ libsql: {
+ columns: { ...serviceColumns, libsqlId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mariadb: {
+ columns: { ...serviceColumns, mariadbId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mongo: {
+ columns: { ...serviceColumns, mongoId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ mysql: {
+ columns: { ...serviceColumns, mysqlId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ postgres: {
+ columns: { ...serviceColumns, postgresId: true },
+ with: { server: { columns: { name: true } } },
+ },
+ redis: {
+ columns: { ...serviceColumns, redisId: true },
+ with: { server: { columns: { name: true } } },
+ },
},
},
projectTags: {
@@ -107,27 +148,49 @@ export const updateProjectById = async (
export const validUniqueServerAppName = async (appName: string) => {
const query = await db.query.environments.findMany({
+ columns: { environmentId: true },
with: {
applications: {
where: eq(applications.appName, appName),
+ columns: {
+ appName: true,
+ },
},
libsql: {
where: eq(libsql.appName, appName),
+ columns: {
+ appName: true,
+ },
},
mariadb: {
where: eq(mariadb.appName, appName),
+ columns: {
+ appName: true,
+ },
},
mongo: {
where: eq(mongo.appName, appName),
+ columns: {
+ appName: true,
+ },
},
mysql: {
where: eq(mysql.appName, appName),
+ columns: {
+ appName: true,
+ },
},
postgres: {
where: eq(postgres.appName, appName),
+ columns: {
+ appName: true,
+ },
},
redis: {
where: eq(redis.appName, appName),
+ columns: {
+ appName: true,
+ },
},
},
});
diff --git a/packages/server/src/services/redis.ts b/packages/server/src/services/redis.ts
index 99f4dc853..da2822b13 100644
--- a/packages/server/src/services/redis.ts
+++ b/packages/server/src/services/redis.ts
@@ -10,6 +10,7 @@ import { pullImage } from "@dokploy/server/utils/docker/utils";
import { execAsyncRemote } from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { validUniqueServerAppName } from "./project";
@@ -110,7 +111,7 @@ export const deployRedis = async (
if (redis.serverId) {
await execAsyncRemote(
redis.serverId,
- `docker pull ${redis.dockerImage}`,
+ `docker pull ${quote([redis.dockerImage])}`,
onData,
);
} else {
diff --git a/packages/server/src/services/rollbacks.ts b/packages/server/src/services/rollbacks.ts
index 97fa4b1c5..8837ae912 100644
--- a/packages/server/src/services/rollbacks.ts
+++ b/packages/server/src/services/rollbacks.ts
@@ -17,9 +17,12 @@ import {
} from "../utils/docker/utils";
import { execAsync, execAsyncRemote } from "../utils/process/execAsync";
import { getRemoteDocker } from "../utils/servers/remote-docker";
+import { withResolvedVaultRefs } from "../utils/vault";
import { type Application, findApplicationById } from "./application";
import { findDeploymentById } from "./deployment";
+import type { Environment } from "./environment";
import type { Mount } from "./mount";
+import { resolveServiceNetworks } from "./network";
import type { Port } from "./port";
import type { Project } from "./project";
import {
@@ -105,19 +108,7 @@ export const findRollbackById = async (rollbackId: string) => {
const result = await db.query.rollbacks.findFirst({
where: eq(rollbacks.rollbackId, rollbackId),
with: {
- deployment: {
- with: {
- application: {
- with: {
- environment: {
- with: {
- project: true,
- },
- },
- },
- },
- },
- },
+ deployment: true,
},
});
@@ -213,7 +204,7 @@ const rollbackApplication = async (
image: string,
serverId?: string | null,
fullContext?: Application & {
- environment: {
+ environment: Environment & {
project: Project;
};
mounts: Mount[];
@@ -225,7 +216,9 @@ const rollbackApplication = async (
throw new Error("Full context is required for rollback");
}
- const rollbackRegistry = fullContext.rollbackRegistry ?? undefined;
+ const resolvedContext = await withResolvedVaultRefs(fullContext);
+
+ const rollbackRegistry = resolvedContext.rollbackRegistry ?? undefined;
// Ensure Docker daemon is authenticated with the rollback registry
// before updating the swarm service. The authconfig in CreateServiceOptions
@@ -246,7 +239,7 @@ const rollbackApplication = async (
cpuReservation,
command,
ports,
- } = fullContext;
+ } = resolvedContext;
const resources = calculateResources({
memoryLimit,
@@ -257,6 +250,10 @@ const rollbackApplication = async (
const volumesMount = generateVolumeMounts(mounts);
+ const resolvedNetworks = await resolveServiceNetworks(
+ resolvedContext as Parameters[0],
+ );
+
const {
HealthCheck,
RestartPolicy,
@@ -265,16 +262,16 @@ const rollbackApplication = async (
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
Ulimits,
} = generateConfigContainer(
- fullContext as Parameters[0],
+ resolvedContext as Parameters[0],
);
const bindsMount = generateBindMounts(mounts);
const envVariables = prepareEnvironmentVariables(
env,
- fullContext.environment.project.env,
+ resolvedContext.environment.project.env,
+ resolvedContext.environment.env,
);
let rollbackImage = image;
@@ -304,7 +301,7 @@ const rollbackApplication = async (
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/services/schedule.ts b/packages/server/src/services/schedule.ts
index b8751671b..59b75cc0d 100644
--- a/packages/server/src/services/schedule.ts
+++ b/packages/server/src/services/schedule.ts
@@ -2,7 +2,7 @@ import path from "node:path";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
import type { z } from "zod";
-import { paths } from "../constants";
+import { IS_CLOUD, paths } from "../constants";
import { db } from "../db";
import type {
createScheduleSchema,
@@ -11,9 +11,51 @@ import type {
import { type Schedule, schedules } from "../db/schema/schedule";
import { encodeBase64 } from "../utils/docker/utils";
import { execAsync, execAsyncRemote } from "../utils/process/execAsync";
+import { findMemberByUserId } from "./permission";
+import { findServerById } from "./server";
export type ScheduleExtended = Awaited>;
+// Host-level schedules (server / dokploy-server) run their script as root on the
+// host and must stay restricted to owners/admins, regardless of whether the
+// request is also tied to a service. Attaching an accessible applicationId must
+// not downgrade this to a service-access check.
+export const assertHostScheduleAccess = async (
+ ctx: { user: { id: string }; session: { activeOrganizationId: string } },
+ scheduleType: Schedule["scheduleType"] | null | undefined,
+ serverId: string | null | undefined,
+) => {
+ if (scheduleType !== "server" && scheduleType !== "dokploy-server") return;
+
+ if (scheduleType === "dokploy-server" && IS_CLOUD) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message: "Host-level schedules are not available in the cloud version.",
+ });
+ }
+
+ const member = await findMemberByUserId(
+ ctx.user.id,
+ ctx.session.activeOrganizationId,
+ );
+ if (member.role !== "owner" && member.role !== "admin") {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message: "Only owners and admins can manage server-level schedules.",
+ });
+ }
+
+ if (scheduleType === "server" && serverId) {
+ const targetServer = await findServerById(serverId);
+ if (targetServer.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You don't have access to this server.",
+ });
+ }
+ }
+};
+
export const createSchedule = async (
input: z.infer,
) => {
@@ -39,6 +81,11 @@ export const findScheduleById = async (scheduleId: string) => {
where: eq(schedules.scheduleId, scheduleId),
with: {
application: {
+ columns: {
+ applicationId: true,
+ appName: true,
+ serverId: true,
+ },
with: {
environment: {
with: {
diff --git a/packages/server/src/services/server.ts b/packages/server/src/services/server.ts
index 3057e4ddb..1912a71b5 100644
--- a/packages/server/src/services/server.ts
+++ b/packages/server/src/services/server.ts
@@ -53,6 +53,27 @@ export const findServerById = async (serverId: string) => {
return currentServer;
};
+/**
+ * Removes the SSH private key material from a server record before it is sent
+ * to a client. `findServerById` eagerly loads the `sshKey` relation (needed for
+ * server-side SSH operations), but the private key must never leave the server:
+ * no client feature consumes it, and returning it exposed it to any member with
+ * only `server:read`. Server-side callers keep using `findServerById` directly.
+ */
+export const redactServerSshKey = <
+ T extends { sshKey?: { privateKey: string } | null },
+>(
+ serverRecord: T,
+): T => {
+ if (!serverRecord.sshKey) {
+ return serverRecord;
+ }
+ return {
+ ...serverRecord,
+ sshKey: { ...serverRecord.sshKey, privateKey: "" },
+ };
+};
+
export const findServersByUserId = async (userId: string) => {
const orgs = await db.query.organization.findMany({
where: eq(organization.ownerId, userId),
@@ -79,15 +100,16 @@ export const deleteServer = async (serverId: string) => {
export const haveActiveServices = async (serverId: string) => {
const currentServer = await db.query.server.findFirst({
where: eq(server.serverId, serverId),
+ columns: { serverId: true },
with: {
- applications: true,
- compose: true,
- libsql: true,
- mariadb: true,
- mongo: true,
- mysql: true,
- postgres: true,
- redis: true,
+ applications: { columns: { applicationId: true } },
+ compose: { columns: { composeId: true } },
+ libsql: { columns: { libsqlId: true } },
+ mariadb: { columns: { mariadbId: true } },
+ mongo: { columns: { mongoId: true } },
+ mysql: { columns: { mysqlId: true } },
+ postgres: { columns: { postgresId: true } },
+ redis: { columns: { redisId: true } },
},
});
diff --git a/packages/server/src/services/user.ts b/packages/server/src/services/user.ts
index 243751705..dbc78c275 100644
--- a/packages/server/src/services/user.ts
+++ b/packages/server/src/services/user.ts
@@ -4,11 +4,12 @@ import {
apikey,
invitation,
member,
+ passkey,
user,
} from "@dokploy/server/db/schema";
import { TRPCError } from "@trpc/server";
import * as bcrypt from "bcrypt";
-import { and, eq } from "drizzle-orm";
+import { and, desc, eq } from "drizzle-orm";
import { auth } from "../lib/auth";
export type User = typeof user.$inferSelect;
@@ -396,6 +397,21 @@ export const findMemberById = async (
return result;
};
+export const findPasskeysByUserId = async (userId: string) => {
+ return db.query.passkey.findMany({
+ where: eq(passkey.userId, userId),
+ columns: {
+ id: true,
+ name: true,
+ deviceType: true,
+ backedUp: true,
+ createdAt: true,
+ aaguid: true,
+ },
+ orderBy: [desc(passkey.createdAt)],
+ });
+};
+
export const createOrganizationUserWithCredentials = async ({
organizationId,
email,
@@ -430,7 +446,7 @@ export const createOrganizationUserWithCredentials = async ({
.insert(user)
.values({
email: normalizedEmail,
- emailVerified: false,
+ emailVerified: true,
updatedAt: now,
})
.returning({
diff --git a/packages/server/src/services/vault-provider.ts b/packages/server/src/services/vault-provider.ts
new file mode 100644
index 000000000..117b8e34f
--- /dev/null
+++ b/packages/server/src/services/vault-provider.ts
@@ -0,0 +1,254 @@
+import { db } from "@dokploy/server/db";
+import {
+ type apiCreateVaultProvider,
+ projects,
+ type VaultProviderAssignment,
+ type VaultProviderConfig,
+ vaultProvider,
+} from "@dokploy/server/db/schema";
+import { getVaultClient } from "@dokploy/server/utils/vault";
+import { TRPCError } from "@trpc/server";
+import { eq } from "drizzle-orm";
+import type { z } from "zod";
+
+export type VaultProvider = typeof vaultProvider.$inferSelect;
+
+export const VAULT_SECRET_MASK = "********";
+
+const SENSITIVE_FIELDS: Record =
+ {
+ hashicorp: ["token"],
+ infisical: ["clientSecret"],
+ aws: ["secretAccessKey"],
+ doppler: ["serviceToken"],
+ azure: ["clientSecret"],
+ };
+
+export const maskVaultProviderConfig = (
+ config: VaultProviderConfig,
+): VaultProviderConfig => {
+ const masked: Record = { ...config };
+ for (const field of SENSITIVE_FIELDS[config.providerType]) {
+ if (masked[field]) {
+ masked[field] = VAULT_SECRET_MASK;
+ }
+ }
+ return masked as VaultProviderConfig;
+};
+
+export const mergeVaultProviderConfig = (
+ incoming: VaultProviderConfig,
+ existing: VaultProviderConfig,
+): VaultProviderConfig => {
+ const merged: Record = { ...incoming };
+ for (const field of SENSITIVE_FIELDS[incoming.providerType]) {
+ if (merged[field] === VAULT_SECRET_MASK) {
+ if (incoming.providerType !== existing.providerType) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ "Credentials must be re-entered when changing the provider type",
+ });
+ }
+ merged[field] = (existing as Record)[field];
+ }
+ }
+ return merged as VaultProviderConfig;
+};
+
+const isUniqueNameViolation = (error: unknown) =>
+ error instanceof Error &&
+ error.message.includes("vault_provider_org_name_idx");
+
+const validateAssignments = async (
+ assignments: VaultProviderAssignment[],
+ organizationId: string,
+) => {
+ const orgProjects = await db.query.projects.findMany({
+ where: eq(projects.organizationId, organizationId),
+ with: { environments: true },
+ });
+ for (const assignment of assignments) {
+ const project = orgProjects.find(
+ (p) => p.projectId === assignment.projectId,
+ );
+ if (!project) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Assignment references a project outside this organization",
+ });
+ }
+ const environmentIds = new Set(
+ project.environments.map((e) => e.environmentId),
+ );
+ for (const environmentId of assignment.environmentIds) {
+ if (!environmentIds.has(environmentId)) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ "Assignment references an environment outside the selected project",
+ });
+ }
+ }
+ }
+};
+
+export const createVaultProvider = async (
+ input: z.infer,
+ organizationId: string,
+) => {
+ await validateAssignments(input.assignments, organizationId);
+ try {
+ const newProvider = await db
+ .insert(vaultProvider)
+ .values({
+ name: input.name,
+ providerType: input.config.providerType,
+ config: input.config,
+ assignments: input.assignments,
+ organizationId,
+ })
+ .returning()
+ .then((value) => value[0]);
+
+ if (!newProvider) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error creating the vault provider",
+ });
+ }
+ return newProvider;
+ } catch (error) {
+ if (isUniqueNameViolation(error)) {
+ throw new TRPCError({
+ code: "CONFLICT",
+ message: `A vault provider named "${input.name}" already exists in this organization`,
+ });
+ }
+ throw error;
+ }
+};
+
+export const findVaultProviderById = async (vaultProviderId: string) => {
+ const provider = await db.query.vaultProvider.findFirst({
+ where: eq(vaultProvider.vaultProviderId, vaultProviderId),
+ });
+ if (!provider) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Vault provider not found",
+ });
+ }
+ return provider;
+};
+
+export const findVaultProviderInOrganization = async (
+ vaultProviderId: string,
+ organizationId: string,
+) => {
+ const provider = await findVaultProviderById(vaultProviderId);
+ if (provider.organizationId !== organizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not allowed to access this vault provider",
+ });
+ }
+ return provider;
+};
+
+export const findVaultProvidersByOrganizationId = async (
+ organizationId: string,
+) => {
+ return await db.query.vaultProvider.findMany({
+ where: eq(vaultProvider.organizationId, organizationId),
+ orderBy: (providers, { asc }) => [asc(providers.name)],
+ });
+};
+
+export const updateVaultProvider = async (
+ vaultProviderId: string,
+ name: string,
+ config: VaultProviderConfig,
+ assignments: VaultProviderAssignment[],
+) => {
+ const existing = await findVaultProviderById(vaultProviderId);
+ const mergedConfig = mergeVaultProviderConfig(config, existing.config);
+ await validateAssignments(assignments, existing.organizationId);
+
+ try {
+ const updated = await db
+ .update(vaultProvider)
+ .set({
+ name,
+ providerType: mergedConfig.providerType,
+ config: mergedConfig,
+ assignments,
+ })
+ .where(eq(vaultProvider.vaultProviderId, vaultProviderId))
+ .returning()
+ .then((res) => res[0]);
+
+ if (!updated) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error updating the vault provider",
+ });
+ }
+ return updated;
+ } catch (error) {
+ if (isUniqueNameViolation(error)) {
+ throw new TRPCError({
+ code: "CONFLICT",
+ message: `A vault provider named "${name}" already exists in this organization`,
+ });
+ }
+ throw error;
+ }
+};
+
+export const removeVaultProvider = async (vaultProviderId: string) => {
+ const removed = await db
+ .delete(vaultProvider)
+ .where(eq(vaultProvider.vaultProviderId, vaultProviderId))
+ .returning()
+ .then((res) => res[0]);
+
+ if (!removed) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Vault provider not found",
+ });
+ }
+ return removed;
+};
+
+export const testVaultProviderConnection = async (
+ config: VaultProviderConfig,
+) => {
+ const client = getVaultClient(config.providerType);
+ try {
+ await client.testConnection(config);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Error connecting to the vault provider",
+ });
+ }
+};
+
+export const listVaultProviderSecretNames = async (
+ config: VaultProviderConfig,
+) => {
+ const client = getVaultClient(config.providerType);
+ if (!client.listSecretNames) {
+ return [];
+ }
+ try {
+ return await client.listSecretNames(config);
+ } catch {
+ return [];
+ }
+};
diff --git a/packages/server/src/services/volume-backups.ts b/packages/server/src/services/volume-backups.ts
index abd29df1f..359ccf5f0 100644
--- a/packages/server/src/services/volume-backups.ts
+++ b/packages/server/src/services/volume-backups.ts
@@ -13,6 +13,11 @@ export const findVolumeBackupById = async (volumeBackupId: string) => {
where: eq(volumeBackups.volumeBackupId, volumeBackupId),
with: {
application: {
+ columns: {
+ applicationId: true,
+ appName: true,
+ serverId: true,
+ },
with: {
environment: {
with: {
diff --git a/packages/server/src/setup/redis-setup.ts b/packages/server/src/setup/redis-setup.ts
deleted file mode 100644
index a81a04904..000000000
--- a/packages/server/src/setup/redis-setup.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import type { CreateServiceOptions } from "dockerode";
-import { docker } from "../constants";
-import { pullImage } from "../utils/docker/utils";
-
-export const initializeRedis = async () => {
- const imageName = "redis:8";
- const containerName = "dokploy-redis";
-
- const settings: CreateServiceOptions = {
- Name: containerName,
- TaskTemplate: {
- ContainerSpec: {
- Image: imageName,
- Mounts: [
- {
- Type: "volume",
- Source: "dokploy-redis",
- Target: "/data",
- },
- ],
- },
- Networks: [{ Target: "dokploy-network" }],
- Placement: {
- Constraints: ["node.role==manager"],
- },
- },
- Mode: {
- Replicated: {
- Replicas: 1,
- },
- },
- ...(process.env.NODE_ENV === "development" && {
- EndpointSpec: {
- Ports: [
- {
- TargetPort: 6379,
- PublishedPort: 6379,
- Protocol: "tcp",
- PublishMode: "host",
- },
- ],
- },
- }),
- };
- try {
- await pullImage(imageName);
-
- const service = docker.getService(containerName);
- const inspect = await service.inspect();
- await service.update({
- version: Number.parseInt(inspect.Version.Index),
- ...settings,
- });
- console.log("Redis Started ✅");
- } catch (_) {
- try {
- await docker.createService(settings);
- } catch (error: any) {
- if (error?.statusCode !== 409) {
- throw error;
- }
- console.log("Redis service already exists, continuing...");
- }
- console.log("Redis Not Found: Starting ✅");
- }
-};
diff --git a/packages/server/src/setup/server-setup.ts b/packages/server/src/setup/server-setup.ts
index 7181880a4..b972d7d85 100644
--- a/packages/server/src/setup/server-setup.ts
+++ b/packages/server/src/setup/server-setup.ts
@@ -482,7 +482,7 @@ const installUtilities = () => `
case "$OS_TYPE" in
arch)
- $SUDO_CMD pacman -Sy --noconfirm --needed curl wget git git-lfs jq openssl >/dev/null || true
+ $SUDO_CMD pacman -Sy --noconfirm --needed unzip curl wget git git-lfs jq openssl >/dev/null || true
;;
alpine)
$SUDO_CMD sed -i '/^#.*\/community/s/^#//' /etc/apk/repositories
diff --git a/packages/server/src/templates/github.ts b/packages/server/src/templates/github.ts
index 5b5c4ade8..f3bdca2ba 100644
--- a/packages/server/src/templates/github.ts
+++ b/packages/server/src/templates/github.ts
@@ -74,6 +74,49 @@ export async function fetchTemplatesList(
}));
}
+const LOGO_MIME_TYPES: Record = {
+ png: "image/png",
+ jpg: "image/jpeg",
+ jpeg: "image/jpeg",
+ svg: "image/svg+xml",
+ webp: "image/webp",
+ gif: "image/gif",
+};
+
+export async function fetchTemplateLogo(
+ templateId: string,
+ baseUrl = "https://templates.dokploy.com",
+): Promise {
+ try {
+ const templates = await fetchTemplatesList(baseUrl);
+ const template = templates.find((t) => t.id === templateId);
+ if (!template?.logo) return null;
+
+ const response = await fetch(
+ `${baseUrl}/blueprints/${templateId}/${template.logo}`,
+ { signal: AbortSignal.timeout(10000) },
+ );
+ if (!response.ok) return null;
+
+ const buffer = Buffer.from(await response.arrayBuffer());
+ if (buffer.length === 0) return null;
+
+ const contentType = response.headers.get("content-type")?.split(";")[0];
+ const extension = template.logo.split(".").pop()?.toLowerCase() ?? "";
+ const mimeType = contentType?.startsWith("image/")
+ ? contentType
+ : LOGO_MIME_TYPES[extension];
+ if (!mimeType) return null;
+
+ const dataUrl = `data:${mimeType};base64,${buffer.toString("base64")}`;
+ if (dataUrl.length > 2 * 1024 * 1024) return null;
+
+ return dataUrl;
+ } catch {
+ return null;
+ }
+}
+
/**
* Fetches a specific template's files
*/
diff --git a/packages/server/src/templates/index.ts b/packages/server/src/templates/index.ts
index 772a95c64..c16f0624b 100644
--- a/packages/server/src/templates/index.ts
+++ b/packages/server/src/templates/index.ts
@@ -35,7 +35,8 @@ export const generateRandomDomain = ({
projectName,
}: Schema): string => {
const hash = randomBytes(3).toString("hex");
- const slugIp = serverIp.replaceAll(".", "-").replaceAll(":", "-");
+ const effectiveIp = serverIp || "127.0.0.1";
+ const slugIp = effectiveIp.replaceAll(".", "-").replaceAll(":", "-");
// Domain labels have a max length of 63 characters
// Reserve space for: hash (6) + separators (1-2) + ip section + dot + sslip.io (8)
@@ -46,7 +47,7 @@ export const generateRandomDomain = ({
? projectName.substring(0, maxProjectNameLength)
: projectName;
- return `${truncatedProjectName}-${hash}${slugIp === "" ? "" : `-${slugIp}`}.sslip.io`;
+ return `${truncatedProjectName}-${hash}-${slugIp}.sslip.io`;
};
export const generateHash = (length = 8): string => {
diff --git a/packages/server/src/utils/access-log/utils.ts b/packages/server/src/utils/access-log/utils.ts
index 9b472ee27..ddaef3ec4 100644
--- a/packages/server/src/utils/access-log/utils.ts
+++ b/packages/server/src/utils/access-log/utils.ts
@@ -120,7 +120,7 @@ export function parseRawConfig(
if (search) {
parsedLogs = parsedLogs.filter((log) =>
- log.RequestHost.toLowerCase().includes(search.toLowerCase()),
+ (log.RequestHost ?? "").toLowerCase().includes(search.toLowerCase()),
);
}
diff --git a/packages/server/src/utils/backups/compose.ts b/packages/server/src/utils/backups/compose.ts
index 296498ff3..7a5ba5535 100644
--- a/packages/server/src/utils/backups/compose.ts
+++ b/packages/server/src/utils/backups/compose.ts
@@ -37,11 +37,10 @@ export const runComposeBackup = async (
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
if (compose.serverId) {
diff --git a/packages/server/src/utils/backups/libsql.ts b/packages/server/src/utils/backups/libsql.ts
index 7f6c85f48..c4ece6ed6 100644
--- a/packages/server/src/utils/backups/libsql.ts
+++ b/packages/server/src/utils/backups/libsql.ts
@@ -36,12 +36,10 @@ export const runLibsqlBackup = async (
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
-
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
if (libsql.serverId) {
diff --git a/packages/server/src/utils/backups/mariadb.ts b/packages/server/src/utils/backups/mariadb.ts
index 121910ee8..4a3f7dc26 100644
--- a/packages/server/src/utils/backups/mariadb.ts
+++ b/packages/server/src/utils/backups/mariadb.ts
@@ -35,11 +35,10 @@ export const runMariadbBackup = async (
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
if (mariadb.serverId) {
diff --git a/packages/server/src/utils/backups/mongo.ts b/packages/server/src/utils/backups/mongo.ts
index 4b212d70c..6b80ccc86 100644
--- a/packages/server/src/utils/backups/mongo.ts
+++ b/packages/server/src/utils/backups/mongo.ts
@@ -32,11 +32,10 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => {
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
diff --git a/packages/server/src/utils/backups/mysql.ts b/packages/server/src/utils/backups/mysql.ts
index 8d0e6188a..2ac9228be 100644
--- a/packages/server/src/utils/backups/mysql.ts
+++ b/packages/server/src/utils/backups/mysql.ts
@@ -33,12 +33,10 @@ export const runMySqlBackup = async (mysql: MySql, backup: BackupSchedule) => {
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
-
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
diff --git a/packages/server/src/utils/backups/postgres.ts b/packages/server/src/utils/backups/postgres.ts
index e57682f39..de7ef5500 100644
--- a/packages/server/src/utils/backups/postgres.ts
+++ b/packages/server/src/utils/backups/postgres.ts
@@ -36,12 +36,10 @@ export const runPostgresBackup = async (
try {
const rcloneFlags = getS3Credentials(destination);
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;
-
- const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
-
const backupCommand = getBackupCommand(
backup,
- rcloneCommand,
+ rcloneFlags,
+ rcloneDestination,
deployment.logPath,
);
if (postgres.serverId) {
diff --git a/packages/server/src/utils/backups/utils.ts b/packages/server/src/utils/backups/utils.ts
index 59e0450f9..4253a3876 100644
--- a/packages/server/src/utils/backups/utils.ts
+++ b/packages/server/src/utils/backups/utils.ts
@@ -2,6 +2,7 @@ import { logger } from "@dokploy/server/lib/logger";
import type { BackupSchedule } from "@dokploy/server/services/backup";
import type { Destination } from "@dokploy/server/services/destination";
import { scheduledJobs, scheduleJob } from "node-schedule";
+import { quote } from "shell-quote";
import { keepLatestNBackups } from ".";
import { runComposeBackup } from "./compose";
import { runLibsqlBackup } from "./libsql";
@@ -71,16 +72,16 @@ export const getS3Credentials = (destination: Destination) => {
const { accessKey, secretAccessKey, region, endpoint, provider } =
destination;
const rcloneFlags = [
- `--s3-access-key-id="${accessKey}"`,
- `--s3-secret-access-key="${secretAccessKey}"`,
- `--s3-region="${region}"`,
- `--s3-endpoint="${endpoint}"`,
+ `--s3-access-key-id=${quote([accessKey])}`,
+ `--s3-secret-access-key=${quote([secretAccessKey])}`,
+ `--s3-region=${quote([region])}`,
+ `--s3-endpoint=${quote([endpoint])}`,
"--s3-no-check-bucket",
"--s3-force-path-style",
];
if (provider) {
- rcloneFlags.unshift(`--s3-provider="${provider}"`);
+ rcloneFlags.unshift(`--s3-provider=${quote([provider])}`);
}
if (destination.additionalFlags?.length) {
@@ -90,11 +91,16 @@ export const getS3Credentials = (destination: Destination) => {
return rcloneFlags;
};
+// User-controlled values (database name, user, password) are passed to the
+// container as environment variables via `docker exec -e VAR=` and
+// referenced as "$VAR" inside the inner shell, so they never appear in the
+// inner command text. The -e value is escaped for the outer shell with
+// shell-quote; the inner script is single-quoted and reads the env vars.
export const getPostgresBackupCommand = (
database: string,
databaseUser: string,
) => {
- return `docker exec -i $CONTAINER_ID bash -c "set -o pipefail; pg_dump -Fc --no-acl --no-owner -h localhost -U ${databaseUser} --no-password '${database}' | gzip"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -i $CONTAINER_ID bash -c 'set -o pipefail; pg_dump -Fc --no-acl --no-owner -h localhost -U "$DB_USER" --no-password "$DB_NAME" | gzip'`;
};
export const getMariadbBackupCommand = (
@@ -102,14 +108,14 @@ export const getMariadbBackupCommand = (
databaseUser: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID bash -c "set -o pipefail; mariadb-dump --user='${databaseUser}' --password='${databasePassword}' --single-transaction --quick --databases ${database} | gzip"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID bash -c 'set -o pipefail; mariadb-dump --user="$DB_USER" --password="$DB_PASS" --single-transaction --quick --databases "$DB_NAME" | gzip'`;
};
export const getMysqlBackupCommand = (
database: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID bash -c "set -o pipefail; mysqldump --default-character-set=utf8mb4 -u 'root' --password='${databasePassword}' --single-transaction --no-tablespaces --quick '${database}' | gzip"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID bash -c 'set -o pipefail; mysqldump --default-character-set=utf8mb4 -u root --password="$DB_PASS" --single-transaction --no-tablespaces --quick "$DB_NAME" | gzip'`;
};
export const getMongoBackupCommand = (
@@ -117,11 +123,11 @@ export const getMongoBackupCommand = (
databaseUser: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID bash -c "set -o pipefail; mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --archive --authenticationDatabase admin --gzip"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID bash -c 'set -o pipefail; mongodump -d "$DB_NAME" -u "$DB_USER" -p "$DB_PASS" --archive --authenticationDatabase admin --gzip'`;
};
export const getLibsqlBackupCommand = (database: string) => {
- return `docker exec -i $CONTAINER_ID sh -c "tar cf - -C /var/lib/sqld ${database} | gzip"`;
+ return `docker exec -e DB_NAME=${quote([database])} -i $CONTAINER_ID sh -c 'tar cf - -C /var/lib/sqld "$DB_NAME" | gzip'`;
};
export const getServiceContainerCommand = (appName: string) => {
@@ -253,11 +259,14 @@ export const generateBackupCommand = (backup: BackupSchedule) => {
export const getBackupCommand = (
backup: BackupSchedule,
- rcloneCommand: string,
+ rcloneFlags: string[],
+ rcloneDestination: string,
logPath: string,
) => {
const containerSearch = getContainerSearchCommand(backup);
const backupCommand = generateBackupCommand(backup);
+ const rcloneCommand = `rclone rcat ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
+ const rcloneDeleteCommand = `rclone deletefile ${rcloneFlags.join(" ")} "${rcloneDestination}"`;
logger.info(
{
@@ -273,33 +282,24 @@ export const getBackupCommand = (
set -eo pipefail;
echo "[$(date)] Starting backup process..." >> ${logPath};
echo "[$(date)] Executing backup command..." >> ${logPath};
- CONTAINER_ID=$(${containerSearch})
+ CONTAINER_ID=$(${containerSearch});
if [ -z "$CONTAINER_ID" ]; then
echo "[$(date)] ❌ Error: Container not found" >> ${logPath};
exit 1;
- fi
+ fi;
echo "[$(date)] Container Up: $CONTAINER_ID" >> ${logPath};
+ echo "[$(date)] Starting backup and upload to S3..." >> ${logPath};
- # Run the backup command and capture the exit status
- BACKUP_OUTPUT=$(${backupCommand} 2>&1 >/dev/null) || {
+ UPLOAD_OUTPUT=$({ ${backupCommand} | ${rcloneCommand}; } 2>&1 >/dev/null) || {
echo "[$(date)] ❌ Error: Backup failed" >> ${logPath};
- echo "Error: $BACKUP_OUTPUT" >> ${logPath};
- exit 1;
- }
-
- echo "[$(date)] ✅ backup completed successfully" >> ${logPath};
- echo "[$(date)] Starting upload to S3..." >> ${logPath};
-
- # Run the upload command and capture the exit status
- UPLOAD_OUTPUT=$(${backupCommand} | ${rcloneCommand} 2>&1 >/dev/null) || {
- echo "[$(date)] ❌ Error: Upload to S3 failed" >> ${logPath};
echo "Error: $UPLOAD_OUTPUT" >> ${logPath};
+ ${rcloneDeleteCommand} >/dev/null 2>&1 || true;
exit 1;
- }
+ };
- echo "[$(date)] ✅ Upload to S3 completed successfully" >> ${logPath};
+ echo "[$(date)] ✅ Backup uploaded to S3 successfully" >> ${logPath};
echo "Backup done ✅" >> ${logPath};
`;
};
diff --git a/packages/server/src/utils/builders/compose.ts b/packages/server/src/utils/builders/compose.ts
index 790116cb6..168de7fda 100644
--- a/packages/server/src/utils/builders/compose.ts
+++ b/packages/server/src/utils/builders/compose.ts
@@ -7,19 +7,23 @@ import { writeDomainsToCompose } from "../docker/domain";
import {
encodeBase64,
getEnvironmentVariablesObject,
- prepareEnvironmentVariables,
+ prepareEnvironmentVariablesForFile,
} from "../docker/utils";
+import { withResolvedVaultRefs } from "../vault";
export type ComposeNested = InferResultType<
"compose",
{ environment: { with: { project: true } }; mounts: true; domains: true }
>;
-export const getBuildComposeCommand = async (compose: ComposeNested) => {
+export const getBuildComposeCommand = async (rawCompose: ComposeNested) => {
+ const compose = await withResolvedVaultRefs(rawCompose);
const { COMPOSE_PATH } = paths(!!compose.serverId);
const { sourceType, appName, mounts, composeType, domains } = compose;
const command = createCommand(compose);
- const envCommand = getCreateEnvFileCommand(compose);
+ const envCommand = compose.createEnvFile
+ ? getCreateEnvFileCommand(compose)
+ : "";
const projectPath = join(COMPOSE_PATH, compose.appName, "code");
const exportEnvCommand = getExportEnvCommand(compose);
@@ -67,11 +71,48 @@ Compose Type: ${composeType} ✅`;
return bashCommand;
};
+// Shell control characters that must never appear in a user-provided compose
+// command: they would let it break out of the `docker ${command}` invocation
+// into arbitrary host commands. A normal docker compose CLI line never needs them.
+// Removed '&' from the blocklist to allow '&&' chaining
+const UNSAFE_COMPOSE_COMMAND = /[;|`$(){}<>\n\\]/;
+
const sanitizeCommand = (command: string) => {
const sanitizedCommand = command.trim();
- const parts = sanitizedCommand.split(/\s+/);
+ if (UNSAFE_COMPOSE_COMMAND.test(sanitizedCommand)) {
+ throw new Error(
+ "Invalid characters in compose command: shell control characters are not allowed",
+ );
+ }
+ if (sanitizedCommand.includes("&")) {
+ // Block single '&' (e.g., backgrounding tasks) or malformed chains like '&&&'
+ if (
+ /(? cmd.trim());
+ const isSafeChain = chains
+ .slice(1)
+ .every(
+ (cmd) =>
+ cmd.startsWith("docker compose ") ||
+ cmd.startsWith("docker-compose "),
+ );
+
+ if (!isSafeChain) {
+ throw new Error(
+ "Chained commands must strictly start with 'docker compose '",
+ );
+ }
+ }
+
+ const parts = sanitizedCommand.split(/\s+/);
const restCommand = parts.map((arg) => arg.replace(/^"(.*)"$/, "$1"));
return restCommand.join(" ");
@@ -88,9 +129,9 @@ export const createCommand = (compose: ComposeNested) => {
let command = "";
if (composeType === "docker-compose") {
- command = `compose -p ${appName} -f ${path} up -d --build --remove-orphans`;
+ command = `compose -p ${quote([appName])} -f ${quote([path])} up -d --build --remove-orphans`;
} else if (composeType === "stack") {
- command = `stack deploy -c ${path} ${appName} --prune --with-registry-auth`;
+ command = `stack deploy -c ${quote([path])} ${quote([appName])} --prune --with-registry-auth`;
}
return command;
@@ -116,7 +157,7 @@ export const getCreateEnvFileCommand = (compose: ComposeNested) => {
envContent += `\nCOMPOSE_PREFIX=${compose.suffix}`;
}
- const envFileContent = prepareEnvironmentVariables(
+ const envFileContent = prepareEnvironmentVariablesForFile(
envContent,
compose.environment.project.env,
compose.environment.env,
@@ -124,8 +165,8 @@ export const getCreateEnvFileCommand = (compose: ComposeNested) => {
const encodedContent = encodeBase64(envFileContent);
return `
-touch ${envFilePath};
-echo "${encodedContent}" | base64 -d > "${envFilePath}";
+touch ${quote([envFilePath])};
+echo "${encodedContent}" | base64 -d > ${quote([envFilePath])};
`;
};
diff --git a/packages/server/src/utils/builders/docker-file.ts b/packages/server/src/utils/builders/docker-file.ts
index b20e3f170..5f315cd58 100644
--- a/packages/server/src/utils/builders/docker-file.ts
+++ b/packages/server/src/utils/builders/docker-file.ts
@@ -85,9 +85,9 @@ export const getDockerCommand = (application: ApplicationNested) => {
}
command += `
-echo "Building ${appName}" ;
-cd ${dockerContextPath} || {
- echo "❌ The path ${dockerContextPath} does not exist" ;
+echo ${quote([`Building ${appName}`])} ;
+cd ${quote([dockerContextPath])} || {
+ echo ${quote([`❌ The path ${dockerContextPath} does not exist`])} ;
exit 1;
}
diff --git a/packages/server/src/utils/builders/index.ts b/packages/server/src/utils/builders/index.ts
index 82bbf4eff..6c8448000 100644
--- a/packages/server/src/utils/builders/index.ts
+++ b/packages/server/src/utils/builders/index.ts
@@ -1,3 +1,4 @@
+import { resolveServiceNetworks } from "@dokploy/server/services/network";
import { findRegistryByIdWithCredentials } from "@dokploy/server/services/registry";
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
@@ -11,6 +12,7 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
import { getDockerCommand } from "./docker-file";
import { getHerokuCommand } from "./heroku";
import { getNixpacksCommand } from "./nixpacks";
@@ -37,7 +39,8 @@ export type ApplicationNested = InferResultType<
}
>;
-export const getBuildCommand = async (application: ApplicationNested) => {
+export const getBuildCommand = async (rawApplication: ApplicationNested) => {
+ const application = await withResolvedVaultRefs(rawApplication);
let command = "";
if (application.sourceType !== "docker") {
@@ -76,8 +79,9 @@ export const getBuildCommand = async (application: ApplicationNested) => {
};
export const mechanizeDockerContainer = async (
- application: ApplicationNested,
+ rawApplication: ApplicationNested,
) => {
+ const application = await withResolvedVaultRefs(rawApplication);
const {
appName,
env,
@@ -100,6 +104,8 @@ export const mechanizeDockerContainer = async (
const volumesMount = generateVolumeMounts(mounts);
+ const resolvedNetworks = await resolveServiceNetworks(application);
+
const {
HealthCheck,
RestartPolicy,
@@ -108,7 +114,6 @@ export const mechanizeDockerContainer = async (
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -147,7 +152,7 @@ export const mechanizeDockerContainer = async (
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/builders/nixpacks.ts b/packages/server/src/utils/builders/nixpacks.ts
index b7134ea65..e02be0fc3 100644
--- a/packages/server/src/utils/builders/nixpacks.ts
+++ b/packages/server/src/utils/builders/nixpacks.ts
@@ -1,6 +1,7 @@
import path from "node:path";
import { getStaticCommand } from "@dokploy/server/utils/builders/static";
import { nanoid } from "nanoid";
+import { quote } from "shell-quote";
import { prepareEnvironmentVariablesForShell } from "../docker/utils";
import { getBuildAppDirectory } from "../filesystem/directory";
import type { ApplicationNested } from ".";
@@ -52,10 +53,10 @@ export const getNixpacksCommand = (application: ApplicationNested) => {
bashCommand += `
docker create --name ${buildContainerId} ${appName}
- mkdir -p ${localPath}
- docker cp ${buildContainerId}:/app/${publishDirectory}${isDirectory ? "/." : ""} ${path.join(buildAppDirectory, publishDirectory)} || {
+ mkdir -p ${quote([localPath])}
+ docker cp ${quote([`${buildContainerId}:/app/${publishDirectory}${isDirectory ? "/." : ""}`])} ${quote([localPath])} || {
docker rm ${buildContainerId}
- echo "❌ Copying ${publishDirectory} to ${path.join(buildAppDirectory, publishDirectory)} failed" ;
+ echo ${quote([`❌ Copying ${publishDirectory} to ${localPath} failed`])} ;
exit 1;
}
docker rm ${buildContainerId}
diff --git a/packages/server/src/utils/builders/railpack.ts b/packages/server/src/utils/builders/railpack.ts
index b12296a56..b393f4460 100644
--- a/packages/server/src/utils/builders/railpack.ts
+++ b/packages/server/src/utils/builders/railpack.ts
@@ -53,14 +53,9 @@ export const getRailpackCommand = (application: ApplicationNested) => {
"build",
"--builder",
builderName,
- ...(cacheKey
- ? [
- "--build-arg",
- `secrets-hash=${secretsHash}`,
- "--build-arg",
- `cache-key=${cacheKey}`,
- ]
- : []),
+ "--build-arg",
+ `secrets-hash=${secretsHash}`,
+ ...(cacheKey ? ["--build-arg", `cache-key=${cacheKey}`] : []),
"--build-arg",
`BUILDKIT_SYNTAX=ghcr.io/railwayapp/railpack-frontend:v${application.railpackVersion}`,
"-f",
diff --git a/packages/server/src/utils/cluster/upload.ts b/packages/server/src/utils/cluster/upload.ts
index 0968afc7b..d6d8e4df9 100644
--- a/packages/server/src/utils/cluster/upload.ts
+++ b/packages/server/src/utils/cluster/upload.ts
@@ -5,6 +5,7 @@ import {
safeDockerLoginCommand,
} from "@dokploy/server/services/registry";
import { createRollback } from "@dokploy/server/services/rollbacks";
+import { quote } from "shell-quote";
import type { ApplicationNested } from "../builders";
export const uploadImageRemoteCommand = async (
@@ -124,18 +125,18 @@ const getRegistryCommands = (
registry.password,
);
return `
-echo "📦 [Enabled Registry] Uploading image to '${registry.registryType}' | '${registryTag}'" ;
+echo ${quote([`📦 [Enabled Registry] Uploading image to '${registry.registryType}' | '${registryTag}'`])} ;
${loginCmd} || {
echo "❌ DockerHub Failed" ;
exit 1;
}
echo "✅ Registry Login Success" ;
-docker tag ${imageName} ${registryTag} || {
+docker tag ${quote([imageName])} ${quote([registryTag])} || {
echo "❌ Error tagging image" ;
exit 1;
}
echo "✅ Image Tagged" ;
-docker push ${registryTag} || {
+docker push ${quote([registryTag])} || {
echo "❌ Error pushing image" ;
exit 1;
}
diff --git a/packages/server/src/utils/databases/libsql.ts b/packages/server/src/utils/databases/libsql.ts
index 70937c64e..d3b2f9947 100644
--- a/packages/server/src/utils/databases/libsql.ts
+++ b/packages/server/src/utils/databases/libsql.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions, PortConfig } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,6 +10,7 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type LibsqlNested = InferResultType<
"libsql",
@@ -17,7 +19,8 @@ export type LibsqlNested = InferResultType<
environment: { with: { project: true } };
}
>;
-export const buildLibsql = async (libsql: LibsqlNested) => {
+export const buildLibsql = async (rawLibsql: LibsqlNested) => {
+ const libsql = await withResolvedVaultRefs(rawLibsql);
const {
appName,
env,
@@ -46,6 +49,8 @@ export const buildLibsql = async (libsql: LibsqlNested) => {
env ? `\n${env}` : ""
}${sqldNode === "replica" ? `\nSQLD_PRIMARY_URL="${sqldPrimaryUrl}"` : ""}`;
+ const resolvedNetworks = await resolveServiceNetworks(libsql);
+
const {
HealthCheck,
RestartPolicy,
@@ -54,7 +59,6 @@ export const buildLibsql = async (libsql: LibsqlNested) => {
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
} = generateConfigContainer(libsql);
const resources = calculateResources({
memoryLimit,
@@ -96,7 +100,7 @@ export const buildLibsql = async (libsql: LibsqlNested) => {
: {}),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/databases/mariadb.ts b/packages/server/src/utils/databases/mariadb.ts
index 3e5a9ef49..ae564504e 100644
--- a/packages/server/src/utils/databases/mariadb.ts
+++ b/packages/server/src/utils/databases/mariadb.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,12 +10,14 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type MariadbNested = InferResultType<
"mariadb",
{ mounts: true; environment: { with: { project: true } } }
>;
-export const buildMariadb = async (mariadb: MariadbNested) => {
+export const buildMariadb = async (rawMariadb: MariadbNested) => {
+ const mariadb = await withResolvedVaultRefs(rawMariadb);
const {
appName,
env,
@@ -37,6 +40,8 @@ export const buildMariadb = async (mariadb: MariadbNested) => {
env ? `\n${env}` : ""
}`;
+ const resolvedNetworks = await resolveServiceNetworks(mariadb);
+
const {
HealthCheck,
RestartPolicy,
@@ -45,7 +50,6 @@ export const buildMariadb = async (mariadb: MariadbNested) => {
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -87,7 +91,7 @@ export const buildMariadb = async (mariadb: MariadbNested) => {
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/databases/mongo.ts b/packages/server/src/utils/databases/mongo.ts
index c1617fac0..67496aeaf 100644
--- a/packages/server/src/utils/databases/mongo.ts
+++ b/packages/server/src/utils/databases/mongo.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,13 +10,15 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type MongoNested = InferResultType<
"mongo",
{ mounts: true; environment: { with: { project: true } } }
>;
-export const buildMongo = async (mongo: MongoNested) => {
+export const buildMongo = async (rawMongo: MongoNested) => {
+ const mongo = await withResolvedVaultRefs(rawMongo);
const {
appName,
env,
@@ -83,6 +86,8 @@ ${command ?? "wait $MONGOD_PID"}`;
env ? `\n${env}` : ""
}`;
+ const resolvedNetworks = await resolveServiceNetworks(mongo);
+
const {
HealthCheck,
RestartPolicy,
@@ -91,7 +96,6 @@ ${command ?? "wait $MONGOD_PID"}`;
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -143,7 +147,7 @@ ${command ?? "wait $MONGOD_PID"}`;
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/databases/mysql.ts b/packages/server/src/utils/databases/mysql.ts
index 34dd6c21e..56bb7ea4d 100644
--- a/packages/server/src/utils/databases/mysql.ts
+++ b/packages/server/src/utils/databases/mysql.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,13 +10,15 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type MysqlNested = InferResultType<
"mysql",
{ mounts: true; environment: { with: { project: true } } }
>;
-export const buildMysql = async (mysql: MysqlNested) => {
+export const buildMysql = async (rawMysql: MysqlNested) => {
+ const mysql = await withResolvedVaultRefs(rawMysql);
const {
appName,
env,
@@ -43,6 +46,8 @@ export const buildMysql = async (mysql: MysqlNested) => {
env ? `\n${env}` : ""
}`;
+ const resolvedNetworks = await resolveServiceNetworks(mysql);
+
const {
HealthCheck,
RestartPolicy,
@@ -51,7 +56,6 @@ export const buildMysql = async (mysql: MysqlNested) => {
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -93,7 +97,7 @@ export const buildMysql = async (mysql: MysqlNested) => {
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/databases/postgres.ts b/packages/server/src/utils/databases/postgres.ts
index 6eddb4581..18392b7b5 100644
--- a/packages/server/src/utils/databases/postgres.ts
+++ b/packages/server/src/utils/databases/postgres.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,12 +10,14 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type PostgresNested = InferResultType<
"postgres",
{ mounts: true; environment: { with: { project: true } } }
>;
-export const buildPostgres = async (postgres: PostgresNested) => {
+export const buildPostgres = async (rawPostgres: PostgresNested) => {
+ const postgres = await withResolvedVaultRefs(rawPostgres);
const {
appName,
env,
@@ -36,6 +39,8 @@ export const buildPostgres = async (postgres: PostgresNested) => {
env ? `\n${env}` : ""
}`;
+ const resolvedNetworks = await resolveServiceNetworks(postgres);
+
const {
HealthCheck,
RestartPolicy,
@@ -44,7 +49,6 @@ export const buildPostgres = async (postgres: PostgresNested) => {
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -85,7 +89,7 @@ export const buildPostgres = async (postgres: PostgresNested) => {
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/databases/rebuild.ts b/packages/server/src/utils/databases/rebuild.ts
index 0d1517d3a..291c10746 100644
--- a/packages/server/src/utils/databases/rebuild.ts
+++ b/packages/server/src/utils/databases/rebuild.ts
@@ -14,6 +14,7 @@ import { deployMySql } from "@dokploy/server/services/mysql";
import { deployPostgres } from "@dokploy/server/services/postgres";
import { deployRedis } from "@dokploy/server/services/redis";
import { eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import { removeService } from "../docker/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -40,7 +41,7 @@ export const rebuildDatabase = async (
for (const mount of database.mounts) {
if (mount.type === "volume") {
- const command = `docker volume rm ${mount?.volumeName} --force`;
+ const command = `docker volume rm ${quote([mount?.volumeName ?? ""])} --force`;
if (database.serverId) {
await execAsyncRemote(database.serverId, command);
} else {
diff --git a/packages/server/src/utils/databases/redis.ts b/packages/server/src/utils/databases/redis.ts
index 21388c848..64c16657b 100644
--- a/packages/server/src/utils/databases/redis.ts
+++ b/packages/server/src/utils/databases/redis.ts
@@ -1,5 +1,6 @@
import type { InferResultType } from "@dokploy/server/types/with";
import type { CreateServiceOptions } from "dockerode";
+import { resolveServiceNetworks } from "../../services/network";
import {
calculateResources,
generateBindMounts,
@@ -9,12 +10,14 @@ import {
prepareEnvironmentVariables,
} from "../docker/utils";
import { getRemoteDocker } from "../servers/remote-docker";
+import { withResolvedVaultRefs } from "../vault";
export type RedisNested = InferResultType<
"redis",
{ mounts: true; environment: { with: { project: true } } }
>;
-export const buildRedis = async (redis: RedisNested) => {
+export const buildRedis = async (rawRedis: RedisNested) => {
+ const redis = await withResolvedVaultRefs(rawRedis);
const {
appName,
env,
@@ -34,6 +37,8 @@ export const buildRedis = async (redis: RedisNested) => {
env ? `\n${env}` : ""
}`;
+ const resolvedNetworks = await resolveServiceNetworks(redis);
+
const {
HealthCheck,
RestartPolicy,
@@ -42,7 +47,6 @@ export const buildRedis = async (redis: RedisNested) => {
Mode,
RollbackConfig,
UpdateConfig,
- Networks,
StopGracePeriod,
EndpointSpec,
Ulimits,
@@ -91,7 +95,7 @@ export const buildRedis = async (redis: RedisNested) => {
...(Ulimits && { Ulimits }),
Labels,
},
- Networks,
+ Networks: resolvedNetworks,
RestartPolicy,
Placement,
Resources: {
diff --git a/packages/server/src/utils/docker/compose/volume.ts b/packages/server/src/utils/docker/compose/volume.ts
index be4c7b206..6708758cb 100644
--- a/packages/server/src/utils/docker/compose/volume.ts
+++ b/packages/server/src/utils/docker/compose/volume.ts
@@ -26,11 +26,14 @@ export const addSuffixToVolumesInServices = (
if (_.has(newServiceConfig, "volumes")) {
newServiceConfig.volumes = _.map(newServiceConfig.volumes, (volume) => {
if (_.isString(volume)) {
- const [volumeName, path] = volume.split(":");
+ // remainder is the container path plus optional access mode (:ro, :z, :Z)
+ const [volumeName, ...pathAndMode] = volume.split(":");
+ const remainder = pathAndMode.join(":");
// skip bind mounts and variables (e.g. $PWD)
if (
!volumeName ||
+ !remainder ||
volumeName.startsWith(".") ||
volumeName.startsWith("/") ||
volumeName.startsWith("$")
@@ -43,10 +46,10 @@ export const addSuffixToVolumesInServices = (
if (parts.length > 1) {
const baseName = parts[0];
const rest = parts.slice(1).join("/");
- return `${baseName}-${suffix}/${rest}:${path}`;
+ return `${baseName}-${suffix}/${rest}:${remainder}`;
}
- return `${volumeName}-${suffix}:${path}`;
+ return `${volumeName}-${suffix}:${remainder}`;
}
if (_.isObject(volume) && volume.type === "volume" && volume.source) {
return {
diff --git a/packages/server/src/utils/docker/domain.ts b/packages/server/src/utils/docker/domain.ts
index 26b47535d..ec66d350c 100644
--- a/packages/server/src/utils/docker/domain.ts
+++ b/packages/server/src/utils/docker/domain.ts
@@ -1,8 +1,11 @@
import fs, { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { paths } from "@dokploy/server/constants";
+import { db } from "@dokploy/server/db";
+import { network, patch } from "@dokploy/server/db/schema";
import type { Compose } from "@dokploy/server/services/compose";
import type { Domain } from "@dokploy/server/services/domain";
+import { eq, inArray } from "drizzle-orm";
import { parse, stringify } from "yaml";
import { execAsyncRemote } from "../process/execAsync";
import { cloneBitbucketRepository } from "../providers/bitbucket";
@@ -131,6 +134,38 @@ exit 1;
`;
}
};
+export const applyComposeFilePatch = async (
+ compose: Compose,
+): Promise => {
+ if (compose.sourceType === "raw") {
+ return null;
+ }
+
+ const composePatches = await db.query.patch.findMany({
+ where: eq(patch.composeId, compose.composeId),
+ });
+
+ const composeFilePatch = composePatches.find(
+ (p) =>
+ p.enabled &&
+ p.type !== "delete" &&
+ join(p.filePath) === join(compose.composePath),
+ );
+
+ if (!composeFilePatch?.content) {
+ return null;
+ }
+
+ try {
+ const parsed = parse(composeFilePatch.content, {
+ maxAliasCount: 10000,
+ }) as ComposeSpecification;
+ return parsed ?? null;
+ } catch {
+ return null;
+ }
+};
+
export const addDomainToCompose = async (
compose: Compose,
domains: Domain[],
@@ -149,6 +184,8 @@ export const addDomainToCompose = async (
return null;
}
+ result = (await applyComposeFilePatch(compose)) ?? result;
+
if (compose.isolatedDeployment) {
const randomized = randomizeDeployableSpecificationFile(
result,
@@ -218,6 +255,17 @@ export const addDomainToCompose = async (
labels.unshift("traefik.swarm.network=dokploy-network");
}
}
+ } else {
+ const isolatedNetwork = compose.suffix || compose.appName;
+ if (compose.composeType === "docker-compose") {
+ if (!labels.includes(`traefik.docker.network=${isolatedNetwork}`)) {
+ labels.unshift(`traefik.docker.network=${isolatedNetwork}`);
+ }
+ } else {
+ if (!labels.includes(`traefik.swarm.network=${isolatedNetwork}`)) {
+ labels.unshift(`traefik.swarm.network=${isolatedNetwork}`);
+ }
+ }
}
}
@@ -229,14 +277,79 @@ export const addDomainToCompose = async (
}
}
- // Add dokploy-network to the root of the compose file
+ const injectedNetworkNames = await applyServiceNetworks(result, compose);
+
if (!compose.isolatedDeployment) {
- result.networks = addDokployNetworkToRoot(result.networks);
+ declareUsedNetworksInRoot(result, injectedNetworkNames);
}
return result;
};
+export const applyServiceNetworks = async (
+ result: ComposeSpecification,
+ compose: Compose,
+) => {
+ const injectedNetworkNames = new Set();
+ const serviceNetworks = compose.serviceNetworks ?? [];
+ if (serviceNetworks.length === 0) return injectedNetworkNames;
+
+ const allNetworkIds = [
+ ...new Set(serviceNetworks.flatMap((s) => s.networkIds)),
+ ];
+ const networks =
+ allNetworkIds.length > 0
+ ? await db.query.network.findMany({
+ where: inArray(network.networkId, allNetworkIds),
+ })
+ : [];
+
+ for (const config of serviceNetworks) {
+ const service = result.services?.[config.serviceName];
+ if (!service) continue;
+
+ for (const networkId of config.networkIds) {
+ const match = networks.find((n) => n.networkId === networkId);
+ if (!match) continue;
+ service.networks = addDokployNetworkToService(
+ service.networks,
+ match.name,
+ );
+ injectedNetworkNames.add(match.name);
+ }
+
+ if (config.detachDokployNetwork) {
+ removeNetworkFromService(service, "dokploy-network");
+ removeNetworkFromService(service, "default");
+ removeDokployNetworkLabel(service);
+ }
+ }
+
+ return injectedNetworkNames;
+};
+
+export const declareUsedNetworksInRoot = (
+ result: ComposeSpecification,
+ injectedNetworkNames: Set,
+) => {
+ const isUsed = (name: string) =>
+ Object.values(result.services ?? {}).some((service) => {
+ const nets = service?.networks;
+ if (Array.isArray(nets)) return nets.includes(name);
+ if (nets && typeof nets === "object") return name in nets;
+ return false;
+ });
+
+ if (isUsed("dokploy-network")) {
+ result.networks = addDokployNetworkToRoot(result.networks);
+ }
+ for (const name of injectedNetworkNames) {
+ if (isUsed(name)) {
+ result.networks = addDokployNetworkToRoot(result.networks, name);
+ }
+ }
+};
+
export const writeComposeFile = async (
compose: Compose,
composeSpec: ComposeSpecification,
@@ -350,9 +463,10 @@ export const createDomainLabels = (
export const addDokployNetworkToService = (
networkService: DefinitionsService["networks"],
+ networkName = "dokploy-network",
) => {
let networks = networkService;
- const network = "dokploy-network";
+ const network = networkName;
const defaultNetwork = "default";
if (!networks) {
networks = [];
@@ -377,11 +491,40 @@ export const addDokployNetworkToService = (
return networks;
};
+export const removeNetworkFromService = (
+ service: DefinitionsService,
+ networkName: string,
+) => {
+ const networks = service.networks;
+ if (Array.isArray(networks)) {
+ service.networks = networks.filter((n) => n !== networkName);
+ } else if (networks && typeof networks === "object") {
+ delete networks[networkName];
+ }
+};
+
+const removeDokployNetworkLabel = (service: DefinitionsService) => {
+ const stripped = (labels: DefinitionsService["labels"]) => {
+ if (Array.isArray(labels)) {
+ return labels.filter(
+ (l) =>
+ l !== "traefik.docker.network=dokploy-network" &&
+ l !== "traefik.swarm.network=dokploy-network",
+ );
+ }
+ return labels;
+ };
+ if (service.labels) service.labels = stripped(service.labels);
+ if (service.deploy?.labels)
+ service.deploy.labels = stripped(service.deploy.labels);
+};
+
export const addDokployNetworkToRoot = (
networkRoot: PropertiesNetworks | undefined,
+ networkName = "dokploy-network",
) => {
let networks = networkRoot;
- const network = "dokploy-network";
+ const network = networkName;
if (!networks) {
networks = {};
diff --git a/packages/server/src/utils/docker/utils.ts b/packages/server/src/utils/docker/utils.ts
index 8065b7dd9..09fe877cd 100644
--- a/packages/server/src/utils/docker/utils.ts
+++ b/packages/server/src/utils/docker/utils.ts
@@ -401,6 +401,13 @@ export const prepareEnvironmentVariables = (
projectEnv?: string | null,
environmentEnv?: string | null,
) => {
+ for (const source of [serviceEnv, projectEnv, environmentEnv]) {
+ if (source?.includes("${{vault.")) {
+ throw new Error(
+ "Unresolved vault reference: call withResolvedVaultRefs() on the entity before preparing environment variables",
+ );
+ }
+ }
const projectVars = parse(projectEnv ?? "");
const environmentVars = parse(environmentEnv ?? "");
const serviceVars = parse(serviceEnv ?? "");
@@ -465,6 +472,27 @@ export const prepareEnvironmentVariablesForShell = (
return envVars.map((env) => quote([env]));
};
+export const prepareEnvironmentVariablesForFile = (
+ serviceEnv: string | null,
+ projectEnv?: string | null,
+ environmentEnv?: string | null,
+): string[] => {
+ const envVars = prepareEnvironmentVariables(
+ serviceEnv,
+ projectEnv,
+ environmentEnv,
+ );
+
+ return envVars.map((pair) => {
+ const [key, value] = parseEnvironmentKeyValuePair(pair);
+ const escapedValue = value
+ .replace(/\\/g, "\\\\")
+ .replace(/"/g, '\\"')
+ .replace(/\$/g, "\\$");
+ return `${key}="${escapedValue}"`;
+ });
+};
+
export const parseEnvironmentKeyValuePair = (
pair: string,
): [string, string] => {
@@ -548,7 +576,6 @@ export const generateConfigContainer = (
labelsSwarm,
replicas,
mounts,
- networkSwarm,
stopGracePeriodSwarm,
endpointSpecSwarm,
ulimitsSwarm,
@@ -611,13 +638,6 @@ export const generateConfigContainer = (
stopGracePeriodSwarm !== undefined && {
StopGracePeriod: stopGracePeriodSwarm,
}),
- ...(networkSwarm
- ? {
- Networks: networkSwarm,
- }
- : {
- Networks: [{ Target: "dokploy-network" }],
- }),
...(endpointSpecSwarm && {
EndpointSpec: {
...(endpointSpecSwarm.Mode && { Mode: endpointSpecSwarm.Mode }),
@@ -712,14 +732,14 @@ export const getCreateFileCommand = (
) => {
const fullPath = path.join(outputPath, filePath);
if (fullPath.endsWith(path.sep) || filePath.endsWith("/")) {
- return `mkdir -p ${fullPath};`;
+ return `mkdir -p ${quote([fullPath])};`;
}
const directory = path.dirname(fullPath);
const encodedContent = encodeBase64(content);
return `
- mkdir -p ${directory};
- echo "${encodedContent}" | base64 -d > "${fullPath}";
+ mkdir -p ${quote([directory])};
+ echo "${encodedContent}" | base64 -d > ${quote([fullPath])};
`;
};
@@ -900,50 +920,6 @@ export const checkPostgresHealth = async (): Promise => {
}
};
-export const checkRedisHealth = async (): Promise => {
- const serviceCheck = await checkSwarmServiceRunning("dokploy-redis");
- if (serviceCheck.status === "unhealthy") {
- return serviceCheck;
- }
-
- // Verify Redis actually responds to PING
- const containerId = await getSwarmServiceContainerId("dokploy-redis");
- if (!containerId) {
- return { status: "unhealthy", message: "Could not find running container" };
- }
-
- try {
- const exec = await docker.getContainer(containerId).exec({
- Cmd: ["redis-cli", "ping"],
- AttachStdout: true,
- AttachStderr: true,
- });
- const stream = await exec.start({});
-
- const output = await new Promise((resolve) => {
- let data = "";
- stream.on("data", (chunk: Buffer) => {
- data += chunk.toString();
- });
- stream.on("end", () => resolve(data));
- });
-
- if (!output.includes("PONG")) {
- return {
- status: "unhealthy",
- message: `Redis did not respond with PONG: ${output.trim()}`,
- };
- }
-
- return { status: "healthy" };
- } catch (error) {
- return {
- status: "unhealthy",
- message: error instanceof Error ? error.message : "Failed to check Redis",
- };
- }
-};
-
export const checkTraefikHealth = async (): Promise => {
// Traefik can run as a standalone container or a swarm service
try {
diff --git a/packages/server/src/utils/gpu-setup.ts b/packages/server/src/utils/gpu-setup.ts
index f658b7727..59aa98047 100644
--- a/packages/server/src/utils/gpu-setup.ts
+++ b/packages/server/src/utils/gpu-setup.ts
@@ -1,4 +1,5 @@
import * as fs from "node:fs/promises";
+import { quote } from "shell-quote";
import { execAsync, execAsyncRemote, sleep } from "../utils/process/execAsync";
interface GPUInfo {
@@ -322,7 +323,7 @@ const setupLocalServer = async (daemonConfig: any) => {
};
const addGpuLabel = async (nodeId: string, serverId?: string) => {
- const labelCommand = `docker node update --label-add gpu=true ${nodeId}`;
+ const labelCommand = `docker node update --label-add gpu=true ${quote([nodeId])}`;
if (serverId) {
await execAsyncRemote(serverId, labelCommand);
} else {
@@ -335,7 +336,7 @@ const verifySetup = async (nodeId: string, serverId?: string) => {
if (!finalStatus.swarmEnabled) {
const diagnosticCommands = [
- `docker node inspect ${nodeId}`,
+ `docker node inspect ${quote([nodeId])}`,
'nvidia-smi -a | grep "GPU UUID"',
"cat /etc/docker/daemon.json",
"cat /etc/nvidia-container-runtime/config.toml",
diff --git a/packages/server/src/utils/hostname-validation.ts b/packages/server/src/utils/hostname-validation.ts
index be3407e5e..bc5aae7b6 100644
--- a/packages/server/src/utils/hostname-validation.ts
+++ b/packages/server/src/utils/hostname-validation.ts
@@ -1,8 +1,8 @@
// Valid hostname per RFC 1123: labels of letters, digits and hyphens
-// (no leading/trailing hyphen), separated by dots. Underscores are rejected
+// (no leading/trailing hyphen), optionally separated by dots. Underscores are rejected
// because Let's Encrypt refuses to issue certificates for them.
export const VALID_HOSTNAME_REGEX =
- /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;
+ /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)*[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;
export const INVALID_HOSTNAME_MESSAGE =
"Invalid domain name. Use only letters, numbers, hyphens and dots (e.g. example.com). Underscores are not allowed.";
diff --git a/packages/server/src/utils/providers/bitbucket.ts b/packages/server/src/utils/providers/bitbucket.ts
index d2be27a67..ca4ac6c95 100644
--- a/packages/server/src/utils/providers/bitbucket.ts
+++ b/packages/server/src/utils/providers/bitbucket.ts
@@ -10,6 +10,7 @@ import {
} from "@dokploy/server/services/bitbucket";
import type { InferResultType } from "@dokploy/server/types/with";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
import type { z } from "zod";
export type ApplicationWithBitbucket = InferResultType<
@@ -124,8 +125,8 @@ export const cloneBitbucketRepository = async ({
const repoToUse = entity.bitbucketRepositorySlug || bitbucketRepository;
const repoclone = `bitbucket.org/${bitbucketOwner}/${repoToUse}.git`;
const cloneUrl = getBitbucketCloneUrl(bitbucket, repoclone);
- command += `echo "Cloning Repo ${repoclone} to ${outputPath}: ✅";`;
- command += `git clone --branch ${bitbucketBranch} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${cloneUrl} ${outputPath} --progress;`;
+ command += `echo ${quote([`Cloning Repo ${repoclone} to ${outputPath}: ✅`])};`;
+ command += `git clone --branch ${quote([String(bitbucketBranch ?? "")])} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${quote([String(cloneUrl ?? "")])} ${quote([String(outputPath ?? "")])} --progress;`;
return command;
};
diff --git a/packages/server/src/utils/providers/docker.ts b/packages/server/src/utils/providers/docker.ts
index f3a4c39f3..25a1ffa82 100644
--- a/packages/server/src/utils/providers/docker.ts
+++ b/packages/server/src/utils/providers/docker.ts
@@ -1,4 +1,5 @@
import { safeDockerLoginCommand } from "@dokploy/server/services/registry";
+import { quote } from "shell-quote";
import type { ApplicationNested } from "../builders";
export const buildRemoteDocker = async (application: ApplicationNested) => {
@@ -9,7 +10,7 @@ export const buildRemoteDocker = async (application: ApplicationNested) => {
throw new Error("Docker image not found");
}
let command = `
-echo "Pulling ${dockerImage}";
+echo ${quote([`Pulling ${dockerImage}`])};
`;
if (username && password) {
@@ -22,7 +23,7 @@ fi
}
command += `
-docker pull ${dockerImage} 2>&1 || {
+docker pull ${quote([dockerImage])} 2>&1 || {
echo "❌ Pulling image failed";
exit 1;
}
diff --git a/packages/server/src/utils/providers/git.ts b/packages/server/src/utils/providers/git.ts
index 8e7c71839..5ccbd6412 100644
--- a/packages/server/src/utils/providers/git.ts
+++ b/packages/server/src/utils/providers/git.ts
@@ -4,6 +4,7 @@ import {
findSSHKeyById,
updateSSHKeyById,
} from "@dokploy/server/services/ssh-key";
+import { quote } from "shell-quote";
import { execAsync, execAsyncRemote } from "../process/execAsync";
interface CloneGitRepository {
@@ -61,7 +62,7 @@ export const cloneGitRepository = async ({
}
command += `rm -rf ${outputPath};`;
command += `mkdir -p ${outputPath};`;
- command += `echo "Cloning Repo Custom ${customGitUrl} to ${outputPath}: ✅";`;
+ command += `echo ${quote([`Cloning Repo Custom ${customGitUrl} to ${outputPath}: ✅`])};`;
if (customGitSSHKeyId) {
await updateSSHKeyById({
@@ -78,8 +79,8 @@ export const cloneGitRepository = async ({
command += "chmod 600 /tmp/id_rsa;";
command += `export GIT_SSH_COMMAND="${gitSshCommand}";`;
}
- command += `if ! git clone --branch ${customGitBranch} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} --progress ${customGitUrl} ${outputPath}; then
- echo "❌ [ERROR] Fail to clone the repository ${customGitUrl}";
+ command += `if ! git clone --branch ${quote([String(customGitBranch ?? "")])} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} --progress ${quote([String(customGitUrl ?? "")])} ${quote([String(outputPath ?? "")])}; then
+ echo ${quote([`❌ [ERROR] Fail to clone the repository ${customGitUrl}`])};
exit 1;
fi
`;
@@ -114,7 +115,7 @@ const addHostToKnownHostsCommand = (repositoryURL: string) => {
// ssh-keyscan is best-effort: some Git hosts (e.g. Hugging Face) never answer
// it, and its exit code must not abort the clone under `set -e`. The clone's
// own host-key check (StrictHostKeyChecking=accept-new) is the real boundary.
- return `ssh-keyscan -p ${port} ${domain} >> ${knownHostsPath} || true;`;
+ return `ssh-keyscan -p ${Number(port)} ${quote([String(domain ?? "")])} >> ${knownHostsPath} || true;`;
};
const sanitizeRepoPathSSH = (input: string) => {
const SSH_PATH_RE = new RegExp(
diff --git a/packages/server/src/utils/providers/gitea.ts b/packages/server/src/utils/providers/gitea.ts
index 20c86a589..1c6ae3a83 100644
--- a/packages/server/src/utils/providers/gitea.ts
+++ b/packages/server/src/utils/providers/gitea.ts
@@ -7,6 +7,7 @@ import {
} from "@dokploy/server/services/gitea";
import type { InferResultType } from "@dokploy/server/types/with";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
export const getErrorCloneRequirements = (entity: {
giteaRepository?: string | null;
@@ -176,8 +177,8 @@ export const cloneGiteaRepository = async ({
giteaRepository!,
);
- command += `echo "Cloning Repo ${repoClone} to ${outputPath}: ✅";`;
- command += `git clone --branch ${giteaBranch} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${cloneUrl} ${outputPath} --progress;`;
+ command += `echo ${quote([`Cloning Repo ${repoClone} to ${outputPath}: ✅`])};`;
+ command += `git clone --branch ${quote([String(giteaBranch ?? "")])} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${quote([String(cloneUrl ?? "")])} ${quote([String(outputPath ?? "")])} --progress;`;
return command;
};
diff --git a/packages/server/src/utils/providers/github.ts b/packages/server/src/utils/providers/github.ts
index 6309cf307..d4becec0e 100644
--- a/packages/server/src/utils/providers/github.ts
+++ b/packages/server/src/utils/providers/github.ts
@@ -6,8 +6,71 @@ import type { InferResultType } from "@dokploy/server/types/with";
import { createAppAuth } from "@octokit/auth-app";
import { TRPCError } from "@trpc/server";
import { Octokit } from "octokit";
+import { quote } from "shell-quote";
import type { z } from "zod";
+export const DEFAULT_GITHUB_URL = "https://github.com";
+export const DEFAULT_GITHUB_API_URL = "https://api.github.com";
+
+export const parseGithubBaseUrl = (
+ githubUrl?: string | null,
+): { url: string } | { error: string } => {
+ const raw = githubUrl?.trim();
+ if (!raw) {
+ return { url: DEFAULT_GITHUB_URL };
+ }
+
+ const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(raw)
+ ? raw
+ : `https://${raw}`;
+
+ let parsed: URL;
+ try {
+ parsed = new URL(withScheme);
+ } catch {
+ return { error: `"${raw}" is not a valid URL` };
+ }
+
+ if (parsed.protocol !== "https:") {
+ return { error: "Only https is supported for GitHub instances" };
+ }
+
+ // "acme.ghe.com." resolves the same as "acme.ghe.com", but the trailing dot
+ // would slip past the checks below.
+ if (parsed.hostname.endsWith(".")) {
+ parsed.hostname = parsed.hostname.replace(/\.+$/, "");
+ }
+
+ const { hostname } = parsed;
+
+ if (!hostname.includes(".")) {
+ return { error: `"${hostname}" is not a fully qualified hostname` };
+ }
+
+ return { url: `${parsed.protocol}//${parsed.host}` };
+};
+
+export const normalizeGithubUrl = (githubUrl?: string | null): string => {
+ const result = parseGithubBaseUrl(githubUrl);
+ return "url" in result ? result.url : DEFAULT_GITHUB_URL;
+};
+
+export const deriveGithubApiUrl = (githubUrl?: string | null): string => {
+ const normalized = normalizeGithubUrl(githubUrl);
+ const { protocol, host } = new URL(normalized);
+
+ if (host === "github.com" || host === "www.github.com") {
+ return DEFAULT_GITHUB_API_URL;
+ }
+
+ // Data residency tenants keep the api. prefix; GHES does not have one.
+ if (host === "ghe.com" || host.endsWith(".ghe.com")) {
+ return `${protocol}//api.${host}`;
+ }
+
+ return `${protocol}//${host}/api/v3`;
+};
+
export const authGithub = (githubProvider: Github): Octokit => {
if (!haveGithubRequirements(githubProvider)) {
throw new TRPCError({
@@ -23,6 +86,7 @@ export const authGithub = (githubProvider: Github): Octokit => {
privateKey: githubProvider?.githubPrivateKey || "",
installationId: githubProvider?.githubInstallationId,
},
+ baseUrl: deriveGithubApiUrl(githubProvider?.githubUrl),
});
return octokit;
@@ -161,13 +225,14 @@ export const cloneGithubRepository = async ({
const outputPath = outputPathOverride ?? join(basePath, appName, "code");
const octokit = authGithub(githubProvider);
const token = await getGithubToken(octokit);
- const repoclone = `github.com/${owner}/${repository}.git`;
+ const cloneBase = new URL(normalizeGithubUrl(githubProvider.githubUrl));
+ const repoclone = `${cloneBase.host}/${owner}/${repository}.git`;
command += `rm -rf ${outputPath};`;
command += `mkdir -p ${outputPath};`;
- const cloneUrl = `https://oauth2:${token}@${repoclone}`;
+ const cloneUrl = `${cloneBase.protocol}//oauth2:${token}@${repoclone}`;
- command += `echo "Cloning Repo ${repoclone} to ${outputPath}: ✅";`;
- command += `git clone --branch ${branch} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${cloneUrl} ${outputPath} --progress;`;
+ command += `echo ${quote([`Cloning Repo ${repoclone} to ${outputPath}: ✅`])};`;
+ command += `git clone --branch ${quote([String(branch ?? "")])} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${quote([String(cloneUrl ?? "")])} ${quote([String(outputPath ?? "")])} --progress;`;
return command;
};
@@ -186,6 +251,7 @@ export const getGithubRepositories = async (githubId?: string) => {
privateKey: githubProvider.githubPrivateKey,
installationId: githubProvider.githubInstallationId,
},
+ baseUrl: deriveGithubApiUrl(githubProvider.githubUrl),
});
const repositories = (await octokit.paginate(
@@ -212,6 +278,7 @@ export const getGithubBranches = async (
privateKey: githubProvider.githubPrivateKey,
installationId: githubProvider.githubInstallationId,
},
+ baseUrl: deriveGithubApiUrl(githubProvider.githubUrl),
});
const branches = (await octokit.paginate(octokit.rest.repos.listBranches, {
diff --git a/packages/server/src/utils/providers/gitlab.ts b/packages/server/src/utils/providers/gitlab.ts
index 02121d346..3907130ee 100644
--- a/packages/server/src/utils/providers/gitlab.ts
+++ b/packages/server/src/utils/providers/gitlab.ts
@@ -8,6 +8,7 @@ import {
} from "@dokploy/server/services/gitlab";
import type { InferResultType } from "@dokploy/server/types/with";
import { TRPCError } from "@trpc/server";
+import { quote } from "shell-quote";
import type { z } from "zod";
export const refreshGitlabToken = async (gitlabProviderId: string) => {
@@ -151,8 +152,8 @@ export const cloneGitlabRepository = async ({
command += `mkdir -p ${outputPath};`;
const repoClone = getGitlabRepoClone(gitlab, gitlabPathNamespace);
const cloneUrl = getGitlabCloneUrl(gitlab, repoClone);
- command += `echo "Cloning Repo ${repoClone} to ${outputPath}: ✅";`;
- command += `git clone --branch ${gitlabBranch} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${cloneUrl} ${outputPath} --progress;`;
+ command += `echo ${quote([`Cloning Repo ${repoClone} to ${outputPath}: ✅`])};`;
+ command += `git clone --branch ${quote([String(gitlabBranch ?? "")])} --depth 1 ${enableSubmodules ? "--recurse-submodules" : ""} ${quote([String(cloneUrl ?? "")])} ${quote([String(outputPath ?? "")])} --progress;`;
return command;
};
diff --git a/packages/server/src/utils/restore/compose.ts b/packages/server/src/utils/restore/compose.ts
index 946c94a38..07f23c772 100644
--- a/packages/server/src/utils/restore/compose.ts
+++ b/packages/server/src/utils/restore/compose.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Compose } from "@dokploy/server/services/compose";
import type { Destination } from "@dokploy/server/services/destination";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -26,10 +27,10 @@ export const restoreComposeBackup = async (
const rcloneFlags = getS3Credentials(destination);
const bucketPath = `:s3:${destination.bucket}`;
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- let rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} "${backupPath}" | gunzip`;
+ let rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} ${quote([backupPath])} | gunzip`;
if (backupInput.metadata?.mongo) {
- rcloneCommand = `rclone copy ${rcloneFlags.join(" ")} "${backupPath}"`;
+ rcloneCommand = `rclone copy ${rcloneFlags.join(" ")} ${quote([backupPath])}`;
}
let credentials: DatabaseCredentials = {};
diff --git a/packages/server/src/utils/restore/libsql.ts b/packages/server/src/utils/restore/libsql.ts
index f50f0c6da..9d7c7f15c 100644
--- a/packages/server/src/utils/restore/libsql.ts
+++ b/packages/server/src/utils/restore/libsql.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Destination } from "@dokploy/server/services/destination";
import type { Libsql } from "@dokploy/server/services/libsql";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials, getServiceContainerCommand } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -19,7 +20,7 @@ export const restoreLibsqlBackup = async (
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} "${backupPath}"`;
+ const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} ${quote([backupPath])}`;
const containerSearch = getServiceContainerCommand(appName);
const restoreCommand = `docker exec -i $CONTAINER_ID sh -c "tar xzf - -C /var/lib/sqld"`;
diff --git a/packages/server/src/utils/restore/mariadb.ts b/packages/server/src/utils/restore/mariadb.ts
index afa167280..e4b301f46 100644
--- a/packages/server/src/utils/restore/mariadb.ts
+++ b/packages/server/src/utils/restore/mariadb.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Destination } from "@dokploy/server/services/destination";
import type { Mariadb } from "@dokploy/server/services/mariadb";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -19,7 +20,7 @@ export const restoreMariadbBackup = async (
const bucketPath = `:s3:${destination.bucket}`;
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} "${backupPath}" | gunzip`;
+ const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} ${quote([backupPath])} | gunzip`;
const command = getRestoreCommand({
appName,
diff --git a/packages/server/src/utils/restore/mongo.ts b/packages/server/src/utils/restore/mongo.ts
index 91eb9af5a..163340ca8 100644
--- a/packages/server/src/utils/restore/mongo.ts
+++ b/packages/server/src/utils/restore/mongo.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Destination } from "@dokploy/server/services/destination";
import type { Mongo } from "@dokploy/server/services/mongo";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -18,7 +19,7 @@ export const restoreMongoBackup = async (
const rcloneFlags = getS3Credentials(destination);
const bucketPath = `:s3:${destination.bucket}`;
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- const rcloneCommand = `rclone copy ${rcloneFlags.join(" ")} "${backupPath}"`;
+ const rcloneCommand = `rclone copy ${rcloneFlags.join(" ")} ${quote([backupPath])}`;
const command = getRestoreCommand({
appName,
diff --git a/packages/server/src/utils/restore/mysql.ts b/packages/server/src/utils/restore/mysql.ts
index c955ef960..d237da895 100644
--- a/packages/server/src/utils/restore/mysql.ts
+++ b/packages/server/src/utils/restore/mysql.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Destination } from "@dokploy/server/services/destination";
import type { MySql } from "@dokploy/server/services/mysql";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -19,7 +20,7 @@ export const restoreMySqlBackup = async (
const bucketPath = `:s3:${destination.bucket}`;
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} "${backupPath}" | gunzip`;
+ const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} ${quote([backupPath])} | gunzip`;
const command = getRestoreCommand({
appName,
diff --git a/packages/server/src/utils/restore/postgres.ts b/packages/server/src/utils/restore/postgres.ts
index 8cbbe2175..05dcf38a3 100644
--- a/packages/server/src/utils/restore/postgres.ts
+++ b/packages/server/src/utils/restore/postgres.ts
@@ -1,6 +1,7 @@
import type { apiRestoreBackup } from "@dokploy/server/db/schema";
import type { Destination } from "@dokploy/server/services/destination";
import type { Postgres } from "@dokploy/server/services/postgres";
+import { quote } from "shell-quote";
import type { z } from "zod";
import { getS3Credentials } from "../backups/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -20,7 +21,7 @@ export const restorePostgresBackup = async (
const backupPath = `${bucketPath}/${backupInput.backupFile}`;
- const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} "${backupPath}" | gunzip`;
+ const rcloneCommand = `rclone cat ${rcloneFlags.join(" ")} ${quote([backupPath])} | gunzip`;
const command = getRestoreCommand({
appName,
diff --git a/packages/server/src/utils/restore/utils.ts b/packages/server/src/utils/restore/utils.ts
index 7300ca479..dd2934430 100644
--- a/packages/server/src/utils/restore/utils.ts
+++ b/packages/server/src/utils/restore/utils.ts
@@ -1,13 +1,17 @@
+import { quote } from "shell-quote";
import {
getComposeContainerCommand,
getServiceContainerCommand,
} from "../backups/utils";
+// User-controlled values are passed to the container via `docker exec -e` and
+// read as "$VAR" inside a single-quoted inner script, so they never enter the
+// inner command text. See the matching note in backups/utils.ts.
export const getPostgresRestoreCommand = (
database: string,
databaseUser: string,
) => {
- return `docker exec -i $CONTAINER_ID sh -c "pg_restore -U '${databaseUser}' -d ${database} -O --clean --if-exists"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -i $CONTAINER_ID sh -c 'pg_restore -U "$DB_USER" -d "$DB_NAME" -O --clean --if-exists'`;
};
export const getMariadbRestoreCommand = (
@@ -15,14 +19,14 @@ export const getMariadbRestoreCommand = (
databaseUser: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID sh -c "mariadb -u '${databaseUser}' -p'${databasePassword}' ${database}"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID sh -c 'mariadb -u "$DB_USER" -p"$DB_PASS" "$DB_NAME"'`;
};
export const getMysqlRestoreCommand = (
database: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID sh -c "mysql -u root -p'${databasePassword}' ${database}"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID sh -c 'mysql -u root -p"$DB_PASS" "$DB_NAME"'`;
};
export const getMongoRestoreCommand = (
@@ -30,7 +34,7 @@ export const getMongoRestoreCommand = (
databaseUser: string,
databasePassword: string,
) => {
- return `docker exec -i $CONTAINER_ID sh -c "mongorestore --username '${databaseUser}' --password '${databasePassword}' --authenticationDatabase admin --db ${database} --archive --drop"`;
+ return `docker exec -e DB_NAME=${quote([database])} -e DB_USER=${quote([databaseUser])} -e DB_PASS=${quote([databasePassword])} -i $CONTAINER_ID sh -c 'mongorestore --username "$DB_USER" --password "$DB_PASS" --authenticationDatabase admin --db "$DB_NAME" --archive --drop'`;
};
export const getComposeSearchCommand = (
@@ -88,8 +92,8 @@ rm -rf ${tempDir} && \
mkdir -p ${tempDir} && \
${rcloneCommand} ${tempDir} && \
cd ${tempDir} && \
-gunzip -f "${fileName}" && \
-${restoreCommand} < "${decompressedName}" && \
+gunzip -f ${quote([fileName])} && \
+${restoreCommand} < ${quote([decompressedName])} && \
rm -rf ${tempDir}
`;
};
diff --git a/packages/server/src/utils/restore/web-server.ts b/packages/server/src/utils/restore/web-server.ts
index 683a1898a..afcd81cf6 100644
--- a/packages/server/src/utils/restore/web-server.ts
+++ b/packages/server/src/utils/restore/web-server.ts
@@ -3,6 +3,7 @@ import { tmpdir } from "node:os";
import { join } from "node:path";
import { IS_CLOUD, paths } from "@dokploy/server/constants";
import type { Destination } from "@dokploy/server/services/destination";
+import { quote } from "shell-quote";
import { getS3Credentials } from "../backups/utils";
import { execAsync } from "../process/execAsync";
@@ -35,7 +36,7 @@ export const restoreWebServerBackup = async (
// Download backup from S3
emit("Downloading backup from S3...");
await execAsync(
- `rclone copyto ${rcloneFlags.join(" ")} "${backupPath}" "${tempDir}/${backupFile}"`,
+ `rclone copyto ${rcloneFlags.join(" ")} ${quote([backupPath])} ${quote([`${tempDir}/${backupFile}`])}`,
);
// List files before extraction
@@ -45,7 +46,9 @@ export const restoreWebServerBackup = async (
// Extract backup
emit("Extracting backup...");
- await execAsync(`cd ${tempDir} && unzip ${backupFile} > /dev/null 2>&1`);
+ await execAsync(
+ `cd ${quote([tempDir])} && unzip ${quote([backupFile])} > /dev/null 2>&1`,
+ );
// Restore filesystem first
emit("Restoring filesystem...");
diff --git a/packages/server/src/utils/schedules/index.ts b/packages/server/src/utils/schedules/index.ts
index dfcff1fbb..eb600790d 100644
--- a/packages/server/src/utils/schedules/index.ts
+++ b/packages/server/src/utils/schedules/index.ts
@@ -9,8 +9,12 @@ export const initSchedules = async () => {
where: eq(schedules.enabled, true),
with: {
server: true,
- application: true,
- compose: true,
+ application: {
+ columns: { applicationId: true, appName: true, serverId: true },
+ },
+ compose: {
+ columns: { composeId: true, appName: true, serverId: true },
+ },
organization: true,
},
});
diff --git a/packages/server/src/utils/schedules/utils.ts b/packages/server/src/utils/schedules/utils.ts
index 64657c9a6..65d01afed 100644
--- a/packages/server/src/utils/schedules/utils.ts
+++ b/packages/server/src/utils/schedules/utils.ts
@@ -9,6 +9,7 @@ import {
} from "@dokploy/server/services/deployment";
import { findScheduleById } from "@dokploy/server/services/schedule";
import { scheduledJobs, scheduleJob as scheduleJobNode } from "node-schedule";
+import { quote } from "shell-quote";
import { getComposeContainer, getServiceContainer } from "../docker/utils";
import { execAsyncRemote } from "../process/execAsync";
import { spawnAsync } from "../process/spawnAsync";
@@ -54,78 +55,97 @@ export const runCommand = async (scheduleId: string) => {
description: "Schedule",
});
- if (scheduleType === "application" || scheduleType === "compose") {
- let containerId = "";
- let serverId = "";
- if (scheduleType === "application" && application) {
- const container = await getServiceContainer(
- application.appName,
- application.serverId,
- );
- containerId = container?.Id || "";
- serverId = application.serverId || "";
- }
- if (scheduleType === "compose" && compose) {
- const container = await getComposeContainer(compose, serviceName || "");
- containerId = container?.Id || "";
- serverId = compose.serverId || "";
- }
+ try {
+ if (scheduleType === "application" || scheduleType === "compose") {
+ let containerId = "";
+ let serverId = "";
+ if (scheduleType === "application" && application) {
+ const container = await getServiceContainer(
+ application.appName,
+ application.serverId,
+ );
+ containerId = container?.Id || "";
+ serverId = application.serverId || "";
+ }
+ if (scheduleType === "compose" && compose) {
+ const container = await getComposeContainer(compose, serviceName || "");
+ containerId = container?.Id || "";
+ serverId = compose.serverId || "";
+ }
- if (serverId) {
- try {
+ if (!containerId) {
+ const target =
+ scheduleType === "compose"
+ ? `service '${serviceName}' of compose '${compose?.name}'`
+ : `application '${application?.appName}'`;
+ const message = `Container not found for ${target}, make sure the service is running`;
+ if (serverId) {
+ await execAsyncRemote(
+ serverId,
+ `echo ${quote([`❌ ${message}`])} >> ${quote([deployment.logPath])}`,
+ );
+ } else {
+ const writeStream = createWriteStream(deployment.logPath, {
+ flags: "a",
+ });
+ writeStream.write(`❌ ${message}\n`);
+ writeStream.end();
+ }
+ throw new Error(message);
+ }
+
+ if (serverId) {
await execAsyncRemote(
serverId,
`
set -e
- echo "Running command: docker exec ${containerId} ${shellType} -c '${command}'" >> ${deployment.logPath};
- docker exec ${containerId} ${shellType} -c '${command}' >> ${deployment.logPath} 2>> ${deployment.logPath} || {
- echo "❌ Command failed" >> ${deployment.logPath};
+ echo "Running scheduled command" >> ${quote([deployment.logPath])};
+ docker exec ${quote([containerId])} ${quote([shellType])} -c ${quote([command])} >> ${quote([deployment.logPath])} 2>> ${quote([deployment.logPath])} || {
+ echo "❌ Command failed" >> ${quote([deployment.logPath])};
exit 1;
}
- echo "✅ Command executed successfully" >> ${deployment.logPath};
+ echo "✅ Command executed successfully" >> ${quote([deployment.logPath])};
`,
);
- } catch (error) {
- await updateDeploymentStatus(deployment.deploymentId, "error");
- throw error;
- }
- } else {
- const writeStream = createWriteStream(deployment.logPath, { flags: "a" });
+ } else {
+ const writeStream = createWriteStream(deployment.logPath, {
+ flags: "a",
+ });
- try {
- if (IS_CLOUD) {
+ try {
+ if (IS_CLOUD) {
+ writeStream.write(
+ "This feature is not available in the cloud version.",
+ );
+ writeStream.end();
+ await updateDeploymentStatus(deployment.deploymentId, "error");
+ return { ...deployment, status: "error" as const };
+ }
writeStream.write(
- "This feature is not available in the cloud version.",
+ `docker exec ${containerId} ${shellType} -c ${command}\n`,
+ );
+ await spawnAsync(
+ "docker",
+ ["exec", containerId, shellType, "-c", command],
+ (data) => {
+ if (writeStream.writable) {
+ writeStream.write(data);
+ }
+ },
+ );
+
+ writeStream.write("✅ Command executed successfully\n");
+ writeStream.end();
+ } catch (error) {
+ writeStream.write("❌ Command failed\n");
+ writeStream.write(
+ error instanceof Error ? error.message : "Unknown error",
);
writeStream.end();
- return;
+ throw error;
}
- writeStream.write(
- `docker exec ${containerId} ${shellType} -c ${command}\n`,
- );
- await spawnAsync(
- "docker",
- ["exec", containerId, shellType, "-c", command],
- (data) => {
- if (writeStream.writable) {
- writeStream.write(data);
- }
- },
- );
-
- writeStream.write("✅ Command executed successfully\n");
- } catch (error) {
- writeStream.write("❌ Command failed\n");
- writeStream.write(
- error instanceof Error ? error.message : "Unknown error",
- );
- writeStream.end();
- await updateDeploymentStatus(deployment.deploymentId, "error");
- throw error;
}
- }
- } else if (scheduleType === "dokploy-server") {
- try {
+ } else if (scheduleType === "dokploy-server") {
const writeStream = createWriteStream(deployment.logPath, { flags: "a" });
const { SCHEDULES_PATH } = paths();
const fullPath = path.join(SCHEDULES_PATH, appName || "");
@@ -150,18 +170,13 @@ export const runCommand = async (scheduleId: string) => {
cwd: fullPath,
},
);
- } catch (error) {
- await updateDeploymentStatus(deployment.deploymentId, "error");
- throw error;
- }
- } else if (scheduleType === "server") {
- try {
+ } else if (scheduleType === "server") {
const { SCHEDULES_PATH } = paths(true);
const fullPath = path.join(SCHEDULES_PATH, appName || "");
const command = `
- set -e
+ set -euo pipefail
echo "Running script" >> ${deployment.logPath};
- bash -c ${fullPath}/script.sh 2>&1 | tee -a ${deployment.logPath} || {
+ bash -c ${fullPath}/script.sh 2>&1 | tee -a ${deployment.logPath} || {
echo "❌ Command failed" >> ${deployment.logPath};
exit 1;
}
@@ -176,10 +191,11 @@ export const runCommand = async (scheduleId: string) => {
});
}
});
- } catch (error) {
- await updateDeploymentStatus(deployment.deploymentId, "error");
- throw error;
}
+ await updateDeploymentStatus(deployment.deploymentId, "done");
+ return { ...deployment, status: "done" as const };
+ } catch {
+ await updateDeploymentStatus(deployment.deploymentId, "error");
+ return { ...deployment, status: "error" as const };
}
- await updateDeploymentStatus(deployment.deploymentId, "done");
};
diff --git a/packages/server/src/utils/traefik/application.ts b/packages/server/src/utils/traefik/application.ts
index 101574ed5..3da847f59 100644
--- a/packages/server/src/utils/traefik/application.ts
+++ b/packages/server/src/utils/traefik/application.ts
@@ -3,6 +3,7 @@ import path from "node:path";
import { createInterface } from "node:readline";
import { paths } from "@dokploy/server/constants";
import type { Domain } from "@dokploy/server/services/domain";
+import { quote } from "shell-quote";
import { parse, stringify } from "yaml";
import { encodeBase64 } from "../docker/utils";
import { execAsync, execAsyncRemote } from "../process/execAsync";
@@ -57,7 +58,7 @@ export const removeTraefikConfig = async (
try {
const { DYNAMIC_TRAEFIK_PATH } = paths(!!serverId);
const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`);
- const command = `rm -f ${configPath}`;
+ const command = `rm -f ${quote([configPath])}`;
if (serverId) {
await execAsyncRemote(serverId, command);
@@ -76,7 +77,7 @@ export const removeTraefikConfigRemote = async (
try {
const { DYNAMIC_TRAEFIK_PATH } = paths(true);
const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`);
- await execAsyncRemote(serverId, `rm -f ${configPath}`);
+ await execAsyncRemote(serverId, `rm -f ${quote([configPath])}`);
} catch (error) {
console.error(
`Error removing remote traefik config for ${appName}:`,
@@ -106,7 +107,10 @@ export const loadOrCreateConfigRemote = async (
const fileConfig: FileConfig = { http: { routers: {}, services: {} } };
const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`);
try {
- const { stdout } = await execAsyncRemote(serverId, `cat ${configPath}`);
+ const { stdout } = await execAsyncRemote(
+ serverId,
+ `cat ${quote([configPath])}`,
+ );
if (!stdout) return fileConfig;
@@ -133,7 +137,10 @@ export const readRemoteConfig = async (serverId: string, appName: string) => {
const { DYNAMIC_TRAEFIK_PATH } = paths(true);
const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`);
try {
- const { stdout } = await execAsyncRemote(serverId, `cat ${configPath}`);
+ const { stdout } = await execAsyncRemote(
+ serverId,
+ `cat ${quote([configPath])}`,
+ );
if (!stdout) return null;
return stdout;
} catch {
@@ -189,7 +196,10 @@ export const readConfigInPath = async (pathFile: string, serverId?: string) => {
const configPath = path.join(pathFile);
if (serverId) {
- const { stdout } = await execAsyncRemote(serverId, `cat ${configPath}`);
+ const { stdout } = await execAsyncRemote(
+ serverId,
+ `cat ${quote([configPath])}`,
+ );
if (!stdout) return null;
return stdout;
}
@@ -221,7 +231,7 @@ export const writeConfigRemote = async (
const encoded = encodeBase64(traefikConfig);
await execAsyncRemote(
serverId,
- `echo "${encoded}" | base64 -d > "${configPath}"`,
+ `echo "${encoded}" | base64 -d > ${quote([configPath])}`,
);
} catch (e) {
console.error("Error saving the YAML config file:", e);
@@ -239,7 +249,7 @@ export const writeTraefikConfigInPath = async (
const encoded = encodeBase64(traefikConfig);
await execAsyncRemote(
serverId,
- `echo "${encoded}" | base64 -d > "${configPath}"`,
+ `echo "${encoded}" | base64 -d > ${quote([configPath])}`,
);
} else {
fs.writeFileSync(configPath, traefikConfig, "utf8");
@@ -272,7 +282,11 @@ export const writeTraefikConfigRemote = async (
const { DYNAMIC_TRAEFIK_PATH } = paths(true);
const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`);
const yamlStr = stringify(traefikConfig);
- await execAsyncRemote(serverId, `echo '${yamlStr}' > ${configPath}`);
+ const encoded = encodeBase64(yamlStr);
+ await execAsyncRemote(
+ serverId,
+ `echo "${encoded}" | base64 -d > ${quote([configPath])}`,
+ );
} catch (e) {
console.error("Error saving the YAML config file:", e);
}
diff --git a/packages/server/src/utils/vault/aws.ts b/packages/server/src/utils/vault/aws.ts
new file mode 100644
index 000000000..c287cbda5
--- /dev/null
+++ b/packages/server/src/utils/vault/aws.ts
@@ -0,0 +1,107 @@
+import {
+ GetSecretValueCommand,
+ ListSecretsCommand,
+ SecretsManagerClient,
+} from "@aws-sdk/client-secrets-manager";
+import type { awsVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import type { VaultClient } from "./types";
+
+type AwsConfig = z.infer;
+
+const parseRef = (ref: string) => {
+ if (ref.startsWith("arn:")) {
+ throw new Error(
+ `Invalid AWS Secrets Manager reference "${ref}": use the secret name, not the ARN`,
+ );
+ }
+ const separatorIndex = ref.lastIndexOf(":");
+ if (separatorIndex === -1) {
+ return { secretId: ref, field: null };
+ }
+ return {
+ secretId: ref.slice(0, separatorIndex),
+ field: ref.slice(separatorIndex + 1),
+ };
+};
+
+const createClient = (config: AwsConfig) =>
+ new SecretsManagerClient({
+ region: config.region,
+ credentials: {
+ accessKeyId: config.accessKeyId,
+ secretAccessKey: config.secretAccessKey,
+ },
+ ...(config.endpoint && { endpoint: config.endpoint }),
+ });
+
+export const awsClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const client = createClient(config);
+ const secretIds = [...new Set(refs.map((ref) => parseRef(ref).secretId))];
+
+ const secretStrings = new Map();
+ await Promise.all(
+ secretIds.map(async (secretId) => {
+ const response = await client.send(
+ new GetSecretValueCommand({ SecretId: secretId }),
+ );
+ if (response.SecretString === undefined) {
+ throw new Error(
+ `AWS Secrets Manager: secret "${secretId}" has no string value (binary secrets are not supported)`,
+ );
+ }
+ secretStrings.set(secretId, response.SecretString);
+ }),
+ );
+
+ const result: Record = {};
+ for (const ref of refs) {
+ const { secretId, field } = parseRef(ref);
+ const secretString = secretStrings.get(secretId) as string;
+ if (field === null) {
+ result[ref] = secretString;
+ continue;
+ }
+ let parsed: Record;
+ try {
+ parsed = JSON.parse(secretString);
+ } catch {
+ throw new Error(
+ `AWS Secrets Manager: secret "${secretId}" is not JSON, cannot extract field "${field}"`,
+ );
+ }
+ const value = parsed[field];
+ if (value === undefined || value === null) {
+ throw new Error(
+ `AWS Secrets Manager: field "${field}" not found in secret "${secretId}"`,
+ );
+ }
+ result[ref] = typeof value === "string" ? value : JSON.stringify(value);
+ }
+ return result;
+ },
+
+ async testConnection(config) {
+ const client = createClient(config);
+ await client.send(new ListSecretsCommand({ MaxResults: 1 }));
+ },
+
+ async listSecretNames(config) {
+ const client = createClient(config);
+ const names: string[] = [];
+ let nextToken: string | undefined;
+ do {
+ const response = await client.send(
+ new ListSecretsCommand({ MaxResults: 100, NextToken: nextToken }),
+ );
+ for (const secret of response.SecretList ?? []) {
+ if (secret.Name) {
+ names.push(secret.Name);
+ }
+ }
+ nextToken = response.NextToken;
+ } while (nextToken && names.length < 500);
+ return names;
+ },
+};
diff --git a/packages/server/src/utils/vault/azure.ts b/packages/server/src/utils/vault/azure.ts
new file mode 100644
index 000000000..9cffbe93d
--- /dev/null
+++ b/packages/server/src/utils/vault/azure.ts
@@ -0,0 +1,119 @@
+import type { azureVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type VaultClient, vaultFetch } from "./types";
+
+type AzureConfig = z.infer;
+
+const API_VERSION = "7.4";
+
+const baseUrl = (config: AzureConfig) => config.vaultUri.replace(/\/+$/, "");
+
+const getAccessToken = async (config: AzureConfig) => {
+ const body = new URLSearchParams({
+ grant_type: "client_credentials",
+ client_id: config.clientId,
+ client_secret: config.clientSecret,
+ scope: "https://vault.azure.net/.default",
+ });
+ const response = await vaultFetch(
+ `https://login.microsoftonline.com/${encodeURIComponent(config.tenantId)}/oauth2/v2.0/token`,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ body: body.toString(),
+ },
+ );
+
+ if (!response.ok) {
+ let detail = "";
+ try {
+ const body = (await response.json()) as { error_description?: string };
+ detail = (body.error_description ?? "").split("\n")[0] ?? "";
+ } catch {}
+ throw new Error(
+ `Azure Key Vault: authentication failed (status ${response.status}${detail ? `: ${detail}` : ""})`,
+ );
+ }
+
+ const data = (await response.json()) as { access_token?: string };
+ if (!data.access_token) {
+ throw new Error("Azure Key Vault: no access token returned");
+ }
+ return data.access_token;
+};
+
+const readSecret = async (config: AzureConfig, token: string, name: string) => {
+ const response = await vaultFetch(
+ `${baseUrl(config)}/secrets/${encodeURIComponent(name)}?api-version=${API_VERSION}`,
+ { headers: { Authorization: `Bearer ${token}` } },
+ );
+
+ if (response.status === 404) {
+ throw new Error(`Azure Key Vault: secret "${name}" not found`);
+ }
+ if (!response.ok) {
+ throw new Error(
+ `Azure Key Vault: failed to read secret "${name}" (status ${response.status})`,
+ );
+ }
+
+ const data = (await response.json()) as { value?: string };
+ if (data.value === undefined) {
+ throw new Error(`Azure Key Vault: secret "${name}" has no value`);
+ }
+ return data.value;
+};
+
+export const azureClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const token = await getAccessToken(config);
+ const result: Record = {};
+ await Promise.all(
+ refs.map(async (ref) => {
+ result[ref] = await readSecret(config, token, ref);
+ }),
+ );
+ return result;
+ },
+
+ async testConnection(config) {
+ const token = await getAccessToken(config);
+ const response = await vaultFetch(
+ `${baseUrl(config)}/secrets?api-version=${API_VERSION}&maxresults=1`,
+ { headers: { Authorization: `Bearer ${token}` } },
+ );
+ if (!response.ok) {
+ throw new Error(
+ `Azure Key Vault: cannot list secrets (status ${response.status})`,
+ );
+ }
+ },
+
+ async listSecretNames(config) {
+ const token = await getAccessToken(config);
+ const names: string[] = [];
+ let url: string | null =
+ `${baseUrl(config)}/secrets?api-version=${API_VERSION}&maxresults=25`;
+
+ while (url && names.length < 200) {
+ const response = await vaultFetch(url, {
+ headers: { Authorization: `Bearer ${token}` },
+ });
+ if (!response.ok) {
+ break;
+ }
+ const data = (await response.json()) as {
+ value?: { id: string }[];
+ nextLink?: string | null;
+ };
+ for (const item of data.value ?? []) {
+ const name = item.id.split("/").pop();
+ if (name) {
+ names.push(name);
+ }
+ }
+ url = data.nextLink ?? null;
+ }
+ return names.slice(0, 200);
+ },
+};
diff --git a/packages/server/src/utils/vault/doppler.ts b/packages/server/src/utils/vault/doppler.ts
new file mode 100644
index 000000000..439efebae
--- /dev/null
+++ b/packages/server/src/utils/vault/doppler.ts
@@ -0,0 +1,61 @@
+import type { dopplerVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type VaultClient, vaultFetch } from "./types";
+
+type DopplerConfig = z.infer;
+
+const downloadUrl = (config: DopplerConfig) => {
+ const params = new URLSearchParams({ format: "json" });
+ if (config.project) {
+ params.set("project", config.project);
+ }
+ if (config.config) {
+ params.set("config", config.config);
+ }
+ return `https://api.doppler.com/v3/configs/config/secrets/download?${params.toString()}`;
+};
+
+const downloadSecrets = async (config: DopplerConfig) => {
+ const response = await vaultFetch(downloadUrl(config), {
+ headers: {
+ Authorization: `Bearer ${config.serviceToken}`,
+ Accept: "application/json",
+ },
+ });
+
+ if (!response.ok) {
+ let detail = "";
+ try {
+ const body = (await response.json()) as { messages?: string[] };
+ detail = (body.messages ?? []).join(", ");
+ } catch {}
+ throw new Error(
+ `Doppler: failed to fetch secrets (status ${response.status}${detail ? `: ${detail}` : ""})`,
+ );
+ }
+
+ return (await response.json()) as Record;
+};
+
+export const dopplerClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const secrets = await downloadSecrets(config);
+ const result: Record = {};
+ for (const ref of refs) {
+ if (secrets[ref] === undefined) {
+ throw new Error(`Doppler: secret "${ref}" not found in this config`);
+ }
+ result[ref] = secrets[ref];
+ }
+ return result;
+ },
+
+ async testConnection(config) {
+ await downloadSecrets(config);
+ },
+
+ async listSecretNames(config) {
+ const secrets = await downloadSecrets(config);
+ return Object.keys(secrets);
+ },
+};
diff --git a/packages/server/src/utils/vault/hashicorp.ts b/packages/server/src/utils/vault/hashicorp.ts
new file mode 100644
index 000000000..77a3d6e65
--- /dev/null
+++ b/packages/server/src/utils/vault/hashicorp.ts
@@ -0,0 +1,140 @@
+import type { hashicorpVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type VaultClient, vaultFetch } from "./types";
+
+type HashicorpConfig = z.infer;
+
+const parseRef = (ref: string) => {
+ const separatorIndex = ref.lastIndexOf(":");
+ if (separatorIndex <= 0 || separatorIndex === ref.length - 1) {
+ throw new Error(
+ `Invalid HashiCorp Vault reference "${ref}": expected format : (e.g. myapp/prod:DB_PASSWORD)`,
+ );
+ }
+ return {
+ path: ref.slice(0, separatorIndex),
+ field: ref.slice(separatorIndex + 1),
+ };
+};
+
+const buildHeaders = (config: HashicorpConfig) => {
+ const headers: Record = {
+ "X-Vault-Token": config.token,
+ };
+ if (config.namespace) {
+ headers["X-Vault-Namespace"] = config.namespace;
+ }
+ return headers;
+};
+
+const baseUrl = (config: HashicorpConfig) => config.url.replace(/\/+$/, "");
+
+const encodePath = (path: string) =>
+ path.split("/").map(encodeURIComponent).join("/");
+
+const readSecret = async (config: HashicorpConfig, path: string) => {
+ const url = `${baseUrl(config)}/v1/${encodeURIComponent(config.mount)}/data/${encodePath(path)}`;
+ const response = await vaultFetch(url, { headers: buildHeaders(config) });
+
+ if (!response.ok) {
+ throw new Error(
+ `HashiCorp Vault: failed to read secret at "${path}" (status ${response.status})`,
+ );
+ }
+
+ const body = (await response.json()) as {
+ data?: { data?: Record };
+ };
+ return body.data?.data ?? {};
+};
+
+export const hashicorpClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const byPath = new Map();
+ for (const ref of refs) {
+ const { path } = parseRef(ref);
+ byPath.set(path, [...(byPath.get(path) ?? []), ref]);
+ }
+
+ const result: Record = {};
+ await Promise.all(
+ [...byPath.entries()].map(async ([path, pathRefs]) => {
+ const data = await readSecret(config, path);
+ for (const ref of pathRefs) {
+ const { field } = parseRef(ref);
+ const value = data[field];
+ if (value === undefined || value === null) {
+ throw new Error(
+ `HashiCorp Vault: field "${field}" not found in secret "${path}"`,
+ );
+ }
+ result[ref] =
+ typeof value === "string" ? value : JSON.stringify(value);
+ }
+ }),
+ );
+ return result;
+ },
+
+ async testConnection(config) {
+ const response = await vaultFetch(
+ `${baseUrl(config)}/v1/auth/token/lookup-self`,
+ { headers: buildHeaders(config) },
+ );
+ if (!response.ok) {
+ throw new Error(
+ `HashiCorp Vault: token validation failed (status ${response.status})`,
+ );
+ }
+ },
+
+ async listSecretNames(config) {
+ const MAX_DEPTH = 4;
+ const MAX_ENTRIES = 200;
+ const names: string[] = [];
+
+ const listKeys = async (path: string) => {
+ const cleanPath = path.replace(/\/+$/, "");
+ const suffix = cleanPath ? `/${encodePath(cleanPath)}` : "";
+ const response = await vaultFetch(
+ `${baseUrl(config)}/v1/${encodeURIComponent(config.mount)}/metadata${suffix}?list=true`,
+ { headers: buildHeaders(config) },
+ );
+ if (!response.ok) {
+ return [];
+ }
+ const body = (await response.json()) as { data?: { keys?: string[] } };
+ return body.data?.keys ?? [];
+ };
+
+ const walk = async (path: string, depth: number) => {
+ if (depth > MAX_DEPTH || names.length >= MAX_ENTRIES) {
+ return;
+ }
+ for (const key of await listKeys(path)) {
+ if (names.length >= MAX_ENTRIES) {
+ return;
+ }
+ const fullPath = `${path}${key}`;
+ if (key.endsWith("/")) {
+ await walk(fullPath, depth + 1);
+ continue;
+ }
+ const fields = await readSecret(config, fullPath).catch(
+ () => ({}) as Record,
+ );
+ const fieldNames = Object.keys(fields);
+ if (fieldNames.length === 0) {
+ names.push(fullPath);
+ continue;
+ }
+ for (const field of fieldNames) {
+ names.push(`${fullPath}:${field}`);
+ }
+ }
+ };
+
+ await walk("", 0);
+ return names.slice(0, MAX_ENTRIES);
+ },
+};
diff --git a/packages/server/src/utils/vault/index.ts b/packages/server/src/utils/vault/index.ts
new file mode 100644
index 000000000..b5908cb85
Binary files /dev/null and b/packages/server/src/utils/vault/index.ts differ
diff --git a/packages/server/src/utils/vault/infisical.ts b/packages/server/src/utils/vault/infisical.ts
new file mode 100644
index 000000000..a32852c05
--- /dev/null
+++ b/packages/server/src/utils/vault/infisical.ts
@@ -0,0 +1,87 @@
+import type { infisicalVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type VaultClient, vaultFetch } from "./types";
+
+type InfisicalConfig = z.infer;
+
+const baseUrl = (config: InfisicalConfig) => config.siteUrl.replace(/\/+$/, "");
+
+const login = async (config: InfisicalConfig) => {
+ const response = await vaultFetch(
+ `${baseUrl(config)}/api/v1/auth/universal-auth/login`,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ clientId: config.clientId,
+ clientSecret: config.clientSecret,
+ }),
+ },
+ );
+
+ if (!response.ok) {
+ throw new Error(
+ `Infisical: authentication failed (status ${response.status})`,
+ );
+ }
+
+ const body = (await response.json()) as { accessToken?: string };
+ if (!body.accessToken) {
+ throw new Error("Infisical: no access token returned");
+ }
+ return body.accessToken;
+};
+
+const fetchSecrets = async (config: InfisicalConfig) => {
+ const accessToken = await login(config);
+ const params = new URLSearchParams({
+ workspaceId: config.projectId,
+ environment: config.environmentSlug,
+ secretPath: config.secretPath,
+ });
+ const response = await vaultFetch(
+ `${baseUrl(config)}/api/v3/secrets/raw?${params.toString()}`,
+ { headers: { Authorization: `Bearer ${accessToken}` } },
+ );
+
+ if (!response.ok) {
+ throw new Error(
+ `Infisical: failed to fetch secrets (status ${response.status})`,
+ );
+ }
+
+ const body = (await response.json()) as {
+ secrets?: { secretKey: string; secretValue: string }[];
+ };
+
+ const secrets: Record = {};
+ for (const secret of body.secrets ?? []) {
+ secrets[secret.secretKey] = secret.secretValue;
+ }
+ return secrets;
+};
+
+export const infisicalClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const secrets = await fetchSecrets(config);
+ const result: Record = {};
+ for (const ref of refs) {
+ if (secrets[ref] === undefined) {
+ throw new Error(
+ `Infisical: secret "${ref}" not found in environment "${config.environmentSlug}"`,
+ );
+ }
+ result[ref] = secrets[ref];
+ }
+ return result;
+ },
+
+ async testConnection(config) {
+ await fetchSecrets(config);
+ },
+
+ async listSecretNames(config) {
+ const secrets = await fetchSecrets(config);
+ return Object.keys(secrets);
+ },
+};
diff --git a/packages/server/src/utils/vault/types.ts b/packages/server/src/utils/vault/types.ts
new file mode 100644
index 000000000..7f136cc11
--- /dev/null
+++ b/packages/server/src/utils/vault/types.ts
@@ -0,0 +1,18 @@
+import type { VaultProviderConfig } from "@dokploy/server/db/schema";
+
+export interface VaultClient<
+ C extends VaultProviderConfig = VaultProviderConfig,
+> {
+ getSecrets(config: C, refs: string[]): Promise>;
+ testConnection(config: C): Promise;
+ listSecretNames?(config: C): Promise;
+}
+
+export const VAULT_REQUEST_TIMEOUT_MS = 15_000;
+
+export const vaultFetch = async (url: string, init: RequestInit = {}) => {
+ return await fetch(url, {
+ ...init,
+ signal: AbortSignal.timeout(VAULT_REQUEST_TIMEOUT_MS),
+ });
+};
diff --git a/packages/server/src/utils/volume-backups/index.ts b/packages/server/src/utils/volume-backups/index.ts
index 172c3f32e..4f0d82ebe 100644
--- a/packages/server/src/utils/volume-backups/index.ts
+++ b/packages/server/src/utils/volume-backups/index.ts
@@ -13,8 +13,8 @@ export const initVolumeBackupsCronJobs = async () => {
const volumeBackupsResult = await db.query.volumeBackups.findMany({
where: eq(volumeBackups.enabled, true),
with: {
- application: true,
- compose: true,
+ application: { columns: { applicationId: true } },
+ compose: { columns: { composeId: true } },
},
});
diff --git a/packages/server/src/utils/volume-backups/restore.ts b/packages/server/src/utils/volume-backups/restore.ts
index 6f6068caf..812f6cefd 100644
--- a/packages/server/src/utils/volume-backups/restore.ts
+++ b/packages/server/src/utils/volume-backups/restore.ts
@@ -1,4 +1,5 @@
import path from "node:path";
+import { quote } from "shell-quote";
import {
findApplicationById,
findComposeById,
@@ -23,7 +24,7 @@ export const restoreVolume = async (
const backupPath = `${bucketPath}/${backupFileName}`;
// Command to download backup file from S3
- const downloadCommand = `rclone copyto ${rcloneFlags.join(" ")} "${backupPath}" "${volumeBackupPath}/${backupFileName}"`;
+ const downloadCommand = `rclone copyto ${rcloneFlags.join(" ")} ${quote([backupPath])} ${quote([`${volumeBackupPath}/${backupFileName}`])}`;
// Base restore command that creates the volume and restores data
const baseRestoreCommand = `
@@ -40,7 +41,7 @@ export const restoreVolume = async (
-v ${volumeName}:/volume_data \
-v ${volumeBackupPath}:/backup \
ubuntu \
- bash -c "cd /volume_data && tar xvf /backup/${backupFileName} ."
+ bash -c "cd /volume_data && tar xvf /backup/${quote([backupFileName])} ."
echo "Volume restore completed ✅"
`;
diff --git a/packages/server/tsconfig.server.json b/packages/server/tsconfig.server.json
index 33777c025..b0f2a78b4 100644
--- a/packages/server/tsconfig.server.json
+++ b/packages/server/tsconfig.server.json
@@ -17,7 +17,7 @@
}
},
"include": ["next-env.d.ts", "./src/**/*"],
- "exclude": ["**/dist", "tsup.ts"],
+ "exclude": ["**/dist", "tsup.ts", "src/lib/auth-cli.ts"],
"tsc-alias": {
"resolveFullPaths": true,
"verbose": false
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a6202323f..44dba075a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -16,8 +16,8 @@ importers:
.:
devDependencies:
'@biomejs/biome':
- specifier: 2.1.1
- version: 2.1.1
+ specifier: 2.5.7
+ version: 2.5.7
'@types/node':
specifier: ^24.4.0
version: 24.10.13
@@ -115,9 +115,15 @@ importers:
'@ai-sdk/openai-compatible':
specifier: ^2.0.30
version: 2.0.30(zod@4.3.6)
+ '@aws-sdk/client-secrets-manager':
+ specifier: ^3.1097.0
+ version: 3.1097.0
'@better-auth/api-key':
specifier: 1.6.23
version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))
+ '@better-auth/passkey':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))(nanostores@1.1.1)
'@better-auth/scim':
specifier: 1.6.23
version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))
@@ -232,9 +238,6 @@ importers:
boxen:
specifier: ^7.1.1
version: 7.1.1
- bullmq:
- specifier: 5.67.3
- version: 5.67.3
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -582,9 +585,15 @@ importers:
'@ai-sdk/openai-compatible':
specifier: ^2.0.30
version: 2.0.30(zod@4.3.6)
+ '@aws-sdk/client-secrets-manager':
+ specifier: ^3.1097.0
+ version: 3.1097.0
'@better-auth/api-key':
specifier: 1.6.23
version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193))(better-call@1.3.7(zod@4.3.6))
+ '@better-auth/passkey':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193))(better-call@1.3.7(zod@4.3.6))(nanostores@1.1.1)
'@better-auth/scim':
specifier: 1.6.23
version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193))(better-call@1.3.7(zod@4.3.6))
@@ -868,6 +877,70 @@ packages:
resolution: {integrity: sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==}
engines: {node: '>=12'}
+ '@aws-sdk/client-secrets-manager@3.1097.0':
+ resolution: {integrity: sha512-EAyknLfabMWA1kAVgcBO6iTYBWFVnoX8WRrKEbPf6npNZUKv7oJoZBK+I0OvRK0o3P0ynbey64pDlspWXB9dag==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/core@3.977.2':
+ resolution: {integrity: sha512-8sT/M5vDcagx5/iM0Bfx7f6i3mfVOQkA34+GTMwp0lIWZb6ma+bjkzDS/r9yqU2yTPBqqMBFPT3+d9kUuuNDJA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.972.63':
+ resolution: {integrity: sha512-VSS9dftt7r7GiZ4gs8z0PNaMLVAaSj/MXVr6WQBtsrQQB9miJo7I6lQuJND1/ugFwK9x7OHCYZDkLSYh0FIZtA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-http@3.972.65':
+ resolution: {integrity: sha512-SH/ec7p1J0CfC28+ypH38IwGENd7tQEvTpmuRSlinthiGxKlwzJbXGXxIMAhn0/lpxnIxudNmCsw3Cy0PDRoAg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.973.8':
+ resolution: {integrity: sha512-alkQpDUHsjHGVXvlV0XFXpPfh9+aTMmN6UYRky0Qky8SbvdxoQdDHftT4uugq8XShP6WtDQW7bo5YQ0SfNSxRQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-login@3.972.70':
+ resolution: {integrity: sha512-JlUjK6bYJAxN9PkWWCI/TiOYEdvXNKq61x2DTaEKxRMxAOYNk2LX8m4wVtDFxTZwyXx7Tpmxb49dNprkW/uqXQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.972.74':
+ resolution: {integrity: sha512-V+7pzT0OzROL2uKcQ2+MpnfwKONvozYojmdn8RguAMX9o48gtSVvt+7aCkwWCH2thDXOnUPCN6qn4kiFDelZWA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.972.63':
+ resolution: {integrity: sha512-lPt2oGMcvP3uPhhxX5EquHrzBI/ZgJce+CHKcOGZl2ZQAXLLSxu7k/Cgo0HIktyi9dmDFljbOkj4XAnXD93YVQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.973.7':
+ resolution: {integrity: sha512-FR2b+7QNXP/q+eslVzrCjGKvso8Lcr/B18BvFyD2iLNhq42XSo+wnh8FfX6mtqgaVsL1vuB27uGXuY+xUTa7pg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.972.69':
+ resolution: {integrity: sha512-RWNTKGXRkzMJe8bgIAdlz9q0N97m7fThD9KOjBt2CSY+/xnIbrA1/Dnm/ZEz8ZeQ1Of5D+fLaPeoD3lGt6AU4Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/nested-clients@3.997.37':
+ resolution: {integrity: sha512-vfDmA6APjX1LWxvt6/zcAmTCgRXCj35M+bC9Ujmy40QxYs9Fa9bE7oblOB3ODZ4mdN9R5osU0hTzoJjJlQqqTg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.996.42':
+ resolution: {integrity: sha512-DBV4naZP6HYBlAvPpoQzOP12Wvfou/5rN8yJPXjBTBylU5qwCbh/tXr2MddHoIjgoRkEl/eS+IljiUqvmwey1Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/token-providers@3.1097.0':
+ resolution: {integrity: sha512-EIsdmy/f5IGc5r01RjKWNvrbBra6z0xudQM0D6Wf8DeGuPoRlubkLqr7VgWijFucO4kg0mtev9H3RX/ZOubUhg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/types@3.974.2':
+ resolution: {integrity: sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/xml-builder@3.972.37':
+ resolution: {integrity: sha512-zKq4HQum8JwDyEuyfuI4bbiAcU0KxP6qy+9PR/IsR92IyE/DaBAikzAS50tjxip4bqIIANpCcG+Yyj6CVhXupg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws/lambda-invoke-store@0.3.0':
+ resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==}
+ engines: {node: '>=18.0.0'}
+
'@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
@@ -1069,6 +1142,16 @@ packages:
mongodb:
optional: true
+ '@better-auth/passkey@1.6.23':
+ resolution: {integrity: sha512-nr5tKaNd/huUwTYX4DUm4HcXgBkixj0lXrRHdy9azY4fFjF49Tyif4sPyRMWnQJYxlRJ1HVEMJq2nGyr5CLXQg==}
+ peerDependencies:
+ '@better-auth/core': ^1.6.23
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ better-auth: ^1.6.23
+ better-call: 1.3.7
+ nanostores: ^1.0.1
+
'@better-auth/prisma-adapter@1.6.23':
resolution: {integrity: sha512-2qSdzidq4tkb1eS5TTqb4Nzg0mdZWm3Qky9SYeXeb8PpVQbC2sxqJhEM5mK7y12uU6I8hc64wO9f7AFVNL+6UQ==}
peerDependencies:
@@ -1112,55 +1195,55 @@ packages:
'@better-fetch/fetch@1.3.1':
resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==}
- '@biomejs/biome@2.1.1':
- resolution: {integrity: sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng==}
+ '@biomejs/biome@2.5.7':
+ resolution: {integrity: sha512-zr8K/DcY5tYsQOQwqMJ0AWElo6QgmgNI7idXgXLhevVszlt8RGVpesEJPqx3ThazLaOwjJ5Y8fz3BtH5fGZNsw==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@2.1.1':
- resolution: {integrity: sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ==}
+ '@biomejs/cli-darwin-arm64@2.5.7':
+ resolution: {integrity: sha512-vxo/Ls3/PYdQWyLhYYcgMOCzQypAjcY+iihS8M0wW03l16TCLW4zqZzGo75gm1VdCMj38hTVZ31KBWrZ4G9dJw==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@2.1.1':
- resolution: {integrity: sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA==}
+ '@biomejs/cli-darwin-x64@2.5.7':
+ resolution: {integrity: sha512-Cd3Ga61amT/Yl/0x8elP5hhGYaFy4bw6WuysTgf7oo8TA5tJ5A1k+DkVoJ2BHbTVil51gTX9VPzArnrlLJ3Kyg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@2.1.1':
- resolution: {integrity: sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A==}
+ '@biomejs/cli-linux-arm64-musl@2.5.7':
+ resolution: {integrity: sha512-xPI5yB6XlpDbNkS+bm1t42olw5c4l3UrlOmLg7KtLJvjvkNF/1V4tnUgfkylGIeb3u/T+BzMGYqgQhzjAoJzuQ==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-arm64@2.1.1':
- resolution: {integrity: sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g==}
+ '@biomejs/cli-linux-arm64@2.5.7':
+ resolution: {integrity: sha512-rR2QE0yF2GYSuYuKIa7pKvODGJqnOH+2eDREAM8wV+mWKSkMQKdAp4zXEZfTaxY8PMoNONnpgSWcBCyLDPDOKg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-x64-musl@2.1.1':
- resolution: {integrity: sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g==}
+ '@biomejs/cli-linux-x64-musl@2.5.7':
+ resolution: {integrity: sha512-rE5VZi+qtmPgQH+l7jVxYoZ18b/TiHEhulhMpjmCZH1PltSbjRcxNWywC3HZ9tYottG7ORkeTtoscBilKSBm0g==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-linux-x64@2.1.1':
- resolution: {integrity: sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q==}
+ '@biomejs/cli-linux-x64@2.5.7':
+ resolution: {integrity: sha512-FQgqJhscrqJUFptGaRSUJWlXAExwWcDwLuK49dvKfkQ1bB5SEEyFssnsxQY83Xm6jR0EbbX3+8+D5bfvYqUG2Q==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-win32-arm64@2.1.1':
- resolution: {integrity: sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q==}
+ '@biomejs/cli-win32-arm64@2.5.7':
+ resolution: {integrity: sha512-Oq4x0CCwP4jirrcTywXs5kOGZ4v5vuEP+gWrbtjApOA2CL9F3F9GlIdQIci8AKSCa/zURanMRpX/4wQ7Am6hHg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@2.1.1':
- resolution: {integrity: sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg==}
+ '@biomejs/cli-win32-x64@2.5.7':
+ resolution: {integrity: sha512-V+0wu/nrj2S+MhP4EQ0uHNolP0IALEsz45pg0WoKkHfDeh0+ItHwP/p7bX5RPoMOl9NkpHYWdYPhIcy2mACHvQ==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
@@ -1433,6 +1516,9 @@ packages:
'@hapi/bourne@3.0.0':
resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==}
+ '@hexagon/base64@1.1.28':
+ resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==}
+
'@hono/node-server@1.19.9':
resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==}
engines: {node: '>=18.14.1'}
@@ -1741,6 +1827,9 @@ packages:
'@leichtgewicht/ip-codec@2.0.5':
resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
+ '@levischuck/tiny-cbor@0.2.11':
+ resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==}
+
'@lezer/common@1.5.2':
resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==}
@@ -2520,6 +2609,46 @@ packages:
'@oslojs/encoding@1.1.0':
resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+ '@peculiar/asn1-android@2.8.0':
+ resolution: {integrity: sha512-skLbS+IOGv1lUgDqtChr8xvtvEr3HMse/JGBaL2r1J1o/n7a8wqOrovMtlRq/UXLhxvmLaONP67hwtshgzwfzA==}
+
+ '@peculiar/asn1-cms@2.8.0':
+ resolution: {integrity: sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==}
+
+ '@peculiar/asn1-csr@2.8.0':
+ resolution: {integrity: sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==}
+
+ '@peculiar/asn1-ecc@2.8.0':
+ resolution: {integrity: sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==}
+
+ '@peculiar/asn1-pfx@2.8.0':
+ resolution: {integrity: sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==}
+
+ '@peculiar/asn1-pkcs8@2.8.0':
+ resolution: {integrity: sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==}
+
+ '@peculiar/asn1-pkcs9@2.8.0':
+ resolution: {integrity: sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==}
+
+ '@peculiar/asn1-rsa@2.8.0':
+ resolution: {integrity: sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==}
+
+ '@peculiar/asn1-schema@2.8.0':
+ resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==}
+
+ '@peculiar/asn1-x509-attr@2.8.0':
+ resolution: {integrity: sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==}
+
+ '@peculiar/asn1-x509@2.8.0':
+ resolution: {integrity: sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==}
+
+ '@peculiar/utils@2.0.3':
+ resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==}
+
+ '@peculiar/x509@1.14.3':
+ resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==}
+ engines: {node: '>=20.0.0'}
+
'@prisma/client@5.22.0':
resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==}
engines: {node: '>=16.13'}
@@ -3713,6 +3842,13 @@ packages:
'@selderee/plugin-htmlparser2@0.11.0':
resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
+ '@simplewebauthn/browser@13.3.0':
+ resolution: {integrity: sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==}
+
+ '@simplewebauthn/server@13.3.2':
+ resolution: {integrity: sha512-KEDhfcGP1PAKRVSDjA3npTQFqS2b/srm+ipoNBNHdkzrHAlaRQUTE+a5f4ywsx6thxAw1NU2rYcLEY1949RGbQ==}
+ engines: {node: '>=20.0.0'}
+
'@sindresorhus/is@5.6.0':
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
engines: {node: '>=14.16'}
@@ -3721,6 +3857,30 @@ packages:
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
+ '@smithy/core@3.31.0':
+ resolution: {integrity: sha512-sylYk2l9d7CmRv8ts8p0SDQUr3VO+HMeS1nrjL6+UtbO8ktJHTOeQ1McX+aAyvGGccp5aZX9eNtdcXrSwzoZaw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/credential-provider-imds@4.4.15':
+ resolution: {integrity: sha512-xYVGrisQqTJWhOnScUhbx8s9H63TMtoxzuUoxG6mP8J+B/YbX3vZxVsgV0xDf43abJnJP0fjP7BkQh7OESwuRA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/fetch-http-handler@5.6.12':
+ resolution: {integrity: sha512-OpQgP6IGH4j0NJ2zjfYZLjQL85ai+Wi/q51EmZJovXsEwKSvu89qiXUq77Q6EmwZ/hSl7fKpn2Z9mhiDN6OM+Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-http-handler@4.9.12':
+ resolution: {integrity: sha512-dWW5KRt4mnEvjNzbGqGeCuAvgum85Y9ZoyuMQqcTEfapndyVJ1k9BEHK7kdXJZ32enyRmmwcFjMwlB/KgLKI3Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/signature-v4@5.6.11':
+ resolution: {integrity: sha512-7HsspeiNCZvZHEJ22vV5L/QYuJdTyJvPJvMrYD3AgkM3IJB0pkln4jkjPvtpTWRMkHXbO8WKwNjoVdVlBFwHmw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/types@4.16.1':
+ resolution: {integrity: sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==}
+ engines: {node: '>=18.0.0'}
+
'@stablelib/base64@1.0.1':
resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==}
@@ -4455,6 +4615,10 @@ packages:
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+ asn1js@3.0.10:
+ resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==}
+ engines: {node: '>=12.0.0'}
+
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@@ -4613,6 +4777,9 @@ packages:
bottleneck@2.19.5:
resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+ bowser@2.14.1:
+ resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==}
+
boxen@7.1.1:
resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==}
engines: {node: '>=14.16'}
@@ -7429,6 +7596,13 @@ packages:
pure-rand@6.1.0:
resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+ pvtsutils@1.3.6:
+ resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
+
+ pvutils@1.1.5:
+ resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==}
+ engines: {node: '>=16.0.0'}
+
qrcode@1.5.4:
resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
engines: {node: '>=10.13.0'}
@@ -7693,6 +7867,9 @@ packages:
redux@5.0.1:
resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
+ reflect-metadata@0.2.2:
+ resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+
refractor@5.0.0:
resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==}
@@ -8333,6 +8510,9 @@ packages:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -8341,6 +8521,10 @@ packages:
engines: {node: '>=18.0.0'}
hasBin: true
+ tsyringe@4.10.0:
+ resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==}
+ engines: {node: '>= 6.0.0'}
+
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -8886,6 +9070,151 @@ snapshots:
escape-html: 1.0.3
xpath: 0.0.32
+ '@aws-sdk/client-secrets-manager@3.1097.0':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/credential-provider-node': 3.972.74
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/fetch-http-handler': 5.6.12
+ '@smithy/node-http-handler': 4.9.12
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/core@3.977.2':
+ dependencies:
+ '@aws-sdk/types': 3.974.2
+ '@aws-sdk/xml-builder': 3.972.37
+ '@aws/lambda-invoke-store': 0.3.0
+ '@smithy/core': 3.31.0
+ '@smithy/signature-v4': 5.6.11
+ '@smithy/types': 4.16.1
+ bowser: 2.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-env@3.972.63':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-http@3.972.65':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/fetch-http-handler': 5.6.12
+ '@smithy/node-http-handler': 4.9.12
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-ini@3.973.8':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/credential-provider-env': 3.972.63
+ '@aws-sdk/credential-provider-http': 3.972.65
+ '@aws-sdk/credential-provider-login': 3.972.70
+ '@aws-sdk/credential-provider-process': 3.972.63
+ '@aws-sdk/credential-provider-sso': 3.973.7
+ '@aws-sdk/credential-provider-web-identity': 3.972.69
+ '@aws-sdk/nested-clients': 3.997.37
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/credential-provider-imds': 4.4.15
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-login@3.972.70':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/nested-clients': 3.997.37
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-node@3.972.74':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.972.63
+ '@aws-sdk/credential-provider-http': 3.972.65
+ '@aws-sdk/credential-provider-ini': 3.973.8
+ '@aws-sdk/credential-provider-process': 3.972.63
+ '@aws-sdk/credential-provider-sso': 3.973.7
+ '@aws-sdk/credential-provider-web-identity': 3.972.69
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/credential-provider-imds': 4.4.15
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-process@3.972.63':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-sso@3.973.7':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/nested-clients': 3.997.37
+ '@aws-sdk/token-providers': 3.1097.0
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-web-identity@3.972.69':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/nested-clients': 3.997.37
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/nested-clients@3.997.37':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/signature-v4-multi-region': 3.996.42
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/fetch-http-handler': 5.6.12
+ '@smithy/node-http-handler': 4.9.12
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/signature-v4-multi-region@3.996.42':
+ dependencies:
+ '@aws-sdk/types': 3.974.2
+ '@smithy/signature-v4': 5.6.11
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/token-providers@3.1097.0':
+ dependencies:
+ '@aws-sdk/core': 3.977.2
+ '@aws-sdk/nested-clients': 3.997.37
+ '@aws-sdk/types': 3.974.2
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/types@3.974.2':
+ dependencies:
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws-sdk/xml-builder@3.972.37':
+ dependencies:
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@aws/lambda-invoke-store@0.3.0': {}
+
'@babel/code-frame@7.29.0':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -9136,6 +9465,30 @@ snapshots:
optionalDependencies:
mongodb: 7.1.0(socks@2.8.8)
+ '@better-auth/passkey@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193))(better-call@1.3.7(zod@4.3.6))(nanostores@1.1.1)':
+ dependencies:
+ '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1)
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ '@simplewebauthn/browser': 13.3.0
+ '@simplewebauthn/server': 13.3.2
+ better-auth: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
+ better-call: 1.3.7(zod@4.3.6)
+ nanostores: 1.1.1
+ zod: 4.3.6
+
+ '@better-auth/passkey@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))(nanostores@1.1.1)':
+ dependencies:
+ '@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1)
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ '@simplewebauthn/browser': 13.3.0
+ '@simplewebauthn/server': 13.3.2
+ better-auth: 1.6.23(c1a003db19823d196c7d6468bf307df5)
+ better-call: 1.3.7(zod@4.3.6)
+ nanostores: 1.1.1
+ zod: 4.3.6
+
'@better-auth/prisma-adapter@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@prisma/client@5.22.0(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)))(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))':
dependencies:
'@better-auth/core': 1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1)
@@ -9198,39 +9551,39 @@ snapshots:
'@better-fetch/fetch@1.3.1': {}
- '@biomejs/biome@2.1.1':
+ '@biomejs/biome@2.5.7':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 2.1.1
- '@biomejs/cli-darwin-x64': 2.1.1
- '@biomejs/cli-linux-arm64': 2.1.1
- '@biomejs/cli-linux-arm64-musl': 2.1.1
- '@biomejs/cli-linux-x64': 2.1.1
- '@biomejs/cli-linux-x64-musl': 2.1.1
- '@biomejs/cli-win32-arm64': 2.1.1
- '@biomejs/cli-win32-x64': 2.1.1
+ '@biomejs/cli-darwin-arm64': 2.5.7
+ '@biomejs/cli-darwin-x64': 2.5.7
+ '@biomejs/cli-linux-arm64': 2.5.7
+ '@biomejs/cli-linux-arm64-musl': 2.5.7
+ '@biomejs/cli-linux-x64': 2.5.7
+ '@biomejs/cli-linux-x64-musl': 2.5.7
+ '@biomejs/cli-win32-arm64': 2.5.7
+ '@biomejs/cli-win32-x64': 2.5.7
- '@biomejs/cli-darwin-arm64@2.1.1':
+ '@biomejs/cli-darwin-arm64@2.5.7':
optional: true
- '@biomejs/cli-darwin-x64@2.1.1':
+ '@biomejs/cli-darwin-x64@2.5.7':
optional: true
- '@biomejs/cli-linux-arm64-musl@2.1.1':
+ '@biomejs/cli-linux-arm64-musl@2.5.7':
optional: true
- '@biomejs/cli-linux-arm64@2.1.1':
+ '@biomejs/cli-linux-arm64@2.5.7':
optional: true
- '@biomejs/cli-linux-x64-musl@2.1.1':
+ '@biomejs/cli-linux-x64-musl@2.5.7':
optional: true
- '@biomejs/cli-linux-x64@2.1.1':
+ '@biomejs/cli-linux-x64@2.5.7':
optional: true
- '@biomejs/cli-win32-arm64@2.1.1':
+ '@biomejs/cli-win32-arm64@2.5.7':
optional: true
- '@biomejs/cli-win32-x64@2.1.1':
+ '@biomejs/cli-win32-x64@2.5.7':
optional: true
'@bufbuild/protobuf@2.11.0': {}
@@ -9502,6 +9855,8 @@ snapshots:
'@hapi/bourne@3.0.0': {}
+ '@hexagon/base64@1.1.28': {}
+
'@hono/node-server@1.19.9(hono@4.11.4)':
dependencies:
hono: 4.11.4
@@ -9779,6 +10134,8 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
+ '@levischuck/tiny-cbor@0.2.11': {}
+
'@lezer/common@1.5.2': {}
'@lezer/css@1.3.1':
@@ -10813,6 +11170,106 @@ snapshots:
'@oslojs/encoding@1.1.0': {}
+ '@peculiar/asn1-android@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-cms@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ '@peculiar/asn1-x509-attr': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-csr@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-ecc@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-pfx@2.8.0':
+ dependencies:
+ '@peculiar/asn1-cms': 2.8.0
+ '@peculiar/asn1-pkcs8': 2.8.0
+ '@peculiar/asn1-rsa': 2.8.0
+ '@peculiar/asn1-schema': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-pkcs8@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-pkcs9@2.8.0':
+ dependencies:
+ '@peculiar/asn1-cms': 2.8.0
+ '@peculiar/asn1-pfx': 2.8.0
+ '@peculiar/asn1-pkcs8': 2.8.0
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ '@peculiar/asn1-x509-attr': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-rsa@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-schema@2.8.0':
+ dependencies:
+ '@peculiar/utils': 2.0.3
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-x509-attr@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/asn1-x509@2.8.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/utils': 2.0.3
+ asn1js: 3.0.10
+ tslib: 2.8.1
+
+ '@peculiar/utils@2.0.3':
+ dependencies:
+ tslib: 2.8.1
+
+ '@peculiar/x509@1.14.3':
+ dependencies:
+ '@peculiar/asn1-cms': 2.8.0
+ '@peculiar/asn1-csr': 2.8.0
+ '@peculiar/asn1-ecc': 2.8.0
+ '@peculiar/asn1-pkcs9': 2.8.0
+ '@peculiar/asn1-rsa': 2.8.0
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ pvtsutils: 1.3.6
+ reflect-metadata: 0.2.2
+ tslib: 2.8.1
+ tsyringe: 4.10.0
+
'@prisma/client@5.22.0(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))':
optionalDependencies:
prisma: 7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)
@@ -12030,10 +12487,56 @@ snapshots:
domhandler: 5.0.3
selderee: 0.11.0
+ '@simplewebauthn/browser@13.3.0': {}
+
+ '@simplewebauthn/server@13.3.2':
+ dependencies:
+ '@hexagon/base64': 1.1.28
+ '@levischuck/tiny-cbor': 0.2.11
+ '@peculiar/asn1-android': 2.8.0
+ '@peculiar/asn1-ecc': 2.8.0
+ '@peculiar/asn1-rsa': 2.8.0
+ '@peculiar/asn1-schema': 2.8.0
+ '@peculiar/asn1-x509': 2.8.0
+ '@peculiar/x509': 1.14.3
+
'@sindresorhus/is@5.6.0': {}
'@sindresorhus/merge-streams@4.0.0': {}
+ '@smithy/core@3.31.0':
+ dependencies:
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@smithy/credential-provider-imds@4.4.15':
+ dependencies:
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@smithy/fetch-http-handler@5.6.12':
+ dependencies:
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@smithy/node-http-handler@4.9.12':
+ dependencies:
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@smithy/signature-v4@5.6.11':
+ dependencies:
+ '@smithy/core': 3.31.0
+ '@smithy/types': 4.16.1
+ tslib: 2.8.1
+
+ '@smithy/types@4.16.1':
+ dependencies:
+ tslib: 2.8.1
+
'@stablelib/base64@1.0.1': {}
'@standard-schema/spec@1.1.0': {}
@@ -13075,6 +13578,12 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ asn1js@3.0.10:
+ dependencies:
+ pvtsutils: 1.3.6
+ pvutils: 1.1.5
+ tslib: 2.8.1
+
assertion-error@2.0.1: {}
ast-types@0.16.1:
@@ -13257,6 +13766,8 @@ snapshots:
bottleneck@2.19.5: {}
+ bowser@2.14.1: {}
+
boxen@7.1.1:
dependencies:
ansi-align: 3.0.1
@@ -16047,6 +16558,12 @@ snapshots:
pure-rand@6.1.0:
optional: true
+ pvtsutils@1.3.6:
+ dependencies:
+ tslib: 2.8.1
+
+ pvutils@1.1.5: {}
+
qrcode@1.5.4:
dependencies:
dijkstrajs: 1.0.3
@@ -16387,6 +16904,8 @@ snapshots:
redux@5.0.1: {}
+ reflect-metadata@0.2.2: {}
+
refractor@5.0.0:
dependencies:
'@types/hast': 3.0.4
@@ -17209,6 +17728,8 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
+ tslib@1.14.1: {}
+
tslib@2.8.1: {}
tsx@4.22.4:
@@ -17217,6 +17738,10 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ tsyringe@4.10.0:
+ dependencies:
+ tslib: 1.14.1
+
tunnel-agent@0.6.0:
dependencies:
safe-buffer: 5.2.1