diff --git a/.github/workflows/dokploy.yml b/.github/workflows/dokploy.yml
index 1c228d27e..08d6b8a5b 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,71 +183,82 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10.22.0
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24.4.0
+ cache: pnpm
+
+ - name: Generate OpenAPI specification
+ run: |
+ pnpm install --frozen-lockfile
+ pnpm generate:openapi
+
- 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
+ cp ${{ github.workspace }}/openapi.json src/generated/openapi.json
pnpm install
- pnpm run fetch-openapi
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 "✅ 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/format.yml b/.github/workflows/format.yml
index cfddad7b2..48589575f 100644
--- a/.github/workflows/format.yml
+++ b/.github/workflows/format.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup biomeJs
uses: biomejs/setup-biome@v2
@@ -19,4 +19,4 @@ jobs:
- name: Run Biome formatter
run: biome format --write
- - uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 # v1.3.2
+ - uses: autofix-ci/action@c5b2d67aa2274e7b5a18224e8171550871fc7e4a # v1.3.4
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/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
index 2ad24fc0c..227022a90 100644
--- a/.github/workflows/pull-request.yml
+++ b/.github/workflows/pull-request.yml
@@ -14,9 +14,9 @@ jobs:
matrix:
job: [build, test, typecheck]
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4
+ - uses: actions/checkout@v5
+ - uses: pnpm/action-setup@v5
+ - uses: actions/setup-node@v5
with:
node-version: 24.4.0
cache: "pnpm"
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/api/package.json b/apps/api/package.json
index 70df73ce4..cd1689041 100644
--- a/apps/api/package.json
+++ b/apps/api/package.json
@@ -28,7 +28,7 @@
"@types/react-dom": "^19.2.0",
"rimraf": "6.1.3",
"tsx": "^4.22.4",
- "typescript": "^5.8.3"
+ "typescript": "^7.0.2"
},
"packageManager": "pnpm@10.22.0",
"engines": {
diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json
index e47c6267d..89d55fdb8 100644
--- a/apps/api/tsconfig.json
+++ b/apps/api/tsconfig.json
@@ -2,13 +2,12 @@
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
- "moduleResolution": "Node",
+ "moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
"outDir": "dist",
+ "rootDir": "./src",
"jsx": "react-jsx",
- "jsxImportSource": "hono/jsx",
- "baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@dokploy/server/*": ["../../packages/server/src/*"]
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..9640e3428 100644
--- a/apps/dokploy/components/shared/code-editor.tsx
+++ b/apps/dokploy/components/shared/code-editor.tsx
@@ -3,11 +3,16 @@ import {
type Completion,
type CompletionContext,
type CompletionResult,
+ type CompletionSource,
} from "@codemirror/autocomplete";
import { css } from "@codemirror/lang-css";
import { json } from "@codemirror/lang-json";
import { yaml } from "@codemirror/lang-yaml";
-import { StreamLanguage } from "@codemirror/language";
+import {
+ getIndentUnit,
+ indentService,
+ StreamLanguage,
+} from "@codemirror/language";
import { properties } from "@codemirror/legacy-modes/mode/properties";
import { shell } from "@codemirror/legacy-modes/mode/shell";
import { search, searchKeymap } from "@codemirror/search";
@@ -98,6 +103,27 @@ const dockerComposeServiceOptions = [
},
}));
+// The indentNodeProp shipped with @codemirror/lang-yaml computes wrong
+// column-based indents on Enter (odd/inconsistent amounts, see #4650), so
+// indentation is resolved line-based here: keep the current indent, align
+// list-entry keys after the dash marker, and go one unit deeper after a
+// line that opens a block (ending in ":", "|" or ">").
+const yamlIndent = indentService.of((context, pos) => {
+ const line = context.state.doc.lineAt(pos);
+ const before = context.state.doc.sliceString(line.from, pos);
+ const indent = /^ */.exec(before)?.[0].length ?? 0;
+ const trimmed = before.trim();
+ if (!trimmed || trimmed.startsWith("#")) {
+ return indent;
+ }
+ const base =
+ trimmed.startsWith("- ") && /:\s/.test(trimmed) ? indent + 2 : indent;
+ if (/[:|>]$/.test(trimmed)) {
+ return base + getIndentUnit(context.state);
+ }
+ return base;
+});
+
function dockerComposeComplete(
context: CompletionContext,
): CompletionResult | null {
@@ -135,6 +161,7 @@ interface Props extends ReactCodeMirrorProps {
language?: "yaml" | "json" | "properties" | "shell" | "css";
lineWrapping?: boolean;
lineNumbers?: boolean;
+ completionSource?: CompletionSource;
}
export const CodeEditor = ({
@@ -142,6 +169,7 @@ export const CodeEditor = ({
wrapperClassName,
language = "yaml",
lineNumbers = true,
+ completionSource,
...props
}: Props) => {
const { resolvedTheme } = useTheme();
@@ -160,7 +188,7 @@ export const CodeEditor = ({
search(),
keymap.of(searchKeymap),
language === "yaml"
- ? yaml()
+ ? [yamlIndent, yaml()]
: language === "json"
? json()
: language === "css"
@@ -175,11 +203,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/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/sidebar.tsx b/apps/dokploy/components/ui/sidebar.tsx
index 6c9ca131a..0972949e3 100644
--- a/apps/dokploy/components/ui/sidebar.tsx
+++ b/apps/dokploy/components/ui/sidebar.tsx
@@ -464,7 +464,7 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
}
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..c73627c77 100644
--- a/apps/dokploy/pages/dashboard/docker.tsx
+++ b/apps/dokploy/pages/dashboard/docker.tsx
@@ -1,17 +1,118 @@
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 { ShowDiskUsage } from "@/components/dashboard/docker/disk-usage/show-disk-usage";
+import { ShowDockerEvents } from "@/components/dashboard/docker/events/show-docker-events";
+import { ShowImages } from "@/components/dashboard/docker/images/show-images";
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 { ShowNodes } from "@/components/dashboard/settings/cluster/nodes/show-nodes";
+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 DEFAULT_TAB = "containers";
+const DEFAULT_SWARM_TAB = "overview";
+
const Dashboard = () => {
+ const router = useRouter();
+
+ const activeTab =
+ typeof router.query.tab === "string" ? router.query.tab : DEFAULT_TAB;
+
+ const activeSwarmTab =
+ typeof router.query.subtab === "string"
+ ? router.query.subtab
+ : DEFAULT_SWARM_TAB;
+
+ const setTab = (value: string) => {
+ const { tab: _current, subtab: _subtab, ...query } = router.query;
+ router.replace(
+ {
+ pathname: router.pathname,
+ query: value === DEFAULT_TAB ? query : { ...query, tab: value },
+ },
+ undefined,
+ { shallow: true },
+ );
+ };
+
+ const setSwarmTab = (value: string) => {
+ const { subtab: _current, ...query } = router.query;
+ router.replace(
+ {
+ pathname: router.pathname,
+ query:
+ value === DEFAULT_SWARM_TAB ? query : { ...query, subtab: value },
+ },
+ undefined,
+ { shallow: true },
+ );
+ };
+
return (
- {(serverId) => }
+ {(serverId) => (
+
+
+ Containers
+ Swarm
+ Images
+ Volumes
+ Networks
+ Events
+ Disk Usage
+
+
+
+
+
+
+
+ Overview
+ Containers
+ Nodes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
);
};
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/cluster.tsx b/apps/dokploy/pages/dashboard/settings/dns.tsx
similarity index 63%
rename from apps/dokploy/pages/dashboard/settings/cluster.tsx
rename to apps/dokploy/pages/dashboard/settings/dns.tsx
index 8505272b9..60aaae76e 100644
--- a/apps/dokploy/pages/dashboard/settings/cluster.tsx
+++ b/apps/dokploy/pages/dashboard/settings/dns.tsx
@@ -3,33 +3,26 @@ import { createServerSideHelpers } from "@trpc/react-query/server";
import type { GetServerSidePropsContext } from "next";
import type { ReactElement } from "react";
import superjson from "superjson";
-import { ShowNodes } from "@/components/dashboard/settings/cluster/nodes/show-nodes";
+import { ShowDnsProviders } from "@/components/dashboard/settings/dns/show-dns-providers";
import { DashboardLayout } from "@/components/layouts/dashboard-layout";
-import { ServerFilter } from "@/components/shared/server-filter";
import { appRouter } from "@/server/api/root";
const Page = () => {
return (
-
- {(serverId) => (
-
-
-
- )}
-
+
+
+
);
};
export default Page;
Page.getLayout = (page: ReactElement) => {
- return
{page};
+ return
{page};
};
-export async function getServerSideProps(
- ctx: GetServerSidePropsContext<{ serviceId: string }>,
-) {
+export async function getServerSideProps(ctx: GetServerSidePropsContext) {
const { req, res } = ctx;
- const { user, session } = await validateRequest(ctx.req);
+ const { user, session } = await validateRequest(req);
if (!user || user.role === "member") {
return {
redirect: {
@@ -50,6 +43,7 @@ export async function getServerSideProps(
transformer: superjson,
});
await helpers.user.get.prefetch();
+ await helpers.settings.isCloud.prefetch();
return {
props: {
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..ea9aed210 100644
--- a/apps/dokploy/server/api/root.ts
+++ b/apps/dokploy/server/api/root.ts
@@ -9,7 +9,11 @@ import { clusterRouter } from "./routers/cluster";
import { composeRouter } from "./routers/compose";
import { deploymentRouter } from "./routers/deployment";
import { destinationRouter } from "./routers/destination";
+import { dnsProviderRouter } from "./routers/dns-provider";
import { dockerRouter } from "./routers/docker";
+import { dockerDiskUsageRouter } from "./routers/docker-disk-usage";
+import { dockerImageRouter } from "./routers/docker-image";
+import { dockerVolumeRouter } from "./routers/docker-volume";
import { domainRouter } from "./routers/domain";
import { environmentRouter } from "./routers/environment";
import { gitProviderRouter } from "./routers/git-provider";
@@ -21,6 +25,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 +53,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 +66,17 @@ export const appRouter = createTRPCRouter({
application: applicationRouter,
backup: backupRouter,
bitbucket: bitbucketRouter,
+ network: networkRouter,
certificates: certificateRouter,
cluster: clusterRouter,
compose: composeRouter,
deployment: deploymentRouter,
destination: destinationRouter,
+ dnsProvider: dnsProviderRouter,
docker: dockerRouter,
+ dockerDiskUsage: dockerDiskUsageRouter,
+ dockerImage: dockerImageRouter,
+ dockerVolume: dockerVolumeRouter,
domain: domainRouter,
gitea: giteaRouter,
gitProvider: gitProviderRouter,
@@ -91,6 +102,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..f121c62ea 100644
--- a/apps/dokploy/server/api/routers/cluster.ts
+++ b/apps/dokploy/server/api/routers/cluster.ts
@@ -6,13 +6,14 @@ 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";
import { createTRPCRouter, withPermission } from "../trpc";
export const clusterRouter = createTRPCRouter({
- getNodes: withPermission("server", "read")
+ getNodes: withPermission("docker", "read")
.input(
z.object({
serverId: z.string().optional(),
@@ -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/dns-provider.ts b/apps/dokploy/server/api/routers/dns-provider.ts
new file mode 100644
index 000000000..673c91a21
--- /dev/null
+++ b/apps/dokploy/server/api/routers/dns-provider.ts
@@ -0,0 +1,222 @@
+import {
+ createDnsProvider,
+ createDnsProviderRecord,
+ deleteDnsProviderRecord,
+ findDnsProviderInOrganization,
+ findDnsProvidersByOrganizationId,
+ listDnsProviderRecords,
+ listDnsProviderZones,
+ maskDnsProviderConfig,
+ mergeDnsProviderConfig,
+ removeDnsProvider,
+ testDnsProviderConnection,
+ updateDnsProvider,
+ updateDnsProviderRecord,
+} from "@dokploy/server";
+import { TRPCError } from "@trpc/server";
+import { audit } from "@/server/api/utils/audit";
+import {
+ apiCreateDnsProvider,
+ apiCreateDnsRecord,
+ apiDeleteDnsRecord,
+ apiFindOneDnsProvider,
+ apiListDnsRecords,
+ apiListDnsZones,
+ apiRemoveDnsProvider,
+ apiTestDnsProvider,
+ apiUpdateDnsProvider,
+ apiUpdateDnsRecord,
+} from "@/server/db/schema";
+import { createTRPCRouter, withPermission } from "../trpc";
+
+export const dnsProviderRouter = createTRPCRouter({
+ create: withPermission("dnsProvider", "create")
+ .input(apiCreateDnsProvider)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await createDnsProvider(
+ input,
+ ctx.session.activeOrganizationId,
+ );
+ await audit(ctx, {
+ action: "create",
+ resourceType: "dnsProvider",
+ resourceId: provider.dnsProviderId,
+ resourceName: provider.name,
+ });
+ return { ...provider, config: maskDnsProviderConfig(provider.config) };
+ }),
+
+ update: withPermission("dnsProvider", "update")
+ .input(apiUpdateDnsProvider)
+ .mutation(async ({ ctx, input }) => {
+ await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ const updated = await updateDnsProvider(
+ input.dnsProviderId,
+ input.name,
+ input.config,
+ );
+ await audit(ctx, {
+ action: "update",
+ resourceType: "dnsProvider",
+ resourceId: updated.dnsProviderId,
+ resourceName: updated.name,
+ });
+ return { ...updated, config: maskDnsProviderConfig(updated.config) };
+ }),
+
+ remove: withPermission("dnsProvider", "delete")
+ .input(apiRemoveDnsProvider)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "dnsProvider",
+ resourceId: provider.dnsProviderId,
+ resourceName: provider.name,
+ });
+ await removeDnsProvider(input.dnsProviderId);
+ return true;
+ }),
+
+ all: withPermission("dnsProvider", "read").query(async ({ ctx }) => {
+ const providers = await findDnsProvidersByOrganizationId(
+ ctx.session.activeOrganizationId,
+ );
+ return providers.map((provider) => ({
+ ...provider,
+ config: maskDnsProviderConfig(provider.config),
+ }));
+ }),
+
+ one: withPermission("dnsProvider", "read")
+ .input(apiFindOneDnsProvider)
+ .query(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ return { ...provider, config: maskDnsProviderConfig(provider.config) };
+ }),
+
+ testConnection: withPermission("dnsProvider", "create")
+ .input(apiTestDnsProvider)
+ .mutation(async ({ ctx, input }) => {
+ if (!input.config && !input.dnsProviderId) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Provide a config or a dnsProviderId to test",
+ });
+ }
+
+ let config = input.config;
+ if (input.dnsProviderId) {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ config = config
+ ? mergeDnsProviderConfig(config, provider.config)
+ : provider.config;
+ }
+
+ await testDnsProviderConnection(config!);
+ return true;
+ }),
+
+ listZones: withPermission("dnsProvider", "read")
+ .input(apiListDnsZones)
+ .query(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ return await listDnsProviderZones(provider.config);
+ }),
+
+ listRecords: withPermission("dnsProvider", "read")
+ .input(apiListDnsRecords)
+ .query(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ return await listDnsProviderRecords(provider.config, input.zoneId);
+ }),
+
+ createRecord: withPermission("dnsProvider", "update")
+ .input(apiCreateDnsRecord)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ const record = await createDnsProviderRecord(provider.config, {
+ zoneId: input.zoneId,
+ type: input.type,
+ name: input.name,
+ content: input.content,
+ ttl: input.ttl,
+ });
+ await audit(ctx, {
+ action: "create",
+ resourceType: "dnsProvider",
+ resourceId: record.id,
+ resourceName: input.name,
+ });
+ return record;
+ }),
+
+ updateRecord: withPermission("dnsProvider", "update")
+ .input(apiUpdateDnsRecord)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ const record = await updateDnsProviderRecord(
+ provider.config,
+ input.zoneId,
+ input.recordId,
+ {
+ type: input.type,
+ name: input.name,
+ content: input.content,
+ ttl: input.ttl,
+ },
+ );
+ await audit(ctx, {
+ action: "update",
+ resourceType: "dnsProvider",
+ resourceId: record.id,
+ resourceName: input.name,
+ });
+ return record;
+ }),
+
+ deleteRecord: withPermission("dnsProvider", "delete")
+ .input(apiDeleteDnsRecord)
+ .mutation(async ({ ctx, input }) => {
+ const provider = await findDnsProviderInOrganization(
+ input.dnsProviderId,
+ ctx.session.activeOrganizationId,
+ );
+ await deleteDnsProviderRecord(
+ provider.config,
+ input.zoneId,
+ input.recordId,
+ );
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "dnsProvider",
+ resourceId: input.recordId,
+ resourceName: input.zoneId,
+ });
+ return true;
+ }),
+});
diff --git a/apps/dokploy/server/api/routers/docker-disk-usage.ts b/apps/dokploy/server/api/routers/docker-disk-usage.ts
new file mode 100644
index 000000000..5f1fcbb43
--- /dev/null
+++ b/apps/dokploy/server/api/routers/docker-disk-usage.ts
@@ -0,0 +1,66 @@
+import {
+ cleanupBuilders,
+ findServerById,
+ getBuildCache,
+ getDockerDiskUsage,
+} 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 dockerDiskUsageRouter = createTRPCRouter({
+ getDiskUsage: 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 getDockerDiskUsage(input.serverId);
+ }),
+
+ getBuildCache: 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 getBuildCache(input.serverId);
+ }),
+
+ pruneBuildCache: withPermission("docker", "read")
+ .input(
+ z.object({
+ 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 cleanupBuilders(input.serverId);
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "docker",
+ resourceId: "build-cache",
+ resourceName: "Docker build cache",
+ });
+ }),
+});
diff --git a/apps/dokploy/server/api/routers/docker-image.ts b/apps/dokploy/server/api/routers/docker-image.ts
new file mode 100644
index 000000000..dd825cabb
--- /dev/null
+++ b/apps/dokploy/server/api/routers/docker-image.ts
@@ -0,0 +1,82 @@
+import {
+ findServerById,
+ getImageConfig,
+ getImages,
+ removeImage,
+} 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 dockerImageRouter = createTRPCRouter({
+ getImages: 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 getImages(input.serverId);
+ }),
+
+ getImageConfig: withPermission("docker", "read")
+ .input(
+ z.object({
+ imageRef: z.string().min(1),
+ 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 getImageConfig(input.imageRef, input.serverId);
+ }),
+
+ removeImage: withPermission("docker", "read")
+ .input(
+ z.object({
+ repository: z.string(),
+ tag: z.string(),
+ id: z.string().min(1),
+ force: z.boolean().optional(),
+ 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 removeImage(
+ {
+ repository: input.repository,
+ tag: input.tag,
+ id: input.id,
+ force: input.force,
+ },
+ input.serverId,
+ );
+ await audit(ctx, {
+ action: "delete",
+ resourceType: "docker",
+ resourceId: input.id,
+ resourceName:
+ input.repository !== "
" && input.tag !== ""
+ ? `${input.repository}:${input.tag}`
+ : input.id,
+ });
+ }),
+});
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..e025b3434 100644
--- a/apps/dokploy/server/api/routers/docker.ts
+++ b/apps/dokploy/server/api/routers/docker.ts
@@ -4,14 +4,19 @@ import {
containerRestart,
containerStart,
containerStop,
+ deleteContainerFile,
findServerById,
getConfig,
getContainers,
getContainersByAppLabel,
getContainersByAppNameMatch,
+ getDockerEvents,
getServiceContainersByAppName,
getStackContainersByAppName,
+ listContainerFiles,
+ readContainerFile,
uploadFileToContainer,
+ writeContainerFile,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { z } from "zod";
@@ -21,6 +26,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 +312,134 @@ 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}`,
+ });
+ }),
+
+ getEvents: withPermission("docker", "read")
+ .input(
+ z.object({
+ serverId: z.string().optional(),
+ minutes: z.number().min(1).max(1440).default(15),
+ }),
+ )
+ .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 getDockerEvents(input.serverId, input.minutes);
+ }),
});
diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts
index 8210fcf8a..505db50c6 100644
--- a/apps/dokploy/server/api/routers/domain.ts
+++ b/apps/dokploy/server/api/routers/domain.ts
@@ -141,6 +141,58 @@ export const domainRouter = createTRPCRouter({
}
return result;
}),
+ toggleEnable: protectedProcedure
+ .input(apiFindDomain)
+ .mutation(async ({ input, ctx }) => {
+ const currentDomain = await findDomainById(input.domainId);
+ const serviceId = currentDomain.applicationId || currentDomain.composeId;
+ if (serviceId) {
+ await checkServicePermissionAndAccess(ctx, serviceId, {
+ domain: ["create"],
+ });
+ } else if (currentDomain.previewDeploymentId) {
+ const preview = await findPreviewDeploymentById(
+ currentDomain.previewDeploymentId,
+ );
+ await checkServicePermissionAndAccess(ctx, preview.applicationId, {
+ domain: ["create"],
+ });
+ }
+
+ const result = await updateDomainById(input.domainId, {
+ enabled: !currentDomain.enabled,
+ });
+ const domain = await findDomainById(input.domainId);
+ await audit(ctx, {
+ action: "update",
+ resourceType: "domain",
+ resourceId: domain.domainId,
+ resourceName: domain.host,
+ });
+
+ // Applications apply instantly through the traefik file provider:
+ // manageDomain creates the router when enabled and removes it when
+ // disabled. Compose domains are docker labels and only change on the
+ // next deployment, so we just persist the flag here.
+ if (domain.applicationId) {
+ const application = await findApplicationById(domain.applicationId);
+ await manageDomain(application, domain);
+ } else if (domain.previewDeploymentId) {
+ const previewDeployment = await findPreviewDeploymentById(
+ domain.previewDeploymentId,
+ );
+ const application = await findApplicationById(
+ previewDeployment.applicationId,
+ );
+ application.appName = previewDeployment.appName;
+ await manageDomain(application, domain);
+ }
+
+ return {
+ ...result,
+ requiresRedeploy: domain.domainType === "compose",
+ };
+ }),
one: protectedProcedure.input(apiFindDomain).query(async ({ input, ctx }) => {
const domain = await findDomainById(input.domainId);
const serviceId = domain.applicationId || domain.composeId;
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/notification.ts b/apps/dokploy/server/api/routers/notification.ts
index dd96bc302..ae1c35d12 100644
--- a/apps/dokploy/server/api/routers/notification.ts
+++ b/apps/dokploy/server/api/routers/notification.ts
@@ -535,7 +535,7 @@ export const notificationRouter = createTRPCRouter({
}
organizationId = result?.[0]?.organizationId;
- ServerName = "Remote";
+ ServerName = result?.[0]?.name ?? "Remote";
}
await sendServerThresholdNotifications(organizationId, {
diff --git a/apps/dokploy/server/api/routers/organization.ts b/apps/dokploy/server/api/routers/organization.ts
index 76d6a7235..98d36dd2b 100644
--- a/apps/dokploy/server/api/routers/organization.ts
+++ b/apps/dokploy/server/api/routers/organization.ts
@@ -1,5 +1,9 @@
import { db } from "@dokploy/server/db";
-import { IS_CLOUD, sendInvitationEmail } from "@dokploy/server/index";
+import {
+ hasValidLicense,
+ IS_CLOUD,
+ sendInvitationEmail,
+} from "@dokploy/server/index";
import { TRPCError } from "@trpc/server";
import { and, desc, eq, exists } from "drizzle-orm";
import { nanoid } from "nanoid";
@@ -128,6 +132,7 @@ export const organizationRouter = createTRPCRouter({
organizationId: z.string(),
name: z.string(),
logo: z.string().optional(),
+ defaultRole: z.string().min(1).nullable().optional(),
}),
)
.mutation(async ({ ctx, input }) => {
@@ -170,11 +175,47 @@ export const organizationRouter = createTRPCRouter({
});
}
+ if (input.defaultRole !== undefined && input.defaultRole !== null) {
+ if (input.defaultRole === "owner") {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message: "Cannot set owner as the default role",
+ });
+ }
+
+ if (!["admin", "member"].includes(input.defaultRole)) {
+ const customRole = await db.query.organizationRole.findFirst({
+ where: and(
+ eq(organizationRole.organizationId, input.organizationId),
+ eq(organizationRole.role, input.defaultRole),
+ ),
+ });
+
+ if (!customRole) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: `Role "${input.defaultRole}" not found`,
+ });
+ }
+
+ if (!(await hasValidLicense(input.organizationId))) {
+ throw new TRPCError({
+ code: "FORBIDDEN",
+ message:
+ "Setting a custom role as default requires a valid enterprise license",
+ });
+ }
+ }
+ }
+
const result = await db
.update(organization)
.set({
name: input.name,
logo: input.logo,
+ ...(input.defaultRole !== undefined && {
+ defaultRole: input.defaultRole,
+ }),
})
.where(eq(organization.id, input.organizationId))
.returning();
diff --git a/apps/dokploy/server/api/routers/proprietary/custom-role.ts b/apps/dokploy/server/api/routers/proprietary/custom-role.ts
index ed97a25c0..9f3b1e85d 100644
--- a/apps/dokploy/server/api/routers/proprietary/custom-role.ts
+++ b/apps/dokploy/server/api/routers/proprietary/custom-role.ts
@@ -1,5 +1,10 @@
import { db } from "@dokploy/server/db";
-import { member, organizationRole, user } from "@dokploy/server/db/schema";
+import {
+ member,
+ organization,
+ organizationRole,
+ user,
+} from "@dokploy/server/db/schema";
import { statements } from "@dokploy/server/lib/access-control";
import { TRPCError } from "@trpc/server";
import { and, count, eq } from "drizzle-orm";
@@ -255,6 +260,16 @@ export const customRoleRouter = createTRPCRouter({
});
}
+ await db
+ .update(organization)
+ .set({ defaultRole: null })
+ .where(
+ and(
+ eq(organization.id, ctx.session.activeOrganizationId),
+ eq(organization.defaultRole, input.roleName),
+ ),
+ );
+
await audit(ctx, {
action: "delete",
resourceType: "customRole",
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..771c52adf 100644
--- a/apps/dokploy/server/api/routers/swarm.ts
+++ b/apps/dokploy/server/api/routers/swarm.ts
@@ -12,30 +12,57 @@ import { createTRPCRouter, withPermission } from "../trpc";
import { containerIdRegex } from "./docker";
export const swarmRouter = createTRPCRouter({
- getNodes: withPermission("server", "read")
+ getNodes: withPermission("docker", "read")
.input(
z.object({
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")
+ getNodeInfo: withPermission("docker", "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")
+ getNodeApps: withPermission("docker", "read")
.input(
z.object({
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")
+ getAppInfos: withPermission("docker", "read")
.meta({
openapi: {
path: "/drop-deployment",
@@ -54,10 +81,19 @@ 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")
+ getContainerStats: withPermission("docker", "read")
.input(
z.object({
serverId: z.string().optional(),
diff --git a/apps/dokploy/server/api/routers/user.ts b/apps/dokploy/server/api/routers/user.ts
index e8a8508ad..b1ed52796 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,
@@ -173,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..016513952 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;
@@ -132,6 +132,10 @@
}
}
+body[data-scroll-locked] [data-slot="sidebar-inset"] {
+ overflow: hidden !important;
+}
+
@utility no-scrollbar {
/* Chrome, Safari and Opera */
&::-webkit-scrollbar {
@@ -269,6 +273,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/tsconfig.json b/apps/dokploy/tsconfig.json
index de0d647d2..89b6c0e56 100644
--- a/apps/dokploy/tsconfig.json
+++ b/apps/dokploy/tsconfig.json
@@ -25,7 +25,6 @@
],
"incremental": true,
/* Path Aliases */
- "baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@dokploy/server/*": ["../../packages/server/src/*"]
diff --git a/apps/dokploy/tsconfig.server.json b/apps/dokploy/tsconfig.server.json
index 6a8f562f9..1badc8c5c 100644
--- a/apps/dokploy/tsconfig.server.json
+++ b/apps/dokploy/tsconfig.server.json
@@ -6,8 +6,7 @@
"target": "ESNext",
"isolatedModules": false,
"noEmit": false,
- "moduleResolution": "Node",
- "baseUrl": ".",
+ "moduleResolution": "bundler",
"paths": {
"@/*": ["./*"],
"@dokploy/server/*": ["../../packages/server/src/*"]
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/package.json b/apps/schedules/package.json
index 3fe19803d..bd3ae0e95 100644
--- a/apps/schedules/package.json
+++ b/apps/schedules/package.json
@@ -28,7 +28,7 @@
"@types/react": "^19.2.0",
"@types/react-dom": "^19.2.0",
"tsx": "^4.22.4",
- "typescript": "^5.8.3"
+ "typescript": "^7.0.2"
},
"packageManager": "pnpm@10.22.0",
"engines": {
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/apps/schedules/tsconfig.build.json b/apps/schedules/tsconfig.build.json
index c3b5c9b27..fe31ecdec 100644
--- a/apps/schedules/tsconfig.build.json
+++ b/apps/schedules/tsconfig.build.json
@@ -2,6 +2,7 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
+ "outDir": "dist",
"paths": {}
},
"include": ["src/**/*"]
diff --git a/apps/schedules/tsconfig.json b/apps/schedules/tsconfig.json
index 2aad20dbc..14ceab2b6 100644
--- a/apps/schedules/tsconfig.json
+++ b/apps/schedules/tsconfig.json
@@ -5,10 +5,8 @@
"moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
- "outDir": "dist",
"jsx": "react-jsx",
"declaration": false,
- "baseUrl": ".",
"paths": {
"@dokploy/server/*": ["../../packages/server/src/*"]
}
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..abc10d8c7 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -37,7 +37,10 @@
"@ai-sdk/mistral": "^3.0.20",
"@ai-sdk/openai": "^3.0.29",
"@ai-sdk/openai-compatible": "^2.0.30",
+ "@aws-sdk/client-route-53": "^3.1108.0",
+ "@aws-sdk/client-secrets-manager": "^3.1108.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",
@@ -110,7 +113,7 @@
"tailwindcss": "^3.4.17",
"tsc-alias": "1.8.10",
"tsx": "^4.22.4",
- "typescript": "^5.8.3"
+ "typescript": "^7.0.2"
},
"packageManager": "pnpm@10.22.0",
"engines": {
diff --git a/packages/server/src/db/schema/account.ts b/packages/server/src/db/schema/account.ts
index 0ab543177..385da3f31 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";
@@ -65,6 +66,7 @@ export const organization = pgTable("organization", {
logo: text("logo"),
createdAt: timestamp("created_at").notNull(),
metadata: text("metadata"),
+ defaultRole: text("default_role"),
ownerId: text("owner_id")
.notNull()
.references(() => user.id, { onDelete: "cascade" }),
@@ -108,6 +110,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 +224,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..def6c3445 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(),
@@ -392,6 +398,7 @@ export const apiCreateApplication = createSchema.pick({
description: true,
environmentId: true,
serverId: true,
+ sourceType: true,
});
export const apiFindOneApplication = z.object({
diff --git a/packages/server/src/db/schema/audit-log.ts b/packages/server/src/db/schema/audit-log.ts
index 2b08bde63..a1cec1910 100644
--- a/packages/server/src/db/schema/audit-log.ts
+++ b/packages/server/src/db/schema/audit-log.ts
@@ -91,4 +91,7 @@ export type AuditResourceType =
| "cluster"
| "mount"
| "application"
- | "compose";
+ | "compose"
+ | "network"
+ | "vaultProvider"
+ | "dnsProvider";
diff --git a/packages/server/src/db/schema/compose.ts b/packages/server/src/db/schema/compose.ts
index 958da428c..db7052dc2 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({
@@ -184,6 +217,7 @@ export const apiCreateCompose = createSchema.pick({
appName: true,
serverId: true,
composeFile: true,
+ sourceType: true,
});
export const apiCreateComposeByTemplate = createSchema
@@ -235,7 +269,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/dns-provider.ts b/packages/server/src/db/schema/dns-provider.ts
new file mode 100644
index 000000000..50677e646
--- /dev/null
+++ b/packages/server/src/db/schema/dns-provider.ts
@@ -0,0 +1,121 @@
+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 dnsProviderType = pgEnum("DnsProviderType", [
+ "cloudflare",
+ "route53",
+]);
+
+export const cloudflareDnsConfigSchema = z.object({
+ providerType: z.literal("cloudflare"),
+ apiToken: z.string().trim().min(1),
+});
+
+export const route53DnsConfigSchema = z.object({
+ providerType: z.literal("route53"),
+ accessKeyId: z.string().trim().min(1),
+ secretAccessKey: z.string().trim().min(1),
+});
+
+export const dnsProviderConfigSchema = z.discriminatedUnion("providerType", [
+ cloudflareDnsConfigSchema,
+ route53DnsConfigSchema,
+]);
+
+export type DnsProviderConfig = z.infer;
+
+export const dnsProvider = pgTable(
+ "dns_provider",
+ {
+ dnsProviderId: text("dnsProviderId")
+ .notNull()
+ .primaryKey()
+ .$defaultFn(() => nanoid()),
+ name: text("name").notNull(),
+ providerType: dnsProviderType("providerType").notNull(),
+ config: jsonb("config").$type().notNull(),
+ organizationId: text("organizationId")
+ .notNull()
+ .references(() => organization.id, { onDelete: "cascade" }),
+ createdAt: text("createdAt")
+ .notNull()
+ .$defaultFn(() => new Date().toISOString()),
+ },
+ (table) => [
+ uniqueIndex("dns_provider_org_name_idx").on(
+ table.organizationId,
+ table.name,
+ ),
+ ],
+);
+
+const dnsProviderNameSchema = z
+ .string()
+ .min(1)
+ .max(64)
+ .regex(
+ /^[a-zA-Z0-9_-]+$/,
+ "Name can only contain letters, numbers, dashes and underscores",
+ );
+
+const createSchema = createInsertSchema(dnsProvider);
+
+export const apiCreateDnsProvider = createSchema.pick({}).extend({
+ name: dnsProviderNameSchema,
+ config: dnsProviderConfigSchema,
+});
+
+export const apiUpdateDnsProvider = createSchema.pick({}).extend({
+ dnsProviderId: z.string().min(1),
+ name: dnsProviderNameSchema,
+ config: dnsProviderConfigSchema,
+});
+
+export const apiFindOneDnsProvider = z.object({
+ dnsProviderId: z.string().min(1),
+});
+
+export const apiRemoveDnsProvider = z.object({
+ dnsProviderId: z.string().min(1),
+});
+
+export const apiTestDnsProvider = z.object({
+ dnsProviderId: z.string().min(1).optional(),
+ config: dnsProviderConfigSchema.optional(),
+});
+
+export const apiListDnsZones = z.object({
+ dnsProviderId: z.string().min(1),
+});
+
+export const apiListDnsRecords = z.object({
+ dnsProviderId: z.string().min(1),
+ zoneId: z.string().min(1),
+});
+
+const dnsRecordFieldsSchema = z.object({
+ type: z.enum(["A", "CNAME"]),
+ name: z.string().min(1),
+ content: z.string().min(1),
+ ttl: z.number().int().positive().optional(),
+});
+
+export const apiCreateDnsRecord = dnsRecordFieldsSchema.extend({
+ dnsProviderId: z.string().min(1),
+ zoneId: z.string().min(1),
+});
+
+export const apiUpdateDnsRecord = dnsRecordFieldsSchema.extend({
+ dnsProviderId: z.string().min(1),
+ zoneId: z.string().min(1),
+ recordId: z.string().min(1),
+});
+
+export const apiDeleteDnsRecord = z.object({
+ dnsProviderId: z.string().min(1),
+ zoneId: z.string().min(1),
+ recordId: z.string().min(1),
+});
diff --git a/packages/server/src/db/schema/domain.ts b/packages/server/src/db/schema/domain.ts
index 092275fde..54a0a5851 100644
--- a/packages/server/src/db/schema/domain.ts
+++ b/packages/server/src/db/schema/domain.ts
@@ -56,6 +56,7 @@ export const domains = pgTable("domain", {
stripPath: boolean("stripPath").notNull().default(false),
middlewares: text("middlewares").array().default(sql`ARRAY[]::text[]`),
forwardAuthEnabled: boolean("forwardAuthEnabled").notNull().default(false),
+ enabled: boolean("enabled").notNull().default(true),
});
export const domainsRelations = relations(domains, ({ one }) => ({
@@ -129,5 +130,6 @@ export const apiUpdateDomain = createSchema
stripPath: true,
middlewares: true,
forwardAuthEnabled: true,
+ enabled: true,
})
.merge(createSchema.pick({ domainId: true }).required());
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..fea834201 100644
--- a/packages/server/src/db/schema/index.ts
+++ b/packages/server/src/db/schema/index.ts
@@ -8,6 +8,7 @@ export * from "./certificate";
export * from "./compose";
export * from "./deployment";
export * from "./destination";
+export * from "./dns-provider";
export * from "./domain";
export * from "./environment";
export * from "./forward-auth";
@@ -20,6 +21,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 +43,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..5e91a72d1 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({
@@ -196,6 +202,7 @@ export const apiUpdateMongo = createSchema
.extend({
mongoId: z.string().min(1),
dockerImage: z.string().optional(),
+ replicaSets: z.boolean().optional(),
})
.omit({ serverId: true });
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..74ff3defa
--- /dev/null
+++ b/packages/server/src/db/schema/vault-provider.ts
@@ -0,0 +1,155 @@
+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",
+ "scaleway",
+]);
+
+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 scalewayVaultConfigSchema = z.object({
+ providerType: z.literal("scaleway"),
+ region: z.string().min(1).default("fr-par"),
+ projectId: z.string().min(1),
+ secretKey: z.string().min(1),
+ apiUrl: z.string().url().default("https://api.scaleway.com"),
+});
+
+export const vaultProviderConfigSchema = z.discriminatedUnion("providerType", [
+ hashicorpVaultConfigSchema,
+ infisicalVaultConfigSchema,
+ awsVaultConfigSchema,
+ dopplerVaultConfigSchema,
+ azureVaultConfigSchema,
+ scalewayVaultConfigSchema,
+]);
+
+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/emails/emails/server-threshold.tsx b/packages/server/src/emails/emails/server-threshold.tsx
new file mode 100644
index 000000000..9a12f2296
--- /dev/null
+++ b/packages/server/src/emails/emails/server-threshold.tsx
@@ -0,0 +1,91 @@
+import {
+ Body,
+ Container,
+ Head,
+ Heading,
+ Html,
+ Img,
+ Preview,
+ Section,
+ Tailwind,
+ Text,
+} from "@react-email/components";
+import { emailTailwindConfig } from "../tailwind-config";
+
+export type TemplateProps = {
+ serverName: string;
+ type: "CPU" | "Memory";
+ value: string;
+ threshold: string;
+ message: string;
+ date: string;
+};
+
+export const ServerThresholdEmail = ({
+ serverName = "my-server",
+ type = "CPU",
+ value = "95.00",
+ threshold = "90.00",
+ message = "Resource usage exceeded the configured threshold",
+ date = "2023-05-01T00:00:00.000Z",
+}: TemplateProps) => {
+ const previewText = `Server ${type} alert for ${serverName} ⚠️`;
+ return (
+
+ {previewText}
+
+
+
+
+
+
+
+
+
+ ⚠️ Server {type} alert for {serverName}
+
+
+ Hello,
+
+
+ The {type} usage on {serverName} exceeded the
+ configured threshold.
+
+
+ Details:
+
+ Server Name: {serverName}
+
+
+ Type: {type}
+
+
+ Current Value: {value}%
+
+
+ Threshold: {threshold}%
+
+
+ Date: {date}
+
+
+
+
+
+
+
+ );
+};
+
+export default ServerThresholdEmail;
diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts
index 165e1667e..b2a0c7f12 100644
--- a/packages/server/src/index.ts
+++ b/packages/server/src/index.ts
@@ -16,7 +16,10 @@ export * from "./services/cluster";
export * from "./services/compose";
export * from "./services/deployment";
export * from "./services/destination";
+export * from "./services/dns-provider";
export * from "./services/docker";
+export * from "./services/docker-image";
+export * from "./services/docker-volume";
export * from "./services/domain";
export * from "./services/environment";
export * from "./services/git-provider";
@@ -28,6 +31,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 +53,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";
@@ -137,6 +141,7 @@ export * from "./utils/traefik/redirect";
export * from "./utils/traefik/security";
export * from "./utils/traefik/types";
export * from "./utils/traefik/web-server";
+export * from "./utils/vault";
export * from "./utils/volume-backups/index";
export * from "./utils/watch-paths/should-deploy";
export * from "./verification/send-verification-email";
diff --git a/packages/server/src/lib/access-control.ts b/packages/server/src/lib/access-control.ts
index 72a5a76af..1242e725f 100644
--- a/packages/server/src/lib/access-control.ts
+++ b/packages/server/src/lib/access-control.ts
@@ -48,6 +48,8 @@ export const statements = {
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
+ dnsProvider: ["read", "create", "update", "delete"],
} as const;
/**
@@ -74,6 +76,8 @@ export const enterpriseOnlyResources = new Set([
"logs",
"monitoring",
"auditLog",
+ "vaultProvider",
+ "dnsProvider",
]);
export const ac = createAccessControl(statements);
@@ -113,6 +117,8 @@ export const ownerRole = ac.newRole({
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
+ dnsProvider: ["read", "create", "update", "delete"],
});
/**
@@ -150,6 +156,8 @@ export const adminRole = ac.newRole({
logs: ["read"],
monitoring: ["read"],
auditLog: ["read"],
+ vaultProvider: ["read", "create", "update", "delete"],
+ dnsProvider: ["read", "create", "update", "delete"],
});
/**
@@ -192,4 +200,8 @@ export const memberRole = ac.newRole({
notification: [],
tag: ["read"],
auditLog: [],
+ // Members need provider/secret names for env editor autocomplete; values are never exposed
+ vaultProvider: ["read"],
+ // Members can see configured DNS providers to pick one when adding a domain
+ dnsProvider: ["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..49c7a2964 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";
@@ -17,6 +18,7 @@ import {
getUserByToken,
} from "../services/admin";
import { createAuditLog } from "../services/proprietary/audit-log";
+import { resolveOrganizationDefaultRole } from "../services/proprietary/license-key";
import {
getWebServerSettings,
updateWebServerSettings,
@@ -288,10 +290,13 @@ const createBetterAuth = () =>
message: "Provider not found",
});
}
+ const defaultRole = provider.organizationId
+ ? await resolveOrganizationDefaultRole(provider.organizationId)
+ : "member";
await db.insert(schema.member).values({
userId: user.id,
organizationId: provider?.organizationId || "",
- role: "member",
+ role: defaultRole,
createdAt: new Date(),
isDefault: true,
});
@@ -419,7 +424,7 @@ const createBetterAuth = () =>
enableMetadata: true,
references: "user",
}),
- sso(),
+ sso({ trustEmailVerified: true }),
scim({
beforeSCIMTokenGenerated: async ({ user }) => {
const dbUser = await db.query.user.findFirst({
@@ -435,6 +440,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..fd61fc106 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,
},
});
@@ -444,6 +453,19 @@ export const createDeploymentSchedule = async (
schedule.compose?.serverId ||
schedule.server?.serverId;
await removeLastTenDeployments(deployment.scheduleId, "schedule", serverId);
+ await db
+ .update(deployments)
+ .set({
+ status: "error",
+ errorMessage: "Superseded by a new run of this schedule.",
+ finishedAt: new Date().toISOString(),
+ })
+ .where(
+ and(
+ eq(deployments.scheduleId, deployment.scheduleId),
+ eq(deployments.status, "running"),
+ ),
+ );
try {
const { SCHEDULES_PATH } = paths(!!serverId);
const formattedDateTime = format(new Date(), "yyyy-MM-dd:HH:mm:ss");
@@ -793,7 +815,7 @@ export const findAllDeploymentsByComposeId = async (composeId: string) => {
const centralizedDeploymentsWith = {
application: {
- columns: { applicationId: true, name: true, appName: true },
+ columns: { applicationId: true, name: true, appName: true, icon: true },
with: {
environment: {
columns: { environmentId: true, name: true },
@@ -812,7 +834,7 @@ const centralizedDeploymentsWith = {
},
},
compose: {
- columns: { composeId: true, name: true, appName: true },
+ columns: { composeId: true, name: true, appName: true, icon: true },
with: {
environment: {
columns: { environmentId: true, name: true },
diff --git a/packages/server/src/services/dns-provider.ts b/packages/server/src/services/dns-provider.ts
new file mode 100644
index 000000000..a6517b9b5
--- /dev/null
+++ b/packages/server/src/services/dns-provider.ts
@@ -0,0 +1,278 @@
+import { db } from "@dokploy/server/db";
+import {
+ type apiCreateDnsProvider,
+ type DnsProviderConfig,
+ dnsProvider,
+} from "@dokploy/server/db/schema";
+import type { DnsRecordInput } from "@dokploy/server/utils/dns";
+import { getDnsClient } from "@dokploy/server/utils/dns";
+import { TRPCError } from "@trpc/server";
+import { eq } from "drizzle-orm";
+import type { z } from "zod";
+
+export type DnsProvider = typeof dnsProvider.$inferSelect;
+
+export const DNS_SECRET_MASK = "********";
+
+const SENSITIVE_FIELDS: Record = {
+ cloudflare: ["apiToken"],
+ route53: ["secretAccessKey"],
+};
+
+export const maskDnsProviderConfig = (
+ config: DnsProviderConfig,
+): DnsProviderConfig => {
+ const masked: Record = { ...config };
+ for (const field of SENSITIVE_FIELDS[config.providerType]) {
+ if (masked[field]) {
+ masked[field] = DNS_SECRET_MASK;
+ }
+ }
+ return masked as DnsProviderConfig;
+};
+
+export const mergeDnsProviderConfig = (
+ incoming: DnsProviderConfig,
+ existing: DnsProviderConfig,
+): DnsProviderConfig => {
+ const merged: Record = { ...incoming };
+ for (const field of SENSITIVE_FIELDS[incoming.providerType]) {
+ if (merged[field] === DNS_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 DnsProviderConfig;
+};
+
+const isUniqueNameViolation = (error: unknown) =>
+ error instanceof Error && error.message.includes("dns_provider_org_name_idx");
+
+export const createDnsProvider = async (
+ input: z.infer,
+ organizationId: string,
+) => {
+ try {
+ const newProvider = await db
+ .insert(dnsProvider)
+ .values({
+ name: input.name,
+ providerType: input.config.providerType,
+ config: input.config,
+ organizationId,
+ })
+ .returning()
+ .then((value) => value[0]);
+
+ if (!newProvider) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error creating the DNS provider",
+ });
+ }
+ return newProvider;
+ } catch (error) {
+ if (isUniqueNameViolation(error)) {
+ throw new TRPCError({
+ code: "CONFLICT",
+ message: `A DNS provider named "${input.name}" already exists in this organization`,
+ });
+ }
+ throw error;
+ }
+};
+
+export const findDnsProviderById = async (dnsProviderId: string) => {
+ const provider = await db.query.dnsProvider.findFirst({
+ where: eq(dnsProvider.dnsProviderId, dnsProviderId),
+ });
+ if (!provider) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "DNS provider not found",
+ });
+ }
+ return provider;
+};
+
+export const findDnsProviderInOrganization = async (
+ dnsProviderId: string,
+ organizationId: string,
+) => {
+ const provider = await findDnsProviderById(dnsProviderId);
+ if (provider.organizationId !== organizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not allowed to access this DNS provider",
+ });
+ }
+ return provider;
+};
+
+export const findDnsProvidersByOrganizationId = async (
+ organizationId: string,
+) => {
+ return await db.query.dnsProvider.findMany({
+ where: eq(dnsProvider.organizationId, organizationId),
+ orderBy: (providers, { asc }) => [asc(providers.name)],
+ });
+};
+
+export const updateDnsProvider = async (
+ dnsProviderId: string,
+ name: string,
+ config: DnsProviderConfig,
+) => {
+ const existing = await findDnsProviderById(dnsProviderId);
+ const mergedConfig = mergeDnsProviderConfig(config, existing.config);
+
+ try {
+ const updated = await db
+ .update(dnsProvider)
+ .set({
+ name,
+ providerType: mergedConfig.providerType,
+ config: mergedConfig,
+ })
+ .where(eq(dnsProvider.dnsProviderId, dnsProviderId))
+ .returning()
+ .then((res) => res[0]);
+
+ if (!updated) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error updating the DNS provider",
+ });
+ }
+ return updated;
+ } catch (error) {
+ if (isUniqueNameViolation(error)) {
+ throw new TRPCError({
+ code: "CONFLICT",
+ message: `A DNS provider named "${name}" already exists in this organization`,
+ });
+ }
+ throw error;
+ }
+};
+
+export const removeDnsProvider = async (dnsProviderId: string) => {
+ const removed = await db
+ .delete(dnsProvider)
+ .where(eq(dnsProvider.dnsProviderId, dnsProviderId))
+ .returning()
+ .then((res) => res[0]);
+
+ if (!removed) {
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "DNS provider not found",
+ });
+ }
+ return removed;
+};
+
+export const testDnsProviderConnection = async (config: DnsProviderConfig) => {
+ const client = getDnsClient(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 DNS provider",
+ });
+ }
+};
+
+export const listDnsProviderZones = async (config: DnsProviderConfig) => {
+ const client = getDnsClient(config.providerType);
+ try {
+ return await client.listZones(config);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Error listing zones for this DNS provider",
+ });
+ }
+};
+
+export const listDnsProviderRecords = async (
+ config: DnsProviderConfig,
+ zoneId: string,
+) => {
+ const client = getDnsClient(config.providerType);
+ try {
+ return await client.listRecords(config, zoneId);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error
+ ? error.message
+ : "Error listing records for this zone",
+ });
+ }
+};
+
+export const createDnsProviderRecord = async (
+ config: DnsProviderConfig,
+ record: DnsRecordInput,
+) => {
+ const client = getDnsClient(config.providerType);
+ try {
+ return await client.upsertRecord(config, record);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error ? error.message : "Error creating the record",
+ });
+ }
+};
+
+export const updateDnsProviderRecord = async (
+ config: DnsProviderConfig,
+ zoneId: string,
+ recordId: string,
+ record: Omit,
+) => {
+ const client = getDnsClient(config.providerType);
+ try {
+ return await client.updateRecord(config, zoneId, recordId, record);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error ? error.message : "Error updating the record",
+ });
+ }
+};
+
+export const deleteDnsProviderRecord = async (
+ config: DnsProviderConfig,
+ zoneId: string,
+ recordId: string,
+) => {
+ const client = getDnsClient(config.providerType);
+ try {
+ await client.deleteRecord(config, zoneId, recordId);
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message:
+ error instanceof Error ? error.message : "Error deleting the record",
+ });
+ }
+};
diff --git a/packages/server/src/services/docker-image.ts b/packages/server/src/services/docker-image.ts
new file mode 100644
index 000000000..ca6ef6282
--- /dev/null
+++ b/packages/server/src/services/docker-image.ts
@@ -0,0 +1,68 @@
+import {
+ execAsync,
+ execAsyncRemote,
+} from "@dokploy/server/utils/process/execAsync";
+import { quote } from "shell-quote";
+
+export interface DockerImage {
+ Repository: string;
+ Tag: string;
+ ID: string;
+ Digest?: string;
+ CreatedAt: string;
+ CreatedSince: string;
+ Size: string;
+ SharedSize?: string;
+ UniqueSize?: string;
+ VirtualSize?: string;
+}
+
+export const getImages = async (serverId?: string) => {
+ try {
+ const command = "docker images --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 DockerImage);
+ } catch (error) {
+ console.error(error);
+ return [];
+ }
+};
+
+export const getImageConfig = async (imageRef: string, serverId?: string) => {
+ const command = `docker image inspect ${quote([String(imageRef ?? "")])}`;
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
+
+ return JSON.parse(stdout.trim())[0];
+};
+
+interface RemoveImageParams {
+ repository: string;
+ tag: string;
+ id: string;
+ force?: boolean;
+}
+
+export const removeImage = async (
+ { repository, tag, id, force }: RemoveImageParams,
+ serverId?: string,
+) => {
+ const hasTaggedReference =
+ repository && tag && repository !== "" && tag !== "";
+ const reference = hasTaggedReference ? `${repository}:${tag}` : id;
+ const command = `docker rmi ${force ? "-f " : ""}${quote([String(reference ?? "")])}`;
+
+ if (serverId) {
+ await execAsyncRemote(serverId, command);
+ } else {
+ await execAsync(command);
+ }
+};
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..65eb29041 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,167 @@ 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;
+ }
+};
+
+export interface DockerEvent {
+ Type?: string;
+ Action?: string;
+ Actor?: {
+ ID?: string;
+ Attributes?: Record;
+ };
+ time?: number;
+}
+
+export const getDockerEvents = async (
+ serverId?: string | null,
+ minutes = 15,
+) => {
+ const until = new Date();
+ const since = new Date(until.getTime() - minutes * 60 * 1000);
+ const command = `docker events --since ${quote([since.toISOString()])} --until ${quote([until.toISOString()])} --format '{{json .}}'`;
+
+ let stdout = "";
+ let stderr = "";
+ if (serverId) {
+ const result = await execAsyncRemote(serverId, command);
+ stdout = result.stdout;
+ stderr = result.stderr;
+ } else {
+ const result = await execAsync(command);
+ stdout = result.stdout;
+ stderr = result.stderr;
+ }
+
+ if (stderr) {
+ console.error(`Error: ${stderr}`);
+ }
+
+ const events: DockerEvent[] = stdout
+ .trim()
+ .split("\n")
+ .filter(Boolean)
+ .map((line) => {
+ try {
+ return JSON.parse(line) as DockerEvent;
+ } catch {
+ return null;
+ }
+ })
+ .filter((event): event is DockerEvent => event !== null)
+ .reverse();
+
+ return {
+ events,
+ fetchedAt: until.toISOString(),
+ };
+};
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/proprietary/license-key.ts b/packages/server/src/services/proprietary/license-key.ts
index 69976ca8c..38d53fe33 100644
--- a/packages/server/src/services/proprietary/license-key.ts
+++ b/packages/server/src/services/proprietary/license-key.ts
@@ -1,6 +1,10 @@
import { db } from "@dokploy/server/db";
-import { user } from "@dokploy/server/db/schema";
-import { eq } from "drizzle-orm";
+import {
+ organization,
+ organizationRole,
+ user,
+} from "@dokploy/server/db/schema";
+import { and, eq } from "drizzle-orm";
import { getOrganizationOwnerId } from "./sso";
export const hasValidLicense = async (organizationId: string) => {
@@ -22,3 +26,35 @@ export const hasValidLicense = async (organizationId: string) => {
currentUser?.isValidEnterpriseLicense
);
};
+
+export const resolveOrganizationDefaultRole = async (
+ organizationId: string,
+) => {
+ const org = await db.query.organization.findFirst({
+ where: eq(organization.id, organizationId),
+ columns: { defaultRole: true },
+ });
+ const defaultRole = org?.defaultRole;
+
+ if (!defaultRole || defaultRole === "owner") {
+ return "member";
+ }
+
+ if (defaultRole === "admin" || defaultRole === "member") {
+ return defaultRole;
+ }
+
+ const customRole = await db.query.organizationRole.findFirst({
+ where: and(
+ eq(organizationRole.organizationId, organizationId),
+ eq(organizationRole.role, defaultRole),
+ ),
+ columns: { id: true },
+ });
+
+ if (!customRole || !(await hasValidLicense(organizationId))) {
+ return "member";
+ }
+
+ return defaultRole;
+};
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..bc0aed09d
--- /dev/null
+++ b/packages/server/src/services/vault-provider.ts
@@ -0,0 +1,255 @@
+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"],
+ scaleway: ["secretKey"],
+ };
+
+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/monitoring-setup.ts b/packages/server/src/setup/monitoring-setup.ts
index 287894c99..b2d3f6f4d 100644
--- a/packages/server/src/setup/monitoring-setup.ts
+++ b/packages/server/src/setup/monitoring-setup.ts
@@ -1,16 +1,13 @@
import { findServerById } from "@dokploy/server/services/server";
import { getWebServerSettings } from "@dokploy/server/services/web-server-settings";
-import type { ContainerCreateOptions } from "dockerode";
+import type { CreateServiceOptions } from "dockerode";
import { IS_CLOUD } from "../constants";
import { getDokployImageTag } from "../services/settings";
import { pullImage, pullRemoteImage } from "../utils/docker/utils";
import { execAsync, execAsyncRemote } from "../utils/process/execAsync";
import { getRemoteDocker } from "../utils/servers/remote-docker";
-export const setupMonitoring = async (serverId: string) => {
- const server = await findServerById(serverId);
-
- const containerName = "dokploy-monitoring";
+const getMonitoringImage = () => {
let imageName = "dokploy/monitoring:latest";
if (
@@ -21,134 +18,174 @@ export const setupMonitoring = async (serverId: string) => {
imageName = "dokploy/monitoring:canary";
}
- const settings: ContainerCreateOptions = {
- name: containerName,
- Env: [`METRICS_CONFIG=${JSON.stringify(server?.metricsConfig)}`],
- Image: imageName,
- HostConfig: {
- // Memory: 100 * 1024 * 1024, // 100MB en bytes
- // PidMode: "host",
- // CapAdd: ["NET_ADMIN", "SYS_ADMIN"],
- // Privileged: true,
- RestartPolicy: {
- Name: "always",
+ return imageName;
+};
+
+const deployMonitoringService = async (
+ docker: Awaited>,
+ serviceName: string,
+ settings: CreateServiceOptions,
+) => {
+ try {
+ const service = docker.getService(serviceName);
+ const inspect = await service.inspect();
+ await service.update({
+ version: Number.parseInt(inspect.Version.Index),
+ ...settings,
+ TaskTemplate: {
+ ...settings.TaskTemplate,
+ ForceUpdate: (inspect.Spec.TaskTemplate.ForceUpdate ?? 0) + 1,
},
- PortBindings: {
- [`${server.metricsConfig.server.port}/tcp`]: [
+ });
+ console.log("Monitoring Updated ✅");
+ } catch (error: any) {
+ if (error?.statusCode && error.statusCode !== 404) {
+ throw error;
+ }
+ await docker.createService(settings);
+ console.log("Monitoring Started ✅");
+ }
+};
+
+export const setupMonitoring = async (serverId: string) => {
+ const server = await findServerById(serverId);
+
+ const serviceName = "dokploy-monitoring";
+ const imageName = getMonitoringImage();
+
+ const settings: CreateServiceOptions = {
+ Name: serviceName,
+ TaskTemplate: {
+ ContainerSpec: {
+ Image: imageName,
+ Env: [`METRICS_CONFIG=${JSON.stringify(server?.metricsConfig)}`],
+ Mounts: [
{
- HostPort: server.metricsConfig.server.port.toString(),
+ Type: "bind",
+ Source: "/var/run/docker.sock",
+ Target: "/var/run/docker.sock",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/sys",
+ Target: "/host/sys",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/etc/os-release",
+ Target: "/etc/os-release",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/proc",
+ Target: "/host/proc",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/etc/dokploy/monitoring/monitoring.db",
+ Target: "/app/monitoring.db",
},
],
},
- Binds: [
- "/var/run/docker.sock:/var/run/docker.sock:ro",
- "/sys:/host/sys:ro",
- "/etc/os-release:/etc/os-release:ro",
- "/proc:/host/proc:ro",
- "/etc/dokploy/monitoring/monitoring.db:/app/monitoring.db",
- ],
- NetworkMode: "host",
+ Networks: [{ Target: "host" }],
+ Placement: {
+ Constraints: ["node.role==manager"],
+ },
},
- ExposedPorts: {
- [`${server.metricsConfig.server.port}/tcp`]: {},
+ Mode: {
+ Replicated: {
+ Replicas: 1,
+ },
},
};
+
const docker = await getRemoteDocker(serverId);
- try {
- await execAsyncRemote(
- serverId,
- "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db",
- );
- if (serverId) {
- await pullRemoteImage(imageName, serverId);
- }
- // Check if container exists
- const container = docker.getContainer(containerName);
- try {
- await container.inspect();
- await container.remove({ force: true });
- console.log("Removed existing container");
- } catch {
- // Container doesn't exist, continue
- }
-
- await docker.createContainer(settings);
- const newContainer = docker.getContainer(containerName);
- await newContainer.start();
-
- console.log("Monitoring Started ");
- } catch (error) {
- console.log("Monitoring Not Found: Starting ", error);
- }
+ await execAsyncRemote(
+ serverId,
+ "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db",
+ );
+ await pullRemoteImage(imageName, serverId);
+ await deployMonitoringService(docker, serviceName, settings);
};
export const setupWebMonitoring = async () => {
const webServerSettings = await getWebServerSettings();
- const containerName = "dokploy-monitoring";
- let imageName = "dokploy/monitoring:latest";
+ const serviceName = "dokploy-monitoring";
+ const imageName = getMonitoringImage();
+ const port = webServerSettings?.metricsConfig?.server?.port;
- if (
- (getDokployImageTag() !== "latest" ||
- process.env.NODE_ENV === "development") &&
- !IS_CLOUD
- ) {
- imageName = "dokploy/monitoring:canary";
- }
-
- const settings: ContainerCreateOptions = {
- name: containerName,
- Env: [`METRICS_CONFIG=${JSON.stringify(webServerSettings?.metricsConfig)}`],
- Image: imageName,
- HostConfig: {
- // Memory: 100 * 1024 * 1024, // 100MB en bytes
- // PidMode: "host",
- // CapAdd: ["NET_ADMIN", "SYS_ADMIN"],
- // Privileged: true,
- RestartPolicy: {
- Name: "always",
- },
- PortBindings: {
- [`${webServerSettings?.metricsConfig?.server?.port}/tcp`]: [
+ const settings: CreateServiceOptions = {
+ Name: serviceName,
+ TaskTemplate: {
+ ContainerSpec: {
+ Image: imageName,
+ Env: [
+ `METRICS_CONFIG=${JSON.stringify(webServerSettings?.metricsConfig)}`,
+ ],
+ Mounts: [
{
- HostPort: webServerSettings?.metricsConfig?.server?.port.toString(),
+ Type: "bind",
+ Source: "/var/run/docker.sock",
+ Target: "/var/run/docker.sock",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/sys",
+ Target: "/host/sys",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/etc/os-release",
+ Target: "/etc/os-release",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/proc",
+ Target: "/host/proc",
+ ReadOnly: true,
+ },
+ {
+ Type: "bind",
+ Source: "/etc/dokploy/monitoring/monitoring.db",
+ Target: "/app/monitoring.db",
},
],
},
- Binds: [
- "/var/run/docker.sock:/var/run/docker.sock:ro",
- "/sys:/host/sys:ro",
- "/etc/os-release:/etc/os-release:ro",
- "/proc:/host/proc:ro",
- "/etc/dokploy/monitoring/monitoring.db:/app/monitoring.db",
- ],
- // NetworkMode: "host",
+ Placement: {
+ Constraints: ["node.role==manager"],
+ },
},
- ExposedPorts: {
- [`${webServerSettings?.metricsConfig?.server?.port}/tcp`]: {},
+ Mode: {
+ Replicated: {
+ Replicas: 1,
+ },
+ },
+ EndpointSpec: {
+ Ports: [
+ {
+ TargetPort: port,
+ PublishedPort: port,
+ Protocol: "tcp",
+ PublishMode: "host",
+ },
+ ],
},
};
+
const docker = await getRemoteDocker();
- try {
- await execAsync(
- "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db",
- );
- await pullImage(imageName);
- const container = docker.getContainer(containerName);
- try {
- await container.inspect();
- await container.remove({ force: true });
- console.log("Removed existing container");
- } catch {}
-
- await docker.createContainer(settings);
- const newContainer = docker.getContainer(containerName);
- await newContainer.start();
-
- console.log("Monitoring Started ");
- } catch (error) {
- console.log("Monitoring Not Found: Starting ", error);
- }
+ await execAsync(
+ "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db",
+ );
+ await pullImage(imageName);
+ await deployMonitoringService(docker, serviceName, settings);
};
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/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts
index 9fcebe540..17a9a284e 100644
--- a/packages/server/src/setup/traefik-setup.ts
+++ b/packages/server/src/setup/traefik-setup.ts
@@ -20,7 +20,7 @@ export const TRAEFIK_PORT =
Number.parseInt(process.env.TRAEFIK_PORT!, 10) || 80;
export const TRAEFIK_HTTP3_PORT =
Number.parseInt(process.env.TRAEFIK_HTTP3_PORT!, 10) || 443;
-export const TRAEFIK_VERSION = process.env.TRAEFIK_VERSION || "3.6.7";
+export const TRAEFIK_VERSION = process.env.TRAEFIK_VERSION || "3.6.25";
export interface TraefikOptions {
env?: string[];
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/templates/processors.ts b/packages/server/src/templates/processors.ts
index bd170e104..bfddafe08 100644
--- a/packages/server/src/templates/processors.ts
+++ b/packages/server/src/templates/processors.ts
@@ -136,7 +136,7 @@ export function processValue(
if (params.length === 1 && params[0] && params[0].match(/^\d{1,3}$/)) {
return generateJwt({ length: Number.parseInt(params[0], 10) });
}
- let [secret, payload] = params;
+ let [secret, payload] = params as [string?, string?];
if (typeof payload === "string" && variables[payload]) {
payload = variables[payload];
}
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/dns/cloudflare.ts b/packages/server/src/utils/dns/cloudflare.ts
new file mode 100644
index 000000000..9fedd00e5
--- /dev/null
+++ b/packages/server/src/utils/dns/cloudflare.ts
@@ -0,0 +1,143 @@
+import type { cloudflareDnsConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type DnsClient, dnsFetch } from "./types";
+
+type CloudflareConfig = z.infer;
+
+type CloudflareResponse = {
+ success: boolean;
+ errors: { code: number; message: string }[];
+ result: T;
+ result_info?: { page: number; per_page: number; total_pages: number };
+};
+
+const CLOUDFLARE_API = "https://api.cloudflare.com/client/v4";
+
+const cfFetch = async (
+ config: CloudflareConfig,
+ path: string,
+ init: RequestInit = {},
+): Promise => {
+ const response = await dnsFetch(`${CLOUDFLARE_API}${path}`, {
+ ...init,
+ headers: {
+ Authorization: `Bearer ${config.apiToken.trim()}`,
+ "Content-Type": "application/json",
+ ...init.headers,
+ },
+ });
+
+ const body = (await response.json()) as CloudflareResponse;
+ if (!response.ok || !body.success) {
+ const detail = body.errors?.map((e) => e.message).join(", ");
+ throw new Error(
+ `Cloudflare: request to ${path} failed${detail ? `: ${detail}` : ` (status ${response.status})`}`,
+ );
+ }
+ return body.result;
+};
+
+export const cloudflareClient: DnsClient = {
+ async listZones(config) {
+ const zones: { id: string; name: string }[] = [];
+ let page = 1;
+ while (true) {
+ const result = await cfFetch<{ id: string; name: string }[]>(
+ config,
+ `/zones?per_page=50&page=${page}`,
+ );
+ zones.push(...result.map((zone) => ({ id: zone.id, name: zone.name })));
+ if (result.length < 50) {
+ break;
+ }
+ page += 1;
+ }
+ return zones;
+ },
+
+ async listRecords(config, zoneId) {
+ const records: {
+ id: string;
+ type: string;
+ name: string;
+ content: string;
+ ttl: number;
+ }[] = [];
+ let page = 1;
+ while (true) {
+ const result = await cfFetch<
+ {
+ id: string;
+ type: string;
+ name: string;
+ content: string;
+ ttl: number;
+ }[]
+ >(config, `/zones/${zoneId}/dns_records?per_page=50&page=${page}`);
+ records.push(...result);
+ if (result.length < 50) {
+ break;
+ }
+ page += 1;
+ }
+ return records;
+ },
+
+ async upsertRecord(config, record) {
+ const existing = await cfFetch<{ id: string }[]>(
+ config,
+ `/zones/${record.zoneId}/dns_records?type=${record.type}&name=${encodeURIComponent(record.name)}`,
+ );
+
+ const payload = {
+ type: record.type,
+ name: record.name,
+ content: record.content,
+ ttl: record.ttl ?? 1,
+ };
+
+ const existingRecord = existing[0];
+ if (existingRecord) {
+ const updated = await cfFetch<{ id: string }>(
+ config,
+ `/zones/${record.zoneId}/dns_records/${existingRecord.id}`,
+ { method: "PUT", body: JSON.stringify(payload) },
+ );
+ return { id: updated.id };
+ }
+
+ const created = await cfFetch<{ id: string }>(
+ config,
+ `/zones/${record.zoneId}/dns_records`,
+ { method: "POST", body: JSON.stringify(payload) },
+ );
+ return { id: created.id };
+ },
+
+ async updateRecord(config, zoneId, recordId, record) {
+ const updated = await cfFetch<{ id: string }>(
+ config,
+ `/zones/${zoneId}/dns_records/${recordId}`,
+ {
+ method: "PUT",
+ body: JSON.stringify({
+ type: record.type,
+ name: record.name,
+ content: record.content,
+ ttl: record.ttl ?? 1,
+ }),
+ },
+ );
+ return { id: updated.id };
+ },
+
+ async deleteRecord(config, zoneId, recordId) {
+ await cfFetch(config, `/zones/${zoneId}/dns_records/${recordId}`, {
+ method: "DELETE",
+ });
+ },
+
+ async testConnection(config) {
+ await cfFetch(config, "/zones?per_page=1");
+ },
+};
diff --git a/packages/server/src/utils/dns/index.ts b/packages/server/src/utils/dns/index.ts
new file mode 100644
index 000000000..449eecdb5
--- /dev/null
+++ b/packages/server/src/utils/dns/index.ts
@@ -0,0 +1,14 @@
+import type { DnsProviderConfig } from "@dokploy/server/db/schema";
+import { cloudflareClient } from "./cloudflare";
+import { route53Client } from "./route53";
+import type { DnsClient } from "./types";
+
+const clients: Record = {
+ cloudflare: cloudflareClient as DnsClient,
+ route53: route53Client as DnsClient,
+};
+
+export const getDnsClient = (providerType: DnsProviderConfig["providerType"]) =>
+ clients[providerType];
+
+export * from "./types";
diff --git a/packages/server/src/utils/dns/route53.ts b/packages/server/src/utils/dns/route53.ts
new file mode 100644
index 000000000..112f56689
--- /dev/null
+++ b/packages/server/src/utils/dns/route53.ts
@@ -0,0 +1,215 @@
+import {
+ ChangeResourceRecordSetsCommand,
+ ListHostedZonesCommand,
+ ListResourceRecordSetsCommand,
+ type ResourceRecordSet,
+ Route53Client,
+} from "@aws-sdk/client-route-53";
+import type { route53DnsConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import type { DnsClient } from "./types";
+
+type Route53Config = z.infer;
+
+const createClient = (config: Route53Config) =>
+ new Route53Client({
+ region: "us-east-1",
+ credentials: {
+ accessKeyId: config.accessKeyId,
+ secretAccessKey: config.secretAccessKey,
+ },
+ });
+
+const stripTrailingDot = (name: string) => name.replace(/\.$/, "");
+const ensureTrailingDot = (name: string) =>
+ name.endsWith(".") ? name : `${name}.`;
+const stripZonePrefix = (id: string) => id.replace(/^\/hostedzone\//, "");
+
+const buildRecordId = (type: string, name: string) =>
+ `${type}:${stripTrailingDot(name)}`;
+
+const parseRecordId = (id: string) => {
+ const separatorIndex = id.indexOf(":");
+ if (separatorIndex === -1) {
+ throw new Error(`Invalid Route53 record id: "${id}"`);
+ }
+ return {
+ type: id.slice(0, separatorIndex),
+ name: id.slice(separatorIndex + 1),
+ };
+};
+
+const findExactRecordSet = async (
+ config: Route53Config,
+ zoneId: string,
+ type: string,
+ name: string,
+): Promise => {
+ const client = createClient(config);
+ const response = await client.send(
+ new ListResourceRecordSetsCommand({
+ HostedZoneId: zoneId,
+ StartRecordName: ensureTrailingDot(name),
+ StartRecordType: type as ResourceRecordSet["Type"],
+ MaxItems: 1,
+ }),
+ );
+ const candidate = response.ResourceRecordSets?.[0];
+ if (
+ candidate &&
+ candidate.Type === type &&
+ stripTrailingDot(candidate.Name ?? "") === stripTrailingDot(name)
+ ) {
+ return candidate;
+ }
+ return undefined;
+};
+
+const buildRecordSet = (record: {
+ type: "A" | "CNAME";
+ name: string;
+ content: string;
+ ttl?: number;
+}): ResourceRecordSet => ({
+ Name: ensureTrailingDot(record.name),
+ Type: record.type,
+ TTL: record.ttl ?? 300,
+ ResourceRecords: [{ Value: record.content }],
+});
+
+export const route53Client: DnsClient = {
+ async listZones(config) {
+ const client = createClient(config);
+ const zones: { id: string; name: string }[] = [];
+ let marker: string | undefined;
+ do {
+ const response = await client.send(
+ new ListHostedZonesCommand({ Marker: marker, MaxItems: 100 }),
+ );
+ for (const zone of response.HostedZones ?? []) {
+ if (zone.Id && zone.Name) {
+ zones.push({
+ id: stripZonePrefix(zone.Id),
+ name: stripTrailingDot(zone.Name),
+ });
+ }
+ }
+ marker = response.IsTruncated ? response.NextMarker : undefined;
+ } while (marker);
+ return zones;
+ },
+
+ async listRecords(config, zoneId) {
+ const client = createClient(config);
+ const records: {
+ id: string;
+ type: string;
+ name: string;
+ content: string;
+ ttl: number;
+ }[] = [];
+ let nextName: string | undefined;
+ let nextType: string | undefined;
+ do {
+ const response = await client.send(
+ new ListResourceRecordSetsCommand({
+ HostedZoneId: zoneId,
+ StartRecordName: nextName,
+ StartRecordType: nextType as ResourceRecordSet["Type"] | undefined,
+ }),
+ );
+ for (const set of response.ResourceRecordSets ?? []) {
+ if (!set.Name || !set.Type || !set.ResourceRecords?.length) {
+ continue;
+ }
+ records.push({
+ id: buildRecordId(set.Type, set.Name),
+ type: set.Type,
+ name: stripTrailingDot(set.Name),
+ content: set.ResourceRecords.map((r) => r.Value).join(", "),
+ ttl: set.TTL ?? 300,
+ });
+ }
+ nextName = response.IsTruncated ? response.NextRecordName : undefined;
+ nextType = response.IsTruncated ? response.NextRecordType : undefined;
+ } while (nextName);
+ return records;
+ },
+
+ async upsertRecord(config, record) {
+ const client = createClient(config);
+ await client.send(
+ new ChangeResourceRecordSetsCommand({
+ HostedZoneId: record.zoneId,
+ ChangeBatch: {
+ Changes: [
+ { Action: "UPSERT", ResourceRecordSet: buildRecordSet(record) },
+ ],
+ },
+ }),
+ );
+ return { id: buildRecordId(record.type, record.name) };
+ },
+
+ async updateRecord(config, zoneId, recordIdInput, record) {
+ const { type: oldType, name: oldName } = parseRecordId(recordIdInput);
+ const client = createClient(config);
+
+ const changes: {
+ Action: "DELETE" | "UPSERT";
+ ResourceRecordSet: ResourceRecordSet;
+ }[] = [];
+
+ const sameIdentity =
+ oldType === record.type &&
+ stripTrailingDot(oldName) === stripTrailingDot(record.name);
+
+ if (!sameIdentity) {
+ const existing = await findExactRecordSet(
+ config,
+ zoneId,
+ oldType,
+ oldName,
+ );
+ if (existing) {
+ changes.push({ Action: "DELETE", ResourceRecordSet: existing });
+ }
+ }
+
+ changes.push({
+ Action: "UPSERT",
+ ResourceRecordSet: buildRecordSet(record),
+ });
+
+ await client.send(
+ new ChangeResourceRecordSetsCommand({
+ HostedZoneId: zoneId,
+ ChangeBatch: { Changes: changes },
+ }),
+ );
+
+ return { id: buildRecordId(record.type, record.name) };
+ },
+
+ async deleteRecord(config, zoneId, recordIdInput) {
+ const { type, name } = parseRecordId(recordIdInput);
+ const existing = await findExactRecordSet(config, zoneId, type, name);
+ if (!existing) {
+ throw new Error(`Route53: record "${name}" (${type}) not found`);
+ }
+ const client = createClient(config);
+ await client.send(
+ new ChangeResourceRecordSetsCommand({
+ HostedZoneId: zoneId,
+ ChangeBatch: {
+ Changes: [{ Action: "DELETE", ResourceRecordSet: existing }],
+ },
+ }),
+ );
+ },
+
+ async testConnection(config) {
+ const client = createClient(config);
+ await client.send(new ListHostedZonesCommand({ MaxItems: 1 }));
+ },
+};
diff --git a/packages/server/src/utils/dns/types.ts b/packages/server/src/utils/dns/types.ts
new file mode 100644
index 000000000..c939c2230
--- /dev/null
+++ b/packages/server/src/utils/dns/types.ts
@@ -0,0 +1,45 @@
+import type { DnsProviderConfig } from "@dokploy/server/db/schema";
+
+export interface DnsZone {
+ id: string;
+ name: string;
+}
+
+export interface DnsRecordInput {
+ zoneId: string;
+ type: "A" | "CNAME";
+ name: string;
+ content: string;
+ ttl?: number;
+}
+
+export interface DnsRecord {
+ id: string;
+ type: string;
+ name: string;
+ content: string;
+ ttl: number;
+}
+
+export interface DnsClient {
+ listZones(config: C): Promise;
+ listRecords(config: C, zoneId: string): Promise;
+ upsertRecord(config: C, record: DnsRecordInput): Promise<{ id: string }>;
+ updateRecord(
+ config: C,
+ zoneId: string,
+ recordId: string,
+ record: Omit,
+ ): Promise<{ id: string }>;
+ deleteRecord(config: C, zoneId: string, recordId: string): Promise;
+ testConnection(config: C): Promise;
+}
+
+export const DNS_REQUEST_TIMEOUT_MS = 15_000;
+
+export const dnsFetch = async (url: string, init: RequestInit = {}) => {
+ return await fetch(url, {
+ ...init,
+ signal: AbortSignal.timeout(DNS_REQUEST_TIMEOUT_MS),
+ });
+};
diff --git a/packages/server/src/utils/docker/domain.ts b/packages/server/src/utils/docker/domain.ts
index 8094f1df2..0d83d4a48 100644
--- a/packages/server/src/utils/docker/domain.ts
+++ b/packages/server/src/utils/docker/domain.ts
@@ -1,8 +1,12 @@
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 { quote } from "shell-quote";
import { parse, stringify } from "yaml";
import { execAsyncRemote } from "../process/execAsync";
import { cloneBitbucketRepository } from "../providers/bitbucket";
@@ -125,12 +129,73 @@ exit 1;
const encodedContent = encodeBase64(composeString);
return `echo "${encodedContent}" | base64 -d > "${path}";`;
} catch (error) {
- // @ts-ignore
- return `echo "❌ Has occurred an error: ${error?.message || error}";
+ const message =
+ error instanceof Error ? error.message : String(error ?? "");
+ // The error message embeds user-controlled fields (e.g. serviceName) and is
+ // executed as part of the compose build shell script, so it must be escaped.
+ return `echo ${quote([`❌ Has occurred an error: ${message}`])};
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;
+ }
+};
+
+const removeDomainLabels = (
+ labels: DefinitionsService["labels"],
+ appName: string,
+ uniqueConfigKey: number,
+) => {
+ const prefixes = [
+ `traefik.http.routers.${appName}-${uniqueConfigKey}-`,
+ `traefik.http.services.${appName}-${uniqueConfigKey}-`,
+ `traefik.http.middlewares.stripprefix-${appName}-${uniqueConfigKey}.`,
+ `traefik.http.middlewares.addprefix-${appName}-${uniqueConfigKey}.`,
+ ];
+ const belongsToDomain = (label: string) =>
+ prefixes.some((prefix) => label.startsWith(prefix));
+
+ if (Array.isArray(labels)) {
+ return labels.filter((label) => !belongsToDomain(label));
+ }
+ if (labels) {
+ return Object.fromEntries(
+ Object.entries(labels).filter(([label]) => !belongsToDomain(label)),
+ );
+ }
+
+ return labels;
+};
+
export const addDomainToCompose = async (
compose: Compose,
domains: Domain[],
@@ -139,7 +204,11 @@ export const addDomainToCompose = async (
let result: ComposeSpecification | null;
- if (compose.serverId) {
+ if (compose.sourceType === "raw") {
+ result = parse(compose.composeFile, {
+ maxAliasCount: 10000,
+ }) as ComposeSpecification;
+ } else if (compose.serverId) {
result = await loadDockerComposeRemote(compose);
} else {
result = await loadDockerCompose(compose);
@@ -149,6 +218,8 @@ export const addDomainToCompose = async (
return null;
}
+ result = (await applyComposeFilePatch(compose)) ?? result;
+
if (compose.isolatedDeployment) {
const randomized = randomizeDeployableSpecificationFile(
result,
@@ -162,6 +233,24 @@ export const addDomainToCompose = async (
}
for (const domain of domains) {
+ for (const service of Object.values(result.services ?? {})) {
+ if (compose.composeType === "docker-compose") {
+ service.labels = removeDomainLabels(
+ service.labels,
+ appName,
+ domain.uniqueConfigKey,
+ );
+ } else if (service.deploy) {
+ service.deploy.labels = removeDomainLabels(
+ service.deploy.labels,
+ appName,
+ domain.uniqueConfigKey,
+ );
+ }
+ }
+ }
+
+ for (const domain of domains.filter((d) => d.enabled)) {
const { serviceName, https } = domain;
if (!serviceName) {
throw new Error(`Domain "${domain.host}" is missing a service name`);
@@ -201,22 +290,31 @@ export const addDomainToCompose = async (
labels = result.services[serviceName].deploy.labels;
}
+ const networkLabel =
+ compose.composeType === "docker-compose"
+ ? "traefik.docker.network"
+ : "traefik.swarm.network";
+ const networkName = compose.isolatedDeployment
+ ? compose.suffix || compose.appName
+ : "dokploy-network";
+
if (Array.isArray(labels)) {
if (!labels.includes("traefik.enable=true")) {
labels.unshift("traefik.enable=true");
}
labels.unshift(...httpLabels);
- if (!compose.isolatedDeployment) {
- if (compose.composeType === "docker-compose") {
- if (!labels.includes("traefik.docker.network=dokploy-network")) {
- labels.unshift("traefik.docker.network=dokploy-network");
- }
- } else {
- // Stack Case
- if (!labels.includes("traefik.swarm.network=dokploy-network")) {
- labels.unshift("traefik.swarm.network=dokploy-network");
- }
- }
+ const networkLabelEntry = `${networkLabel}=${networkName}`;
+ if (!labels.includes(networkLabelEntry)) {
+ labels.unshift(networkLabelEntry);
+ }
+ } else if (labels) {
+ labels["traefik.enable"] = "true";
+ labels[networkLabel] = networkName;
+ for (const label of httpLabels) {
+ const separatorIndex = label.indexOf("=");
+ labels[label.slice(0, separatorIndex)] = label.slice(
+ separatorIndex + 1,
+ );
}
}
@@ -228,14 +326,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,
@@ -349,9 +512,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 = [];
@@ -376,11 +540,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..fccd979fd 100644
--- a/packages/server/src/utils/docker/utils.ts
+++ b/packages/server/src/utils/docker/utils.ts
@@ -153,19 +153,27 @@ export const getContainerByName = (name: string): Promise => {
*/
export const dockerSafeExec = (exec: string) => `
CHECK_INTERVAL=10
+MAX_WAIT=300
+WAITED=0
echo "Preparing for execution..."
while true; do
- PROCESSES=$(ps aux | grep -E "^.*docker [A-Za-z]" | grep -v grep)
+ PROCESSES=$(ps -eo args | awk '$1 ~ /(^|\\/)docker$/')
if [ -z "$PROCESSES" ]; then
echo "Docker is idle. Starting execution..."
break
- else
- echo "Docker is busy. Will check again in $CHECK_INTERVAL seconds..."
- sleep $CHECK_INTERVAL
fi
+
+ if [ "$WAITED" -ge "$MAX_WAIT" ]; then
+ echo "Docker still busy after \${MAX_WAIT}s, proceeding anyway." >&2
+ break
+ fi
+
+ echo "Docker is busy. Will check again in $CHECK_INTERVAL seconds..."
+ sleep $CHECK_INTERVAL
+ WAITED=$((WAITED + CHECK_INTERVAL))
done
${exec}
@@ -283,9 +291,13 @@ const parseSizeToBytes = (size: string): number => {
return value * (multipliers[unit] || 0);
};
-export const getDockerDiskUsage = async (): Promise => {
+export const getDockerDiskUsage = async (
+ serverId?: string,
+): Promise => {
const command = "docker system df --format '{{json .}}'";
- const { stdout } = await execAsync(command);
+ const { stdout } = serverId
+ ? await execAsyncRemote(serverId, command)
+ : await execAsync(command);
const lines = stdout.trim().split("\n").filter(Boolean);
return lines.map((line) => {
@@ -301,6 +313,49 @@ export const getDockerDiskUsage = async (): Promise => {
});
};
+export interface DockerBuildCacheItem {
+ id: string;
+ type: string;
+ description: string;
+ size: string;
+ sizeBytes: number;
+ createdSince: string;
+ lastUsedSince: string;
+ usageCount: number;
+ shared: boolean;
+ inUse: boolean;
+}
+
+export const getBuildCache = async (
+ serverId?: string,
+): Promise => {
+ 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?.BuildCache ?? []) as Record[]).map(
+ (entry) => ({
+ id: entry.ID ?? "",
+ type: entry.CacheType ?? "",
+ description: entry.Description ?? "",
+ size: entry.Size ?? "",
+ sizeBytes: parseSizeToBytes(entry.Size ?? ""),
+ createdSince: entry.CreatedSince ?? "",
+ lastUsedSince: entry.LastUsedSince ?? "",
+ usageCount: Number.parseInt(entry.UsageCount ?? "0", 10) || 0,
+ shared: entry.Shared === "true",
+ inUse: entry.InUse === "true",
+ }),
+ );
+ } catch (error) {
+ console.error(error);
+ return [];
+ }
+};
+
/**
* Volume cleanup should always be performed manually by the user. The reason is that during automatic cleanup, a volume may be deleted due to a stopped container, which is a dangerous situation.
*
@@ -323,7 +378,12 @@ export const cleanupAll = async (serverId?: string) => {
} else {
await execAsync(dockerSafeExec(command));
}
- } catch {}
+ } catch (error) {
+ console.error(
+ `Docker cleanup: "${key}" failed${serverId ? ` on server ${serverId}` : ""}`,
+ error,
+ );
+ }
}
};
@@ -401,6 +461,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 +532,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 +636,6 @@ export const generateConfigContainer = (
labelsSwarm,
replicas,
mounts,
- networkSwarm,
stopGracePeriodSwarm,
endpointSpecSwarm,
ulimitsSwarm,
@@ -611,13 +698,6 @@ export const generateConfigContainer = (
stopGracePeriodSwarm !== undefined && {
StopGracePeriod: stopGracePeriodSwarm,
}),
- ...(networkSwarm
- ? {
- Networks: networkSwarm,
- }
- : {
- Networks: [{ Target: "dokploy-network" }],
- }),
...(endpointSpecSwarm && {
EndpointSpec: {
...(endpointSpecSwarm.Mode && { Mode: endpointSpecSwarm.Mode }),
@@ -712,14 +792,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 +980,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/notifications/server-threshold.ts b/packages/server/src/utils/notifications/server-threshold.ts
index bcabf2cc3..2c1ad8902 100644
--- a/packages/server/src/utils/notifications/server-threshold.ts
+++ b/packages/server/src/utils/notifications/server-threshold.ts
@@ -1,12 +1,18 @@
+import { render } from "@react-email/components";
import { and, eq } from "drizzle-orm";
import { db } from "../../db";
import { notifications } from "../../db/schema";
+import ServerThresholdEmail from "../../emails/emails/server-threshold";
import {
sendCustomNotification,
sendDiscordNotification,
+ sendEmailNotification,
+ sendGotifyNotification,
sendLarkNotification,
sendMattermostNotification,
+ sendNtfyNotification,
sendPushoverNotification,
+ sendResendNotification,
sendSlackNotification,
sendTeamsNotification,
sendTelegramNotification,
@@ -39,6 +45,9 @@ export const sendServerThresholdNotifications = async (
discord: true,
telegram: true,
slack: true,
+ resend: true,
+ gotify: true,
+ ntfy: true,
mattermost: true,
custom: true,
lark: true,
@@ -52,9 +61,13 @@ export const sendServerThresholdNotifications = async (
for (const notification of notificationList) {
const {
+ email,
discord,
telegram,
slack,
+ resend,
+ gotify,
+ ntfy,
mattermost,
custom,
lark,
@@ -63,6 +76,64 @@ export const sendServerThresholdNotifications = async (
} = notification;
try {
+ if (email || resend) {
+ const template = await render(
+ ServerThresholdEmail({
+ serverName: payload.ServerName,
+ type: payload.Type,
+ value: payload.Value.toFixed(2),
+ threshold: payload.Threshold.toFixed(2),
+ message: payload.Message,
+ date: date.toLocaleString(),
+ }),
+ );
+
+ if (email) {
+ await sendEmailNotification(
+ email,
+ `Server ${payload.Type} alert for ${payload.ServerName}`,
+ template,
+ );
+ }
+
+ if (resend) {
+ await sendResendNotification(
+ resend,
+ `Server ${payload.Type} alert for ${payload.ServerName}`,
+ template,
+ );
+ }
+ }
+
+ if (gotify) {
+ const decorate = (decoration: string, text: string) =>
+ `${gotify.decoration ? decoration : ""} ${text}\n`;
+
+ await sendGotifyNotification(
+ gotify,
+ decorate("⚠️", `Server ${payload.Type} Alert`),
+ `${decorate("🏷️", `Server: ${payload.ServerName}`)}` +
+ `${decorate("📊", `Current Value: ${payload.Value.toFixed(2)}%`)}` +
+ `${decorate("⚠️", `Threshold: ${payload.Threshold.toFixed(2)}%`)}` +
+ `${decorate("📜", `Message: ${payload.Message}`)}` +
+ `${decorate("🕒", `Date: ${date.toLocaleString()}`)}`,
+ );
+ }
+
+ if (ntfy) {
+ await sendNtfyNotification(
+ ntfy,
+ `Server ${payload.Type} Alert`,
+ "warning",
+ "",
+ `🏷️Server: ${payload.ServerName}\n` +
+ `📊Current Value: ${payload.Value.toFixed(2)}%\n` +
+ `⚠️Threshold: ${payload.Threshold.toFixed(2)}%\n` +
+ `📜Message: ${payload.Message}\n` +
+ `🕒Date: ${date.toLocaleString()}`,
+ );
+ }
+
if (discord) {
const decorate = (decoration: string, text: string) =>
`${discord.decoration ? decoration : ""} ${text}`.trim();
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..c232b6956 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 = (
@@ -75,6 +79,10 @@ const generateRestoreCommand = (
}
};
+// Dumps taken with `--databases` carry `USE`/`CREATE DATABASE` statements that
+// would redirect the restore away from the database selected in the dialog.
+export const stripDatabaseSwitchCommand = `grep -viE '^[[:space:]]*(use|create[[:space:]]+database)[[:space:]]'`;
+
const getMongoSpecificCommand = (
rcloneCommand: string,
restoreCommand: string,
@@ -88,8 +96,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}
`;
};
@@ -121,7 +129,9 @@ export const getRestoreCommand = ({
const restoreCommand = generateRestoreCommand(type, credentials);
let cmd = `CONTAINER_ID=$(${containerSearch})`;
- if (type !== "mongo") {
+ if (type === "mysql" || type === "mariadb") {
+ cmd += ` && ${rcloneCommand} | ${stripDatabaseSwitchCommand} | ${restoreCommand}`;
+ } else if (type !== "mongo") {
cmd += ` && ${rcloneCommand} | ${restoreCommand}`;
} else {
cmd += ` && ${getMongoSpecificCommand(rcloneCommand, restoreCommand, backupFile || "")}`;
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/startup/cancel-deployments.ts b/packages/server/src/utils/startup/cancel-deployments.ts
index 34766c187..8f1272f43 100644
--- a/packages/server/src/utils/startup/cancel-deployments.ts
+++ b/packages/server/src/utils/startup/cancel-deployments.ts
@@ -1,4 +1,9 @@
-import { applications, compose, deployments } from "@dokploy/server/db/schema";
+import {
+ applications,
+ compose,
+ deployments,
+ schedules,
+} from "@dokploy/server/db/schema";
import { eq, inArray } from "drizzle-orm";
import { db } from "../../db/index";
@@ -6,15 +11,37 @@ export const initCancelDeployments = async () => {
try {
console.log("Setting up cancel deployments....");
+ const runningDeployments = await db
+ .select({
+ deploymentId: deployments.deploymentId,
+ scheduleId: deployments.scheduleId,
+ scheduleType: schedules.scheduleType,
+ })
+ .from(deployments)
+ .leftJoin(schedules, eq(deployments.scheduleId, schedules.scheduleId))
+ .where(eq(deployments.status, "running"));
+
+ const deploymentIdsToCancel = runningDeployments
+ .filter(
+ (deployment) =>
+ !deployment.scheduleId ||
+ deployment.scheduleType === "dokploy-server",
+ )
+ .map((deployment) => deployment.deploymentId);
+
+ if (deploymentIdsToCancel.length === 0) {
+ console.log("Cancelled 0 deployments");
+ return;
+ }
+
const result = await db
.update(deployments)
.set({
status: "cancelled",
})
- .where(eq(deployments.status, "running"))
+ .where(inArray(deployments.deploymentId, deploymentIdsToCancel))
.returning();
- // Reset the related services so they don't stay stuck in "running".
const applicationIds = [
...new Set(
result
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/traefik/domain.ts b/packages/server/src/utils/traefik/domain.ts
index d35473a54..b23796301 100644
--- a/packages/server/src/utils/traefik/domain.ts
+++ b/packages/server/src/utils/traefik/domain.ts
@@ -19,6 +19,15 @@ import { createPathMiddlewares, removePathMiddlewares } from "./middleware";
export const manageDomain = async (app: ApplicationNested, domain: Domain) => {
const { appName } = app;
+
+ // A disabled domain keeps its configuration in the database but must never
+ // expose a traefik router. Guarding here covers every caller (create, update,
+ // forward-auth, toggle) so a disabled domain can't be revived from any path.
+ if (!domain.enabled) {
+ await removeDomain(app, domain.uniqueConfigKey);
+ return;
+ }
+
let config: FileConfig;
if (app.serverId) {
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..6afbaf489
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/scaleway.ts b/packages/server/src/utils/vault/scaleway.ts
new file mode 100644
index 000000000..3e06011e1
--- /dev/null
+++ b/packages/server/src/utils/vault/scaleway.ts
@@ -0,0 +1,173 @@
+import type { scalewayVaultConfigSchema } from "@dokploy/server/db/schema";
+import type { z } from "zod";
+import { type VaultClient, vaultFetch } from "./types";
+
+type ScalewayConfig = z.infer;
+
+const REVISION = "latest_enabled";
+const PAGE_SIZE = 100;
+const MAX_LISTED_SECRETS = 500;
+
+const baseUrl = (config: ScalewayConfig) =>
+ `${config.apiUrl.replace(/\/+$/, "")}/secret-manager/v1beta1/regions/${config.region}`;
+
+/**
+ * Refs are `[folder/]name[:field]`, mirroring how Scaleway splits a secret into
+ * a path (folder) and a name. `field` extracts a key from a JSON payload.
+ */
+export const parseScalewayRef = (ref: string) => {
+ const separatorIndex = ref.lastIndexOf(":");
+ const field = separatorIndex === -1 ? null : ref.slice(separatorIndex + 1);
+ const fullName = separatorIndex === -1 ? ref : ref.slice(0, separatorIndex);
+ const slashIndex = fullName.lastIndexOf("/");
+ const name = fullName.slice(slashIndex + 1);
+ if (!name) {
+ throw new Error(
+ `Invalid Scaleway Secret Manager reference "${ref}": expected format or /[:field]`,
+ );
+ }
+ const path = slashIndex === -1 ? "/" : `/${fullName.slice(0, slashIndex)}`;
+ return { path: path.replace(/\/+$/, "") || "/", name, field };
+};
+
+const request = async (
+ config: ScalewayConfig,
+ path: string,
+ params: Record,
+ notFoundMessage?: string,
+) => {
+ const url = `${baseUrl(config)}${path}?${new URLSearchParams(params).toString()}`;
+ const response = await vaultFetch(url, {
+ headers: { "X-Auth-Token": config.secretKey, Accept: "application/json" },
+ });
+
+ if (response.ok) {
+ return response;
+ }
+
+ if (response.status === 404 && notFoundMessage) {
+ throw new Error(`Scaleway Secret Manager: ${notFoundMessage}`);
+ }
+
+ let detail = "";
+ try {
+ const body = (await response.json()) as {
+ message?: string;
+ error?: string;
+ };
+ detail = body.message ?? body.error ?? "";
+ } catch {}
+
+ const reason =
+ response.status === 401 || response.status === 403
+ ? "authentication failed"
+ : "request failed";
+ throw new Error(
+ `Scaleway Secret Manager: ${reason} (status ${response.status}${detail ? `: ${detail}` : ""})`,
+ );
+};
+
+const accessSecret = async (
+ config: ScalewayConfig,
+ secretPath: string,
+ secretName: string,
+) => {
+ const response = await request(
+ config,
+ `/secrets-by-path/versions/${REVISION}/access`,
+ {
+ project_id: config.projectId,
+ secret_name: secretName,
+ secret_path: secretPath,
+ },
+ `secret "${secretName}" not found in path "${secretPath}"`,
+ );
+
+ const data = (await response.json()) as { data?: string };
+ if (data.data === undefined) {
+ throw new Error(
+ `Scaleway Secret Manager: secret "${secretName}" has no enabled version`,
+ );
+ }
+ return Buffer.from(data.data, "base64").toString("utf-8");
+};
+
+export const scalewayClient: VaultClient = {
+ async getSecrets(config, refs) {
+ const parsed = refs.map((ref) => ({ ref, ...parseScalewayRef(ref) }));
+ const secretKey = (entry: { path: string; name: string }) =>
+ `${entry.path}#${entry.name}`;
+
+ const payloads = new Map();
+ await Promise.all(
+ [
+ ...new Map(parsed.map((entry) => [secretKey(entry), entry])).values(),
+ ].map(async (entry) => {
+ payloads.set(
+ secretKey(entry),
+ await accessSecret(config, entry.path, entry.name),
+ );
+ }),
+ );
+
+ const result: Record = {};
+ for (const entry of parsed) {
+ const payload = payloads.get(secretKey(entry)) as string;
+ const { ref, name, field } = entry;
+ if (field === null) {
+ result[ref] = payload;
+ continue;
+ }
+ let json: Record;
+ try {
+ json = JSON.parse(payload);
+ } catch {
+ throw new Error(
+ `Scaleway Secret Manager: secret "${name}" is not JSON, cannot extract field "${field}"`,
+ );
+ }
+ const value = json[field];
+ if (value === undefined || value === null) {
+ throw new Error(
+ `Scaleway Secret Manager: field "${field}" not found in secret "${name}"`,
+ );
+ }
+ result[ref] = typeof value === "string" ? value : JSON.stringify(value);
+ }
+ return result;
+ },
+
+ async testConnection(config) {
+ await request(config, "/secrets", {
+ project_id: config.projectId,
+ page_size: "1",
+ });
+ },
+
+ async listSecretNames(config) {
+ const names: string[] = [];
+ let page = 1;
+
+ while (names.length < MAX_LISTED_SECRETS) {
+ const response = await request(config, "/secrets", {
+ project_id: config.projectId,
+ page: String(page),
+ page_size: String(PAGE_SIZE),
+ });
+ const data = (await response.json()) as {
+ secrets?: { name: string; path?: string }[];
+ };
+ const secrets = data.secrets ?? [];
+ for (const secret of secrets) {
+ const folder = (secret.path ?? "/").replace(/^\/+|\/+$/g, "");
+ names.push(folder ? `${folder}/${secret.name}` : secret.name);
+ }
+ if (secrets.length < PAGE_SIZE) {
+ break;
+ }
+ page += 1;
+ }
+
+ return names.slice(0, MAX_LISTED_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.json b/packages/server/tsconfig.json
index 076f1dffb..4b30fd987 100644
--- a/packages/server/tsconfig.json
+++ b/packages/server/tsconfig.json
@@ -21,7 +21,6 @@
"plugins": [{ "name": "next" }],
"outDir": "./dist",
/* Path Aliases */
- "baseUrl": ".",
"paths": {
"@dokploy/server/*": ["./src/*"]
}
diff --git a/packages/server/tsconfig.server.json b/packages/server/tsconfig.server.json
index 33777c025..46504d60b 100644
--- a/packages/server/tsconfig.server.json
+++ b/packages/server/tsconfig.server.json
@@ -8,16 +8,15 @@
"isolatedModules": false,
"noEmit": false,
"declaration": true,
- "moduleResolution": "Node",
+ "moduleResolution": "bundler",
"rootDir": "./src",
- "baseUrl": ".",
"jsx": "react-jsx",
"paths": {
"@dokploy/server/*": ["./src/*"]
}
},
"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..cd2853976 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
@@ -53,7 +53,7 @@ importers:
version: 4.12.2
inngest:
specifier: 3.40.1
- version: 3.40.1(encoding@0.1.13)(express@5.2.1)(h3@1.15.1)(hono@4.12.2)(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@5.9.3)
+ version: 3.40.1(encoding@0.1.13)(express@5.2.1)(h3@1.15.1)(hono@4.12.2)(next@16.3.0(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@7.0.2)
pino:
specifier: 9.4.0
version: 9.4.0
@@ -89,8 +89,8 @@ importers:
specifier: ^4.22.4
version: 4.22.4
typescript:
- specifier: ^5.8.3
- version: 5.9.3
+ specifier: ^7.0.2
+ version: 7.0.2
apps/dokploy:
dependencies:
@@ -115,15 +115,24 @@ importers:
'@ai-sdk/openai-compatible':
specifier: ^2.0.30
version: 2.0.30(zod@4.3.6)
+ '@aws-sdk/client-route-53':
+ specifier: ^3.1108.0
+ version: 3.1108.0
+ '@aws-sdk/client-secrets-manager':
+ specifier: ^3.1108.0
+ version: 3.1108.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))
+ 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(22e2e61d74361da37f96c4dc24795f27))(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(22e2e61d74361da37f96c4dc24795f27))(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))
+ 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(22e2e61d74361da37f96c4dc24795f27))(better-call@1.3.7(zod@4.3.6))
'@better-auth/sso':
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))
+ 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(22e2e61d74361da37f96c4dc24795f27))(better-call@1.3.7(zod@4.3.6))
'@codemirror/autocomplete':
specifier: ^6.18.6
version: 6.20.3
@@ -153,7 +162,7 @@ importers:
version: link:../../packages/server
'@dokploy/trpc-openapi':
specifier: 0.0.18
- version: 0.0.18(@trpc/server@11.10.0(typescript@5.9.3))(zod-openapi@5.4.6(zod@4.3.6))(zod@4.3.6)
+ version: 0.0.18(@trpc/server@11.10.0(typescript@7.0.2))(zod-openapi@5.4.6(zod@4.3.6))(zod@4.3.6)
'@faker-js/faker':
specifier: ^8.4.1
version: 8.4.1
@@ -186,16 +195,16 @@ importers:
version: 8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@trpc/client':
specifier: ^11.10.0
- version: 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ version: 11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2)
'@trpc/next':
specifier: ^11.10.0
- version: 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)
+ version: 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(react@19.2.7)(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@7.0.2)
'@trpc/react-query':
specifier: ^11.10.0
- version: 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3)
+ version: 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(react@19.2.7)(typescript@7.0.2)
'@trpc/server':
specifier: ^11.10.0
- version: 11.10.0(typescript@5.9.3)
+ version: 11.10.0(typescript@7.0.2)
'@uiw/codemirror-theme-github':
specifier: ^4.23.12
version: 4.25.4(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)
@@ -225,16 +234,13 @@ importers:
version: 5.1.1(encoding@0.1.13)
better-auth:
specifier: 1.6.23
- version: 1.6.23(c1a003db19823d196c7d6468bf307df5)
+ version: 1.6.23(22e2e61d74361da37f96c4dc24795f27)
bl:
specifier: 6.0.11
version: 6.0.11
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
@@ -261,10 +267,10 @@ importers:
version: 16.4.5
drizzle-orm:
specifier: 0.45.2
- version: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ version: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
drizzle-zod:
specifier: 0.8.3
- version: 0.8.3(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))(zod@4.3.6)
+ version: 0.8.3(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))(zod@4.3.6)
fancy-ansi:
specifier: ^0.1.3
version: 0.1.3
@@ -287,14 +293,14 @@ importers:
specifier: 3.3.11
version: 3.3.11
next:
- specifier: 16.2.6
- version: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ specifier: 16.3.0
+ version: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
next-themes:
specifier: ^0.2.1
- version: 0.2.1(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ version: 0.2.1(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
nextjs-toploader:
specifier: ^3.9.17
- version: 3.9.17(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ version: 3.9.17(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
node-os-utils:
specifier: 2.0.1
version: 2.0.1
@@ -357,7 +363,7 @@ importers:
version: 7.7.3
shadcn:
specifier: ^4.11.0
- version: 4.11.0(typescript@5.9.3)
+ version: 4.11.0(typescript@7.0.2)
shell-quote:
specifier: ^1.8.1
version: 1.8.3
@@ -489,11 +495,11 @@ importers:
specifier: ^4.22.4
version: 4.22.4
typescript:
- specifier: ^5.8.3
- version: 5.9.3
+ specifier: ^7.0.2
+ version: 7.0.2
vite-tsconfig-paths:
specifier: 4.3.2
- version: 4.3.2(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
+ version: 4.3.2(typescript@7.0.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
vitest:
specifier: ^4.0.18
version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
@@ -517,7 +523,7 @@ importers:
version: 16.4.5
drizzle-orm:
specifier: 0.45.1
- version: 0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.7)(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))
+ version: 0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.7)(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@7.0.2))
hono:
specifier: ^4.11.7
version: 4.12.2
@@ -556,8 +562,8 @@ importers:
specifier: ^4.22.4
version: 4.22.4
typescript:
- specifier: ^5.8.3
- version: 5.9.3
+ specifier: ^7.0.2
+ version: 7.0.2
packages/server:
dependencies:
@@ -582,15 +588,24 @@ importers:
'@ai-sdk/openai-compatible':
specifier: ^2.0.30
version: 2.0.30(zod@4.3.6)
+ '@aws-sdk/client-route-53':
+ specifier: ^3.1108.0
+ version: 3.1108.0
+ '@aws-sdk/client-secrets-manager':
+ specifier: ^3.1108.0
+ version: 3.1108.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))
+ 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(2ed6fd84380fde286153435e0641a0ef))(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(2ed6fd84380fde286153435e0641a0ef))(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))
+ 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(2ed6fd84380fde286153435e0641a0ef))(better-call@1.3.7(zod@4.3.6))
'@better-auth/sso':
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))
+ 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(2ed6fd84380fde286153435e0641a0ef))(better-call@1.3.7(zod@4.3.6))
'@better-auth/utils':
specifier: 0.4.2
version: 0.4.2
@@ -614,7 +629,7 @@ importers:
version: 1.0.12(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@trpc/server':
specifier: 11.10.0
- version: 11.10.0(typescript@5.9.3)
+ version: 11.10.0(typescript@7.0.2)
adm-zip:
specifier: ^0.5.16
version: 0.5.16
@@ -629,7 +644,7 @@ importers:
version: 5.1.1(encoding@0.1.13)
better-auth:
specifier: 1.6.23
- version: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
+ version: 1.6.23(2ed6fd84380fde286153435e0641a0ef)
bl:
specifier: 6.0.11
version: 6.0.11
@@ -647,13 +662,13 @@ importers:
version: 16.4.5
drizzle-dbml-generator:
specifier: 0.10.0
- version: 0.10.0(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))
+ version: 0.10.0(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))
drizzle-orm:
specifier: 0.45.2
- version: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ version: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
drizzle-zod:
specifier: 0.5.1
- version: 0.5.1(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))(zod@4.3.6)
+ version: 0.5.1(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))(zod@4.3.6)
lodash:
specifier: 4.17.21
version: 4.17.21
@@ -797,8 +812,8 @@ importers:
specifier: ^4.22.4
version: 4.22.4
typescript:
- specifier: ^5.8.3
- version: 5.9.3
+ specifier: ^7.0.2
+ version: 7.0.2
packages:
@@ -868,6 +883,78 @@ packages:
resolution: {integrity: sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==}
engines: {node: '>=12'}
+ '@aws-sdk/client-route-53@3.1108.0':
+ resolution: {integrity: sha512-fbHGq25KlbqSIEQC3T+3ghsXmnpknjU3VxMgTOmqbKAqTLVB0ZLhxzPOxKuJFTd5m5mzSh9lCAZR5Nnlg+V9kQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/client-secrets-manager@3.1108.0':
+ resolution: {integrity: sha512-pZtoHWD+WorgM9xK1ikNcKLbtEMIS6wFtELuCX5AOo9v3ZajV8wOEmXz/7JnBHbsLmyBnyv3NCf7whyV++joiw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/core@3.977.7':
+ resolution: {integrity: sha512-I88Iov89NVmjSmJLKSv7Cn9M2J+a2942OkA8nZCbz+sl4ZeY4zEOcoLOrbt1GRfQ8zEQKnjAJdXixA3J/p1fDQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.972.68':
+ resolution: {integrity: sha512-2a20A/IdNOwUvaDq91iqqS7BA0XlNMfW3iLGZGZLJv0EbUqhSxB0PIx4rQQqssvWj1uXImb3/UCCdHz/+1dOiA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-http@3.972.70':
+ resolution: {integrity: sha512-0yRem2Fs52r/Nn6UAqIlpjexfaYj8ziEozOe9tamtAVT/5bzFLKx8O2r7MaRqgS3hGKHIa1Jij9nKHSsNnb04A==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.973.13':
+ resolution: {integrity: sha512-2M39DE02XpYYaSWYk/4AsImXYUU/1L2xmTMLUpMMWq7DfLv191/vCRy3baKtdr45AkJQyVgSjmuVOLm15SwrRQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-login@3.972.75':
+ resolution: {integrity: sha512-jaTESuJlQsoUZ44f/i2puyPt8VlF/dMMJ9HM3cStYtk7eKX4N9UWi83OLixUkoOJH3BwWlPLCq9YIK9nfWhVBg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.972.79':
+ resolution: {integrity: sha512-RIw5dof1EHkWubrZzPC941CDtnFG1iAXsxbFgLkhdYZXHc4icU13c/uxSMI0J5eUx9bxa7LjfpdjfClBB1QsDA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.972.68':
+ resolution: {integrity: sha512-nLP3Pda2MQTFJ25hKBMmUuB9Uv+bTZQNlufbeCwklP549Vwnkd8bRLJoCKp5k6xjmdyptrPrOfGOhN0mKuca8A==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.973.12':
+ resolution: {integrity: sha512-EmgyyHn+f9WCcelp3L/vci+LGbX8GigWaVphRArjVo5Pktkr9YnLy/mQ6VDkDyBD72dtfRNTgHmD2ts4rTDXKQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.972.74':
+ resolution: {integrity: sha512-0YfczxGXF3RjGj8z7QG/Ho2HnLGKDHfPSHiTs47UU1U/+mmwISDN+rvGKt2zh+3FX8NdT4xd95LGBGyhQw2dgQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-sdk-route53@3.972.24':
+ resolution: {integrity: sha512-+z3OqGhqLA46vF5KbnjuygzSQo9A2cWsbuDy1rdrbWSPDCNT5CCRC+veIxRnqvxwpj/BY8P8XNz+WwCmX0e8rg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/nested-clients@3.997.42':
+ resolution: {integrity: sha512-XWRyon2MTHXD/zMoo0Mbge6Vwf+iE0qQaM/RyGO6NfZ9WukCFiQL27nQVZjYy2JwSIg+iXZxKOX95OBXqlSM4w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.996.44':
+ resolution: {integrity: sha512-ZSfQ35Qn4MhSY+A0Whyr+KBx+wJKZUyBsOrjB2pSHOafRzbFe47T8XcXM8hZqUAC69qnqIy0C9ArxTuud0CC2w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/token-providers@3.1108.0':
+ resolution: {integrity: sha512-rI80zxDxGJ6904eC/YbjkdjY6JdaZvQ01kOmrMvw7cFQGIHo27fhnIVbMSVDS4T6foQImjxYSRoOu/uSJscXDw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/types@3.974.3':
+ resolution: {integrity: sha512-ECAqfpNsef+7MO8qtR0h9KcFIBAygaE7Cm6UOiQl+ft+uVap+1G7bNEjs4mdJE2OnA4m6k7i8peH8uGIAsOMGw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/xml-builder@3.972.38':
+ resolution: {integrity: sha512-grf7mzfVxBS5AlsuTvBN7uDpzqohFww9fRPCO+EBSUdvtsYMcPSKdz54h/7XiscqNcUM1Ae1MF7JLHmiYYuzbQ==}
+ 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 +1156,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 +1209,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]
@@ -1216,6 +1313,9 @@ packages:
'@codemirror/view@6.43.6':
resolution: {integrity: sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==}
+ '@codemirror/view@6.43.8':
+ resolution: {integrity: sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==}
+
'@date-fns/tz@1.5.0':
resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==}
@@ -1253,8 +1353,8 @@ packages:
'@electric-sql/pglite@0.3.15':
resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==}
- '@emnapi/runtime@1.8.1':
- resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
'@esbuild-kit/core-utils@3.3.2':
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
@@ -1433,6 +1533,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'}
@@ -1450,140 +1553,149 @@ packages:
peerDependencies:
react-hook-form: ^7.55.0
- '@img/colour@1.0.0':
- resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
- '@img/sharp-darwin-arm64@0.34.5':
- resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-darwin-arm64@0.35.3':
+ resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [darwin]
- '@img/sharp-darwin-x64@0.34.5':
- resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-darwin-x64@0.35.3':
+ resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-darwin-arm64@1.2.4':
- resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ '@img/sharp-freebsd-wasm32@0.35.3':
+ resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
+
+ '@img/sharp-libvips-darwin-arm64@1.3.2':
+ resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==}
cpu: [arm64]
os: [darwin]
- '@img/sharp-libvips-darwin-x64@1.2.4':
- resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ '@img/sharp-libvips-darwin-x64@1.3.2':
+ resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-linux-arm64@1.2.4':
- resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ '@img/sharp-libvips-linux-arm64@1.3.2':
+ resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==}
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linux-arm@1.2.4':
- resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ '@img/sharp-libvips-linux-arm@1.3.2':
+ resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==}
cpu: [arm]
os: [linux]
- '@img/sharp-libvips-linux-ppc64@1.2.4':
- resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ '@img/sharp-libvips-linux-ppc64@1.3.2':
+ resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==}
cpu: [ppc64]
os: [linux]
- '@img/sharp-libvips-linux-riscv64@1.2.4':
- resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ '@img/sharp-libvips-linux-riscv64@1.3.2':
+ resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==}
cpu: [riscv64]
os: [linux]
- '@img/sharp-libvips-linux-s390x@1.2.4':
- resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ '@img/sharp-libvips-linux-s390x@1.3.2':
+ resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==}
cpu: [s390x]
os: [linux]
- '@img/sharp-libvips-linux-x64@1.2.4':
- resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ '@img/sharp-libvips-linux-x64@1.3.2':
+ resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==}
cpu: [x64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
- resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.2':
+ resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==}
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-x64@1.2.4':
- resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ '@img/sharp-libvips-linuxmusl-x64@1.3.2':
+ resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==}
cpu: [x64]
os: [linux]
- '@img/sharp-linux-arm64@0.34.5':
- resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-arm64@0.35.3':
+ resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
- '@img/sharp-linux-arm@0.34.5':
- resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-arm@0.35.3':
+ resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==}
+ engines: {node: '>=20.9.0'}
cpu: [arm]
os: [linux]
- '@img/sharp-linux-ppc64@0.34.5':
- resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-ppc64@0.35.3':
+ resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==}
+ engines: {node: '>=20.9.0'}
cpu: [ppc64]
os: [linux]
- '@img/sharp-linux-riscv64@0.34.5':
- resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-riscv64@0.35.3':
+ resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==}
+ engines: {node: '>=20.9.0'}
cpu: [riscv64]
os: [linux]
- '@img/sharp-linux-s390x@0.34.5':
- resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-s390x@0.35.3':
+ resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==}
+ engines: {node: '>=20.9.0'}
cpu: [s390x]
os: [linux]
- '@img/sharp-linux-x64@0.34.5':
- resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-x64@0.35.3':
+ resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
- '@img/sharp-linuxmusl-arm64@0.34.5':
- resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linuxmusl-arm64@0.35.3':
+ resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
- '@img/sharp-linuxmusl-x64@0.34.5':
- resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linuxmusl-x64@0.35.3':
+ resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
- '@img/sharp-wasm32@0.34.5':
- resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-wasm32@0.35.3':
+ resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==}
+ engines: {node: '>=20.9.0'}
+
+ '@img/sharp-webcontainers-wasm32@0.35.3':
+ resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==}
+ engines: {node: '>=20.9.0'}
cpu: [wasm32]
- '@img/sharp-win32-arm64@0.34.5':
- resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-arm64@0.35.3':
+ resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [win32]
- '@img/sharp-win32-ia32@0.34.5':
- resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-ia32@0.35.3':
+ resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==}
+ engines: {node: ^20.9.0}
cpu: [ia32]
os: [win32]
- '@img/sharp-win32-x64@0.34.5':
- resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-x64@0.35.3':
+ resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [win32]
@@ -1741,6 +1853,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==}
@@ -1776,8 +1891,8 @@ packages:
'@cfworker/json-schema':
optional: true
- '@mongodb-js/saslprep@1.4.12':
- resolution: {integrity: sha512-QAfAMwNgnYxZ2C6D1HgeP7Gc4i/uvJRim415PCIL9ptRxWMNbWeLBYb2/9R4pGKny/s1FVu2JA2cxCUBUOggrA==}
+ '@mongodb-js/saslprep@1.4.13':
+ resolution: {integrity: sha512-E3Sv4eCYAlKYUTx8S3ioQcDUscOif+8zZ5OnW1IzJ+Tt+EO+ke8mn+Y3FX6N1H79picwbdOavVOb1jPi2EOyrg==}
'@mrleebo/prisma-ast@0.13.1':
resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==}
@@ -1813,53 +1928,53 @@ packages:
cpu: [x64]
os: [win32]
- '@next/env@16.2.6':
- resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==}
+ '@next/env@16.3.0':
+ resolution: {integrity: sha512-o9r1S0BNiNreHP9Vs+Qnqd9kviDkJh8xIACY7UFZSmiGbbQRzPBBosvHzAU4TULHOIuOj/18RSsyz2qrREmIFw==}
- '@next/swc-darwin-arm64@16.2.6':
- resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==}
+ '@next/swc-darwin-arm64@16.3.0':
+ resolution: {integrity: sha512-55hpqq18bEVAlxedlTt3tFqZmKg2nUXT1kn1G/BGEy0R13h3LwtwHPVzzjG6P4LLeOHE32PFDQUVaJEWvBEZBw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@16.2.6':
- resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==}
+ '@next/swc-darwin-x64@16.3.0':
+ resolution: {integrity: sha512-SOi96kSaF5T+0wW4koiM1bWzSPwjzTesC1p3df+FjdOi5LIQkBK/blxh7HdoKnNuI4PURF1OO7TZqtfnbWDSgw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@16.2.6':
- resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==}
+ '@next/swc-linux-arm64-gnu@16.3.0':
+ resolution: {integrity: sha512-P0gZAoPMF4dyTRzhmkV4PrqVzSOB6t4mC1oI3c4dqijJ+OVEVx5clIXAKR4/uQpsqw2KKM/0D5tVumcR2r5blg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@16.2.6':
- resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==}
+ '@next/swc-linux-arm64-musl@16.3.0':
+ resolution: {integrity: sha512-tXXGKJw0m37O0eKJARVTX/TheKPhz0QFVtVVZXmOig+9YKLQOSP6hvf2pxv5DO7CLEJyTHx3Pg043CDQkv1G4Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@16.2.6':
- resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==}
+ '@next/swc-linux-x64-gnu@16.3.0':
+ resolution: {integrity: sha512-pjGxK5EY7yWml78ALejFkWmgHsU7wbFQrISiugpH6FbUJhgEvw3xFZ/EBAtLl7QtL0WdQKiG9eWJ3mOKGTukHw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@16.2.6':
- resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==}
+ '@next/swc-linux-x64-musl@16.3.0':
+ resolution: {integrity: sha512-sjo++Xx+lomlPs3HRsHWhVDyGG6ms1kGW5EtHLERdII8AyG1i+f6aq68xHREO6AEMlhjTNEWBSmfJfqm9orf7g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@16.2.6':
- resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==}
+ '@next/swc-win32-arm64-msvc@16.3.0':
+ resolution: {integrity: sha512-C5JSgiO54wURdaxdEUIXqkz04uMqC9UmPX1gtDrV/5Tf1UowdWYI8uA5hfFbPolTlp0q4KZ60xlHePNibf0VIw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@16.2.6':
- resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==}
+ '@next/swc-win32-x64-msvc@16.3.0':
+ resolution: {integrity: sha512-fDOggsweNb5SSw0ZKVk6U+gxSyGFFlIBY/LBc1r8GUj4u/6t6oArL+Pmkg0MBnsgR+KkdsURilVH4F3GXUGepA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2520,6 +2635,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 +3868,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 +3883,30 @@ packages:
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
+ '@smithy/core@3.32.0':
+ resolution: {integrity: sha512-NAiCSC78fzbNIEWoheoF74Ob5ZorLijCHpMY26Fqvqg/+9LuyIqMfHDg2p8Yk1rqOyowtiL3y7WX0AW+teL6zw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/credential-provider-imds@4.5.0':
+ resolution: {integrity: sha512-2jsPi+7Zv2hSzD9IXR9D7DTqSn7mv4XalzRm+bESh53jiaUS3NKEUbpQFTJP0HhQy9qzZvluxQ3yS24zdRrqsA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/fetch-http-handler@5.7.0':
+ resolution: {integrity: sha512-W/exA8T0LEzCQtJ02w4IzaEQPIspgarqZprb7W8FwnYiDowgCrjl2fTQ6FvuSSUnJORuepBF81abmBJwqh+0XQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-http-handler@4.10.0':
+ resolution: {integrity: sha512-nrh7VxqzPQS/ip1hS293aI/OAWDWARQvjUxCfuKhyrfHa2gTdk28066RNeWLI1uuoHXaKAkOF8IcSAHuOp0+SA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/signature-v4@5.7.0':
+ resolution: {integrity: sha512-hCynhm22wMJ8wTF9crcwu8mxggtUrSLLJgDcGUvYFBqpofxycYJCGKOMYg4xtPPFtgNiDJSYmhsWLTrcU/g59Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/types@4.17.0':
+ resolution: {integrity: sha512-Aw4joiM0ZdErpo39lCj8phT2lxoiKZV+KZzBxnnQhWVtU2Is/WffQSL04uUWRcXUse9Ln8vXZK6V/FwqRVnQpg==}
+ engines: {node: '>=18.0.0'}
+
'@stablelib/base64@1.0.1':
resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==}
@@ -4216,6 +4402,126 @@ packages:
'@types/ws@8.5.10':
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@typescript/typescript-darwin-x64@7.0.2':
+ resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@typescript/typescript-linux-arm64@7.0.2':
+ resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@typescript/typescript-linux-arm@7.0.2':
+ resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@typescript/typescript-linux-loong64@7.0.2':
+ resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@typescript/typescript-linux-s390x@7.0.2':
+ resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@typescript/typescript-linux-x64@7.0.2':
+ resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@typescript/typescript-sunos-x64@7.0.2':
+ resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@typescript/typescript-win32-arm64@7.0.2':
+ resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@typescript/typescript-win32-x64@7.0.2':
+ resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [win32]
+
'@uiw/codemirror-extensions-basic-setup@4.25.4':
resolution: {integrity: sha512-YzNwkm0AbPv1EXhCHYR5v0nqfemG2jEB0Z3Att4rBYqKrlG7AA9Rhjc3IyBaOzsBu18wtrp9/+uhTyu7TXSRng==}
peerDependencies:
@@ -4455,6 +4761,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 +4923,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'}
@@ -4633,8 +4946,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
- bson@7.3.1:
- resolution: {integrity: sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==}
+ bson@7.3.2:
+ resolution: {integrity: sha512-1w0ra+ho1cuE+w8jzwgzTFIimFtCfZeCoOsvIPQg6uyFCsp8M29U7bNNf5GrFh88TXbYg1g3TyKUGpd6O7q6zA==}
engines: {node: '>=20.19.0'}
btoa-lite@1.0.0:
@@ -5593,8 +5906,8 @@ packages:
resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
engines: {node: '>= 18'}
- exsolve@1.1.0:
- resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==}
+ exsolve@1.1.1:
+ resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -5867,8 +6180,8 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- grammex@3.1.12:
- resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==}
+ grammex@3.1.13:
+ resolution: {integrity: sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==}
graphmatch@1.1.1:
resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==}
@@ -6100,6 +6413,10 @@ packages:
resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==}
engines: {node: '>= 12'}
+ ip-address@10.5.0:
+ resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==}
+ engines: {node: '>= 12'}
+
ip-regex@5.0.0:
resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -6770,8 +7087,8 @@ packages:
module-details-from-path@1.0.4:
resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
- mongodb-connection-string-url@7.0.1:
- resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==}
+ mongodb-connection-string-url@7.0.2:
+ resolution: {integrity: sha512-ZoS07RoFqpKYQwAk59qmrx8+jJHNHU30UjlU96QktiGn1ltvDr+vCznLX5DiUBLEpMAHatHNWV1nM/74ul66kA==}
engines: {node: '>=20.19.0'}
mongodb@7.1.0:
@@ -6839,6 +7156,11 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanoid@3.3.18:
+ resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
nanostores@1.1.1:
resolution: {integrity: sha512-EYJqS25r2iBeTtGQCHidXl1VfZ1jXM7Q04zXJOrMlxVVmD0ptxJaNux92n1mJ7c5lN3zTq12MhH/8x59nP+qmg==}
engines: {node: ^20.0.0 || >=22.0.0}
@@ -6861,8 +7183,8 @@ packages:
react: '*'
react-dom: '*'
- next@16.2.6:
- resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==}
+ next@16.3.0:
+ resolution: {integrity: sha512-NEdGOzH+08eTXMUp9UYkA99Nhi5N6Thrhc1jgFOQgfgnGK/dA2hRwBpXep+exdFQrnwlRf/3Wixyp8lLBUpE2A==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -6991,8 +7313,8 @@ packages:
nprogress@0.2.0:
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
- nypm@0.6.8:
- resolution: {integrity: sha512-Q9K4Diu6l5u6xJQogeFSs/zKtyMSgFKFtRQV+tHP4kL7KPm2grpBU0dFIwFaXwNxN0MtfKWc43VpCugAa+LPsw==}
+ nypm@0.6.9:
+ resolution: {integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==}
engines: {node: '>=18'}
hasBin: true
@@ -7184,6 +7506,9 @@ packages:
pg-protocol@1.15.0:
resolution: {integrity: sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==}
+ pg-protocol@1.16.0:
+ resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==}
+
pg-types@2.2.0:
resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
engines: {node: '>=4'}
@@ -7315,14 +7640,14 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.4.31:
- resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
- engines: {node: ^10 || ^12 || >=14}
-
postcss@8.5.15:
resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.23:
+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
+ engines: {node: ^10 || ^12 || >=14}
+
postgres-array@2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'}
@@ -7429,6 +7754,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 +8025,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==}
@@ -7845,6 +8180,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
send@1.2.1:
resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
engines: {node: '>= 18'}
@@ -7886,9 +8226,14 @@ packages:
resolution: {integrity: sha512-UV0cchFea9hO7poV1CuEP0wvmYjpAqcxCKdy23bndl2Du2ARtDs8A4xdzfhUjDBeOW1nNpJ6lXmsEpsply2SfQ==}
hasBin: true
- sharp@0.34.5:
- resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ sharp@0.35.3:
+ resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
@@ -8236,6 +8581,10 @@ packages:
resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
+ tinyexec@1.3.0:
+ resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
+ engines: {node: '>=18'}
+
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
@@ -8333,6 +8682,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 +8693,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==}
@@ -8378,6 +8734,11 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ typescript@7.0.2:
+ resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
+ engines: {node: '>=16.20.0'}
+ hasBin: true
+
ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
@@ -8886,6 +9247,169 @@ snapshots:
escape-html: 1.0.3
xpath: 0.0.32
+ '@aws-sdk/client-route-53@3.1108.0':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/credential-provider-node': 3.972.79
+ '@aws-sdk/middleware-sdk-route53': 3.972.24
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/fetch-http-handler': 5.7.0
+ '@smithy/node-http-handler': 4.10.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/client-secrets-manager@3.1108.0':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/credential-provider-node': 3.972.79
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/fetch-http-handler': 5.7.0
+ '@smithy/node-http-handler': 4.10.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/core@3.977.7':
+ dependencies:
+ '@aws-sdk/types': 3.974.3
+ '@aws-sdk/xml-builder': 3.972.38
+ '@aws/lambda-invoke-store': 0.3.0
+ '@smithy/core': 3.32.0
+ '@smithy/signature-v4': 5.7.0
+ '@smithy/types': 4.17.0
+ bowser: 2.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-env@3.972.68':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-http@3.972.70':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/fetch-http-handler': 5.7.0
+ '@smithy/node-http-handler': 4.10.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-ini@3.973.13':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/credential-provider-env': 3.972.68
+ '@aws-sdk/credential-provider-http': 3.972.70
+ '@aws-sdk/credential-provider-login': 3.972.75
+ '@aws-sdk/credential-provider-process': 3.972.68
+ '@aws-sdk/credential-provider-sso': 3.973.12
+ '@aws-sdk/credential-provider-web-identity': 3.972.74
+ '@aws-sdk/nested-clients': 3.997.42
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/credential-provider-imds': 4.5.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-login@3.972.75':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/nested-clients': 3.997.42
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-node@3.972.79':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.972.68
+ '@aws-sdk/credential-provider-http': 3.972.70
+ '@aws-sdk/credential-provider-ini': 3.973.13
+ '@aws-sdk/credential-provider-process': 3.972.68
+ '@aws-sdk/credential-provider-sso': 3.973.12
+ '@aws-sdk/credential-provider-web-identity': 3.972.74
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/credential-provider-imds': 4.5.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-process@3.972.68':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-sso@3.973.12':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/nested-clients': 3.997.42
+ '@aws-sdk/token-providers': 3.1108.0
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-web-identity@3.972.74':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/nested-clients': 3.997.42
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-sdk-route53@3.972.24':
+ dependencies:
+ '@aws-sdk/types': 3.974.3
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/nested-clients@3.997.42':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/signature-v4-multi-region': 3.996.44
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/fetch-http-handler': 5.7.0
+ '@smithy/node-http-handler': 4.10.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/signature-v4-multi-region@3.996.44':
+ dependencies:
+ '@aws-sdk/types': 3.974.3
+ '@smithy/signature-v4': 5.7.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/token-providers@3.1108.0':
+ dependencies:
+ '@aws-sdk/core': 3.977.7
+ '@aws-sdk/nested-clients': 3.997.42
+ '@aws-sdk/types': 3.974.3
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/types@3.974.3':
+ dependencies:
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@aws-sdk/xml-builder@3.972.38':
+ dependencies:
+ '@smithy/types': 4.17.0
+ 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
@@ -9080,19 +9604,19 @@ snapshots:
'@balena/dockerignore@1.0.2': {}
- '@better-auth/api-key@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/api-key@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(22e2e61d74361da37f96c4dc24795f27))(better-call@1.3.7(zod@4.3.6))':
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-auth: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
+ better-auth: 1.6.23(22e2e61d74361da37f96c4dc24795f27)
better-call: 1.3.7(zod@4.3.6)
zod: 4.3.6
- '@better-auth/api-key@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/api-key@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(2ed6fd84380fde286153435e0641a0ef))(better-call@1.3.7(zod@4.3.6))':
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-auth: 1.6.23(c1a003db19823d196c7d6468bf307df5)
+ better-auth: 1.6.23(2ed6fd84380fde286153435e0641a0ef)
better-call: 1.3.7(zod@4.3.6)
zod: 4.3.6
@@ -9110,12 +9634,12 @@ snapshots:
optionalDependencies:
'@opentelemetry/api': 1.9.0
- '@better-auth/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))':
+ '@better-auth/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))':
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
optionalDependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
'@better-auth/kysely-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)(kysely@0.29.3)':
dependencies:
@@ -9136,36 +9660,60 @@ snapshots:
optionalDependencies:
mongodb: 7.1.0(socks@2.8.8)
- '@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)
- '@better-auth/utils': 0.4.2
- optionalDependencies:
- '@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)
-
- '@better-auth/scim@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))':
- 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-auth: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
- better-call: 1.3.7(zod@4.3.6)
- zod: 4.3.6
-
- '@better-auth/scim@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))':
- 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-auth: 1.6.23(c1a003db19823d196c7d6468bf307df5)
- better-call: 1.3.7(zod@4.3.6)
- zod: 4.3.6
-
- '@better-auth/sso@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))':
+ '@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(22e2e61d74361da37f96c4dc24795f27))(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
- better-auth: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
+ '@simplewebauthn/browser': 13.3.0
+ '@simplewebauthn/server': 13.3.2
+ better-auth: 1.6.23(22e2e61d74361da37f96c4dc24795f27)
+ 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(2ed6fd84380fde286153435e0641a0ef))(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(2ed6fd84380fde286153435e0641a0ef)
+ 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@7.0.2)))(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@7.0.2))':
+ 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
+ optionalDependencies:
+ '@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@7.0.2))
+ 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@7.0.2)
+
+ '@better-auth/scim@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(22e2e61d74361da37f96c4dc24795f27))(better-call@1.3.7(zod@4.3.6))':
+ 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-auth: 1.6.23(22e2e61d74361da37f96c4dc24795f27)
+ better-call: 1.3.7(zod@4.3.6)
+ zod: 4.3.6
+
+ '@better-auth/scim@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(2ed6fd84380fde286153435e0641a0ef))(better-call@1.3.7(zod@4.3.6))':
+ 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-auth: 1.6.23(2ed6fd84380fde286153435e0641a0ef)
+ better-call: 1.3.7(zod@4.3.6)
+ zod: 4.3.6
+
+ '@better-auth/sso@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(22e2e61d74361da37f96c4dc24795f27))(better-call@1.3.7(zod@4.3.6))':
+ 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
+ better-auth: 1.6.23(22e2e61d74361da37f96c4dc24795f27)
better-call: 1.3.7(zod@4.3.6)
fast-xml-parser: 5.9.3
jose: 6.1.3
@@ -9173,12 +9721,12 @@ snapshots:
tldts: 6.1.86
zod: 4.3.6
- '@better-auth/sso@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))':
+ '@better-auth/sso@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(2ed6fd84380fde286153435e0641a0ef))(better-call@1.3.7(zod@4.3.6))':
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
- better-auth: 1.6.23(c1a003db19823d196c7d6468bf307df5)
+ better-auth: 1.6.23(2ed6fd84380fde286153435e0641a0ef)
better-call: 1.3.7(zod@4.3.6)
fast-xml-parser: 5.9.3
jose: 6.1.3
@@ -9198,39 +9746,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': {}
@@ -9307,7 +9855,7 @@ snapshots:
'@codemirror/lint@6.9.4':
dependencies:
'@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
+ '@codemirror/view': 6.43.8
crelt: 1.0.7
'@codemirror/search@6.7.1':
@@ -9324,7 +9872,7 @@ snapshots:
dependencies:
'@codemirror/language': 6.12.4
'@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
+ '@codemirror/view': 6.43.8
'@lezer/highlight': 1.2.3
'@codemirror/view@6.43.6':
@@ -9334,11 +9882,18 @@ snapshots:
style-mod: 4.1.3
w3c-keyname: 2.2.8
+ '@codemirror/view@6.43.8':
+ dependencies:
+ '@codemirror/state': 6.7.1
+ crelt: 1.0.7
+ style-mod: 4.1.3
+ w3c-keyname: 2.2.8
+
'@date-fns/tz@1.5.0': {}
- '@dokploy/trpc-openapi@0.0.18(@trpc/server@11.10.0(typescript@5.9.3))(zod-openapi@5.4.6(zod@4.3.6))(zod@4.3.6)':
+ '@dokploy/trpc-openapi@0.0.18(@trpc/server@11.10.0(typescript@7.0.2))(zod-openapi@5.4.6(zod@4.3.6))(zod@4.3.6)':
dependencies:
- '@trpc/server': 11.10.0(typescript@5.9.3)
+ '@trpc/server': 11.10.0(typescript@7.0.2)
co-body: 6.2.0
h3: 1.15.1
openapi3-ts: 4.4.0
@@ -9385,7 +9940,7 @@ snapshots:
'@electric-sql/pglite@0.3.15':
optional: true
- '@emnapi/runtime@1.8.1':
+ '@emnapi/runtime@1.11.3':
dependencies:
tslib: 2.8.1
optional: true
@@ -9502,6 +10057,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
@@ -9521,101 +10078,111 @@ snapshots:
'@standard-schema/utils': 0.3.0
react-hook-form: 7.71.2(react@19.2.7)
- '@img/colour@1.0.0':
+ '@img/colour@1.1.0':
optional: true
- '@img/sharp-darwin-arm64@0.34.5':
+ '@img/sharp-darwin-arm64@0.35.3':
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-arm64': 1.3.2
optional: true
- '@img/sharp-darwin-x64@0.34.5':
+ '@img/sharp-darwin-x64@0.35.3':
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.3.2
optional: true
- '@img/sharp-libvips-darwin-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-darwin-x64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-arm@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-ppc64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-riscv64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-s390x@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linux-x64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-x64@1.2.4':
- optional: true
-
- '@img/sharp-linux-arm64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.2.4
- optional: true
-
- '@img/sharp-linux-arm@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.2.4
- optional: true
-
- '@img/sharp-linux-ppc64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-ppc64': 1.2.4
- optional: true
-
- '@img/sharp-linux-riscv64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-riscv64': 1.2.4
- optional: true
-
- '@img/sharp-linux-s390x@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.2.4
- optional: true
-
- '@img/sharp-linux-x64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.2.4
- optional: true
-
- '@img/sharp-linuxmusl-arm64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
- optional: true
-
- '@img/sharp-linuxmusl-x64@0.34.5':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.2.4
- optional: true
-
- '@img/sharp-wasm32@0.34.5':
+ '@img/sharp-freebsd-wasm32@0.35.3':
dependencies:
- '@emnapi/runtime': 1.8.1
+ '@img/sharp-wasm32': 0.35.3
optional: true
- '@img/sharp-win32-arm64@0.34.5':
+ '@img/sharp-libvips-darwin-arm64@1.3.2':
optional: true
- '@img/sharp-win32-ia32@0.34.5':
+ '@img/sharp-libvips-darwin-x64@1.3.2':
optional: true
- '@img/sharp-win32-x64@0.34.5':
+ '@img/sharp-libvips-linux-arm64@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.2':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.3.2':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-arm@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-s390x@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-x64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.2
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.2
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.2
+ optional: true
+
+ '@img/sharp-wasm32@0.35.3':
+ dependencies:
+ '@emnapi/runtime': 1.11.3
+ optional: true
+
+ '@img/sharp-webcontainers-wasm32@0.35.3':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.3
+ optional: true
+
+ '@img/sharp-win32-arm64@0.35.3':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.35.3':
+ optional: true
+
+ '@img/sharp-win32-x64@0.35.3':
optional: true
'@inngest/ai@0.1.7':
@@ -9779,6 +10346,8 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
+ '@levischuck/tiny-cbor@0.2.11': {}
+
'@lezer/common@1.5.2': {}
'@lezer/css@1.3.1':
@@ -9846,7 +10415,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@mongodb-js/saslprep@1.4.12':
+ '@mongodb-js/saslprep@1.4.13':
dependencies:
sparse-bitfield: 3.0.3
optional: true
@@ -9875,30 +10444,30 @@ snapshots:
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
optional: true
- '@next/env@16.2.6': {}
+ '@next/env@16.3.0': {}
- '@next/swc-darwin-arm64@16.2.6':
+ '@next/swc-darwin-arm64@16.3.0':
optional: true
- '@next/swc-darwin-x64@16.2.6':
+ '@next/swc-darwin-x64@16.3.0':
optional: true
- '@next/swc-linux-arm64-gnu@16.2.6':
+ '@next/swc-linux-arm64-gnu@16.3.0':
optional: true
- '@next/swc-linux-arm64-musl@16.2.6':
+ '@next/swc-linux-arm64-musl@16.3.0':
optional: true
- '@next/swc-linux-x64-gnu@16.2.6':
+ '@next/swc-linux-x64-gnu@16.3.0':
optional: true
- '@next/swc-linux-x64-musl@16.2.6':
+ '@next/swc-linux-x64-musl@16.3.0':
optional: true
- '@next/swc-win32-arm64-msvc@16.2.6':
+ '@next/swc-win32-arm64-msvc@16.3.0':
optional: true
- '@next/swc-win32-x64-msvc@16.2.6':
+ '@next/swc-win32-x64-msvc@16.3.0':
optional: true
'@noble/ciphers@1.3.0': {}
@@ -10813,9 +11382,109 @@ snapshots:
'@oslojs/encoding@1.1.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))':
+ '@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@7.0.2))':
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)
+ 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@7.0.2)
optional: true
'@prisma/config@7.4.1':
@@ -10834,7 +11503,7 @@ snapshots:
'@prisma/debug@7.4.1':
optional: true
- '@prisma/dev@0.20.0(typescript@5.9.3)':
+ '@prisma/dev@0.20.0(typescript@7.0.2)':
dependencies:
'@electric-sql/pglite': 0.3.15
'@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15)
@@ -10851,7 +11520,7 @@ snapshots:
proper-lockfile: 4.1.2
remeda: 2.33.4
std-env: 3.10.0
- valibot: 1.2.0(typescript@5.9.3)
+ valibot: 1.2.0(typescript@7.0.2)
zeptomatch: 2.1.0
transitivePeerDependencies:
- typescript
@@ -12030,10 +12699,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.32.0':
+ dependencies:
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@smithy/credential-provider-imds@4.5.0':
+ dependencies:
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@smithy/fetch-http-handler@5.7.0':
+ dependencies:
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@smithy/node-http-handler@4.10.0':
+ dependencies:
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@smithy/signature-v4@5.7.0':
+ dependencies:
+ '@smithy/core': 3.32.0
+ '@smithy/types': 4.17.0
+ tslib: 2.8.1
+
+ '@smithy/types@4.17.0':
+ dependencies:
+ tslib: 2.8.1
+
'@stablelib/base64@1.0.1': {}
'@standard-schema/spec@1.1.0': {}
@@ -12588,34 +13303,34 @@ snapshots:
tree-sitter: 0.22.4
optional: true
- '@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)':
+ '@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2)':
dependencies:
- '@trpc/server': 11.10.0(typescript@5.9.3)
- typescript: 5.9.3
+ '@trpc/server': 11.10.0(typescript@7.0.2)
+ typescript: 7.0.2
- '@trpc/next@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)':
+ '@trpc/next@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(react@19.2.7)(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@7.0.2)':
dependencies:
- '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
- '@trpc/server': 11.10.0(typescript@5.9.3)
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2)
+ '@trpc/server': 11.10.0(typescript@7.0.2)
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- typescript: 5.9.3
+ typescript: 7.0.2
optionalDependencies:
'@tanstack/react-query': 5.90.21(react@19.2.7)
- '@trpc/react-query': 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3)
+ '@trpc/react-query': 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(react@19.2.7)(typescript@7.0.2)
- '@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3)':
+ '@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.10.0(typescript@7.0.2))(react@19.2.7)(typescript@7.0.2)':
dependencies:
'@tanstack/react-query': 5.90.21(react@19.2.7)
- '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
- '@trpc/server': 11.10.0(typescript@5.9.3)
+ '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@7.0.2))(typescript@7.0.2)
+ '@trpc/server': 11.10.0(typescript@7.0.2)
react: 19.2.7
- typescript: 5.9.3
+ typescript: 7.0.2
- '@trpc/server@11.10.0(typescript@5.9.3)':
+ '@trpc/server@11.10.0(typescript@7.0.2)':
dependencies:
- typescript: 5.9.3
+ typescript: 7.0.2
'@ts-morph/common@0.27.0':
dependencies:
@@ -12837,6 +13552,66 @@ snapshots:
dependencies:
'@types/node': 24.10.13
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-darwin-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-arm@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-loong64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-s390x@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-sunos-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-win32-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-win32-x64@7.0.2':
+ optional: true
+
'@uiw/codemirror-extensions-basic-setup@4.25.4(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.4)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.4)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)':
dependencies:
'@codemirror/autocomplete': 6.20.3
@@ -13075,6 +13850,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:
@@ -13132,14 +13913,14 @@ snapshots:
before-after-hook@2.2.3: {}
- better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193):
+ better-auth@1.6.23(22e2e61d74361da37f96c4dc24795f27):
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/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))
+ '@better-auth/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))
'@better-auth/kysely-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)(kysely@0.29.3)
'@better-auth/memory-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)
'@better-auth/mongo-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)(mongodb@7.1.0(socks@2.8.8))
- '@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))
+ '@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@7.0.2)))(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@7.0.2))
'@better-auth/telemetry': 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/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -13152,30 +13933,30 @@ snapshots:
nanostores: 1.1.1
zod: 4.3.6
optionalDependencies:
- '@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/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@7.0.2))
better-sqlite3: 12.6.2
drizzle-kit: 0.31.9
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
mongodb: 7.1.0(socks@2.8.8)
mysql2: 3.15.3
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
pg: 8.18.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@7.0.2)
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(jiti@1.21.7)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+ vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
transitivePeerDependencies:
- '@cloudflare/workers-types'
- '@opentelemetry/api'
- better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5):
+ better-auth@1.6.23(2ed6fd84380fde286153435e0641a0ef):
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/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))
+ '@better-auth/drizzle-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)(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))
'@better-auth/kysely-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)(kysely@0.29.3)
'@better-auth/memory-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)
'@better-auth/mongo-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)(mongodb@7.1.0(socks@2.8.8))
- '@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))
+ '@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@7.0.2)))(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@7.0.2))
'@better-auth/telemetry': 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/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -13188,18 +13969,18 @@ snapshots:
nanostores: 1.1.1
zod: 4.3.6
optionalDependencies:
- '@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/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@7.0.2))
better-sqlite3: 12.6.2
drizzle-kit: 0.31.9
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
mongodb: 7.1.0(socks@2.8.8)
mysql2: 3.15.3
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
pg: 8.18.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@7.0.2)
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+ vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(jiti@1.21.7)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
transitivePeerDependencies:
- '@cloudflare/workers-types'
- '@opentelemetry/api'
@@ -13257,6 +14038,8 @@ snapshots:
bottleneck@2.19.5: {}
+ bowser@2.14.1: {}
+
boxen@7.1.1:
dependencies:
ansi-align: 3.0.1
@@ -13289,7 +14072,7 @@ snapshots:
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
- bson@7.3.1:
+ bson@7.3.2:
optional: true
btoa-lite@1.0.0: {}
@@ -13335,7 +14118,7 @@ snapshots:
confbox: 0.2.4
defu: 6.1.7
dotenv: 16.6.1
- exsolve: 1.1.0
+ exsolve: 1.1.1
giget: 2.0.0
jiti: 2.7.0
ohash: 2.0.11
@@ -13515,7 +14298,7 @@ snapshots:
'@codemirror/lint': 6.9.4
'@codemirror/search': 6.7.1
'@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
+ '@codemirror/view': 6.43.8
color-convert@2.0.1:
dependencies:
@@ -13595,14 +14378,14 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
- cosmiconfig@9.0.2(typescript@5.9.3):
+ cosmiconfig@9.0.2(typescript@7.0.2):
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.1
js-yaml: 4.1.1
parse-json: 5.2.0
optionalDependencies:
- typescript: 5.9.3
+ typescript: 7.0.2
cpu-features@0.0.10:
dependencies:
@@ -13828,9 +14611,9 @@ snapshots:
drange@1.1.1: {}
- drizzle-dbml-generator@0.10.0(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))):
+ drizzle-dbml-generator@0.10.0(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))):
dependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
drizzle-kit@0.31.9:
dependencies:
@@ -13841,40 +14624,40 @@ snapshots:
transitivePeerDependencies:
- supports-color
- drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.7)(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)):
+ drizzle-orm@0.45.1(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.7)(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@7.0.2)):
optionalDependencies:
'@electric-sql/pglite': 0.3.15
'@opentelemetry/api': 1.9.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))
+ '@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@7.0.2))
'@types/pg': 8.16.0
better-sqlite3: 12.6.2
kysely: 0.29.3
mysql2: 3.15.3
pg: 8.18.0
postgres: 3.4.7
- 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@7.0.2)
- drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)):
+ drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)):
optionalDependencies:
'@electric-sql/pglite': 0.3.15
'@opentelemetry/api': 1.9.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))
+ '@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@7.0.2))
'@types/pg': 8.16.0
better-sqlite3: 12.6.2
kysely: 0.29.3
mysql2: 3.15.3
pg: 8.18.0
postgres: 3.4.4
- 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@7.0.2)
- drizzle-zod@0.5.1(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))(zod@4.3.6):
+ drizzle-zod@0.5.1(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))(zod@4.3.6):
dependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
zod: 4.3.6
- drizzle-zod@0.8.3(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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)))(zod@4.3.6):
+ drizzle-zod@0.8.3(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2)))(zod@4.3.6):
dependencies:
- drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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))
+ drizzle-orm: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.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@7.0.2)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(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@7.0.2))
zod: 4.3.6
dunder-proto@1.0.1:
@@ -14110,7 +14893,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- exsolve@1.1.0:
+ exsolve@1.1.1:
optional: true
extend@3.0.2: {}
@@ -14352,7 +15135,7 @@ snapshots:
consola: 3.4.2
defu: 6.1.7
node-fetch-native: 1.6.7
- nypm: 0.6.8
+ nypm: 0.6.9
pathe: 2.0.3
optional: true
@@ -14417,7 +15200,7 @@ snapshots:
graceful-fs@4.2.11: {}
- grammex@3.1.12:
+ grammex@3.1.13:
optional: true
graphmatch@1.1.1:
@@ -14615,7 +15398,7 @@ snapshots:
inline-style-parser@0.2.7: {}
- inngest@3.40.1(encoding@0.1.13)(express@5.2.1)(h3@1.15.1)(hono@4.12.2)(next@16.2.6(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@5.9.3):
+ inngest@3.40.1(encoding@0.1.13)(express@5.2.1)(h3@1.15.1)(hono@4.12.2)(next@16.3.0(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@7.0.2):
dependencies:
'@bufbuild/protobuf': 2.11.0
'@inngest/ai': 0.1.7
@@ -14643,8 +15426,8 @@ snapshots:
express: 5.2.1
h3: 1.15.1
hono: 4.12.2
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
- typescript: 5.9.3
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ typescript: 7.0.2
transitivePeerDependencies:
- encoding
- supports-color
@@ -14690,6 +15473,9 @@ snapshots:
ip-address@10.2.0: {}
+ ip-address@10.5.0:
+ optional: true
+
ip-regex@5.0.0: {}
ipaddr.js@1.9.1: {}
@@ -15374,7 +16160,7 @@ snapshots:
module-details-from-path@1.0.4: {}
- mongodb-connection-string-url@7.0.1:
+ mongodb-connection-string-url@7.0.2:
dependencies:
'@types/whatwg-url': 13.0.0
whatwg-url: 14.2.0
@@ -15382,9 +16168,9 @@ snapshots:
mongodb@7.1.0(socks@2.8.8):
dependencies:
- '@mongodb-js/saslprep': 1.4.12
- bson: 7.3.1
- mongodb-connection-string-url: 7.0.1
+ '@mongodb-js/saslprep': 1.4.13
+ bson: 7.3.2
+ mongodb-connection-string-url: 7.0.2
optionalDependencies:
socks: 2.8.8
optional: true
@@ -15440,6 +16226,8 @@ snapshots:
nanoid@3.3.12: {}
+ nanoid@3.3.18: {}
+
nanostores@1.1.1: {}
napi-build-utils@2.0.0:
@@ -15449,40 +16237,41 @@ snapshots:
neotraverse@0.6.18: {}
- next-themes@0.2.1(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ next-themes@0.2.1(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- '@next/env': 16.2.6
+ '@next/env': 16.3.0
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.0
caniuse-lite: 1.0.30001774
- postcss: 8.4.31
+ postcss: 8.5.23
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.7)
optionalDependencies:
- '@next/swc-darwin-arm64': 16.2.6
- '@next/swc-darwin-x64': 16.2.6
- '@next/swc-linux-arm64-gnu': 16.2.6
- '@next/swc-linux-arm64-musl': 16.2.6
- '@next/swc-linux-x64-gnu': 16.2.6
- '@next/swc-linux-x64-musl': 16.2.6
- '@next/swc-win32-arm64-msvc': 16.2.6
- '@next/swc-win32-x64-msvc': 16.2.6
+ '@next/swc-darwin-arm64': 16.3.0
+ '@next/swc-darwin-x64': 16.3.0
+ '@next/swc-linux-arm64-gnu': 16.3.0
+ '@next/swc-linux-arm64-musl': 16.3.0
+ '@next/swc-linux-x64-gnu': 16.3.0
+ '@next/swc-linux-x64-musl': 16.3.0
+ '@next/swc-win32-arm64-msvc': 16.3.0
+ '@next/swc-win32-x64-msvc': 16.3.0
'@opentelemetry/api': 1.9.0
- sharp: 0.34.5
+ sharp: 0.35.3(@types/node@24.10.13)
transitivePeerDependencies:
- '@babel/core'
+ - '@types/node'
- babel-plugin-macros
- nextjs-toploader@3.9.17(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ nextjs-toploader@3.9.17(next@16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- next: 16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ next: 16.3.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
nprogress: 0.2.0
prop-types: 15.8.1
react: 19.2.7
@@ -15579,11 +16368,11 @@ snapshots:
nprogress@0.2.0: {}
- nypm@0.6.8:
+ nypm@0.6.9:
dependencies:
citty: 0.2.2
pathe: 2.0.3
- tinyexec: 1.2.4
+ tinyexec: 1.3.0
optional: true
object-assign@4.1.1: {}
@@ -15772,6 +16561,9 @@ snapshots:
pg-protocol@1.15.0: {}
+ pg-protocol@1.16.0:
+ optional: true
+
pg-types@2.2.0:
dependencies:
pg-int8: 1.0.1
@@ -15784,7 +16576,7 @@ snapshots:
dependencies:
pg-connection-string: 2.14.0
pg-pool: 3.14.0(pg@8.18.0)
- pg-protocol: 1.15.0
+ pg-protocol: 1.16.0
pg-types: 2.2.0
pgpass: 1.0.5
optionalDependencies:
@@ -15851,7 +16643,7 @@ snapshots:
pkg-types@2.3.1:
dependencies:
confbox: 0.2.4
- exsolve: 1.1.0
+ exsolve: 1.1.1
pathe: 2.0.3
optional: true
@@ -15912,18 +16704,18 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.4.31:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
postcss@8.5.15:
dependencies:
nanoid: 3.3.12
picocolors: 1.1.1
source-map-js: 1.2.1
+ postcss@8.5.23:
+ dependencies:
+ nanoid: 3.3.18
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postgres-array@2.0.0: {}
postgres-bytea@1.0.1: {}
@@ -15963,17 +16755,17 @@ snapshots:
dependencies:
parse-ms: 4.0.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@7.0.2):
dependencies:
'@prisma/config': 7.4.1
- '@prisma/dev': 0.20.0(typescript@5.9.3)
+ '@prisma/dev': 0.20.0(typescript@7.0.2)
'@prisma/engines': 7.4.1
'@prisma/studio-core': 0.13.1(@types/react@18.3.5)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
mysql2: 3.15.3
postgres: 3.4.7
optionalDependencies:
better-sqlite3: 12.6.2
- typescript: 5.9.3
+ typescript: 7.0.2
transitivePeerDependencies:
- '@types/react'
- magicast
@@ -16047,6 +16839,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 +17185,8 @@ snapshots:
redux@5.0.1: {}
+ reflect-metadata@0.2.2: {}
+
refractor@5.0.0:
dependencies:
'@types/hast': 3.0.4
@@ -16565,6 +17365,9 @@ snapshots:
semver@7.7.3: {}
+ semver@7.8.5:
+ optional: true
+
send@1.2.1:
dependencies:
debug: 4.4.3
@@ -16620,7 +17423,7 @@ snapshots:
safe-buffer: 5.2.1
to-buffer: 1.2.2
- shadcn@4.11.0(typescript@5.9.3):
+ shadcn@4.11.0(typescript@7.0.2):
dependencies:
'@babel/core': 7.29.0
'@babel/parser': 7.29.0
@@ -16631,7 +17434,7 @@ snapshots:
'@types/validate-npm-package-name': 4.0.2
browserslist: 4.28.1
commander: 14.0.3
- cosmiconfig: 9.0.2(typescript@5.9.3)
+ cosmiconfig: 9.0.2(typescript@7.0.2)
dedent: 1.7.2
deepmerge: 4.3.1
diff: 8.0.4
@@ -16661,36 +17464,38 @@ snapshots:
- supports-color
- typescript
- sharp@0.34.5:
+ sharp@0.35.3(@types/node@24.10.13):
dependencies:
- '@img/colour': 1.0.0
+ '@img/colour': 1.1.0
detect-libc: 2.1.2
- semver: 7.7.3
+ semver: 7.8.5
optionalDependencies:
- '@img/sharp-darwin-arm64': 0.34.5
- '@img/sharp-darwin-x64': 0.34.5
- '@img/sharp-libvips-darwin-arm64': 1.2.4
- '@img/sharp-libvips-darwin-x64': 1.2.4
- '@img/sharp-libvips-linux-arm': 1.2.4
- '@img/sharp-libvips-linux-arm64': 1.2.4
- '@img/sharp-libvips-linux-ppc64': 1.2.4
- '@img/sharp-libvips-linux-riscv64': 1.2.4
- '@img/sharp-libvips-linux-s390x': 1.2.4
- '@img/sharp-libvips-linux-x64': 1.2.4
- '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
- '@img/sharp-libvips-linuxmusl-x64': 1.2.4
- '@img/sharp-linux-arm': 0.34.5
- '@img/sharp-linux-arm64': 0.34.5
- '@img/sharp-linux-ppc64': 0.34.5
- '@img/sharp-linux-riscv64': 0.34.5
- '@img/sharp-linux-s390x': 0.34.5
- '@img/sharp-linux-x64': 0.34.5
- '@img/sharp-linuxmusl-arm64': 0.34.5
- '@img/sharp-linuxmusl-x64': 0.34.5
- '@img/sharp-wasm32': 0.34.5
- '@img/sharp-win32-arm64': 0.34.5
- '@img/sharp-win32-ia32': 0.34.5
- '@img/sharp-win32-x64': 0.34.5
+ '@img/sharp-darwin-arm64': 0.35.3
+ '@img/sharp-darwin-x64': 0.35.3
+ '@img/sharp-freebsd-wasm32': 0.35.3
+ '@img/sharp-libvips-darwin-arm64': 1.3.2
+ '@img/sharp-libvips-darwin-x64': 1.3.2
+ '@img/sharp-libvips-linux-arm': 1.3.2
+ '@img/sharp-libvips-linux-arm64': 1.3.2
+ '@img/sharp-libvips-linux-ppc64': 1.3.2
+ '@img/sharp-libvips-linux-riscv64': 1.3.2
+ '@img/sharp-libvips-linux-s390x': 1.3.2
+ '@img/sharp-libvips-linux-x64': 1.3.2
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.2
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.2
+ '@img/sharp-linux-arm': 0.35.3
+ '@img/sharp-linux-arm64': 0.35.3
+ '@img/sharp-linux-ppc64': 0.35.3
+ '@img/sharp-linux-riscv64': 0.35.3
+ '@img/sharp-linux-s390x': 0.35.3
+ '@img/sharp-linux-x64': 0.35.3
+ '@img/sharp-linuxmusl-arm64': 0.35.3
+ '@img/sharp-linuxmusl-x64': 0.35.3
+ '@img/sharp-webcontainers-wasm32': 0.35.3
+ '@img/sharp-win32-arm64': 0.35.3
+ '@img/sharp-win32-ia32': 0.35.3
+ '@img/sharp-win32-x64': 0.35.3
+ '@types/node': 24.10.13
optional: true
shebang-command@2.0.0:
@@ -16772,7 +17577,7 @@ snapshots:
socks@2.8.8:
dependencies:
- ip-address: 10.2.0
+ ip-address: 10.5.0
smart-buffer: 4.2.0
optional: true
@@ -17115,6 +17920,9 @@ snapshots:
tinyexec@1.2.4: {}
+ tinyexec@1.3.0:
+ optional: true
+
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
@@ -17199,9 +18007,9 @@ snapshots:
normalize-path: 3.0.0
plimit-lit: 1.6.1
- tsconfck@3.1.6(typescript@5.9.3):
+ tsconfck@3.1.6(typescript@7.0.2):
optionalDependencies:
- typescript: 5.9.3
+ typescript: 7.0.2
tsconfig-paths@4.2.0:
dependencies:
@@ -17209,6 +18017,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 +18027,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
@@ -17253,6 +18067,29 @@ snapshots:
typescript@5.9.3: {}
+ typescript@7.0.2:
+ optionalDependencies:
+ '@typescript/typescript-aix-ppc64': 7.0.2
+ '@typescript/typescript-darwin-arm64': 7.0.2
+ '@typescript/typescript-darwin-x64': 7.0.2
+ '@typescript/typescript-freebsd-arm64': 7.0.2
+ '@typescript/typescript-freebsd-x64': 7.0.2
+ '@typescript/typescript-linux-arm': 7.0.2
+ '@typescript/typescript-linux-arm64': 7.0.2
+ '@typescript/typescript-linux-loong64': 7.0.2
+ '@typescript/typescript-linux-mips64el': 7.0.2
+ '@typescript/typescript-linux-ppc64': 7.0.2
+ '@typescript/typescript-linux-riscv64': 7.0.2
+ '@typescript/typescript-linux-s390x': 7.0.2
+ '@typescript/typescript-linux-x64': 7.0.2
+ '@typescript/typescript-netbsd-arm64': 7.0.2
+ '@typescript/typescript-netbsd-x64': 7.0.2
+ '@typescript/typescript-openbsd-arm64': 7.0.2
+ '@typescript/typescript-openbsd-x64': 7.0.2
+ '@typescript/typescript-sunos-x64': 7.0.2
+ '@typescript/typescript-win32-arm64': 7.0.2
+ '@typescript/typescript-win32-x64': 7.0.2
+
ufo@1.6.3: {}
uncrypto@0.1.3: {}
@@ -17359,9 +18196,9 @@ snapshots:
uuid@9.0.1: {}
- valibot@1.2.0(typescript@5.9.3):
+ valibot@1.2.0(typescript@7.0.2):
optionalDependencies:
- typescript: 5.9.3
+ typescript: 7.0.2
optional: true
validate-npm-package-name@7.0.2: {}
@@ -17395,11 +18232,11 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vite-tsconfig-paths@4.3.2(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)):
+ vite-tsconfig-paths@4.3.2(typescript@7.0.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)):
dependencies:
debug: 4.4.3
globrex: 0.1.2
- tsconfck: 3.1.6(typescript@5.9.3)
+ tsconfck: 3.1.6(typescript@7.0.2)
optionalDependencies:
vite: 7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
transitivePeerDependencies:
@@ -17688,7 +18525,7 @@ snapshots:
zeptomatch@2.1.0:
dependencies:
- grammex: 3.1.12
+ grammex: 3.1.13
graphmatch: 1.1.1
optional: true
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 4c1316ebc..cfb212d89 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -4,4 +4,10 @@ packages:
- "apps/schedules"
- "packages/server"
+# Supply-chain hardening: refuse package versions younger than N days,
+# so newly-published malicious versions get caught/yanked before we install them.
+# Disabled for now — kept breaking builds on unrelated fresh transitive deps
+# (see PR #4679). Re-enable when there's a per-scope threshold or exclude list.
+# minimumReleaseAge: 1440
+