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" && (
+
+ ))} + + + + + + )} {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