From 3c8ca2b01210bab37a1d1140156b7849223fd54d Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Tue, 30 Jul 2024 23:16:52 -0600
Subject: [PATCH 01/28] feat(domains): add domains to each docker compose
service #216
---
.../application/domains/add-domain.tsx | 1 +
.../application/domains/delete-domain.tsx | 19 +-
.../dashboard/compose/domains/add-domain.tsx | 396 +++
.../compose/domains/generate-domain.tsx | 79 +
.../compose/domains/generate-traefikme.tsx | 69 +
.../compose/domains/generate-wildcard.tsx | 69 +
.../compose/domains/show-domains.tsx | 115 +
.../compose/general/generic/show.tsx | 2 +
.../general/show-converted-compose.tsx | 52 +
.../drizzle/0027_ambitious_abomination.sql | 7 +
.../drizzle/0028_wandering_master_chief.sql | 1 +
.../drizzle/0029_rapid_blockbuster.sql | 7 +
apps/dokploy/drizzle/meta/0027_snapshot.json | 3029 ++++++++++++++++
apps/dokploy/drizzle/meta/0028_snapshot.json | 3035 ++++++++++++++++
apps/dokploy/drizzle/meta/0029_snapshot.json | 3051 +++++++++++++++++
apps/dokploy/drizzle/meta/_journal.json | 21 +
.../services/compose/[composeId].tsx | 11 +-
apps/dokploy/server/api/routers/compose.ts | 25 +-
apps/dokploy/server/api/routers/domain.ts | 21 +-
apps/dokploy/server/api/services/compose.ts | 21 +-
apps/dokploy/server/api/services/domain.ts | 18 +-
apps/dokploy/server/db/schema/compose.ts | 8 +-
apps/dokploy/server/db/schema/domain.ts | 39 +-
apps/dokploy/server/db/validations/domain.ts | 50 +
apps/dokploy/server/db/validations/index.ts | 24 -
apps/dokploy/server/utils/docker/domain.ts | 147 +
apps/dokploy/server/utils/providers/git.ts | 58 +
apps/dokploy/server/utils/providers/github.ts | 33 +-
apps/dokploy/server/utils/providers/raw.ts | 12 +
apps/dokploy/templates/utils/index.ts | 2 +-
30 files changed, 10364 insertions(+), 58 deletions(-)
create mode 100644 apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
create mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
create mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
create mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
create mode 100644 apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
create mode 100644 apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
create mode 100644 apps/dokploy/drizzle/0027_ambitious_abomination.sql
create mode 100644 apps/dokploy/drizzle/0028_wandering_master_chief.sql
create mode 100644 apps/dokploy/drizzle/0029_rapid_blockbuster.sql
create mode 100644 apps/dokploy/drizzle/meta/0027_snapshot.json
create mode 100644 apps/dokploy/drizzle/meta/0028_snapshot.json
create mode 100644 apps/dokploy/drizzle/meta/0029_snapshot.json
create mode 100644 apps/dokploy/server/db/validations/domain.ts
create mode 100644 apps/dokploy/server/utils/docker/domain.ts
diff --git a/apps/dokploy/components/dashboard/application/domains/add-domain.tsx b/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
index 71e44f929..752655e4d 100644
--- a/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
+++ b/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
@@ -75,6 +75,7 @@ export const AddDomain = ({
/* Convert null to undefined */
path: data?.path || undefined,
port: data?.port || undefined,
+ serviceName: data?.serviceName || undefined,
});
}
diff --git a/apps/dokploy/components/dashboard/application/domains/delete-domain.tsx b/apps/dokploy/components/dashboard/application/domains/delete-domain.tsx
index 63bd3f305..5933a99a6 100644
--- a/apps/dokploy/components/dashboard/application/domains/delete-domain.tsx
+++ b/apps/dokploy/components/dashboard/application/domains/delete-domain.tsx
@@ -44,12 +44,19 @@ export const DeleteDomain = ({ domainId }: Props) => {
domainId,
})
.then((data) => {
- utils.domain.byApplicationId.invalidate({
- applicationId: data?.applicationId,
- });
- utils.application.readTraefikConfig.invalidate({
- applicationId: data?.applicationId,
- });
+ if (data?.applicationId) {
+ utils.domain.byApplicationId.invalidate({
+ applicationId: data?.applicationId,
+ });
+ utils.application.readTraefikConfig.invalidate({
+ applicationId: data?.applicationId,
+ });
+ } else if (data?.composeId) {
+ utils.domain.byComposeId.invalidate({
+ composeId: data?.composeId,
+ });
+ }
+
toast.success("Domain delete succesfully");
})
.catch(() => {
diff --git a/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx b/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
new file mode 100644
index 000000000..a7faac68c
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
@@ -0,0 +1,396 @@
+import { AlertBlock } from "@/components/shared/alert-block";
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Switch } from "@/components/ui/switch";
+import { api } from "@/utils/api";
+import { useEffect, useState } from "react";
+import { useForm } from "react-hook-form";
+import { toast } from "sonner";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { domainCompose } from "@/server/db/validations/domain";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { DatabaseZap, RefreshCw } from "lucide-react";
+import type z from "zod";
+
+type Domain = z.infer;
+
+type CacheType = "fetch" | "cache";
+
+interface Props {
+ composeId: string;
+ domainId?: string;
+ children: React.ReactNode;
+}
+
+export const AddDomainCompose = ({
+ composeId,
+ domainId = "",
+ children,
+}: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const [cacheType, setCacheType] = useState("cache");
+ const utils = api.useUtils();
+ const { data, refetch } = api.domain.one.useQuery(
+ {
+ domainId,
+ },
+ {
+ enabled: !!domainId,
+ },
+ );
+
+ const {
+ data: services,
+ isFetching: isLoadingServices,
+ error: errorServices,
+ refetch: refetchServices,
+ } = api.compose.loadServices.useQuery(
+ {
+ composeId,
+ type: cacheType,
+ },
+ {
+ retry: false,
+ refetchOnWindowFocus: false,
+ },
+ );
+
+ const { mutateAsync, isError, error, isLoading } = domainId
+ ? api.domain.update.useMutation()
+ : api.domain.create.useMutation();
+
+ const form = useForm({
+ resolver: zodResolver(domainCompose),
+ });
+
+ const https = form.watch("https");
+
+ useEffect(() => {
+ if (data) {
+ form.reset({
+ ...data,
+ /* Convert null to undefined */
+ path: data?.path || undefined,
+ port: data?.port || undefined,
+ serviceName: data?.serviceName || undefined,
+ });
+ }
+
+ if (!domainId) {
+ form.reset({});
+ }
+ }, [form, form.reset, data, isLoading]);
+
+ const dictionary = {
+ success: domainId ? "Domain Updated" : "Domain Created",
+ error: domainId
+ ? "Error to update the domain"
+ : "Error to create the domain",
+ submit: domainId ? "Update" : "Create",
+ dialogDescription: domainId
+ ? "In this section you can edit a domain"
+ : "In this section you can add domains",
+ };
+
+ const onSubmit = async (data: Domain) => {
+ await mutateAsync({
+ domainId,
+ composeId,
+ domainType: "compose",
+ ...data,
+ })
+ .then(async () => {
+ await utils.domain.byComposeId.invalidate({
+ composeId,
+ });
+ toast.success(dictionary.success);
+ if (domainId) {
+ refetch();
+ }
+ setIsOpen(false);
+ })
+ .catch(() => {
+ toast.error(dictionary.error);
+ });
+ };
+ return (
+
+
+ {children}
+
+
+
+ Domain
+ {dictionary.dialogDescription}
+
+ {isError && {error?.message} }
+
+
+
+
+
+ {dictionary.submit}
+
+
+
+
+
+ );
+};
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
new file mode 100644
index 000000000..9ebe8e30c
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
@@ -0,0 +1,79 @@
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import { api } from "@/utils/api";
+import { RefreshCcw } from "lucide-react";
+import Link from "next/link";
+import { GenerateTraefikMe } from "./generate-traefikme";
+import { GenerateWildCard } from "./generate-wildcard";
+
+interface Props {
+ applicationId: string;
+}
+
+export const GenerateDomain = ({ applicationId }: Props) => {
+ return (
+
+
+
+ Generate Domain
+
+
+
+
+
+ Generate Domain
+
+ Generate Domains for your applications
+
+
+
+
+
+
+
+
+ 1. Generate TraefikMe Domain
+
+
+ This option generates a free domain provided by{" "}
+
+ TraefikMe
+
+ . We recommend using this for quick domain testing or if you
+ don't have a domain yet.
+
+
+
+ {/*
+
+
+ 2. Use Wildcard Domain
+
+
+ To use this option, you need to set up an 'A' record in your
+ domain provider. For example, create a record for
+ *.yourdomain.com.
+
+
+ */}
+
+
+
+ {/* */}
+
+
+
+
+ );
+};
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
new file mode 100644
index 000000000..3085b3a88
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
@@ -0,0 +1,69 @@
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogTrigger,
+} from "@/components/ui/alert-dialog";
+import { Button } from "@/components/ui/button";
+import { api } from "@/utils/api";
+import { RefreshCcw } from "lucide-react";
+import React from "react";
+import { toast } from "sonner";
+
+interface Props {
+ applicationId: string;
+}
+export const GenerateTraefikMe = ({ applicationId }: Props) => {
+ const { mutateAsync, isLoading } = api.domain.generateDomain.useMutation();
+ const utils = api.useUtils();
+ return (
+
+
+
+ Generate Domain
+
+
+
+
+
+
+ Are you sure to generate a new domain?
+
+
+ This will generate a new domain and will be used to access to the
+ application
+
+
+
+ Cancel
+ {
+ await mutateAsync({
+ applicationId,
+ })
+ .then((data) => {
+ utils.domain.byApplicationId.invalidate({
+ applicationId: applicationId,
+ });
+ utils.application.readTraefikConfig.invalidate({
+ applicationId: applicationId,
+ });
+ toast.success("Generated Domain succesfully");
+ })
+ .catch(() => {
+ toast.error("Error to generate Domain");
+ });
+ }}
+ >
+ Confirm
+
+
+
+
+ );
+};
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
new file mode 100644
index 000000000..da4445527
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
@@ -0,0 +1,69 @@
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogTrigger,
+} from "@/components/ui/alert-dialog";
+import { Button } from "@/components/ui/button";
+import { api } from "@/utils/api";
+import { SquareAsterisk } from "lucide-react";
+import React from "react";
+import { toast } from "sonner";
+
+interface Props {
+ applicationId: string;
+}
+export const GenerateWildCard = ({ applicationId }: Props) => {
+ const { mutateAsync, isLoading } = api.domain.generateWildcard.useMutation();
+ const utils = api.useUtils();
+ return (
+
+
+
+ Generate Wildcard Domain
+
+
+
+
+
+
+ Are you sure to generate a new wildcard domain?
+
+
+ This will generate a new domain and will be used to access to the
+ application
+
+
+
+ Cancel
+ {
+ await mutateAsync({
+ applicationId,
+ })
+ .then((data) => {
+ utils.domain.byApplicationId.invalidate({
+ applicationId: applicationId,
+ });
+ utils.application.readTraefikConfig.invalidate({
+ applicationId: applicationId,
+ });
+ toast.success("Generated Domain succesfully");
+ })
+ .catch((e) => {
+ toast.error(`Error to generate Domain: ${e.message}`);
+ });
+ }}
+ >
+ Confirm
+
+
+
+
+ );
+};
diff --git a/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx b/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
new file mode 100644
index 000000000..d2c1d3514
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
@@ -0,0 +1,115 @@
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Input } from "@/components/ui/input";
+import { api } from "@/utils/api";
+import { ExternalLink, GlobeIcon, PenBoxIcon } from "lucide-react";
+import Link from "next/link";
+import { DeleteDomain } from "../../application/domains/delete-domain";
+import { AddDomainCompose } from "./add-domain";
+
+interface Props {
+ composeId: string;
+}
+
+export const ShowDomainsCompose = ({ composeId }: Props) => {
+ const { data } = api.domain.byComposeId.useQuery(
+ {
+ composeId,
+ },
+ {
+ enabled: !!composeId,
+ },
+ );
+ return (
+
+
+
+
+ Domains
+
+ Domains are used to access to the application
+
+
+
+
+ {data && data?.length > 0 && (
+
+
+ Add Domain
+
+
+ )}
+ {/* {data && data?.length > 0 && (
+
+ )} */}
+
+
+
+ {data?.length === 0 ? (
+
+
+
+ To access to the application is required to set at least 1
+ domain
+
+
+
+
+ Add Domain
+
+
+
+ {/*
*/}
+
+
+ ) : (
+
+ {data?.map((item) => {
+ return (
+
+
+
+
+
+ {item.serviceName}
+
+
+
+ {item.path}
+
+
+ {item.port}
+
+
+ {item.https ? "HTTPS" : "HTTP"}
+
+
+
+ );
+ })}
+
+ )}
+
+
+
+ );
+};
diff --git a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
index 2db4248d5..7ce754343 100644
--- a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
@@ -5,6 +5,7 @@ import { GitBranch, LockIcon } from "lucide-react";
import Link from "next/link";
import { useState } from "react";
import { ComposeFileEditor } from "../compose-file-editor";
+import { ShowConvertedCompose } from "../show-converted-compose";
import { SaveGitProviderCompose } from "./save-git-provider-compose";
import { SaveGithubProviderCompose } from "./save-github-provider-compose";
@@ -32,6 +33,7 @@ export const ShowProviderFormCompose = ({ composeId }: Props) => {
+
diff --git a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
new file mode 100644
index 000000000..d57ab9d73
--- /dev/null
+++ b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
@@ -0,0 +1,52 @@
+import { AlertBlock } from "@/components/shared/alert-block";
+import { CodeEditor } from "@/components/shared/code-editor";
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import { api } from "@/utils/api";
+import { Puzzle } from "lucide-react";
+import { useState } from "react";
+
+interface Props {
+ composeId: string;
+}
+
+export const ShowConvertedCompose = ({ composeId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const {
+ data: compose,
+ isLoading,
+ error,
+ isError,
+ } = api.compose.getConvertedCompose.useQuery({ composeId });
+
+ return (
+
+
+
+
+ View Converted Compose
+
+
+
+
+ Converted Compose
+
+ See how the docker compose file will look like after adding the
+ domains
+
+
+ {isError && {error?.message} }
+
+
+
+
+
+ );
+};
diff --git a/apps/dokploy/drizzle/0027_ambitious_abomination.sql b/apps/dokploy/drizzle/0027_ambitious_abomination.sql
new file mode 100644
index 000000000..9812737b7
--- /dev/null
+++ b/apps/dokploy/drizzle/0027_ambitious_abomination.sql
@@ -0,0 +1,7 @@
+ALTER TABLE "domain" ALTER COLUMN "applicationId" DROP NOT NULL;--> statement-breakpoint
+ALTER TABLE "domain" ADD COLUMN "composeId" text;--> statement-breakpoint
+DO $$ BEGIN
+ ALTER TABLE "domain" ADD CONSTRAINT "domain_composeId_compose_composeId_fk" FOREIGN KEY ("composeId") REFERENCES "public"."compose"("composeId") ON DELETE cascade ON UPDATE no action;
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
diff --git a/apps/dokploy/drizzle/0028_wandering_master_chief.sql b/apps/dokploy/drizzle/0028_wandering_master_chief.sql
new file mode 100644
index 000000000..c7ead651c
--- /dev/null
+++ b/apps/dokploy/drizzle/0028_wandering_master_chief.sql
@@ -0,0 +1 @@
+ALTER TABLE "domain" ADD COLUMN "serviceName" text;
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/0029_rapid_blockbuster.sql b/apps/dokploy/drizzle/0029_rapid_blockbuster.sql
new file mode 100644
index 000000000..1d86c55a0
--- /dev/null
+++ b/apps/dokploy/drizzle/0029_rapid_blockbuster.sql
@@ -0,0 +1,7 @@
+DO $$ BEGIN
+ CREATE TYPE "public"."domainType" AS ENUM('compose', 'application');
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
+--> statement-breakpoint
+ALTER TABLE "domain" ADD COLUMN "domainType" "domainType" DEFAULT 'application';
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0027_snapshot.json b/apps/dokploy/drizzle/meta/0027_snapshot.json
new file mode 100644
index 000000000..508710e5f
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0027_snapshot.json
@@ -0,0 +1,3029 @@
+{
+ "id": "360d381f-c3c6-4a0c-8730-357a0257110e",
+ "prevId": "3dff4fa9-1d03-4748-b3ee-908c34324171",
+ "version": "6",
+ "dialect": "postgresql",
+ "tables": {
+ "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
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "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": "'/'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "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
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "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
+ },
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "application_projectId_project_projectId_fk",
+ "tableFrom": "application",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_projectId_project_projectId_fk": {
+ "name": "postgres_projectId_project_projectId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "timestamp(3)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "canCreateProjects": {
+ "name": "canCreateProjects",
+ "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
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_adminId_admin_adminId_fk": {
+ "name": "user_adminId_admin_adminId_fk",
+ "tableFrom": "user",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_authId_auth_id_fk": {
+ "name": "user_authId_auth_id_fk",
+ "tableFrom": "user",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.admin": {
+ "name": "admin",
+ "schema": "",
+ "columns": {
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "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
+ },
+ "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": false
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "admin_authId_auth_id_fk": {
+ "name": "admin_authId_auth_id_fk",
+ "tableFrom": "admin",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.auth": {
+ "name": "auth",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rol": {
+ "name": "rol",
+ "type": "Roles",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "auth_email_unique": {
+ "name": "auth_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_adminId_admin_adminId_fk": {
+ "name": "project_adminId_admin_adminId_fk",
+ "tableFrom": "project",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": 80
+ },
+ "path": {
+ "name": "path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_projectId_project_projectId_fk": {
+ "name": "mariadb_projectId_project_projectId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_projectId_project_projectId_fk": {
+ "name": "mongo_projectId_project_projectId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_projectId_project_projectId_fk": {
+ "name": "mysql_projectId_project_projectId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "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
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "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_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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_adminId_admin_adminId_fk": {
+ "name": "destination_adminId_admin_adminId_fk",
+ "tableFrom": "destination",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ }
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_user_id_auth_id_fk": {
+ "name": "session_user_id_auth_id_fk",
+ "tableFrom": "session",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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"
+ ]
+ }
+ }
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_projectId_project_projectId_fk": {
+ "name": "redis_projectId_project_projectId_fk",
+ "tableFrom": "redis",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "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": "''"
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "compose_projectId_project_projectId_fk",
+ "tableFrom": "compose",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_adminId_admin_adminId_fk": {
+ "name": "registry_adminId_admin_adminId_fk",
+ "tableFrom": "registry",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "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
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "drop"
+ ]
+ },
+ "public.Roles": {
+ "name": "Roles",
+ "schema": "public",
+ "values": [
+ "admin",
+ "user"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "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.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "raw"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email"
+ ]
+ }
+ },
+ "schemas": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0028_snapshot.json b/apps/dokploy/drizzle/meta/0028_snapshot.json
new file mode 100644
index 000000000..aa8caa659
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0028_snapshot.json
@@ -0,0 +1,3035 @@
+{
+ "id": "fb42dab1-49b3-4f25-860e-19571959c43e",
+ "prevId": "360d381f-c3c6-4a0c-8730-357a0257110e",
+ "version": "6",
+ "dialect": "postgresql",
+ "tables": {
+ "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
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "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": "'/'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "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
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "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
+ },
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "application_projectId_project_projectId_fk",
+ "tableFrom": "application",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_projectId_project_projectId_fk": {
+ "name": "postgres_projectId_project_projectId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "timestamp(3)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "canCreateProjects": {
+ "name": "canCreateProjects",
+ "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
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_adminId_admin_adminId_fk": {
+ "name": "user_adminId_admin_adminId_fk",
+ "tableFrom": "user",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_authId_auth_id_fk": {
+ "name": "user_authId_auth_id_fk",
+ "tableFrom": "user",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.admin": {
+ "name": "admin",
+ "schema": "",
+ "columns": {
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "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
+ },
+ "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": false
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "admin_authId_auth_id_fk": {
+ "name": "admin_authId_auth_id_fk",
+ "tableFrom": "admin",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.auth": {
+ "name": "auth",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rol": {
+ "name": "rol",
+ "type": "Roles",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "auth_email_unique": {
+ "name": "auth_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_adminId_admin_adminId_fk": {
+ "name": "project_adminId_admin_adminId_fk",
+ "tableFrom": "project",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": 80
+ },
+ "path": {
+ "name": "path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'/'"
+ },
+ "serviceName": {
+ "name": "serviceName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_projectId_project_projectId_fk": {
+ "name": "mariadb_projectId_project_projectId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_projectId_project_projectId_fk": {
+ "name": "mongo_projectId_project_projectId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_projectId_project_projectId_fk": {
+ "name": "mysql_projectId_project_projectId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "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
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "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_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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_adminId_admin_adminId_fk": {
+ "name": "destination_adminId_admin_adminId_fk",
+ "tableFrom": "destination",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ }
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_user_id_auth_id_fk": {
+ "name": "session_user_id_auth_id_fk",
+ "tableFrom": "session",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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"
+ ]
+ }
+ }
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_projectId_project_projectId_fk": {
+ "name": "redis_projectId_project_projectId_fk",
+ "tableFrom": "redis",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "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": "''"
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "compose_projectId_project_projectId_fk",
+ "tableFrom": "compose",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_adminId_admin_adminId_fk": {
+ "name": "registry_adminId_admin_adminId_fk",
+ "tableFrom": "registry",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "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
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "drop"
+ ]
+ },
+ "public.Roles": {
+ "name": "Roles",
+ "schema": "public",
+ "values": [
+ "admin",
+ "user"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "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.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "raw"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email"
+ ]
+ }
+ },
+ "schemas": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0029_snapshot.json b/apps/dokploy/drizzle/meta/0029_snapshot.json
new file mode 100644
index 000000000..48dd6abe7
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0029_snapshot.json
@@ -0,0 +1,3051 @@
+{
+ "id": "86f1da74-ea3f-43d1-806d-4b6636dd15f0",
+ "prevId": "fb42dab1-49b3-4f25-860e-19571959c43e",
+ "version": "6",
+ "dialect": "postgresql",
+ "tables": {
+ "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
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "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": "'/'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "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
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "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
+ },
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "application_projectId_project_projectId_fk",
+ "tableFrom": "application",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_projectId_project_projectId_fk": {
+ "name": "postgres_projectId_project_projectId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "timestamp(3)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "canCreateProjects": {
+ "name": "canCreateProjects",
+ "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
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_adminId_admin_adminId_fk": {
+ "name": "user_adminId_admin_adminId_fk",
+ "tableFrom": "user",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_authId_auth_id_fk": {
+ "name": "user_authId_auth_id_fk",
+ "tableFrom": "user",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.admin": {
+ "name": "admin",
+ "schema": "",
+ "columns": {
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "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
+ },
+ "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": false
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "admin_authId_auth_id_fk": {
+ "name": "admin_authId_auth_id_fk",
+ "tableFrom": "admin",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.auth": {
+ "name": "auth",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rol": {
+ "name": "rol",
+ "type": "Roles",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "auth_email_unique": {
+ "name": "auth_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_adminId_admin_adminId_fk": {
+ "name": "project_adminId_admin_adminId_fk",
+ "tableFrom": "project",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": 80
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_projectId_project_projectId_fk": {
+ "name": "mariadb_projectId_project_projectId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_projectId_project_projectId_fk": {
+ "name": "mongo_projectId_project_projectId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_projectId_project_projectId_fk": {
+ "name": "mysql_projectId_project_projectId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "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
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "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_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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_adminId_admin_adminId_fk": {
+ "name": "destination_adminId_admin_adminId_fk",
+ "tableFrom": "destination",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ }
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_user_id_auth_id_fk": {
+ "name": "session_user_id_auth_id_fk",
+ "tableFrom": "session",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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"
+ ]
+ }
+ }
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_projectId_project_projectId_fk": {
+ "name": "redis_projectId_project_projectId_fk",
+ "tableFrom": "redis",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "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": "''"
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "compose_projectId_project_projectId_fk",
+ "tableFrom": "compose",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_adminId_admin_adminId_fk": {
+ "name": "registry_adminId_admin_adminId_fk",
+ "tableFrom": "registry",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "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
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "drop"
+ ]
+ },
+ "public.Roles": {
+ "name": "Roles",
+ "schema": "public",
+ "values": [
+ "admin",
+ "user"
+ ]
+ },
+ "public.domainType": {
+ "name": "domainType",
+ "schema": "public",
+ "values": [
+ "compose",
+ "application"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "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.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "raw"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email"
+ ]
+ }
+ },
+ "schemas": {},
+ "_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 8ffba8d93..0219745ba 100644
--- a/apps/dokploy/drizzle/meta/_journal.json
+++ b/apps/dokploy/drizzle/meta/_journal.json
@@ -190,6 +190,27 @@
"when": 1721979220929,
"tag": "0026_known_dormammu",
"breakpoints": true
+ },
+ {
+ "idx": 27,
+ "version": "6",
+ "when": 1722362624160,
+ "tag": "0027_ambitious_abomination",
+ "breakpoints": true
+ },
+ {
+ "idx": 28,
+ "version": "6",
+ "when": 1722371073553,
+ "tag": "0028_wandering_master_chief",
+ "breakpoints": true
+ },
+ {
+ "idx": 29,
+ "version": "6",
+ "when": 1722399047750,
+ "tag": "0029_rapid_blockbuster",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx
index 22ef75058..225517e56 100644
--- a/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx
+++ b/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx
@@ -2,6 +2,7 @@ import { AddCommandCompose } from "@/components/dashboard/compose/advanced/add-c
import { ShowVolumesCompose } from "@/components/dashboard/compose/advanced/show-volumes";
import { DeleteCompose } from "@/components/dashboard/compose/delete-compose";
import { ShowDeploymentsCompose } from "@/components/dashboard/compose/deployments/show-deployments-compose";
+import { ShowDomainsCompose } from "@/components/dashboard/compose/domains/show-domains";
import { ShowEnvironmentCompose } from "@/components/dashboard/compose/enviroment/show";
import { ShowGeneralCompose } from "@/components/dashboard/compose/general/show";
import { ShowDockerLogsCompose } from "@/components/dashboard/compose/logs/show";
@@ -34,6 +35,7 @@ type TabState =
| "settings"
| "advanced"
| "deployments"
+ | "domains"
| "monitoring";
const Service = (
@@ -117,12 +119,13 @@ const Service = (
}}
>
-
+
General
Environment
Monitoring
Logs
Deployments
+ Domains
Advanced
@@ -168,6 +171,12 @@ const Service = (
+
+
+
+
+
+
diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts
index f97fac371..1c0a9e611 100644
--- a/apps/dokploy/server/api/routers/compose.ts
+++ b/apps/dokploy/server/api/routers/compose.ts
@@ -3,6 +3,7 @@ import { db } from "@/server/db";
import {
apiCreateCompose,
apiCreateComposeByTemplate,
+ apiFetchServices,
apiFindCompose,
apiRandomizeCompose,
apiUpdateCompose,
@@ -15,16 +16,18 @@ import {
import { myQueue } from "@/server/queues/queueSetup";
import { createCommand } from "@/server/utils/builders/compose";
import { randomizeComposeFile } from "@/server/utils/docker/compose";
+import { addDomainToCompose } from "@/server/utils/docker/domain";
import { removeComposeDirectory } from "@/server/utils/filesystem/directory";
import { templates } from "@/templates/templates";
import type { TemplatesKeys } from "@/templates/types/templates-data.type";
import {
generatePassword,
loadTemplateModule,
- readComposeFile,
+ readTemplateComposeFile,
} from "@/templates/utils";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
+import { dump } from "js-yaml";
import _ from "lodash";
import { nanoid } from "nanoid";
import { findAdmin } from "../services/admin";
@@ -38,6 +41,7 @@ import {
updateCompose,
} from "../services/compose";
import { removeDeploymentsByComposeId } from "../services/deployment";
+import { findDomainsByComposeId } from "../services/domain";
import { createMount } from "../services/mount";
import { findProjectById } from "../services/project";
import { addNewService, checkServiceAccess } from "../services/user";
@@ -113,10 +117,10 @@ export const composeRouter = createTRPCRouter({
await cleanQueuesByCompose(input.composeId);
}),
- allServices: protectedProcedure
- .input(apiFindCompose)
+ loadServices: protectedProcedure
+ .input(apiFetchServices)
.query(async ({ input }) => {
- return await loadServices(input.composeId);
+ return await loadServices(input.composeId, input.type);
}),
randomizeCompose: protectedProcedure
@@ -124,6 +128,17 @@ export const composeRouter = createTRPCRouter({
.mutation(async ({ input }) => {
return await randomizeComposeFile(input.composeId, input.prefix);
}),
+ getConvertedCompose: protectedProcedure
+ .input(apiFindCompose)
+ .query(async ({ input }) => {
+ const compose = await findComposeById(input.composeId);
+ const domains = await findDomainsByComposeId(input.composeId);
+
+ const composeFile = await addDomainToCompose(compose, domains);
+ return dump(composeFile, {
+ lineWidth: 1000,
+ });
+ }),
deploy: protectedProcedure
.input(apiFindCompose)
@@ -189,7 +204,7 @@ export const composeRouter = createTRPCRouter({
if (ctx.user.rol === "user") {
await checkServiceAccess(ctx.user.authId, input.projectId, "create");
}
- const composeFile = await readComposeFile(input.id);
+ const composeFile = await readTemplateComposeFile(input.id);
const generate = await loadTemplateModule(input.id as TemplatesKeys);
diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts
index ec7f13d4f..703cfec98 100644
--- a/apps/dokploy/server/api/routers/domain.ts
+++ b/apps/dokploy/server/api/routers/domain.ts
@@ -1,8 +1,11 @@
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
import {
apiCreateDomain,
+ apiFindCompose,
apiFindDomain,
apiFindDomainByApplication,
+ apiFindDomainByCompose,
+ apiFindOneApplication,
apiUpdateDomain,
} from "@/server/db/schema";
import { manageDomain, removeDomain } from "@/server/utils/traefik/domain";
@@ -12,6 +15,7 @@ import {
createDomain,
findDomainById,
findDomainsByApplicationId,
+ findDomainsByComposeId,
generateDomain,
generateWildcard,
removeDomainById,
@@ -33,10 +37,15 @@ export const domainRouter = createTRPCRouter({
}
}),
byApplicationId: protectedProcedure
- .input(apiFindDomainByApplication)
+ .input(apiFindOneApplication)
.query(async ({ input }) => {
return await findDomainsByApplicationId(input.applicationId);
}),
+ byComposeId: protectedProcedure
+ .input(apiFindCompose)
+ .query(async ({ input }) => {
+ return await findDomainsByComposeId(input.composeId);
+ }),
generateDomain: protectedProcedure
.input(apiFindDomainByApplication)
.mutation(async ({ input }) => {
@@ -52,8 +61,10 @@ export const domainRouter = createTRPCRouter({
.mutation(async ({ input }) => {
const result = await updateDomainById(input.domainId, input);
const domain = await findDomainById(input.domainId);
- const application = await findApplicationById(domain.applicationId);
- await manageDomain(application, domain);
+ if (domain.applicationId) {
+ const application = await findApplicationById(domain.applicationId);
+ await manageDomain(application, domain);
+ }
return result;
}),
one: protectedProcedure.input(apiFindDomain).query(async ({ input }) => {
@@ -64,7 +75,9 @@ export const domainRouter = createTRPCRouter({
.mutation(async ({ input }) => {
const domain = await findDomainById(input.domainId);
const result = await removeDomainById(input.domainId);
- await removeDomain(domain.application.appName, domain.uniqueConfigKey);
+ if (domain.application) {
+ await removeDomain(domain.application.appName, domain.uniqueConfigKey);
+ }
return result;
}),
diff --git a/apps/dokploy/server/api/services/compose.ts b/apps/dokploy/server/api/services/compose.ts
index 978c8fb71..b212a7e74 100644
--- a/apps/dokploy/server/api/services/compose.ts
+++ b/apps/dokploy/server/api/services/compose.ts
@@ -4,6 +4,7 @@ import { db } from "@/server/db";
import { type apiCreateCompose, compose } from "@/server/db/schema";
import { generateAppName } from "@/server/db/schema/utils";
import { buildCompose } from "@/server/utils/builders/compose";
+import { cloneCompose, loadDockerCompose } from "@/server/utils/docker/domain";
import type { ComposeSpecification } from "@/server/utils/docker/types";
import { sendBuildErrorNotifications } from "@/server/utils/notifications/build-error";
import { sendBuildSuccessNotifications } from "@/server/utils/notifications/build-success";
@@ -14,7 +15,6 @@ import { createComposeFile } from "@/server/utils/providers/raw";
import { generatePassword } from "@/templates/utils";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
-import { load } from "js-yaml";
import { findAdmin, getDokployUrl } from "./admin";
import { createDeploymentCompose, updateDeploymentStatus } from "./deployment";
import { validUniqueServerAppName } from "./project";
@@ -102,20 +102,27 @@ export const findComposeById = async (composeId: string) => {
return result;
};
-export const loadServices = async (composeId: string) => {
+export const loadServices = async (
+ composeId: string,
+ type: "fetch" | "cache" = "fetch",
+) => {
const compose = await findComposeById(composeId);
- // use js-yaml to parse the docker compose file and then extact the services
- const composeFile = compose.composeFile;
- const composeData = load(composeFile) as ComposeSpecification;
+ if (type === "fetch") {
+ await cloneCompose(compose);
+ }
+ const composeData = await loadDockerCompose(compose);
if (!composeData?.services) {
- return ["All Services"];
+ throw new TRPCError({
+ code: "NOT_FOUND",
+ message: "Services not found",
+ });
}
const services = Object.keys(composeData.services);
- return [...services, "All Services"];
+ return [...services];
};
export const updateCompose = async (
diff --git a/apps/dokploy/server/api/services/domain.ts b/apps/dokploy/server/api/services/domain.ts
index b11c0d2ae..e2bdf04b0 100644
--- a/apps/dokploy/server/api/services/domain.ts
+++ b/apps/dokploy/server/api/services/domain.ts
@@ -15,8 +15,6 @@ export type Domain = typeof domains.$inferSelect;
export const createDomain = async (input: typeof apiCreateDomain._type) => {
await db.transaction(async (tx) => {
- const application = await findApplicationById(input.applicationId);
-
const domain = await tx
.insert(domains)
.values({
@@ -32,7 +30,10 @@ export const createDomain = async (input: typeof apiCreateDomain._type) => {
});
}
- await manageDomain(application, domain);
+ if (domain.applicationId) {
+ const application = await findApplicationById(domain.applicationId);
+ await manageDomain(application, domain);
+ }
});
};
@@ -114,6 +115,17 @@ export const findDomainsByApplicationId = async (applicationId: string) => {
return domainsArray;
};
+export const findDomainsByComposeId = async (composeId: string) => {
+ const domainsArray = await db.query.domains.findMany({
+ where: eq(domains.composeId, composeId),
+ with: {
+ compose: true,
+ },
+ });
+
+ return domainsArray;
+};
+
export const updateDomainById = async (
domainId: string,
domainData: Partial
,
diff --git a/apps/dokploy/server/db/schema/compose.ts b/apps/dokploy/server/db/schema/compose.ts
index 485c51e10..80597d76f 100644
--- a/apps/dokploy/server/db/schema/compose.ts
+++ b/apps/dokploy/server/db/schema/compose.ts
@@ -1,11 +1,11 @@
import { sshKeys } from "@/server/db/schema/ssh-key";
-import { generatePassword } from "@/templates/utils";
import { relations } from "drizzle-orm";
import { boolean, pgEnum, pgTable, text } from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { z } from "zod";
import { deployments } from "./deployment";
+import { domains } from "./domain";
import { mounts } from "./mount";
import { projects } from "./project";
import { applicationStatus } from "./shared";
@@ -72,6 +72,7 @@ export const composeRelations = relations(compose, ({ one, many }) => ({
fields: [compose.customGitSSHKeyId],
references: [sshKeys.sshKeyId],
}),
+ domains: many(domains),
}));
const createSchema = createInsertSchema(compose, {
@@ -106,6 +107,11 @@ export const apiFindCompose = z.object({
composeId: z.string().min(1),
});
+export const apiFetchServices = z.object({
+ composeId: z.string().min(1),
+ type: z.enum(["fetch", "cache"]).optional().default("cache"),
+});
+
export const apiUpdateCompose = createSchema.partial().extend({
composeId: z.string(),
composeFile: z.string().optional(),
diff --git a/apps/dokploy/server/db/schema/domain.ts b/apps/dokploy/server/db/schema/domain.ts
index 48dc05a77..d89621ff9 100644
--- a/apps/dokploy/server/db/schema/domain.ts
+++ b/apps/dokploy/server/db/schema/domain.ts
@@ -1,11 +1,21 @@
-import { domain } from "@/server/db/validations";
+import { domain } from "@/server/db/validations/domain";
import { relations } from "drizzle-orm";
-import { boolean, integer, pgTable, serial, text } from "drizzle-orm/pg-core";
+import {
+ boolean,
+ integer,
+ pgEnum,
+ pgTable,
+ serial,
+ text,
+} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
import { applications } from "./application";
+import { compose } from "./compose";
import { certificateType } from "./shared";
+export const domainType = pgEnum("domainType", ["compose", "application"]);
+
export const domains = pgTable("domain", {
domainId: text("domainId")
.notNull()
@@ -15,13 +25,19 @@ export const domains = pgTable("domain", {
https: boolean("https").notNull().default(false),
port: integer("port").default(80),
path: text("path").default("/"),
+ serviceName: text("serviceName"),
+ domainType: domainType("domainType").default("application"),
uniqueConfigKey: serial("uniqueConfigKey"),
createdAt: text("createdAt")
.notNull()
.$defaultFn(() => new Date().toISOString()),
- applicationId: text("applicationId")
- .notNull()
- .references(() => applications.applicationId, { onDelete: "cascade" }),
+ composeId: text("composeId").references(() => compose.composeId, {
+ onDelete: "cascade",
+ }),
+ applicationId: text("applicationId").references(
+ () => applications.applicationId,
+ { onDelete: "cascade" },
+ ),
certificateType: certificateType("certificateType").notNull().default("none"),
});
@@ -30,6 +46,10 @@ export const domainsRelations = relations(domains, ({ one }) => ({
fields: [domains.applicationId],
references: [applications.applicationId],
}),
+ compose: one(compose, {
+ fields: [domains.composeId],
+ references: [compose.composeId],
+ }),
}));
const createSchema = createInsertSchema(domains, domain._def.schema.shape);
@@ -41,6 +61,9 @@ export const apiCreateDomain = createSchema.pick({
https: true,
applicationId: true,
certificateType: true,
+ composeId: true,
+ serviceName: true,
+ domainType: true,
});
export const apiFindDomain = createSchema
@@ -53,6 +76,10 @@ export const apiFindDomainByApplication = createSchema.pick({
applicationId: true,
});
+export const apiFindDomainByCompose = createSchema.pick({
+ composeId: true,
+});
+
export const apiUpdateDomain = createSchema
.pick({
host: true,
@@ -60,5 +87,7 @@ export const apiUpdateDomain = createSchema
port: true,
https: true,
certificateType: true,
+ serviceName: true,
+ domainType: true,
})
.merge(createSchema.pick({ domainId: true }).required());
diff --git a/apps/dokploy/server/db/validations/domain.ts b/apps/dokploy/server/db/validations/domain.ts
new file mode 100644
index 000000000..6aa0fd165
--- /dev/null
+++ b/apps/dokploy/server/db/validations/domain.ts
@@ -0,0 +1,50 @@
+import { z } from "zod";
+
+export const domain = z
+ .object({
+ host: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9\.-]*\.[a-zA-Z]{2,}$/, {
+ message: "Invalid hostname",
+ }),
+ path: z.string().min(1).optional(),
+ port: z
+ .number()
+ .min(1, { message: "Port must be at least 1" })
+ .max(65535, { message: "Port must be 65535 or below" })
+ .optional(),
+ https: z.boolean().optional(),
+ certificateType: z.enum(["letsencrypt", "none"]).optional(),
+ })
+ .superRefine((input, ctx) => {
+ if (input.https && !input.certificateType) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ["certificateType"],
+ message: "Required",
+ });
+ }
+ });
+
+export const domainCompose = z
+ .object({
+ host: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9\.-]*\.[a-zA-Z]{2,}$/, {
+ message: "Invalid hostname",
+ }),
+ path: z.string().min(1).optional(),
+ port: z
+ .number()
+ .min(1, { message: "Port must be at least 1" })
+ .max(65535, { message: "Port must be 65535 or below" })
+ .optional(),
+ https: z.boolean().optional(),
+ certificateType: z.enum(["letsencrypt", "none"]).optional(),
+ serviceName: z.string().min(1, { message: "Service name is required" }),
+ })
+ .superRefine((input, ctx) => {
+ if (input.https && !input.certificateType) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ["certificateType"],
+ message: "Required",
+ });
+ }
+ });
diff --git a/apps/dokploy/server/db/validations/index.ts b/apps/dokploy/server/db/validations/index.ts
index cc97ee933..b3cb57852 100644
--- a/apps/dokploy/server/db/validations/index.ts
+++ b/apps/dokploy/server/db/validations/index.ts
@@ -35,27 +35,3 @@ export const sshKeyUpdate = sshKeyCreate.pick({
export const sshKeyType = z.object({
type: z.enum(["rsa", "ed25519"]).optional(),
});
-
-export const domain = z
- .object({
- host: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9\.-]*\.[a-zA-Z]{2,}$/, {
- message: "Invalid hostname",
- }),
- path: z.string().min(1).optional(),
- port: z
- .number()
- .min(1, { message: "Port must be at least 1" })
- .max(65535, { message: "Port must be 65535 or below" })
- .optional(),
- https: z.boolean().optional(),
- certificateType: z.enum(["letsencrypt", "none"]).optional(),
- })
- .superRefine((input, ctx) => {
- if (input.https && !input.certificateType) {
- ctx.addIssue({
- code: z.ZodIssueCode.custom,
- path: ["certificateType"],
- message: "Required",
- });
- }
- });
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
new file mode 100644
index 000000000..f47340ea0
--- /dev/null
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -0,0 +1,147 @@
+import fs, { existsSync, readFileSync } from "node:fs";
+import { join } from "node:path";
+import type { Compose } from "@/server/api/services/compose";
+import type { Domain } from "@/server/api/services/domain";
+import { COMPOSE_PATH } from "@/server/constants";
+import { dump, load } from "js-yaml";
+import { cloneGitRawRepository } from "../providers/git";
+import { cloneRawGithubRepository } from "../providers/github";
+import { createComposeFileRaw } from "../providers/raw";
+import type { ComposeSpecification } from "./types";
+export const cloneCompose = async (compose: Compose) => {
+ if (compose.sourceType === "github") {
+ await cloneRawGithubRepository(compose);
+ } else if (compose.sourceType === "git") {
+ await cloneGitRawRepository(compose);
+ } else if (compose.sourceType === "raw") {
+ await createComposeFileRaw(compose);
+ }
+};
+
+export const getComposePath = (compose: Compose) => {
+ const { appName, sourceType, composePath } = compose;
+ let path = "";
+
+ if (sourceType === "raw") {
+ path = "docker-compose.yml";
+ } else {
+ path = composePath;
+ }
+
+ return join(COMPOSE_PATH, appName, "code", path);
+};
+
+export const loadDockerCompose = async (
+ compose: Compose,
+): Promise => {
+ const path = getComposePath(compose);
+
+ if (existsSync(path)) {
+ const yamlStr = readFileSync(path, "utf8");
+ const parsedConfig = load(yamlStr) as ComposeSpecification;
+ return parsedConfig;
+ }
+ return null;
+};
+
+export const readComposeFile = async (compose: Compose) => {
+ const path = getComposePath(compose);
+ if (existsSync(path)) {
+ const yamlStr = readFileSync(path, "utf8");
+ return yamlStr;
+ }
+ return null;
+};
+
+export const addDomainToCompose = async (
+ compose: Compose,
+ domains: Domain[],
+) => {
+ const { appName } = compose;
+ const result = await loadDockerCompose(compose);
+
+ if (!result) {
+ throw new Error("Error to load docker compose");
+ }
+
+ for (const domain of domains) {
+ const { serviceName, https } = domain;
+ if (!serviceName) {
+ throw new Error("Service name not found");
+ }
+
+ if (!result?.services?.[serviceName]) {
+ throw new Error("Service not found");
+ }
+ if (!result.services[serviceName].labels) {
+ result.services[serviceName].labels = [];
+ }
+
+ const httpLabels = await createDomainLabels(appName, domain, "web");
+ if (https) {
+ const httpsLabels = await createDomainLabels(
+ appName,
+ domain,
+ "websecure",
+ );
+ httpLabels.push(...httpsLabels);
+ }
+
+ if (Array.isArray(result.services[serviceName].labels)) {
+ result.services[serviceName].labels.push(
+ "traefik.enable=true",
+ ...httpLabels,
+ );
+ }
+ }
+
+ return result;
+};
+
+export const writeComposeFile = async (
+ compose: Compose,
+ composeSpec: ComposeSpecification,
+) => {
+ const path = getComposePath(compose);
+
+ try {
+ const composeFile = dump(composeSpec, {
+ lineWidth: 1000,
+ });
+ fs.writeFileSync(path, composeFile, "utf8");
+ } catch (e) {
+ console.error("Error saving the YAML config file:", e);
+ }
+};
+
+export const createDomainLabels = async (
+ appName: string,
+ domain: Domain,
+ entrypoint: "web" | "websecure",
+) => {
+ const { host, port, https, uniqueConfigKey, certificateType } = domain;
+
+ const labels = [
+ `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.ruleHost(\`${host}\`)`,
+ `traefik.http.services.${appName}-${uniqueConfigKey}-${entrypoint}.loadbalancer.server.port=${port}`,
+ `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.entrypoints=${entrypoint}`,
+ ];
+
+ if (entrypoint === "web" && https) {
+ labels.push(
+ "traefik.http.routers.redirect-to-https.middlewares=redirect-to-https",
+ );
+ }
+
+ if (entrypoint === "websecure") {
+ if (certificateType === "letsencrypt") {
+ labels.push(
+ "traefik.http.routers.letsencrypt.tls.certresolver=letsencrypt",
+ );
+ } else if (certificateType === "none") {
+ labels.push("traefik.http.routers.letsencrypt.tls=null");
+ }
+ }
+
+ return labels;
+};
diff --git a/apps/dokploy/server/utils/providers/git.ts b/apps/dokploy/server/utils/providers/git.ts
index b6f23705f..0a83730cc 100644
--- a/apps/dokploy/server/utils/providers/git.ts
+++ b/apps/dokploy/server/utils/providers/git.ts
@@ -131,3 +131,61 @@ const sanitizeRepoPathSSH = (input: string) => {
},
};
};
+
+export const cloneGitRawRepository = async (entity: {
+ appName: string;
+ customGitUrl?: string | null;
+ customGitBranch?: string | null;
+ customGitSSHKeyId?: string | null;
+}) => {
+ const { appName, customGitUrl, customGitBranch, customGitSSHKeyId } = entity;
+
+ if (!customGitUrl || !customGitBranch) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error: Repository not found",
+ });
+ }
+
+ const keyPath = path.join(SSH_PATH, `${customGitSSHKeyId}_rsa`);
+ const basePath = COMPOSE_PATH;
+ const outputPath = join(basePath, appName, "code");
+ const knownHostsPath = path.join(SSH_PATH, "known_hosts");
+
+ try {
+ await addHostToKnownHosts(customGitUrl);
+ await recreateDirectory(outputPath);
+
+ if (customGitSSHKeyId) {
+ await updateSSHKeyById({
+ sshKeyId: customGitSSHKeyId,
+ lastUsedAt: new Date().toISOString(),
+ });
+ }
+
+ await spawnAsync(
+ "git",
+ [
+ "clone",
+ "--branch",
+ customGitBranch,
+ "--depth",
+ "1",
+ customGitUrl,
+ outputPath,
+ "--progress",
+ ],
+ (data) => {},
+ {
+ env: {
+ ...process.env,
+ ...(customGitSSHKeyId && {
+ GIT_SSH_COMMAND: `ssh -i ${keyPath} -o UserKnownHostsFile=${knownHostsPath}`,
+ }),
+ },
+ },
+ );
+ } catch (error) {
+ throw error;
+ }
+};
diff --git a/apps/dokploy/server/utils/providers/github.ts b/apps/dokploy/server/utils/providers/github.ts
index 06e38e191..a49f2b56e 100644
--- a/apps/dokploy/server/utils/providers/github.ts
+++ b/apps/dokploy/server/utils/providers/github.ts
@@ -1,6 +1,6 @@
import { createWriteStream } from "node:fs";
import { join } from "node:path";
-import type { Admin } from "@/server/api/services/admin";
+import { type Admin, findAdmin } from "@/server/api/services/admin";
import { APPLICATIONS_PATH, COMPOSE_PATH } from "@/server/constants";
import { createAppAuth } from "@octokit/auth-app";
import { TRPCError } from "@trpc/server";
@@ -128,3 +128,34 @@ export const cloneGithubRepository = async (
writeStream.end();
}
};
+
+export const cloneRawGithubRepository = async (entity: {
+ appName: string;
+ repository?: string | null;
+ owner?: string | null;
+ branch?: string | null;
+}) => {
+ const { appName, repository, owner, branch } = entity;
+ const admin = await findAdmin();
+ const basePath = COMPOSE_PATH;
+ const outputPath = join(basePath, appName, "code");
+ const octokit = authGithub(admin);
+ const token = await getGithubToken(octokit);
+ const repoclone = `github.com/${owner}/${repository}.git`;
+ await recreateDirectory(outputPath);
+ const cloneUrl = `https://oauth2:${token}@${repoclone}`;
+ try {
+ await spawnAsync("git", [
+ "clone",
+ "--branch",
+ branch!,
+ "--depth",
+ "1",
+ cloneUrl,
+ outputPath,
+ "--progress",
+ ]);
+ } catch (error) {
+ throw error;
+ }
+};
diff --git a/apps/dokploy/server/utils/providers/raw.ts b/apps/dokploy/server/utils/providers/raw.ts
index 63b825a7e..9bf818a30 100644
--- a/apps/dokploy/server/utils/providers/raw.ts
+++ b/apps/dokploy/server/utils/providers/raw.ts
@@ -26,3 +26,15 @@ export const createComposeFile = async (compose: Compose, logPath: string) => {
writeStream.end();
}
};
+
+export const createComposeFileRaw = async (compose: Compose) => {
+ const { appName, composeFile } = compose;
+ const outputPath = join(COMPOSE_PATH, appName, "code");
+ const filePath = join(outputPath, "docker-compose.yml");
+ try {
+ await recreateDirectory(outputPath);
+ await writeFile(filePath, composeFile);
+ } catch (error) {
+ throw error;
+ }
+};
diff --git a/apps/dokploy/templates/utils/index.ts b/apps/dokploy/templates/utils/index.ts
index 03ab71a45..11c7994ba 100644
--- a/apps/dokploy/templates/utils/index.ts
+++ b/apps/dokploy/templates/utils/index.ts
@@ -57,7 +57,7 @@ export const loadTemplateModule = async (
return generate;
};
-export const readComposeFile = async (id: string) => {
+export const readTemplateComposeFile = async (id: string) => {
const cwd = process.cwd();
const composeFile = await readFile(
join(cwd, ".next", "templates", id, "docker-compose.yml"),
From c4d59177bfba76bd2b299b6a137dc247753c7103 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Tue, 30 Jul 2024 23:20:54 -0600
Subject: [PATCH 02/28] refactor: update domain
---
apps/dokploy/server/utils/docker/domain.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index f47340ea0..8efce164c 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -61,7 +61,9 @@ export const addDomainToCompose = async (
const result = await loadDockerCompose(compose);
if (!result) {
- throw new Error("Error to load docker compose");
+ throw new Error(
+ "Error to load docker compose, the file is empty or not found",
+ );
}
for (const domain of domains) {
From 27256c609ad5cb24b6ebc4548af86a541e5bad3b Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Tue, 30 Jul 2024 23:31:05 -0600
Subject: [PATCH 03/28] refactor: add validations in domains
---
.../general/show-converted-compose.tsx | 29 +++++++++++++++++--
apps/dokploy/server/api/routers/compose.ts | 17 ++++++++++-
apps/dokploy/server/utils/docker/domain.ts | 3 +-
3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
index d57ab9d73..e0476d192 100644
--- a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
@@ -12,6 +12,7 @@ import {
import { api } from "@/utils/api";
import { Puzzle } from "lucide-react";
import { useState } from "react";
+import { toast } from "sonner";
interface Props {
composeId: string;
@@ -21,10 +22,17 @@ export const ShowConvertedCompose = ({ composeId }: Props) => {
const [isOpen, setIsOpen] = useState(false);
const {
data: compose,
- isLoading,
error,
isError,
- } = api.compose.getConvertedCompose.useQuery({ composeId });
+ refetch,
+ } = api.compose.getConvertedCompose.useQuery(
+ { composeId },
+ {
+ retry: false,
+ },
+ );
+
+ const { mutateAsync, isLoading } = api.compose.fetchSourceType.useMutation();
return (
@@ -43,6 +51,23 @@ export const ShowConvertedCompose = ({ composeId }: Props) => {
{isError && {error?.message} }
+ {
+ mutateAsync({ composeId })
+ .then(() => {
+ refetch();
+ toast.success("Fetched source type");
+ })
+ .catch((err) => {
+ toast.error("Error to fetch source type", {
+ description: err.message,
+ });
+ });
+ }}
+ >
+ Fetch
+
diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts
index 1c0a9e611..8acf9f01e 100644
--- a/apps/dokploy/server/api/routers/compose.ts
+++ b/apps/dokploy/server/api/routers/compose.ts
@@ -16,7 +16,7 @@ import {
import { myQueue } from "@/server/queues/queueSetup";
import { createCommand } from "@/server/utils/builders/compose";
import { randomizeComposeFile } from "@/server/utils/docker/compose";
-import { addDomainToCompose } from "@/server/utils/docker/domain";
+import { addDomainToCompose, cloneCompose } from "@/server/utils/docker/domain";
import { removeComposeDirectory } from "@/server/utils/filesystem/directory";
import { templates } from "@/templates/templates";
import type { TemplatesKeys } from "@/templates/types/templates-data.type";
@@ -122,6 +122,21 @@ export const composeRouter = createTRPCRouter({
.query(async ({ input }) => {
return await loadServices(input.composeId, input.type);
}),
+ fetchSourceType: protectedProcedure
+ .input(apiFindCompose)
+ .mutation(async ({ input }) => {
+ try {
+ const compose = await findComposeById(input.composeId);
+ await cloneCompose(compose);
+ return compose.sourceType;
+ } catch (err) {
+ throw new TRPCError({
+ code: "BAD_REQUEST",
+ message: "Error to fetch source type",
+ cause: err,
+ });
+ }
+ }),
randomizeCompose: protectedProcedure
.input(apiRandomizeCompose)
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index 8efce164c..44be498f7 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -71,9 +71,8 @@ export const addDomainToCompose = async (
if (!serviceName) {
throw new Error("Service name not found");
}
-
if (!result?.services?.[serviceName]) {
- throw new Error("Service not found");
+ throw new Error(`The service ${serviceName} not found in the compose`);
}
if (!result.services[serviceName].labels) {
result.services[serviceName].labels = [];
From 3e12e1b1b3fad12b7f0b350687410c3aee8ac6b1 Mon Sep 17 00:00:00 2001
From: Jumkey Chen
Date: Wed, 14 Aug 2024 19:16:59 +0800
Subject: [PATCH 04/28] fix: buildpacks/pack support arm64
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 40f1dbeef..13e2f4dd7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -52,7 +52,7 @@ RUN curl -sSL https://nixpacks.com/install.sh -o install.sh \
&& pnpm install -g tsx
# Install buildpacks
-RUN curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.35.0/pack-v0.35.0-linux.tgz" | tar -C /usr/local/bin/ --no-same-owner -xzv pack
+COPY --from=buildpacksio/pack:latest /usr/local/bin/pack /usr/local/bin/pack
EXPOSE 3000
CMD [ "pnpm", "start" ]
From 32b0d51e793b918d12860b5e20125d601fff59f1 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Wed, 14 Aug 2024 23:59:51 -0600
Subject: [PATCH 05/28] refactor: remove migration
---
.../drizzle/0027_ambitious_abomination.sql | 7 -
.../drizzle/0028_wandering_master_chief.sql | 1 -
.../drizzle/0029_rapid_blockbuster.sql | 7 -
apps/dokploy/drizzle/meta/0027_snapshot.json | 3029 ----------------
apps/dokploy/drizzle/meta/0028_snapshot.json | 3035 ----------------
apps/dokploy/drizzle/meta/0029_snapshot.json | 3051 -----------------
6 files changed, 9130 deletions(-)
delete mode 100644 apps/dokploy/drizzle/0027_ambitious_abomination.sql
delete mode 100644 apps/dokploy/drizzle/0028_wandering_master_chief.sql
delete mode 100644 apps/dokploy/drizzle/0029_rapid_blockbuster.sql
delete mode 100644 apps/dokploy/drizzle/meta/0027_snapshot.json
delete mode 100644 apps/dokploy/drizzle/meta/0028_snapshot.json
delete mode 100644 apps/dokploy/drizzle/meta/0029_snapshot.json
diff --git a/apps/dokploy/drizzle/0027_ambitious_abomination.sql b/apps/dokploy/drizzle/0027_ambitious_abomination.sql
deleted file mode 100644
index 9812737b7..000000000
--- a/apps/dokploy/drizzle/0027_ambitious_abomination.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-ALTER TABLE "domain" ALTER COLUMN "applicationId" DROP NOT NULL;--> statement-breakpoint
-ALTER TABLE "domain" ADD COLUMN "composeId" text;--> statement-breakpoint
-DO $$ BEGIN
- ALTER TABLE "domain" ADD CONSTRAINT "domain_composeId_compose_composeId_fk" FOREIGN KEY ("composeId") REFERENCES "public"."compose"("composeId") ON DELETE cascade ON UPDATE no action;
-EXCEPTION
- WHEN duplicate_object THEN null;
-END $$;
diff --git a/apps/dokploy/drizzle/0028_wandering_master_chief.sql b/apps/dokploy/drizzle/0028_wandering_master_chief.sql
deleted file mode 100644
index c7ead651c..000000000
--- a/apps/dokploy/drizzle/0028_wandering_master_chief.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE "domain" ADD COLUMN "serviceName" text;
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/0029_rapid_blockbuster.sql b/apps/dokploy/drizzle/0029_rapid_blockbuster.sql
deleted file mode 100644
index 1d86c55a0..000000000
--- a/apps/dokploy/drizzle/0029_rapid_blockbuster.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-DO $$ BEGIN
- CREATE TYPE "public"."domainType" AS ENUM('compose', 'application');
-EXCEPTION
- WHEN duplicate_object THEN null;
-END $$;
---> statement-breakpoint
-ALTER TABLE "domain" ADD COLUMN "domainType" "domainType" DEFAULT 'application';
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0027_snapshot.json b/apps/dokploy/drizzle/meta/0027_snapshot.json
deleted file mode 100644
index 508710e5f..000000000
--- a/apps/dokploy/drizzle/meta/0027_snapshot.json
+++ /dev/null
@@ -1,3029 +0,0 @@
-{
- "id": "360d381f-c3c6-4a0c-8730-357a0257110e",
- "prevId": "3dff4fa9-1d03-4748-b3ee-908c34324171",
- "version": "6",
- "dialect": "postgresql",
- "tables": {
- "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
- },
- "buildArgs": {
- "name": "buildArgs",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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
- },
- "refreshToken": {
- "name": "refreshToken",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "sourceType": {
- "name": "sourceType",
- "type": "sourceType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'github'"
- },
- "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": "'/'"
- },
- "autoDeploy": {
- "name": "autoDeploy",
- "type": "boolean",
- "primaryKey": false,
- "notNull": false
- },
- "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
- },
- "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
- },
- "dockerfile": {
- "name": "dockerfile",
- "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
- },
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "registryId": {
- "name": "registryId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "application_projectId_project_projectId_fk",
- "tableFrom": "application",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "application_appName_unique": {
- "name": "application_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "externalPort": {
- "name": "externalPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "applicationStatus": {
- "name": "applicationStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "postgres_projectId_project_projectId_fk": {
- "name": "postgres_projectId_project_projectId_fk",
- "tableFrom": "postgres",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "postgres_appName_unique": {
- "name": "postgres_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.user": {
- "name": "user",
- "schema": "",
- "columns": {
- "userId": {
- "name": "userId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "isRegistered": {
- "name": "isRegistered",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "expirationDate": {
- "name": "expirationDate",
- "type": "timestamp(3)",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "canCreateProjects": {
- "name": "canCreateProjects",
- "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
- },
- "canAccessToTraefikFiles": {
- "name": "canAccessToTraefikFiles",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "accesedProjects": {
- "name": "accesedProjects",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "accesedServices": {
- "name": "accesedServices",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "user_adminId_admin_adminId_fk": {
- "name": "user_adminId_admin_adminId_fk",
- "tableFrom": "user",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- },
- "user_authId_auth_id_fk": {
- "name": "user_authId_auth_id_fk",
- "tableFrom": "user",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.admin": {
- "name": "admin",
- "schema": "",
- "columns": {
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "githubAppId": {
- "name": "githubAppId",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "githubAppName": {
- "name": "githubAppName",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "serverIp": {
- "name": "serverIp",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- },
- "host": {
- "name": "host",
- "type": "text",
- "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
- },
- "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": false
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "admin_authId_auth_id_fk": {
- "name": "admin_authId_auth_id_fk",
- "tableFrom": "admin",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.auth": {
- "name": "auth",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "email": {
- "name": "email",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "password": {
- "name": "password",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "rol": {
- "name": "rol",
- "type": "Roles",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "image": {
- "name": "image",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "secret": {
- "name": "secret",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "is2FAEnabled": {
- "name": "is2FAEnabled",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "auth_email_unique": {
- "name": "auth_email_unique",
- "nullsNotDistinct": false,
- "columns": [
- "email"
- ]
- }
- }
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "project_adminId_admin_adminId_fk": {
- "name": "project_adminId_admin_adminId_fk",
- "tableFrom": "project",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": 80
- },
- "path": {
- "name": "path",
- "type": "text",
- "primaryKey": false,
- "notNull": false,
- "default": "'/'"
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mariadb_projectId_project_projectId_fk": {
- "name": "mariadb_projectId_project_projectId_fk",
- "tableFrom": "mariadb",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mariadb_appName_unique": {
- "name": "mariadb_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mongo_projectId_project_projectId_fk": {
- "name": "mongo_projectId_project_projectId_fk",
- "tableFrom": "mongo",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mongo_appName_unique": {
- "name": "mongo_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mysql_projectId_project_projectId_fk": {
- "name": "mysql_projectId_project_projectId_fk",
- "tableFrom": "mysql",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mysql_appName_unique": {
- "name": "mysql_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.backup": {
- "name": "backup",
- "schema": "",
- "columns": {
- "backupId": {
- "name": "backupId",
- "type": "text",
- "primaryKey": true,
- "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
- },
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "databaseType": {
- "name": "databaseType",
- "type": "databaseType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "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
- }
- },
- "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_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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.destination": {
- "name": "destination",
- "schema": "",
- "columns": {
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "name": {
- "name": "name",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "destination_adminId_admin_adminId_fk": {
- "name": "destination_adminId_admin_adminId_fk",
- "tableFrom": "destination",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "composeId": {
- "name": "composeId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "certificate_certificatePath_unique": {
- "name": "certificate_certificatePath_unique",
- "nullsNotDistinct": false,
- "columns": [
- "certificatePath"
- ]
- }
- }
- },
- "public.session": {
- "name": "session",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "user_id": {
- "name": "user_id",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "expires_at": {
- "name": "expires_at",
- "type": "timestamp with time zone",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "session_user_id_auth_id_fk": {
- "name": "session_user_id_auth_id_fk",
- "tableFrom": "session",
- "tableTo": "auth",
- "columnsFrom": [
- "user_id"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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"
- ]
- }
- }
- },
- "public.port": {
- "name": "port",
- "schema": "",
- "columns": {
- "portId": {
- "name": "portId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "publishedPort": {
- "name": "publishedPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": true
- },
- "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": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "redis_projectId_project_projectId_fk": {
- "name": "redis_projectId_project_projectId_fk",
- "tableFrom": "redis",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "redis_appName_unique": {
- "name": "redis_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "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": "''"
- },
- "composePath": {
- "name": "composePath",
- "type": "text",
- "primaryKey": false,
- "notNull": true,
- "default": "'./docker-compose.yml'"
- },
- "composeStatus": {
- "name": "composeStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "compose_projectId_project_projectId_fk",
- "tableFrom": "compose",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "selfHosted": {
- "name": "selfHosted",
- "type": "RegistryType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'cloud'"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "registry_adminId_admin_adminId_fk": {
- "name": "registry_adminId_admin_adminId_fk",
- "tableFrom": "registry",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.discord": {
- "name": "discord",
- "schema": "",
- "columns": {
- "discordId": {
- "name": "discordId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "webhookUrl": {
- "name": "webhookUrl",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- },
- "dokployRestart": {
- "name": "dokployRestart",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "dockerCleanup": {
- "name": "dockerCleanup",
- "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
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.ssh-key": {
- "name": "ssh-key",
- "schema": "",
- "columns": {
- "sshKeyId": {
- "name": "sshKeyId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- }
- },
- "enums": {
- "public.buildType": {
- "name": "buildType",
- "schema": "public",
- "values": [
- "dockerfile",
- "heroku_buildpacks",
- "paketo_buildpacks",
- "nixpacks"
- ]
- },
- "public.sourceType": {
- "name": "sourceType",
- "schema": "public",
- "values": [
- "docker",
- "git",
- "github",
- "drop"
- ]
- },
- "public.Roles": {
- "name": "Roles",
- "schema": "public",
- "values": [
- "admin",
- "user"
- ]
- },
- "public.databaseType": {
- "name": "databaseType",
- "schema": "public",
- "values": [
- "postgres",
- "mariadb",
- "mysql",
- "mongo"
- ]
- },
- "public.deploymentStatus": {
- "name": "deploymentStatus",
- "schema": "public",
- "values": [
- "running",
- "done",
- "error"
- ]
- },
- "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.protocolType": {
- "name": "protocolType",
- "schema": "public",
- "values": [
- "tcp",
- "udp"
- ]
- },
- "public.applicationStatus": {
- "name": "applicationStatus",
- "schema": "public",
- "values": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "public.certificateType": {
- "name": "certificateType",
- "schema": "public",
- "values": [
- "letsencrypt",
- "none"
- ]
- },
- "public.composeType": {
- "name": "composeType",
- "schema": "public",
- "values": [
- "docker-compose",
- "stack"
- ]
- },
- "public.sourceTypeCompose": {
- "name": "sourceTypeCompose",
- "schema": "public",
- "values": [
- "git",
- "github",
- "raw"
- ]
- },
- "public.RegistryType": {
- "name": "RegistryType",
- "schema": "public",
- "values": [
- "selfHosted",
- "cloud"
- ]
- },
- "public.notificationType": {
- "name": "notificationType",
- "schema": "public",
- "values": [
- "slack",
- "telegram",
- "discord",
- "email"
- ]
- }
- },
- "schemas": {},
- "_meta": {
- "columns": {},
- "schemas": {},
- "tables": {}
- }
-}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0028_snapshot.json b/apps/dokploy/drizzle/meta/0028_snapshot.json
deleted file mode 100644
index aa8caa659..000000000
--- a/apps/dokploy/drizzle/meta/0028_snapshot.json
+++ /dev/null
@@ -1,3035 +0,0 @@
-{
- "id": "fb42dab1-49b3-4f25-860e-19571959c43e",
- "prevId": "360d381f-c3c6-4a0c-8730-357a0257110e",
- "version": "6",
- "dialect": "postgresql",
- "tables": {
- "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
- },
- "buildArgs": {
- "name": "buildArgs",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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
- },
- "refreshToken": {
- "name": "refreshToken",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "sourceType": {
- "name": "sourceType",
- "type": "sourceType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'github'"
- },
- "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": "'/'"
- },
- "autoDeploy": {
- "name": "autoDeploy",
- "type": "boolean",
- "primaryKey": false,
- "notNull": false
- },
- "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
- },
- "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
- },
- "dockerfile": {
- "name": "dockerfile",
- "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
- },
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "registryId": {
- "name": "registryId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "application_projectId_project_projectId_fk",
- "tableFrom": "application",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "application_appName_unique": {
- "name": "application_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "externalPort": {
- "name": "externalPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "applicationStatus": {
- "name": "applicationStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "postgres_projectId_project_projectId_fk": {
- "name": "postgres_projectId_project_projectId_fk",
- "tableFrom": "postgres",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "postgres_appName_unique": {
- "name": "postgres_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.user": {
- "name": "user",
- "schema": "",
- "columns": {
- "userId": {
- "name": "userId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "isRegistered": {
- "name": "isRegistered",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "expirationDate": {
- "name": "expirationDate",
- "type": "timestamp(3)",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "canCreateProjects": {
- "name": "canCreateProjects",
- "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
- },
- "canAccessToTraefikFiles": {
- "name": "canAccessToTraefikFiles",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "accesedProjects": {
- "name": "accesedProjects",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "accesedServices": {
- "name": "accesedServices",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "user_adminId_admin_adminId_fk": {
- "name": "user_adminId_admin_adminId_fk",
- "tableFrom": "user",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- },
- "user_authId_auth_id_fk": {
- "name": "user_authId_auth_id_fk",
- "tableFrom": "user",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.admin": {
- "name": "admin",
- "schema": "",
- "columns": {
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "githubAppId": {
- "name": "githubAppId",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "githubAppName": {
- "name": "githubAppName",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "serverIp": {
- "name": "serverIp",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- },
- "host": {
- "name": "host",
- "type": "text",
- "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
- },
- "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": false
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "admin_authId_auth_id_fk": {
- "name": "admin_authId_auth_id_fk",
- "tableFrom": "admin",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.auth": {
- "name": "auth",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "email": {
- "name": "email",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "password": {
- "name": "password",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "rol": {
- "name": "rol",
- "type": "Roles",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "image": {
- "name": "image",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "secret": {
- "name": "secret",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "is2FAEnabled": {
- "name": "is2FAEnabled",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "auth_email_unique": {
- "name": "auth_email_unique",
- "nullsNotDistinct": false,
- "columns": [
- "email"
- ]
- }
- }
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "project_adminId_admin_adminId_fk": {
- "name": "project_adminId_admin_adminId_fk",
- "tableFrom": "project",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": 80
- },
- "path": {
- "name": "path",
- "type": "text",
- "primaryKey": false,
- "notNull": false,
- "default": "'/'"
- },
- "serviceName": {
- "name": "serviceName",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mariadb_projectId_project_projectId_fk": {
- "name": "mariadb_projectId_project_projectId_fk",
- "tableFrom": "mariadb",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mariadb_appName_unique": {
- "name": "mariadb_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mongo_projectId_project_projectId_fk": {
- "name": "mongo_projectId_project_projectId_fk",
- "tableFrom": "mongo",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mongo_appName_unique": {
- "name": "mongo_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mysql_projectId_project_projectId_fk": {
- "name": "mysql_projectId_project_projectId_fk",
- "tableFrom": "mysql",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mysql_appName_unique": {
- "name": "mysql_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.backup": {
- "name": "backup",
- "schema": "",
- "columns": {
- "backupId": {
- "name": "backupId",
- "type": "text",
- "primaryKey": true,
- "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
- },
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "databaseType": {
- "name": "databaseType",
- "type": "databaseType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "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
- }
- },
- "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_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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.destination": {
- "name": "destination",
- "schema": "",
- "columns": {
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "name": {
- "name": "name",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "destination_adminId_admin_adminId_fk": {
- "name": "destination_adminId_admin_adminId_fk",
- "tableFrom": "destination",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "composeId": {
- "name": "composeId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "certificate_certificatePath_unique": {
- "name": "certificate_certificatePath_unique",
- "nullsNotDistinct": false,
- "columns": [
- "certificatePath"
- ]
- }
- }
- },
- "public.session": {
- "name": "session",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "user_id": {
- "name": "user_id",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "expires_at": {
- "name": "expires_at",
- "type": "timestamp with time zone",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "session_user_id_auth_id_fk": {
- "name": "session_user_id_auth_id_fk",
- "tableFrom": "session",
- "tableTo": "auth",
- "columnsFrom": [
- "user_id"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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"
- ]
- }
- }
- },
- "public.port": {
- "name": "port",
- "schema": "",
- "columns": {
- "portId": {
- "name": "portId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "publishedPort": {
- "name": "publishedPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": true
- },
- "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": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "redis_projectId_project_projectId_fk": {
- "name": "redis_projectId_project_projectId_fk",
- "tableFrom": "redis",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "redis_appName_unique": {
- "name": "redis_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "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": "''"
- },
- "composePath": {
- "name": "composePath",
- "type": "text",
- "primaryKey": false,
- "notNull": true,
- "default": "'./docker-compose.yml'"
- },
- "composeStatus": {
- "name": "composeStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "compose_projectId_project_projectId_fk",
- "tableFrom": "compose",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "selfHosted": {
- "name": "selfHosted",
- "type": "RegistryType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'cloud'"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "registry_adminId_admin_adminId_fk": {
- "name": "registry_adminId_admin_adminId_fk",
- "tableFrom": "registry",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.discord": {
- "name": "discord",
- "schema": "",
- "columns": {
- "discordId": {
- "name": "discordId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "webhookUrl": {
- "name": "webhookUrl",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- },
- "dokployRestart": {
- "name": "dokployRestart",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "dockerCleanup": {
- "name": "dockerCleanup",
- "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
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.ssh-key": {
- "name": "ssh-key",
- "schema": "",
- "columns": {
- "sshKeyId": {
- "name": "sshKeyId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- }
- },
- "enums": {
- "public.buildType": {
- "name": "buildType",
- "schema": "public",
- "values": [
- "dockerfile",
- "heroku_buildpacks",
- "paketo_buildpacks",
- "nixpacks"
- ]
- },
- "public.sourceType": {
- "name": "sourceType",
- "schema": "public",
- "values": [
- "docker",
- "git",
- "github",
- "drop"
- ]
- },
- "public.Roles": {
- "name": "Roles",
- "schema": "public",
- "values": [
- "admin",
- "user"
- ]
- },
- "public.databaseType": {
- "name": "databaseType",
- "schema": "public",
- "values": [
- "postgres",
- "mariadb",
- "mysql",
- "mongo"
- ]
- },
- "public.deploymentStatus": {
- "name": "deploymentStatus",
- "schema": "public",
- "values": [
- "running",
- "done",
- "error"
- ]
- },
- "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.protocolType": {
- "name": "protocolType",
- "schema": "public",
- "values": [
- "tcp",
- "udp"
- ]
- },
- "public.applicationStatus": {
- "name": "applicationStatus",
- "schema": "public",
- "values": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "public.certificateType": {
- "name": "certificateType",
- "schema": "public",
- "values": [
- "letsencrypt",
- "none"
- ]
- },
- "public.composeType": {
- "name": "composeType",
- "schema": "public",
- "values": [
- "docker-compose",
- "stack"
- ]
- },
- "public.sourceTypeCompose": {
- "name": "sourceTypeCompose",
- "schema": "public",
- "values": [
- "git",
- "github",
- "raw"
- ]
- },
- "public.RegistryType": {
- "name": "RegistryType",
- "schema": "public",
- "values": [
- "selfHosted",
- "cloud"
- ]
- },
- "public.notificationType": {
- "name": "notificationType",
- "schema": "public",
- "values": [
- "slack",
- "telegram",
- "discord",
- "email"
- ]
- }
- },
- "schemas": {},
- "_meta": {
- "columns": {},
- "schemas": {},
- "tables": {}
- }
-}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0029_snapshot.json b/apps/dokploy/drizzle/meta/0029_snapshot.json
deleted file mode 100644
index 48dd6abe7..000000000
--- a/apps/dokploy/drizzle/meta/0029_snapshot.json
+++ /dev/null
@@ -1,3051 +0,0 @@
-{
- "id": "86f1da74-ea3f-43d1-806d-4b6636dd15f0",
- "prevId": "fb42dab1-49b3-4f25-860e-19571959c43e",
- "version": "6",
- "dialect": "postgresql",
- "tables": {
- "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
- },
- "buildArgs": {
- "name": "buildArgs",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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
- },
- "refreshToken": {
- "name": "refreshToken",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "sourceType": {
- "name": "sourceType",
- "type": "sourceType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'github'"
- },
- "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": "'/'"
- },
- "autoDeploy": {
- "name": "autoDeploy",
- "type": "boolean",
- "primaryKey": false,
- "notNull": false
- },
- "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
- },
- "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
- },
- "dockerfile": {
- "name": "dockerfile",
- "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
- },
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "registryId": {
- "name": "registryId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "application_projectId_project_projectId_fk",
- "tableFrom": "application",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "application_appName_unique": {
- "name": "application_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "externalPort": {
- "name": "externalPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "applicationStatus": {
- "name": "applicationStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "postgres_projectId_project_projectId_fk": {
- "name": "postgres_projectId_project_projectId_fk",
- "tableFrom": "postgres",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "postgres_appName_unique": {
- "name": "postgres_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.user": {
- "name": "user",
- "schema": "",
- "columns": {
- "userId": {
- "name": "userId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "isRegistered": {
- "name": "isRegistered",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "expirationDate": {
- "name": "expirationDate",
- "type": "timestamp(3)",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "canCreateProjects": {
- "name": "canCreateProjects",
- "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
- },
- "canAccessToTraefikFiles": {
- "name": "canAccessToTraefikFiles",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "accesedProjects": {
- "name": "accesedProjects",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "accesedServices": {
- "name": "accesedServices",
- "type": "text[]",
- "primaryKey": false,
- "notNull": true,
- "default": "ARRAY[]::text[]"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "user_adminId_admin_adminId_fk": {
- "name": "user_adminId_admin_adminId_fk",
- "tableFrom": "user",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- },
- "user_authId_auth_id_fk": {
- "name": "user_authId_auth_id_fk",
- "tableFrom": "user",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.admin": {
- "name": "admin",
- "schema": "",
- "columns": {
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "githubAppId": {
- "name": "githubAppId",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "githubAppName": {
- "name": "githubAppName",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "serverIp": {
- "name": "serverIp",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- },
- "host": {
- "name": "host",
- "type": "text",
- "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
- },
- "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": false
- },
- "authId": {
- "name": "authId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "admin_authId_auth_id_fk": {
- "name": "admin_authId_auth_id_fk",
- "tableFrom": "admin",
- "tableTo": "auth",
- "columnsFrom": [
- "authId"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.auth": {
- "name": "auth",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "email": {
- "name": "email",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "password": {
- "name": "password",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "rol": {
- "name": "rol",
- "type": "Roles",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "image": {
- "name": "image",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "secret": {
- "name": "secret",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "token": {
- "name": "token",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "is2FAEnabled": {
- "name": "is2FAEnabled",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "auth_email_unique": {
- "name": "auth_email_unique",
- "nullsNotDistinct": false,
- "columns": [
- "email"
- ]
- }
- }
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "project_adminId_admin_adminId_fk": {
- "name": "project_adminId_admin_adminId_fk",
- "tableFrom": "project",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": 80
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "certificateType": {
- "name": "certificateType",
- "type": "certificateType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'none'"
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mariadb_projectId_project_projectId_fk": {
- "name": "mariadb_projectId_project_projectId_fk",
- "tableFrom": "mariadb",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mariadb_appName_unique": {
- "name": "mariadb_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mongo_projectId_project_projectId_fk": {
- "name": "mongo_projectId_project_projectId_fk",
- "tableFrom": "mongo",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mongo_appName_unique": {
- "name": "mongo_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "mysql_projectId_project_projectId_fk": {
- "name": "mysql_projectId_project_projectId_fk",
- "tableFrom": "mysql",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "mysql_appName_unique": {
- "name": "mysql_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "public.backup": {
- "name": "backup",
- "schema": "",
- "columns": {
- "backupId": {
- "name": "backupId",
- "type": "text",
- "primaryKey": true,
- "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
- },
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "databaseType": {
- "name": "databaseType",
- "type": "databaseType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true
- },
- "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
- }
- },
- "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_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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.destination": {
- "name": "destination",
- "schema": "",
- "columns": {
- "destinationId": {
- "name": "destinationId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "name": {
- "name": "name",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "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
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "destination_adminId_admin_adminId_fk": {
- "name": "destination_adminId_admin_adminId_fk",
- "tableFrom": "destination",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "applicationId": {
- "name": "applicationId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "composeId": {
- "name": "composeId",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "certificate_certificatePath_unique": {
- "name": "certificate_certificatePath_unique",
- "nullsNotDistinct": false,
- "columns": [
- "certificatePath"
- ]
- }
- }
- },
- "public.session": {
- "name": "session",
- "schema": "",
- "columns": {
- "id": {
- "name": "id",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "user_id": {
- "name": "user_id",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "expires_at": {
- "name": "expires_at",
- "type": "timestamp with time zone",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "session_user_id_auth_id_fk": {
- "name": "session_user_id_auth_id_fk",
- "tableFrom": "session",
- "tableTo": "auth",
- "columnsFrom": [
- "user_id"
- ],
- "columnsTo": [
- "id"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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"
- ]
- }
- }
- },
- "public.port": {
- "name": "port",
- "schema": "",
- "columns": {
- "portId": {
- "name": "portId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "publishedPort": {
- "name": "publishedPort",
- "type": "integer",
- "primaryKey": false,
- "notNull": true
- },
- "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": {}
- },
- "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
- },
- "env": {
- "name": "env",
- "type": "text",
- "primaryKey": false,
- "notNull": false
- },
- "memoryReservation": {
- "name": "memoryReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "memoryLimit": {
- "name": "memoryLimit",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuReservation": {
- "name": "cpuReservation",
- "type": "integer",
- "primaryKey": false,
- "notNull": false
- },
- "cpuLimit": {
- "name": "cpuLimit",
- "type": "integer",
- "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'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "redis_projectId_project_projectId_fk": {
- "name": "redis_projectId_project_projectId_fk",
- "tableFrom": "redis",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {
- "redis_appName_unique": {
- "name": "redis_appName_unique",
- "nullsNotDistinct": false,
- "columns": [
- "appName"
- ]
- }
- }
- },
- "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
- },
- "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": "''"
- },
- "composePath": {
- "name": "composePath",
- "type": "text",
- "primaryKey": false,
- "notNull": true,
- "default": "'./docker-compose.yml'"
- },
- "composeStatus": {
- "name": "composeStatus",
- "type": "applicationStatus",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'idle'"
- },
- "projectId": {
- "name": "projectId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "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_projectId_project_projectId_fk": {
- "name": "compose_projectId_project_projectId_fk",
- "tableFrom": "compose",
- "tableTo": "project",
- "columnsFrom": [
- "projectId"
- ],
- "columnsTo": [
- "projectId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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
- },
- "createdAt": {
- "name": "createdAt",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- },
- "selfHosted": {
- "name": "selfHosted",
- "type": "RegistryType",
- "typeSchema": "public",
- "primaryKey": false,
- "notNull": true,
- "default": "'cloud'"
- },
- "adminId": {
- "name": "adminId",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {
- "registry_adminId_admin_adminId_fk": {
- "name": "registry_adminId_admin_adminId_fk",
- "tableFrom": "registry",
- "tableTo": "admin",
- "columnsFrom": [
- "adminId"
- ],
- "columnsTo": [
- "adminId"
- ],
- "onDelete": "cascade",
- "onUpdate": "no action"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.discord": {
- "name": "discord",
- "schema": "",
- "columns": {
- "discordId": {
- "name": "discordId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "webhookUrl": {
- "name": "webhookUrl",
- "type": "text",
- "primaryKey": false,
- "notNull": true
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- },
- "dokployRestart": {
- "name": "dokployRestart",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
- "dockerCleanup": {
- "name": "dockerCleanup",
- "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
- }
- },
- "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"
- }
- },
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "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": {}
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- },
- "public.ssh-key": {
- "name": "ssh-key",
- "schema": "",
- "columns": {
- "sshKeyId": {
- "name": "sshKeyId",
- "type": "text",
- "primaryKey": true,
- "notNull": true
- },
- "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
- }
- },
- "indexes": {},
- "foreignKeys": {},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {}
- }
- },
- "enums": {
- "public.buildType": {
- "name": "buildType",
- "schema": "public",
- "values": [
- "dockerfile",
- "heroku_buildpacks",
- "paketo_buildpacks",
- "nixpacks"
- ]
- },
- "public.sourceType": {
- "name": "sourceType",
- "schema": "public",
- "values": [
- "docker",
- "git",
- "github",
- "drop"
- ]
- },
- "public.Roles": {
- "name": "Roles",
- "schema": "public",
- "values": [
- "admin",
- "user"
- ]
- },
- "public.domainType": {
- "name": "domainType",
- "schema": "public",
- "values": [
- "compose",
- "application"
- ]
- },
- "public.databaseType": {
- "name": "databaseType",
- "schema": "public",
- "values": [
- "postgres",
- "mariadb",
- "mysql",
- "mongo"
- ]
- },
- "public.deploymentStatus": {
- "name": "deploymentStatus",
- "schema": "public",
- "values": [
- "running",
- "done",
- "error"
- ]
- },
- "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.protocolType": {
- "name": "protocolType",
- "schema": "public",
- "values": [
- "tcp",
- "udp"
- ]
- },
- "public.applicationStatus": {
- "name": "applicationStatus",
- "schema": "public",
- "values": [
- "idle",
- "running",
- "done",
- "error"
- ]
- },
- "public.certificateType": {
- "name": "certificateType",
- "schema": "public",
- "values": [
- "letsencrypt",
- "none"
- ]
- },
- "public.composeType": {
- "name": "composeType",
- "schema": "public",
- "values": [
- "docker-compose",
- "stack"
- ]
- },
- "public.sourceTypeCompose": {
- "name": "sourceTypeCompose",
- "schema": "public",
- "values": [
- "git",
- "github",
- "raw"
- ]
- },
- "public.RegistryType": {
- "name": "RegistryType",
- "schema": "public",
- "values": [
- "selfHosted",
- "cloud"
- ]
- },
- "public.notificationType": {
- "name": "notificationType",
- "schema": "public",
- "values": [
- "slack",
- "telegram",
- "discord",
- "email"
- ]
- }
- },
- "schemas": {},
- "_meta": {
- "columns": {},
- "schemas": {},
- "tables": {}
- }
-}
\ No newline at end of file
From 84ba74a673b12f6018f28a6177050bffb8a20e24 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Thu, 15 Aug 2024 00:00:34 -0600
Subject: [PATCH 06/28] refactor: remove migrations
---
apps/dokploy/drizzle/meta/_journal.json | 21 ---------------------
1 file changed, 21 deletions(-)
diff --git a/apps/dokploy/drizzle/meta/_journal.json b/apps/dokploy/drizzle/meta/_journal.json
index 0219745ba..8ffba8d93 100644
--- a/apps/dokploy/drizzle/meta/_journal.json
+++ b/apps/dokploy/drizzle/meta/_journal.json
@@ -190,27 +190,6 @@
"when": 1721979220929,
"tag": "0026_known_dormammu",
"breakpoints": true
- },
- {
- "idx": 27,
- "version": "6",
- "when": 1722362624160,
- "tag": "0027_ambitious_abomination",
- "breakpoints": true
- },
- {
- "idx": 28,
- "version": "6",
- "when": 1722371073553,
- "tag": "0028_wandering_master_chief",
- "breakpoints": true
- },
- {
- "idx": 29,
- "version": "6",
- "when": 1722399047750,
- "tag": "0029_rapid_blockbuster",
- "breakpoints": true
}
]
}
\ No newline at end of file
From ecb919e1098e8fd06c78821e30bd143b67445965 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Thu, 15 Aug 2024 01:02:11 -0600
Subject: [PATCH 07/28] refactor(domains): make traefik domains generate in a
single click
---
.../application/domains/add-domain.tsx | 61 +-
.../dashboard/compose/domains/add-domain.tsx | 55 +-
.../compose/domains/generate-domain.tsx | 79 -
.../compose/domains/generate-traefikme.tsx | 69 -
.../compose/domains/show-domains.tsx | 6 +-
.../compose/general/generic/show.tsx | 4 +-
apps/dokploy/drizzle/0031_steep_vulture.sql | 15 +
.../drizzle/0032_flashy_shadow_king.sql | 1 +
apps/dokploy/drizzle/meta/0031_snapshot.json | 3071 +++++++++++++++++
apps/dokploy/drizzle/meta/0032_snapshot.json | 3071 +++++++++++++++++
apps/dokploy/drizzle/meta/_journal.json | 14 +
apps/dokploy/server/api/routers/domain.ts | 7 +-
apps/dokploy/server/api/services/domain.ts | 56 +-
apps/dokploy/server/db/schema/domain.ts | 7 +-
apps/dokploy/server/utils/docker/domain.ts | 16 +-
15 files changed, 6321 insertions(+), 211 deletions(-)
delete mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
delete mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
create mode 100644 apps/dokploy/drizzle/0031_steep_vulture.sql
create mode 100644 apps/dokploy/drizzle/0032_flashy_shadow_king.sql
create mode 100644 apps/dokploy/drizzle/meta/0031_snapshot.json
create mode 100644 apps/dokploy/drizzle/meta/0032_snapshot.json
diff --git a/apps/dokploy/components/dashboard/application/domains/add-domain.tsx b/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
index 752655e4d..ab7db1ef5 100644
--- a/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
+++ b/apps/dokploy/components/dashboard/application/domains/add-domain.tsx
@@ -27,13 +27,20 @@ import {
SelectValue,
} from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
import { api } from "@/utils/api";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
-import { domain } from "@/server/db/validations";
+import { domain } from "@/server/db/validations/domain";
import { zodResolver } from "@hookform/resolvers/zod";
+import { Dices } from "lucide-react";
import type z from "zod";
type Domain = z.infer;
@@ -60,10 +67,22 @@ export const AddDomain = ({
},
);
+ const { data: application } = api.application.one.useQuery(
+ {
+ applicationId,
+ },
+ {
+ enabled: !!applicationId,
+ },
+ );
+
const { mutateAsync, isError, error, isLoading } = domainId
? api.domain.update.useMutation()
: api.domain.create.useMutation();
+ const { mutateAsync: generateDomain, isLoading: isLoadingGenerate } =
+ api.domain.generateDomain.useMutation();
+
const form = useForm({
resolver: zodResolver(domain),
});
@@ -75,7 +94,6 @@ export const AddDomain = ({
/* Convert null to undefined */
path: data?.path || undefined,
port: data?.port || undefined,
- serviceName: data?.serviceName || undefined,
});
}
@@ -143,9 +161,42 @@ export const AddDomain = ({
render={({ field }) => (
Host
-
-
-
+
+
+
+
+
+
+
+ {
+ generateDomain({
+ appName: application?.appName || "",
+ })
+ .then((domain) => {
+ field.onChange(domain);
+ })
+ .catch((err) => {
+ toast.error(err.message);
+ });
+ }}
+ >
+
+
+
+
+ Generate traefik.me domain
+
+
+
+
diff --git a/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx b/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
index a7faac68c..a10ce271a 100644
--- a/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
+++ b/apps/dokploy/components/dashboard/compose/domains/add-domain.tsx
@@ -40,12 +40,12 @@ import {
} from "@/components/ui/tooltip";
import { domainCompose } from "@/server/db/validations/domain";
import { zodResolver } from "@hookform/resolvers/zod";
-import { DatabaseZap, RefreshCw } from "lucide-react";
+import { DatabaseZap, Dices, RefreshCw } from "lucide-react";
import type z from "zod";
type Domain = z.infer;
-type CacheType = "fetch" | "cache";
+export type CacheType = "fetch" | "cache";
interface Props {
composeId: string;
@@ -70,6 +70,15 @@ export const AddDomainCompose = ({
},
);
+ const { data: compose } = api.compose.one.useQuery(
+ {
+ composeId,
+ },
+ {
+ enabled: !!composeId,
+ },
+ );
+
const {
data: services,
isFetching: isLoadingServices,
@@ -86,6 +95,9 @@ export const AddDomainCompose = ({
},
);
+ const { mutateAsync: generateDomain, isLoading: isLoadingGenerate } =
+ api.domain.generateDomain.useMutation();
+
const { mutateAsync, isError, error, isLoading } = domainId
? api.domain.update.useMutation()
: api.domain.create.useMutation();
@@ -279,9 +291,42 @@ export const AddDomainCompose = ({
render={({ field }) => (
Host
-
-
-
+
+
+
+
+
+
+
+ {
+ generateDomain({
+ appName: compose?.appName || "",
+ })
+ .then((domain) => {
+ field.onChange(domain);
+ })
+ .catch((err) => {
+ toast.error(err.message);
+ });
+ }}
+ >
+
+
+
+
+ Generate traefik.me domain
+
+
+
+
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
deleted file mode 100644
index 9ebe8e30c..000000000
--- a/apps/dokploy/components/dashboard/compose/domains/generate-domain.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Button } from "@/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog";
-import { api } from "@/utils/api";
-import { RefreshCcw } from "lucide-react";
-import Link from "next/link";
-import { GenerateTraefikMe } from "./generate-traefikme";
-import { GenerateWildCard } from "./generate-wildcard";
-
-interface Props {
- applicationId: string;
-}
-
-export const GenerateDomain = ({ applicationId }: Props) => {
- return (
-
-
-
- Generate Domain
-
-
-
-
-
- Generate Domain
-
- Generate Domains for your applications
-
-
-
-
-
-
-
-
- 1. Generate TraefikMe Domain
-
-
- This option generates a free domain provided by{" "}
-
- TraefikMe
-
- . We recommend using this for quick domain testing or if you
- don't have a domain yet.
-
-
-
- {/*
-
-
- 2. Use Wildcard Domain
-
-
- To use this option, you need to set up an 'A' record in your
- domain provider. For example, create a record for
- *.yourdomain.com.
-
-
- */}
-
-
-
- {/* */}
-
-
-
-
- );
-};
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
deleted file mode 100644
index 3085b3a88..000000000
--- a/apps/dokploy/components/dashboard/compose/domains/generate-traefikme.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog";
-import { Button } from "@/components/ui/button";
-import { api } from "@/utils/api";
-import { RefreshCcw } from "lucide-react";
-import React from "react";
-import { toast } from "sonner";
-
-interface Props {
- applicationId: string;
-}
-export const GenerateTraefikMe = ({ applicationId }: Props) => {
- const { mutateAsync, isLoading } = api.domain.generateDomain.useMutation();
- const utils = api.useUtils();
- return (
-
-
-
- Generate Domain
-
-
-
-
-
-
- Are you sure to generate a new domain?
-
-
- This will generate a new domain and will be used to access to the
- application
-
-
-
- Cancel
- {
- await mutateAsync({
- applicationId,
- })
- .then((data) => {
- utils.domain.byApplicationId.invalidate({
- applicationId: applicationId,
- });
- utils.application.readTraefikConfig.invalidate({
- applicationId: applicationId,
- });
- toast.success("Generated Domain succesfully");
- })
- .catch(() => {
- toast.error("Error to generate Domain");
- });
- }}
- >
- Confirm
-
-
-
-
- );
-};
diff --git a/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx b/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
index d2c1d3514..01e6f1abc 100644
--- a/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
+++ b/apps/dokploy/components/dashboard/compose/domains/show-domains.tsx
@@ -26,6 +26,7 @@ export const ShowDomainsCompose = ({ composeId }: Props) => {
enabled: !!composeId,
},
);
+
return (
@@ -45,9 +46,6 @@ export const ShowDomainsCompose = ({ composeId }: Props) => {
)}
- {/* {data && data?.length > 0 && (
-
- )} */}
@@ -64,8 +62,6 @@ export const ShowDomainsCompose = ({ composeId }: Props) => {
Add Domain
-
- {/* */}
) : (
diff --git a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
index 7ce754343..bcece796e 100644
--- a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
@@ -30,9 +30,9 @@ export const ShowProviderFormCompose = ({ composeId }: Props) => {
Select the source of your code
- */}
diff --git a/apps/dokploy/drizzle/0031_steep_vulture.sql b/apps/dokploy/drizzle/0031_steep_vulture.sql
new file mode 100644
index 000000000..eed3d9449
--- /dev/null
+++ b/apps/dokploy/drizzle/0031_steep_vulture.sql
@@ -0,0 +1,15 @@
+DO $$ BEGIN
+ CREATE TYPE "public"."domainType" AS ENUM('compose', 'application');
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
+--> statement-breakpoint
+ALTER TABLE "domain" ALTER COLUMN "applicationId" DROP NOT NULL;--> statement-breakpoint
+ALTER TABLE "domain" ADD COLUMN "serviceName" text;--> statement-breakpoint
+ALTER TABLE "domain" ADD COLUMN "domainType" "domainType" DEFAULT 'application';--> statement-breakpoint
+ALTER TABLE "domain" ADD COLUMN "composeId" text;--> statement-breakpoint
+DO $$ BEGIN
+ ALTER TABLE "domain" ADD CONSTRAINT "domain_composeId_compose_composeId_fk" FOREIGN KEY ("composeId") REFERENCES "public"."compose"("composeId") ON DELETE cascade ON UPDATE no action;
+EXCEPTION
+ WHEN duplicate_object THEN null;
+END $$;
diff --git a/apps/dokploy/drizzle/0032_flashy_shadow_king.sql b/apps/dokploy/drizzle/0032_flashy_shadow_king.sql
new file mode 100644
index 000000000..afa5389b5
--- /dev/null
+++ b/apps/dokploy/drizzle/0032_flashy_shadow_king.sql
@@ -0,0 +1 @@
+ALTER TABLE "domain" ALTER COLUMN "port" SET DEFAULT 3000;
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0031_snapshot.json b/apps/dokploy/drizzle/meta/0031_snapshot.json
new file mode 100644
index 000000000..3330e3369
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0031_snapshot.json
@@ -0,0 +1,3071 @@
+{
+ "id": "86b27966-a431-493d-9cbc-2291e280f8f2",
+ "prevId": "8dc242b9-6fa9-4372-9ecd-86ae90dd7d0d",
+ "version": "6",
+ "dialect": "postgresql",
+ "tables": {
+ "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
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "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": "'/'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "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
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerContextPath": {
+ "name": "dockerContextPath",
+ "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
+ },
+ "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'"
+ },
+ "publishDirectory": {
+ "name": "publishDirectory",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "application_projectId_project_projectId_fk",
+ "tableFrom": "application",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_projectId_project_projectId_fk": {
+ "name": "postgres_projectId_project_projectId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "timestamp(3)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_adminId_admin_adminId_fk": {
+ "name": "user_adminId_admin_adminId_fk",
+ "tableFrom": "user",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_authId_auth_id_fk": {
+ "name": "user_authId_auth_id_fk",
+ "tableFrom": "user",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.admin": {
+ "name": "admin",
+ "schema": "",
+ "columns": {
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "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
+ },
+ "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": false
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "admin_authId_auth_id_fk": {
+ "name": "admin_authId_auth_id_fk",
+ "tableFrom": "admin",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.auth": {
+ "name": "auth",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rol": {
+ "name": "rol",
+ "type": "Roles",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "auth_email_unique": {
+ "name": "auth_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_adminId_admin_adminId_fk": {
+ "name": "project_adminId_admin_adminId_fk",
+ "tableFrom": "project",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": 80
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_projectId_project_projectId_fk": {
+ "name": "mariadb_projectId_project_projectId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_projectId_project_projectId_fk": {
+ "name": "mongo_projectId_project_projectId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_projectId_project_projectId_fk": {
+ "name": "mysql_projectId_project_projectId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "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
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "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_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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_adminId_admin_adminId_fk": {
+ "name": "destination_adminId_admin_adminId_fk",
+ "tableFrom": "destination",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ }
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_user_id_auth_id_fk": {
+ "name": "session_user_id_auth_id_fk",
+ "tableFrom": "session",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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"
+ ]
+ }
+ }
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_projectId_project_projectId_fk": {
+ "name": "redis_projectId_project_projectId_fk",
+ "tableFrom": "redis",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "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": "''"
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "compose_projectId_project_projectId_fk",
+ "tableFrom": "compose",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_adminId_admin_adminId_fk": {
+ "name": "registry_adminId_admin_adminId_fk",
+ "tableFrom": "registry",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "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
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks",
+ "static"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "drop"
+ ]
+ },
+ "public.Roles": {
+ "name": "Roles",
+ "schema": "public",
+ "values": [
+ "admin",
+ "user"
+ ]
+ },
+ "public.domainType": {
+ "name": "domainType",
+ "schema": "public",
+ "values": [
+ "compose",
+ "application"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "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.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "raw"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email"
+ ]
+ }
+ },
+ "schemas": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/apps/dokploy/drizzle/meta/0032_snapshot.json b/apps/dokploy/drizzle/meta/0032_snapshot.json
new file mode 100644
index 000000000..aed881976
--- /dev/null
+++ b/apps/dokploy/drizzle/meta/0032_snapshot.json
@@ -0,0 +1,3071 @@
+{
+ "id": "ce8a8861-2970-4889-ac2e-3cfe60d12736",
+ "prevId": "86b27966-a431-493d-9cbc-2291e280f8f2",
+ "version": "6",
+ "dialect": "postgresql",
+ "tables": {
+ "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
+ },
+ "buildArgs": {
+ "name": "buildArgs",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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
+ },
+ "refreshToken": {
+ "name": "refreshToken",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sourceType": {
+ "name": "sourceType",
+ "type": "sourceType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "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": "'/'"
+ },
+ "autoDeploy": {
+ "name": "autoDeploy",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "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
+ },
+ "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
+ },
+ "dockerfile": {
+ "name": "dockerfile",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dockerContextPath": {
+ "name": "dockerContextPath",
+ "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
+ },
+ "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'"
+ },
+ "publishDirectory": {
+ "name": "publishDirectory",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "registryId": {
+ "name": "registryId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "application_projectId_project_projectId_fk",
+ "tableFrom": "application",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "application_appName_unique": {
+ "name": "application_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "externalPort": {
+ "name": "externalPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applicationStatus": {
+ "name": "applicationStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "postgres_projectId_project_projectId_fk": {
+ "name": "postgres_projectId_project_projectId_fk",
+ "tableFrom": "postgres",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "postgres_appName_unique": {
+ "name": "postgres_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "userId": {
+ "name": "userId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "isRegistered": {
+ "name": "isRegistered",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "expirationDate": {
+ "name": "expirationDate",
+ "type": "timestamp(3)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "canAccessToTraefikFiles": {
+ "name": "canAccessToTraefikFiles",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "accesedProjects": {
+ "name": "accesedProjects",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "accesedServices": {
+ "name": "accesedServices",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "ARRAY[]::text[]"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_adminId_admin_adminId_fk": {
+ "name": "user_adminId_admin_adminId_fk",
+ "tableFrom": "user",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "user_authId_auth_id_fk": {
+ "name": "user_authId_auth_id_fk",
+ "tableFrom": "user",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.admin": {
+ "name": "admin",
+ "schema": "",
+ "columns": {
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "githubAppId": {
+ "name": "githubAppId",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "githubAppName": {
+ "name": "githubAppName",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "serverIp": {
+ "name": "serverIp",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "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
+ },
+ "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": false
+ },
+ "authId": {
+ "name": "authId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "admin_authId_auth_id_fk": {
+ "name": "admin_authId_auth_id_fk",
+ "tableFrom": "admin",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "authId"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.auth": {
+ "name": "auth",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rol": {
+ "name": "rol",
+ "type": "Roles",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "secret": {
+ "name": "secret",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is2FAEnabled": {
+ "name": "is2FAEnabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "auth_email_unique": {
+ "name": "auth_email_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "email"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "project_adminId_admin_adminId_fk": {
+ "name": "project_adminId_admin_adminId_fk",
+ "tableFrom": "project",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "certificateType": {
+ "name": "certificateType",
+ "type": "certificateType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'none'"
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mariadb_projectId_project_projectId_fk": {
+ "name": "mariadb_projectId_project_projectId_fk",
+ "tableFrom": "mariadb",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mariadb_appName_unique": {
+ "name": "mariadb_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mongo_projectId_project_projectId_fk": {
+ "name": "mongo_projectId_project_projectId_fk",
+ "tableFrom": "mongo",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mongo_appName_unique": {
+ "name": "mongo_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mysql_projectId_project_projectId_fk": {
+ "name": "mysql_projectId_project_projectId_fk",
+ "tableFrom": "mysql",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mysql_appName_unique": {
+ "name": "mysql_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "public.backup": {
+ "name": "backup",
+ "schema": "",
+ "columns": {
+ "backupId": {
+ "name": "backupId",
+ "type": "text",
+ "primaryKey": true,
+ "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
+ },
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "databaseType": {
+ "name": "databaseType",
+ "type": "databaseType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "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_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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.destination": {
+ "name": "destination",
+ "schema": "",
+ "columns": {
+ "destinationId": {
+ "name": "destinationId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "destination_adminId_admin_adminId_fk": {
+ "name": "destination_adminId_admin_adminId_fk",
+ "tableFrom": "destination",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "applicationId": {
+ "name": "applicationId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "composeId": {
+ "name": "composeId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "certificate_certificatePath_unique": {
+ "name": "certificate_certificatePath_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "certificatePath"
+ ]
+ }
+ }
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "session_user_id_auth_id_fk": {
+ "name": "session_user_id_auth_id_fk",
+ "tableFrom": "session",
+ "tableTo": "auth",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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"
+ ]
+ }
+ }
+ },
+ "public.port": {
+ "name": "port",
+ "schema": "",
+ "columns": {
+ "portId": {
+ "name": "portId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "publishedPort": {
+ "name": "publishedPort",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "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": {}
+ },
+ "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
+ },
+ "env": {
+ "name": "env",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryReservation": {
+ "name": "memoryReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memoryLimit": {
+ "name": "memoryLimit",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuReservation": {
+ "name": "cpuReservation",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cpuLimit": {
+ "name": "cpuLimit",
+ "type": "integer",
+ "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'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "redis_projectId_project_projectId_fk": {
+ "name": "redis_projectId_project_projectId_fk",
+ "tableFrom": "redis",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "redis_appName_unique": {
+ "name": "redis_appName_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "appName"
+ ]
+ }
+ }
+ },
+ "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
+ },
+ "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": "''"
+ },
+ "composePath": {
+ "name": "composePath",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'./docker-compose.yml'"
+ },
+ "composeStatus": {
+ "name": "composeStatus",
+ "type": "applicationStatus",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'idle'"
+ },
+ "projectId": {
+ "name": "projectId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "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_projectId_project_projectId_fk": {
+ "name": "compose_projectId_project_projectId_fk",
+ "tableFrom": "compose",
+ "tableTo": "project",
+ "columnsFrom": [
+ "projectId"
+ ],
+ "columnsTo": [
+ "projectId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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
+ },
+ "createdAt": {
+ "name": "createdAt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selfHosted": {
+ "name": "selfHosted",
+ "type": "RegistryType",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cloud'"
+ },
+ "adminId": {
+ "name": "adminId",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "registry_adminId_admin_adminId_fk": {
+ "name": "registry_adminId_admin_adminId_fk",
+ "tableFrom": "registry",
+ "tableTo": "admin",
+ "columnsFrom": [
+ "adminId"
+ ],
+ "columnsTo": [
+ "adminId"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.discord": {
+ "name": "discord",
+ "schema": "",
+ "columns": {
+ "discordId": {
+ "name": "discordId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "webhookUrl": {
+ "name": "webhookUrl",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ },
+ "dokployRestart": {
+ "name": "dokployRestart",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "dockerCleanup": {
+ "name": "dockerCleanup",
+ "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
+ }
+ },
+ "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"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "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": {}
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ },
+ "public.ssh-key": {
+ "name": "ssh-key",
+ "schema": "",
+ "columns": {
+ "sshKeyId": {
+ "name": "sshKeyId",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "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
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {}
+ }
+ },
+ "enums": {
+ "public.buildType": {
+ "name": "buildType",
+ "schema": "public",
+ "values": [
+ "dockerfile",
+ "heroku_buildpacks",
+ "paketo_buildpacks",
+ "nixpacks",
+ "static"
+ ]
+ },
+ "public.sourceType": {
+ "name": "sourceType",
+ "schema": "public",
+ "values": [
+ "docker",
+ "git",
+ "github",
+ "drop"
+ ]
+ },
+ "public.Roles": {
+ "name": "Roles",
+ "schema": "public",
+ "values": [
+ "admin",
+ "user"
+ ]
+ },
+ "public.domainType": {
+ "name": "domainType",
+ "schema": "public",
+ "values": [
+ "compose",
+ "application"
+ ]
+ },
+ "public.databaseType": {
+ "name": "databaseType",
+ "schema": "public",
+ "values": [
+ "postgres",
+ "mariadb",
+ "mysql",
+ "mongo"
+ ]
+ },
+ "public.deploymentStatus": {
+ "name": "deploymentStatus",
+ "schema": "public",
+ "values": [
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "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.protocolType": {
+ "name": "protocolType",
+ "schema": "public",
+ "values": [
+ "tcp",
+ "udp"
+ ]
+ },
+ "public.applicationStatus": {
+ "name": "applicationStatus",
+ "schema": "public",
+ "values": [
+ "idle",
+ "running",
+ "done",
+ "error"
+ ]
+ },
+ "public.certificateType": {
+ "name": "certificateType",
+ "schema": "public",
+ "values": [
+ "letsencrypt",
+ "none"
+ ]
+ },
+ "public.composeType": {
+ "name": "composeType",
+ "schema": "public",
+ "values": [
+ "docker-compose",
+ "stack"
+ ]
+ },
+ "public.sourceTypeCompose": {
+ "name": "sourceTypeCompose",
+ "schema": "public",
+ "values": [
+ "git",
+ "github",
+ "raw"
+ ]
+ },
+ "public.RegistryType": {
+ "name": "RegistryType",
+ "schema": "public",
+ "values": [
+ "selfHosted",
+ "cloud"
+ ]
+ },
+ "public.notificationType": {
+ "name": "notificationType",
+ "schema": "public",
+ "values": [
+ "slack",
+ "telegram",
+ "discord",
+ "email"
+ ]
+ }
+ },
+ "schemas": {},
+ "_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 89ebb4e71..5cecad09c 100644
--- a/apps/dokploy/drizzle/meta/_journal.json
+++ b/apps/dokploy/drizzle/meta/_journal.json
@@ -218,6 +218,20 @@
"when": 1723608499147,
"tag": "0030_little_kabuki",
"breakpoints": true
+ },
+ {
+ "idx": 31,
+ "version": "6",
+ "when": 1723701656243,
+ "tag": "0031_steep_vulture",
+ "breakpoints": true
+ },
+ {
+ "idx": 32,
+ "version": "6",
+ "when": 1723705257806,
+ "tag": "0032_flashy_shadow_king",
+ "breakpoints": true
}
]
}
\ No newline at end of file
diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts
index 703cfec98..2eb2905e5 100644
--- a/apps/dokploy/server/api/routers/domain.ts
+++ b/apps/dokploy/server/api/routers/domain.ts
@@ -1,6 +1,7 @@
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
import {
apiCreateDomain,
+ apiCreateTraefikMeDomain,
apiFindCompose,
apiFindDomain,
apiFindDomainByApplication,
@@ -16,7 +17,7 @@ import {
findDomainById,
findDomainsByApplicationId,
findDomainsByComposeId,
- generateDomain,
+ generateTraefikMeDomain,
generateWildcard,
removeDomainById,
updateDomainById,
@@ -47,9 +48,9 @@ export const domainRouter = createTRPCRouter({
return await findDomainsByComposeId(input.composeId);
}),
generateDomain: protectedProcedure
- .input(apiFindDomainByApplication)
+ .input(apiCreateTraefikMeDomain)
.mutation(async ({ input }) => {
- return generateDomain(input);
+ return generateTraefikMeDomain(input.appName);
}),
generateWildcard: protectedProcedure
.input(apiFindDomainByApplication)
diff --git a/apps/dokploy/server/api/services/domain.ts b/apps/dokploy/server/api/services/domain.ts
index e2bdf04b0..e3b852c6f 100644
--- a/apps/dokploy/server/api/services/domain.ts
+++ b/apps/dokploy/server/api/services/domain.ts
@@ -37,48 +37,34 @@ export const createDomain = async (input: typeof apiCreateDomain._type) => {
});
};
-export const generateDomain = async (
- input: typeof apiFindDomainByApplication._type,
-) => {
- const application = await findApplicationById(input.applicationId);
+export const generateTraefikMeDomain = async (appName: string) => {
const admin = await findAdmin();
- const domain = await createDomain({
- applicationId: application.applicationId,
- host: generateRandomDomain({
- serverIp: admin.serverIp || "",
- projectName: application.appName,
- }),
- port: 3000,
- certificateType: "none",
- https: false,
- path: "/",
+ return generateRandomDomain({
+ serverIp: admin.serverIp || "",
+ projectName: appName,
});
-
- return domain;
};
export const generateWildcard = async (
input: typeof apiFindDomainByApplication._type,
) => {
- const application = await findApplicationById(input.applicationId);
- const admin = await findAdmin();
-
- if (!admin.host) {
- throw new TRPCError({
- code: "BAD_REQUEST",
- message: "We need a host to generate a wildcard domain",
- });
- }
- const domain = await createDomain({
- applicationId: application.applicationId,
- host: generateWildcardDomain(application.appName, admin.host || ""),
- port: 3000,
- certificateType: "none",
- https: false,
- path: "/",
- });
-
- return domain;
+ // const application = await findApplicationById(input.applicationId);
+ // const admin = await findAdmin();
+ // if (!admin.host) {
+ // throw new TRPCError({
+ // code: "BAD_REQUEST",
+ // message: "We need a host to generate a wildcard domain",
+ // });
+ // }
+ // const domain = await createDomain({
+ // applicationId: application.applicationId,
+ // host: generateWildcardDomain(application.appName, admin.host || ""),
+ // port: 3000,
+ // certificateType: "none",
+ // https: false,
+ // path: "/",
+ // });
+ // return domain;
};
export const generateWildcardDomain = (
diff --git a/apps/dokploy/server/db/schema/domain.ts b/apps/dokploy/server/db/schema/domain.ts
index d89621ff9..301175fc5 100644
--- a/apps/dokploy/server/db/schema/domain.ts
+++ b/apps/dokploy/server/db/schema/domain.ts
@@ -10,6 +10,7 @@ import {
} from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";
import { nanoid } from "nanoid";
+import { z } from "zod";
import { applications } from "./application";
import { compose } from "./compose";
import { certificateType } from "./shared";
@@ -23,7 +24,7 @@ export const domains = pgTable("domain", {
.$defaultFn(() => nanoid()),
host: text("host").notNull(),
https: boolean("https").notNull().default(false),
- port: integer("port").default(80),
+ port: integer("port").default(3000),
path: text("path").default("/"),
serviceName: text("serviceName"),
domainType: domainType("domainType").default("application"),
@@ -76,6 +77,10 @@ export const apiFindDomainByApplication = createSchema.pick({
applicationId: true,
});
+export const apiCreateTraefikMeDomain = createSchema.pick({}).extend({
+ appName: z.string().min(1),
+});
+
export const apiFindDomainByCompose = createSchema.pick({
composeId: true,
});
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index 44be498f7..934d00580 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -61,9 +61,7 @@ export const addDomainToCompose = async (
const result = await loadDockerCompose(compose);
if (!result) {
- throw new Error(
- "Error to load docker compose, the file is empty or not found",
- );
+ return null;
}
for (const domain of domains) {
@@ -89,10 +87,14 @@ export const addDomainToCompose = async (
}
if (Array.isArray(result.services[serviceName].labels)) {
- result.services[serviceName].labels.push(
- "traefik.enable=true",
- ...httpLabels,
- );
+ const haveTraefikEnableLabel = result.services[
+ serviceName
+ ].labels.includes("traefik.enable=true");
+
+ if (!haveTraefikEnableLabel) {
+ result.services[serviceName].labels.push("traefik.enable=true");
+ }
+ result.services[serviceName].labels.push(...httpLabels);
}
}
From dde799f510242f522067a6a332743af9f4f502ff Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Thu, 15 Aug 2024 01:03:58 -0600
Subject: [PATCH 08/28] refactor: delete modals
---
.../application/domains/generate-domain.tsx | 79 -------------------
.../domains/generate-traefikme.tsx | 69 ----------------
.../application/domains/show-domains.tsx | 6 --
3 files changed, 154 deletions(-)
delete mode 100644 apps/dokploy/components/dashboard/application/domains/generate-domain.tsx
delete mode 100644 apps/dokploy/components/dashboard/application/domains/generate-traefikme.tsx
diff --git a/apps/dokploy/components/dashboard/application/domains/generate-domain.tsx b/apps/dokploy/components/dashboard/application/domains/generate-domain.tsx
deleted file mode 100644
index 9ebe8e30c..000000000
--- a/apps/dokploy/components/dashboard/application/domains/generate-domain.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Button } from "@/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog";
-import { api } from "@/utils/api";
-import { RefreshCcw } from "lucide-react";
-import Link from "next/link";
-import { GenerateTraefikMe } from "./generate-traefikme";
-import { GenerateWildCard } from "./generate-wildcard";
-
-interface Props {
- applicationId: string;
-}
-
-export const GenerateDomain = ({ applicationId }: Props) => {
- return (
-
-
-
- Generate Domain
-
-
-
-
-
- Generate Domain
-
- Generate Domains for your applications
-
-
-
-
-
-
-
-
- 1. Generate TraefikMe Domain
-
-
- This option generates a free domain provided by{" "}
-
- TraefikMe
-
- . We recommend using this for quick domain testing or if you
- don't have a domain yet.
-
-
-
- {/*
-
-
- 2. Use Wildcard Domain
-
-
- To use this option, you need to set up an 'A' record in your
- domain provider. For example, create a record for
- *.yourdomain.com.
-
-
- */}
-
-
-
- {/* */}
-
-
-
-
- );
-};
diff --git a/apps/dokploy/components/dashboard/application/domains/generate-traefikme.tsx b/apps/dokploy/components/dashboard/application/domains/generate-traefikme.tsx
deleted file mode 100644
index 3085b3a88..000000000
--- a/apps/dokploy/components/dashboard/application/domains/generate-traefikme.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog";
-import { Button } from "@/components/ui/button";
-import { api } from "@/utils/api";
-import { RefreshCcw } from "lucide-react";
-import React from "react";
-import { toast } from "sonner";
-
-interface Props {
- applicationId: string;
-}
-export const GenerateTraefikMe = ({ applicationId }: Props) => {
- const { mutateAsync, isLoading } = api.domain.generateDomain.useMutation();
- const utils = api.useUtils();
- return (
-
-
-
- Generate Domain
-
-
-
-
-
-
- Are you sure to generate a new domain?
-
-
- This will generate a new domain and will be used to access to the
- application
-
-
-
- Cancel
- {
- await mutateAsync({
- applicationId,
- })
- .then((data) => {
- utils.domain.byApplicationId.invalidate({
- applicationId: applicationId,
- });
- utils.application.readTraefikConfig.invalidate({
- applicationId: applicationId,
- });
- toast.success("Generated Domain succesfully");
- })
- .catch(() => {
- toast.error("Error to generate Domain");
- });
- }}
- >
- Confirm
-
-
-
-
- );
-};
diff --git a/apps/dokploy/components/dashboard/application/domains/show-domains.tsx b/apps/dokploy/components/dashboard/application/domains/show-domains.tsx
index d7724ce72..46c05f150 100644
--- a/apps/dokploy/components/dashboard/application/domains/show-domains.tsx
+++ b/apps/dokploy/components/dashboard/application/domains/show-domains.tsx
@@ -12,7 +12,6 @@ import { ExternalLink, GlobeIcon, PenBoxIcon } from "lucide-react";
import Link from "next/link";
import { AddDomain } from "./add-domain";
import { DeleteDomain } from "./delete-domain";
-import { GenerateDomain } from "./generate-domain";
interface Props {
applicationId: string;
@@ -46,9 +45,6 @@ export const ShowDomains = ({ applicationId }: Props) => {
)}
- {data && data?.length > 0 && (
-
- )}
@@ -65,8 +61,6 @@ export const ShowDomains = ({ applicationId }: Props) => {
Add Domain
-
-
) : (
From 9379d4a31d42474d283c97faa1df6a91810627c9 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Thu, 15 Aug 2024 01:25:36 -0600
Subject: [PATCH 09/28] refactor(domains): update labels
---
apps/dokploy/server/api/services/compose.ts | 1 +
apps/dokploy/server/utils/builders/compose.ts | 16 +++++++++----
apps/dokploy/server/utils/docker/domain.ts | 24 +++++++++++++++++--
3 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/apps/dokploy/server/api/services/compose.ts b/apps/dokploy/server/api/services/compose.ts
index b212a7e74..bd949bc38 100644
--- a/apps/dokploy/server/api/services/compose.ts
+++ b/apps/dokploy/server/api/services/compose.ts
@@ -91,6 +91,7 @@ export const findComposeById = async (composeId: string) => {
project: true,
deployments: true,
mounts: true,
+ domains: true,
},
});
if (!result) {
diff --git a/apps/dokploy/server/utils/builders/compose.ts b/apps/dokploy/server/utils/builders/compose.ts
index 9212cf604..4f72f46d3 100644
--- a/apps/dokploy/server/utils/builders/compose.ts
+++ b/apps/dokploy/server/utils/builders/compose.ts
@@ -8,20 +8,28 @@ import { dirname, join } from "node:path";
import { COMPOSE_PATH } from "@/server/constants";
import type { InferResultType } from "@/server/types/with";
import boxen from "boxen";
+import { writeDomainsToCompose } from "../docker/domain";
import { prepareEnvironmentVariables } from "../docker/utils";
import { spawnAsync } from "../process/spawnAsync";
export type ComposeNested = InferResultType<
"compose",
- { project: true; mounts: true }
+ { project: true; mounts: true; domains: true }
>;
export const buildCompose = async (compose: ComposeNested, logPath: string) => {
const writeStream = createWriteStream(logPath, { flags: "a" });
- const { sourceType, appName, mounts, composeType, env, composePath } =
- compose;
+ const {
+ sourceType,
+ appName,
+ mounts,
+ composeType,
+ env,
+ composePath,
+ domains,
+ } = compose;
try {
const command = createCommand(compose);
-
+ await writeDomainsToCompose(compose, domains);
createEnvFile(compose);
const logContent = `
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index 934d00580..7b1893066 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -1,4 +1,5 @@
-import fs, { existsSync, readFileSync } from "node:fs";
+import fs, { existsSync, readFileSync, writeSync } from "node:fs";
+import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import type { Compose } from "@/server/api/services/compose";
import type { Domain } from "@/server/api/services/domain";
@@ -8,6 +9,7 @@ import { cloneGitRawRepository } from "../providers/git";
import { cloneRawGithubRepository } from "../providers/github";
import { createComposeFileRaw } from "../providers/raw";
import type { ComposeSpecification } from "./types";
+
export const cloneCompose = async (compose: Compose) => {
if (compose.sourceType === "github") {
await cloneRawGithubRepository(compose);
@@ -53,6 +55,24 @@ export const readComposeFile = async (compose: Compose) => {
return null;
};
+export const writeDomainsToCompose = async (
+ compose: Compose,
+ domains: Domain[],
+) => {
+ if (!domains.length) {
+ return;
+ }
+ const composeConverted = await addDomainToCompose(compose, domains);
+
+ const path = getComposePath(compose);
+ const composeString = dump(composeConverted, { lineWidth: 1000 });
+ try {
+ await writeFile(path, composeString, "utf8");
+ } catch (error) {
+ throw error;
+ }
+};
+
export const addDomainToCompose = async (
compose: Compose,
domains: Domain[],
@@ -125,7 +145,7 @@ export const createDomainLabels = async (
const { host, port, https, uniqueConfigKey, certificateType } = domain;
const labels = [
- `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.ruleHost(\`${host}\`)`,
+ `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.rule=Host(\`${host}\`)`,
`traefik.http.services.${appName}-${uniqueConfigKey}-${entrypoint}.loadbalancer.server.port=${port}`,
`traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.entrypoints=${entrypoint}`,
];
From ca733addc24fbf116ebdb8e7b1a35f5a1bee5f4f Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 00:28:32 -0600
Subject: [PATCH 10/28] refactor: add dokploy network auutomatically
---
apps/dokploy/__test__/traefik/traefik.test.ts | 3 +
apps/dokploy/server/utils/docker/domain.ts | 57 ++++++++++++++-----
2 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/apps/dokploy/__test__/traefik/traefik.test.ts b/apps/dokploy/__test__/traefik/traefik.test.ts
index 5c490f7ce..70dbe5494 100644
--- a/apps/dokploy/__test__/traefik/traefik.test.ts
+++ b/apps/dokploy/__test__/traefik/traefik.test.ts
@@ -67,6 +67,9 @@ const baseDomain: Domain = {
https: false,
path: null,
port: null,
+ serviceName: "",
+ composeId: "",
+ domainType: "application",
uniqueConfigKey: 1,
};
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index 7b1893066..c5af6f44b 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -106,16 +106,40 @@ export const addDomainToCompose = async (
httpLabels.push(...httpsLabels);
}
- if (Array.isArray(result.services[serviceName].labels)) {
- const haveTraefikEnableLabel = result.services[
- serviceName
- ].labels.includes("traefik.enable=true");
+ const labels = result.services[serviceName].labels;
- if (!haveTraefikEnableLabel) {
- result.services[serviceName].labels.push("traefik.enable=true");
+ if (Array.isArray(labels)) {
+ if (!labels.includes("traefik.enable=true")) {
+ labels.push("traefik.enable=true");
}
- result.services[serviceName].labels.push(...httpLabels);
+ labels.push(...httpLabels);
}
+
+ // Add the dokploy-network to the service but first check if it exists
+ if (!result.services[serviceName].networks) {
+ result.services[serviceName].networks = [];
+ }
+ const networks = result.services[serviceName].networks;
+
+ if (Array.isArray(networks)) {
+ if (!networks.includes("dokploy-network")) {
+ networks.push("dokploy-network");
+ }
+ } else if (networks && typeof networks === "object") {
+ if (!("dokploy-network" in networks)) {
+ networks["dokploy-network"] = {};
+ }
+ }
+ }
+
+ // Add dokploy-network to the root of the compose file
+ if (!result.networks) {
+ result.networks = {};
+ }
+ if (!result.networks["dokploy-network"]) {
+ result.networks["dokploy-network"] = {
+ external: true,
+ };
}
return result;
@@ -143,26 +167,29 @@ export const createDomainLabels = async (
entrypoint: "web" | "websecure",
) => {
const { host, port, https, uniqueConfigKey, certificateType } = domain;
-
+ const routerName = `${appName}-${uniqueConfigKey}-${entrypoint}`;
const labels = [
- `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.rule=Host(\`${host}\`)`,
- `traefik.http.services.${appName}-${uniqueConfigKey}-${entrypoint}.loadbalancer.server.port=${port}`,
- `traefik.http.routers.${appName}-${uniqueConfigKey}-${entrypoint}.entrypoints=${entrypoint}`,
+ `traefik.http.routers.${routerName}.rule=Host(\`${host}\`)`,
+ `traefik.http.routers.${routerName}.entrypoints=${entrypoint}`,
];
+ if (entrypoint === "web") {
+ labels.push(
+ `traefik.http.services.${routerName}.loadbalancer.server.port=${port}`,
+ );
+ }
+
if (entrypoint === "web" && https) {
labels.push(
- "traefik.http.routers.redirect-to-https.middlewares=redirect-to-https",
+ `traefik.http.routers.${routerName}.middlewares=redirect-to-https@file`,
);
}
if (entrypoint === "websecure") {
if (certificateType === "letsencrypt") {
labels.push(
- "traefik.http.routers.letsencrypt.tls.certresolver=letsencrypt",
+ `traefik.http.routers.${routerName}.tls.certresolver=letsencrypt`,
);
- } else if (certificateType === "none") {
- labels.push("traefik.http.routers.letsencrypt.tls=null");
}
}
From c0261384ca841452a38b4f93cf35eafe2ec22a2a Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 00:29:05 -0600
Subject: [PATCH 11/28] refactor: update invalidation cache
---
.../dashboard/compose/general/compose-file-editor.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx
index 035d6c417..bb896e9ac 100644
--- a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx
@@ -72,7 +72,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => {
.then(async () => {
toast.success("Compose config Updated");
refetch();
- await utils.compose.allServices.invalidate({
+ await utils.compose.getConvertedCompose.invalidate({
composeId,
});
})
From 65527bc39a1e959e7186e3581ee4d6e7387a9235 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 16:10:36 -0600
Subject: [PATCH 12/28] feat: add tests for labels and networks
---
.../__test__/compose/domain/labels.test.ts | 74 ++++++++++++++++++
.../compose/domain/network-root.test.ts | 29 +++++++
.../compose/domain/network-service.test.ts | 24 ++++++
apps/dokploy/server/utils/docker/domain.ts | 75 +++++++++++++------
4 files changed, 178 insertions(+), 24 deletions(-)
create mode 100644 apps/dokploy/__test__/compose/domain/labels.test.ts
create mode 100644 apps/dokploy/__test__/compose/domain/network-root.test.ts
create mode 100644 apps/dokploy/__test__/compose/domain/network-service.test.ts
diff --git a/apps/dokploy/__test__/compose/domain/labels.test.ts b/apps/dokploy/__test__/compose/domain/labels.test.ts
new file mode 100644
index 000000000..750be2f42
--- /dev/null
+++ b/apps/dokploy/__test__/compose/domain/labels.test.ts
@@ -0,0 +1,74 @@
+import type { Domain } from "@/server/api/services/domain";
+import { createDomainLabels } from "@/server/utils/docker/domain";
+import { describe, it, expect } from "vitest";
+
+describe("createDomainLabels", () => {
+ const appName = "test-app";
+ const baseDomain: Domain = {
+ host: "example.com",
+ port: 8080,
+ https: false,
+ uniqueConfigKey: 1,
+ certificateType: "none",
+ applicationId: "",
+ composeId: "",
+ domainType: "compose",
+ serviceName: "test-app",
+ domainId: "",
+ path: "/",
+ createdAt: "",
+ };
+
+ it("should create basic labels for web entrypoint", async () => {
+ const labels = await createDomainLabels(appName, baseDomain, "web");
+
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-web.rule=Host(`example.com`)",
+ );
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-web.entrypoints=web",
+ );
+ expect(labels).toContain(
+ "traefik.http.services.test-app-1-web.loadbalancer.server.port=8080",
+ );
+ });
+
+ it("should create labels for websecure entrypoint", async () => {
+ const labels = await createDomainLabels(
+ appName,
+ { ...baseDomain, https: true },
+ "websecure",
+ );
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-websecure.rule=Host(`example.com`)",
+ );
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-websecure.entrypoints=websecure",
+ );
+ expect(labels).not.toContain(
+ "traefik.http.services.test-app-1-websecure.loadbalancer.server.port=8080",
+ );
+ });
+
+ it("should add redirect middleware for https on web entrypoint", async () => {
+ const labels = await createDomainLabels(
+ appName,
+ { ...baseDomain, https: true },
+ "web",
+ );
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-web.middlewares=redirect-to-https@file",
+ );
+ });
+
+ it("should add Let's Encrypt configuration for websecure with letsencrypt certificate", async () => {
+ const labels = await createDomainLabels(
+ appName,
+ { ...baseDomain, https: true, certificateType: "letsencrypt" },
+ "websecure",
+ );
+ expect(labels).toContain(
+ "traefik.http.routers.test-app-1-websecure.tls.certresolver=letsencrypt",
+ );
+ });
+});
diff --git a/apps/dokploy/__test__/compose/domain/network-root.test.ts b/apps/dokploy/__test__/compose/domain/network-root.test.ts
new file mode 100644
index 000000000..19a4b1923
--- /dev/null
+++ b/apps/dokploy/__test__/compose/domain/network-root.test.ts
@@ -0,0 +1,29 @@
+import { addDokployNetworkToRoot } from "@/server/utils/docker/domain";
+import { describe, it, expect } from "vitest";
+
+describe("addDokployNetworkToRoot", () => {
+ it("should create network object if networks is undefined", () => {
+ const result = addDokployNetworkToRoot(undefined);
+ expect(result).toEqual({ "dokploy-network": { external: true } });
+ });
+
+ it("should add network to an empty object", () => {
+ const result = addDokployNetworkToRoot({});
+ expect(result).toEqual({ "dokploy-network": { external: true } });
+ });
+
+ it("should not modify existing network configuration", () => {
+ const existing = { "dokploy-network": { external: false } };
+ const result = addDokployNetworkToRoot(existing);
+ expect(result).toEqual({ "dokploy-network": { external: true } });
+ });
+
+ it("should add network alongside existing networks", () => {
+ const existing = { "other-network": { external: true } };
+ const result = addDokployNetworkToRoot(existing);
+ expect(result).toEqual({
+ "other-network": { external: true },
+ "dokploy-network": { external: true },
+ });
+ });
+});
diff --git a/apps/dokploy/__test__/compose/domain/network-service.test.ts b/apps/dokploy/__test__/compose/domain/network-service.test.ts
new file mode 100644
index 000000000..e74f69455
--- /dev/null
+++ b/apps/dokploy/__test__/compose/domain/network-service.test.ts
@@ -0,0 +1,24 @@
+import { addDokployNetworkToService } from "@/server/utils/docker/domain";
+import { describe, it, expect } from "vitest";
+
+describe("addDokployNetworkToService", () => {
+ it("should add network to an empty array", () => {
+ const result = addDokployNetworkToService([]);
+ expect(result).toEqual(["dokploy-network"]);
+ });
+
+ it("should not add duplicate network to an array", () => {
+ const result = addDokployNetworkToService(["dokploy-network"]);
+ expect(result).toEqual(["dokploy-network"]);
+ });
+
+ it("should add network to an existing array with other networks", () => {
+ const result = addDokployNetworkToService(["other-network"]);
+ expect(result).toEqual(["other-network", "dokploy-network"]);
+ });
+
+ it("should add network to an object if networks is an object", () => {
+ const result = addDokployNetworkToService({ "other-network": {} });
+ expect(result).toEqual({ "other-network": {}, "dokploy-network": {} });
+ });
+});
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index c5af6f44b..f590c5b48 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -8,7 +8,11 @@ import { dump, load } from "js-yaml";
import { cloneGitRawRepository } from "../providers/git";
import { cloneRawGithubRepository } from "../providers/github";
import { createComposeFileRaw } from "../providers/raw";
-import type { ComposeSpecification } from "./types";
+import type {
+ ComposeSpecification,
+ DefinitionsService,
+ PropertiesNetworks,
+} from "./types";
export const cloneCompose = async (compose: Compose) => {
if (compose.sourceType === "github") {
@@ -115,32 +119,14 @@ export const addDomainToCompose = async (
labels.push(...httpLabels);
}
- // Add the dokploy-network to the service but first check if it exists
- if (!result.services[serviceName].networks) {
- result.services[serviceName].networks = [];
- }
- const networks = result.services[serviceName].networks;
-
- if (Array.isArray(networks)) {
- if (!networks.includes("dokploy-network")) {
- networks.push("dokploy-network");
- }
- } else if (networks && typeof networks === "object") {
- if (!("dokploy-network" in networks)) {
- networks["dokploy-network"] = {};
- }
- }
+ // Add the dokploy-network to the service
+ result.services[serviceName].networks = addDokployNetworkToService(
+ result.services[serviceName].networks,
+ );
}
// Add dokploy-network to the root of the compose file
- if (!result.networks) {
- result.networks = {};
- }
- if (!result.networks["dokploy-network"]) {
- result.networks["dokploy-network"] = {
- external: true,
- };
- }
+ result.networks = addDokployNetworkToRoot(result.networks);
return result;
};
@@ -195,3 +181,44 @@ export const createDomainLabels = async (
return labels;
};
+
+export const addDokployNetworkToService = (
+ networkService: DefinitionsService["networks"],
+) => {
+ let networks = networkService;
+ const network = "dokploy-network";
+ if (!networks) {
+ networks = [];
+ }
+
+ if (Array.isArray(networks)) {
+ if (!networks.includes(network)) {
+ networks.push(network);
+ }
+ } else if (networks && typeof networks === "object") {
+ if (!(network in networks)) {
+ networks[network] = {};
+ }
+ }
+
+ return networks;
+};
+
+export const addDokployNetworkToRoot = (
+ networkRoot: PropertiesNetworks | undefined,
+) => {
+ let networks = networkRoot;
+ const network = "dokploy-network";
+
+ if (!networks) {
+ networks = {};
+ }
+
+ if (networks[network] || !networks[network]) {
+ networks[network] = {
+ external: true,
+ };
+ }
+
+ return networks;
+};
From b7dad5e1d99f16afe11ec8c6c2fa2728ed5b5fd0 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 16:11:03 -0600
Subject: [PATCH 13/28] refactor: remove hostname validation
---
apps/dokploy/server/db/validations/domain.ts | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/apps/dokploy/server/db/validations/domain.ts b/apps/dokploy/server/db/validations/domain.ts
index 6aa0fd165..881703d6f 100644
--- a/apps/dokploy/server/db/validations/domain.ts
+++ b/apps/dokploy/server/db/validations/domain.ts
@@ -26,9 +26,7 @@ export const domain = z
export const domainCompose = z
.object({
- host: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9\.-]*\.[a-zA-Z]{2,}$/, {
- message: "Invalid hostname",
- }),
+ host: z.string().min(1, { message: "Host is required" }),
path: z.string().min(1).optional(),
port: z
.number()
From 0374165a7fcbd3db841b916f2bc77083a366a8a3 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 16:57:27 -0600
Subject: [PATCH 14/28] refactor: remove unused code
---
.../compose/general/generic/show.tsx | 6 +--
.../general/show-converted-compose.tsx | 52 +++++++++++--------
apps/dokploy/server/api/routers/domain.ts | 7 +--
apps/dokploy/server/api/services/domain.ts | 22 --------
apps/dokploy/server/utils/docker/domain.ts | 2 +-
5 files changed, 36 insertions(+), 53 deletions(-)
diff --git a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
index bcece796e..93a2d7698 100644
--- a/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/generic/show.tsx
@@ -30,10 +30,10 @@ export const ShowProviderFormCompose = ({ composeId }: Props) => {
Select the source of your code
- {/*
diff --git a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
index e0476d192..bb01badc5 100644
--- a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx
@@ -10,7 +10,7 @@ import {
DialogTrigger,
} from "@/components/ui/dialog";
import { api } from "@/utils/api";
-import { Puzzle } from "lucide-react";
+import { Puzzle, RefreshCw } from "lucide-react";
import { useState } from "react";
import { toast } from "sonner";
@@ -39,37 +39,47 @@ export const ShowConvertedCompose = ({ composeId }: Props) => {
- View Converted Compose
+ Preview Compose
Converted Compose
- See how the docker compose file will look like after adding the
- domains
+ Preview your docker-compose file with added domains. Note: At least
+ one domain must be specified for this conversion to take effect.
{isError && {error?.message} }
- {
- mutateAsync({ composeId })
- .then(() => {
- refetch();
- toast.success("Fetched source type");
- })
- .catch((err) => {
- toast.error("Error to fetch source type", {
- description: err.message,
+
+
+ {
+ mutateAsync({ composeId })
+ .then(() => {
+ refetch();
+ toast.success("Fetched source type");
+ })
+ .catch((err) => {
+ toast.error("Error to fetch source type", {
+ description: err.message,
+ });
});
- });
- }}
- >
- Fetch
-
+ }}
+ >
+ Refresh
+
+
+
-
+
diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts
index 2eb2905e5..309dd91ad 100644
--- a/apps/dokploy/server/api/routers/domain.ts
+++ b/apps/dokploy/server/api/routers/domain.ts
@@ -18,7 +18,6 @@ import {
findDomainsByApplicationId,
findDomainsByComposeId,
generateTraefikMeDomain,
- generateWildcard,
removeDomainById,
updateDomainById,
} from "../services/domain";
@@ -52,11 +51,7 @@ export const domainRouter = createTRPCRouter({
.mutation(async ({ input }) => {
return generateTraefikMeDomain(input.appName);
}),
- generateWildcard: protectedProcedure
- .input(apiFindDomainByApplication)
- .mutation(async ({ input }) => {
- return generateWildcard(input);
- }),
+
update: protectedProcedure
.input(apiUpdateDomain)
.mutation(async ({ input }) => {
diff --git a/apps/dokploy/server/api/services/domain.ts b/apps/dokploy/server/api/services/domain.ts
index e3b852c6f..53687d28b 100644
--- a/apps/dokploy/server/api/services/domain.ts
+++ b/apps/dokploy/server/api/services/domain.ts
@@ -45,28 +45,6 @@ export const generateTraefikMeDomain = async (appName: string) => {
});
};
-export const generateWildcard = async (
- input: typeof apiFindDomainByApplication._type,
-) => {
- // const application = await findApplicationById(input.applicationId);
- // const admin = await findAdmin();
- // if (!admin.host) {
- // throw new TRPCError({
- // code: "BAD_REQUEST",
- // message: "We need a host to generate a wildcard domain",
- // });
- // }
- // const domain = await createDomain({
- // applicationId: application.applicationId,
- // host: generateWildcardDomain(application.appName, admin.host || ""),
- // port: 3000,
- // certificateType: "none",
- // https: false,
- // path: "/",
- // });
- // return domain;
-};
-
export const generateWildcardDomain = (
appName: string,
serverDomain: string,
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index f590c5b48..924a9e8e2 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -84,7 +84,7 @@ export const addDomainToCompose = async (
const { appName } = compose;
const result = await loadDockerCompose(compose);
- if (!result) {
+ if (!result || domains.length === 0) {
return null;
}
From 27706eaae4335b818a56ee12a4378d662b8d5fe4 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 17:00:49 -0600
Subject: [PATCH 15/28] fix: lint
---
apps/dokploy/__test__/compose/domain/labels.test.ts | 2 +-
apps/dokploy/__test__/compose/domain/network-root.test.ts | 2 +-
apps/dokploy/__test__/compose/domain/network-service.test.ts | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/dokploy/__test__/compose/domain/labels.test.ts b/apps/dokploy/__test__/compose/domain/labels.test.ts
index 750be2f42..e2cc7bca4 100644
--- a/apps/dokploy/__test__/compose/domain/labels.test.ts
+++ b/apps/dokploy/__test__/compose/domain/labels.test.ts
@@ -1,6 +1,6 @@
import type { Domain } from "@/server/api/services/domain";
import { createDomainLabels } from "@/server/utils/docker/domain";
-import { describe, it, expect } from "vitest";
+import { describe, expect, it } from "vitest";
describe("createDomainLabels", () => {
const appName = "test-app";
diff --git a/apps/dokploy/__test__/compose/domain/network-root.test.ts b/apps/dokploy/__test__/compose/domain/network-root.test.ts
index 19a4b1923..ca8b16550 100644
--- a/apps/dokploy/__test__/compose/domain/network-root.test.ts
+++ b/apps/dokploy/__test__/compose/domain/network-root.test.ts
@@ -1,5 +1,5 @@
import { addDokployNetworkToRoot } from "@/server/utils/docker/domain";
-import { describe, it, expect } from "vitest";
+import { describe, expect, it } from "vitest";
describe("addDokployNetworkToRoot", () => {
it("should create network object if networks is undefined", () => {
diff --git a/apps/dokploy/__test__/compose/domain/network-service.test.ts b/apps/dokploy/__test__/compose/domain/network-service.test.ts
index e74f69455..18faf5645 100644
--- a/apps/dokploy/__test__/compose/domain/network-service.test.ts
+++ b/apps/dokploy/__test__/compose/domain/network-service.test.ts
@@ -1,5 +1,5 @@
import { addDokployNetworkToService } from "@/server/utils/docker/domain";
-import { describe, it, expect } from "vitest";
+import { describe, expect, it } from "vitest";
describe("addDokployNetworkToService", () => {
it("should add network to an empty array", () => {
From 3d49383c4213758081cd4d87f2f74161948d8018 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 17:03:20 -0600
Subject: [PATCH 16/28] remove
---
.../application/domains/generate-wildcard.tsx | 69 -------------------
.../compose/domains/generate-wildcard.tsx | 69 -------------------
2 files changed, 138 deletions(-)
delete mode 100644 apps/dokploy/components/dashboard/application/domains/generate-wildcard.tsx
delete mode 100644 apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
diff --git a/apps/dokploy/components/dashboard/application/domains/generate-wildcard.tsx b/apps/dokploy/components/dashboard/application/domains/generate-wildcard.tsx
deleted file mode 100644
index da4445527..000000000
--- a/apps/dokploy/components/dashboard/application/domains/generate-wildcard.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog";
-import { Button } from "@/components/ui/button";
-import { api } from "@/utils/api";
-import { SquareAsterisk } from "lucide-react";
-import React from "react";
-import { toast } from "sonner";
-
-interface Props {
- applicationId: string;
-}
-export const GenerateWildCard = ({ applicationId }: Props) => {
- const { mutateAsync, isLoading } = api.domain.generateWildcard.useMutation();
- const utils = api.useUtils();
- return (
-
-
-
- Generate Wildcard Domain
-
-
-
-
-
-
- Are you sure to generate a new wildcard domain?
-
-
- This will generate a new domain and will be used to access to the
- application
-
-
-
- Cancel
- {
- await mutateAsync({
- applicationId,
- })
- .then((data) => {
- utils.domain.byApplicationId.invalidate({
- applicationId: applicationId,
- });
- utils.application.readTraefikConfig.invalidate({
- applicationId: applicationId,
- });
- toast.success("Generated Domain succesfully");
- })
- .catch((e) => {
- toast.error(`Error to generate Domain: ${e.message}`);
- });
- }}
- >
- Confirm
-
-
-
-
- );
-};
diff --git a/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx b/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
deleted file mode 100644
index da4445527..000000000
--- a/apps/dokploy/components/dashboard/compose/domains/generate-wildcard.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog";
-import { Button } from "@/components/ui/button";
-import { api } from "@/utils/api";
-import { SquareAsterisk } from "lucide-react";
-import React from "react";
-import { toast } from "sonner";
-
-interface Props {
- applicationId: string;
-}
-export const GenerateWildCard = ({ applicationId }: Props) => {
- const { mutateAsync, isLoading } = api.domain.generateWildcard.useMutation();
- const utils = api.useUtils();
- return (
-
-
-
- Generate Wildcard Domain
-
-
-
-
-
-
- Are you sure to generate a new wildcard domain?
-
-
- This will generate a new domain and will be used to access to the
- application
-
-
-
- Cancel
- {
- await mutateAsync({
- applicationId,
- })
- .then((data) => {
- utils.domain.byApplicationId.invalidate({
- applicationId: applicationId,
- });
- utils.application.readTraefikConfig.invalidate({
- applicationId: applicationId,
- });
- toast.success("Generated Domain succesfully");
- })
- .catch((e) => {
- toast.error(`Error to generate Domain: ${e.message}`);
- });
- }}
- >
- Confirm
-
-
-
-
- );
-};
From 38c1d86e2f0f9ba9955a916f0ba7e0a9f912235a Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 21:33:23 -0600
Subject: [PATCH 17/28] refactor(domains): add services to each router
---
.../__test__/compose/domain/labels.test.ts | 63 ++++++++++++-------
apps/dokploy/server/utils/docker/domain.ts | 8 +--
2 files changed, 41 insertions(+), 30 deletions(-)
diff --git a/apps/dokploy/__test__/compose/domain/labels.test.ts b/apps/dokploy/__test__/compose/domain/labels.test.ts
index e2cc7bca4..9d5c0b52a 100644
--- a/apps/dokploy/__test__/compose/domain/labels.test.ts
+++ b/apps/dokploy/__test__/compose/domain/labels.test.ts
@@ -21,54 +21,69 @@ describe("createDomainLabels", () => {
it("should create basic labels for web entrypoint", async () => {
const labels = await createDomainLabels(appName, baseDomain, "web");
-
- expect(labels).toContain(
+ expect(labels).toEqual([
"traefik.http.routers.test-app-1-web.rule=Host(`example.com`)",
- );
- expect(labels).toContain(
"traefik.http.routers.test-app-1-web.entrypoints=web",
- );
- expect(labels).toContain(
"traefik.http.services.test-app-1-web.loadbalancer.server.port=8080",
- );
+ "traefik.http.routers.test-app-1-web.service=test-app-1-web",
+ ]);
});
it("should create labels for websecure entrypoint", async () => {
- const labels = await createDomainLabels(
- appName,
- { ...baseDomain, https: true },
- "websecure",
- );
- expect(labels).toContain(
+ const labels = await createDomainLabels(appName, baseDomain, "websecure");
+ expect(labels).toEqual([
"traefik.http.routers.test-app-1-websecure.rule=Host(`example.com`)",
- );
- expect(labels).toContain(
"traefik.http.routers.test-app-1-websecure.entrypoints=websecure",
- );
- expect(labels).not.toContain(
"traefik.http.services.test-app-1-websecure.loadbalancer.server.port=8080",
- );
+ "traefik.http.routers.test-app-1-websecure.service=test-app-1-websecure",
+ ]);
});
it("should add redirect middleware for https on web entrypoint", async () => {
- const labels = await createDomainLabels(
- appName,
- { ...baseDomain, https: true },
- "web",
- );
+ const httpsBaseDomain = { ...baseDomain, https: true };
+ const labels = await createDomainLabels(appName, httpsBaseDomain, "web");
expect(labels).toContain(
"traefik.http.routers.test-app-1-web.middlewares=redirect-to-https@file",
);
});
it("should add Let's Encrypt configuration for websecure with letsencrypt certificate", async () => {
+ const letsencryptDomain = {
+ ...baseDomain,
+ https: true,
+ certificateType: "letsencrypt" as const,
+ };
const labels = await createDomainLabels(
appName,
- { ...baseDomain, https: true, certificateType: "letsencrypt" },
+ letsencryptDomain,
"websecure",
);
expect(labels).toContain(
"traefik.http.routers.test-app-1-websecure.tls.certresolver=letsencrypt",
);
});
+
+ it("should not add Let's Encrypt configuration for non-letsencrypt certificate", async () => {
+ const nonLetsencryptDomain = {
+ ...baseDomain,
+ https: true,
+ certificateType: "none" as const,
+ };
+ const labels = await createDomainLabels(
+ appName,
+ nonLetsencryptDomain,
+ "websecure",
+ );
+ expect(labels).not.toContain(
+ "traefik.http.routers.test-app-1-websecure.tls.certresolver=letsencrypt",
+ );
+ });
+
+ it("should handle different ports correctly", async () => {
+ const customPortDomain = { ...baseDomain, port: 3000 };
+ const labels = await createDomainLabels(appName, customPortDomain, "web");
+ expect(labels).toContain(
+ "traefik.http.services.test-app-1-web.loadbalancer.server.port=3000",
+ );
+ });
});
diff --git a/apps/dokploy/server/utils/docker/domain.ts b/apps/dokploy/server/utils/docker/domain.ts
index 924a9e8e2..ab4a904bd 100644
--- a/apps/dokploy/server/utils/docker/domain.ts
+++ b/apps/dokploy/server/utils/docker/domain.ts
@@ -157,14 +157,10 @@ export const createDomainLabels = async (
const labels = [
`traefik.http.routers.${routerName}.rule=Host(\`${host}\`)`,
`traefik.http.routers.${routerName}.entrypoints=${entrypoint}`,
+ `traefik.http.services.${routerName}.loadbalancer.server.port=${port}`,
+ `traefik.http.routers.${routerName}.service=${routerName}`,
];
- if (entrypoint === "web") {
- labels.push(
- `traefik.http.services.${routerName}.loadbalancer.server.port=${port}`,
- );
- }
-
if (entrypoint === "web" && https) {
labels.push(
`traefik.http.routers.${routerName}.middlewares=redirect-to-https@file`,
From 31a66ce7988e4559bf20484bef1ff6985d433251 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 22:24:39 -0600
Subject: [PATCH 18/28] Update Dockerfile
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 13e2f4dd7..8da1db459 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -52,7 +52,7 @@ RUN curl -sSL https://nixpacks.com/install.sh -o install.sh \
&& pnpm install -g tsx
# Install buildpacks
-COPY --from=buildpacksio/pack:latest /usr/local/bin/pack /usr/local/bin/pack
+COPY --from=buildpacksio/pack:0.35.0 /usr/local/bin/pack /usr/local/bin/pack
EXPOSE 3000
CMD [ "pnpm", "start" ]
From eb62d124bd0f4885e78990ede5025276b11e36f5 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 23:34:58 -0600
Subject: [PATCH 19/28] refactor: add dialog close on submit success
---
.../application/advanced/ports/add-port.tsx | 6 +++--
.../advanced/ports/update-port.tsx | 6 +++--
.../advanced/redirects/add-redirect.tsx | 6 +++--
.../advanced/redirects/update-redirect.tsx | 6 +++--
.../advanced/security/add-security.tsx | 7 +++---
.../advanced/security/update-security.tsx | 6 +++--
.../advanced/volumes/add-volumes.tsx | 8 ++++--
.../advanced/volumes/update-volume.tsx | 25 ++++++++++++-------
.../application/update-application.tsx | 6 +++--
.../dashboard/compose/update-compose.tsx | 6 +++--
.../database/backups/update-backup.tsx | 6 +++--
.../dashboard/mongo/update-mongo.tsx | 6 +++--
.../dashboard/postgres/update-postgres.tsx | 6 +++--
.../components/dashboard/projects/update.tsx | 6 +++--
.../destination/update-destination.tsx | 6 +++--
.../notifications/update-notification.tsx | 6 +++--
16 files changed, 78 insertions(+), 40 deletions(-)
diff --git a/apps/dokploy/components/dashboard/application/advanced/ports/add-port.tsx b/apps/dokploy/components/dashboard/application/advanced/ports/add-port.tsx
index 873baa679..1b613704a 100644
--- a/apps/dokploy/components/dashboard/application/advanced/ports/add-port.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/ports/add-port.tsx
@@ -28,7 +28,7 @@ import {
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PlusIcon } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -52,6 +52,7 @@ export const AddPort = ({
applicationId,
children = ,
}: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, isLoading, error, isError } =
@@ -82,6 +83,7 @@ export const AddPort = ({
await utils.application.one.invalidate({
applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the port");
@@ -89,7 +91,7 @@ export const AddPort = ({
};
return (
-
+
{children}
diff --git a/apps/dokploy/components/dashboard/application/advanced/ports/update-port.tsx b/apps/dokploy/components/dashboard/application/advanced/ports/update-port.tsx
index 8f9d9cd7f..a068ce18c 100644
--- a/apps/dokploy/components/dashboard/application/advanced/ports/update-port.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/ports/update-port.tsx
@@ -28,7 +28,7 @@ import {
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PenBoxIcon, Pencil } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -49,6 +49,7 @@ interface Props {
}
export const UpdatePort = ({ portId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { data } = api.port.one.useQuery(
{
@@ -89,6 +90,7 @@ export const UpdatePort = ({ portId }: Props) => {
await utils.application.one.invalidate({
applicationId: response?.applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the port");
@@ -96,7 +98,7 @@ export const UpdatePort = ({ portId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx b/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx
index 661990a97..efe1b9ac0 100644
--- a/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx
@@ -23,7 +23,7 @@ import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PlusIcon } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -45,6 +45,7 @@ export const AddRedirect = ({
applicationId,
children = ,
}: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, isLoading, error, isError } =
@@ -80,6 +81,7 @@ export const AddRedirect = ({
await utils.application.readTraefikConfig.invalidate({
applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the redirect");
@@ -87,7 +89,7 @@ export const AddRedirect = ({
};
return (
-
+
{children}
diff --git a/apps/dokploy/components/dashboard/application/advanced/redirects/update-redirect.tsx b/apps/dokploy/components/dashboard/application/advanced/redirects/update-redirect.tsx
index 855f5c8c0..52ff310d2 100644
--- a/apps/dokploy/components/dashboard/application/advanced/redirects/update-redirect.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/redirects/update-redirect.tsx
@@ -23,7 +23,7 @@ import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PenBoxIcon, Pencil } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -41,6 +41,7 @@ interface Props {
export const UpdateRedirect = ({ redirectId }: Props) => {
const utils = api.useUtils();
+ const [isOpen, setIsOpen] = useState(false);
const { data } = api.redirects.one.useQuery(
{
redirectId,
@@ -84,6 +85,7 @@ export const UpdateRedirect = ({ redirectId }: Props) => {
await utils.application.one.invalidate({
applicationId: response?.applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the redirect");
@@ -91,7 +93,7 @@ export const UpdateRedirect = ({ redirectId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/application/advanced/security/add-security.tsx b/apps/dokploy/components/dashboard/application/advanced/security/add-security.tsx
index 64dfd57ab..aeaebb923 100644
--- a/apps/dokploy/components/dashboard/application/advanced/security/add-security.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/security/add-security.tsx
@@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PlusIcon } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -43,7 +43,7 @@ export const AddSecurity = ({
children = ,
}: Props) => {
const utils = api.useUtils();
-
+ const [isOpen, setIsOpen] = useState(false);
const { mutateAsync, isLoading, error, isError } =
api.security.create.useMutation();
@@ -72,6 +72,7 @@ export const AddSecurity = ({
await utils.application.readTraefikConfig.invalidate({
applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the security");
@@ -79,7 +80,7 @@ export const AddSecurity = ({
};
return (
-
+
{children}
diff --git a/apps/dokploy/components/dashboard/application/advanced/security/update-security.tsx b/apps/dokploy/components/dashboard/application/advanced/security/update-security.tsx
index bb6e59aeb..1e5af95ff 100644
--- a/apps/dokploy/components/dashboard/application/advanced/security/update-security.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/security/update-security.tsx
@@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PenBoxIcon, Pencil } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -38,6 +38,7 @@ interface Props {
}
export const UpdateSecurity = ({ securityId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { data } = api.security.one.useQuery(
{
@@ -79,6 +80,7 @@ export const UpdateSecurity = ({ securityId }: Props) => {
await utils.application.one.invalidate({
applicationId: response?.applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the security");
@@ -86,7 +88,7 @@ export const UpdateSecurity = ({ securityId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/application/advanced/volumes/add-volumes.tsx b/apps/dokploy/components/dashboard/application/advanced/volumes/add-volumes.tsx
index e32ad7560..d9dc16e70 100644
--- a/apps/dokploy/components/dashboard/application/advanced/volumes/add-volumes.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/volumes/add-volumes.tsx
@@ -24,7 +24,7 @@ import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { PlusIcon } from "lucide-react";
import type React from "react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -77,6 +77,7 @@ export const AddVolumes = ({
refetch,
children = ,
}: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const { mutateAsync } = api.mounts.create.useMutation();
const form = useForm({
defaultValues: {
@@ -103,6 +104,7 @@ export const AddVolumes = ({
})
.then(() => {
toast.success("Mount Created");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the Bind mount");
@@ -117,6 +119,7 @@ export const AddVolumes = ({
})
.then(() => {
toast.success("Mount Created");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the Volume mount");
@@ -132,6 +135,7 @@ export const AddVolumes = ({
})
.then(() => {
toast.success("Mount Created");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to create the File mount");
@@ -142,7 +146,7 @@ export const AddVolumes = ({
};
return (
-
+
{children}
diff --git a/apps/dokploy/components/dashboard/application/advanced/volumes/update-volume.tsx b/apps/dokploy/components/dashboard/application/advanced/volumes/update-volume.tsx
index 4bb6851c2..2d847fbe2 100644
--- a/apps/dokploy/components/dashboard/application/advanced/volumes/update-volume.tsx
+++ b/apps/dokploy/components/dashboard/application/advanced/volumes/update-volume.tsx
@@ -2,6 +2,7 @@ import { AlertBlock } from "@/components/shared/alert-block";
import { Button } from "@/components/ui/button";
import {
Dialog,
+ DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
@@ -22,7 +23,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { Pencil } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -76,6 +77,7 @@ export const UpdateVolume = ({
refetch,
serviceType,
}: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { data } = api.mounts.one.useQuery(
{
@@ -135,6 +137,7 @@ export const UpdateVolume = ({
})
.then(() => {
toast.success("Mount Update");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the Bind mount");
@@ -148,6 +151,7 @@ export const UpdateVolume = ({
})
.then(() => {
toast.success("Mount Update");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the Volume mount");
@@ -162,6 +166,7 @@ export const UpdateVolume = ({
})
.then(() => {
toast.success("Mount Update");
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the File mount");
@@ -171,7 +176,7 @@ export const UpdateVolume = ({
};
return (
-
+
@@ -291,13 +296,15 @@ export const UpdateVolume = ({
)}
-
- Update
-
+
+
+ Update
+
+
diff --git a/apps/dokploy/components/dashboard/application/update-application.tsx b/apps/dokploy/components/dashboard/application/update-application.tsx
index a769804da..f40a00203 100644
--- a/apps/dokploy/components/dashboard/application/update-application.tsx
+++ b/apps/dokploy/components/dashboard/application/update-application.tsx
@@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { AlertTriangle, SquarePen } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -41,6 +41,7 @@ interface Props {
}
export const UpdateApplication = ({ applicationId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, error, isError, isLoading } =
api.application.update.useMutation();
@@ -79,6 +80,7 @@ export const UpdateApplication = ({ applicationId }: Props) => {
utils.application.one.invalidate({
applicationId: applicationId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the application");
@@ -87,7 +89,7 @@ export const UpdateApplication = ({ applicationId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/compose/update-compose.tsx b/apps/dokploy/components/dashboard/compose/update-compose.tsx
index 391801792..5991c03da 100644
--- a/apps/dokploy/components/dashboard/compose/update-compose.tsx
+++ b/apps/dokploy/components/dashboard/compose/update-compose.tsx
@@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { SquarePen } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -41,6 +41,7 @@ interface Props {
}
export const UpdateCompose = ({ composeId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, error, isError, isLoading } =
api.compose.update.useMutation();
@@ -79,6 +80,7 @@ export const UpdateCompose = ({ composeId }: Props) => {
utils.compose.one.invalidate({
composeId: composeId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the Compose");
@@ -87,7 +89,7 @@ export const UpdateCompose = ({ composeId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/database/backups/update-backup.tsx b/apps/dokploy/components/dashboard/database/backups/update-backup.tsx
index b18a663de..7cde1e0e7 100644
--- a/apps/dokploy/components/dashboard/database/backups/update-backup.tsx
+++ b/apps/dokploy/components/dashboard/database/backups/update-backup.tsx
@@ -36,7 +36,7 @@ import { cn } from "@/lib/utils";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { CheckIcon, ChevronsUpDown, PenBoxIcon, Pencil } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -57,6 +57,7 @@ interface Props {
}
export const UpdateBackup = ({ backupId, refetch }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const { data, isLoading } = api.destination.all.useQuery();
const { data: backup } = api.backup.one.useQuery(
{
@@ -105,6 +106,7 @@ export const UpdateBackup = ({ backupId, refetch }: Props) => {
.then(async () => {
toast.success("Backup Updated");
refetch();
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the backup");
@@ -112,7 +114,7 @@ export const UpdateBackup = ({ backupId, refetch }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/mongo/update-mongo.tsx b/apps/dokploy/components/dashboard/mongo/update-mongo.tsx
index 3b7ec5a70..fdfd26397 100644
--- a/apps/dokploy/components/dashboard/mongo/update-mongo.tsx
+++ b/apps/dokploy/components/dashboard/mongo/update-mongo.tsx
@@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { AlertTriangle, SquarePen } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -41,6 +41,7 @@ interface Props {
}
export const UpdateMongo = ({ mongoId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, error, isError, isLoading } =
api.mongo.update.useMutation();
@@ -79,6 +80,7 @@ export const UpdateMongo = ({ mongoId }: Props) => {
utils.mongo.one.invalidate({
mongoId: mongoId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update mongo database");
@@ -87,7 +89,7 @@ export const UpdateMongo = ({ mongoId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx
index 95bfed6ad..dcc3e9b12 100644
--- a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx
+++ b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx
@@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { AlertTriangle, SquarePen } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -41,6 +41,7 @@ interface Props {
}
export const UpdatePostgres = ({ postgresId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, error, isError, isLoading } =
api.postgres.update.useMutation();
@@ -79,6 +80,7 @@ export const UpdatePostgres = ({ postgresId }: Props) => {
utils.postgres.one.invalidate({
postgresId: postgresId,
});
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the postgres");
@@ -87,7 +89,7 @@ export const UpdatePostgres = ({ postgresId }: Props) => {
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/projects/update.tsx b/apps/dokploy/components/dashboard/projects/update.tsx
index a7fe22c10..06a6c200b 100644
--- a/apps/dokploy/components/dashboard/projects/update.tsx
+++ b/apps/dokploy/components/dashboard/projects/update.tsx
@@ -23,7 +23,7 @@ import { Textarea } from "@/components/ui/textarea";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { AlertTriangle, SquarePen } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
import { z } from "zod";
@@ -42,6 +42,7 @@ interface Props {
}
export const UpdateProject = ({ projectId }: Props) => {
+ const [isOpen, setIsOpen] = useState(false);
const utils = api.useUtils();
const { mutateAsync, error, isError } = api.project.update.useMutation();
const { data } = api.project.one.useQuery(
@@ -77,6 +78,7 @@ export const UpdateProject = ({ projectId }: Props) => {
.then(() => {
toast.success("Project updated succesfully");
utils.project.all.invalidate();
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the project");
@@ -85,7 +87,7 @@ export const UpdateProject = ({ projectId }: Props) => {
};
return (
-
+
{
const utils = api.useUtils();
+ const [isOpen, setIsOpen] = useState(false);
const { data, refetch } = api.destination.one.useQuery(
{
destinationId,
@@ -93,13 +94,14 @@ export const UpdateDestination = ({ destinationId }: Props) => {
toast.success("Destination Updated");
await refetch();
await utils.destination.all.invalidate();
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update the Destination");
});
};
return (
-
+
diff --git a/apps/dokploy/components/dashboard/settings/notifications/update-notification.tsx b/apps/dokploy/components/dashboard/settings/notifications/update-notification.tsx
index 04d62872f..00119d426 100644
--- a/apps/dokploy/components/dashboard/settings/notifications/update-notification.tsx
+++ b/apps/dokploy/components/dashboard/settings/notifications/update-notification.tsx
@@ -27,7 +27,7 @@ import { Switch } from "@/components/ui/switch";
import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod";
import { Mail, PenBoxIcon } from "lucide-react";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import { FieldErrors, useFieldArray, useForm } from "react-hook-form";
import { toast } from "sonner";
import {
@@ -41,6 +41,7 @@ interface Props {
export const UpdateNotification = ({ notificationId }: Props) => {
const utils = api.useUtils();
+ const [isOpen, setIsOpen] = useState(false);
const { data, refetch } = api.notification.one.useQuery(
{
notificationId,
@@ -207,6 +208,7 @@ export const UpdateNotification = ({ notificationId }: Props) => {
toast.success("Notification Updated");
await utils.notification.all.invalidate();
refetch();
+ setIsOpen(false);
})
.catch(() => {
toast.error("Error to update a notification");
@@ -214,7 +216,7 @@ export const UpdateNotification = ({ notificationId }: Props) => {
}
};
return (
-
+
From 38a75b07fb0ba861e434962493e3f40da342751f Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sat, 17 Aug 2024 23:53:36 -0600
Subject: [PATCH 20/28] chore(version): bump version
---
apps/dokploy/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json
index b589ffde4..ecc0ff816 100644
--- a/apps/dokploy/package.json
+++ b/apps/dokploy/package.json
@@ -1,6 +1,6 @@
{
"name": "dokploy",
- "version": "v0.6.3",
+ "version": "v0.7.0",
"private": true,
"license": "Apache-2.0",
"type": "module",
From 9d6f2df25a1f73e6eb49d576a65197610924ae8b Mon Sep 17 00:00:00 2001
From: Erick Luis
Date: Sun, 18 Aug 2024 22:18:45 +0000
Subject: [PATCH 21/28] fix: wrong Docker version in Add Node commands
---
.../cluster/nodes/manager/add-manager.tsx | 8 ++++----
.../cluster/nodes/workers/add-worker.tsx | 8 ++++----
apps/dokploy/server/api/routers/cluster.ts | 20 +++++++++++++------
3 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
index f0b9a7736..b4c25c880 100644
--- a/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
+++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
@@ -23,12 +23,12 @@ export const AddManager = () => {
1. Go to your new server and run the following command
- curl https://get.docker.com | sh -s -- --version 24.0
+ curl https://get.docker.com | sh -s -- --version {data?.version}
{
- copy("curl https://get.docker.com | sh -s -- --version 24.0");
+ copy(`curl https://get.docker.com | sh -s -- --version ${data?.version}`);
toast.success("Copied to clipboard");
}}
>
@@ -43,12 +43,12 @@ export const AddManager = () => {
cluster
- {data}
+ {data?.command}
{
- copy(data || "");
+ copy(data?.command || "");
toast.success("Copied to clipboard");
}}
>
diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
index 9cca90e45..029b2c5fb 100644
--- a/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
+++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
@@ -22,12 +22,12 @@ export const AddWorker = () => {
1. Go to your new server and run the following command
- curl https://get.docker.com | sh -s -- --version 24.0
+ curl https://get.docker.com | sh -s -- --version {data?.version}
{
- copy("curl https://get.docker.com | sh -s -- --version 24.0");
+ copy(`curl https://get.docker.com | sh -s -- --version ${data?.version}`);
toast.success("Copied to clipboard");
}}
>
@@ -42,12 +42,12 @@ export const AddWorker = () => {
- {data}
+ {data?.command}
{
- copy(data || "");
+ copy(data?.command || "");
toast.success("Copied to clipboard");
}}
>
diff --git a/apps/dokploy/server/api/routers/cluster.ts b/apps/dokploy/server/api/routers/cluster.ts
index 6bd71ca9f..c0b3cb12f 100644
--- a/apps/dokploy/server/api/routers/cluster.ts
+++ b/apps/dokploy/server/api/routers/cluster.ts
@@ -35,14 +35,22 @@ export const clusterRouter = createTRPCRouter({
}),
addWorker: protectedProcedure.query(async ({ input }) => {
const result = await docker.swarmInspect();
- return `docker swarm join --token ${
- result.JoinTokens.Worker
- } ${await getPublicIpWithFallback()}:2377`;
+ const docker_version = await docker.version();
+
+ return {
+ command: `docker swarm join --token ${result.JoinTokens.Worker
+ } ${await getPublicIpWithFallback()}:2377`,
+ version: docker_version.Version,
+ };
}),
addManager: protectedProcedure.query(async ({ input }) => {
const result = await docker.swarmInspect();
- return `docker swarm join --token ${
- result.JoinTokens.Manager
- } ${await getPublicIpWithFallback()}:2377`;
+ const docker_version = await docker.version();
+ return {
+ command: `docker swarm join --token ${result.JoinTokens.Manager
+ } ${await getPublicIpWithFallback()}:2377`,
+ version: docker_version.Version,
+ }
+ ;
}),
});
From 68b81cb48d883ce9cc9db9b9475109300f022d52 Mon Sep 17 00:00:00 2001
From: Erick Luis
Date: Sun, 18 Aug 2024 22:40:05 +0000
Subject: [PATCH 22/28] pnpm run check
---
.../settings/cluster/nodes/manager/add-manager.tsx | 4 +++-
.../settings/cluster/nodes/workers/add-worker.tsx | 4 +++-
apps/dokploy/server/api/routers/cluster.ts | 13 +++++++------
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
index b4c25c880..d6bce4591 100644
--- a/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
+++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx
@@ -28,7 +28,9 @@ export const AddManager = () => {
type="button"
className="self-center"
onClick={() => {
- copy(`curl https://get.docker.com | sh -s -- --version ${data?.version}`);
+ copy(
+ `curl https://get.docker.com | sh -s -- --version ${data?.version}`,
+ );
toast.success("Copied to clipboard");
}}
>
diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
index 029b2c5fb..50750f7e2 100644
--- a/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
+++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx
@@ -27,7 +27,9 @@ export const AddWorker = () => {
type="button"
className="self-center"
onClick={() => {
- copy(`curl https://get.docker.com | sh -s -- --version ${data?.version}`);
+ copy(
+ `curl https://get.docker.com | sh -s -- --version ${data?.version}`,
+ );
toast.success("Copied to clipboard");
}}
>
diff --git a/apps/dokploy/server/api/routers/cluster.ts b/apps/dokploy/server/api/routers/cluster.ts
index c0b3cb12f..7294c9029 100644
--- a/apps/dokploy/server/api/routers/cluster.ts
+++ b/apps/dokploy/server/api/routers/cluster.ts
@@ -38,8 +38,9 @@ export const clusterRouter = createTRPCRouter({
const docker_version = await docker.version();
return {
- command: `docker swarm join --token ${result.JoinTokens.Worker
- } ${await getPublicIpWithFallback()}:2377`,
+ command: `docker swarm join --token ${
+ result.JoinTokens.Worker
+ } ${await getPublicIpWithFallback()}:2377`,
version: docker_version.Version,
};
}),
@@ -47,10 +48,10 @@ export const clusterRouter = createTRPCRouter({
const result = await docker.swarmInspect();
const docker_version = await docker.version();
return {
- command: `docker swarm join --token ${result.JoinTokens.Manager
- } ${await getPublicIpWithFallback()}:2377`,
+ command: `docker swarm join --token ${
+ result.JoinTokens.Manager
+ } ${await getPublicIpWithFallback()}:2377`,
version: docker_version.Version,
- }
- ;
+ };
}),
});
From 2d3b903edcab57b059d7c032f236006219b7dda6 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 19:47:19 -0600
Subject: [PATCH 23/28] refactor(templates): use domains tab instead of envs
---
apps/dokploy/server/api/routers/compose.ts | 17 +++++++++---
.../templates/appsmith/docker-compose.yml | 12 ---------
apps/dokploy/templates/appsmith/index.ts | 15 ++++++-----
.../templates/baserow/docker-compose.yml | 12 ---------
apps/dokploy/templates/baserow/index.ts | 18 ++++++++-----
.../templates/calcom/docker-compose.yml | 10 -------
apps/dokploy/templates/calcom/index.ts | 19 +++++++++-----
.../templates/directus/docker-compose.yml | 9 -------
apps/dokploy/templates/directus/index.ts | 16 ++++++------
.../templates/documenso/docker-compose.yml | 10 -------
apps/dokploy/templates/documenso/index.ts | 18 ++++++++-----
.../templates/doublezero/docker-compose.yml | 14 +---------
apps/dokploy/templates/doublezero/index.ts | 17 ++++++++----
.../templates/excalidraw/docker-compose.yml | 12 +--------
apps/dokploy/templates/excalidraw/index.ts | 17 +++++++-----
.../templates/ghost/docker-compose.yml | 14 +---------
apps/dokploy/templates/ghost/index.ts | 17 +++++++-----
.../templates/glitchtip/docker-compose.yml | 26 +++++--------------
apps/dokploy/templates/glitchtip/index.ts | 17 ++++++++----
.../templates/grafana/docker-compose.yml | 13 +---------
apps/dokploy/templates/grafana/index.ts | 17 ++++++------
.../templates/jellyfin/docker-compose.yml | 17 +++---------
apps/dokploy/templates/jellyfin/index.ts | 19 ++++++++------
.../templates/listmonk/docker-compose.yml | 12 ---------
apps/dokploy/templates/listmonk/index.ts | 15 +++++++----
.../templates/meilisearch/docker-compose.yml | 13 +---------
apps/dokploy/templates/meilisearch/index.ts | 20 +++++++-------
.../templates/metabase/docker-compose.yml | 12 ---------
apps/dokploy/templates/metabase/index.ts | 16 +++++++-----
.../templates/minio/docker-compose.yml | 20 +-------------
apps/dokploy/templates/minio/index.ts | 25 +++++++++++-------
apps/dokploy/templates/n8n/docker-compose.yml | 15 ++---------
apps/dokploy/templates/n8n/index.ts | 17 ++++++++----
.../templates/nocodb/docker-compose.yml | 20 +++-----------
apps/dokploy/templates/nocodb/index.ts | 18 +++++++------
.../dokploy/templates/odoo/docker-compose.yml | 12 ---------
apps/dokploy/templates/odoo/index.ts | 16 +++++++-----
.../templates/open-webui/docker-compose.yml | 17 +++---------
apps/dokploy/templates/open-webui/index.ts | 18 +++++++------
.../templates/phpmyadmin/docker-compose.yml | 14 +---------
apps/dokploy/templates/phpmyadmin/index.ts | 17 +++++++-----
.../templates/plausible/docker-compose.yml | 12 ---------
apps/dokploy/templates/plausible/index.ts | 19 +++++++++-----
.../templates/pocketbase/docker-compose.yml | 12 ---------
apps/dokploy/templates/pocketbase/index.ts | 17 ++++++------
.../templates/rocketchat/docker-compose.yml | 17 ++----------
apps/dokploy/templates/rocketchat/index.ts | 18 ++++++++-----
.../templates/teable/docker-compose.yml | 12 ---------
apps/dokploy/templates/teable/index.ts | 18 ++++++++-----
.../templates/umami/docker-compose.yml | 11 --------
apps/dokploy/templates/umami/index.ts | 17 +++++++-----
.../templates/uptime-kuma/docker-compose.yml | 11 --------
apps/dokploy/templates/uptime-kuma/index.ts | 16 +++++++-----
apps/dokploy/templates/utils/index.ts | 6 ++++-
.../templates/wordpress/docker-compose.yml | 14 +---------
apps/dokploy/templates/wordpress/index.ts | 16 +++++++-----
56 files changed, 333 insertions(+), 536 deletions(-)
diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts
index d109c2a46..fff95bbd5 100644
--- a/apps/dokploy/server/api/routers/compose.ts
+++ b/apps/dokploy/server/api/routers/compose.ts
@@ -41,7 +41,7 @@ import {
updateCompose,
} from "../services/compose";
import { removeDeploymentsByComposeId } from "../services/deployment";
-import { findDomainsByComposeId } from "../services/domain";
+import { createDomain, findDomainsByComposeId } from "../services/domain";
import { createMount } from "../services/mount";
import { findProjectById } from "../services/project";
import { addNewService, checkServiceAccess } from "../services/user";
@@ -236,7 +236,7 @@ export const composeRouter = createTRPCRouter({
const project = await findProjectById(input.projectId);
const projectName = slugify(`${project.name} ${input.id}`);
- const { envs, mounts } = generate({
+ const { envs, mounts, domains } = generate({
serverIp: admin.serverIp,
projectName: projectName,
});
@@ -244,7 +244,7 @@ export const composeRouter = createTRPCRouter({
const compose = await createComposeByTemplate({
...input,
composeFile: composeFile,
- env: envs.join("\n"),
+ env: envs?.join("\n"),
name: input.id,
sourceType: "raw",
appName: `${projectName}-${generatePassword(6)}`,
@@ -267,6 +267,17 @@ export const composeRouter = createTRPCRouter({
}
}
+ if (domains && domains?.length > 0) {
+ for (const domain of domains) {
+ await createDomain({
+ ...domain,
+ domainType: "compose",
+ certificateType: "none",
+ composeId: compose.composeId,
+ });
+ }
+ }
+
return null;
}),
diff --git a/apps/dokploy/templates/appsmith/docker-compose.yml b/apps/dokploy/templates/appsmith/docker-compose.yml
index ad07a709b..f520ee362 100644
--- a/apps/dokploy/templates/appsmith/docker-compose.yml
+++ b/apps/dokploy/templates/appsmith/docker-compose.yml
@@ -2,17 +2,5 @@ version: "3.8"
services:
appsmith:
image: index.docker.io/appsmith/appsmith-ee:v1.29
- networks:
- - dokploy-network
- ports:
- - ${APP_SMITH_PORT}
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${APP_SMITH_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${APP_SMITH_PORT}"
volumes:
- ../files/stacks:/appsmith-stacks
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/appsmith/index.ts b/apps/dokploy/templates/appsmith/index.ts
index 8da281323..ff744a249 100644
--- a/apps/dokploy/templates/appsmith/index.ts
+++ b/apps/dokploy/templates/appsmith/index.ts
@@ -1,4 +1,5 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateHash,
@@ -7,14 +8,16 @@ import {
export function generate(schema: Schema): Template {
const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `APP_SMITH_HOST=${randomDomain}`,
- "APP_SMITH_PORT=80",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: generateRandomDomain(schema),
+ port: 80,
+ serviceName: "appsmith",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/baserow/docker-compose.yml b/apps/dokploy/templates/baserow/docker-compose.yml
index ffb3e8ad8..db588e83a 100644
--- a/apps/dokploy/templates/baserow/docker-compose.yml
+++ b/apps/dokploy/templates/baserow/docker-compose.yml
@@ -2,21 +2,9 @@ version: "3.8"
services:
baserow:
image: baserow/baserow:1.25.2
- networks:
- - dokploy-network
environment:
BASEROW_PUBLIC_URL: "http://${BASEROW_HOST}"
- ports:
- - ${BASEROW_PORT}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${BASEROW_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${BASEROW_PORT}
volumes:
- baserow_data:/baserow/data
volumes:
baserow_data:
-
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/baserow/index.ts b/apps/dokploy/templates/baserow/index.ts
index a0a387198..fa57417cc 100644
--- a/apps/dokploy/templates/baserow/index.ts
+++ b/apps/dokploy/templates/baserow/index.ts
@@ -1,20 +1,24 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `BASEROW_HOST=${randomDomain}`,
- "BASEROW_PORT=80",
- `HASH=${mainServiceHash}`,
+ const mainHost = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainHost,
+ port: 80,
+ serviceName: "baserow",
+ },
];
+ const envs = [`BASEROW_HOST=${mainHost}`];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/calcom/docker-compose.yml b/apps/dokploy/templates/calcom/docker-compose.yml
index 1afb2db87..7a1d8c92a 100644
--- a/apps/dokploy/templates/calcom/docker-compose.yml
+++ b/apps/dokploy/templates/calcom/docker-compose.yml
@@ -21,16 +21,6 @@ services:
- DATABASE_URL=postgres://postgres:password@postgres:5432/db
- NEXT_PUBLIC_WEBAPP_URL=http://${CALCOM_HOST}
- NEXTAUTH_URL=http://${CALCOM_HOST}/api/auth
- networks:
- - dokploy-network
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${CALCOM_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${CALCOM_PORT}"
-
-networks:
- dokploy-network:
- external: true
volumes:
calcom-data:
diff --git a/apps/dokploy/templates/calcom/index.ts b/apps/dokploy/templates/calcom/index.ts
index 61c590bf1..d359e9c7c 100644
--- a/apps/dokploy/templates/calcom/index.ts
+++ b/apps/dokploy/templates/calcom/index.ts
@@ -1,27 +1,32 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
-// https://cal.com/
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const calcomEncryptionKey = generateBase64(32);
const nextAuthSecret = generateBase64(32);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 3000,
+ serviceName: "calcom",
+ },
+ ];
+
const envs = [
- `CALCOM_HOST=${randomDomain}`,
- "CALCOM_PORT=3000",
- `HASH=${mainServiceHash}`,
+ `CALCOM_HOST=${mainDomain}`,
`NEXTAUTH_SECRET=${nextAuthSecret}`,
`CALENDSO_ENCRYPTION_KEY=${calcomEncryptionKey}`,
];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/directus/docker-compose.yml b/apps/dokploy/templates/directus/docker-compose.yml
index 08a5db45f..6f058ba61 100644
--- a/apps/dokploy/templates/directus/docker-compose.yml
+++ b/apps/dokploy/templates/directus/docker-compose.yml
@@ -18,8 +18,6 @@ services:
directus:
image: directus/directus:10.12.1
- networks:
- - dokploy-network
ports:
- 8055
volumes:
@@ -28,10 +26,6 @@ services:
depends_on:
- cache
- database
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${DIRECTUS_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${DIRECTUS_PORT}
environment:
SECRET: "replace-with-secure-random-value"
@@ -49,8 +43,5 @@ services:
ADMIN_EMAIL: "admin@example.com"
ADMIN_PASSWORD: "d1r3ctu5"
-networks:
- dokploy-network:
- external: true
volumes:
directus:
diff --git a/apps/dokploy/templates/directus/index.ts b/apps/dokploy/templates/directus/index.ts
index 94bedbb1c..42a05aee0 100644
--- a/apps/dokploy/templates/directus/index.ts
+++ b/apps/dokploy/templates/directus/index.ts
@@ -1,20 +1,20 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `DIRECTUS_HOST=${randomDomain}`,
- "DIRECTUS_PORT=8055",
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: generateRandomDomain(schema),
+ port: 8055,
+ serviceName: "directus",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/documenso/docker-compose.yml b/apps/dokploy/templates/documenso/docker-compose.yml
index f411cfbb4..a649fa757 100644
--- a/apps/dokploy/templates/documenso/docker-compose.yml
+++ b/apps/dokploy/templates/documenso/docker-compose.yml
@@ -19,8 +19,6 @@ services:
documenso:
image: documenso/documenso:1.5.6-rc.2
- networks:
- - dokploy-network
depends_on:
postgres:
condition: service_healthy
@@ -38,16 +36,8 @@ services:
- NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=/opt/documenso/cert.p12
ports:
- ${DOCUMENSO_PORT}
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${DOCUMENSO_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${DOCUMENSO_PORT}"
volumes:
- /opt/documenso/cert.p12:/opt/documenso/cert.p12
-networks:
- dokploy-network:
- external: true
-
volumes:
documenso-data:
diff --git a/apps/dokploy/templates/documenso/index.ts b/apps/dokploy/templates/documenso/index.ts
index 67afd596d..c70d1db4a 100644
--- a/apps/dokploy/templates/documenso/index.ts
+++ b/apps/dokploy/templates/documenso/index.ts
@@ -1,24 +1,29 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
-
+ const mainDomain = generateRandomDomain(schema);
const nextAuthSecret = generateBase64(32);
const documensoEncryptionKey = generatePassword(32);
const documensoSecondaryEncryptionKey = generatePassword(64);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 3000,
+ serviceName: "documenso",
+ },
+ ];
+
const envs = [
- `DOCUMENSO_HOST=${randomDomain}`,
+ `DOCUMENSO_HOST=${mainDomain}`,
"DOCUMENSO_PORT=3000",
- `HASH=${mainServiceHash}`,
`NEXTAUTH_SECRET=${nextAuthSecret}`,
`NEXT_PRIVATE_ENCRYPTION_KEY=${documensoEncryptionKey}`,
`NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${documensoSecondaryEncryptionKey}`,
@@ -26,5 +31,6 @@ export function generate(schema: Schema): Template {
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/doublezero/docker-compose.yml b/apps/dokploy/templates/doublezero/docker-compose.yml
index bb7b1d2b3..352470334 100644
--- a/apps/dokploy/templates/doublezero/docker-compose.yml
+++ b/apps/dokploy/templates/doublezero/docker-compose.yml
@@ -2,10 +2,6 @@ services:
doublezero:
restart: always
image: liltechnomancer/double-zero:0.2.1
- ports:
- - ${DOUBLEZERO_PORT}
- networks:
- - dokploy-network
volumes:
- db-data:/var/lib/doublezero/data
environment:
@@ -17,15 +13,7 @@ services:
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
PHX_HOST: ${DOUBLEZERO_HOST}
DATABASE_PATH: ./00.db
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${DOUBLEZERO_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${DOUBLEZERO_PORT}"
-
+
volumes:
db-data:
driver: local
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/doublezero/index.ts b/apps/dokploy/templates/doublezero/index.ts
index 52656f401..fa774e9dc 100644
--- a/apps/dokploy/templates/doublezero/index.ts
+++ b/apps/dokploy/templates/doublezero/index.ts
@@ -1,20 +1,26 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const secretKeyBase = generateBase64(64);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 4000,
+ serviceName: "doublezero",
+ },
+ ];
+
const envs = [
- `DOUBLEZERO_HOST=${randomDomain}`,
+ `DOUBLEZERO_HOST=${mainDomain}`,
"DOUBLEZERO_PORT=4000",
- `HASH=${mainServiceHash}`,
`SECRET_KEY_BASE=${secretKeyBase}`,
"AWS_ACCESS_KEY_ID=your-aws-access-key",
"AWS_SECRET_ACCESS_KEY=your-aws-secret-key",
@@ -25,5 +31,6 @@ export function generate(schema: Schema): Template {
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/excalidraw/docker-compose.yml b/apps/dokploy/templates/excalidraw/docker-compose.yml
index 58920b393..8743434b6 100644
--- a/apps/dokploy/templates/excalidraw/docker-compose.yml
+++ b/apps/dokploy/templates/excalidraw/docker-compose.yml
@@ -1,17 +1,7 @@
-version: '3.8'
+version: "3.8"
services:
excalidraw:
networks:
- dokploy-network
image: excalidraw/excalidraw:latest
- ports:
- - ${EXCALIDRAW_PORT}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${EXCALIDRAW_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${EXCALIDRAW_PORT}
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/excalidraw/index.ts b/apps/dokploy/templates/excalidraw/index.ts
index 10e4bbcff..13a43c440 100644
--- a/apps/dokploy/templates/excalidraw/index.ts
+++ b/apps/dokploy/templates/excalidraw/index.ts
@@ -1,4 +1,5 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateHash,
@@ -6,15 +7,17 @@ import {
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `EXCALIDRAW_HOST=${randomDomain}`,
- "EXCALIDRAW_PORT=80",
- `HASH=${mainServiceHash}`,
+ const mainDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 80,
+ serviceName: "excalidraw",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/ghost/docker-compose.yml b/apps/dokploy/templates/ghost/docker-compose.yml
index a507b887e..288c59e54 100644
--- a/apps/dokploy/templates/ghost/docker-compose.yml
+++ b/apps/dokploy/templates/ghost/docker-compose.yml
@@ -1,13 +1,8 @@
version: "3.8"
services:
-
ghost:
image: ghost:5-alpine
restart: always
- networks:
- - dokploy-network
- ports:
- - ${GHOST_PORT}
environment:
database__client: mysql
database__connection__host: db
@@ -15,10 +10,7 @@ services:
database__connection__password: example
database__connection__database: ghost
url: http://${GHOST_HOST}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${GHOST_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${GHOST_PORT}
+
volumes:
- ghost:/var/lib/ghost/content
@@ -35,7 +27,3 @@ services:
volumes:
ghost:
db:
-
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/ghost/index.ts b/apps/dokploy/templates/ghost/index.ts
index 178126af6..1a88c3629 100644
--- a/apps/dokploy/templates/ghost/index.ts
+++ b/apps/dokploy/templates/ghost/index.ts
@@ -1,4 +1,5 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateHash,
@@ -6,15 +7,19 @@ import {
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `GHOST_HOST=${randomDomain}`,
- "GHOST_PORT=2368",
- `HASH=${mainServiceHash}`,
+ const mainDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 2368,
+ serviceName: "ghost",
+ },
];
+ const envs = [`GHOST_HOST=${mainDomain}`];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/glitchtip/docker-compose.yml b/apps/dokploy/templates/glitchtip/docker-compose.yml
index a654a91b2..e45c76627 100644
--- a/apps/dokploy/templates/glitchtip/docker-compose.yml
+++ b/apps/dokploy/templates/glitchtip/docker-compose.yml
@@ -1,16 +1,14 @@
-x-environment:
- &default-environment
+x-environment: &default-environment
DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
SECRET_KEY: ${SECRET_KEY}
PORT: ${GLITCHTIP_PORT}
EMAIL_URL: consolemail://
- GLITCHTIP_DOMAIN: http://${GLITCHTIP_HOST}
+ GLITCHTIP_DOMAIN: http://${GLITCHTIP_HOST}
DEFAULT_FROM_EMAIL: email@glitchtip.com
- CELERY_WORKER_AUTOSCALE: "1,3"
+ CELERY_WORKER_AUTOSCALE: "1,3"
CELERY_WORKER_MAX_TASKS_PER_CHILD: "10000"
-x-depends_on:
- &default-depends_on
+x-depends_on: &default-depends_on
- postgres
- redis
@@ -18,7 +16,7 @@ services:
postgres:
image: postgres:16
environment:
- POSTGRES_HOST_AUTH_METHOD: "trust"
+ POSTGRES_HOST_AUTH_METHOD: "trust"
restart: unless-stopped
volumes:
- pg-data:/var/lib/postgresql/data
@@ -36,21 +34,15 @@ services:
- ${GLITCHTIP_PORT}
environment: *default-environment
restart: unless-stopped
- volumes:
+ volumes:
- uploads:/code/uploads
- networks:
- - dokploy-network
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${GLITCHTIP_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${GLITCHTIP_PORT}
worker:
image: glitchtip/glitchtip:v4.0
command: ./bin/run-celery-with-beat.sh
depends_on: *default-depends_on
environment: *default-environment
restart: unless-stopped
- volumes:
+ volumes:
- uploads:/code/uploads
networks:
- dokploy-network
@@ -65,7 +57,3 @@ services:
volumes:
pg-data:
uploads:
-
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/glitchtip/index.ts b/apps/dokploy/templates/glitchtip/index.ts
index 024d4106c..093d752e1 100644
--- a/apps/dokploy/templates/glitchtip/index.ts
+++ b/apps/dokploy/templates/glitchtip/index.ts
@@ -1,23 +1,30 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const secretKey = generateBase64(32);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 8000,
+ serviceName: "web",
+ },
+ ];
const envs = [
- `GLITCHTIP_HOST=${randomDomain}`,
+ `GLITCHTIP_HOST=${mainDomain}`,
"GLITCHTIP_PORT=8000",
`SECRET_KEY=${secretKey}`,
- `HASH=${mainServiceHash}`,
];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/grafana/docker-compose.yml b/apps/dokploy/templates/grafana/docker-compose.yml
index a0555f9fe..9d913c17f 100644
--- a/apps/dokploy/templates/grafana/docker-compose.yml
+++ b/apps/dokploy/templates/grafana/docker-compose.yml
@@ -1,20 +1,9 @@
version: "3.8"
services:
grafana:
- networks:
- - dokploy-network
image: grafana/grafana-enterprise:9.5.20
restart: unless-stopped
- ports:
- - ${GRAFANA_PORT}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${GRAFANA_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${GRAFANA_PORT}
volumes:
- grafana-storage:/var/lib/grafana
-networks:
- dokploy-network:
- external: true
volumes:
- grafana-storage: {}
\ No newline at end of file
+ grafana-storage: {}
diff --git a/apps/dokploy/templates/grafana/index.ts b/apps/dokploy/templates/grafana/index.ts
index fc66f56dd..fb614ef32 100644
--- a/apps/dokploy/templates/grafana/index.ts
+++ b/apps/dokploy/templates/grafana/index.ts
@@ -1,20 +1,19 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const envs = [
- `GRAFANA_HOST=${randomDomain}`,
- "GRAFANA_PORT=3000",
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: generateRandomDomain(schema),
+ port: 3000,
+ serviceName: "grafana",
+ },
];
-
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/jellyfin/docker-compose.yml b/apps/dokploy/templates/jellyfin/docker-compose.yml
index 16ae6be96..cb61476ab 100644
--- a/apps/dokploy/templates/jellyfin/docker-compose.yml
+++ b/apps/dokploy/templates/jellyfin/docker-compose.yml
@@ -1,30 +1,19 @@
-version: '3.8'
+version: "3.8"
services:
jellyfin:
image: jellyfin/jellyfin:10
- networks:
- - dokploy-network
- ports:
- - ${JELLYFIN_PORT}
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${JELLYFIN_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${JELLYFIN_PORT}"
volumes:
- config:/config
- cache:/cache
- media:/media
- restart: 'unless-stopped'
+ restart: "unless-stopped"
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://${JELLYFIN_HOST}
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- - 'host.docker.internal:host-gateway'
+ - "host.docker.internal:host-gateway"
volumes:
config:
cache:
media:
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/jellyfin/index.ts b/apps/dokploy/templates/jellyfin/index.ts
index dc33b121a..61c9c9b7c 100644
--- a/apps/dokploy/templates/jellyfin/index.ts
+++ b/apps/dokploy/templates/jellyfin/index.ts
@@ -1,22 +1,25 @@
// EXAMPLE
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
- const port = 8096;
- const envs = [
- `JELLYFIN_HOST=${randomDomain}`,
- `HASH=${mainServiceHash}`,
- `JELLYFIN_PORT=${port}`,
+ const domain = generateRandomDomain(schema);
+ const domains: DomainSchema[] = [
+ {
+ host: domain,
+ port: 8096,
+ serviceName: "jellyfin",
+ },
];
+ const envs = [`JELLYFIN_HOST=${domain}`];
+
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/listmonk/docker-compose.yml b/apps/dokploy/templates/listmonk/docker-compose.yml
index beabf4474..725d0a098 100644
--- a/apps/dokploy/templates/listmonk/docker-compose.yml
+++ b/apps/dokploy/templates/listmonk/docker-compose.yml
@@ -36,10 +36,6 @@ services:
app:
restart: unless-stopped
image: listmonk/listmonk:v3.0.0
- ports:
- - "${LISTMONK_PORT}"
- networks:
- - dokploy-network
environment:
- TZ=Etc/UTC
depends_on:
@@ -47,15 +43,7 @@ services:
- setup
volumes:
- ../files/config.toml:/listmonk/config.toml
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${LISTMONK_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${LISTMONK_PORT}"
volumes:
listmonk-data:
driver: local
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/listmonk/index.ts b/apps/dokploy/templates/listmonk/index.ts
index d56d783df..725659ca4 100644
--- a/apps/dokploy/templates/listmonk/index.ts
+++ b/apps/dokploy/templates/listmonk/index.ts
@@ -1,20 +1,24 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
const adminPassword = generatePassword(32);
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 9000,
+ serviceName: "app",
+ },
+ ];
+
const envs = [
- `LISTMONK_HOST=${randomDomain}`,
- "LISTMONK_PORT=9000",
- `HASH=${mainServiceHash}`,
`# login with admin:${adminPassword}`,
"# check config.toml in Advanced / Volumes for more options",
];
@@ -48,5 +52,6 @@ params = ""
return {
envs,
mounts,
+ domains,
};
}
diff --git a/apps/dokploy/templates/meilisearch/docker-compose.yml b/apps/dokploy/templates/meilisearch/docker-compose.yml
index 3ce8f2124..ae5ebcb1a 100644
--- a/apps/dokploy/templates/meilisearch/docker-compose.yml
+++ b/apps/dokploy/templates/meilisearch/docker-compose.yml
@@ -1,25 +1,14 @@
-version: '3.8'
+version: "3.8"
services:
meilisearch:
- networks:
- - dokploy-network
image: getmeili/meilisearch:v1.8.3
- ports:
- - ${MEILISEARCH_PORT}
volumes:
- meili_data:/meili_data
environment:
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
MEILI_ENV: ${MEILI_ENV}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${MEILISEARCH_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${MEILISEARCH_PORT}
volumes:
meili_data:
driver: local
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/meilisearch/index.ts b/apps/dokploy/templates/meilisearch/index.ts
index afc009c0c..cfb8a9a4b 100644
--- a/apps/dokploy/templates/meilisearch/index.ts
+++ b/apps/dokploy/templates/meilisearch/index.ts
@@ -1,24 +1,26 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const masterKey = generateBase64(32);
- const envs = [
- `MEILISEARCH_HOST=${randomDomain}`,
- "MEILISEARCH_PORT=7700",
- "MEILI_ENV=development",
- `MEILI_MASTER_KEY=${masterKey}`,
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 7700,
+ serviceName: "meilisearch",
+ },
];
+ const envs = ["MEILI_ENV=development", `MEILI_MASTER_KEY=${masterKey}`];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/metabase/docker-compose.yml b/apps/dokploy/templates/metabase/docker-compose.yml
index 3eee3344d..4dca4d015 100644
--- a/apps/dokploy/templates/metabase/docker-compose.yml
+++ b/apps/dokploy/templates/metabase/docker-compose.yml
@@ -4,8 +4,6 @@ services:
image: metabase/metabase:v0.50.8
volumes:
- /dev/urandom:/dev/random:ro
- ports:
- - ${METABASE_PORT}
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabaseappdb
@@ -13,17 +11,11 @@ services:
MB_DB_USER: metabase
MB_DB_PASS: mysecretpassword
MB_DB_HOST: postgres
- networks:
- - dokploy-network
healthcheck:
test: curl --fail -I http://localhost:3000/api/health || exit 1
interval: 15s
timeout: 5s
retries: 5
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${METABASE_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${METABASE_PORT}
postgres:
image: postgres:14
environment:
@@ -32,7 +24,3 @@ services:
POSTGRES_PASSWORD: mysecretpassword
networks:
- dokploy-network
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/metabase/index.ts b/apps/dokploy/templates/metabase/index.ts
index 1bd4281c6..0a08916e6 100644
--- a/apps/dokploy/templates/metabase/index.ts
+++ b/apps/dokploy/templates/metabase/index.ts
@@ -1,20 +1,22 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
- const envs = [
- `METABASE_HOST=${randomDomain}`,
- "METABASE_PORT=3000",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 3000,
+ serviceName: "metabase",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/minio/docker-compose.yml b/apps/dokploy/templates/minio/docker-compose.yml
index 25701ea89..4b24bbcce 100644
--- a/apps/dokploy/templates/minio/docker-compose.yml
+++ b/apps/dokploy/templates/minio/docker-compose.yml
@@ -1,31 +1,13 @@
-version: '3.8'
+version: "3.8"
services:
minio:
image: minio/minio
- ports:
- - ${MINIO_API_PORT}
- - ${MINIO_DASHBOARD_PORT}
volumes:
- minio-data:/data
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin123
command: server /data --console-address ":9001"
- networks:
- - dokploy-network
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.service=${HASH}
- - traefik.http.routers.${HASH}.rule=Host(`${MINIO_DASHBOARD_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${MINIO_DASHBOARD_PORT}
- # API router and service
- - traefik.http.routers.${HASH}-api.service=${HASH}-api
- - traefik.http.routers.${HASH}-api.rule=Host(`${MINIO_API_HOST}`)
- - traefik.http.services.${HASH}-api.loadbalancer.server.port=${MINIO_API_PORT}
volumes:
minio-data:
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/minio/index.ts b/apps/dokploy/templates/minio/index.ts
index 8e8b101ed..1345aafdc 100644
--- a/apps/dokploy/templates/minio/index.ts
+++ b/apps/dokploy/templates/minio/index.ts
@@ -1,23 +1,28 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const apiDomain = generateRandomDomain(schema);
- const envs = [
- `MINIO_DASHBOARD_HOST=${randomDomain}`,
- "MINIO_DASHBOARD_PORT=9001",
- `MINIO_API_HOST=${apiDomain}`,
- "MINIO_API_PORT=9000",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 9001,
+ serviceName: "minio",
+ },
+ {
+ host: apiDomain,
+ port: 9000,
+ serviceName: "minio",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/n8n/docker-compose.yml b/apps/dokploy/templates/n8n/docker-compose.yml
index c26804dae..f8fb1f169 100644
--- a/apps/dokploy/templates/n8n/docker-compose.yml
+++ b/apps/dokploy/templates/n8n/docker-compose.yml
@@ -3,17 +3,9 @@ services:
n8n:
image: docker.n8n.io/n8nio/n8n:1.48.1
restart: always
- networks:
- - dokploy-network
- ports:
- - ${N8N_PORT}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${N8N_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${N8N_PORT}
environment:
- N8N_HOST=${N8N_HOST}
- - N8N_PORT=5678
+ - N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=https://${N8N_HOST}/
@@ -23,7 +15,4 @@ services:
- n8n_data:/home/node/.n8n
volumes:
- n8n_data:
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
+ n8n_data:
diff --git a/apps/dokploy/templates/n8n/index.ts b/apps/dokploy/templates/n8n/index.ts
index 427ef80ed..da93c025f 100644
--- a/apps/dokploy/templates/n8n/index.ts
+++ b/apps/dokploy/templates/n8n/index.ts
@@ -1,21 +1,28 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 5678,
+ serviceName: "n8n",
+ },
+ ];
const envs = [
- `N8N_HOST=${randomDomain}`,
+ `N8N_HOST=${mainDomain}`,
"N8N_PORT=5678",
- `HASH=${mainServiceHash}`,
"GENERIC_TIMEZONE=Europe/Berlin",
];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/nocodb/docker-compose.yml b/apps/dokploy/templates/nocodb/docker-compose.yml
index 60ecb57c7..726cf5e61 100644
--- a/apps/dokploy/templates/nocodb/docker-compose.yml
+++ b/apps/dokploy/templates/nocodb/docker-compose.yml
@@ -3,18 +3,10 @@ services:
nocodb:
image: nocodb/nocodb:0.251.1
restart: always
- networks:
- - dokploy-network
- ports:
- - ${NOCODB_PORT}
environment:
- NC_DB : "pg://root_db?u=postgres&p=password&d=root_db"
- PORT : ${NOCODB_PORT}
+ NC_DB: "pg://root_db?u=postgres&p=password&d=root_db"
+ PORT: ${NOCODB_PORT}
NC_REDIS_URL: ${NC_REDIS_URL}
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${NOCODB_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${NOCODB_PORT}
volumes:
- nc_data:/usr/app/data
@@ -30,15 +22,11 @@ services:
healthcheck:
interval: 10s
retries: 10
- test: "pg_isready -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\""
+ test: 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"'
timeout: 2s
volumes:
- "db_data:/var/lib/postgresql/data"
-networks:
- dokploy-network:
- external: true
-
volumes:
db_data: {}
- nc_data: {}
\ No newline at end of file
+ nc_data: {}
diff --git a/apps/dokploy/templates/nocodb/index.ts b/apps/dokploy/templates/nocodb/index.ts
index 4b52920dc..60620dbd4 100644
--- a/apps/dokploy/templates/nocodb/index.ts
+++ b/apps/dokploy/templates/nocodb/index.ts
@@ -1,26 +1,28 @@
// EXAMPLE
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64);
- const toptKeyBase = generateBase64(32);
- const envs = [
- `NOCODB_HOST=${randomDomain}`,
- "NOCODB_PORT=8000",
- `NC_AUTH_JWT_SECRET=${secretBase}`,
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 8000,
+ serviceName: "nocodb",
+ },
];
+ const envs = ["NOCODB_PORT=8000", `NC_AUTH_JWT_SECRET=${secretBase}`];
+
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/odoo/docker-compose.yml b/apps/dokploy/templates/odoo/docker-compose.yml
index e6e2a7242..80b34f0c0 100644
--- a/apps/dokploy/templates/odoo/docker-compose.yml
+++ b/apps/dokploy/templates/odoo/docker-compose.yml
@@ -2,20 +2,12 @@ version: "3.8"
services:
web:
image: odoo:16.0
- networks:
- - dokploy-network
depends_on:
- db
- ports:
- - ${ODOO_PORT}
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${ODOO_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${ODOO_PORT}"
volumes:
- odoo-web-data:/var/lib/odoo
- ../files/config:/etc/odoo
@@ -35,7 +27,3 @@ services:
volumes:
odoo-web-data:
odoo-db-data:
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/odoo/index.ts b/apps/dokploy/templates/odoo/index.ts
index 346e322b1..904293c11 100644
--- a/apps/dokploy/templates/odoo/index.ts
+++ b/apps/dokploy/templates/odoo/index.ts
@@ -1,20 +1,22 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
- const envs = [
- `ODOO_HOST=${randomDomain}`,
- "ODOO_PORT=8069",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 8069,
+ serviceName: "web",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/open-webui/docker-compose.yml b/apps/dokploy/templates/open-webui/docker-compose.yml
index 457a60bd4..d396dacc0 100644
--- a/apps/dokploy/templates/open-webui/docker-compose.yml
+++ b/apps/dokploy/templates/open-webui/docker-compose.yml
@@ -1,6 +1,5 @@
-version: '3.8'
+version: "3.8"
services:
-
ollama:
volumes:
- ollama:/root/.ollama
@@ -13,24 +12,14 @@ services:
open-webui:
image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main}
- networks:
- - dokploy-network
volumes:
- open-webui:/app/backend/data
depends_on:
- ollama
environment:
- - 'OLLAMA_BASE_URL=http://ollama:11434'
- - 'WEBUI_SECRET_KEY='
+ - "OLLAMA_BASE_URL=http://ollama:11434"
+ - "WEBUI_SECRET_KEY="
restart: unless-stopped
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${OPEN_WEBUI_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${OPEN_WEBUI_PORT}"
-
-networks:
- dokploy-network:
- external: true
volumes:
ollama: {}
diff --git a/apps/dokploy/templates/open-webui/index.ts b/apps/dokploy/templates/open-webui/index.ts
index 931e0ec84..0431c2a11 100644
--- a/apps/dokploy/templates/open-webui/index.ts
+++ b/apps/dokploy/templates/open-webui/index.ts
@@ -1,22 +1,24 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
- const envs = [
- `OPEN_WEBUI_HOST=${randomDomain}`,
- "OPEN_WEBUI_PORT=8080",
- `HASH=${mainServiceHash}`,
- "OLLAMA_DOCKER_TAG=0.1.47",
- "WEBUI_DOCKER_TAG=0.3.7",
+
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 8080,
+ serviceName: "open-webui",
+ },
];
+ const envs = ["OLLAMA_DOCKER_TAG=0.1.47", "WEBUI_DOCKER_TAG=0.3.7"];
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/phpmyadmin/docker-compose.yml b/apps/dokploy/templates/phpmyadmin/docker-compose.yml
index c6743a580..1f775f09a 100644
--- a/apps/dokploy/templates/phpmyadmin/docker-compose.yml
+++ b/apps/dokploy/templates/phpmyadmin/docker-compose.yml
@@ -1,4 +1,4 @@
-version: '3.8'
+version: "3.8"
services:
db:
@@ -20,21 +20,9 @@ services:
PMA_USER: ${MYSQL_USER}
PMA_PASSWORD: ${MYSQL_PASSWORD}
PMA_ARBITRARY: 1
- ports:
- - ${PHPMYADMIN_PORT}
depends_on:
- db
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${PHPMYADMIN_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${PHPMYADMIN_PORT}
- networks:
- - dokploy-network
volumes:
db_data:
driver: local
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/phpmyadmin/index.ts b/apps/dokploy/templates/phpmyadmin/index.ts
index 1bae5ed02..e1c976b9d 100644
--- a/apps/dokploy/templates/phpmyadmin/index.ts
+++ b/apps/dokploy/templates/phpmyadmin/index.ts
@@ -1,20 +1,24 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const rootPassword = generatePassword(32);
const password = generatePassword(32);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 80,
+ serviceName: "phpmyadmin",
+ },
+ ];
const envs = [
- `PHPMYADMIN_HOST=${randomDomain}`,
- "PHPMYADMIN_PORT=80",
- `HASH=${mainServiceHash}`,
`MYSQL_ROOT_PASSWORD=${rootPassword}`,
"MYSQL_DATABASE=mysql",
"MYSQL_USER=phpmyadmin",
@@ -23,5 +27,6 @@ export function generate(schema: Schema): Template {
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/plausible/docker-compose.yml b/apps/dokploy/templates/plausible/docker-compose.yml
index 350cd87c5..62ce5ece4 100644
--- a/apps/dokploy/templates/plausible/docker-compose.yml
+++ b/apps/dokploy/templates/plausible/docker-compose.yml
@@ -32,17 +32,9 @@ services:
depends_on:
- plausible_db
- plausible_events_db
- ports:
- - ${PLAUSIBLE_PORT}
- networks:
- - dokploy-network
env_file:
- .env
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${PLAUSIBLE_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${PLAUSIBLE_PORT}"
volumes:
db-data:
driver: local
@@ -50,7 +42,3 @@ volumes:
driver: local
event-logs:
driver: local
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/plausible/index.ts b/apps/dokploy/templates/plausible/index.ts
index 643c5df05..2bd1212b6 100644
--- a/apps/dokploy/templates/plausible/index.ts
+++ b/apps/dokploy/templates/plausible/index.ts
@@ -1,24 +1,28 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64);
const toptKeyBase = generateBase64(32);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 8000,
+ serviceName: "plausible",
+ },
+ ];
+
const envs = [
- `PLAUSIBLE_HOST=${randomDomain}`,
- "PLAUSIBLE_PORT=8000",
- `BASE_URL=http://${randomDomain}`,
+ `BASE_URL=http://${mainDomain}`,
`SECRET_KEY_BASE=${secretBase}`,
`TOTP_VAULT_KEY=${toptKeyBase}`,
- `HASH=${mainServiceHash}`,
];
const mounts: Template["mounts"] = [
@@ -62,5 +66,6 @@ export function generate(schema: Schema): Template {
return {
envs,
mounts,
+ domains,
};
}
diff --git a/apps/dokploy/templates/pocketbase/docker-compose.yml b/apps/dokploy/templates/pocketbase/docker-compose.yml
index 7570dd585..fa6674afe 100644
--- a/apps/dokploy/templates/pocketbase/docker-compose.yml
+++ b/apps/dokploy/templates/pocketbase/docker-compose.yml
@@ -3,19 +3,7 @@ services:
pocketbase:
image: spectado/pocketbase:0.22.12
restart: unless-stopped
- ports:
- - ${POCKETBASE_PORT}
- networks:
- - dokploy-network
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${POCKETBASE_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${POCKETBASE_PORT}
volumes:
- /etc/dokploy/templates/${HASH}/data:/pb_data
- /etc/dokploy/templates/${HASH}/public:/pb_public
- /etc/dokploy/templates/${HASH}/migrations:/pb_migrations
-
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/pocketbase/index.ts b/apps/dokploy/templates/pocketbase/index.ts
index 1a5e964dc..f9fc7f8f0 100644
--- a/apps/dokploy/templates/pocketbase/index.ts
+++ b/apps/dokploy/templates/pocketbase/index.ts
@@ -1,21 +1,22 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
- const envs = [
- `POCKETBASE_HOST=${randomDomain}`,
- "POCKETBASE_PORT=80",
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 80,
+ serviceName: "pocketbase",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/rocketchat/docker-compose.yml b/apps/dokploy/templates/rocketchat/docker-compose.yml
index 78056b9a7..751bd845c 100644
--- a/apps/dokploy/templates/rocketchat/docker-compose.yml
+++ b/apps/dokploy/templates/rocketchat/docker-compose.yml
@@ -9,18 +9,10 @@ services:
ROOT_URL: ${ROOT_URL:-http://${ROCKETCHAT_HOST}:${ROCKETCHAT_PORT}}
PORT: ${ROCKETCHAT_PORT}
DEPLOY_METHOD: docker
- DEPLOY_PLATFORM:
- REG_TOKEN:
+ DEPLOY_PLATFORM:
+ REG_TOKEN:
depends_on:
- mongodb
- ports:
- - ${ROCKETCHAT_PORT}
- networks:
- - dokploy-network
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${ROCKETCHAT_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${ROCKETCHAT_PORT}
mongodb:
image: docker.io/bitnami/mongodb:5.0
@@ -41,8 +33,3 @@ services:
volumes:
mongodb_data: { driver: local }
-
-
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/rocketchat/index.ts b/apps/dokploy/templates/rocketchat/index.ts
index 768cf46fe..0c10307a2 100644
--- a/apps/dokploy/templates/rocketchat/index.ts
+++ b/apps/dokploy/templates/rocketchat/index.ts
@@ -1,21 +1,25 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
- const envs = [
- `ROCKETCHAT_HOST=${randomDomain}`,
- "ROCKETCHAT_PORT=3000",
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 3000,
+ serviceName: "rocketchat",
+ },
];
+ const envs = [`ROCKETCHAT_HOST=${mainDomain}`, "ROCKETCHAT_PORT=3000"];
+
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/teable/docker-compose.yml b/apps/dokploy/templates/teable/docker-compose.yml
index 478a73be0..b96b677c0 100644
--- a/apps/dokploy/templates/teable/docker-compose.yml
+++ b/apps/dokploy/templates/teable/docker-compose.yml
@@ -4,8 +4,6 @@ services:
teable:
image: ghcr.io/teableio/teable:1.3.1-alpha-build.460
restart: always
- ports:
- - ${TEABLE_PORT}
volumes:
- teable-data:/app/.assets
# you may use a bind-mounted host directory instead,
@@ -24,12 +22,6 @@ services:
- BACKEND_MAIL_SENDER_NAME=${BACKEND_MAIL_SENDER_NAME}
- BACKEND_MAIL_AUTH_USER=${BACKEND_MAIL_AUTH_USER}
- BACKEND_MAIL_AUTH_PASS=${BACKEND_MAIL_AUTH_PASS}
- networks:
- - dokploy-network
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${TEABLE_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${TEABLE_PORT}"
depends_on:
teable-db-migrate:
condition: service_completed_successfully
@@ -72,10 +64,6 @@ services:
teable-db:
condition: service_healthy
-networks:
- dokploy-network:
- external: true
-
volumes:
teable-data: {}
teable-db: {}
diff --git a/apps/dokploy/templates/teable/index.ts b/apps/dokploy/templates/teable/index.ts
index a4b9b7ed0..bf1eb1ffd 100644
--- a/apps/dokploy/templates/teable/index.ts
+++ b/apps/dokploy/templates/teable/index.ts
@@ -1,25 +1,30 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const password = generatePassword();
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const publicDbPort = ((min: number, max: number) => {
return Math.round(Math.random() * (max - min) + min);
})(32769, 65534);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 3000,
+ serviceName: "teable",
+ },
+ ];
+
const envs = [
- `TEABLE_HOST=${randomDomain}`,
- "TEABLE_PORT=3000",
+ `TEABLE_HOST=${mainDomain}`,
`TEABLE_DB_PORT=${publicDbPort}`,
- `HASH=${mainServiceHash}`,
"TIMEZONE=UTC",
"# Postgres",
"POSTGRES_HOST=teable-db",
@@ -44,5 +49,6 @@ export function generate(schema: Schema): Template {
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/umami/docker-compose.yml b/apps/dokploy/templates/umami/docker-compose.yml
index 43d843af1..a149a5e64 100644
--- a/apps/dokploy/templates/umami/docker-compose.yml
+++ b/apps/dokploy/templates/umami/docker-compose.yml
@@ -10,18 +10,10 @@ services:
depends_on:
db:
condition: service_healthy
- ports:
- - ${UMAMI_PORT}
- networks:
- - dokploy-network
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${UMAMI_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${UMAMI_PORT}"
db:
image: postgres:15-alpine
restart: always
@@ -39,8 +31,5 @@ services:
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
-networks:
- dokploy-network:
- external: true
volumes:
db-data:
diff --git a/apps/dokploy/templates/umami/index.ts b/apps/dokploy/templates/umami/index.ts
index 364fbbe9a..d7366e9b8 100644
--- a/apps/dokploy/templates/umami/index.ts
+++ b/apps/dokploy/templates/umami/index.ts
@@ -1,24 +1,27 @@
import {
+ type DomainSchema,
type Schema,
type Template,
generateBase64,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
const randomSecret = generateBase64();
- const envs = [
- `UMAMI_HOST=${randomDomain}`,
- "UMAMI_PORT=3000",
- `APP_SECRET=${randomSecret}`,
- `HASH=${mainServiceHash}`,
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 3000,
+ serviceName: "umami",
+ },
];
+ const envs = [`APP_SECRET=${randomSecret}`];
+
return {
envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/uptime-kuma/docker-compose.yml b/apps/dokploy/templates/uptime-kuma/docker-compose.yml
index 2e2109a85..ccd775526 100644
--- a/apps/dokploy/templates/uptime-kuma/docker-compose.yml
+++ b/apps/dokploy/templates/uptime-kuma/docker-compose.yml
@@ -1,21 +1,10 @@
version: "3.8"
services:
uptime-kuma:
- networks:
- - dokploy-network
image: louislam/uptime-kuma:1
restart: always
- ports:
- - ${UPTIME_KUMA_PORT}
volumes:
- uptime-kuma-data:/app/data
- labels:
- - traefik.enable=true
- - traefik.http.routers.${HASH}.rule=Host(`${UPTIME_KUMA_HOST}`)
- - traefik.http.services.${HASH}.loadbalancer.server.port=${UPTIME_KUMA_PORT}
volumes:
uptime-kuma-data:
-networks:
- dokploy-network:
- external: true
\ No newline at end of file
diff --git a/apps/dokploy/templates/uptime-kuma/index.ts b/apps/dokploy/templates/uptime-kuma/index.ts
index 31bdf27b2..d9f3e5dbe 100644
--- a/apps/dokploy/templates/uptime-kuma/index.ts
+++ b/apps/dokploy/templates/uptime-kuma/index.ts
@@ -1,20 +1,22 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
- const envs = [
- `UPTIME_KUMA_HOST=${randomDomain}`,
- "UPTIME_KUMA_PORT=3001",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 3001,
+ serviceName: "uptime-kuma",
+ },
];
return {
- envs,
+ domains,
};
}
diff --git a/apps/dokploy/templates/utils/index.ts b/apps/dokploy/templates/utils/index.ts
index d2bcae9c5..26d61bce5 100644
--- a/apps/dokploy/templates/utils/index.ts
+++ b/apps/dokploy/templates/utils/index.ts
@@ -4,18 +4,22 @@ import { join } from "node:path";
import { TRPCError } from "@trpc/server";
import { templates } from "../templates";
import type { TemplatesKeys } from "../types/templates-data.type";
+import type { Domain } from "@/server/api/services/domain";
export interface Schema {
serverIp: string;
projectName: string;
}
+export type DomainSchema = Pick;
+
export interface Template {
- envs: string[];
+ envs?: string[];
mounts?: {
filePath: string;
content?: string;
}[];
+ domains?: DomainSchema[];
}
export const generateRandomDomain = ({
diff --git a/apps/dokploy/templates/wordpress/docker-compose.yml b/apps/dokploy/templates/wordpress/docker-compose.yml
index e1e99e6be..6ff6b2fd4 100644
--- a/apps/dokploy/templates/wordpress/docker-compose.yml
+++ b/apps/dokploy/templates/wordpress/docker-compose.yml
@@ -1,20 +1,12 @@
-version: '3.8'
+version: "3.8"
services:
wordpress:
image: wordpress:5.8.3
- networks:
- - dokploy-network
- ports:
- - ${WORDPRESS_PORT}
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
- labels:
- - "traefik.enable=true"
- - "traefik.http.routers.${HASH}.rule=Host(`${WORDPRESS_HOST}`)"
- - "traefik.http.services.${HASH}.loadbalancer.server.port=${WORDPRESS_PORT}"
volumes:
- wordpress_data:/var/www/html
@@ -33,7 +25,3 @@ services:
volumes:
wordpress_data:
db_data:
-
-networks:
- dokploy-network:
- external: true
diff --git a/apps/dokploy/templates/wordpress/index.ts b/apps/dokploy/templates/wordpress/index.ts
index 38d7d0e7d..5126f1571 100644
--- a/apps/dokploy/templates/wordpress/index.ts
+++ b/apps/dokploy/templates/wordpress/index.ts
@@ -1,20 +1,22 @@
import {
+ type DomainSchema,
type Schema,
type Template,
- generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema);
- const envs = [
- `WORDPRESS_HOST=${randomDomain}`,
- "WORDPRESS_PORT=80",
- `HASH=${mainServiceHash}`,
+
+ const domains: DomainSchema[] = [
+ {
+ host: randomDomain,
+ port: 80,
+ serviceName: "wordpress",
+ },
];
return {
- envs,
+ domains,
};
}
From fb4e06116ca99439ca2ad2bd9a1ee3424360b8b6 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 19:49:17 -0600
Subject: [PATCH 24/28] chore: add example domains schema templates
---
CONTRIBUTING.md | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d04ee676f..2cbf916f5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -166,20 +166,26 @@ import {
generateRandomDomain,
type Template,
type Schema,
+ type DomainSchema,
} from "../utils";
export function generate(schema: Schema): Template {
// do your stuff here, like create a new domain, generate random passwords, mounts.
const mainServiceHash = generateHash(schema.projectName);
- const randomDomain = generateRandomDomain(schema);
+ const mainDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64);
const toptKeyBase = generateBase64(32);
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 8000,
+ serviceName: "plausible",
+ },
+ ];
+
const envs = [
- // If you want to show a domain in the UI, please add the prefix _HOST at the end of the variable name.
- `PLAUSIBLE_HOST=${randomDomain}`,
- "PLAUSIBLE_PORT=8000",
- `BASE_URL=http://${randomDomain}`,
+ `BASE_URL=http://${mainDomain}`,
`SECRET_KEY_BASE=${secretBase}`,
`TOTP_VAULT_KEY=${toptKeyBase}`,
`HASH=${mainServiceHash}`,
@@ -195,6 +201,7 @@ export function generate(schema: Schema): Template {
return {
envs,
mounts,
+ domains,
};
}
```
From d300eb73fbba7b5efebd7aa6732cbd6e8eaf4117 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 19:49:36 -0600
Subject: [PATCH 25/28] chore: add license
---
LICENSE.MD | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 LICENSE.MD
diff --git a/LICENSE.MD b/LICENSE.MD
new file mode 100644
index 000000000..9031c94b9
--- /dev/null
+++ b/LICENSE.MD
@@ -0,0 +1,26 @@
+# License
+
+## Core License (Apache License 2.0)
+
+Copyright 2024 Mauricio Siu.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and limitations under the License.
+
+## Additional Terms for Specific Features
+
+The following additional terms apply to the multi-node support and Docker Compose file support features of Dokploy. In the event of a conflict, these provisions shall take precedence over those in the Apache License:
+
+- **Self-Hosted Version Free**: All features of Dokploy, including multi-node support and Docker Compose file support, will always be free to use in the self-hosted version.
+- **Restriction on Resale**: The multi-node support and Docker Compose file support features cannot be sold or offered as a service by any party other than the copyright holder without prior written consent.
+- **Modification Distribution**: Any modifications to the multi-node support and Docker Compose file support features must be distributed freely and cannot be sold or offered as a service.
+
+For further inquiries or permissions, please contact us directly.
From 840c24e3ca981884ad69ec2fa2cb96ccc6485ce0 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 19:51:59 -0600
Subject: [PATCH 26/28] eslint
---
apps/dokploy/templates/utils/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/dokploy/templates/utils/index.ts b/apps/dokploy/templates/utils/index.ts
index 26d61bce5..9040e83a0 100644
--- a/apps/dokploy/templates/utils/index.ts
+++ b/apps/dokploy/templates/utils/index.ts
@@ -1,10 +1,10 @@
import { randomBytes } from "node:crypto";
import { readFile } from "node:fs/promises";
import { join } from "node:path";
+import type { Domain } from "@/server/api/services/domain";
import { TRPCError } from "@trpc/server";
import { templates } from "../templates";
import type { TemplatesKeys } from "../types/templates-data.type";
-import type { Domain } from "@/server/api/services/domain";
export interface Schema {
serverIp: string;
From 124a884d2e96f1c719c7e39a1d322d7df45f39c4 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 20:43:30 -0600
Subject: [PATCH 27/28] feat: add soketi template
---
.../templates/soketi/docker-compose.yml | 12 ++++++++
apps/dokploy/templates/soketi/index.ts | 28 +++++++++++++++++++
2 files changed, 40 insertions(+)
create mode 100644 apps/dokploy/templates/soketi/docker-compose.yml
create mode 100644 apps/dokploy/templates/soketi/index.ts
diff --git a/apps/dokploy/templates/soketi/docker-compose.yml b/apps/dokploy/templates/soketi/docker-compose.yml
new file mode 100644
index 000000000..1784cdc79
--- /dev/null
+++ b/apps/dokploy/templates/soketi/docker-compose.yml
@@ -0,0 +1,12 @@
+version: "3"
+
+services:
+ soketi:
+ image: quay.io/soketi/soketi:1.4-16-debian
+ container_name: soketi
+ environment:
+ SOKETI_DEBUG: "1"
+ SOKETI_HOST: "0.0.0.0"
+ SOKETI_PORT: "6001"
+ SOKETI_METRICS_SERVER_PORT: "9601"
+ restart: unless-stopped
diff --git a/apps/dokploy/templates/soketi/index.ts b/apps/dokploy/templates/soketi/index.ts
new file mode 100644
index 000000000..47aa461df
--- /dev/null
+++ b/apps/dokploy/templates/soketi/index.ts
@@ -0,0 +1,28 @@
+import {
+ type DomainSchema,
+ type Schema,
+ type Template,
+ generateRandomDomain,
+} from "../utils";
+
+export function generate(schema: Schema): Template {
+ const mainDomain = generateRandomDomain(schema);
+ const metricsDomain = generateRandomDomain(schema);
+
+ const domains: DomainSchema[] = [
+ {
+ host: mainDomain,
+ port: 6001,
+ serviceName: "soketi",
+ },
+ {
+ host: metricsDomain,
+ port: 9601,
+ serviceName: "soketi",
+ },
+ ];
+
+ return {
+ domains,
+ };
+}
From 61d520c2391648d8adeaa1361319fb3398e03f54 Mon Sep 17 00:00:00 2001
From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Date: Sun, 18 Aug 2024 20:46:18 -0600
Subject: [PATCH 28/28] feat: add data templates
---
apps/dokploy/public/templates/soketi.png | Bin 0 -> 12754 bytes
apps/dokploy/templates/templates.ts | 15 +++++++++++++++
2 files changed, 15 insertions(+)
create mode 100644 apps/dokploy/public/templates/soketi.png
diff --git a/apps/dokploy/public/templates/soketi.png b/apps/dokploy/public/templates/soketi.png
new file mode 100644
index 0000000000000000000000000000000000000000..aec5a79a2765f65961c58a3b8f68fc1079f4111d
GIT binary patch
literal 12754
zcmeHuXH=70w{8Fx1%a&sDiC1{Ql
z)X=0?fzW~wdb=y`{q6IeGtQ4Y?)`V~8H4t&HP@VT%{9w2S6(9YbX2J*7$_hR2$j0p
zJp%}Ygh2ehcma%j8=j5?zeqd{R23n`Jxn<8aLG;0)Dr@sZXg{H$V-6NXz-U+1NQdpjd1j9N`EV4t#wx2MgR@hQmZuTR_`Q
z$>A|v4ejAzh}JQ(Lp$3^+H=UsQb_y400UPClnslos|&&t<}1VTi!TiPO&sRu07M@4
zk6;G(RQ@IbPcj^jQ7AVUKfjNU51)@PAJW5-Urk|SpH_MfI@k|ZU5np@Z_`kHR45F!Us0Z
zZ)5MtFUTiAREvd0`Y(Ezg1sm4@h>5U4(`7m{(5qO|B~cp($BP{Kx%*TF{E
zmRH2VPLfyBR#cEzR7g<3LD*J6TvSlxA4Y#I`Oj=rYylThAyFYQQAt4&L2*e@34wnW
z{F?mF^hQW8yT`<>$O`>K_8()vXr=jy)^&mZWt3kJe_Q3B6@QuRFT#I2mjC^uvbX!^
znB2TPTzqg)*RacZa$tY9uBr1HVFIwW_
zU7z$xG#Z*c``PL;Y{|@ef?^BMF3y1(`nb
zbOAT2TbO|ZsJI4IYo^@4S7~RNz~Iv{*uasqDB~_Va&puwBk1Lg!sBm9uwxYFTNz|{
zb;DEj^N#1b?8ztCev9sy&ryPGhEpL`D&75zQcP4Tf3D|M6-E}6%T(XodY%n;q;qQj
z95xno+m7LTs3Lg`-Fmlsk>%B)u{)_~ANSm0{&gcvH>x0-Q9=x3$j3ii;Yp#TN>cX{
zkP7lxtqhKzy?DIyNypXfiYT<>14))r@=ohjsGCI-j#GXNs16_B)k&B-HMz%gO4pxk
zBIPL?kOsHQUBb;VY7QaqeL>N(IMBj^Uk$oG$NeB5-|1|HqR$%n2Hb`CXx}tFaZbwV
zwPm<9rI+O6K-Lk-SuQdM_ewy;R|c-`)ikuyC6>_QA}7`1#H
z?P?so+;B!N-er4`V#h)Pt`pmHc4+|bCQbnjrkDPnp^Aj-cfSc(%cAIRD$)v1|E4He
zb3KfD|2w0uD&b2v?^soP)6h!N8|%B1`v$tkRQ5>UnrmQQOFHdFtlU|LnCp}0`8!50
zl9O}aGZzU!$-eVYKsRH%dFlz_?~^OsC6&{PC4FAO$40dpTLU;zE#%2g^XTPg^xe(V
z^X9d+^2+J&5T=9i*T!dH6PHQv?oHsw36rfWoZFY--{}S#>dmz~AhKasU=Q;xQ*7%z
zb+W`7z7o(mbP42yZw@lX53UM8&+q@nifU2hKeet86v&Da>Wv$2uc4Qo>7Cr3v7&`N
zjBQV@K}a?$1RYwH-|nJt1h#aeB-^+u28GB!y6Z2NIUSUx-tAxW{0-%5f{JnZopw*0
z8&%*{63U6~^+zWwb1I$E9rt@2OZ;od!>D~97;0OLr0JC;Y}g%+oNH#fLy3IY3Ej*C
zdq#abpmO^D`E)g>&_7f;+>Hj<;@xLYDb(I;?MR_{=fNH-%SbQvk1;qlh~Y+XZkrwU
zL=MrPnxMak_$^vpYS^QcY9d6DTzX;nIfE#^+BL^+hSjNBf7y*ZXM%)g`SEM8j}YYt
ze1k?E@#o#hDWGn(RXH^XSbfMftVKb7lybzc!4Hdd#6c_b`@%)5_fywj^vzP!!e$I!
zin>p_p&Pvs@46-n-zAcn%@BtbE6wc=)01`zMn9p7$6uR#sJgMyqI-KrsE8^8?%g@T
z$bIxvjKXJzW>Y97f>?enD7aFTy46Rw|8`0~P
zkTksf1l?CZXEB$C7g=4u?$d8%nwAOc3a3+RNx^Ps73dpB80qHk6i@+|
z)01^HVW}v`j)jUm^%e5(;m7k^d8dTQM+1T}&k7V2sBZPXl9~X4eHmUDv6^sQwBWg@
zTN;XRJ}ie7!mN}*cA>2fV{JL{?l4t4ZBhASjL7`l?E%5y=!`xRvRe(s%Bu-NB6|h6
zCAxx&I9}^nK3Z6eU5VVy{)T#qfrACWx%HjJ}$)+w&LKq!D;d*
z$Iy%ckU=JzVuxOEO49&^!}MH#VTV^pC4=ndZYL{rtm+wbcA^mEd_x`nJ|Hh2eNpqf4RF~n
z?}~MB8LKx_>-#s=ZM3ENtjTXBlzhDAyBZp>pMODUIXwt5khW)+WA`Atf&1NQ)~AA7
zR}FUhVlKR(;3{#$@6}34VY+!Txz}&%f$YJJCLhYujlrSz64avX92NwnYd~2JFJXmgtW`()Az+
zQeD1of1N~#tXb=?%5SplK-b
z_ujoj8wpE6j`Wx1#T&r+XI>fLn#cl{m8?#1KJK4%-tx5=tE+570RELVJKon>4*Q(A7xq-AlL6^yoM{?Odqq*-#>sPuf%d--Ii_RLL$FjJb-bGI+Ukv1=r<_9(2wiBv0@Ts{nC2EFZ
z$;vWwp!lxF!Rp+Hwy!A9p#Drt#_sjfy(w(olzDREO^LnmI}F0Sq2i|@OtybeV{o09
zDxJQsYC^&(WQ)i{2|sJc6y
z<2@ApD1`6K)l|b;7+)+Vg9>UdcSWuDNpu$T#0r~C8
z=6)&PN#(W>GCvwOV(m0|GJ-Dex|5$RTWoF7mlqy5mU$!8tL8=+HD7+JZ%d{l8
z$;-NSi>Wxo+4Ti(BtgUpCoN@F!hv)iNN*ZpV;7yhFI{y3^LXf+H?0vjNQ2^M7PG#T
zL+#0l2-tgt@u^B@wIgf*)Cn22ik*JNRT6ACKg0K;FN7AQoGn^%h_|ogpRy>JjZY0Y
zMLI{}hAA0~c(!To2Hwq-d-C4&!wpui8cLwg!^t?E>GerjZ**Fe^z>-tuA09^b6t%(
z;}l_;$}`+50HYLCTlX1tdB%hkLV9ykLT63-?QU+f#vh=~+yb>Gk%srz6s-2!R
zdr?rUT$r)Nt-hbuURA0`{@-9bGhU}DPop}r>-mrdCwxJ&?H7GOy$Ba8iA3+3uAtsZ
z)T@Qv`D)@(Ez*YSSYx+t6k{GLl`010wy{hvvWTQjKT6s?V6dRADzPD#pL-X*hMwv)
z?%puO3p`gOXDSQ$v8xI_2vdAbP?LpCf8Z-{+(3L&xV`7Uc}QO=dUO;@)s;zPv;X*y
zKrEAE*0x+g$!DMFpX-{FyNRcP!pw+=)M3;T74Efi6ao8~(!*$tK>Gcau+%2Md)@ih
z@vep^Ix08;P#Bqf&t#;0WX4nMn%7)Vr^~$3p(pC8>)7~eVU6&czyvKi>9lAYb@_oF
zoxsD+tsw6eC^I5t^;{Mz5tIY!wTYQ%#dHDI-hQvMW8tj60Gvxg+6lCT#v>Xq-~9IK
zD1?KJIaPePt>XCn{Z9dJ?&zZ2y0|@}{+`9eZ^v70AI4vqM%Eqx#VGydU^1%ub$)`oDm!y3F!Phj^Z=iRpCVyV
z6QJm^)xol>*pKkx)Hk3y=UgKN@)F2|OFP0J1<$GP^GK-kLl-0Gfhw)V1{=Snj
zzlIZN=((@IVdp3GP)Bk>8xUXUh&+ZJ&KNzegr$k5u7e>e;?UdlhP8&`fsY%=A}U%#
zm>Hwr-y9S^oPv0!1@8BMP?UAQ0z2O@4{jJT-FD&mDD5($v&Pb@%RSn4C?;5|WjA?N`g~6>Z>K`Lr+(V)SmdUbKv}@|X6@pplYj
zd&H%#B`s$C!?;1^3vb{Ygd9z?+fmY)L#Mw!Mi?E~2$2V&^=Ry*oGFkRL`^R<-auY_
z=hi~>l{&WWGiQISvreMrmk;lb1l(NI40RmqptY)CXMcP$7?KYYN#jKaNm$&GEXR#@QbV^NPtRp)Ait
z5DL^(>1*lQ##Rm0yg1R%bR?+J_Px-8g)1MY{kGxhvUr9?x)vyin>x3{v089Ap!V)=wM3;QW9ST=~agzQ(kQuI5m
zjpkENnTm4yY4g_Y$j@Mi(beX#*Bn*lO2xXJD*gq1T@F~Zu!J8A9TBHTz|Lz
zR{G_4a*(?D!ce>PryqkOHCws4DFN~+%#16gh?H&Q(lHS!e(b2#-;MwX=+giC+Uj5_&q2O@
zZCt{2BW2@|PX8b8D{h~dllDKh(DuLWRQNJ4V|V_gG$>$AXKrCx_;NxL^~s{9cG*E{
zb}8FCW*OrQlB{DtToN;H8+f$t)oUCBY^4-U*
zZz5=qZ1nx>+?)8D1Y=5=*L3vTNnN@9Hd0GeR^ve5fikfc>m;>$-N+#0GCNhg*Ie_i
z|NFFcf4RKz38k??+R1q|blq~Sw$_-cUWzsW^+V=IGAgp1MuZ5dic3VfhF?#w`QwuU)s6d^kp&Yac?jnSr)?>1gLj&8
zemMpwDiZa`<3-OalY;g7u?vj7wN?(z@0zwDte!R34L9T?KONMjd-L;AIWH*4ym(d1
zM)(c|D-+;_SAimr?0RrZgDCy_<>jzp*B8SVUr6rHWDfn{vNdCquUw1ZZ!Y}kri1EKXZ9MP}G*#9y2p4Z}@fz;a{pZ&*o
zMx2vn1kYPr(e=F@|0a6+cq5^easSID%B<3|5jEppth
zu(NcE#&_4`>52E041VOO^{KdZQLQ5&TTjlvlEZ;o*9O2$IOtvvTaCZc2&k*}t|(I7
z*f>>fwq3!B<0-jH1a?X+ceU=(O!Z|#ohQpL2M!KOrv|x3Age!wf%aZLIeB&NaP0fo
zi=gSbGHI$5z1hy#gDJuq^FTr%oe|5+gC^g*KYhouREv=T-#^-<9<^S5nbiI#
z)0A=s*`(XvNJ_;fGHHBCgkLW23b`>i)2>>|*?7%Othxyb?|=6|^&aKfaIr(LiqJLg
zh)>vH_SCl}tUWw~i8xxx22j}RYzD^lEj^zEs5F_#WBV@ANsbDzGd{Ao4Siy^*Q~1<
zU{NABnjxP4oOn4_DeADnTL5|p&}FW+%u}LfejdOlxgisgfD!K5z-pzpdd2v3Zb8t8
z-Ep}}<9Wo@iyGE7`YTe><l*u^AzBR32ts}`RBJX~Wo!Yll~bBosC
zO#k^$p)hoE$8|$0jfj=7sXmUG{S>IEmNr*RVc(ZKM}>
z()`{}*8_0-7EDo{@bJ+8kPS8?D9|2eIl3poaDvCz!&
za|${g&yrUKfy!w_@D;YFSudWXL$VL>t-U4Qa4oF{n
zBm29nsSWJ>3=OD^3Pg0vMu{OvP33YWbc(9gk`E3e)f2{H&ilPMpc-nmaL6VAA-qJ_g
zd}xkZezL(ga0yZmoRa>nNbUo=Mmhgi8{xR!Xmn6f1-c0cYdqeGB3)3k${^Ifm-ScL
zj_KHQ)$Py>dXt$XH*2qFT!o502
zWKUhtn5=Jl3_cHj>gGE{15IRrCaOJ$h={|rvvlj)D6zAszB^p>ujyr6VCNr#d%G{O
zZcQRfQCl=;^^JE5YJ!kinsIOBdO4wAXu)L0Z2Tt}KDq6gFhGv$y!x#XU6IP!;%Ne@
zq^00OY~eds!gV;7E5go@arO4IfyC;$uzMfKmeb^=H}=%!z84}=D!g7-IMxpib5@FJ
ztalqYhYk+ElE|&kv*6~_JvKFZvtN!eD7eK{GjJg?aE3^9j2Vq^mwwDVXCN
zHJwGG#A9T%QW8HR3-3FJn_vb;^kodA?j0|;G&?D)c%(2lUCtfDx!bR*#!9^&SX=UT
zI=`MDIr2{5A?fRqO~UDYZoDgSM@w3m^!rEU6*DE+!#j^oPl35`BDk1x%<)1;I(~q7
z!?*MNd?)|+Jq5l%fgf79FVD4dAq~$J!WcbFB3^G$eO$PJ0BOFH
ztz)szQuROcTS%21unx@$PfweUAefhm;f^RT4dk(s8R5^tQ3R|z*LXJpq$Vm!&Ycoh
z=g8IF=e88jj%76DwwtqU42g0g6vH_RgDlZMZ{^$M;@G}YrLuMJmknkiovgu4LCvj`
zeBEB7lWKQWO^$#`5D6)qs2Vf#ctRI+aUGxP8?xI)Ijxl`Kpp1R&qqmp|LFGTlX-ZSSng^xCl4e-j18
zYtS6)ITgBl2k6&|Y?B-G<*v?81$;)4{?fCv^LlpknbAs_3lg8)jXg2Z+>v@~IqhGH
z>M|)y`C4SQlAXE=vK6?*3wH)aNcIWG(T)yS@W?!A9JE+kJ0#P2rJ~b~V6QeitHYfO
z-qTxl3v+#+9W-(K>y{%QgEu>ZWnqp6t2)73$^g-Q(aRoTf@{pp?;?ILVl8a!Vxj
z)7!`Q(1+fRhToKbV6R+%Bp09JV(tnfnc<~{z3@8}<9akY56>TKQZYNklsj|W;@??L
z0NRwfYTK?rgM|T+?`l%pMQDU61&7q!`KQ=H&+_yRUf6iHB_q*OLKRheDn&IYH^fsv
z$$-&=Jy^YW*OgO-Z2Xg6U~wr<)WSrjDrT1*+?)MK4U6EljlXm*yS3+Q;H~QKjbHyJ
zG4e03I5q_&pi-n-if=s5#|YJ%PGl0B3(y7{YNl%yZnWnXS>GOV_4HoPYb{Ut%!ir?m2prKI8mX!fCCdbCdH0}J(06$sBzU7-Ng
z{iQC{MiyC*-tw0uQA%wNx8~tzZRE@xD$KEycMbQB_cY3?Vz@Z)x?kFD4
zSh42reH%LCLklY_b~l;xvz0KZ9~$)vy+QjF>2T$C2IT6tJ(pQ5$gXfq-F@aVO5b?g!itPgH;tH08<}
ztgEmjK5b1*_b(YL%kmyX$yq}vQltl(+tSL$+p~s*6~!V+0X1DBSP97TtvsxjQ19gL
zL{N**e6b`>xaISyEHkfQ`a&?AD0@qV2;8|TT917RGtRe@Oo-o}C+k3Jn8Tt9w_8bW
zkLoRNhQ;u#?s)}?|7zi`z?*KY*<7U@ja?;8z
z;OZ|*QFVA{4G9a`qcy<@DDHiHB~>o{OW!C(T}$o~Q**;zj~ZnOqW^)~PE^Fm2muSL
z#uzN?=swymdqRJoR2>M6I8jN`nc>y3E_tjv=W8}jXOj4rhHr03wAtqzLLirSi0=YS
z0R`L-(d%Q0U>o{o@W0IHVLKx+aH%0{@8J@8@!HfYVB#1P&hw@}ewmZw@bau|one00
zqqV7+Mkd58;ipUs9ynE3A}ctxXS3lF&EAu7Yd_p5f#IHkFnW=OfQ1|x6Jjq&G{}5#
z3?D4xsP~&_p;>AqOOnrEbv%rUK@&t%KTWFW#FLUZjvyW+6TP)I{cq1ol9y-jufWl6
zi2d|k8bMgR0aCG9|C-GY)tOCOZh9d#c5qomf$`HYwwOh8%Z?>jv9`Bn`2l05wX-q
z!ls(Rx&&@LW3MOc%--?~%Wu3THTBy2VCKM6z2KG;uoo0$k{jYm3?cwH`A8fe4~k9t
zd0Oq3)o4%8=3IkJDS(t^*W?5X@iPw1R?n4eZYt6@+cDVPs?pvN03nBe*Jqk+6oX7YsHnR;rfAe=a&SSPr%W{F6~;PUfj&3pJw#B_TZ}$fATdGO3Ny2tyL5JH`?Ir%zx+id~auOp;}{oNvSrH{LH>t?of7(
z@?y>PS{MEs0{0J(sUpIx^1oMDm=W9n-RLPfa7$mBFzOMUxFYN<2qUCdA;OaKO6z6IomMUR8?+?UO;nU
zlT%#~;tLOncFpLUHM{c~J1VE<@{(cmyRMTdKdxaFlfR@vf!VG6nMnBF4H}HXd!CIa
zD(-E3F;S&BNQ)zdT6k)F4f)9@JSMq2hwP3x8f|MnZiG(=n)xipzL9z~w5g;G9Oqy6
z4mxd_*g4hg&or8r`U7y;qD(W`Y;&E@a#vg}_Sj!I;p=n0lOm(3aZuU(IZ?hktvc|J
zC)nf!Z4Px#?s)bf9oRzQMnJkTKM^hnCp8o}l@dOi6RR|UDvm>lSo$gcB1@M=JU{0f
z_5hvaC+I!#HotjhtmaulP0)tpKu>&5577lcwoMx;H8d;NGn0|i-x{U8ta-%D`7()*
zDg}FTJK9UV_q3#9>vPw_HY{g6gg^v`>-6weA^3nfcG%cJ1bc!vHQ=I3$p=s!rzv5y429A;PqHacGUg+tUEs&
zd~D#h0|`&(+Nizg0!~kKy=?1;jiMyHoQ@da8{G!xc8kr`CaJr;@WEMt?1>$!ao%MTl$3
zPJ-+SKH!eI<9T|+EY9i=5LKVaLMK(0nx`xYCo#1M(JXtt*
zpjCSv*#JLGrew>EUyDv!pStJg$lzZ^mZY4~sxdyIwmKan#uxAHDv)|1-DpZR*|!0J
zcS~SpI}n?rh7kiJFf*;(kB&*FVQrT$1$P0z_Nz3{J|FaY_$Ew+EMAC4`b%4n8$>8tF+BGkYXq6jl<8yG
zB?G#P8XQ*!hS2z=`^&?#et#t?+Ebv8i>u5-#(sk`6ux#``QdWKb_F!n0Im@*Ao}
z*0;eCdIKzrrjp7gFNsZd(&A94(`hoG_=zC1r_+7oG0DT>YD2DThZp5WE4xlJd9U&a<
z!;&$YAOqm?r`ggZ!^Mq_G*tuofje3QfZnrMeQoJwYYM3Xj(}I2eKMd92?ADvmB`w|
zNb2my{0w&V2Dl(+V2r!c98>gOD_6d5S56PM<^qO;h05QWVJ%{(R(CTwa*sk~4W!yw@zzz(nZxVHaQB2~h
zD{^Bf3JB0P^t0QP@VYeo(+6Oy7@+ArRp&V)QQr;{4mCqZa5XSP2B>WIR0b}^MD`D4
z&p!ff*Gv{5RCEr-opWIU}hFxU96Q_etW-T|ufpL4FwfPA9i!bC>Ii8YFF{((!IArCnPKg*))!0Ranpq$Zh
zAAy+Ta(5c*I^)=3wgWPZz`H16Te1cc=|dar;B1zxQueO}@0B9xia$nJE?$;=P`By$
zN^-^lymG=2%C463CPinK|6?g?K^cn~(BdHJvn0;6QVXWGSaTO-QzCP^NX!L5pF&_@
z0fFfxmZW1_Ew2Y7+{MKtNuSYt|KkeG!eLE6=i2uoVo}h>&Mp})2D=j9H$=eBZHB0&
z5SpzYRr==uWWUgRCsMktf$8C$z{*+f1LcTymFc&Rum~A6;kC}u8zY%6)K$nR=mm-g
z%2W?ee!Rfe^E9i$2y1Pb)p}_-5l9(mHFy>P
zQ(*v1-tV1aUkQT*lB`48A_8JzZ!8P@El4o+lQJo`^lL;%--Q>V&tMr#QUx8bZ
zv|6Re4lRza#amMmM|1OzYBGmOI%F-Bpd|GSzs6306iz>&F2qx!#~>;C!SL2zI|(Kd
zBoBb~bx+O4)_!ge`0pk>V`8I9VxwY8kw|BPV1X+P-0w}GKQ?xnaD_z(XGp{QeBoa{
zV*Au1mO4mSu7Mmj+wF&q>%f4UocJde3K4_IKPsm4+T=oM1X3>s7XbnXa5s?`FnKk<
zNN_JG2>;RG?1RCyjX`s41eX`&%Xtdu@Yq2b;S>hny8z#N1RuG;HP+vVH=QysSY~}~
ze6lpnQ;=O|Rj5M#kUoss8a|Pl_-1-sH-LpR>{A4lg`!`CT&rJ1(Ai8gNed7M-Z1@5
r1iV}dL4k_#KkuCWe`bN1Gcu*?s;E3R871OBTBs}Q+$&am`1F4PP%Jjd
literal 0
HcmV?d00001
diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts
index 6e4867ba9..bf7831812 100644
--- a/apps/dokploy/templates/templates.ts
+++ b/apps/dokploy/templates/templates.ts
@@ -408,4 +408,19 @@ export const templates: TemplateData[] = [
tags: ["database", "spreadsheet", "low-code", "nocode"],
load: () => import("./teable/index").then((m) => m.generate),
},
+ {
+ id: "soketi",
+ name: "Soketi",
+ version: "v1.4-16",
+ description:
+ "Soketi is your simple, fast, and resilient open-source WebSockets server.",
+ logo: "soketi.png",
+ links: {
+ github: "https://github.com/soketi/soketi",
+ website: "https://soketi.app/",
+ docs: "https://docs.soketi.app/",
+ },
+ tags: ["chat"],
+ load: () => import("./soketi/index").then((m) => m.generate),
+ },
];