diff --git a/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts b/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
index 38948ac5c..c12a272bc 100644
--- a/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
+++ b/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
@@ -1,7 +1,6 @@
-import { beforeEach, describe, expect, it, vi } from "vitest";
-
import type { ApplicationNested } from "@dokploy/server/utils/builders";
import { mechanizeDockerContainer } from "@dokploy/server/utils/builders";
+import { beforeEach, describe, expect, it, vi } from "vitest";
type MockCreateServiceOptions = {
TaskTemplate?: {
diff --git a/apps/dokploy/components/dashboard/project/advanced-environment-selector.tsx b/apps/dokploy/components/dashboard/project/advanced-environment-selector.tsx
index 172e8bbaf..a80197065 100644
--- a/apps/dokploy/components/dashboard/project/advanced-environment-selector.tsx
+++ b/apps/dokploy/components/dashboard/project/advanced-environment-selector.tsx
@@ -1,15 +1,8 @@
import type { findEnvironmentsByProjectId } from "@dokploy/server";
-import {
- ChevronDownIcon,
- PencilIcon,
- PlusIcon,
- Terminal,
- TrashIcon,
-} from "lucide-react";
+import { ChevronDownIcon, PencilIcon, PlusIcon, TrashIcon } from "lucide-react";
import { useRouter } from "next/router";
import { useState } from "react";
import { toast } from "sonner";
-import { EnvironmentVariables } from "@/components/dashboard/project/environment-variables";
import { AlertBlock } from "@/components/shared/alert-block";
import { Button } from "@/components/ui/button";
import {
@@ -246,20 +239,6 @@ export const AdvancedEnvironmentSelector = ({
)}
-
- {/* Action buttons for non-production environments */}
- {/*
-
- */}
{environment.name !== "production" && (
,
label: "ntfy",
},
+ custom: {
+ icon:
,
+ label: "Custom",
+ },
};
export type NotificationSchema = z.infer
;
@@ -180,6 +205,13 @@ export const HandleNotifications = ({ notificationId }: Props) => {
api.notification.testNtfyConnection.useMutation();
const { mutateAsync: testLarkConnection, isLoading: isLoadingLark } =
api.notification.testLarkConnection.useMutation();
+
+ const { mutateAsync: testCustomConnection, isLoading: isLoadingCustom } =
+ api.notification.testCustomConnection.useMutation();
+
+ const customMutation = notificationId
+ ? api.notification.updateCustom.useMutation()
+ : api.notification.createCustom.useMutation();
const slackMutation = notificationId
? api.notification.updateSlack.useMutation()
: api.notification.createSlack.useMutation();
@@ -218,6 +250,15 @@ export const HandleNotifications = ({ notificationId }: Props) => {
name: "toAddresses" as never,
});
+ const {
+ fields: headerFields,
+ append: appendHeader,
+ remove: removeHeader,
+ } = useFieldArray({
+ control: form.control,
+ name: "headers" as never,
+ });
+
useEffect(() => {
if (type === "email" && fields.length === 0) {
append("");
@@ -330,6 +371,26 @@ export const HandleNotifications = ({ notificationId }: Props) => {
dockerCleanup: notification.dockerCleanup,
serverThreshold: notification.serverThreshold,
});
+ } else if (notification.notificationType === "custom") {
+ form.reset({
+ appBuildError: notification.appBuildError,
+ appDeploy: notification.appDeploy,
+ dokployRestart: notification.dokployRestart,
+ databaseBackup: notification.databaseBackup,
+ type: notification.notificationType,
+ endpoint: notification.custom?.endpoint || "",
+ headers: notification.custom?.headers
+ ? Object.entries(notification.custom.headers).map(
+ ([key, value]) => ({
+ key,
+ value,
+ }),
+ )
+ : [],
+ name: notification.name,
+ dockerCleanup: notification.dockerCleanup,
+ serverThreshold: notification.serverThreshold,
+ });
}
} else {
form.reset();
@@ -344,6 +405,7 @@ export const HandleNotifications = ({ notificationId }: Props) => {
gotify: gotifyMutation,
ntfy: ntfyMutation,
lark: larkMutation,
+ custom: customMutation,
};
const onSubmit = async (data: NotificationSchema) => {
@@ -467,6 +529,32 @@ export const HandleNotifications = ({ notificationId }: Props) => {
larkId: notification?.larkId || "",
serverThreshold: serverThreshold,
});
+ } else if (data.type === "custom") {
+ // Convert headers array to object
+ const headersRecord =
+ data.headers && data.headers.length > 0
+ ? data.headers.reduce(
+ (acc, { key, value }) => {
+ if (key.trim()) acc[key] = value;
+ return acc;
+ },
+ {} as Record,
+ )
+ : undefined;
+
+ promise = customMutation.mutateAsync({
+ appBuildError: appBuildError,
+ appDeploy: appDeploy,
+ dokployRestart: dokployRestart,
+ databaseBackup: databaseBackup,
+ endpoint: data.endpoint,
+ headers: headersRecord,
+ name: data.name,
+ dockerCleanup: dockerCleanup,
+ serverThreshold: serverThreshold,
+ notificationId: notificationId || "",
+ customId: notification?.customId || "",
+ });
}
if (promise) {
@@ -1057,7 +1145,92 @@ export const HandleNotifications = ({ notificationId }: Props) => {
/>
>
)}
+ {type === "custom" && (
+
+
(
+
+ Webhook URL
+
+
+
+
+ The URL where POST requests will be sent with
+ notification data.
+
+
+
+ )}
+ />
+
+
+ Headers
+
+ Optional. Custom headers for your POST request (e.g.,
+ Authorization, Content-Type).
+
+
+
+
+
+
+
+
+ )}
{type === "lark" && (
<>
{
isLoadingEmail ||
isLoadingGotify ||
isLoadingNtfy ||
- isLoadingLark
+ isLoadingLark ||
+ isLoadingCustom
}
variant="secondary"
type="button"
@@ -1304,6 +1478,21 @@ export const HandleNotifications = ({ notificationId }: Props) => {
await testLarkConnection({
webhookUrl: data.webhookUrl,
});
+ } else if (data.type === "custom") {
+ const headersRecord =
+ data.headers && data.headers.length > 0
+ ? data.headers.reduce(
+ (acc, { key, value }) => {
+ if (key.trim()) acc[key] = value;
+ return acc;
+ },
+ {} as Record,
+ )
+ : undefined;
+ await testCustomConnection({
+ endpoint: data.endpoint,
+ headers: headersRecord,
+ });
}
toast.success("Connection Success");
} catch (error) {
diff --git a/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx b/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx
index 5b7a2220e..06ffd91e4 100644
--- a/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx
+++ b/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx
@@ -1,4 +1,4 @@
-import { Bell, Loader2, Mail, Trash2 } from "lucide-react";
+import { Bell, Loader2, Mail, PenBoxIcon, Trash2 } from "lucide-react";
import { toast } from "sonner";
import {
DiscordIcon,
@@ -96,6 +96,11 @@ export const ShowNotifications = () => {
)}
+ {notification.notificationType === "custom" && (
+
+ )}
{notification.notificationType === "lark" && (
diff --git a/apps/dokploy/drizzle/0129_pale_roughhouse.sql b/apps/dokploy/drizzle/0129_pale_roughhouse.sql
new file mode 100644
index 000000000..682c0adc2
--- /dev/null
+++ b/apps/dokploy/drizzle/0129_pale_roughhouse.sql
@@ -0,0 +1,9 @@
+ALTER TYPE "public"."notificationType" ADD VALUE 'custom' BEFORE 'lark';--> statement-breakpoint
+CREATE TABLE "custom" (
+ "customId" text PRIMARY KEY NOT NULL,
+ "endpoint" text NOT NULL,
+ "headers" jsonb
+);
+--> statement-breakpoint
+ALTER TABLE "notification" ADD COLUMN "customId" text;--> statement-breakpoint
+ALTER TABLE "notification" ADD CONSTRAINT "notification_customId_custom_customId_fk" FOREIGN KEY ("customId") REFERENCES "public"."custom"("customId") ON DELETE cascade ON UPDATE no action;
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0129_snapshot.json b/apps/dokploy/drizzle/meta/0129_snapshot.json
new file mode 100644
index 000000000..55e60da1b
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0129_snapshot.json
@@ -0,0 +1,6915 @@
+{
+ "id": "202e5dc1-5107-44cc-8c79-3f98a2fce763",
+ "prevId": "44ed41b9-c44b-495d-b210-b3c2ca666544",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.account": {
+ "name": "account",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "account_id": {
+ "name": "account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_id": {
+ "name": "provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "id_token": {
+ "name": "id_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token_expires_at": {
+ "name": "access_token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token_expires_at": {
+ "name": "refresh_token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scope": {
+ "name": "scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "resetPasswordToken": {
+ "name": "resetPasswordToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "resetPasswordExpiresAt": {
+ "name": "resetPasswordExpiresAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "confirmationToken": {
+ "name": "confirmationToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "confirmationExpiresAt": {
+ "name": "confirmationExpiresAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "account_user_id_user_id_fk": {
+ "name": "account_user_id_user_id_fk",
+ "tableFrom": "account",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.apikey": {
+ "name": "apikey",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "start": {
+ "name": "start",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "prefix": {
+ "name": "prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "key": {
+ "name": "key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "refill_interval": {
+ "name": "refill_interval",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refill_amount": {
+ "name": "refill_amount",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_refill_at": {
+ "name": "last_refill_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rate_limit_enabled": {
+ "name": "rate_limit_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rate_limit_time_window": {
+ "name": "rate_limit_time_window",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rate_limit_max": {
+ "name": "rate_limit_max",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "request_count": {
+ "name": "request_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "remaining": {
+ "name": "remaining",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_request": {
+ "name": "last_request",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "apikey_user_id_user_id_fk": {
+ "name": "apikey_user_id_user_id_fk",
+ "tableFrom": "apikey",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invitation": {
+ "name": "invitation",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "organization_id": {
+ "name": "organization_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "inviter_id": {
+ "name": "inviter_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "team_id": {
+ "name": "team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "invitation_organization_id_organization_id_fk": {
+ "name": "invitation_organization_id_organization_id_fk",
+ "tableFrom": "invitation",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organization_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "invitation_inviter_id_user_id_fk": {
+ "name": "invitation_inviter_id_user_id_fk",
+ "tableFrom": "invitation",
+ "tableTo": "user",
+ "columnsFrom": [
+ "inviter_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.member": {
+ "name": "member",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "organization_id": {
+ "name": "organization_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "team_id": {
+ "name": "team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_default": {
+ "name": "is_default",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canCreateProjects": {
+ "name": "canCreateProjects",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canAccessToSSHKeys": {
+ "name": "canAccessToSSHKeys",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canCreateServices": {
+ "name": "canCreateServices",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canDeleteProjects": {
+ "name": "canDeleteProjects",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canDeleteServices": {
+ "name": "canDeleteServices",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canAccessToDocker": {
+ "name": "canAccessToDocker",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canAccessToAPI": {
+ "name": "canAccessToAPI",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canAccessToGitProviders": {
+ "name": "canAccessToGitProviders",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canDeleteEnvironments": {
+ "name": "canDeleteEnvironments",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "canCreateEnvironments": {
+ "name": "canCreateEnvironments",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accessedEnvironments": {
+ "name": "accessedEnvironments",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "member_organization_id_organization_id_fk": {
+ "name": "member_organization_id_organization_id_fk",
+ "tableFrom": "member",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organization_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "member_user_id_user_id_fk": {
+ "name": "member_user_id_user_id_fk",
+ "tableFrom": "member",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.organization": {
+ "name": "organization",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "logo": {
+ "name": "logo",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "owner_id": {
+ "name": "owner_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "organization_owner_id_user_id_fk": {
+ "name": "organization_owner_id_user_id_fk",
+ "tableFrom": "organization",
+ "tableTo": "user",
+ "columnsFrom": [
+ "owner_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "organization_slug_unique": {
+ "name": "organization_slug_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "slug"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.two_factor": {
+ "name": "two_factor",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "backup_codes": {
+ "name": "backup_codes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "two_factor_user_id_user_id_fk": {
+ "name": "two_factor_user_id_user_id_fk",
+ "tableFrom": "two_factor",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.verification": {
+ "name": "verification",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "identifier": {
+ "name": "identifier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ai": {
+ "name": "ai",
+ "schema": "",
+ "columns": {
+ "aiId": {
+ "name": "aiId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "apiUrl": {
+ "name": "apiUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "apiKey": {
+ "name": "apiKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isEnabled": {
+ "name": "isEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "ai_organizationId_organization_id_fk": {
+ "name": "ai_organizationId_organization_id_fk",
+ "tableFrom": "ai",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.application": {
+ "name": "application",
+ "schema": "",
+ "columns": {
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewEnv": {
+ "name": "previewEnv",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "watchPaths": {
+ "name": "watchPaths",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewBuildArgs": {
+ "name": "previewBuildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewBuildSecrets": {
+ "name": "previewBuildSecrets",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewLabels": {
+ "name": "previewLabels",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewWildcard": {
+ "name": "previewWildcard",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewPort": {
+ "name": "previewPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 3000
+ },
+ "previewHttps": {
+ "name": "previewHttps",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "previewPath": {
+ "name": "previewPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "previewCustomCertResolver": {
+ "name": "previewCustomCertResolver",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewLimit": {
+ "name": "previewLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 3
+ },
+ "isPreviewDeploymentsActive": {
+ "name": "isPreviewDeploymentsActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "previewRequireCollaboratorPermissions": {
+ "name": "previewRequireCollaboratorPermissions",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": true
+ },
+ "rollbackActive": {
+ "name": "rollbackActive",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "buildSecrets": {
+ "name": "buildSecrets",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "subtitle": {
+ "name": "subtitle",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "cleanCache": {
+ "name": "cleanCache",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "repository": {
+ "name": "repository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "owner": {
+ "name": "owner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "branch": {
+ "name": "branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "buildPath": {
+ "name": "buildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "triggerType": {
+ "name": "triggerType",
+ "type": "triggerType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'push'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabProjectId": {
+ "name": "gitlabProjectId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabRepository": {
+ "name": "gitlabRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabOwner": {
+ "name": "gitlabOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabBranch": {
+ "name": "gitlabBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabBuildPath": {
+ "name": "gitlabBuildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "gitlabPathNamespace": {
+ "name": "gitlabPathNamespace",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaRepository": {
+ "name": "giteaRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaOwner": {
+ "name": "giteaOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaBranch": {
+ "name": "giteaBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaBuildPath": {
+ "name": "giteaBuildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "bitbucketRepository": {
+ "name": "bitbucketRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketOwner": {
+ "name": "bitbucketOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketBranch": {
+ "name": "bitbucketBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketBuildPath": {
+ "name": "bitbucketBuildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "registryUrl": {
+ "name": "registryUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitUrl": {
+ "name": "customGitUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitBranch": {
+ "name": "customGitBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitBuildPath": {
+ "name": "customGitBuildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitSSHKeyId": {
+ "name": "customGitSSHKeyId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enableSubmodules": {
+ "name": "enableSubmodules",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerContextPath": {
+ "name": "dockerContextPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerBuildStage": {
+ "name": "dockerBuildStage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dropBuildPath": {
+ "name": "dropBuildPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "buildType": {
+ "name": "buildType",
+ "type": "buildType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'nixpacks'"
+ },
+ "railpackVersion": {
+ "name": "railpackVersion",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0.2.2'"
+ },
+ "herokuVersion": {
+ "name": "herokuVersion",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'24'"
+ },
+ "publishDirectory": {
+ "name": "publishDirectory",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isStaticSpa": {
+ "name": "isStaticSpa",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackRegistryId": {
+ "name": "rollbackRegistryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "githubId": {
+ "name": "githubId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabId": {
+ "name": "gitlabId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaId": {
+ "name": "giteaId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketId": {
+ "name": "bitbucketId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "buildServerId": {
+ "name": "buildServerId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "buildRegistryId": {
+ "name": "buildRegistryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": {
+ "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk",
+ "tableFrom": "application",
+ "tableTo": "ssh-key",
+ "columnsFrom": [
+ "customGitSSHKeyId"
+ ],
+ "columnsTo": [
+ "sshKeyId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_registryId_registry_registryId_fk": {
+ "name": "application_registryId_registry_registryId_fk",
+ "tableFrom": "application",
+ "tableTo": "registry",
+ "columnsFrom": [
+ "registryId"
+ ],
+ "columnsTo": [
+ "registryId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_rollbackRegistryId_registry_registryId_fk": {
+ "name": "application_rollbackRegistryId_registry_registryId_fk",
+ "tableFrom": "application",
+ "tableTo": "registry",
+ "columnsFrom": [
+ "rollbackRegistryId"
+ ],
+ "columnsTo": [
+ "registryId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_environmentId_environment_environmentId_fk": {
+ "name": "application_environmentId_environment_environmentId_fk",
+ "tableFrom": "application",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "application_githubId_github_githubId_fk": {
+ "name": "application_githubId_github_githubId_fk",
+ "tableFrom": "application",
+ "tableTo": "github",
+ "columnsFrom": [
+ "githubId"
+ ],
+ "columnsTo": [
+ "githubId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_gitlabId_gitlab_gitlabId_fk": {
+ "name": "application_gitlabId_gitlab_gitlabId_fk",
+ "tableFrom": "application",
+ "tableTo": "gitlab",
+ "columnsFrom": [
+ "gitlabId"
+ ],
+ "columnsTo": [
+ "gitlabId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_giteaId_gitea_giteaId_fk": {
+ "name": "application_giteaId_gitea_giteaId_fk",
+ "tableFrom": "application",
+ "tableTo": "gitea",
+ "columnsFrom": [
+ "giteaId"
+ ],
+ "columnsTo": [
+ "giteaId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_bitbucketId_bitbucket_bitbucketId_fk": {
+ "name": "application_bitbucketId_bitbucket_bitbucketId_fk",
+ "tableFrom": "application",
+ "tableTo": "bitbucket",
+ "columnsFrom": [
+ "bitbucketId"
+ ],
+ "columnsTo": [
+ "bitbucketId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_serverId_server_serverId_fk": {
+ "name": "application_serverId_server_serverId_fk",
+ "tableFrom": "application",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "application_buildServerId_server_serverId_fk": {
+ "name": "application_buildServerId_server_serverId_fk",
+ "tableFrom": "application",
+ "tableTo": "server",
+ "columnsFrom": [
+ "buildServerId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "application_buildRegistryId_registry_registryId_fk": {
+ "name": "application_buildRegistryId_registry_registryId_fk",
+ "tableFrom": "application",
+ "tableTo": "registry",
+ "columnsFrom": [
+ "buildRegistryId"
+ ],
+ "columnsTo": [
+ "registryId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "schedule": {
+ "name": "schedule",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "database": {
+ "name": "database",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prefix": {
+ "name": "prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serviceName": {
+ "name": "serviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "keepLatestCount": {
+ "name": "keepLatestCount",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "backupType": {
+ "name": "backupType",
+ "type": "backupType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'database'"
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "postgresId": {
+ "name": "postgresId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mariadbId": {
+ "name": "mariadbId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mysqlId": {
+ "name": "mysqlId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mongoId": {
+ "name": "mongoId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "backup_destinationId_destination_destinationId_fk": {
+ "name": "backup_destinationId_destination_destinationId_fk",
+ "tableFrom": "backup",
+ "tableTo": "destination",
+ "columnsFrom": [
+ "destinationId"
+ ],
+ "columnsTo": [
+ "destinationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_composeId_compose_composeId_fk": {
+ "name": "backup_composeId_compose_composeId_fk",
+ "tableFrom": "backup",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_postgresId_postgres_postgresId_fk": {
+ "name": "backup_postgresId_postgres_postgresId_fk",
+ "tableFrom": "backup",
+ "tableTo": "postgres",
+ "columnsFrom": [
+ "postgresId"
+ ],
+ "columnsTo": [
+ "postgresId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_mariadbId_mariadb_mariadbId_fk": {
+ "name": "backup_mariadbId_mariadb_mariadbId_fk",
+ "tableFrom": "backup",
+ "tableTo": "mariadb",
+ "columnsFrom": [
+ "mariadbId"
+ ],
+ "columnsTo": [
+ "mariadbId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_mysqlId_mysql_mysqlId_fk": {
+ "name": "backup_mysqlId_mysql_mysqlId_fk",
+ "tableFrom": "backup",
+ "tableTo": "mysql",
+ "columnsFrom": [
+ "mysqlId"
+ ],
+ "columnsTo": [
+ "mysqlId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_mongoId_mongo_mongoId_fk": {
+ "name": "backup_mongoId_mongo_mongoId_fk",
+ "tableFrom": "backup",
+ "tableTo": "mongo",
+ "columnsFrom": [
+ "mongoId"
+ ],
+ "columnsTo": [
+ "mongoId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "backup_userId_user_id_fk": {
+ "name": "backup_userId_user_id_fk",
+ "tableFrom": "backup",
+ "tableTo": "user",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "backup_appName_unique": {
+ "name": "backup_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.bitbucket": {
+ "name": "bitbucket",
+ "schema": "",
+ "columns": {
+ "bitbucketId": {
+ "name": "bitbucketId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "bitbucketUsername": {
+ "name": "bitbucketUsername",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketEmail": {
+ "name": "bitbucketEmail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "appPassword": {
+ "name": "appPassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "apiToken": {
+ "name": "apiToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketWorkspaceName": {
+ "name": "bitbucketWorkspaceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitProviderId": {
+ "name": "gitProviderId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": {
+ "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk",
+ "tableFrom": "bitbucket",
+ "tableTo": "git_provider",
+ "columnsFrom": [
+ "gitProviderId"
+ ],
+ "columnsTo": [
+ "gitProviderId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.certificate": {
+ "name": "certificate",
+ "schema": "",
+ "columns": {
+ "certificateId": {
+ "name": "certificateId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "certificateData": {
+ "name": "certificateData",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "privateKey": {
+ "name": "privateKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "certificatePath": {
+ "name": "certificatePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "autoRenew": {
+ "name": "autoRenew",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "certificate_organizationId_organization_id_fk": {
+ "name": "certificate_organizationId_organization_id_fk",
+ "tableFrom": "certificate",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "certificate_serverId_server_serverId_fk": {
+ "name": "certificate_serverId_server_serverId_fk",
+ "tableFrom": "certificate",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.compose": {
+ "name": "compose",
+ "schema": "",
+ "columns": {
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeFile": {
+ "name": "composeFile",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceTypeCompose",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "composeType": {
+ "name": "composeType",
+ "type": "composeType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'docker-compose'"
+ },
+ "repository": {
+ "name": "repository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "owner": {
+ "name": "owner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "branch": {
+ "name": "branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabProjectId": {
+ "name": "gitlabProjectId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabRepository": {
+ "name": "gitlabRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabOwner": {
+ "name": "gitlabOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabBranch": {
+ "name": "gitlabBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabPathNamespace": {
+ "name": "gitlabPathNamespace",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketRepository": {
+ "name": "bitbucketRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketOwner": {
+ "name": "bitbucketOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketBranch": {
+ "name": "bitbucketBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaRepository": {
+ "name": "giteaRepository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaOwner": {
+ "name": "giteaOwner",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaBranch": {
+ "name": "giteaBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitUrl": {
+ "name": "customGitUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitBranch": {
+ "name": "customGitBranch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customGitSSHKeyId": {
+ "name": "customGitSSHKeyId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "enableSubmodules": {
+ "name": "enableSubmodules",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "suffix": {
+ "name": "suffix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "randomize": {
+ "name": "randomize",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "isolatedDeployment": {
+ "name": "isolatedDeployment",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "isolatedDeploymentsVolume": {
+ "name": "isolatedDeploymentsVolume",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "triggerType": {
+ "name": "triggerType",
+ "type": "triggerType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'push'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "watchPaths": {
+ "name": "watchPaths",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubId": {
+ "name": "githubId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitlabId": {
+ "name": "gitlabId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bitbucketId": {
+ "name": "bitbucketId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "giteaId": {
+ "name": "giteaId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": {
+ "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk",
+ "tableFrom": "compose",
+ "tableTo": "ssh-key",
+ "columnsFrom": [
+ "customGitSSHKeyId"
+ ],
+ "columnsTo": [
+ "sshKeyId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compose_environmentId_environment_environmentId_fk": {
+ "name": "compose_environmentId_environment_environmentId_fk",
+ "tableFrom": "compose",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "compose_githubId_github_githubId_fk": {
+ "name": "compose_githubId_github_githubId_fk",
+ "tableFrom": "compose",
+ "tableTo": "github",
+ "columnsFrom": [
+ "githubId"
+ ],
+ "columnsTo": [
+ "githubId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compose_gitlabId_gitlab_gitlabId_fk": {
+ "name": "compose_gitlabId_gitlab_gitlabId_fk",
+ "tableFrom": "compose",
+ "tableTo": "gitlab",
+ "columnsFrom": [
+ "gitlabId"
+ ],
+ "columnsTo": [
+ "gitlabId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compose_bitbucketId_bitbucket_bitbucketId_fk": {
+ "name": "compose_bitbucketId_bitbucket_bitbucketId_fk",
+ "tableFrom": "compose",
+ "tableTo": "bitbucket",
+ "columnsFrom": [
+ "bitbucketId"
+ ],
+ "columnsTo": [
+ "bitbucketId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compose_giteaId_gitea_giteaId_fk": {
+ "name": "compose_giteaId_gitea_giteaId_fk",
+ "tableFrom": "compose",
+ "tableTo": "gitea",
+ "columnsFrom": [
+ "giteaId"
+ ],
+ "columnsTo": [
+ "giteaId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compose_serverId_server_serverId_fk": {
+ "name": "compose_serverId_server_serverId_fk",
+ "tableFrom": "compose",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.deployment": {
+ "name": "deployment",
+ "schema": "",
+ "columns": {
+ "deploymentId": {
+ "name": "deploymentId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "deploymentStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'running'"
+ },
+ "logPath": {
+ "name": "logPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pid": {
+ "name": "pid",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "isPreviewDeployment": {
+ "name": "isPreviewDeployment",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "previewDeploymentId": {
+ "name": "previewDeploymentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "startedAt": {
+ "name": "startedAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "finishedAt": {
+ "name": "finishedAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "errorMessage": {
+ "name": "errorMessage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scheduleId": {
+ "name": "scheduleId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackId": {
+ "name": "rollbackId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "volumeBackupId": {
+ "name": "volumeBackupId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "buildServerId": {
+ "name": "buildServerId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "deployment_applicationId_application_applicationId_fk": {
+ "name": "deployment_applicationId_application_applicationId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_composeId_compose_composeId_fk": {
+ "name": "deployment_composeId_compose_composeId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_serverId_server_serverId_fk": {
+ "name": "deployment_serverId_server_serverId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": {
+ "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "preview_deployments",
+ "columnsFrom": [
+ "previewDeploymentId"
+ ],
+ "columnsTo": [
+ "previewDeploymentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_scheduleId_schedule_scheduleId_fk": {
+ "name": "deployment_scheduleId_schedule_scheduleId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "schedule",
+ "columnsFrom": [
+ "scheduleId"
+ ],
+ "columnsTo": [
+ "scheduleId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_backupId_backup_backupId_fk": {
+ "name": "deployment_backupId_backup_backupId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "backup",
+ "columnsFrom": [
+ "backupId"
+ ],
+ "columnsTo": [
+ "backupId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_rollbackId_rollback_rollbackId_fk": {
+ "name": "deployment_rollbackId_rollback_rollbackId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "rollback",
+ "columnsFrom": [
+ "rollbackId"
+ ],
+ "columnsTo": [
+ "rollbackId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_volumeBackupId_volume_backup_volumeBackupId_fk": {
+ "name": "deployment_volumeBackupId_volume_backup_volumeBackupId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "volume_backup",
+ "columnsFrom": [
+ "volumeBackupId"
+ ],
+ "columnsTo": [
+ "volumeBackupId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "deployment_buildServerId_server_serverId_fk": {
+ "name": "deployment_buildServerId_server_serverId_fk",
+ "tableFrom": "deployment",
+ "tableTo": "server",
+ "columnsFrom": [
+ "buildServerId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "accessKey": {
+ "name": "accessKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "secretAccessKey": {
+ "name": "secretAccessKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "bucket": {
+ "name": "bucket",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "region": {
+ "name": "region",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "endpoint": {
+ "name": "endpoint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_organizationId_organization_id_fk": {
+ "name": "destination_organizationId_organization_id_fk",
+ "tableFrom": "destination",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.domain": {
+ "name": "domain",
+ "schema": "",
+ "columns": {
+ "domainId": {
+ "name": "domainId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "https": {
+ "name": "https",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "port": {
+ "name": "port",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 3000
+ },
+ "path": {
+ "name": "path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "serviceName": {
+ "name": "serviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "domainType": {
+ "name": "domainType",
+ "type": "domainType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'application'"
+ },
+ "uniqueConfigKey": {
+ "name": "uniqueConfigKey",
+ "type": "serial",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customCertResolver": {
+ "name": "customCertResolver",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "previewDeploymentId": {
+ "name": "previewDeploymentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "internalPath": {
+ "name": "internalPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "stripPath": {
+ "name": "stripPath",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "domain_composeId_compose_composeId_fk": {
+ "name": "domain_composeId_compose_composeId_fk",
+ "tableFrom": "domain",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "domain_applicationId_application_applicationId_fk": {
+ "name": "domain_applicationId_application_applicationId_fk",
+ "tableFrom": "domain",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": {
+ "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk",
+ "tableFrom": "domain",
+ "tableTo": "preview_deployments",
+ "columnsFrom": [
+ "previewDeploymentId"
+ ],
+ "columnsTo": [
+ "previewDeploymentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environment": {
+ "name": "environment",
+ "schema": "",
+ "columns": {
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "environment_projectId_project_projectId_fk": {
+ "name": "environment_projectId_project_projectId_fk",
+ "tableFrom": "environment",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.git_provider": {
+ "name": "git_provider",
+ "schema": "",
+ "columns": {
+ "gitProviderId": {
+ "name": "gitProviderId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "providerType": {
+ "name": "providerType",
+ "type": "gitProviderType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "git_provider_organizationId_organization_id_fk": {
+ "name": "git_provider_organizationId_organization_id_fk",
+ "tableFrom": "git_provider",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "git_provider_userId_user_id_fk": {
+ "name": "git_provider_userId_user_id_fk",
+ "tableFrom": "git_provider",
+ "tableTo": "user",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.gitea": {
+ "name": "gitea",
+ "schema": "",
+ "columns": {
+ "giteaId": {
+ "name": "giteaId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "giteaUrl": {
+ "name": "giteaUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'https://gitea.com'"
+ },
+ "redirect_uri": {
+ "name": "redirect_uri",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "client_id": {
+ "name": "client_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "client_secret": {
+ "name": "client_secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitProviderId": {
+ "name": "gitProviderId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scopes": {
+ "name": "scopes",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'repo,repo:status,read:user,read:org'"
+ },
+ "last_authenticated_at": {
+ "name": "last_authenticated_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "gitea_gitProviderId_git_provider_gitProviderId_fk": {
+ "name": "gitea_gitProviderId_git_provider_gitProviderId_fk",
+ "tableFrom": "gitea",
+ "tableTo": "git_provider",
+ "columnsFrom": [
+ "gitProviderId"
+ ],
+ "columnsTo": [
+ "gitProviderId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.github": {
+ "name": "github",
+ "schema": "",
+ "columns": {
+ "githubId": {
+ "name": "githubId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubClientId": {
+ "name": "githubClientId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubClientSecret": {
+ "name": "githubClientSecret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubInstallationId": {
+ "name": "githubInstallationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubPrivateKey": {
+ "name": "githubPrivateKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubWebhookSecret": {
+ "name": "githubWebhookSecret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitProviderId": {
+ "name": "gitProviderId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "github_gitProviderId_git_provider_gitProviderId_fk": {
+ "name": "github_gitProviderId_git_provider_gitProviderId_fk",
+ "tableFrom": "github",
+ "tableTo": "git_provider",
+ "columnsFrom": [
+ "gitProviderId"
+ ],
+ "columnsTo": [
+ "gitProviderId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.gitlab": {
+ "name": "gitlab",
+ "schema": "",
+ "columns": {
+ "gitlabId": {
+ "name": "gitlabId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "gitlabUrl": {
+ "name": "gitlabUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'https://gitlab.com'"
+ },
+ "application_id": {
+ "name": "application_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "redirect_uri": {
+ "name": "redirect_uri",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "group_name": {
+ "name": "group_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gitProviderId": {
+ "name": "gitProviderId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "gitlab_gitProviderId_git_provider_gitProviderId_fk": {
+ "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk",
+ "tableFrom": "gitlab",
+ "tableTo": "git_provider",
+ "columnsFrom": [
+ "gitProviderId"
+ ],
+ "columnsTo": [
+ "gitProviderId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mariadb": {
+ "name": "mariadb",
+ "schema": "",
+ "columns": {
+ "mariadbId": {
+ "name": "mariadbId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "databaseName": {
+ "name": "databaseName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseUser": {
+ "name": "databaseUser",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databasePassword": {
+ "name": "databasePassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rootPassword": {
+ "name": "rootPassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_environmentId_environment_environmentId_fk": {
+ "name": "mariadb_environmentId_environment_environmentId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mariadb_serverId_server_serverId_fk": {
+ "name": "mariadb_serverId_server_serverId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mongo": {
+ "name": "mongo",
+ "schema": "",
+ "columns": {
+ "mongoId": {
+ "name": "mongoId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "databaseUser": {
+ "name": "databaseUser",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databasePassword": {
+ "name": "databasePassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicaSets": {
+ "name": "replicaSets",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_environmentId_environment_environmentId_fk": {
+ "name": "mongo_environmentId_environment_environmentId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mongo_serverId_server_serverId_fk": {
+ "name": "mongo_serverId_server_serverId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mount": {
+ "name": "mount",
+ "schema": "",
+ "columns": {
+ "mountId": {
+ "name": "mountId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "mountType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hostPath": {
+ "name": "hostPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "volumeName": {
+ "name": "volumeName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "filePath": {
+ "name": "filePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serviceType": {
+ "name": "serviceType",
+ "type": "serviceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'application'"
+ },
+ "mountPath": {
+ "name": "mountPath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "postgresId": {
+ "name": "postgresId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mariadbId": {
+ "name": "mariadbId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mongoId": {
+ "name": "mongoId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mysqlId": {
+ "name": "mysqlId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "redisId": {
+ "name": "redisId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mount_applicationId_application_applicationId_fk": {
+ "name": "mount_applicationId_application_applicationId_fk",
+ "tableFrom": "mount",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_postgresId_postgres_postgresId_fk": {
+ "name": "mount_postgresId_postgres_postgresId_fk",
+ "tableFrom": "mount",
+ "tableTo": "postgres",
+ "columnsFrom": [
+ "postgresId"
+ ],
+ "columnsTo": [
+ "postgresId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_mariadbId_mariadb_mariadbId_fk": {
+ "name": "mount_mariadbId_mariadb_mariadbId_fk",
+ "tableFrom": "mount",
+ "tableTo": "mariadb",
+ "columnsFrom": [
+ "mariadbId"
+ ],
+ "columnsTo": [
+ "mariadbId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_mongoId_mongo_mongoId_fk": {
+ "name": "mount_mongoId_mongo_mongoId_fk",
+ "tableFrom": "mount",
+ "tableTo": "mongo",
+ "columnsFrom": [
+ "mongoId"
+ ],
+ "columnsTo": [
+ "mongoId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_mysqlId_mysql_mysqlId_fk": {
+ "name": "mount_mysqlId_mysql_mysqlId_fk",
+ "tableFrom": "mount",
+ "tableTo": "mysql",
+ "columnsFrom": [
+ "mysqlId"
+ ],
+ "columnsTo": [
+ "mysqlId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_redisId_redis_redisId_fk": {
+ "name": "mount_redisId_redis_redisId_fk",
+ "tableFrom": "mount",
+ "tableTo": "redis",
+ "columnsFrom": [
+ "redisId"
+ ],
+ "columnsTo": [
+ "redisId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mount_composeId_compose_composeId_fk": {
+ "name": "mount_composeId_compose_composeId_fk",
+ "tableFrom": "mount",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mysql": {
+ "name": "mysql",
+ "schema": "",
+ "columns": {
+ "mysqlId": {
+ "name": "mysqlId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "databaseName": {
+ "name": "databaseName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseUser": {
+ "name": "databaseUser",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databasePassword": {
+ "name": "databasePassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rootPassword": {
+ "name": "rootPassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_environmentId_environment_environmentId_fk": {
+ "name": "mysql_environmentId_environment_environmentId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mysql_serverId_server_serverId_fk": {
+ "name": "mysql_serverId_server_serverId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.custom": {
+ "name": "custom",
+ "schema": "",
+ "columns": {
+ "customId": {
+ "name": "customId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "endpoint": {
+ "name": "endpoint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "headers": {
+ "name": "headers",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "decoration": {
+ "name": "decoration",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email": {
+ "name": "email",
+ "schema": "",
+ "columns": {
+ "emailId": {
+ "name": "emailId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "smtpServer": {
+ "name": "smtpServer",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "smtpPort": {
+ "name": "smtpPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "fromAddress": {
+ "name": "fromAddress",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "toAddress": {
+ "name": "toAddress",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.gotify": {
+ "name": "gotify",
+ "schema": "",
+ "columns": {
+ "gotifyId": {
+ "name": "gotifyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "serverUrl": {
+ "name": "serverUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appToken": {
+ "name": "appToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "priority": {
+ "name": "priority",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 5
+ },
+ "decoration": {
+ "name": "decoration",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.lark": {
+ "name": "lark",
+ "schema": "",
+ "columns": {
+ "larkId": {
+ "name": "larkId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.notification": {
+ "name": "notification",
+ "schema": "",
+ "columns": {
+ "notificationId": {
+ "name": "notificationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appDeploy": {
+ "name": "appDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "appBuildError": {
+ "name": "appBuildError",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "databaseBackup": {
+ "name": "databaseBackup",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "volumeBackup": {
+ "name": "volumeBackup",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "serverThreshold": {
+ "name": "serverThreshold",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "notificationType": {
+ "name": "notificationType",
+ "type": "notificationType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slackId": {
+ "name": "slackId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegramId": {
+ "name": "telegramId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "emailId": {
+ "name": "emailId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "gotifyId": {
+ "name": "gotifyId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ntfyId": {
+ "name": "ntfyId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "customId": {
+ "name": "customId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "larkId": {
+ "name": "larkId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "notification_slackId_slack_slackId_fk": {
+ "name": "notification_slackId_slack_slackId_fk",
+ "tableFrom": "notification",
+ "tableTo": "slack",
+ "columnsFrom": [
+ "slackId"
+ ],
+ "columnsTo": [
+ "slackId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_telegramId_telegram_telegramId_fk": {
+ "name": "notification_telegramId_telegram_telegramId_fk",
+ "tableFrom": "notification",
+ "tableTo": "telegram",
+ "columnsFrom": [
+ "telegramId"
+ ],
+ "columnsTo": [
+ "telegramId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_discordId_discord_discordId_fk": {
+ "name": "notification_discordId_discord_discordId_fk",
+ "tableFrom": "notification",
+ "tableTo": "discord",
+ "columnsFrom": [
+ "discordId"
+ ],
+ "columnsTo": [
+ "discordId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_emailId_email_emailId_fk": {
+ "name": "notification_emailId_email_emailId_fk",
+ "tableFrom": "notification",
+ "tableTo": "email",
+ "columnsFrom": [
+ "emailId"
+ ],
+ "columnsTo": [
+ "emailId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_gotifyId_gotify_gotifyId_fk": {
+ "name": "notification_gotifyId_gotify_gotifyId_fk",
+ "tableFrom": "notification",
+ "tableTo": "gotify",
+ "columnsFrom": [
+ "gotifyId"
+ ],
+ "columnsTo": [
+ "gotifyId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_ntfyId_ntfy_ntfyId_fk": {
+ "name": "notification_ntfyId_ntfy_ntfyId_fk",
+ "tableFrom": "notification",
+ "tableTo": "ntfy",
+ "columnsFrom": [
+ "ntfyId"
+ ],
+ "columnsTo": [
+ "ntfyId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_customId_custom_customId_fk": {
+ "name": "notification_customId_custom_customId_fk",
+ "tableFrom": "notification",
+ "tableTo": "custom",
+ "columnsFrom": [
+ "customId"
+ ],
+ "columnsTo": [
+ "customId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_larkId_lark_larkId_fk": {
+ "name": "notification_larkId_lark_larkId_fk",
+ "tableFrom": "notification",
+ "tableTo": "lark",
+ "columnsFrom": [
+ "larkId"
+ ],
+ "columnsTo": [
+ "larkId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "notification_organizationId_organization_id_fk": {
+ "name": "notification_organizationId_organization_id_fk",
+ "tableFrom": "notification",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ntfy": {
+ "name": "ntfy",
+ "schema": "",
+ "columns": {
+ "ntfyId": {
+ "name": "ntfyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "serverUrl": {
+ "name": "serverUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "topic": {
+ "name": "topic",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "accessToken": {
+ "name": "accessToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "priority": {
+ "name": "priority",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 3
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack": {
+ "name": "slack",
+ "schema": "",
+ "columns": {
+ "slackId": {
+ "name": "slackId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "channel": {
+ "name": "channel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.telegram": {
+ "name": "telegram",
+ "schema": "",
+ "columns": {
+ "telegramId": {
+ "name": "telegramId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "botToken": {
+ "name": "botToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chatId": {
+ "name": "chatId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "messageThreadId": {
+ "name": "messageThreadId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "publishMode": {
+ "name": "publishMode",
+ "type": "publishModeType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'host'"
+ },
+ "targetPort": {
+ "name": "targetPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "protocol": {
+ "name": "protocol",
+ "type": "protocolType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "port_applicationId_application_applicationId_fk": {
+ "name": "port_applicationId_application_applicationId_fk",
+ "tableFrom": "port",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.postgres": {
+ "name": "postgres",
+ "schema": "",
+ "columns": {
+ "postgresId": {
+ "name": "postgresId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseName": {
+ "name": "databaseName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseUser": {
+ "name": "databaseUser",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databasePassword": {
+ "name": "databasePassword",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_environmentId_environment_environmentId_fk": {
+ "name": "postgres_environmentId_environment_environmentId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "postgres_serverId_server_serverId_fk": {
+ "name": "postgres_serverId_server_serverId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.preview_deployments": {
+ "name": "preview_deployments",
+ "schema": "",
+ "columns": {
+ "previewDeploymentId": {
+ "name": "previewDeploymentId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "branch": {
+ "name": "branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pullRequestId": {
+ "name": "pullRequestId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pullRequestNumber": {
+ "name": "pullRequestNumber",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pullRequestURL": {
+ "name": "pullRequestURL",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pullRequestTitle": {
+ "name": "pullRequestTitle",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pullRequestCommentId": {
+ "name": "pullRequestCommentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "previewStatus": {
+ "name": "previewStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "domainId": {
+ "name": "domainId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expiresAt": {
+ "name": "expiresAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "preview_deployments_applicationId_application_applicationId_fk": {
+ "name": "preview_deployments_applicationId_application_applicationId_fk",
+ "tableFrom": "preview_deployments",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "preview_deployments_domainId_domain_domainId_fk": {
+ "name": "preview_deployments_domainId_domain_domainId_fk",
+ "tableFrom": "preview_deployments",
+ "tableTo": "domain",
+ "columnsFrom": [
+ "domainId"
+ ],
+ "columnsTo": [
+ "domainId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "preview_deployments_appName_unique": {
+ "name": "preview_deployments_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.project": {
+ "name": "project",
+ "schema": "",
+ "columns": {
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_organizationId_organization_id_fk": {
+ "name": "project_organizationId_organization_id_fk",
+ "tableFrom": "project",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.redirect": {
+ "name": "redirect",
+ "schema": "",
+ "columns": {
+ "redirectId": {
+ "name": "redirectId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "regex": {
+ "name": "regex",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "replacement": {
+ "name": "replacement",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permanent": {
+ "name": "permanent",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "uniqueConfigKey": {
+ "name": "uniqueConfigKey",
+ "type": "serial",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redirect_applicationId_application_applicationId_fk": {
+ "name": "redirect_applicationId_application_applicationId_fk",
+ "tableFrom": "redirect",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.redis": {
+ "name": "redis",
+ "schema": "",
+ "columns": {
+ "redisId": {
+ "name": "redisId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dockerImage": {
+ "name": "dockerImage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "args": {
+ "name": "args",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "healthCheckSwarm": {
+ "name": "healthCheckSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "restartPolicySwarm": {
+ "name": "restartPolicySwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "placementSwarm": {
+ "name": "placementSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updateConfigSwarm": {
+ "name": "updateConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "rollbackConfigSwarm": {
+ "name": "rollbackConfigSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "modeSwarm": {
+ "name": "modeSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "labelsSwarm": {
+ "name": "labelsSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "networkSwarm": {
+ "name": "networkSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stopGracePeriodSwarm": {
+ "name": "stopGracePeriodSwarm",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "endpointSpecSwarm": {
+ "name": "endpointSpecSwarm",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "replicas": {
+ "name": "replicas",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "environmentId": {
+ "name": "environmentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_environmentId_environment_environmentId_fk": {
+ "name": "redis_environmentId_environment_environmentId_fk",
+ "tableFrom": "redis",
+ "tableTo": "environment",
+ "columnsFrom": [
+ "environmentId"
+ ],
+ "columnsTo": [
+ "environmentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "redis_serverId_server_serverId_fk": {
+ "name": "redis_serverId_server_serverId_fk",
+ "tableFrom": "redis",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.registry": {
+ "name": "registry",
+ "schema": "",
+ "columns": {
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "registryName": {
+ "name": "registryName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "imagePrefix": {
+ "name": "imagePrefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryUrl": {
+ "name": "registryUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_organizationId_organization_id_fk": {
+ "name": "registry_organizationId_organization_id_fk",
+ "tableFrom": "registry",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.rollback": {
+ "name": "rollback",
+ "schema": "",
+ "columns": {
+ "rollbackId": {
+ "name": "rollbackId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "deploymentId": {
+ "name": "deploymentId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version": {
+ "name": "version",
+ "type": "serial",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "fullContext": {
+ "name": "fullContext",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "rollback_deploymentId_deployment_deploymentId_fk": {
+ "name": "rollback_deploymentId_deployment_deploymentId_fk",
+ "tableFrom": "rollback",
+ "tableTo": "deployment",
+ "columnsFrom": [
+ "deploymentId"
+ ],
+ "columnsTo": [
+ "deploymentId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.schedule": {
+ "name": "schedule",
+ "schema": "",
+ "columns": {
+ "scheduleId": {
+ "name": "scheduleId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cronExpression": {
+ "name": "cronExpression",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serviceName": {
+ "name": "serviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "shellType": {
+ "name": "shellType",
+ "type": "shellType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'bash'"
+ },
+ "scheduleType": {
+ "name": "scheduleType",
+ "type": "scheduleType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'application'"
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "script": {
+ "name": "script",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "schedule_applicationId_application_applicationId_fk": {
+ "name": "schedule_applicationId_application_applicationId_fk",
+ "tableFrom": "schedule",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "schedule_composeId_compose_composeId_fk": {
+ "name": "schedule_composeId_compose_composeId_fk",
+ "tableFrom": "schedule",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "schedule_serverId_server_serverId_fk": {
+ "name": "schedule_serverId_server_serverId_fk",
+ "tableFrom": "schedule",
+ "tableTo": "server",
+ "columnsFrom": [
+ "serverId"
+ ],
+ "columnsTo": [
+ "serverId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "schedule_userId_user_id_fk": {
+ "name": "schedule_userId_user_id_fk",
+ "tableFrom": "schedule",
+ "tableTo": "user",
+ "columnsFrom": [
+ "userId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.security": {
+ "name": "security",
+ "schema": "",
+ "columns": {
+ "securityId": {
+ "name": "securityId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "security_applicationId_application_applicationId_fk": {
+ "name": "security_applicationId_application_applicationId_fk",
+ "tableFrom": "security",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "security_username_applicationId_unique": {
+ "name": "security_username_applicationId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username",
+ "applicationId"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.server": {
+ "name": "server",
+ "schema": "",
+ "columns": {
+ "serverId": {
+ "name": "serverId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ipAddress": {
+ "name": "ipAddress",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "port": {
+ "name": "port",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "username": {
+ "name": "username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'root'"
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "enableDockerCleanup": {
+ "name": "enableDockerCleanup",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverStatus": {
+ "name": "serverStatus",
+ "type": "serverStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'active'"
+ },
+ "serverType": {
+ "name": "serverType",
+ "type": "serverType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'deploy'"
+ },
+ "command": {
+ "name": "command",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metricsConfig": {
+ "name": "metricsConfig",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "server_organizationId_organization_id_fk": {
+ "name": "server_organizationId_organization_id_fk",
+ "tableFrom": "server",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "server_sshKeyId_ssh-key_sshKeyId_fk": {
+ "name": "server_sshKeyId_ssh-key_sshKeyId_fk",
+ "tableFrom": "server",
+ "tableTo": "ssh-key",
+ "columnsFrom": [
+ "sshKeyId"
+ ],
+ "columnsTo": [
+ "sshKeyId"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.session_temp": {
+ "name": "session_temp",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "impersonated_by": {
+ "name": "impersonated_by",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "active_organization_id": {
+ "name": "active_organization_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_temp_user_id_user_id_fk": {
+ "name": "session_temp_user_id_user_id_fk",
+ "tableFrom": "session_temp",
+ "tableTo": "user",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "session_temp_token_unique": {
+ "name": "session_temp_token_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "token"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "privateKey": {
+ "name": "privateKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "publicKey": {
+ "name": "publicKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "lastUsedAt": {
+ "name": "lastUsedAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "organizationId": {
+ "name": "organizationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "ssh-key_organizationId_organization_id_fk": {
+ "name": "ssh-key_organizationId_organization_id_fk",
+ "tableFrom": "ssh-key",
+ "tableTo": "organization",
+ "columnsFrom": [
+ "organizationId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "firstName": {
+ "name": "firstName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "lastName": {
+ "name": "lastName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ },
+ "two_factor_enabled": {
+ "name": "two_factor_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email_verified": {
+ "name": "email_verified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "banned": {
+ "name": "banned",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ban_reason": {
+ "name": "ban_reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ban_expires": {
+ "name": "ban_expires",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "https": {
+ "name": "https",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "letsEncryptEmail": {
+ "name": "letsEncryptEmail",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sshPrivateKey": {
+ "name": "sshPrivateKey",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enableDockerCleanup": {
+ "name": "enableDockerCleanup",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "logCleanupCron": {
+ "name": "logCleanupCron",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'0 0 * * *'"
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "enablePaidFeatures": {
+ "name": "enablePaidFeatures",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "allowImpersonation": {
+ "name": "allowImpersonation",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "metricsConfig": {
+ "name": "metricsConfig",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb"
+ },
+ "cleanupCacheApplications": {
+ "name": "cleanupCacheApplications",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "cleanupCacheOnPreviews": {
+ "name": "cleanupCacheOnPreviews",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "cleanupCacheOnCompose": {
+ "name": "cleanupCacheOnCompose",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "stripeCustomerId": {
+ "name": "stripeCustomerId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripeSubscriptionId": {
+ "name": "stripeSubscriptionId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serversQuantity": {
+ "name": "serversQuantity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "user_email_unique": {
+ "name": "user_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.volume_backup": {
+ "name": "volume_backup",
+ "schema": "",
+ "columns": {
+ "volumeBackupId": {
+ "name": "volumeBackupId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "volumeName": {
+ "name": "volumeName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prefix": {
+ "name": "prefix",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serviceType": {
+ "name": "serviceType",
+ "type": "serviceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'application'"
+ },
+ "appName": {
+ "name": "appName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "serviceName": {
+ "name": "serviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "turnOff": {
+ "name": "turnOff",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "cronExpression": {
+ "name": "cronExpression",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "keepLatestCount": {
+ "name": "keepLatestCount",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "postgresId": {
+ "name": "postgresId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mariadbId": {
+ "name": "mariadbId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mongoId": {
+ "name": "mongoId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mysqlId": {
+ "name": "mysqlId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "redisId": {
+ "name": "redisId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "volume_backup_applicationId_application_applicationId_fk": {
+ "name": "volume_backup_applicationId_application_applicationId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "application",
+ "columnsFrom": [
+ "applicationId"
+ ],
+ "columnsTo": [
+ "applicationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_postgresId_postgres_postgresId_fk": {
+ "name": "volume_backup_postgresId_postgres_postgresId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "postgres",
+ "columnsFrom": [
+ "postgresId"
+ ],
+ "columnsTo": [
+ "postgresId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_mariadbId_mariadb_mariadbId_fk": {
+ "name": "volume_backup_mariadbId_mariadb_mariadbId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "mariadb",
+ "columnsFrom": [
+ "mariadbId"
+ ],
+ "columnsTo": [
+ "mariadbId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_mongoId_mongo_mongoId_fk": {
+ "name": "volume_backup_mongoId_mongo_mongoId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "mongo",
+ "columnsFrom": [
+ "mongoId"
+ ],
+ "columnsTo": [
+ "mongoId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_mysqlId_mysql_mysqlId_fk": {
+ "name": "volume_backup_mysqlId_mysql_mysqlId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "mysql",
+ "columnsFrom": [
+ "mysqlId"
+ ],
+ "columnsTo": [
+ "mysqlId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_redisId_redis_redisId_fk": {
+ "name": "volume_backup_redisId_redis_redisId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "redis",
+ "columnsFrom": [
+ "redisId"
+ ],
+ "columnsTo": [
+ "redisId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_composeId_compose_composeId_fk": {
+ "name": "volume_backup_composeId_compose_composeId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "compose",
+ "columnsFrom": [
+ "composeId"
+ ],
+ "columnsTo": [
+ "composeId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "volume_backup_destinationId_destination_destinationId_fk": {
+ "name": "volume_backup_destinationId_destination_destinationId_fk",
+ "tableFrom": "volume_backup",
+ "tableTo": "destination",
+ "columnsFrom": [
+ "destinationId"
+ ],
+ "columnsTo": [
+ "destinationId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks",
+ "static",
+ "railpack"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "gitlab",
+ "bitbucket",
+ "gitea",
+ "drop"
+ ]
+ },
+ "public.backupType": {
+ "name": "backupType",
+ "schema": "public",
+ "values": [
+ "database",
+ "compose"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo",
+ "web-server"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "gitlab",
+ "bitbucket",
+ "gitea",
+ "raw"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error",
+ "cancelled"
+ ]
+ },
+ "public.domainType": {
+ "name": "domainType",
+ "schema": "public",
+ "values": [
+ "compose",
+ "application",
+ "preview"
+ ]
+ },
+ "public.gitProviderType": {
+ "name": "gitProviderType",
+ "schema": "public",
+ "values": [
+ "github",
+ "gitlab",
+ "bitbucket",
+ "gitea"
+ ]
+ },
+ "public.mountType": {
+ "name": "mountType",
+ "schema": "public",
+ "values": [
+ "bind",
+ "volume",
+ "file"
+ ]
+ },
+ "public.serviceType": {
+ "name": "serviceType",
+ "schema": "public",
+ "values": [
+ "application",
+ "postgres",
+ "mysql",
+ "mariadb",
+ "mongo",
+ "redis",
+ "compose"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email",
+ "gotify",
+ "ntfy",
+ "custom",
+ "lark"
+ ]
+ },
+ "public.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.publishModeType": {
+ "name": "publishModeType",
+ "schema": "public",
+ "values": [
+ "ingress",
+ "host"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.scheduleType": {
+ "name": "scheduleType",
+ "schema": "public",
+ "values": [
+ "application",
+ "compose",
+ "server",
+ "dokploy-server"
+ ]
+ },
+ "public.shellType": {
+ "name": "shellType",
+ "schema": "public",
+ "values": [
+ "bash",
+ "sh"
+ ]
+ },
+ "public.serverStatus": {
+ "name": "serverStatus",
+ "schema": "public",
+ "values": [
+ "active",
+ "inactive"
+ ]
+ },
+ "public.serverType": {
+ "name": "serverType",
+ "schema": "public",
+ "values": [
+ "deploy",
+ "build"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none",
+ "custom"
+ ]
+ },
+ "public.triggerType": {
+ "name": "triggerType",
+ "schema": "public",
+ "values": [
+ "push",
+ "tag"
+ ]
+ }
+ },
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/_journal.json b/apps/dokploy/drizzle/meta/_journal.json
index 5dc1b1c22..2284f3ef4 100644
--- a/apps/dokploy/drizzle/meta/_journal.json
+++ b/apps/dokploy/drizzle/meta/_journal.json
@@ -904,6 +904,13 @@
"when": 1765101709413,
"tag": "0128_hard_falcon",
"breakpoints": true
+ },
+ {
+ "idx": 129,
+ "version": "7",
+ "when": 1765136384035,
+ "tag": "0129_pale_roughhouse",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/apps/dokploy/server/api/routers/mariadb.ts b/apps/dokploy/server/api/routers/mariadb.ts
index dc811e0ca..18950b7a3 100644
--- a/apps/dokploy/server/api/routers/mariadb.ts
+++ b/apps/dokploy/server/api/routers/mariadb.ts
@@ -5,8 +5,8 @@ import {
createMount,
deployMariadb,
findBackupsByDbId,
- findMariadbById,
findEnvironmentById,
+ findMariadbById,
findProjectById,
IS_CLOUD,
rebuildDatabase,
diff --git a/apps/dokploy/server/api/routers/mongo.ts b/apps/dokploy/server/api/routers/mongo.ts
index 1f054a1c9..51b830fc8 100644
--- a/apps/dokploy/server/api/routers/mongo.ts
+++ b/apps/dokploy/server/api/routers/mongo.ts
@@ -5,8 +5,8 @@ import {
createMount,
deployMongo,
findBackupsByDbId,
- findMongoById,
findEnvironmentById,
+ findMongoById,
findProjectById,
IS_CLOUD,
rebuildDatabase,
diff --git a/apps/dokploy/server/api/routers/notification.ts b/apps/dokploy/server/api/routers/notification.ts
index c483b813e..b32278465 100644
--- a/apps/dokploy/server/api/routers/notification.ts
+++ b/apps/dokploy/server/api/routers/notification.ts
@@ -1,4 +1,5 @@
import {
+ createCustomNotification,
createDiscordNotification,
createEmailNotification,
createGotifyNotification,
@@ -9,6 +10,7 @@ import {
findNotificationById,
IS_CLOUD,
removeNotificationById,
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -17,6 +19,7 @@ import {
sendServerThresholdNotifications,
sendSlackNotification,
sendTelegramNotification,
+ updateCustomNotification,
updateDiscordNotification,
updateEmailNotification,
updateGotifyNotification,
@@ -36,6 +39,7 @@ import {
} from "@/server/api/trpc";
import { db } from "@/server/db";
import {
+ apiCreateCustom,
apiCreateDiscord,
apiCreateEmail,
apiCreateGotify,
@@ -44,6 +48,7 @@ import {
apiCreateSlack,
apiCreateTelegram,
apiFindOneNotification,
+ apiTestCustomConnection,
apiTestDiscordConnection,
apiTestEmailConnection,
apiTestGotifyConnection,
@@ -51,6 +56,7 @@ import {
apiTestNtfyConnection,
apiTestSlackConnection,
apiTestTelegramConnection,
+ apiUpdateCustom,
apiUpdateDiscord,
apiUpdateEmail,
apiUpdateGotify,
@@ -334,6 +340,7 @@ export const notificationRouter = createTRPCRouter({
email: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
orderBy: desc(notifications.createdAt),
@@ -518,6 +525,59 @@ export const notificationRouter = createTRPCRouter({
});
}
}),
+ createCustom: adminProcedure
+ .input(apiCreateCustom)
+ .mutation(async ({ input, ctx }) => {
+ try {
+ return await createCustomNotification(
+ input,
+ ctx.session.activeOrganizationId,
+ );
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error creating the notification",
+ cause: error,
+ });
+ }
+ }),
+ updateCustom: adminProcedure
+ .input(apiUpdateCustom)
+ .mutation(async ({ input, ctx }) => {
+ try {
+ const notification = await findNotificationById(input.notificationId);
+ if (notification.organizationId !== ctx.session.activeOrganizationId) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ message: "You are not authorized to update this notification",
+ });
+ }
+ return await updateCustomNotification({
+ ...input,
+ organizationId: ctx.session.activeOrganizationId,
+ });
+ } catch (error) {
+ throw error;
+ }
+ }),
+ testCustomConnection: adminProcedure
+ .input(apiTestCustomConnection)
+ .mutation(async ({ input }) => {
+ try {
+ await sendCustomNotification(input, {
+ title: "Test Notification",
+ message: "Hi, From Dokploy 👋",
+ timestamp: new Date().toISOString(),
+ });
+ return true;
+ } catch (error) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: `${error instanceof Error ? error.message : "Unknown error"}`,
+ cause: error,
+ });
+ }
+ }),
createLark: adminProcedure
.input(apiCreateLark)
.mutation(async ({ input, ctx }) => {
diff --git a/packages/server/package.json b/packages/server/package.json
index 6a9b84f77..e23fa6d8b 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -25,7 +25,8 @@
"switch:prod": "node scripts/switchToDist.js",
"dev": "rm -rf ./dist && pnpm esbuild && tsc --emitDeclarationOnly --outDir dist -p tsconfig.server.json",
"esbuild": "tsx ./esbuild.config.ts && tsc --project tsconfig.server.json --emitDeclarationOnly ",
- "typecheck": "tsc --noEmit"
+ "typecheck": "tsc --noEmit",
+ "dbml:generate": "npx tsx src/db/schema/dbml.ts"
},
"dependencies": {
"@ai-sdk/anthropic": "^2.0.5",
diff --git a/packages/server/schema.dbml b/packages/server/schema.dbml
new file mode 100644
index 000000000..ef1814c00
--- /dev/null
+++ b/packages/server/schema.dbml
@@ -0,0 +1,1200 @@
+enum applicationStatus {
+ idle
+ running
+ done
+ error
+}
+
+enum backupType {
+ database
+ compose
+}
+
+enum buildType {
+ dockerfile
+ heroku_buildpacks
+ paketo_buildpacks
+ nixpacks
+ static
+ railpack
+}
+
+enum certificateType {
+ letsencrypt
+ none
+ custom
+}
+
+enum composeType {
+ "docker-compose"
+ stack
+}
+
+enum databaseType {
+ postgres
+ mariadb
+ mysql
+ mongo
+ "web-server"
+}
+
+enum deploymentStatus {
+ running
+ done
+ error
+ cancelled
+}
+
+enum domainType {
+ compose
+ application
+ preview
+}
+
+enum gitProviderType {
+ github
+ gitlab
+ bitbucket
+ gitea
+}
+
+enum mountType {
+ bind
+ volume
+ file
+}
+
+enum notificationType {
+ slack
+ telegram
+ discord
+ email
+ gotify
+ ntfy
+ custom
+ lark
+}
+
+enum protocolType {
+ tcp
+ udp
+}
+
+enum publishModeType {
+ ingress
+ host
+}
+
+enum RegistryType {
+ selfHosted
+ cloud
+}
+
+enum scheduleType {
+ application
+ compose
+ server
+ "dokploy-server"
+}
+
+enum serverStatus {
+ active
+ inactive
+}
+
+enum serviceType {
+ application
+ postgres
+ mysql
+ mariadb
+ mongo
+ redis
+ compose
+}
+
+enum shellType {
+ bash
+ sh
+}
+
+enum sourceType {
+ docker
+ git
+ github
+ gitlab
+ bitbucket
+ gitea
+ drop
+}
+
+enum sourceTypeCompose {
+ git
+ github
+ gitlab
+ bitbucket
+ gitea
+ raw
+}
+
+enum triggerType {
+ push
+ tag
+}
+
+table account {
+ id text [pk, not null]
+ account_id text [not null]
+ provider_id text [not null]
+ user_id text [not null]
+ access_token text
+ refresh_token text
+ id_token text
+ access_token_expires_at timestamp
+ refresh_token_expires_at timestamp
+ scope text
+ password text
+ is2FAEnabled boolean [not null, default: false]
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ resetPasswordToken text
+ resetPasswordExpiresAt text
+ confirmationToken text
+ confirmationExpiresAt text
+}
+
+table ai {
+ aiId text [pk, not null]
+ name text [not null]
+ apiUrl text [not null]
+ apiKey text [not null]
+ model text [not null]
+ isEnabled boolean [not null, default: true]
+ organizationId text [not null]
+ createdAt text [not null]
+}
+
+table apikey {
+ id text [pk, not null]
+ name text
+ start text
+ prefix text
+ key text [not null]
+ user_id text [not null]
+ refill_interval integer
+ refill_amount integer
+ last_refill_at timestamp
+ enabled boolean
+ rate_limit_enabled boolean
+ rate_limit_time_window integer
+ rate_limit_max integer
+ request_count integer
+ remaining integer
+ last_request timestamp
+ expires_at timestamp
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ permissions text
+ metadata text
+}
+
+table application {
+ applicationId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ env text
+ previewEnv text
+ watchPaths text[]
+ previewBuildArgs text
+ previewBuildSecrets text
+ previewLabels text[]
+ previewWildcard text
+ previewPort integer [default: 3000]
+ previewHttps boolean [not null, default: false]
+ previewPath text [default: '/']
+ certificateType certificateType [not null, default: 'none']
+ previewCustomCertResolver text
+ previewLimit integer [default: 3]
+ isPreviewDeploymentsActive boolean [default: false]
+ previewRequireCollaboratorPermissions boolean [default: true]
+ rollbackActive boolean [default: false]
+ buildArgs text
+ buildSecrets text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ title text
+ enabled boolean
+ subtitle text
+ command text
+ refreshToken text
+ sourceType sourceType [not null, default: 'github']
+ cleanCache boolean [default: false]
+ repository text
+ owner text
+ branch text
+ buildPath text [default: '/']
+ triggerType triggerType [default: 'push']
+ autoDeploy boolean
+ gitlabProjectId integer
+ gitlabRepository text
+ gitlabOwner text
+ gitlabBranch text
+ gitlabBuildPath text [default: '/']
+ gitlabPathNamespace text
+ giteaRepository text
+ giteaOwner text
+ giteaBranch text
+ giteaBuildPath text [default: '/']
+ bitbucketRepository text
+ bitbucketOwner text
+ bitbucketBranch text
+ bitbucketBuildPath text [default: '/']
+ username text
+ password text
+ dockerImage text
+ registryUrl text
+ customGitUrl text
+ customGitBranch text
+ customGitBuildPath text
+ customGitSSHKeyId text
+ enableSubmodules boolean [not null, default: false]
+ dockerfile text
+ dockerContextPath text
+ dockerBuildStage text
+ dropBuildPath text
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ applicationStatus applicationStatus [not null, default: 'idle']
+ buildType buildType [not null, default: 'nixpacks']
+ railpackVersion text [default: '0.2.2']
+ herokuVersion text [default: '24']
+ publishDirectory text
+ isStaticSpa boolean
+ createdAt text [not null]
+ registryId text
+ environmentId text [not null]
+ githubId text
+ gitlabId text
+ giteaId text
+ bitbucketId text
+ serverId text
+}
+
+table backup {
+ backupId text [pk, not null]
+ appName text [not null, unique]
+ schedule text [not null]
+ enabled boolean
+ database text [not null]
+ prefix text [not null]
+ serviceName text
+ destinationId text [not null]
+ keepLatestCount integer
+ backupType backupType [not null, default: 'database']
+ databaseType databaseType [not null]
+ composeId text
+ postgresId text
+ mariadbId text
+ mysqlId text
+ mongoId text
+ userId text
+ metadata jsonb
+}
+
+table bitbucket {
+ bitbucketId text [pk, not null]
+ bitbucketUsername text
+ bitbucketEmail text
+ appPassword text
+ apiToken text
+ bitbucketWorkspaceName text
+ gitProviderId text [not null]
+}
+
+table certificate {
+ certificateId text [pk, not null]
+ name text [not null]
+ certificateData text [not null]
+ privateKey text [not null]
+ certificatePath text [not null, unique]
+ autoRenew boolean
+ organizationId text [not null]
+ serverId text
+}
+
+table compose {
+ composeId text [pk, not null]
+ name text [not null]
+ appName text [not null]
+ description text
+ env text
+ composeFile text [not null, default: '']
+ refreshToken text
+ sourceType sourceTypeCompose [not null, default: 'github']
+ composeType composeType [not null, default: 'docker-compose']
+ repository text
+ owner text
+ branch text
+ autoDeploy boolean
+ gitlabProjectId integer
+ gitlabRepository text
+ gitlabOwner text
+ gitlabBranch text
+ gitlabPathNamespace text
+ bitbucketRepository text
+ bitbucketOwner text
+ bitbucketBranch text
+ giteaRepository text
+ giteaOwner text
+ giteaBranch text
+ customGitUrl text
+ customGitBranch text
+ customGitSSHKeyId text
+ command text [not null, default: '']
+ enableSubmodules boolean [not null, default: false]
+ composePath text [not null, default: './docker-compose.yml']
+ suffix text [not null, default: '']
+ randomize boolean [not null, default: false]
+ isolatedDeployment boolean [not null, default: false]
+ isolatedDeploymentsVolume boolean [not null, default: false]
+ triggerType triggerType [default: 'push']
+ composeStatus applicationStatus [not null, default: 'idle']
+ environmentId text [not null]
+ createdAt text [not null]
+ watchPaths text[]
+ githubId text
+ gitlabId text
+ bitbucketId text
+ giteaId text
+ serverId text
+}
+
+table custom {
+ customId text [pk, not null]
+ endpoint text [not null]
+ headers text
+}
+
+table deployment {
+ deploymentId text [pk, not null]
+ title text [not null]
+ description text
+ status deploymentStatus [default: 'running']
+ logPath text [not null]
+ pid text
+ applicationId text
+ composeId text
+ serverId text
+ isPreviewDeployment boolean [default: false]
+ previewDeploymentId text
+ createdAt text [not null]
+ startedAt text
+ finishedAt text
+ errorMessage text
+ scheduleId text
+ backupId text
+ rollbackId text
+ volumeBackupId text
+}
+
+table destination {
+ destinationId text [pk, not null]
+ name text [not null]
+ provider text
+ accessKey text [not null]
+ secretAccessKey text [not null]
+ bucket text [not null]
+ region text [not null]
+ endpoint text [not null]
+ organizationId text [not null]
+ createdAt timestamp [not null, default: `now()`]
+}
+
+table discord {
+ discordId text [pk, not null]
+ webhookUrl text [not null]
+ decoration boolean
+}
+
+table domain {
+ domainId text [pk, not null]
+ host text [not null]
+ https boolean [not null, default: false]
+ port integer [default: 3000]
+ path text [default: '/']
+ serviceName text
+ domainType domainType [default: 'application']
+ uniqueConfigKey serial [not null, increment]
+ createdAt text [not null]
+ composeId text
+ customCertResolver text
+ applicationId text
+ previewDeploymentId text
+ certificateType certificateType [not null, default: 'none']
+ internalPath text [default: '/']
+ stripPath boolean [not null, default: false]
+}
+
+table email {
+ emailId text [pk, not null]
+ smtpServer text [not null]
+ smtpPort integer [not null]
+ username text [not null]
+ password text [not null]
+ fromAddress text [not null]
+ toAddress text[] [not null]
+}
+
+table environment {
+ environmentId text [pk, not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ env text [not null, default: '']
+ projectId text [not null]
+}
+
+table git_provider {
+ gitProviderId text [pk, not null]
+ name text [not null]
+ providerType gitProviderType [not null, default: 'github']
+ createdAt text [not null]
+ organizationId text [not null]
+ userId text [not null]
+}
+
+table gitea {
+ giteaId text [pk, not null]
+ giteaUrl text [not null, default: 'https://gitea.com']
+ redirect_uri text
+ client_id text
+ client_secret text
+ gitProviderId text [not null]
+ access_token text
+ refresh_token text
+ expires_at integer
+ scopes text [default: 'repo,repo:status,read:user,read:org']
+ last_authenticated_at integer
+}
+
+table github {
+ githubId text [pk, not null]
+ githubAppName text
+ githubAppId integer
+ githubClientId text
+ githubClientSecret text
+ githubInstallationId text
+ githubPrivateKey text
+ githubWebhookSecret text
+ gitProviderId text [not null]
+}
+
+table gitlab {
+ gitlabId text [pk, not null]
+ gitlabUrl text [not null, default: 'https://gitlab.com']
+ application_id text
+ redirect_uri text
+ secret text
+ access_token text
+ refresh_token text
+ group_name text
+ expires_at integer
+ gitProviderId text [not null]
+}
+
+table gotify {
+ gotifyId text [pk, not null]
+ serverUrl text [not null]
+ appToken text [not null]
+ priority integer [not null, default: 5]
+ decoration boolean
+}
+
+table invitation {
+ id text [pk, not null]
+ organization_id text [not null]
+ email text [not null]
+ role text
+ status text [not null]
+ expires_at timestamp [not null]
+ inviter_id text [not null]
+ team_id text
+}
+
+table lark {
+ larkId text [pk, not null]
+ webhookUrl text [not null]
+}
+
+table mariadb {
+ mariadbId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ rootPassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table member {
+ id text [pk, not null]
+ organization_id text [not null]
+ user_id text [not null]
+ role text [not null]
+ created_at timestamp [not null]
+ team_id text
+ is_default boolean [not null, default: false]
+ canCreateProjects boolean [not null, default: false]
+ canAccessToSSHKeys boolean [not null, default: false]
+ canCreateServices boolean [not null, default: false]
+ canDeleteProjects boolean [not null, default: false]
+ canDeleteServices boolean [not null, default: false]
+ canAccessToDocker boolean [not null, default: false]
+ canAccessToAPI boolean [not null, default: false]
+ canAccessToGitProviders boolean [not null, default: false]
+ canAccessToTraefikFiles boolean [not null, default: false]
+ canDeleteEnvironments boolean [not null, default: false]
+ canCreateEnvironments boolean [not null, default: false]
+ accesedProjects text[] [not null, default: `ARRAY[]::text[]`]
+ accessedEnvironments text[] [not null, default: `ARRAY[]::text[]`]
+ accesedServices text[] [not null, default: `ARRAY[]::text[]`]
+}
+
+table mongo {
+ mongoId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseUser text [not null]
+ databasePassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+ replicaSets boolean [default: false]
+}
+
+table mount {
+ mountId text [pk, not null]
+ type mountType [not null]
+ hostPath text
+ volumeName text
+ filePath text
+ content text
+ serviceType serviceType [not null, default: 'application']
+ mountPath text [not null]
+ applicationId text
+ postgresId text
+ mariadbId text
+ mongoId text
+ mysqlId text
+ redisId text
+ composeId text
+}
+
+table mysql {
+ mysqlId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ rootPassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table notification {
+ notificationId text [pk, not null]
+ name text [not null]
+ appDeploy boolean [not null, default: false]
+ appBuildError boolean [not null, default: false]
+ databaseBackup boolean [not null, default: false]
+ dokployRestart boolean [not null, default: false]
+ dockerCleanup boolean [not null, default: false]
+ serverThreshold boolean [not null, default: false]
+ notificationType notificationType [not null]
+ createdAt text [not null]
+ slackId text
+ telegramId text
+ discordId text
+ emailId text
+ gotifyId text
+ ntfyId text
+ customId text
+ larkId text
+ organizationId text [not null]
+}
+
+table ntfy {
+ ntfyId text [pk, not null]
+ serverUrl text [not null]
+ topic text [not null]
+ accessToken text [not null]
+ priority integer [not null, default: 3]
+}
+
+table organization {
+ id text [pk, not null]
+ name text [not null]
+ slug text [unique]
+ logo text
+ created_at timestamp [not null]
+ metadata text
+ owner_id text [not null]
+}
+
+table port {
+ portId text [pk, not null]
+ publishedPort integer [not null]
+ publishMode publishModeType [not null, default: 'host']
+ targetPort integer [not null]
+ protocol protocolType [not null]
+ applicationId text [not null]
+}
+
+table postgres {
+ postgresId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ description text
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ externalPort integer
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table preview_deployments {
+ previewDeploymentId text [pk, not null]
+ branch text [not null]
+ pullRequestId text [not null]
+ pullRequestNumber text [not null]
+ pullRequestURL text [not null]
+ pullRequestTitle text [not null]
+ pullRequestCommentId text [not null]
+ previewStatus applicationStatus [not null, default: 'idle']
+ appName text [not null, unique]
+ applicationId text [not null]
+ domainId text
+ createdAt text [not null]
+ expiresAt text
+}
+
+table project {
+ projectId text [pk, not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ organizationId text [not null]
+ env text [not null, default: '']
+}
+
+table redirect {
+ redirectId text [pk, not null]
+ regex text [not null]
+ replacement text [not null]
+ permanent boolean [not null, default: false]
+ uniqueConfigKey serial [not null, increment]
+ createdAt text [not null]
+ applicationId text [not null]
+}
+
+table redis {
+ redisId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ password text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ createdAt text [not null]
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ endpointSpecSwarm json
+ replicas integer [not null, default: 1]
+ environmentId text [not null]
+ serverId text
+}
+
+table registry {
+ registryId text [pk, not null]
+ registryName text [not null]
+ imagePrefix text
+ username text [not null]
+ password text [not null]
+ registryUrl text [not null, default: '']
+ createdAt text [not null]
+ selfHosted RegistryType [not null, default: 'cloud']
+ organizationId text [not null]
+}
+
+table rollback {
+ rollbackId text [pk, not null]
+ deploymentId text [not null]
+ version serial [not null, increment]
+ image text
+ createdAt text [not null]
+ fullContext jsonb
+}
+
+table schedule {
+ scheduleId text [pk, not null]
+ name text [not null]
+ cronExpression text [not null]
+ appName text [not null]
+ serviceName text
+ shellType shellType [not null, default: 'bash']
+ scheduleType scheduleType [not null, default: 'application']
+ command text [not null]
+ script text
+ applicationId text
+ composeId text
+ serverId text
+ userId text
+ enabled boolean [not null, default: true]
+ createdAt text [not null]
+}
+
+table security {
+ securityId text [pk, not null]
+ username text [not null]
+ password text [not null]
+ createdAt text [not null]
+ applicationId text [not null]
+
+ indexes {
+ (username, applicationId) [name: 'security_username_applicationId_unique', unique]
+ }
+}
+
+table server {
+ serverId text [pk, not null]
+ name text [not null]
+ description text
+ ipAddress text [not null]
+ port integer [not null]
+ username text [not null, default: 'root']
+ appName text [not null]
+ enableDockerCleanup boolean [not null, default: false]
+ createdAt text [not null]
+ organizationId text [not null]
+ serverStatus serverStatus [not null, default: 'active']
+ command text [not null, default: '']
+ sshKeyId text
+ metricsConfig jsonb [not null, default: `{"server":{"type":"Remote","refreshRate":60,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
+}
+
+table session_temp {
+ id text [pk, not null]
+ expires_at timestamp [not null]
+ token text [not null, unique]
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ ip_address text
+ user_agent text
+ user_id text [not null]
+ impersonated_by text
+ active_organization_id text
+}
+
+table slack {
+ slackId text [pk, not null]
+ webhookUrl text [not null]
+ channel text
+}
+
+table "ssh-key" {
+ sshKeyId text [pk, not null]
+ privateKey text [not null, default: '']
+ publicKey text [not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ lastUsedAt text
+ organizationId text [not null]
+}
+
+table telegram {
+ telegramId text [pk, not null]
+ botToken text [not null]
+ chatId text [not null]
+ messageThreadId text
+}
+
+table two_factor {
+ id text [pk, not null]
+ secret text [not null]
+ backup_codes text [not null]
+ user_id text [not null]
+}
+
+table user {
+ id text [pk, not null]
+ name text [not null, default: '']
+ isRegistered boolean [not null, default: false]
+ expirationDate text [not null]
+ createdAt text [not null]
+ created_at timestamp [default: `now()`]
+ two_factor_enabled boolean
+ email text [not null, unique]
+ email_verified boolean [not null]
+ image text
+ banned boolean
+ ban_reason text
+ ban_expires timestamp
+ updated_at timestamp [not null]
+ serverIp text
+ certificateType certificateType [not null, default: 'none']
+ https boolean [not null, default: false]
+ host text
+ letsEncryptEmail text
+ sshPrivateKey text
+ enableDockerCleanup boolean [not null, default: false]
+ logCleanupCron text [default: '0 0 * * *']
+ role text [not null, default: 'user']
+ enablePaidFeatures boolean [not null, default: false]
+ allowImpersonation boolean [not null, default: false]
+ metricsConfig jsonb [not null, default: `{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
+ cleanupCacheApplications boolean [not null, default: false]
+ cleanupCacheOnPreviews boolean [not null, default: false]
+ cleanupCacheOnCompose boolean [not null, default: false]
+ stripeCustomerId text
+ stripeSubscriptionId text
+ serversQuantity integer [not null, default: 0]
+}
+
+table verification {
+ id text [pk, not null]
+ identifier text [not null]
+ value text [not null]
+ expires_at timestamp [not null]
+ created_at timestamp
+ updated_at timestamp
+}
+
+table volume_backup {
+ volumeBackupId text [pk, not null]
+ name text [not null]
+ volumeName text [not null]
+ prefix text [not null]
+ serviceType serviceType [not null, default: 'application']
+ appName text [not null]
+ serviceName text
+ turnOff boolean [not null, default: false]
+ cronExpression text [not null]
+ keepLatestCount integer
+ enabled boolean
+ applicationId text
+ postgresId text
+ mariadbId text
+ mongoId text
+ mysqlId text
+ redisId text
+ composeId text
+ createdAt text [not null]
+ destinationId text [not null]
+}
+
+ref: mount.applicationId > application.applicationId
+
+ref: mount.postgresId > postgres.postgresId
+
+ref: mount.mariadbId > mariadb.mariadbId
+
+ref: mount.mongoId > mongo.mongoId
+
+ref: mount.mysqlId > mysql.mysqlId
+
+ref: mount.redisId > redis.redisId
+
+ref: mount.composeId > compose.composeId
+
+ref: user.id - account.user_id
+
+ref: ai.organizationId - organization.id
+
+ref: apikey.user_id > user.id
+
+ref: application.environmentId > environment.environmentId
+
+ref: application.customGitSSHKeyId > "ssh-key".sshKeyId
+
+ref: application.registryId > registry.registryId
+
+ref: application.githubId - github.githubId
+
+ref: application.gitlabId - gitlab.gitlabId
+
+ref: application.giteaId - gitea.giteaId
+
+ref: application.bitbucketId - bitbucket.bitbucketId
+
+ref: application.serverId > server.serverId
+
+ref: backup.destinationId > destination.destinationId
+
+ref: backup.postgresId > postgres.postgresId
+
+ref: backup.mariadbId > mariadb.mariadbId
+
+ref: backup.mysqlId > mysql.mysqlId
+
+ref: backup.mongoId > mongo.mongoId
+
+ref: backup.userId > user.id
+
+ref: backup.composeId > compose.composeId
+
+ref: git_provider.gitProviderId - bitbucket.gitProviderId
+
+ref: certificate.serverId > server.serverId
+
+ref: certificate.organizationId - organization.id
+
+ref: compose.environmentId > environment.environmentId
+
+ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId
+
+ref: compose.githubId - github.githubId
+
+ref: compose.gitlabId - gitlab.gitlabId
+
+ref: compose.bitbucketId - bitbucket.bitbucketId
+
+ref: compose.giteaId - gitea.giteaId
+
+ref: compose.serverId > server.serverId
+
+ref: deployment.applicationId > application.applicationId
+
+ref: deployment.composeId > compose.composeId
+
+ref: deployment.serverId > server.serverId
+
+ref: deployment.previewDeploymentId > preview_deployments.previewDeploymentId
+
+ref: deployment.scheduleId > schedule.scheduleId
+
+ref: deployment.backupId > backup.backupId
+
+ref: rollback.deploymentId - deployment.deploymentId
+
+ref: deployment.volumeBackupId > volume_backup.volumeBackupId
+
+ref: destination.organizationId - organization.id
+
+ref: domain.applicationId > application.applicationId
+
+ref: domain.composeId > compose.composeId
+
+ref: preview_deployments.domainId - domain.domainId
+
+ref: environment.projectId > project.projectId
+
+ref: github.gitProviderId - git_provider.gitProviderId
+
+ref: gitlab.gitProviderId - git_provider.gitProviderId
+
+ref: gitea.gitProviderId - git_provider.gitProviderId
+
+ref: git_provider.organizationId - organization.id
+
+ref: git_provider.userId - user.id
+
+ref: invitation.organization_id - organization.id
+
+ref: mariadb.environmentId > environment.environmentId
+
+ref: mariadb.serverId > server.serverId
+
+ref: member.organization_id > organization.id
+
+ref: member.user_id - user.id
+
+ref: mongo.environmentId > environment.environmentId
+
+ref: mongo.serverId > server.serverId
+
+ref: mysql.environmentId > environment.environmentId
+
+ref: mysql.serverId > server.serverId
+
+ref: notification.slackId - slack.slackId
+
+ref: notification.telegramId - telegram.telegramId
+
+ref: notification.discordId - discord.discordId
+
+ref: notification.emailId - email.emailId
+
+ref: notification.gotifyId - gotify.gotifyId
+
+ref: notification.ntfyId - ntfy.ntfyId
+
+ref: notification.customId - custom.customId
+
+ref: notification.larkId - lark.larkId
+
+ref: notification.organizationId - organization.id
+
+ref: organization.owner_id > user.id
+
+ref: port.applicationId > application.applicationId
+
+ref: postgres.environmentId > environment.environmentId
+
+ref: postgres.serverId > server.serverId
+
+ref: preview_deployments.applicationId > application.applicationId
+
+ref: project.organizationId > organization.id
+
+ref: redirect.applicationId > application.applicationId
+
+ref: redis.environmentId > environment.environmentId
+
+ref: redis.serverId > server.serverId
+
+ref: schedule.applicationId - application.applicationId
+
+ref: schedule.composeId > compose.composeId
+
+ref: schedule.serverId > server.serverId
+
+ref: schedule.userId > user.id
+
+ref: security.applicationId > application.applicationId
+
+ref: server.sshKeyId > "ssh-key".sshKeyId
+
+ref: server.organizationId > organization.id
+
+ref: "ssh-key".organizationId - organization.id
+
+ref: volume_backup.applicationId - application.applicationId
+
+ref: volume_backup.postgresId - postgres.postgresId
+
+ref: volume_backup.mariadbId - mariadb.mariadbId
+
+ref: volume_backup.mongoId - mongo.mongoId
+
+ref: volume_backup.mysqlId - mysql.mysqlId
+
+ref: volume_backup.redisId - redis.redisId
+
+ref: volume_backup.composeId - compose.composeId
+
+ref: volume_backup.destinationId - destination.destinationId
\ No newline at end of file
diff --git a/packages/server/src/db/schema/notification.ts b/packages/server/src/db/schema/notification.ts
index a0d7b6f2b..9b1b6bc38 100644
--- a/packages/server/src/db/schema/notification.ts
+++ b/packages/server/src/db/schema/notification.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";
@@ -12,6 +19,7 @@ export const notificationType = pgEnum("notificationType", [
"email",
"gotify",
"ntfy",
+ "custom",
"lark",
]);
@@ -50,6 +58,9 @@ export const notifications = pgTable("notification", {
ntfyId: text("ntfyId").references(() => ntfy.ntfyId, {
onDelete: "cascade",
}),
+ customId: text("customId").references(() => custom.customId, {
+ onDelete: "cascade",
+ }),
larkId: text("larkId").references(() => lark.larkId, {
onDelete: "cascade",
}),
@@ -121,6 +132,15 @@ export const ntfy = pgTable("ntfy", {
priority: integer("priority").notNull().default(3),
});
+export const custom = pgTable("custom", {
+ customId: text("customId")
+ .notNull()
+ .primaryKey()
+ .$defaultFn(() => nanoid()),
+ endpoint: text("endpoint").notNull(),
+ headers: jsonb("headers").$type>(),
+});
+
export const lark = pgTable("lark", {
larkId: text("larkId")
.notNull()
@@ -154,6 +174,10 @@ export const notificationsRelations = relations(notifications, ({ one }) => ({
fields: [notifications.ntfyId],
references: [ntfy.ntfyId],
}),
+ custom: one(custom, {
+ fields: [notifications.customId],
+ references: [custom.customId],
+ }),
lark: one(lark, {
fields: [notifications.larkId],
references: [lark.larkId],
@@ -362,6 +386,32 @@ export const apiFindOneNotification = notificationsSchema
})
.required();
+export const apiCreateCustom = notificationsSchema
+ .pick({
+ appBuildError: true,
+ databaseBackup: true,
+ dokployRestart: true,
+ name: true,
+ appDeploy: true,
+ dockerCleanup: true,
+ serverThreshold: true,
+ })
+ .extend({
+ endpoint: z.string().min(1),
+ headers: z.record(z.string()).optional(),
+ });
+
+export const apiUpdateCustom = apiCreateCustom.partial().extend({
+ notificationId: z.string().min(1),
+ customId: z.string().min(1),
+ organizationId: z.string().optional(),
+});
+
+export const apiTestCustomConnection = z.object({
+ endpoint: z.string().min(1),
+ headers: z.record(z.string()).optional(),
+});
+
export const apiCreateLark = notificationsSchema
.pick({
appBuildError: true,
@@ -404,5 +454,7 @@ export const apiSendTest = notificationsSchema
appToken: z.string(),
accessToken: z.string().optional(),
priority: z.number(),
+ endpoint: z.string(),
+ headers: z.string(),
})
.partial();
diff --git a/packages/server/src/db/schema/schema.dbml b/packages/server/src/db/schema/schema.dbml
index a8d004cfa..c19a569d9 100644
--- a/packages/server/src/db/schema/schema.dbml
+++ b/packages/server/src/db/schema/schema.dbml
@@ -5,17 +5,24 @@ enum applicationStatus {
error
}
+enum backupType {
+ database
+ compose
+}
+
enum buildType {
dockerfile
heroku_buildpacks
paketo_buildpacks
nixpacks
static
+ railpack
}
enum certificateType {
letsencrypt
none
+ custom
}
enum composeType {
@@ -28,6 +35,7 @@ enum databaseType {
mariadb
mysql
mongo
+ "web-server"
}
enum deploymentStatus {
@@ -61,6 +69,8 @@ enum notificationType {
discord
email
gotify
+ ntfy
+ custom
}
enum protocolType {
@@ -68,14 +78,21 @@ enum protocolType {
udp
}
+enum publishModeType {
+ ingress
+ host
+}
+
enum RegistryType {
selfHosted
cloud
}
-enum Roles {
- admin
- user
+enum scheduleType {
+ application
+ compose
+ server
+ "dokploy-server"
}
enum serverStatus {
@@ -93,6 +110,11 @@ enum serviceType {
compose
}
+enum shellType {
+ bash
+ sh
+}
+
enum sourceType {
docker
git
@@ -112,6 +134,11 @@ enum sourceTypeCompose {
raw
}
+enum triggerType {
+ push
+ tag
+}
+
table account {
id text [pk, not null]
account_id text [not null]
@@ -133,7 +160,39 @@ table account {
confirmationExpiresAt text
}
-table admin {
+table ai {
+ aiId text [pk, not null]
+ name text [not null]
+ apiUrl text [not null]
+ apiKey text [not null]
+ model text [not null]
+ isEnabled boolean [not null, default: true]
+ organizationId text [not null]
+ createdAt text [not null]
+}
+
+table apikey {
+ id text [pk, not null]
+ name text
+ start text
+ prefix text
+ key text [not null]
+ user_id text [not null]
+ refill_interval integer
+ refill_amount integer
+ last_refill_at timestamp
+ enabled boolean
+ rate_limit_enabled boolean
+ rate_limit_time_window integer
+ rate_limit_max integer
+ request_count integer
+ remaining integer
+ last_request timestamp
+ expires_at timestamp
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ permissions text
+ metadata text
}
table application {
@@ -143,14 +202,19 @@ table application {
description text
env text
previewEnv text
+ watchPaths text[]
previewBuildArgs text
+ previewLabels text[]
previewWildcard text
previewPort integer [default: 3000]
previewHttps boolean [not null, default: false]
previewPath text [default: '/']
certificateType certificateType [not null, default: 'none']
+ previewCustomCertResolver text
previewLimit integer [default: 3]
isPreviewDeploymentsActive boolean [default: false]
+ previewRequireCollaboratorPermissions boolean [default: true]
+ rollbackActive boolean [default: false]
buildArgs text
memoryReservation text
memoryLimit text
@@ -167,6 +231,7 @@ table application {
owner text
branch text
buildPath text [default: '/']
+ triggerType triggerType [default: 'push']
autoDeploy boolean
gitlabProjectId integer
gitlabRepository text
@@ -174,6 +239,10 @@ table application {
gitlabBranch text
gitlabBuildPath text [default: '/']
gitlabPathNamespace text
+ giteaRepository text
+ giteaOwner text
+ giteaBranch text
+ giteaBuildPath text [default: '/']
bitbucketRepository text
bitbucketOwner text
bitbucketBranch text
@@ -186,6 +255,7 @@ table application {
customGitBranch text
customGitBuildPath text
customGitSSHKeyId text
+ enableSubmodules boolean [not null, default: false]
dockerfile text
dockerContextPath text
dockerBuildStage text
@@ -201,52 +271,47 @@ table application {
replicas integer [not null, default: 1]
applicationStatus applicationStatus [not null, default: 'idle']
buildType buildType [not null, default: 'nixpacks']
+ railpackVersion text [default: '0.2.2']
herokuVersion text [default: '24']
publishDirectory text
+ isStaticSpa boolean
createdAt text [not null]
registryId text
- projectId text [not null]
+ environmentId text [not null]
githubId text
gitlabId text
- bitbucketId text
giteaId text
+ bitbucketId text
serverId text
}
-table auth {
- id text [pk, not null]
- email text [not null, unique]
- password text [not null]
- rol Roles [not null]
- image text
- secret text
- token text
- is2FAEnabled boolean [not null, default: false]
- createdAt text [not null]
- resetPasswordToken text
- resetPasswordExpiresAt text
- confirmationToken text
- confirmationExpiresAt text
-}
-
table backup {
backupId text [pk, not null]
+ appName text [not null, unique]
schedule text [not null]
enabled boolean
database text [not null]
prefix text [not null]
+ serviceName text
destinationId text [not null]
+ keepLatestCount integer
+ backupType backupType [not null, default: 'database']
databaseType databaseType [not null]
+ composeId text
postgresId text
mariadbId text
mysqlId text
mongoId text
+ userId text
+ metadata jsonb
}
table bitbucket {
bitbucketId text [pk, not null]
bitbucketUsername text
+ bitbucketEmail text
appPassword text
+ apiToken text
bitbucketWorkspaceName text
gitProviderId text [not null]
}
@@ -258,7 +323,7 @@ table certificate {
privateKey text [not null]
certificatePath text [not null, unique]
autoRenew boolean
- userId text
+ organizationId text [not null]
serverId text
}
@@ -291,13 +356,17 @@ table compose {
customGitBranch text
customGitSSHKeyId text
command text [not null, default: '']
+ enableSubmodules boolean [not null, default: false]
composePath text [not null, default: './docker-compose.yml']
suffix text [not null, default: '']
randomize boolean [not null, default: false]
isolatedDeployment boolean [not null, default: false]
+ isolatedDeploymentsVolume boolean [not null, default: false]
+ triggerType triggerType [default: 'push']
composeStatus applicationStatus [not null, default: 'idle']
- projectId text [not null]
+ environmentId text [not null]
createdAt text [not null]
+ watchPaths text[]
githubId text
gitlabId text
bitbucketId text
@@ -305,19 +374,32 @@ table compose {
serverId text
}
+table custom {
+ customId text [pk, not null]
+ endpoint text [not null]
+ headers text
+}
+
table deployment {
deploymentId text [pk, not null]
title text [not null]
description text
status deploymentStatus [default: 'running']
logPath text [not null]
+ pid text
applicationId text
composeId text
serverId text
isPreviewDeployment boolean [default: false]
previewDeploymentId text
createdAt text [not null]
+ startedAt text
+ finishedAt text
errorMessage text
+ scheduleId text
+ backupId text
+ rollbackId text
+ volumeBackupId text
}
table destination {
@@ -329,7 +411,8 @@ table destination {
bucket text [not null]
region text [not null]
endpoint text [not null]
- userId text [not null]
+ organizationId text [not null]
+ createdAt timestamp [not null, default: `now()`]
}
table discord {
@@ -349,9 +432,12 @@ table domain {
uniqueConfigKey serial [not null, increment]
createdAt text [not null]
composeId text
+ customCertResolver text
applicationId text
previewDeploymentId text
certificateType certificateType [not null, default: 'none']
+ internalPath text [default: '/']
+ stripPath boolean [not null, default: false]
}
table email {
@@ -364,12 +450,36 @@ table email {
toAddress text[] [not null]
}
+table environment {
+ environmentId text [pk, not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ env text [not null, default: '']
+ projectId text [not null]
+}
+
table git_provider {
gitProviderId text [pk, not null]
name text [not null]
providerType gitProviderType [not null, default: 'github']
createdAt text [not null]
- userId text
+ organizationId text [not null]
+ userId text [not null]
+}
+
+table gitea {
+ giteaId text [pk, not null]
+ giteaUrl text [not null, default: 'https://gitea.com']
+ redirect_uri text
+ client_id text
+ client_secret text
+ gitProviderId text [not null]
+ access_token text
+ refresh_token text
+ expires_at integer
+ scopes text [default: 'repo,repo:status,read:user,read:org']
+ last_authenticated_at integer
}
table github {
@@ -397,20 +507,6 @@ table gitlab {
gitProviderId text [not null]
}
-table gitea {
- giteaId text [pk, not null]
- giteaUrl text [not null, default: 'https://gitea.com']
- redirect_uri text
- client_id text [not null]
- client_secret text [not null]
- access_token text
- refresh_token text
- expires_at integer
- gitProviderId text [not null]
- scopes text [default: 'repo,repo:status,read:user,read:org']
- last_authenticated_at integer
-}
-
table gotify {
gotifyId text [pk, not null]
serverUrl text [not null]
@@ -427,6 +523,7 @@ table invitation {
status text [not null]
expires_at timestamp [not null]
inviter_id text [not null]
+ team_id text
}
table mariadb {
@@ -447,8 +544,17 @@ table mariadb {
cpuLimit text
externalPort integer
applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ replicas integer [not null, default: 1]
createdAt text [not null]
- projectId text [not null]
+ environmentId text [not null]
serverId text
}
@@ -458,6 +564,19 @@ table member {
user_id text [not null]
role text [not null]
created_at timestamp [not null]
+ team_id text
+ canCreateProjects boolean [not null, default: false]
+ canAccessToSSHKeys boolean [not null, default: false]
+ canCreateServices boolean [not null, default: false]
+ canDeleteProjects boolean [not null, default: false]
+ canDeleteServices boolean [not null, default: false]
+ canAccessToDocker boolean [not null, default: false]
+ canAccessToAPI boolean [not null, default: false]
+ canAccessToGitProviders boolean [not null, default: false]
+ canAccessToTraefikFiles boolean [not null, default: false]
+ accesedProjects text[] [not null, default: `ARRAY[]::text[]`]
+ accessedEnvironments text[] [not null, default: `ARRAY[]::text[]`]
+ accesedServices text[] [not null, default: `ARRAY[]::text[]`]
}
table mongo {
@@ -476,8 +595,17 @@ table mongo {
cpuLimit text
externalPort integer
applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ replicas integer [not null, default: 1]
createdAt text [not null]
- projectId text [not null]
+ environmentId text [not null]
serverId text
replicaSets boolean [default: false]
}
@@ -518,8 +646,17 @@ table mysql {
cpuLimit text
externalPort integer
applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ replicas integer [not null, default: 1]
createdAt text [not null]
- projectId text [not null]
+ environmentId text [not null]
serverId text
}
@@ -539,7 +676,17 @@ table notification {
discordId text
emailId text
gotifyId text
- userId text
+ ntfyId text
+ customId text
+ organizationId text [not null]
+}
+
+table ntfy {
+ ntfyId text [pk, not null]
+ serverUrl text [not null]
+ topic text [not null]
+ accessToken text [not null]
+ priority integer [not null, default: 3]
}
table organization {
@@ -555,6 +702,7 @@ table organization {
table port {
portId text [pk, not null]
publishedPort integer [not null]
+ publishMode publishModeType [not null, default: 'host']
targetPort integer [not null]
protocol protocolType [not null]
applicationId text [not null]
@@ -577,8 +725,17 @@ table postgres {
cpuReservation text
cpuLimit text
applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ replicas integer [not null, default: 1]
createdAt text [not null]
- projectId text [not null]
+ environmentId text [not null]
serverId text
}
@@ -603,7 +760,7 @@ table project {
name text [not null]
description text
createdAt text [not null]
- userId text [not null]
+ organizationId text [not null]
env text [not null, default: '']
}
@@ -633,7 +790,16 @@ table redis {
externalPort integer
createdAt text [not null]
applicationStatus applicationStatus [not null, default: 'idle']
- projectId text [not null]
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ replicas integer [not null, default: 1]
+ environmentId text [not null]
serverId text
}
@@ -646,7 +812,34 @@ table registry {
registryUrl text [not null, default: '']
createdAt text [not null]
selfHosted RegistryType [not null, default: 'cloud']
- userId text [not null]
+ organizationId text [not null]
+}
+
+table rollback {
+ rollbackId text [pk, not null]
+ deploymentId text [not null]
+ version serial [not null, increment]
+ image text
+ createdAt text [not null]
+ fullContext jsonb
+}
+
+table schedule {
+ scheduleId text [pk, not null]
+ name text [not null]
+ cronExpression text [not null]
+ appName text [not null]
+ serviceName text
+ shellType shellType [not null, default: 'bash']
+ scheduleType scheduleType [not null, default: 'application']
+ command text [not null]
+ script text
+ applicationId text
+ composeId text
+ serverId text
+ userId text
+ enabled boolean [not null, default: true]
+ createdAt text [not null]
}
table security {
@@ -671,14 +864,14 @@ table server {
appName text [not null]
enableDockerCleanup boolean [not null, default: false]
createdAt text [not null]
- userId text [not null]
+ organizationId text [not null]
serverStatus serverStatus [not null, default: 'active']
command text [not null, default: '']
sshKeyId text
metricsConfig jsonb [not null, default: `{"server":{"type":"Remote","refreshRate":60,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
}
-table session {
+table session_temp {
id text [pk, not null]
expires_at timestamp [not null]
token text [not null, unique]
@@ -705,49 +898,49 @@ table "ssh-key" {
description text
createdAt text [not null]
lastUsedAt text
- userId text
+ organizationId text [not null]
}
table telegram {
telegramId text [pk, not null]
botToken text [not null]
chatId text [not null]
+ messageThreadId text
}
-table user {
+table two_factor {
+ id text [pk, not null]
+ secret text [not null]
+ backup_codes text [not null]
+ user_id text [not null]
+}
+
+table user_temp {
id text [pk, not null]
name text [not null, default: '']
- token text [not null]
isRegistered boolean [not null, default: false]
expirationDate text [not null]
createdAt text [not null]
- canCreateProjects boolean [not null, default: false]
- canAccessToSSHKeys boolean [not null, default: false]
- canCreateServices boolean [not null, default: false]
- canDeleteProjects boolean [not null, default: false]
- canDeleteServices boolean [not null, default: false]
- canAccessToDocker boolean [not null, default: false]
- canAccessToAPI boolean [not null, default: false]
- canAccessToGitProviders boolean [not null, default: false]
- canAccessToTraefikFiles boolean [not null, default: false]
- accesedProjects text[] [not null, default: `ARRAY[]::text[]`]
- accesedServices text[] [not null, default: `ARRAY[]::text[]`]
+ created_at timestamp [default: `now()`]
+ two_factor_enabled boolean
email text [not null, unique]
email_verified boolean [not null]
image text
- role text
banned boolean
ban_reason text
ban_expires timestamp
updated_at timestamp [not null]
serverIp text
certificateType certificateType [not null, default: 'none']
+ https boolean [not null, default: false]
host text
letsEncryptEmail text
sshPrivateKey text
enableDockerCleanup boolean [not null, default: false]
- enableLogRotation boolean [not null, default: false]
+ logCleanupCron text [default: '0 0 * * *']
+ role text [not null, default: 'user']
enablePaidFeatures boolean [not null, default: false]
+ allowImpersonation boolean [not null, default: false]
metricsConfig jsonb [not null, default: `{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
cleanupCacheApplications boolean [not null, default: false]
cleanupCacheOnPreviews boolean [not null, default: false]
@@ -766,6 +959,29 @@ table verification {
updated_at timestamp
}
+table volume_backup {
+ volumeBackupId text [pk, not null]
+ name text [not null]
+ volumeName text [not null]
+ prefix text [not null]
+ serviceType serviceType [not null, default: 'application']
+ appName text [not null]
+ serviceName text
+ turnOff boolean [not null, default: false]
+ cronExpression text [not null]
+ keepLatestCount integer
+ enabled boolean
+ applicationId text
+ postgresId text
+ mariadbId text
+ mongoId text
+ mysqlId text
+ redisId text
+ composeId text
+ createdAt text [not null]
+ destinationId text [not null]
+}
+
ref: mount.applicationId > application.applicationId
ref: mount.postgresId > postgres.postgresId
@@ -780,7 +996,13 @@ ref: mount.redisId > redis.redisId
ref: mount.composeId > compose.composeId
-ref: application.projectId > project.projectId
+ref: user_temp.id - account.user_id
+
+ref: ai.organizationId - organization.id
+
+ref: apikey.user_id > user_temp.id
+
+ref: application.environmentId > environment.environmentId
ref: application.customGitSSHKeyId > "ssh-key".sshKeyId
@@ -790,6 +1012,8 @@ ref: application.githubId - github.githubId
ref: application.gitlabId - gitlab.gitlabId
+ref: application.giteaId - gitea.giteaId
+
ref: application.bitbucketId - bitbucket.bitbucketId
ref: application.serverId > server.serverId
@@ -804,13 +1028,17 @@ ref: backup.mysqlId > mysql.mysqlId
ref: backup.mongoId > mongo.mongoId
+ref: backup.userId > user_temp.id
+
+ref: backup.composeId > compose.composeId
+
ref: git_provider.gitProviderId - bitbucket.gitProviderId
ref: certificate.serverId > server.serverId
-ref: certificate.userId - user.id
+ref: certificate.organizationId - organization.id
-ref: compose.projectId > project.projectId
+ref: compose.environmentId > environment.environmentId
ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId
@@ -820,6 +1048,8 @@ ref: compose.gitlabId - gitlab.gitlabId
ref: compose.bitbucketId - bitbucket.bitbucketId
+ref: compose.giteaId - gitea.giteaId
+
ref: compose.serverId > server.serverId
ref: deployment.applicationId > application.applicationId
@@ -830,7 +1060,15 @@ ref: deployment.serverId > server.serverId
ref: deployment.previewDeploymentId > preview_deployments.previewDeploymentId
-ref: destination.userId - user.id
+ref: deployment.scheduleId > schedule.scheduleId
+
+ref: deployment.backupId > backup.backupId
+
+ref: rollback.deploymentId - deployment.deploymentId
+
+ref: deployment.volumeBackupId > volume_backup.volumeBackupId
+
+ref: destination.organizationId - organization.id
ref: domain.applicationId > application.applicationId
@@ -838,23 +1076,33 @@ ref: domain.composeId > compose.composeId
ref: preview_deployments.domainId - domain.domainId
+ref: environment.projectId > project.projectId
+
ref: github.gitProviderId - git_provider.gitProviderId
ref: gitlab.gitProviderId - git_provider.gitProviderId
ref: gitea.gitProviderId - git_provider.gitProviderId
-ref: git_provider.userId - user.id
+ref: git_provider.organizationId - organization.id
-ref: mariadb.projectId > project.projectId
+ref: git_provider.userId - user_temp.id
+
+ref: invitation.organization_id - organization.id
+
+ref: mariadb.environmentId > environment.environmentId
ref: mariadb.serverId > server.serverId
-ref: mongo.projectId > project.projectId
+ref: member.organization_id > organization.id
+
+ref: member.user_id - user_temp.id
+
+ref: mongo.environmentId > environment.environmentId
ref: mongo.serverId > server.serverId
-ref: mysql.projectId > project.projectId
+ref: mysql.environmentId > environment.environmentId
ref: mysql.serverId > server.serverId
@@ -868,30 +1116,58 @@ ref: notification.emailId - email.emailId
ref: notification.gotifyId - gotify.gotifyId
-ref: notification.userId - user.id
+ref: notification.ntfyId - ntfy.ntfyId
+
+ref: notification.customId - custom.customId
+
+ref: notification.organizationId - organization.id
+
+ref: organization.owner_id > user_temp.id
ref: port.applicationId > application.applicationId
-ref: postgres.projectId > project.projectId
+ref: postgres.environmentId > environment.environmentId
ref: postgres.serverId > server.serverId
ref: preview_deployments.applicationId > application.applicationId
-ref: project.userId - user.id
+ref: project.organizationId > organization.id
ref: redirect.applicationId > application.applicationId
-ref: redis.projectId > project.projectId
+ref: redis.environmentId > environment.environmentId
ref: redis.serverId > server.serverId
-ref: registry.userId - user.id
+ref: schedule.applicationId - application.applicationId
+
+ref: schedule.composeId > compose.composeId
+
+ref: schedule.serverId > server.serverId
+
+ref: schedule.userId > user_temp.id
ref: security.applicationId > application.applicationId
-ref: server.userId - user.id
-
ref: server.sshKeyId > "ssh-key".sshKeyId
-ref: "ssh-key".userId - user.id
\ No newline at end of file
+ref: server.organizationId > organization.id
+
+ref: "ssh-key".organizationId - organization.id
+
+ref: volume_backup.applicationId - application.applicationId
+
+ref: volume_backup.postgresId - postgres.postgresId
+
+ref: volume_backup.mariadbId - mariadb.mariadbId
+
+ref: volume_backup.mongoId - mongo.mongoId
+
+ref: volume_backup.mysqlId - mysql.mysqlId
+
+ref: volume_backup.redisId - redis.redisId
+
+ref: volume_backup.composeId - compose.composeId
+
+ref: volume_backup.destinationId - destination.destinationId
\ No newline at end of file
diff --git a/packages/server/src/services/notification.ts b/packages/server/src/services/notification.ts
index 983f6c48a..399c19f0c 100644
--- a/packages/server/src/services/notification.ts
+++ b/packages/server/src/services/notification.ts
@@ -1,23 +1,26 @@
import { db } from "@dokploy/server/db";
import {
+ type apiCreateCustom,
type apiCreateDiscord,
type apiCreateEmail,
- type apiCreateLark,
type apiCreateGotify,
+ type apiCreateLark,
type apiCreateNtfy,
type apiCreateSlack,
type apiCreateTelegram,
+ type apiUpdateCustom,
type apiUpdateDiscord,
type apiUpdateEmail,
- type apiUpdateLark,
type apiUpdateGotify,
+ type apiUpdateLark,
type apiUpdateNtfy,
type apiUpdateSlack,
type apiUpdateTelegram,
+ custom,
discord,
email,
- lark,
gotify,
+ lark,
notifications,
ntfy,
slack,
@@ -590,6 +593,94 @@ export const updateNtfyNotification = async (
});
};
+export const createCustomNotification = async (
+ input: typeof apiCreateCustom._type,
+ organizationId: string,
+) => {
+ await db.transaction(async (tx) => {
+ const newCustom = await tx
+ .insert(custom)
+ .values({
+ endpoint: input.endpoint,
+ headers: input.headers,
+ })
+ .returning()
+ .then((value) => value[0]);
+
+ if (!newCustom) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error input: Inserting custom",
+ });
+ }
+
+ const newDestination = await tx
+ .insert(notifications)
+ .values({
+ customId: newCustom.customId,
+ name: input.name,
+ appDeploy: input.appDeploy,
+ appBuildError: input.appBuildError,
+ databaseBackup: input.databaseBackup,
+ dokployRestart: input.dokployRestart,
+ dockerCleanup: input.dockerCleanup,
+ notificationType: "custom",
+ organizationId: organizationId,
+ serverThreshold: input.serverThreshold,
+ })
+ .returning()
+ .then((value) => value[0]);
+
+ if (!newDestination) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error input: Inserting notification",
+ });
+ }
+
+ return newDestination;
+ });
+};
+
+export const updateCustomNotification = async (
+ input: typeof apiUpdateCustom._type,
+) => {
+ await db.transaction(async (tx) => {
+ const newDestination = await tx
+ .update(notifications)
+ .set({
+ name: input.name,
+ appDeploy: input.appDeploy,
+ appBuildError: input.appBuildError,
+ databaseBackup: input.databaseBackup,
+ dokployRestart: input.dokployRestart,
+ dockerCleanup: input.dockerCleanup,
+ organizationId: input.organizationId,
+ serverThreshold: input.serverThreshold,
+ })
+ .where(eq(notifications.notificationId, input.notificationId))
+ .returning()
+ .then((value) => value[0]);
+
+ if (!newDestination) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error Updating notification",
+ });
+ }
+
+ await tx
+ .update(custom)
+ .set({
+ endpoint: input.endpoint,
+ headers: input.headers,
+ })
+ .where(eq(custom.customId, input.customId));
+
+ return newDestination;
+ });
+};
+
export const findNotificationById = async (notificationId: string) => {
const notification = await db.query.notifications.findFirst({
where: eq(notifications.notificationId, notificationId),
@@ -600,6 +691,7 @@ export const findNotificationById = async (notificationId: string) => {
email: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
diff --git a/packages/server/src/utils/backups/mariadb.ts b/packages/server/src/utils/backups/mariadb.ts
index 2353821e5..56cb1a9aa 100644
--- a/packages/server/src/utils/backups/mariadb.ts
+++ b/packages/server/src/utils/backups/mariadb.ts
@@ -3,8 +3,8 @@ import {
createDeploymentBackup,
updateDeploymentStatus,
} from "@dokploy/server/services/deployment";
-import type { Mariadb } from "@dokploy/server/services/mariadb";
import { findEnvironmentById } from "@dokploy/server/services/environment";
+import type { Mariadb } from "@dokploy/server/services/mariadb";
import { findProjectById } from "@dokploy/server/services/project";
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
import { execAsync, execAsyncRemote } from "../process/execAsync";
diff --git a/packages/server/src/utils/backups/mongo.ts b/packages/server/src/utils/backups/mongo.ts
index 429de7d4d..2071478a0 100644
--- a/packages/server/src/utils/backups/mongo.ts
+++ b/packages/server/src/utils/backups/mongo.ts
@@ -3,8 +3,8 @@ import {
createDeploymentBackup,
updateDeploymentStatus,
} from "@dokploy/server/services/deployment";
-import type { Mongo } from "@dokploy/server/services/mongo";
import { findEnvironmentById } from "@dokploy/server/services/environment";
+import type { Mongo } from "@dokploy/server/services/mongo";
import { findProjectById } from "@dokploy/server/services/project";
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
import { execAsync, execAsyncRemote } from "../process/execAsync";
diff --git a/packages/server/src/utils/backups/mysql.ts b/packages/server/src/utils/backups/mysql.ts
index 90919f24c..d131090fa 100644
--- a/packages/server/src/utils/backups/mysql.ts
+++ b/packages/server/src/utils/backups/mysql.ts
@@ -3,8 +3,8 @@ import {
createDeploymentBackup,
updateDeploymentStatus,
} from "@dokploy/server/services/deployment";
-import type { MySql } from "@dokploy/server/services/mysql";
import { findEnvironmentById } from "@dokploy/server/services/environment";
+import type { MySql } from "@dokploy/server/services/mysql";
import { findProjectById } from "@dokploy/server/services/project";
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
import { execAsync, execAsyncRemote } from "../process/execAsync";
diff --git a/packages/server/src/utils/backups/postgres.ts b/packages/server/src/utils/backups/postgres.ts
index 9aa5d8f5f..9241f2103 100644
--- a/packages/server/src/utils/backups/postgres.ts
+++ b/packages/server/src/utils/backups/postgres.ts
@@ -3,8 +3,8 @@ import {
createDeploymentBackup,
updateDeploymentStatus,
} from "@dokploy/server/services/deployment";
-import type { Postgres } from "@dokploy/server/services/postgres";
import { findEnvironmentById } from "@dokploy/server/services/environment";
+import type { Postgres } from "@dokploy/server/services/postgres";
import { findProjectById } from "@dokploy/server/services/project";
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
import { execAsync, execAsyncRemote } from "../process/execAsync";
diff --git a/packages/server/src/utils/notifications/build-error.ts b/packages/server/src/utils/notifications/build-error.ts
index 3ee983031..f05fa8134 100644
--- a/packages/server/src/utils/notifications/build-error.ts
+++ b/packages/server/src/utils/notifications/build-error.ts
@@ -5,6 +5,7 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns";
import { and, eq } from "drizzle-orm";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -45,12 +46,13 @@ export const sendBuildErrorNotifications = async ({
slack: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
for (const notification of notificationList) {
- const { email, discord, telegram, slack, gotify, ntfy, lark } =
+ const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification;
try {
if (email) {
@@ -220,6 +222,22 @@ export const sendBuildErrorNotifications = async ({
});
}
+ if (custom) {
+ await sendCustomNotification(custom, {
+ title: "Build Error",
+ message: "Build failed with errors",
+ projectName,
+ applicationName,
+ applicationType,
+ errorMessage,
+ buildLink,
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ status: "error",
+ type: "build",
+ });
+ }
+
if (lark) {
const limitCharacter = 800;
const truncatedErrorMessage = errorMessage.substring(0, limitCharacter);
diff --git a/packages/server/src/utils/notifications/build-success.ts b/packages/server/src/utils/notifications/build-success.ts
index 232eb76c2..e120d107b 100644
--- a/packages/server/src/utils/notifications/build-success.ts
+++ b/packages/server/src/utils/notifications/build-success.ts
@@ -6,6 +6,7 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns";
import { and, eq } from "drizzle-orm";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -48,12 +49,13 @@ export const sendBuildSuccessNotifications = async ({
slack: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
for (const notification of notificationList) {
- const { email, discord, telegram, slack, gotify, ntfy, lark } =
+ const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification;
try {
if (email) {
@@ -181,7 +183,10 @@ export const sendBuildSuccessNotifications = async ({
await sendTelegramNotification(
telegram,
- `✅ Build Success\n\nProject: ${projectName}\nApplication: ${applicationName}\nEnvironment: ${environmentName}\nType: ${applicationType}\nDate: ${format(date, "PP")}\nTime: ${format(date, "pp")}`,
+ `✅ Build Success\n\nProject: ${projectName}\nApplication: ${applicationName}\nEnvironment: ${environmentName}\nType: ${applicationType}\nDate: ${format(
+ date,
+ "PP",
+ )}\nTime: ${format(date, "pp")}`,
inlineButton,
);
}
@@ -233,6 +238,22 @@ export const sendBuildSuccessNotifications = async ({
});
}
+ if (custom) {
+ await sendCustomNotification(custom, {
+ title: "Build Success",
+ message: "Build completed successfully",
+ projectName,
+ applicationName,
+ applicationType,
+ buildLink,
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ domains: domains.map((domain) => domain.host).join(", "),
+ status: "success",
+ type: "build",
+ });
+ }
+
if (lark) {
await sendLarkNotification(lark, {
msg_type: "interactive",
diff --git a/packages/server/src/utils/notifications/database-backup.ts b/packages/server/src/utils/notifications/database-backup.ts
index 02141e3ae..e0754b715 100644
--- a/packages/server/src/utils/notifications/database-backup.ts
+++ b/packages/server/src/utils/notifications/database-backup.ts
@@ -5,6 +5,7 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns";
import { and, eq } from "drizzle-orm";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -45,12 +46,13 @@ export const sendDatabaseBackupNotifications = async ({
slack: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
for (const notification of notificationList) {
- const { email, discord, telegram, slack, gotify, ntfy, lark } =
+ const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification;
try {
if (email) {
@@ -242,6 +244,25 @@ export const sendDatabaseBackupNotifications = async ({
});
}
+ if (custom) {
+ await sendCustomNotification(custom, {
+ title: `Database Backup ${type === "success" ? "Successful" : "Failed"}`,
+ message:
+ type === "success"
+ ? "Database backup completed successfully"
+ : "Database backup failed",
+ projectName,
+ applicationName,
+ databaseType,
+ databaseName,
+ type,
+ errorMessage: errorMessage || "",
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ status: type,
+ });
+ }
+
if (lark) {
const limitCharacter = 800;
const truncatedErrorMessage =
diff --git a/packages/server/src/utils/notifications/docker-cleanup.ts b/packages/server/src/utils/notifications/docker-cleanup.ts
index f7947c8a0..061f892ff 100644
--- a/packages/server/src/utils/notifications/docker-cleanup.ts
+++ b/packages/server/src/utils/notifications/docker-cleanup.ts
@@ -5,6 +5,7 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns";
import { and, eq } from "drizzle-orm";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -32,12 +33,13 @@ export const sendDockerCleanupNotifications = async (
slack: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
for (const notification of notificationList) {
- const { email, discord, telegram, slack, gotify, ntfy, lark } =
+ const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification;
try {
if (email) {
@@ -139,6 +141,18 @@ export const sendDockerCleanupNotifications = async (
});
}
+ if (custom) {
+ await sendCustomNotification(custom, {
+ title: "Docker Cleanup",
+ message: "Docker cleanup completed successfully",
+ cleanupMessage: message,
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ status: "success",
+ type: "docker-cleanup",
+ });
+ }
+
if (lark) {
await sendLarkNotification(lark, {
msg_type: "interactive",
diff --git a/packages/server/src/utils/notifications/dokploy-restart.ts b/packages/server/src/utils/notifications/dokploy-restart.ts
index 093e14010..095ca4a6a 100644
--- a/packages/server/src/utils/notifications/dokploy-restart.ts
+++ b/packages/server/src/utils/notifications/dokploy-restart.ts
@@ -5,6 +5,7 @@ import { renderAsync } from "@react-email/components";
import { format } from "date-fns";
import { eq } from "drizzle-orm";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendEmailNotification,
sendGotifyNotification,
@@ -26,12 +27,13 @@ export const sendDokployRestartNotifications = async () => {
slack: true,
gotify: true,
ntfy: true,
+ custom: true,
lark: true,
},
});
for (const notification of notificationList) {
- const { email, discord, telegram, slack, gotify, ntfy, lark } =
+ const { email, discord, telegram, slack, gotify, ntfy, custom, lark } =
notification;
try {
@@ -101,7 +103,10 @@ export const sendDokployRestartNotifications = async () => {
if (telegram) {
await sendTelegramNotification(
telegram,
- `✅ Dokploy Server Restarted\n\nDate: ${format(date, "PP")}\nTime: ${format(date, "pp")}`,
+ `✅ Dokploy Server Restarted\n\nDate: ${format(
+ date,
+ "PP",
+ )}\nTime: ${format(date, "pp")}`,
);
}
@@ -125,6 +130,21 @@ export const sendDokployRestartNotifications = async () => {
});
}
+ if (custom) {
+ try {
+ await sendCustomNotification(custom, {
+ title: "Dokploy Server Restarted",
+ message: "Dokploy server has been restarted successfully",
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ status: "success",
+ type: "dokploy-restart",
+ });
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
if (lark) {
await sendLarkNotification(lark, {
msg_type: "interactive",
@@ -181,7 +201,10 @@ export const sendDokployRestartNotifications = async () => {
elements: [
{
tag: "markdown",
- content: `**Restart Time:**\n${format(date, "PP pp")}`,
+ content: `**Restart Time:**\n${format(
+ date,
+ "PP pp",
+ )}`,
text_align: "left",
text_size: "normal_v2",
},
diff --git a/packages/server/src/utils/notifications/server-threshold.ts b/packages/server/src/utils/notifications/server-threshold.ts
index b8d627425..cb3484c55 100644
--- a/packages/server/src/utils/notifications/server-threshold.ts
+++ b/packages/server/src/utils/notifications/server-threshold.ts
@@ -2,6 +2,7 @@ import { and, eq } from "drizzle-orm";
import { db } from "../../db";
import { notifications } from "../../db/schema";
import {
+ sendCustomNotification,
sendDiscordNotification,
sendLarkNotification,
sendSlackNotification,
@@ -35,6 +36,7 @@ export const sendServerThresholdNotifications = async (
discord: true,
telegram: true,
slack: true,
+ custom: true,
lark: true,
},
});
@@ -43,7 +45,7 @@ export const sendServerThresholdNotifications = async (
const typeColor = 0xff0000; // Rojo para indicar alerta
for (const notification of notificationList) {
- const { discord, telegram, slack, lark } = notification;
+ const { discord, telegram, slack, custom, lark } = notification;
if (discord) {
const decorate = (decoration: string, text: string) =>
@@ -154,6 +156,21 @@ export const sendServerThresholdNotifications = async (
});
}
+ if (custom) {
+ await sendCustomNotification(custom, {
+ title: `Server ${payload.Type} Alert`,
+ message: payload.Message,
+ serverName: payload.ServerName,
+ type: payload.Type,
+ currentValue: payload.Value,
+ threshold: payload.Threshold,
+ timestamp: date.toISOString(),
+ date: date.toLocaleString(),
+ status: "alert",
+ alertType: "server-threshold",
+ });
+ }
+
if (lark) {
await sendLarkNotification(lark, {
msg_type: "interactive",
diff --git a/packages/server/src/utils/notifications/utils.ts b/packages/server/src/utils/notifications/utils.ts
index 328df0b87..02a226f23 100644
--- a/packages/server/src/utils/notifications/utils.ts
+++ b/packages/server/src/utils/notifications/utils.ts
@@ -1,4 +1,5 @@
import type {
+ custom,
discord,
email,
gotify,
@@ -175,6 +176,39 @@ export const sendNtfyNotification = async (
}
};
+export const sendCustomNotification = async (
+ connection: typeof custom.$inferInsert,
+ payload: Record,
+) => {
+ try {
+ // Merge default headers with custom headers (now already an object from jsonb)
+ const headers: Record = {
+ "Content-Type": "application/json",
+ ...(connection.headers || {}),
+ };
+
+ // Default body with payload
+ const body = JSON.stringify(payload);
+
+ const response = await fetch(connection.endpoint, {
+ method: "POST",
+ headers,
+ body,
+ });
+
+ if (!response.ok) {
+ throw new Error(
+ `Failed to send custom notification: ${response.statusText}`,
+ );
+ }
+
+ return response;
+ } catch (error) {
+ console.error("Error sending custom notification:", error);
+ throw error;
+ }
+};
+
export const sendLarkNotification = async (
connection: typeof lark.$inferInsert,
message: any,
diff --git a/schema.dbml b/schema.dbml
new file mode 100644
index 000000000..5823a8ff3
--- /dev/null
+++ b/schema.dbml
@@ -0,0 +1,1194 @@
+enum applicationStatus {
+ idle
+ running
+ done
+ error
+}
+
+enum backupType {
+ database
+ compose
+}
+
+enum buildType {
+ dockerfile
+ heroku_buildpacks
+ paketo_buildpacks
+ nixpacks
+ static
+ railpack
+}
+
+enum certificateType {
+ letsencrypt
+ none
+ custom
+}
+
+enum composeType {
+ "docker-compose"
+ stack
+}
+
+enum databaseType {
+ postgres
+ mariadb
+ mysql
+ mongo
+ "web-server"
+}
+
+enum deploymentStatus {
+ running
+ done
+ error
+ cancelled
+}
+
+enum domainType {
+ compose
+ application
+ preview
+}
+
+enum gitProviderType {
+ github
+ gitlab
+ bitbucket
+ gitea
+}
+
+enum mountType {
+ bind
+ volume
+ file
+}
+
+enum notificationType {
+ slack
+ telegram
+ discord
+ email
+ gotify
+ ntfy
+ custom
+ lark
+}
+
+enum protocolType {
+ tcp
+ udp
+}
+
+enum publishModeType {
+ ingress
+ host
+}
+
+enum RegistryType {
+ selfHosted
+ cloud
+}
+
+enum scheduleType {
+ application
+ compose
+ server
+ "dokploy-server"
+}
+
+enum serverStatus {
+ active
+ inactive
+}
+
+enum serviceType {
+ application
+ postgres
+ mysql
+ mariadb
+ mongo
+ redis
+ compose
+}
+
+enum shellType {
+ bash
+ sh
+}
+
+enum sourceType {
+ docker
+ git
+ github
+ gitlab
+ bitbucket
+ gitea
+ drop
+}
+
+enum sourceTypeCompose {
+ git
+ github
+ gitlab
+ bitbucket
+ gitea
+ raw
+}
+
+enum triggerType {
+ push
+ tag
+}
+
+table account {
+ id text [pk, not null]
+ account_id text [not null]
+ provider_id text [not null]
+ user_id text [not null]
+ access_token text
+ refresh_token text
+ id_token text
+ access_token_expires_at timestamp
+ refresh_token_expires_at timestamp
+ scope text
+ password text
+ is2FAEnabled boolean [not null, default: false]
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ resetPasswordToken text
+ resetPasswordExpiresAt text
+ confirmationToken text
+ confirmationExpiresAt text
+}
+
+table ai {
+ aiId text [pk, not null]
+ name text [not null]
+ apiUrl text [not null]
+ apiKey text [not null]
+ model text [not null]
+ isEnabled boolean [not null, default: true]
+ organizationId text [not null]
+ createdAt text [not null]
+}
+
+table apikey {
+ id text [pk, not null]
+ name text
+ start text
+ prefix text
+ key text [not null]
+ user_id text [not null]
+ refill_interval integer
+ refill_amount integer
+ last_refill_at timestamp
+ enabled boolean
+ rate_limit_enabled boolean
+ rate_limit_time_window integer
+ rate_limit_max integer
+ request_count integer
+ remaining integer
+ last_request timestamp
+ expires_at timestamp
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ permissions text
+ metadata text
+}
+
+table application {
+ applicationId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ env text
+ previewEnv text
+ watchPaths text[]
+ previewBuildArgs text
+ previewBuildSecrets text
+ previewLabels text[]
+ previewWildcard text
+ previewPort integer [default: 3000]
+ previewHttps boolean [not null, default: false]
+ previewPath text [default: '/']
+ certificateType certificateType [not null, default: 'none']
+ previewCustomCertResolver text
+ previewLimit integer [default: 3]
+ isPreviewDeploymentsActive boolean [default: false]
+ previewRequireCollaboratorPermissions boolean [default: true]
+ rollbackActive boolean [default: false]
+ buildArgs text
+ buildSecrets text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ title text
+ enabled boolean
+ subtitle text
+ command text
+ refreshToken text
+ sourceType sourceType [not null, default: 'github']
+ cleanCache boolean [default: false]
+ repository text
+ owner text
+ branch text
+ buildPath text [default: '/']
+ triggerType triggerType [default: 'push']
+ autoDeploy boolean
+ gitlabProjectId integer
+ gitlabRepository text
+ gitlabOwner text
+ gitlabBranch text
+ gitlabBuildPath text [default: '/']
+ gitlabPathNamespace text
+ giteaRepository text
+ giteaOwner text
+ giteaBranch text
+ giteaBuildPath text [default: '/']
+ bitbucketRepository text
+ bitbucketOwner text
+ bitbucketBranch text
+ bitbucketBuildPath text [default: '/']
+ username text
+ password text
+ dockerImage text
+ registryUrl text
+ customGitUrl text
+ customGitBranch text
+ customGitBuildPath text
+ customGitSSHKeyId text
+ enableSubmodules boolean [not null, default: false]
+ dockerfile text
+ dockerContextPath text
+ dockerBuildStage text
+ dropBuildPath text
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ applicationStatus applicationStatus [not null, default: 'idle']
+ buildType buildType [not null, default: 'nixpacks']
+ railpackVersion text [default: '0.2.2']
+ herokuVersion text [default: '24']
+ publishDirectory text
+ isStaticSpa boolean
+ createdAt text [not null]
+ registryId text
+ environmentId text [not null]
+ githubId text
+ gitlabId text
+ giteaId text
+ bitbucketId text
+ serverId text
+}
+
+table backup {
+ backupId text [pk, not null]
+ appName text [not null, unique]
+ schedule text [not null]
+ enabled boolean
+ database text [not null]
+ prefix text [not null]
+ serviceName text
+ destinationId text [not null]
+ keepLatestCount integer
+ backupType backupType [not null, default: 'database']
+ databaseType databaseType [not null]
+ composeId text
+ postgresId text
+ mariadbId text
+ mysqlId text
+ mongoId text
+ userId text
+ metadata jsonb
+}
+
+table bitbucket {
+ bitbucketId text [pk, not null]
+ bitbucketUsername text
+ bitbucketEmail text
+ appPassword text
+ apiToken text
+ bitbucketWorkspaceName text
+ gitProviderId text [not null]
+}
+
+table certificate {
+ certificateId text [pk, not null]
+ name text [not null]
+ certificateData text [not null]
+ privateKey text [not null]
+ certificatePath text [not null, unique]
+ autoRenew boolean
+ organizationId text [not null]
+ serverId text
+}
+
+table compose {
+ composeId text [pk, not null]
+ name text [not null]
+ appName text [not null]
+ description text
+ env text
+ composeFile text [not null, default: '']
+ refreshToken text
+ sourceType sourceTypeCompose [not null, default: 'github']
+ composeType composeType [not null, default: 'docker-compose']
+ repository text
+ owner text
+ branch text
+ autoDeploy boolean
+ gitlabProjectId integer
+ gitlabRepository text
+ gitlabOwner text
+ gitlabBranch text
+ gitlabPathNamespace text
+ bitbucketRepository text
+ bitbucketOwner text
+ bitbucketBranch text
+ giteaRepository text
+ giteaOwner text
+ giteaBranch text
+ customGitUrl text
+ customGitBranch text
+ customGitSSHKeyId text
+ command text [not null, default: '']
+ enableSubmodules boolean [not null, default: false]
+ composePath text [not null, default: './docker-compose.yml']
+ suffix text [not null, default: '']
+ randomize boolean [not null, default: false]
+ isolatedDeployment boolean [not null, default: false]
+ isolatedDeploymentsVolume boolean [not null, default: false]
+ triggerType triggerType [default: 'push']
+ composeStatus applicationStatus [not null, default: 'idle']
+ environmentId text [not null]
+ createdAt text [not null]
+ watchPaths text[]
+ githubId text
+ gitlabId text
+ bitbucketId text
+ giteaId text
+ serverId text
+}
+
+table custom {
+ customId text [pk, not null]
+ endpoint text [not null]
+ headers text
+}
+
+table deployment {
+ deploymentId text [pk, not null]
+ title text [not null]
+ description text
+ status deploymentStatus [default: 'running']
+ logPath text [not null]
+ pid text
+ applicationId text
+ composeId text
+ serverId text
+ isPreviewDeployment boolean [default: false]
+ previewDeploymentId text
+ createdAt text [not null]
+ startedAt text
+ finishedAt text
+ errorMessage text
+ scheduleId text
+ backupId text
+ rollbackId text
+ volumeBackupId text
+}
+
+table destination {
+ destinationId text [pk, not null]
+ name text [not null]
+ provider text
+ accessKey text [not null]
+ secretAccessKey text [not null]
+ bucket text [not null]
+ region text [not null]
+ endpoint text [not null]
+ organizationId text [not null]
+ createdAt timestamp [not null, default: `now()`]
+}
+
+table discord {
+ discordId text [pk, not null]
+ webhookUrl text [not null]
+ decoration boolean
+}
+
+table domain {
+ domainId text [pk, not null]
+ host text [not null]
+ https boolean [not null, default: false]
+ port integer [default: 3000]
+ path text [default: '/']
+ serviceName text
+ domainType domainType [default: 'application']
+ uniqueConfigKey serial [not null, increment]
+ createdAt text [not null]
+ composeId text
+ customCertResolver text
+ applicationId text
+ previewDeploymentId text
+ certificateType certificateType [not null, default: 'none']
+ internalPath text [default: '/']
+ stripPath boolean [not null, default: false]
+}
+
+table email {
+ emailId text [pk, not null]
+ smtpServer text [not null]
+ smtpPort integer [not null]
+ username text [not null]
+ password text [not null]
+ fromAddress text [not null]
+ toAddress text[] [not null]
+}
+
+table environment {
+ environmentId text [pk, not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ env text [not null, default: '']
+ projectId text [not null]
+}
+
+table git_provider {
+ gitProviderId text [pk, not null]
+ name text [not null]
+ providerType gitProviderType [not null, default: 'github']
+ createdAt text [not null]
+ organizationId text [not null]
+ userId text [not null]
+}
+
+table gitea {
+ giteaId text [pk, not null]
+ giteaUrl text [not null, default: 'https://gitea.com']
+ redirect_uri text
+ client_id text
+ client_secret text
+ gitProviderId text [not null]
+ access_token text
+ refresh_token text
+ expires_at integer
+ scopes text [default: 'repo,repo:status,read:user,read:org']
+ last_authenticated_at integer
+}
+
+table github {
+ githubId text [pk, not null]
+ githubAppName text
+ githubAppId integer
+ githubClientId text
+ githubClientSecret text
+ githubInstallationId text
+ githubPrivateKey text
+ githubWebhookSecret text
+ gitProviderId text [not null]
+}
+
+table gitlab {
+ gitlabId text [pk, not null]
+ gitlabUrl text [not null, default: 'https://gitlab.com']
+ application_id text
+ redirect_uri text
+ secret text
+ access_token text
+ refresh_token text
+ group_name text
+ expires_at integer
+ gitProviderId text [not null]
+}
+
+table gotify {
+ gotifyId text [pk, not null]
+ serverUrl text [not null]
+ appToken text [not null]
+ priority integer [not null, default: 5]
+ decoration boolean
+}
+
+table invitation {
+ id text [pk, not null]
+ organization_id text [not null]
+ email text [not null]
+ role text
+ status text [not null]
+ expires_at timestamp [not null]
+ inviter_id text [not null]
+ team_id text
+}
+
+table lark {
+ larkId text [pk, not null]
+ webhookUrl text [not null]
+}
+
+table mariadb {
+ mariadbId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ rootPassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table member {
+ id text [pk, not null]
+ organization_id text [not null]
+ user_id text [not null]
+ role text [not null]
+ created_at timestamp [not null]
+ team_id text
+ is_default boolean [not null, default: false]
+ canCreateProjects boolean [not null, default: false]
+ canAccessToSSHKeys boolean [not null, default: false]
+ canCreateServices boolean [not null, default: false]
+ canDeleteProjects boolean [not null, default: false]
+ canDeleteServices boolean [not null, default: false]
+ canAccessToDocker boolean [not null, default: false]
+ canAccessToAPI boolean [not null, default: false]
+ canAccessToGitProviders boolean [not null, default: false]
+ canAccessToTraefikFiles boolean [not null, default: false]
+ canDeleteEnvironments boolean [not null, default: false]
+ canCreateEnvironments boolean [not null, default: false]
+ accesedProjects text[] [not null, default: `ARRAY[]::text[]`]
+ accessedEnvironments text[] [not null, default: `ARRAY[]::text[]`]
+ accesedServices text[] [not null, default: `ARRAY[]::text[]`]
+}
+
+table mongo {
+ mongoId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseUser text [not null]
+ databasePassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+ replicaSets boolean [default: false]
+}
+
+table mount {
+ mountId text [pk, not null]
+ type mountType [not null]
+ hostPath text
+ volumeName text
+ filePath text
+ content text
+ serviceType serviceType [not null, default: 'application']
+ mountPath text [not null]
+ applicationId text
+ postgresId text
+ mariadbId text
+ mongoId text
+ mysqlId text
+ redisId text
+ composeId text
+}
+
+table mysql {
+ mysqlId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ rootPassword text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table notification {
+ notificationId text [pk, not null]
+ name text [not null]
+ appDeploy boolean [not null, default: false]
+ appBuildError boolean [not null, default: false]
+ databaseBackup boolean [not null, default: false]
+ dokployRestart boolean [not null, default: false]
+ dockerCleanup boolean [not null, default: false]
+ serverThreshold boolean [not null, default: false]
+ notificationType notificationType [not null]
+ createdAt text [not null]
+ slackId text
+ telegramId text
+ discordId text
+ emailId text
+ gotifyId text
+ ntfyId text
+ customId text
+ larkId text
+ organizationId text [not null]
+}
+
+table ntfy {
+ ntfyId text [pk, not null]
+ serverUrl text [not null]
+ topic text [not null]
+ accessToken text [not null]
+ priority integer [not null, default: 3]
+}
+
+table organization {
+ id text [pk, not null]
+ name text [not null]
+ slug text [unique]
+ logo text
+ created_at timestamp [not null]
+ metadata text
+ owner_id text [not null]
+}
+
+table port {
+ portId text [pk, not null]
+ publishedPort integer [not null]
+ publishMode publishModeType [not null, default: 'host']
+ targetPort integer [not null]
+ protocol protocolType [not null]
+ applicationId text [not null]
+}
+
+table postgres {
+ postgresId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ databaseName text [not null]
+ databaseUser text [not null]
+ databasePassword text [not null]
+ description text
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ externalPort integer
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ createdAt text [not null]
+ environmentId text [not null]
+ serverId text
+}
+
+table preview_deployments {
+ previewDeploymentId text [pk, not null]
+ branch text [not null]
+ pullRequestId text [not null]
+ pullRequestNumber text [not null]
+ pullRequestURL text [not null]
+ pullRequestTitle text [not null]
+ pullRequestCommentId text [not null]
+ previewStatus applicationStatus [not null, default: 'idle']
+ appName text [not null, unique]
+ applicationId text [not null]
+ domainId text
+ createdAt text [not null]
+ expiresAt text
+}
+
+table project {
+ projectId text [pk, not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ organizationId text [not null]
+ env text [not null, default: '']
+}
+
+table redirect {
+ redirectId text [pk, not null]
+ regex text [not null]
+ replacement text [not null]
+ permanent boolean [not null, default: false]
+ uniqueConfigKey serial [not null, increment]
+ createdAt text [not null]
+ applicationId text [not null]
+}
+
+table redis {
+ redisId text [pk, not null]
+ name text [not null]
+ appName text [not null, unique]
+ description text
+ password text [not null]
+ dockerImage text [not null]
+ command text
+ env text
+ memoryReservation text
+ memoryLimit text
+ cpuReservation text
+ cpuLimit text
+ externalPort integer
+ createdAt text [not null]
+ applicationStatus applicationStatus [not null, default: 'idle']
+ healthCheckSwarm json
+ restartPolicySwarm json
+ placementSwarm json
+ updateConfigSwarm json
+ rollbackConfigSwarm json
+ modeSwarm json
+ labelsSwarm json
+ networkSwarm json
+ stopGracePeriodSwarm bigint
+ replicas integer [not null, default: 1]
+ environmentId text [not null]
+ serverId text
+}
+
+table registry {
+ registryId text [pk, not null]
+ registryName text [not null]
+ imagePrefix text
+ username text [not null]
+ password text [not null]
+ registryUrl text [not null, default: '']
+ createdAt text [not null]
+ selfHosted RegistryType [not null, default: 'cloud']
+ organizationId text [not null]
+}
+
+table rollback {
+ rollbackId text [pk, not null]
+ deploymentId text [not null]
+ version serial [not null, increment]
+ image text
+ createdAt text [not null]
+ fullContext jsonb
+}
+
+table schedule {
+ scheduleId text [pk, not null]
+ name text [not null]
+ cronExpression text [not null]
+ appName text [not null]
+ serviceName text
+ shellType shellType [not null, default: 'bash']
+ scheduleType scheduleType [not null, default: 'application']
+ command text [not null]
+ script text
+ applicationId text
+ composeId text
+ serverId text
+ userId text
+ enabled boolean [not null, default: true]
+ createdAt text [not null]
+}
+
+table security {
+ securityId text [pk, not null]
+ username text [not null]
+ password text [not null]
+ createdAt text [not null]
+ applicationId text [not null]
+
+ indexes {
+ (username, applicationId) [name: 'security_username_applicationId_unique', unique]
+ }
+}
+
+table server {
+ serverId text [pk, not null]
+ name text [not null]
+ description text
+ ipAddress text [not null]
+ port integer [not null]
+ username text [not null, default: 'root']
+ appName text [not null]
+ enableDockerCleanup boolean [not null, default: false]
+ createdAt text [not null]
+ organizationId text [not null]
+ serverStatus serverStatus [not null, default: 'active']
+ command text [not null, default: '']
+ sshKeyId text
+ metricsConfig jsonb [not null, default: `{"server":{"type":"Remote","refreshRate":60,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
+}
+
+table session_temp {
+ id text [pk, not null]
+ expires_at timestamp [not null]
+ token text [not null, unique]
+ created_at timestamp [not null]
+ updated_at timestamp [not null]
+ ip_address text
+ user_agent text
+ user_id text [not null]
+ impersonated_by text
+ active_organization_id text
+}
+
+table slack {
+ slackId text [pk, not null]
+ webhookUrl text [not null]
+ channel text
+}
+
+table "ssh-key" {
+ sshKeyId text [pk, not null]
+ privateKey text [not null, default: '']
+ publicKey text [not null]
+ name text [not null]
+ description text
+ createdAt text [not null]
+ lastUsedAt text
+ organizationId text [not null]
+}
+
+table telegram {
+ telegramId text [pk, not null]
+ botToken text [not null]
+ chatId text [not null]
+ messageThreadId text
+}
+
+table two_factor {
+ id text [pk, not null]
+ secret text [not null]
+ backup_codes text [not null]
+ user_id text [not null]
+}
+
+table user_temp {
+ id text [pk, not null]
+ name text [not null, default: '']
+ isRegistered boolean [not null, default: false]
+ expirationDate text [not null]
+ createdAt text [not null]
+ created_at timestamp [default: `now()`]
+ two_factor_enabled boolean
+ email text [not null, unique]
+ email_verified boolean [not null]
+ image text
+ banned boolean
+ ban_reason text
+ ban_expires timestamp
+ updated_at timestamp [not null]
+ serverIp text
+ certificateType certificateType [not null, default: 'none']
+ https boolean [not null, default: false]
+ host text
+ letsEncryptEmail text
+ sshPrivateKey text
+ enableDockerCleanup boolean [not null, default: false]
+ logCleanupCron text [default: '0 0 * * *']
+ role text [not null, default: 'user']
+ enablePaidFeatures boolean [not null, default: false]
+ allowImpersonation boolean [not null, default: false]
+ metricsConfig jsonb [not null, default: `{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`]
+ cleanupCacheApplications boolean [not null, default: false]
+ cleanupCacheOnPreviews boolean [not null, default: false]
+ cleanupCacheOnCompose boolean [not null, default: false]
+ stripeCustomerId text
+ stripeSubscriptionId text
+ serversQuantity integer [not null, default: 0]
+}
+
+table verification {
+ id text [pk, not null]
+ identifier text [not null]
+ value text [not null]
+ expires_at timestamp [not null]
+ created_at timestamp
+ updated_at timestamp
+}
+
+table volume_backup {
+ volumeBackupId text [pk, not null]
+ name text [not null]
+ volumeName text [not null]
+ prefix text [not null]
+ serviceType serviceType [not null, default: 'application']
+ appName text [not null]
+ serviceName text
+ turnOff boolean [not null, default: false]
+ cronExpression text [not null]
+ keepLatestCount integer
+ enabled boolean
+ applicationId text
+ postgresId text
+ mariadbId text
+ mongoId text
+ mysqlId text
+ redisId text
+ composeId text
+ createdAt text [not null]
+ destinationId text [not null]
+}
+
+ref: mount.applicationId > application.applicationId
+
+ref: mount.postgresId > postgres.postgresId
+
+ref: mount.mariadbId > mariadb.mariadbId
+
+ref: mount.mongoId > mongo.mongoId
+
+ref: mount.mysqlId > mysql.mysqlId
+
+ref: mount.redisId > redis.redisId
+
+ref: mount.composeId > compose.composeId
+
+ref: user_temp.id - account.user_id
+
+ref: ai.organizationId - organization.id
+
+ref: apikey.user_id > user_temp.id
+
+ref: application.environmentId > environment.environmentId
+
+ref: application.customGitSSHKeyId > "ssh-key".sshKeyId
+
+ref: application.registryId > registry.registryId
+
+ref: application.githubId - github.githubId
+
+ref: application.gitlabId - gitlab.gitlabId
+
+ref: application.giteaId - gitea.giteaId
+
+ref: application.bitbucketId - bitbucket.bitbucketId
+
+ref: application.serverId > server.serverId
+
+ref: backup.destinationId > destination.destinationId
+
+ref: backup.postgresId > postgres.postgresId
+
+ref: backup.mariadbId > mariadb.mariadbId
+
+ref: backup.mysqlId > mysql.mysqlId
+
+ref: backup.mongoId > mongo.mongoId
+
+ref: backup.userId > user_temp.id
+
+ref: backup.composeId > compose.composeId
+
+ref: git_provider.gitProviderId - bitbucket.gitProviderId
+
+ref: certificate.serverId > server.serverId
+
+ref: certificate.organizationId - organization.id
+
+ref: compose.environmentId > environment.environmentId
+
+ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId
+
+ref: compose.githubId - github.githubId
+
+ref: compose.gitlabId - gitlab.gitlabId
+
+ref: compose.bitbucketId - bitbucket.bitbucketId
+
+ref: compose.giteaId - gitea.giteaId
+
+ref: compose.serverId > server.serverId
+
+ref: deployment.applicationId > application.applicationId
+
+ref: deployment.composeId > compose.composeId
+
+ref: deployment.serverId > server.serverId
+
+ref: deployment.previewDeploymentId > preview_deployments.previewDeploymentId
+
+ref: deployment.scheduleId > schedule.scheduleId
+
+ref: deployment.backupId > backup.backupId
+
+ref: rollback.deploymentId - deployment.deploymentId
+
+ref: deployment.volumeBackupId > volume_backup.volumeBackupId
+
+ref: destination.organizationId - organization.id
+
+ref: domain.applicationId > application.applicationId
+
+ref: domain.composeId > compose.composeId
+
+ref: preview_deployments.domainId - domain.domainId
+
+ref: environment.projectId > project.projectId
+
+ref: github.gitProviderId - git_provider.gitProviderId
+
+ref: gitlab.gitProviderId - git_provider.gitProviderId
+
+ref: gitea.gitProviderId - git_provider.gitProviderId
+
+ref: git_provider.organizationId - organization.id
+
+ref: git_provider.userId - user_temp.id
+
+ref: invitation.organization_id - organization.id
+
+ref: mariadb.environmentId > environment.environmentId
+
+ref: mariadb.serverId > server.serverId
+
+ref: member.organization_id > organization.id
+
+ref: member.user_id - user_temp.id
+
+ref: mongo.environmentId > environment.environmentId
+
+ref: mongo.serverId > server.serverId
+
+ref: mysql.environmentId > environment.environmentId
+
+ref: mysql.serverId > server.serverId
+
+ref: notification.slackId - slack.slackId
+
+ref: notification.telegramId - telegram.telegramId
+
+ref: notification.discordId - discord.discordId
+
+ref: notification.emailId - email.emailId
+
+ref: notification.gotifyId - gotify.gotifyId
+
+ref: notification.ntfyId - ntfy.ntfyId
+
+ref: notification.customId - custom.customId
+
+ref: notification.larkId - lark.larkId
+
+ref: notification.organizationId - organization.id
+
+ref: organization.owner_id > user_temp.id
+
+ref: port.applicationId > application.applicationId
+
+ref: postgres.environmentId > environment.environmentId
+
+ref: postgres.serverId > server.serverId
+
+ref: preview_deployments.applicationId > application.applicationId
+
+ref: project.organizationId > organization.id
+
+ref: redirect.applicationId > application.applicationId
+
+ref: redis.environmentId > environment.environmentId
+
+ref: redis.serverId > server.serverId
+
+ref: schedule.applicationId - application.applicationId
+
+ref: schedule.composeId > compose.composeId
+
+ref: schedule.serverId > server.serverId
+
+ref: schedule.userId > user_temp.id
+
+ref: security.applicationId > application.applicationId
+
+ref: server.sshKeyId > "ssh-key".sshKeyId
+
+ref: server.organizationId > organization.id
+
+ref: "ssh-key".organizationId - organization.id
+
+ref: volume_backup.applicationId - application.applicationId
+
+ref: volume_backup.postgresId - postgres.postgresId
+
+ref: volume_backup.mariadbId - mariadb.mariadbId
+
+ref: volume_backup.mongoId - mongo.mongoId
+
+ref: volume_backup.mysqlId - mysql.mysqlId
+
+ref: volume_backup.redisId - redis.redisId
+
+ref: volume_backup.composeId - compose.composeId
+
+ref: volume_backup.destinationId - destination.destinationId
\ No newline at end of file