From 832fc184afcd0a078feb32d763571bf7e9aae3c5 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Fri, 3 May 2024 12:27:06 -0600 Subject: [PATCH 01/28] feat: add schema for registry and routes --- .../cluster/registry/add-docker-registry.tsx | 193 ++++++++++++++++++ .../cluster/registry/add-self-registry.tsx | 52 +++++ .../cluster/registry/show-registry.tsx | 62 ++++++ components/layouts/settings-layout.tsx | 7 + pages/dashboard/settings/cluster.tsx | 42 ++++ server/api/routers/registry.ts | 66 ++++++ server/api/services/registry.ts | 84 ++++++++ server/db/schema/admin.ts | 2 + server/db/schema/index.ts | 2 +- server/db/schema/registry.ts | 87 ++++++++ 10 files changed, 596 insertions(+), 1 deletion(-) create mode 100644 components/dashboard/settings/cluster/registry/add-docker-registry.tsx create mode 100644 components/dashboard/settings/cluster/registry/add-self-registry.tsx create mode 100644 components/dashboard/settings/cluster/registry/show-registry.tsx create mode 100644 pages/dashboard/settings/cluster.tsx create mode 100644 server/api/routers/registry.ts create mode 100644 server/api/services/registry.ts create mode 100644 server/db/schema/registry.ts diff --git a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx new file mode 100644 index 000000000..efef6ca89 --- /dev/null +++ b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx @@ -0,0 +1,193 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { AlertTriangle, Container } from "lucide-react"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +const AddRegistrySchema = z.object({ + registryName: z.string().min(1, { + message: "Registry name is required", + }), + username: z.string().min(1, { + message: "Username is required", + }), + password: z.string().min(1, { + message: "Password is required", + }), + registryUrl: z.string().min(1, { + message: "Registry URL is required", + }), +}); + +type AddRegistry = z.infer; + +export const AddRegistry = () => { + const utils = api.useUtils(); + const [isOpen, setIsOpen] = useState(false); + const { mutateAsync, error, isError } = api.project.create.useMutation(); + const router = useRouter(); + const form = useForm({ + defaultValues: { + username: "", + password: "", + registryUrl: "", + }, + resolver: zodResolver(AddRegistrySchema), + }); + + useEffect(() => { + form.reset({ + username: "", + password: "", + registryUrl: "", + }); + }, [form, form.reset, form.formState.isSubmitSuccessful]); + + const onSubmit = async (data: AddRegistry) => { + // await mutateAsync({ + // name: data.name, + // description: data.description, + // }) + // .then(async (data) => { + // await utils.project.all.invalidate(); + // toast.success("Project Created"); + // setIsOpen(false); + // router.push(`/dashboard/project/${data.projectId}`); + // }) + // .catch(() => { + // toast.error("Error to create a project"); + // }); + }; + + return ( + + + + + + + Add a external registry + + Fill the next fields to add a external registry. + + + {isError && ( +
+ + + {error?.message} + +
+ )} +
+ +
+ ( + + Registry Name + + + + + + + )} + /> +
+
+ ( + + Username + + + + + + + )} + /> +
+
+ ( + + Password + + + + + + + )} + /> +
+
+ ( + + Registry URL + + + + + + + )} + /> +
+ + + +
+ +
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/registry/add-self-registry.tsx b/components/dashboard/settings/cluster/registry/add-self-registry.tsx new file mode 100644 index 000000000..ee82487d5 --- /dev/null +++ b/components/dashboard/settings/cluster/registry/add-self-registry.tsx @@ -0,0 +1,52 @@ +import React from "react"; +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 { toast } from "sonner"; + +export const AddSelfRegistry = () => { + return ( + + + + + + + Are you absolutely sure? + + This will setup a self hosted registry. + + + + Cancel + { + // await mutateAsync({ + // authId, + // }) + // .then(async () => { + // utils.user.all.invalidate(); + // toast.success("User delete succesfully"); + // }) + // .catch(() => { + // toast.error("Error to delete the user"); + // }); + }} + > + Confirm + + + + + ); +}; diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx new file mode 100644 index 000000000..4e85c9946 --- /dev/null +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -0,0 +1,62 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { api } from "@/utils/api"; +import { Server, ShieldCheck } from "lucide-react"; +import { AddRegistry } from "./add-docker-registry"; +import { AddSelfRegistry } from "./add-self-registry"; + +export const ShowRegistry = () => { + const { data } = api.certificates.all.useQuery(); + + return ( +
+ + + Clusters + Add cluster to your application. + + + {data?.length === 0 ? ( +
+ + + To create a cluster is required to set a registry. + + +
+ + +
+ + {/* */} +
+ ) : ( +
+ {data?.map((destination, index) => ( +
+ + {index + 1}. {destination.name} + +
+ {/* */} +
+
+ ))} +
{/* */}
+
+ )} +
+
+
+ ); +}; diff --git a/components/layouts/settings-layout.tsx b/components/layouts/settings-layout.tsx index 094bf40ea..8371814e3 100644 --- a/components/layouts/settings-layout.tsx +++ b/components/layouts/settings-layout.tsx @@ -59,6 +59,12 @@ export const SettingsLayout = ({ children }: Props) => { icon: Users, href: "/dashboard/settings/users", }, + { + title: "Cluster", + label: "", + icon: Server, + href: "/dashboard/settings/cluster", + }, ] : []), ]} @@ -75,6 +81,7 @@ import { Activity, Database, Route, + Server, ShieldCheck, User2, Users, diff --git a/pages/dashboard/settings/cluster.tsx b/pages/dashboard/settings/cluster.tsx new file mode 100644 index 000000000..98ce5cfe9 --- /dev/null +++ b/pages/dashboard/settings/cluster.tsx @@ -0,0 +1,42 @@ +import { ShowCertificates } from "@/components/dashboard/settings/certificates/show-certificates"; +import { ShowRegistry } from "@/components/dashboard/settings/cluster/registry/show-registry"; +import { DashboardLayout } from "@/components/layouts/dashboard-layout"; +import { SettingsLayout } from "@/components/layouts/settings-layout"; +import { validateRequest } from "@/server/auth/auth"; +import type { GetServerSidePropsContext } from "next"; +import React, { type ReactElement } from "react"; + +const Page = () => { + return ( +
+ +
+ ); +}; + +export default Page; + +Page.getLayout = (page: ReactElement) => { + return ( + + {page} + + ); +}; +export async function getServerSideProps( + ctx: GetServerSidePropsContext<{ serviceId: string }>, +) { + const { user, session } = await validateRequest(ctx.req, ctx.res); + if (!user || user.rol === "user") { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + + return { + props: {}, + }; +} diff --git a/server/api/routers/registry.ts b/server/api/routers/registry.ts new file mode 100644 index 000000000..725861c5f --- /dev/null +++ b/server/api/routers/registry.ts @@ -0,0 +1,66 @@ +import { + apiCreateRegistry, + apiEnableSelfHostedRegistry, + apiFindOneRegistry, + apiRemoveRegistry, + apiUpdateRegistry, +} from "@/server/db/schema"; +import { + createRegistry, + findRegistryById, + removeRegistry, + updaterRegistry, +} from "../services/registry"; +import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; +import { TRPCError } from "@trpc/server"; + +export const registryRouter = createTRPCRouter({ + create: adminProcedure + .input(apiCreateRegistry) + .mutation(async ({ ctx, input }) => { + return await createRegistry(input); + }), + remove: adminProcedure + .input(apiRemoveRegistry) + .mutation(async ({ ctx, input }) => { + return await removeRegistry(input.registryId); + }), + update: protectedProcedure + .input(apiUpdateRegistry) + .mutation(async ({ input }) => { + const { registryId, ...rest } = input; + const application = await updaterRegistry(registryId, { + ...rest, + }); + + if (!application) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Update: Error to update registry", + }); + } + + return true; + }), + findOne: adminProcedure.input(apiFindOneRegistry).query(async ({ input }) => { + return await findRegistryById(input.registryId); + }), + + enableSelfHostedRegistry: protectedProcedure + .input(apiEnableSelfHostedRegistry) + .mutation(async ({ input }) => { + // return await createRegistry({ + // username:"CUSTOM" + // adminId: input.adminId, + // }); + // const application = await findRegistryById(input.registryId); + // const result = await db + // .update(registry) + // .set({ + // selfHosted: true, + // }) + // .where(eq(registry.registryId, input.registryId)) + // .returning(); + // return result[0]; + }), +}); diff --git a/server/api/services/registry.ts b/server/api/services/registry.ts new file mode 100644 index 000000000..ac8f2080a --- /dev/null +++ b/server/api/services/registry.ts @@ -0,0 +1,84 @@ +import { type apiCreateRegistry, registry } from "@/server/db/schema"; +import { TRPCError } from "@trpc/server"; +import { db } from "@/server/db"; +import { eq } from "drizzle-orm"; + +export type Registry = typeof registry.$inferSelect; + +export const createRegistry = async (input: typeof apiCreateRegistry._type) => { + const newRegistry = await db + .insert(registry) + .values({ + ...input, + }) + .returning() + .then((value) => value[0]); + + if (!newRegistry) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error input: Inserting registry", + }); + } + return newRegistry; +}; + +export const removeRegistry = async (registryId: string) => { + try { + const response = await db + .delete(registry) + .where(eq(registry.registryId, registryId)) + .returning() + .then((res) => res[0]); + + if (!response) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Registry not found", + }); + } + + return response; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to remove this registry", + cause: error, + }); + } +}; + +export const updaterRegistry = async ( + registryId: string, + registryData: Partial, +) => { + try { + const response = await db + .update(registry) + .set({ + ...registryData, + }) + .where(eq(registry.registryId, registryId)) + .returning(); + + return response[0]; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to update this registry", + }); + } +}; + +export const findRegistryById = async (registryId: string) => { + const registryResponse = await db.query.registry.findFirst({ + where: eq(registry.registryId, registryId), + }); + if (!registryResponse) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Registry not found", + }); + } + return registryResponse; +}; diff --git a/server/db/schema/admin.ts b/server/db/schema/admin.ts index 83306d2f4..5ce3317e1 100644 --- a/server/db/schema/admin.ts +++ b/server/db/schema/admin.ts @@ -6,6 +6,7 @@ import { users } from "./user"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; import { certificateType } from "./shared"; +import { registry } from "./registry"; export const admins = pgTable("admin", { adminId: text("adminId") @@ -39,6 +40,7 @@ export const adminsRelations = relations(admins, ({ one, many }) => ({ references: [auth.id], }), users: many(users), + registry: many(registry), })); const createSchema = createInsertSchema(admins, { diff --git a/server/db/schema/index.ts b/server/db/schema/index.ts index fc1d412db..3fe43e1ae 100644 --- a/server/db/schema/index.ts +++ b/server/db/schema/index.ts @@ -1,6 +1,5 @@ export * from "./application"; export * from "./postgres"; - export * from "./user"; export * from "./admin"; export * from "./auth"; @@ -20,3 +19,4 @@ export * from "./security"; export * from "./port"; export * from "./redis"; export * from "./shared"; +export * from "./registry"; diff --git a/server/db/schema/registry.ts b/server/db/schema/registry.ts new file mode 100644 index 000000000..b502648a6 --- /dev/null +++ b/server/db/schema/registry.ts @@ -0,0 +1,87 @@ +import { createInsertSchema } from "drizzle-zod"; +import { nanoid } from "nanoid"; +import { relations, sql } from "drizzle-orm"; +import { boolean, pgEnum, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import { auth } from "./auth"; +import { admins } from "./admin"; +import { z } from "zod"; +/** + * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same + * database instance for multiple projects. + * + * @see https://orm.drizzle.team/docs/goodies#multi-project-schema + */ +export const registryType = pgEnum("RegistryType", ["selfHosted", "cloud"]); + +export const registry = pgTable("registry", { + registryId: text("registryId") + .notNull() + .primaryKey() + .$defaultFn(() => nanoid()), + registryName: text("registryName").notNull(), + username: text("username").notNull(), + password: text("password").notNull(), + registryUrl: text("registryUrl").notNull(), + createdAt: text("createdAt") + .notNull() + .$defaultFn(() => new Date().toISOString()), + registryType: registryType("selfHosted").notNull().default("cloud"), + adminId: text("adminId") + .notNull() + .references(() => admins.adminId, { onDelete: "cascade" }), +}); + +export const registryRelations = relations(registry, ({ one }) => ({ + admin: one(admins, { + fields: [registry.adminId], + references: [admins.adminId], + }), +})); + +const createSchema = createInsertSchema(registry, { + registryName: z.string().min(1), + username: z.string().min(1), + password: z.string().min(1), + registryUrl: z.string().min(1), + adminId: z.string().min(1), + registryId: z.string().min(1), +}); + +export const apiCreateRegistry = createSchema + .pick({}) + .extend({ + registryName: z.string().min(1), + username: z.string().min(1), + password: z.string().min(1), + registryUrl: z.string().min(1), + adminId: z.string().min(1), + }) + .required(); + +export const apiRemoveRegistry = createSchema + .pick({ + registryId: true, + }) + .required(); + +export const apiFindOneRegistry = createSchema + .pick({ + registryId: true, + }) + .required(); + +export const apiUpdateRegistry = createSchema + .pick({ + password: true, + registryName: true, + username: true, + registryUrl: true, + registryId: true, + }) + .required(); + +export const apiEnableSelfHostedRegistry = createSchema + .pick({ + adminId: true, + }) + .required(); From 6c792564aefd19ad9a3b55575ba3b22f77f62080 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 13 May 2024 01:18:27 -0600 Subject: [PATCH 02/28] feat: add docker registry upload --- .../cluster/show-cluster-settings.tsx | 199 ++ .../cluster/registry/add-docker-registry.tsx | 94 +- .../registry/add-self-docker-registry.tsx | 179 ++ ...-self-registry.tsx => delete-registry.tsx} | 35 +- .../cluster/registry/show-registry.tsx | 46 +- drizzle/0005_cute_terror.sql | 22 + drizzle/0006_oval_jimmy_woo.sql | 6 + drizzle/0007_cute_guardsmen.sql | 1 + drizzle/0008_lazy_sage.sql | 7 + drizzle/0009_majestic_spencer_smythe.sql | 1 + drizzle/0010_lean_black_widow.sql | 1 + drizzle/0011_petite_calypso.sql | 1 + drizzle/meta/0000_snapshot.json | 394 +-- drizzle/meta/0001_snapshot.json | 394 +-- drizzle/meta/0002_snapshot.json | 394 +-- drizzle/meta/0003_snapshot.json | 394 +-- drizzle/meta/0004_snapshot.json | 394 +-- drizzle/meta/0005_snapshot.json | 2295 ++++++++++++++++ drizzle/meta/0006_snapshot.json | 2331 ++++++++++++++++ drizzle/meta/0007_snapshot.json | 2338 ++++++++++++++++ drizzle/meta/0008_snapshot.json | 2338 ++++++++++++++++ drizzle/meta/0009_snapshot.json | 2338 ++++++++++++++++ drizzle/meta/0010_snapshot.json | 2344 +++++++++++++++++ drizzle/meta/0011_snapshot.json | 2344 +++++++++++++++++ drizzle/meta/_journal.json | 49 + package.json | 8 +- .../services/application/[applicationId].tsx | 2 + pnpm-lock.yaml | 42 +- server/api/root.ts | 2 + server/api/routers/registry.ts | 48 +- server/api/services/application.ts | 1 + server/api/services/registry.ts | 16 + server/constants/index.ts | 1 + server/db/drizzle.config.ts | 17 +- server/db/schema/application.ts | 9 + server/db/schema/registry.ts | 16 +- server/setup/registry-setup.ts | 89 + server/utils/builders/index.ts | 10 +- server/utils/cluster/upload.ts | 67 + server/utils/traefik/domain.ts | 5 +- server/utils/traefik/registry.ts | 67 + 41 files changed, 18267 insertions(+), 1072 deletions(-) create mode 100644 components/dashboard/application/advanced/cluster/show-cluster-settings.tsx create mode 100644 components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx rename components/dashboard/settings/cluster/registry/{add-self-registry.tsx => delete-registry.tsx} (55%) create mode 100644 drizzle/0005_cute_terror.sql create mode 100644 drizzle/0006_oval_jimmy_woo.sql create mode 100644 drizzle/0007_cute_guardsmen.sql create mode 100644 drizzle/0008_lazy_sage.sql create mode 100644 drizzle/0009_majestic_spencer_smythe.sql create mode 100644 drizzle/0010_lean_black_widow.sql create mode 100644 drizzle/0011_petite_calypso.sql create mode 100644 drizzle/meta/0005_snapshot.json create mode 100644 drizzle/meta/0006_snapshot.json create mode 100644 drizzle/meta/0007_snapshot.json create mode 100644 drizzle/meta/0008_snapshot.json create mode 100644 drizzle/meta/0009_snapshot.json create mode 100644 drizzle/meta/0010_snapshot.json create mode 100644 drizzle/meta/0011_snapshot.json create mode 100644 server/setup/registry-setup.ts create mode 100644 server/utils/cluster/upload.ts create mode 100644 server/utils/traefik/registry.ts diff --git a/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx b/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx new file mode 100644 index 000000000..187c350f3 --- /dev/null +++ b/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx @@ -0,0 +1,199 @@ +import React from "react"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { api } from "@/utils/api"; +import { z } from "zod"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { toast } from "sonner"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { useEffect } from "react"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import Link from "next/link"; +import { Server } from "lucide-react"; + +interface Props { + applicationId: string; +} + +const AddRedirectchema = z.object({ + replicas: z.number(), + registryId: z.string(), +}); + +type AddCommand = z.infer; + +export const ShowClusterSettings = ({ applicationId }: Props) => { + const { data } = api.application.one.useQuery( + { + applicationId, + }, + { enabled: !!applicationId }, + ); + + const { data: registries } = api.registry.all.useQuery(); + + const utils = api.useUtils(); + + const { mutateAsync, isLoading } = api.application.update.useMutation(); + + const form = useForm({ + defaultValues: { + registryId: data?.registryId || "", + replicas: data?.replicas || 1, + }, + resolver: zodResolver(AddRedirectchema), + }); + + useEffect(() => { + if (data?.command) { + form.reset({ + registryId: data?.registryId || "", + replicas: data?.replicas || 1, + }); + } + }, [form, form.reset, form.formState.isSubmitSuccessful, data?.command]); + + const onSubmit = async (data: AddCommand) => { + await mutateAsync({ + applicationId, + registryId: data?.registryId, + replicas: data?.replicas, + }) + .then(async () => { + toast.success("Command Updated"); + await utils.application.one.invalidate({ + applicationId, + }); + }) + .catch(() => { + toast.error("Error to update the command"); + }); + }; + + return ( + + +
+ Cluster Settings + + Add the registry and the replicas of the application + +
+
+ +
+ +
+ ( + + Replicas + + { + field.onChange(Number(e.target.value)); + }} + type="number" + /> + + + + + )} + /> +
+ + {registries && registries?.length === 0 ? ( +
+
+ + + To use a cluster feature, you need to configure at least a + registry first. Please, go to{" "} + + Settings + {" "} + to do so. + +
+
+ ) : ( + <> + ( + + Select a registry + + + )} + /> + + )} +
+ +
+ + +
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx index efef6ca89..c5cf228da 100644 --- a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx +++ b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx @@ -23,6 +23,7 @@ import { AlertTriangle, Container } from "lucide-react"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; +import { toast } from "sonner"; import { z } from "zod"; const AddRegistrySchema = z.object({ @@ -38,6 +39,7 @@ const AddRegistrySchema = z.object({ registryUrl: z.string().min(1, { message: "Registry URL is required", }), + imagePrefix: z.string(), }); type AddRegistry = z.infer; @@ -45,39 +47,55 @@ type AddRegistry = z.infer; export const AddRegistry = () => { const utils = api.useUtils(); const [isOpen, setIsOpen] = useState(false); - const { mutateAsync, error, isError } = api.project.create.useMutation(); + const { mutateAsync, error, isError } = api.registry.create.useMutation(); + const { mutateAsync: testRegistry, isLoading } = + api.registry.testRegistry.useMutation(); const router = useRouter(); const form = useForm({ defaultValues: { username: "", password: "", registryUrl: "", + imagePrefix: "", + registryName: "", }, resolver: zodResolver(AddRegistrySchema), }); + console.log(form.formState.errors); + + const password = form.watch("password"); + const username = form.watch("username"); + const registryUrl = form.watch("registryUrl"); + const registryName = form.watch("registryName"); + const imagePrefix = form.watch("imagePrefix"); + useEffect(() => { form.reset({ username: "", password: "", registryUrl: "", + imagePrefix: "", }); }, [form, form.reset, form.formState.isSubmitSuccessful]); const onSubmit = async (data: AddRegistry) => { - // await mutateAsync({ - // name: data.name, - // description: data.description, - // }) - // .then(async (data) => { - // await utils.project.all.invalidate(); - // toast.success("Project Created"); - // setIsOpen(false); - // router.push(`/dashboard/project/${data.projectId}`); - // }) - // .catch(() => { - // toast.error("Error to create a project"); - // }); + await mutateAsync({ + password: data.password, + registryName: data.registryName, + username: data.username, + registryUrl: data.registryUrl, + registryType: "cloud", + imagePrefix: data.imagePrefix, + }) + .then(async (data) => { + await utils.registry.all.invalidate(); + toast.success("Registry added"); + setIsOpen(false); + }) + .catch(() => { + toast.error("Error to add a registry"); + }); }; return ( @@ -160,6 +178,22 @@ export const AddRegistry = () => { )} /> +
+ ( + + Image Prefix + + + + + + + )} + /> +
{ Registry URL @@ -180,7 +213,34 @@ export const AddRegistry = () => { )} />
- + + diff --git a/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx new file mode 100644 index 000000000..78a8d5008 --- /dev/null +++ b/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx @@ -0,0 +1,179 @@ +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 { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { AlertTriangle, Container } from "lucide-react"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { z } from "zod"; + +const AddRegistrySchema = z.object({ + username: z.string().min(1, { + message: "Username is required", + }), + password: z.string().min(1, { + message: "Password is required", + }), + registryUrl: z.string().min(1, { + message: "Registry URL is required", + }), +}); + +type AddRegistry = z.infer; + +export const AddSelfHostedRegistry = () => { + const utils = api.useUtils(); + const [isOpen, setIsOpen] = useState(false); + const { mutateAsync, error, isError, isLoading } = + api.registry.enableSelfHostedRegistry.useMutation(); + const router = useRouter(); + const form = useForm({ + defaultValues: { + username: "siumauricio", + password: "Password123", + registryUrl: "https://registry.dokploy.com", + }, + resolver: zodResolver(AddRegistrySchema), + }); + + useEffect(() => { + form.reset({ + registryUrl: "https://registry.dokploy.com", + username: "siumauricio", + password: "Password123", + }); + }, [form, form.reset, form.formState.isSubmitSuccessful]); + + const onSubmit = async (data: AddRegistry) => { + await mutateAsync({ + registryUrl: data.registryUrl, + username: data.username, + password: data.password, + }) + .then(async (data) => { + await utils.registry.all.invalidate(); + toast.success("Self Hosted Registry Created"); + setIsOpen(false); + }) + .catch(() => { + toast.error("Error to create a self hosted registry"); + }); + }; + + return ( + + + + + + + Add a self hosted registry + + Fill the next fields to add a self hosted registry. + + + {isError && ( +
+ + + {error?.message} + +
+ )} +
+ +
+ ( + + Username + + + + + + + )} + /> +
+
+ ( + + Password + + + + + + + )} + /> +
+
+ ( + + Registry URL + + + + + Point a DNS record to the VPS IP address. + + + + + )} + /> +
+ + + +
+ +
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/registry/add-self-registry.tsx b/components/dashboard/settings/cluster/registry/delete-registry.tsx similarity index 55% rename from components/dashboard/settings/cluster/registry/add-self-registry.tsx rename to components/dashboard/settings/cluster/registry/delete-registry.tsx index ee82487d5..a87f2e4e4 100644 --- a/components/dashboard/settings/cluster/registry/add-self-registry.tsx +++ b/components/dashboard/settings/cluster/registry/delete-registry.tsx @@ -12,35 +12,44 @@ import { } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { api } from "@/utils/api"; +import { TrashIcon } from "lucide-react"; import { toast } from "sonner"; -export const AddSelfRegistry = () => { +interface Props { + registryId: string; +} +export const DeleteRegistry = ({ registryId }: Props) => { + const { mutateAsync, isLoading } = api.registry.remove.useMutation(); + const utils = api.useUtils(); return ( - + Are you absolutely sure? - This will setup a self hosted registry. + This action cannot be undone. This will permanently delete the + registry. Cancel { - // await mutateAsync({ - // authId, - // }) - // .then(async () => { - // utils.user.all.invalidate(); - // toast.success("User delete succesfully"); - // }) - // .catch(() => { - // toast.error("Error to delete the user"); - // }); + await mutateAsync({ + registryId, + }) + .then(async () => { + utils.registry.all.invalidate(); + toast.success("Registry deleted"); + }) + .catch(() => { + toast.error("Error to delete the registry"); + }); }} > Confirm diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx index 4e85c9946..3bfc3bada 100644 --- a/components/dashboard/settings/cluster/registry/show-registry.tsx +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -6,19 +6,36 @@ import { CardTitle, } from "@/components/ui/card"; import { api } from "@/utils/api"; -import { Server, ShieldCheck } from "lucide-react"; +import { Server } from "lucide-react"; import { AddRegistry } from "./add-docker-registry"; -import { AddSelfRegistry } from "./add-self-registry"; +import { AddSelfHostedRegistry } from "./add-self-docker-registry"; +import { DeleteRegistry } from "./delete-registry"; export const ShowRegistry = () => { - const { data } = api.certificates.all.useQuery(); + const { data } = api.registry.all.useQuery(); + + const haveSelfHostedRegistry = data?.some( + (registry) => registry.registryType === "selfHosted", + ); return (
- - Clusters - Add cluster to your application. + +
+ Clusters + Add cluster to your application. +
+ +
+ {data && data?.length > 0 && ( + <> + {!haveSelfHostedRegistry && } + + + + )} +
{data?.length === 0 ? ( @@ -29,29 +46,28 @@ export const ShowRegistry = () => {
- +
{/* */}
) : ( -
- {data?.map((destination, index) => ( +
+ {data?.map((registry, index) => (
- {index + 1}. {destination.name} + {index + 1}. {registry.registryName}
- {/* */} +
))} +
{/* */}
)} diff --git a/drizzle/0005_cute_terror.sql b/drizzle/0005_cute_terror.sql new file mode 100644 index 000000000..70756b4d6 --- /dev/null +++ b/drizzle/0005_cute_terror.sql @@ -0,0 +1,22 @@ +DO $$ BEGIN + CREATE TYPE "RegistryType" AS ENUM('selfHosted', 'cloud'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "registry" ( + "registryId" text PRIMARY KEY NOT NULL, + "registryName" text NOT NULL, + "username" text NOT NULL, + "password" text NOT NULL, + "registryUrl" text NOT NULL, + "createdAt" text NOT NULL, + "selfHosted" "RegistryType" DEFAULT 'cloud' NOT NULL, + "adminId" text NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "registry" ADD CONSTRAINT "registry_adminId_admin_adminId_fk" FOREIGN KEY ("adminId") REFERENCES "admin"("adminId") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0006_oval_jimmy_woo.sql b/drizzle/0006_oval_jimmy_woo.sql new file mode 100644 index 000000000..e5eb2800f --- /dev/null +++ b/drizzle/0006_oval_jimmy_woo.sql @@ -0,0 +1,6 @@ +ALTER TABLE "application" ADD COLUMN "registryId" text;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "application" ADD CONSTRAINT "application_registryId_registry_registryId_fk" FOREIGN KEY ("registryId") REFERENCES "public"."registry"("registryId") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0007_cute_guardsmen.sql b/drizzle/0007_cute_guardsmen.sql new file mode 100644 index 000000000..39b38c436 --- /dev/null +++ b/drizzle/0007_cute_guardsmen.sql @@ -0,0 +1 @@ +ALTER TABLE "application" ADD COLUMN "replicas" integer DEFAULT 1; \ No newline at end of file diff --git a/drizzle/0008_lazy_sage.sql b/drizzle/0008_lazy_sage.sql new file mode 100644 index 000000000..409ef784b --- /dev/null +++ b/drizzle/0008_lazy_sage.sql @@ -0,0 +1,7 @@ +ALTER TABLE "application" DROP CONSTRAINT "application_registryId_registry_registryId_fk"; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "application" ADD CONSTRAINT "application_registryId_registry_registryId_fk" FOREIGN KEY ("registryId") REFERENCES "public"."registry"("registryId") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/drizzle/0009_majestic_spencer_smythe.sql b/drizzle/0009_majestic_spencer_smythe.sql new file mode 100644 index 000000000..1b0523931 --- /dev/null +++ b/drizzle/0009_majestic_spencer_smythe.sql @@ -0,0 +1 @@ +ALTER TABLE "application" ALTER COLUMN "replicas" SET NOT NULL; \ No newline at end of file diff --git a/drizzle/0010_lean_black_widow.sql b/drizzle/0010_lean_black_widow.sql new file mode 100644 index 000000000..95c675cec --- /dev/null +++ b/drizzle/0010_lean_black_widow.sql @@ -0,0 +1 @@ +ALTER TABLE "registry" ADD COLUMN "imagePrefix" text NOT NULL; \ No newline at end of file diff --git a/drizzle/0011_petite_calypso.sql b/drizzle/0011_petite_calypso.sql new file mode 100644 index 000000000..f6588550a --- /dev/null +++ b/drizzle/0011_petite_calypso.sql @@ -0,0 +1 @@ +ALTER TABLE "registry" ALTER COLUMN "imagePrefix" DROP NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 7e9c52484..28f27722f 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,10 +1,8 @@ { - "id": "c6215051-7cd1-412d-b8df-b50d58acacff", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "5", - "dialect": "pg", + "version": "6", + "dialect": "postgresql", "tables": { - "application": { + "public.application": { "name": "application", "schema": "", "columns": { @@ -234,29 +232,29 @@ "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "postgres": { + "public.postgres": { "name": "postgres", "schema": "", "columns": { @@ -375,29 +373,29 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "user": { + "public.user": { "name": "user", "schema": "", "columns": { @@ -499,34 +497,34 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "admin": { + "public.admin": { "name": "admin", "schema": "", "columns": { @@ -628,21 +626,21 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "auth": { + "public.auth": { "name": "auth", "schema": "", "columns": { @@ -689,14 +687,14 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } } }, - "project": { + "public.project": { "name": "project", "schema": "", "columns": { @@ -736,21 +734,21 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "domain": { + "public.domain": { "name": "domain", "schema": "", "columns": { @@ -818,21 +816,21 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mariadb": { + "public.mariadb": { "name": "mariadb", "schema": "", "columns": { @@ -957,29 +955,29 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mongo": { + "public.mongo": { "name": "mongo", "schema": "", "columns": { @@ -1092,29 +1090,29 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mysql": { + "public.mysql": { "name": "mysql", "schema": "", "columns": { @@ -1239,29 +1237,29 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "backup": { + "public.backup": { "name": "backup", "schema": "", "columns": { @@ -1337,73 +1335,73 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "destination": { + "public.destination": { "name": "destination", "schema": "", "columns": { @@ -1461,21 +1459,21 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "deployment": { + "public.deployment": { "name": "deployment", "schema": "", "columns": { @@ -1522,21 +1520,21 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mount": { + "public.mount": { "name": "mount", "schema": "", "columns": { @@ -1625,86 +1623,86 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "certificate": { + "public.certificate": { "name": "certificate", "schema": "", "columns": { @@ -1751,14 +1749,14 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } } }, - "session": { + "public.session": { "name": "session", "schema": "", "columns": { @@ -1786,21 +1784,21 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redirect": { + "public.redirect": { "name": "redirect", "schema": "", "columns": { @@ -1853,21 +1851,21 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "security": { + "public.security": { "name": "security", "schema": "", "columns": { @@ -1907,30 +1905,30 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } } }, - "port": { + "public.port": { "name": "port", "schema": "", "columns": { @@ -1970,21 +1968,21 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redis": { + "public.redis": { "name": "redis", "schema": "", "columns": { @@ -2091,118 +2089,130 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } } }, "enums": { - "buildType": { + "public.buildType": { "name": "buildType", - "values": { - "dockerfile": "dockerfile", - "heroku_buildpacks": "heroku_buildpacks", - "paketo_buildpacks": "paketo_buildpacks", - "nixpacks": "nixpacks" - } + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] }, - "sourceType": { + "public.sourceType": { "name": "sourceType", - "values": { - "docker": "docker", - "git": "git", - "github": "github" - } + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] }, - "Roles": { + "public.Roles": { "name": "Roles", - "values": { - "admin": "admin", - "user": "user" - } + "schema": "public", + "values": [ + "admin", + "user" + ] }, - "databaseType": { + "public.databaseType": { "name": "databaseType", - "values": { - "postgres": "postgres", - "mariadb": "mariadb", - "mysql": "mysql", - "mongo": "mongo" - } + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] }, - "deploymentStatus": { + "public.deploymentStatus": { "name": "deploymentStatus", - "values": { - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "running", + "done", + "error" + ] }, - "mountType": { + "public.mountType": { "name": "mountType", - "values": { - "bind": "bind", - "volume": "volume", - "file": "file" - } + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] }, - "serviceType": { + "public.serviceType": { "name": "serviceType", - "values": { - "application": "application", - "postgres": "postgres", - "mysql": "mysql", - "mariadb": "mariadb", - "mongo": "mongo", - "redis": "redis" - } + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis" + ] }, - "protocolType": { + "public.protocolType": { "name": "protocolType", - "values": { - "tcp": "tcp", - "udp": "udp" - } + "schema": "public", + "values": [ + "tcp", + "udp" + ] }, - "applicationStatus": { + "public.applicationStatus": { "name": "applicationStatus", - "values": { - "idle": "idle", - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] }, - "certificateType": { + "public.certificateType": { "name": "certificateType", - "values": { - "letsencrypt": "letsencrypt", - "none": "none" - } + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] } }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "c6215051-7cd1-412d-b8df-b50d58acacff", + "prevId": "00000000-0000-0000-0000-000000000000" } \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json index e8842a191..17cfe8ef3 100644 --- a/drizzle/meta/0001_snapshot.json +++ b/drizzle/meta/0001_snapshot.json @@ -1,10 +1,8 @@ { - "id": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652", - "prevId": "c6215051-7cd1-412d-b8df-b50d58acacff", - "version": "5", - "dialect": "pg", + "version": "6", + "dialect": "postgresql", "tables": { - "application": { + "public.application": { "name": "application", "schema": "", "columns": { @@ -234,29 +232,29 @@ "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "postgres": { + "public.postgres": { "name": "postgres", "schema": "", "columns": { @@ -375,29 +373,29 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "user": { + "public.user": { "name": "user", "schema": "", "columns": { @@ -499,34 +497,34 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "admin": { + "public.admin": { "name": "admin", "schema": "", "columns": { @@ -628,21 +626,21 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "auth": { + "public.auth": { "name": "auth", "schema": "", "columns": { @@ -695,14 +693,14 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } } }, - "project": { + "public.project": { "name": "project", "schema": "", "columns": { @@ -742,21 +740,21 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "domain": { + "public.domain": { "name": "domain", "schema": "", "columns": { @@ -824,21 +822,21 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mariadb": { + "public.mariadb": { "name": "mariadb", "schema": "", "columns": { @@ -963,29 +961,29 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mongo": { + "public.mongo": { "name": "mongo", "schema": "", "columns": { @@ -1098,29 +1096,29 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mysql": { + "public.mysql": { "name": "mysql", "schema": "", "columns": { @@ -1245,29 +1243,29 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "backup": { + "public.backup": { "name": "backup", "schema": "", "columns": { @@ -1343,73 +1341,73 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "destination": { + "public.destination": { "name": "destination", "schema": "", "columns": { @@ -1467,21 +1465,21 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "deployment": { + "public.deployment": { "name": "deployment", "schema": "", "columns": { @@ -1528,21 +1526,21 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mount": { + "public.mount": { "name": "mount", "schema": "", "columns": { @@ -1631,86 +1629,86 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "certificate": { + "public.certificate": { "name": "certificate", "schema": "", "columns": { @@ -1757,14 +1755,14 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } } }, - "session": { + "public.session": { "name": "session", "schema": "", "columns": { @@ -1792,21 +1790,21 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redirect": { + "public.redirect": { "name": "redirect", "schema": "", "columns": { @@ -1859,21 +1857,21 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "security": { + "public.security": { "name": "security", "schema": "", "columns": { @@ -1913,30 +1911,30 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } } }, - "port": { + "public.port": { "name": "port", "schema": "", "columns": { @@ -1976,21 +1974,21 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redis": { + "public.redis": { "name": "redis", "schema": "", "columns": { @@ -2097,118 +2095,130 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } } }, "enums": { - "buildType": { + "public.buildType": { "name": "buildType", - "values": { - "dockerfile": "dockerfile", - "heroku_buildpacks": "heroku_buildpacks", - "paketo_buildpacks": "paketo_buildpacks", - "nixpacks": "nixpacks" - } + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] }, - "sourceType": { + "public.sourceType": { "name": "sourceType", - "values": { - "docker": "docker", - "git": "git", - "github": "github" - } + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] }, - "Roles": { + "public.Roles": { "name": "Roles", - "values": { - "admin": "admin", - "user": "user" - } + "schema": "public", + "values": [ + "admin", + "user" + ] }, - "databaseType": { + "public.databaseType": { "name": "databaseType", - "values": { - "postgres": "postgres", - "mariadb": "mariadb", - "mysql": "mysql", - "mongo": "mongo" - } + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] }, - "deploymentStatus": { + "public.deploymentStatus": { "name": "deploymentStatus", - "values": { - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "running", + "done", + "error" + ] }, - "mountType": { + "public.mountType": { "name": "mountType", - "values": { - "bind": "bind", - "volume": "volume", - "file": "file" - } + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] }, - "serviceType": { + "public.serviceType": { "name": "serviceType", - "values": { - "application": "application", - "postgres": "postgres", - "mysql": "mysql", - "mariadb": "mariadb", - "mongo": "mongo", - "redis": "redis" - } + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis" + ] }, - "protocolType": { + "public.protocolType": { "name": "protocolType", - "values": { - "tcp": "tcp", - "udp": "udp" - } + "schema": "public", + "values": [ + "tcp", + "udp" + ] }, - "applicationStatus": { + "public.applicationStatus": { "name": "applicationStatus", - "values": { - "idle": "idle", - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] }, - "certificateType": { + "public.certificateType": { "name": "certificateType", - "values": { - "letsencrypt": "letsencrypt", - "none": "none" - } + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] } }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652", + "prevId": "c6215051-7cd1-412d-b8df-b50d58acacff" } \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json index fb4f267d0..0f2f9870c 100644 --- a/drizzle/meta/0002_snapshot.json +++ b/drizzle/meta/0002_snapshot.json @@ -1,10 +1,8 @@ { - "id": "665483bd-5123-4c2b-beef-bfa9b91b9356", - "prevId": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652", - "version": "5", - "dialect": "pg", + "version": "6", + "dialect": "postgresql", "tables": { - "application": { + "public.application": { "name": "application", "schema": "", "columns": { @@ -234,29 +232,29 @@ "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "postgres": { + "public.postgres": { "name": "postgres", "schema": "", "columns": { @@ -375,29 +373,29 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "user": { + "public.user": { "name": "user", "schema": "", "columns": { @@ -499,34 +497,34 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "admin": { + "public.admin": { "name": "admin", "schema": "", "columns": { @@ -628,21 +626,21 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "auth": { + "public.auth": { "name": "auth", "schema": "", "columns": { @@ -702,14 +700,14 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } } }, - "project": { + "public.project": { "name": "project", "schema": "", "columns": { @@ -749,21 +747,21 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "domain": { + "public.domain": { "name": "domain", "schema": "", "columns": { @@ -831,21 +829,21 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mariadb": { + "public.mariadb": { "name": "mariadb", "schema": "", "columns": { @@ -970,29 +968,29 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mongo": { + "public.mongo": { "name": "mongo", "schema": "", "columns": { @@ -1105,29 +1103,29 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mysql": { + "public.mysql": { "name": "mysql", "schema": "", "columns": { @@ -1252,29 +1250,29 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "backup": { + "public.backup": { "name": "backup", "schema": "", "columns": { @@ -1350,73 +1348,73 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "destination": { + "public.destination": { "name": "destination", "schema": "", "columns": { @@ -1474,21 +1472,21 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "deployment": { + "public.deployment": { "name": "deployment", "schema": "", "columns": { @@ -1535,21 +1533,21 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mount": { + "public.mount": { "name": "mount", "schema": "", "columns": { @@ -1638,86 +1636,86 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "certificate": { + "public.certificate": { "name": "certificate", "schema": "", "columns": { @@ -1764,14 +1762,14 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } } }, - "session": { + "public.session": { "name": "session", "schema": "", "columns": { @@ -1799,21 +1797,21 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redirect": { + "public.redirect": { "name": "redirect", "schema": "", "columns": { @@ -1866,21 +1864,21 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "security": { + "public.security": { "name": "security", "schema": "", "columns": { @@ -1920,30 +1918,30 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } } }, - "port": { + "public.port": { "name": "port", "schema": "", "columns": { @@ -1983,21 +1981,21 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redis": { + "public.redis": { "name": "redis", "schema": "", "columns": { @@ -2104,118 +2102,130 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } } }, "enums": { - "buildType": { + "public.buildType": { "name": "buildType", - "values": { - "dockerfile": "dockerfile", - "heroku_buildpacks": "heroku_buildpacks", - "paketo_buildpacks": "paketo_buildpacks", - "nixpacks": "nixpacks" - } + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] }, - "sourceType": { + "public.sourceType": { "name": "sourceType", - "values": { - "docker": "docker", - "git": "git", - "github": "github" - } + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] }, - "Roles": { + "public.Roles": { "name": "Roles", - "values": { - "admin": "admin", - "user": "user" - } + "schema": "public", + "values": [ + "admin", + "user" + ] }, - "databaseType": { + "public.databaseType": { "name": "databaseType", - "values": { - "postgres": "postgres", - "mariadb": "mariadb", - "mysql": "mysql", - "mongo": "mongo" - } + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] }, - "deploymentStatus": { + "public.deploymentStatus": { "name": "deploymentStatus", - "values": { - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "running", + "done", + "error" + ] }, - "mountType": { + "public.mountType": { "name": "mountType", - "values": { - "bind": "bind", - "volume": "volume", - "file": "file" - } + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] }, - "serviceType": { + "public.serviceType": { "name": "serviceType", - "values": { - "application": "application", - "postgres": "postgres", - "mysql": "mysql", - "mariadb": "mariadb", - "mongo": "mongo", - "redis": "redis" - } + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis" + ] }, - "protocolType": { + "public.protocolType": { "name": "protocolType", - "values": { - "tcp": "tcp", - "udp": "udp" - } + "schema": "public", + "values": [ + "tcp", + "udp" + ] }, - "applicationStatus": { + "public.applicationStatus": { "name": "applicationStatus", - "values": { - "idle": "idle", - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] }, - "certificateType": { + "public.certificateType": { "name": "certificateType", - "values": { - "letsencrypt": "letsencrypt", - "none": "none" - } + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] } }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "665483bd-5123-4c2b-beef-bfa9b91b9356", + "prevId": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652" } \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json index cc29060f3..de0fd49c6 100644 --- a/drizzle/meta/0003_snapshot.json +++ b/drizzle/meta/0003_snapshot.json @@ -1,10 +1,8 @@ { - "id": "5a1d3f2b-9c31-4125-9645-015170550b51", - "prevId": "665483bd-5123-4c2b-beef-bfa9b91b9356", - "version": "5", - "dialect": "pg", + "version": "6", + "dialect": "postgresql", "tables": { - "application": { + "public.application": { "name": "application", "schema": "", "columns": { @@ -234,29 +232,29 @@ "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "postgres": { + "public.postgres": { "name": "postgres", "schema": "", "columns": { @@ -375,29 +373,29 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "user": { + "public.user": { "name": "user", "schema": "", "columns": { @@ -506,34 +504,34 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "admin": { + "public.admin": { "name": "admin", "schema": "", "columns": { @@ -635,21 +633,21 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "auth": { + "public.auth": { "name": "auth", "schema": "", "columns": { @@ -709,14 +707,14 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } } }, - "project": { + "public.project": { "name": "project", "schema": "", "columns": { @@ -756,21 +754,21 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "domain": { + "public.domain": { "name": "domain", "schema": "", "columns": { @@ -838,21 +836,21 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mariadb": { + "public.mariadb": { "name": "mariadb", "schema": "", "columns": { @@ -977,29 +975,29 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mongo": { + "public.mongo": { "name": "mongo", "schema": "", "columns": { @@ -1112,29 +1110,29 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mysql": { + "public.mysql": { "name": "mysql", "schema": "", "columns": { @@ -1259,29 +1257,29 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "backup": { + "public.backup": { "name": "backup", "schema": "", "columns": { @@ -1357,73 +1355,73 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "destination": { + "public.destination": { "name": "destination", "schema": "", "columns": { @@ -1481,21 +1479,21 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "deployment": { + "public.deployment": { "name": "deployment", "schema": "", "columns": { @@ -1542,21 +1540,21 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mount": { + "public.mount": { "name": "mount", "schema": "", "columns": { @@ -1645,86 +1643,86 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "certificate": { + "public.certificate": { "name": "certificate", "schema": "", "columns": { @@ -1771,14 +1769,14 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } } }, - "session": { + "public.session": { "name": "session", "schema": "", "columns": { @@ -1806,21 +1804,21 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redirect": { + "public.redirect": { "name": "redirect", "schema": "", "columns": { @@ -1873,21 +1871,21 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "security": { + "public.security": { "name": "security", "schema": "", "columns": { @@ -1927,30 +1925,30 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } } }, - "port": { + "public.port": { "name": "port", "schema": "", "columns": { @@ -1990,21 +1988,21 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redis": { + "public.redis": { "name": "redis", "schema": "", "columns": { @@ -2111,118 +2109,130 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } } }, "enums": { - "buildType": { + "public.buildType": { "name": "buildType", - "values": { - "dockerfile": "dockerfile", - "heroku_buildpacks": "heroku_buildpacks", - "paketo_buildpacks": "paketo_buildpacks", - "nixpacks": "nixpacks" - } + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] }, - "sourceType": { + "public.sourceType": { "name": "sourceType", - "values": { - "docker": "docker", - "git": "git", - "github": "github" - } + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] }, - "Roles": { + "public.Roles": { "name": "Roles", - "values": { - "admin": "admin", - "user": "user" - } + "schema": "public", + "values": [ + "admin", + "user" + ] }, - "databaseType": { + "public.databaseType": { "name": "databaseType", - "values": { - "postgres": "postgres", - "mariadb": "mariadb", - "mysql": "mysql", - "mongo": "mongo" - } + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] }, - "deploymentStatus": { + "public.deploymentStatus": { "name": "deploymentStatus", - "values": { - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "running", + "done", + "error" + ] }, - "mountType": { + "public.mountType": { "name": "mountType", - "values": { - "bind": "bind", - "volume": "volume", - "file": "file" - } + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] }, - "serviceType": { + "public.serviceType": { "name": "serviceType", - "values": { - "application": "application", - "postgres": "postgres", - "mysql": "mysql", - "mariadb": "mariadb", - "mongo": "mongo", - "redis": "redis" - } + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis" + ] }, - "protocolType": { + "public.protocolType": { "name": "protocolType", - "values": { - "tcp": "tcp", - "udp": "udp" - } + "schema": "public", + "values": [ + "tcp", + "udp" + ] }, - "applicationStatus": { + "public.applicationStatus": { "name": "applicationStatus", - "values": { - "idle": "idle", - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] }, - "certificateType": { + "public.certificateType": { "name": "certificateType", - "values": { - "letsencrypt": "letsencrypt", - "none": "none" - } + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] } }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "5a1d3f2b-9c31-4125-9645-015170550b51", + "prevId": "665483bd-5123-4c2b-beef-bfa9b91b9356" } \ No newline at end of file diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json index 150db8266..0e0cf4572 100644 --- a/drizzle/meta/0004_snapshot.json +++ b/drizzle/meta/0004_snapshot.json @@ -1,10 +1,8 @@ { - "id": "7bb4bbcf-791c-4888-919e-f74bc0528b5f", - "prevId": "5a1d3f2b-9c31-4125-9645-015170550b51", - "version": "5", - "dialect": "pg", + "version": "6", + "dialect": "postgresql", "tables": { - "application": { + "public.application": { "name": "application", "schema": "", "columns": { @@ -210,29 +208,29 @@ "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "postgres": { + "public.postgres": { "name": "postgres", "schema": "", "columns": { @@ -351,29 +349,29 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "user": { + "public.user": { "name": "user", "schema": "", "columns": { @@ -482,34 +480,34 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "admin": { + "public.admin": { "name": "admin", "schema": "", "columns": { @@ -611,21 +609,21 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "auth": { + "public.auth": { "name": "auth", "schema": "", "columns": { @@ -685,14 +683,14 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } } }, - "project": { + "public.project": { "name": "project", "schema": "", "columns": { @@ -732,21 +730,21 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "domain": { + "public.domain": { "name": "domain", "schema": "", "columns": { @@ -814,21 +812,21 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mariadb": { + "public.mariadb": { "name": "mariadb", "schema": "", "columns": { @@ -953,29 +951,29 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mongo": { + "public.mongo": { "name": "mongo", "schema": "", "columns": { @@ -1088,29 +1086,29 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "mysql": { + "public.mysql": { "name": "mysql", "schema": "", "columns": { @@ -1235,29 +1233,29 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } }, - "backup": { + "public.backup": { "name": "backup", "schema": "", "columns": { @@ -1333,73 +1331,73 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "destination": { + "public.destination": { "name": "destination", "schema": "", "columns": { @@ -1457,21 +1455,21 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "deployment": { + "public.deployment": { "name": "deployment", "schema": "", "columns": { @@ -1518,21 +1516,21 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "mount": { + "public.mount": { "name": "mount", "schema": "", "columns": { @@ -1621,86 +1619,86 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "certificate": { + "public.certificate": { "name": "certificate", "schema": "", "columns": { @@ -1747,14 +1745,14 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } } }, - "session": { + "public.session": { "name": "session", "schema": "", "columns": { @@ -1782,21 +1780,21 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redirect": { + "public.redirect": { "name": "redirect", "schema": "", "columns": { @@ -1849,21 +1847,21 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "security": { + "public.security": { "name": "security", "schema": "", "columns": { @@ -1903,30 +1901,30 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } } }, - "port": { + "public.port": { "name": "port", "schema": "", "columns": { @@ -1966,21 +1964,21 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "redis": { + "public.redis": { "name": "redis", "schema": "", "columns": { @@ -2087,118 +2085,130 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } } } }, "enums": { - "buildType": { + "public.buildType": { "name": "buildType", - "values": { - "dockerfile": "dockerfile", - "heroku_buildpacks": "heroku_buildpacks", - "paketo_buildpacks": "paketo_buildpacks", - "nixpacks": "nixpacks" - } + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] }, - "sourceType": { + "public.sourceType": { "name": "sourceType", - "values": { - "docker": "docker", - "git": "git", - "github": "github" - } + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] }, - "Roles": { + "public.Roles": { "name": "Roles", - "values": { - "admin": "admin", - "user": "user" - } + "schema": "public", + "values": [ + "admin", + "user" + ] }, - "databaseType": { + "public.databaseType": { "name": "databaseType", - "values": { - "postgres": "postgres", - "mariadb": "mariadb", - "mysql": "mysql", - "mongo": "mongo" - } + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] }, - "deploymentStatus": { + "public.deploymentStatus": { "name": "deploymentStatus", - "values": { - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "running", + "done", + "error" + ] }, - "mountType": { + "public.mountType": { "name": "mountType", - "values": { - "bind": "bind", - "volume": "volume", - "file": "file" - } + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] }, - "serviceType": { + "public.serviceType": { "name": "serviceType", - "values": { - "application": "application", - "postgres": "postgres", - "mysql": "mysql", - "mariadb": "mariadb", - "mongo": "mongo", - "redis": "redis" - } + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis" + ] }, - "protocolType": { + "public.protocolType": { "name": "protocolType", - "values": { - "tcp": "tcp", - "udp": "udp" - } + "schema": "public", + "values": [ + "tcp", + "udp" + ] }, - "applicationStatus": { + "public.applicationStatus": { "name": "applicationStatus", - "values": { - "idle": "idle", - "running": "running", - "done": "done", - "error": "error" - } + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] }, - "certificateType": { + "public.certificateType": { "name": "certificateType", - "values": { - "letsencrypt": "letsencrypt", - "none": "none" - } + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] } }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "7bb4bbcf-791c-4888-919e-f74bc0528b5f", + "prevId": "5a1d3f2b-9c31-4125-9645-015170550b51" } \ No newline at end of file diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json new file mode 100644 index 000000000..30ac2bb33 --- /dev/null +++ b/drizzle/meta/0005_snapshot.json @@ -0,0 +1,2295 @@ +{ + "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 + }, + "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", + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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", + "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", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "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 + }, + "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", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "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 + }, + "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", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "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", + "columns": [ + "email" + ], + "nullsNotDistinct": false + } + } + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "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", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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", + "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", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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", + "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", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "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", + "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", + "columnsFrom": [ + "destinationId" + ], + "tableTo": "destination", + "columnsTo": [ + "destinationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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 + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "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 + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "redisId" + ], + "tableTo": "redis", + "columnsTo": [ + "redisId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "columns": [ + "certificatePath" + ], + "nullsNotDistinct": false + } + } + }, + "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", + "columnsFrom": [ + "user_id" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "columns": [ + "username", + "applicationId" + ], + "nullsNotDistinct": false + } + } + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "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", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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", + "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", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + } + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "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", + "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", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "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" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "92c75e26-64ef-484f-a7d2-72a9422c119f", + "prevId": "7bb4bbcf-791c-4888-919e-f74bc0528b5f" +} \ No newline at end of file diff --git a/drizzle/meta/0006_snapshot.json b/drizzle/meta/0006_snapshot.json new file mode 100644 index 000000000..37764831a --- /dev/null +++ b/drizzle/meta/0006_snapshot.json @@ -0,0 +1,2331 @@ +{ + "id": "8ca71247-d512-427d-b115-47a7287ac431", + "prevId": "92c75e26-64ef-484f-a7d2-72a9422c119f", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "cascade", + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0007_snapshot.json b/drizzle/meta/0007_snapshot.json new file mode 100644 index 000000000..a3292da07 --- /dev/null +++ b/drizzle/meta/0007_snapshot.json @@ -0,0 +1,2338 @@ +{ + "id": "80176730-273b-45e4-a7ca-760e29ad6d02", + "prevId": "8ca71247-d512-427d-b115-47a7287ac431", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": false, + "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_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "cascade", + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0008_snapshot.json b/drizzle/meta/0008_snapshot.json new file mode 100644 index 000000000..c09360d28 --- /dev/null +++ b/drizzle/meta/0008_snapshot.json @@ -0,0 +1,2338 @@ +{ + "id": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", + "prevId": "80176730-273b-45e4-a7ca-760e29ad6d02", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": false, + "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_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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0009_snapshot.json b/drizzle/meta/0009_snapshot.json new file mode 100644 index 000000000..906bd91ae --- /dev/null +++ b/drizzle/meta/0009_snapshot.json @@ -0,0 +1,2338 @@ +{ + "id": "81eb82a8-2190-4dee-a6c8-416ea98e2547", + "prevId": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "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_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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0010_snapshot.json b/drizzle/meta/0010_snapshot.json new file mode 100644 index 000000000..30db79130 --- /dev/null +++ b/drizzle/meta/0010_snapshot.json @@ -0,0 +1,2344 @@ +{ + "id": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", + "prevId": "81eb82a8-2190-4dee-a6c8-416ea98e2547", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "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_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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.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": true + }, + "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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0011_snapshot.json b/drizzle/meta/0011_snapshot.json new file mode 100644 index 000000000..24dc37040 --- /dev/null +++ b/drizzle/meta/0011_snapshot.json @@ -0,0 +1,2344 @@ +{ + "id": "9c6bb052-9f90-46fd-9382-67984e03f5b1", + "prevId": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", + "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 + }, + "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 + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "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_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 + }, + "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 + }, + "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 + }, + "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 + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "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 + }, + "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": true + }, + "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" + } + }, + "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 + }, + "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 + } + }, + "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" + } + }, + "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.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": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "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" + ] + }, + "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.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index ae4b256fe..4b2bbaf1f 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -36,6 +36,55 @@ "when": 1714004732716, "tag": "0004_nice_tenebrous", "breakpoints": true + }, + { + "idx": 5, + "version": "5", + "when": 1715551130605, + "tag": "0005_cute_terror", + "breakpoints": true + }, + { + "idx": 6, + "version": "6", + "when": 1715563165991, + "tag": "0006_oval_jimmy_woo", + "breakpoints": true + }, + { + "idx": 7, + "version": "6", + "when": 1715563497100, + "tag": "0007_cute_guardsmen", + "breakpoints": true + }, + { + "idx": 8, + "version": "6", + "when": 1715564143641, + "tag": "0008_lazy_sage", + "breakpoints": true + }, + { + "idx": 9, + "version": "6", + "when": 1715564774423, + "tag": "0009_majestic_spencer_smythe", + "breakpoints": true + }, + { + "idx": 10, + "version": "6", + "when": 1715574037832, + "tag": "0010_lean_black_widow", + "breakpoints": true + }, + { + "idx": 11, + "version": "6", + "when": 1715574230599, + "tag": "0011_petite_calypso", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index bb7284270..babae882e 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,12 @@ "setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run", "reset-password": "node dist/reset-password.mjs", "dev": "tsx watch -r dotenv/config ./server/server.ts --project tsconfig.server.json ", - "migration:generate": "drizzle-kit generate:pg --config ./server/db/drizzle.config.ts", + "studio":"drizzle-kit studio --config ./server/db/drizzle.config.ts", + "migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts", "migration:run": "tsx -r dotenv/config migration.ts", + "migration:up":"drizzle-kit up --config ./server/db/drizzle.config.ts", "migration:drop": "drizzle-kit drop --config ./server/db/drizzle.config.ts", - "db:push": "drizzle-kit push:pg --config ./server/db/drizzle.config.ts", + "db:push": "drizzle-kit --config ./server/db/drizzle.config.ts", "db:truncate": "tsx -r dotenv/config ./server/db/reset.ts", "db:studio": "drizzle-kit studio", "lint": "biome lint", @@ -117,7 +119,7 @@ "@types/tar-fs": "2.0.4", "@types/ws": "8.5.10", "autoprefixer": "^10.4.14", - "drizzle-kit": "^0.20.14", + "drizzle-kit": "^0.21.1", "esbuild": "0.20.2", "localtunnel": "2.0.2", "postcss": "^8.4.31", diff --git a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx index a26bec4a7..71f46eab7 100644 --- a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx +++ b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx @@ -1,3 +1,4 @@ +import { ShowClusterSettings } from "@/components/dashboard/application/advanced/cluster/show-cluster-settings"; import { AddCommand } from "@/components/dashboard/application/advanced/general/add-command"; import { ShowPorts } from "@/components/dashboard/application/advanced/ports/show-port"; import { ShowRedirects } from "@/components/dashboard/application/advanced/redirects/show-redirects"; @@ -175,6 +176,7 @@ const Service = (
+ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61d1677b7..eb727c9a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -266,8 +266,8 @@ devDependencies: specifier: ^10.4.14 version: 10.4.18(postcss@8.4.35) drizzle-kit: - specifier: ^0.20.14 - version: 0.20.14 + specifier: ^0.21.1 + version: 0.21.1 esbuild: specifier: 0.20.2 version: 0.20.2 @@ -1032,12 +1032,6 @@ packages: dev: true optional: true - /@drizzle-team/studio@0.0.39: - resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} - dependencies: - superjson: 2.2.1 - dev: true - /@emnapi/core@0.45.0: resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} requiresBuild: true @@ -4728,19 +4722,9 @@ packages: engines: {node: '>=6'} dev: false - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true - /caniuse-lite@1.0.30001598: resolution: {integrity: sha512-j8mQRDziG94uoBfeFuqsJUNECW37DXpnvhcMJMdlH2u3MRkq1sAI0LJcXP1i/Py0KbSIC4UDj8YHPrTn5YsL+Q==} - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4877,6 +4861,7 @@ packages: engines: {node: '>=12.13'} dependencies: is-what: 4.1.16 + dev: false /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -5143,14 +5128,11 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.14: - resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} + /drizzle-kit@0.21.1: + resolution: {integrity: sha512-Sp7OnCdROiE2ebMuHsAfrnRoHVGYCvErQxUh7/0l6R1caHssZu9oZu/hW9rLU19xnTK4/y3iSe3sL0Cc530wCg==} hasBin: true dependencies: - '@drizzle-team/studio': 0.0.39 '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 commander: 9.5.0 env-paths: 3.0.0 esbuild: 0.19.12 @@ -5158,8 +5140,6 @@ packages: glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.6.0 zod: 3.23.4 transitivePeerDependencies: - supports-color @@ -5834,6 +5814,7 @@ packages: /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + dev: false /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -6015,6 +5996,7 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: false /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} @@ -6095,13 +6077,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -6909,6 +6884,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: false /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -7073,6 +7049,7 @@ packages: engines: {node: '>=16'} dependencies: copy-anything: 3.0.5 + dev: false /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -7456,6 +7433,7 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false /yaml@2.4.1: resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} diff --git a/server/api/root.ts b/server/api/root.ts index 6fb895a83..d9b02e20a 100644 --- a/server/api/root.ts +++ b/server/api/root.ts @@ -20,6 +20,7 @@ import { securityRouter } from "./routers/security"; import { portRouter } from "./routers/port"; import { adminRouter } from "./routers/admin"; import { dockerRouter } from "./routers/docker"; +import { registryRouter } from "./routers/registry"; /** * This is the primary router for your server. * @@ -47,6 +48,7 @@ export const appRouter = createTRPCRouter({ security: securityRouter, redirects: redirectsRouter, port: portRouter, + registry: registryRouter, }); // export type definition of API diff --git a/server/api/routers/registry.ts b/server/api/routers/registry.ts index 725861c5f..0fe097765 100644 --- a/server/api/routers/registry.ts +++ b/server/api/routers/registry.ts @@ -7,12 +7,16 @@ import { } from "@/server/db/schema"; import { createRegistry, + findAllRegistry, findRegistryById, removeRegistry, updaterRegistry, } from "../services/registry"; import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; import { TRPCError } from "@trpc/server"; +import { manageRegistry } from "@/server/utils/traefik/registry"; +import { initializeRegistry } from "@/server/setup/registry-setup"; +import { docker } from "@/server/constants"; export const registryRouter = createTRPCRouter({ create: adminProcedure @@ -42,25 +46,41 @@ export const registryRouter = createTRPCRouter({ return true; }), + all: protectedProcedure.query(async () => { + return await findAllRegistry(); + }), findOne: adminProcedure.input(apiFindOneRegistry).query(async ({ input }) => { return await findRegistryById(input.registryId); }), + testRegistry: protectedProcedure + .input(apiCreateRegistry) + .mutation(async ({ input }) => { + try { + const result = await docker.checkAuth({ + username: input.username, + password: input.password, + serveraddress: input.registryUrl, + }); + + return true; + } catch (error) { + return false; + } + }), - enableSelfHostedRegistry: protectedProcedure + enableSelfHostedRegistry: adminProcedure .input(apiEnableSelfHostedRegistry) .mutation(async ({ input }) => { - // return await createRegistry({ - // username:"CUSTOM" - // adminId: input.adminId, - // }); - // const application = await findRegistryById(input.registryId); - // const result = await db - // .update(registry) - // .set({ - // selfHosted: true, - // }) - // .where(eq(registry.registryId, input.registryId)) - // .returning(); - // return result[0]; + const selfHostedRegistry = await createRegistry({ + ...input, + registryName: "Self Hosted Registry", + registryType: "selfHosted", + imagePrefix: null, + }); + + await manageRegistry(selfHostedRegistry); + await initializeRegistry(input.username, input.password); + + return selfHostedRegistry; }), }); diff --git a/server/api/services/application.ts b/server/api/services/application.ts index d5da79c40..a7e365334 100644 --- a/server/api/services/application.ts +++ b/server/api/services/application.ts @@ -61,6 +61,7 @@ export const findApplicationById = async (applicationId: string) => { redirects: true, security: true, ports: true, + registry: true, }, }); if (!application) { diff --git a/server/api/services/registry.ts b/server/api/services/registry.ts index ac8f2080a..149927d5f 100644 --- a/server/api/services/registry.ts +++ b/server/api/services/registry.ts @@ -2,14 +2,20 @@ import { type apiCreateRegistry, registry } from "@/server/db/schema"; import { TRPCError } from "@trpc/server"; import { db } from "@/server/db"; import { eq } from "drizzle-orm"; +import { findAdmin } from "./admin"; +import { removeSelfHostedRegistry } from "@/server/utils/traefik/registry"; +import { removeService } from "@/server/utils/docker/utils"; export type Registry = typeof registry.$inferSelect; export const createRegistry = async (input: typeof apiCreateRegistry._type) => { + const admin = await findAdmin(); + const newRegistry = await db .insert(registry) .values({ ...input, + adminId: admin.adminId, }) .returning() .then((value) => value[0]); @@ -38,6 +44,11 @@ export const removeRegistry = async (registryId: string) => { }); } + if (response.registryType === "selfHosted") { + await removeSelfHostedRegistry(); + await removeService("dokploy-registry"); + } + return response; } catch (error) { throw new TRPCError({ @@ -82,3 +93,8 @@ export const findRegistryById = async (registryId: string) => { } return registryResponse; }; + +export const findAllRegistry = async () => { + const registryResponse = await db.query.registry.findMany(); + return registryResponse; +}; diff --git a/server/constants/index.ts b/server/constants/index.ts index 4c7cd5a5c..49de9338f 100644 --- a/server/constants/index.ts +++ b/server/constants/index.ts @@ -11,5 +11,6 @@ export const LOGS_PATH = `${BASE_PATH}/logs`; export const APPLICATIONS_PATH = `${BASE_PATH}/applications`; export const SSH_PATH = `${BASE_PATH}/ssh`; export const CERTIFICATES_PATH = `${DYNAMIC_TRAEFIK_PATH}/certificates`; +export const REGISTRY_PATH = `${DYNAMIC_TRAEFIK_PATH}/registry`; export const MONITORING_PATH = `${BASE_PATH}/monitoring`; export const docker = new Docker(); diff --git a/server/db/drizzle.config.ts b/server/db/drizzle.config.ts index e8349e8fb..f556649be 100644 --- a/server/db/drizzle.config.ts +++ b/server/db/drizzle.config.ts @@ -1,13 +1,14 @@ -import type { Config } from "drizzle-kit"; +import { defineConfig } from "drizzle-kit"; -console.log("> Generating PG Schema:", process.env.DATABASE_URL); -export default { +export default defineConfig({ schema: "./server/db/schema/index.ts", - driver: "pg", + dialect: "postgresql", dbCredentials: { - connectionString: process.env.DATABASE_URL || "", + url: process.env.DATABASE_URL || "", }, - verbose: true, - strict: true, out: "drizzle", -} satisfies Config; + migrations: { + table: "migrations", + schema: "public", + }, +}); diff --git a/server/db/schema/application.ts b/server/db/schema/application.ts index abdeed53e..26e1bf102 100644 --- a/server/db/schema/application.ts +++ b/server/db/schema/application.ts @@ -12,6 +12,7 @@ import { applicationStatus } from "./shared"; import { ports } from "./port"; import { boolean, integer, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; import { generateAppName } from "./utils"; +import { registry } from "./registry"; export const sourceType = pgEnum("sourceType", ["docker", "git", "github"]); @@ -60,6 +61,7 @@ export const applications = pgTable("application", { customGitBuildPath: text("customGitBuildPath"), customGitSSHKey: text("customGitSSHKey"), dockerfile: text("dockerfile"), + replicas: integer("replicas").default(1).notNull(), applicationStatus: applicationStatus("applicationStatus") .notNull() .default("idle"), @@ -67,6 +69,9 @@ export const applications = pgTable("application", { createdAt: text("createdAt") .notNull() .$defaultFn(() => new Date().toISOString()), + registryId: text("registryId").references(() => registry.registryId, { + onDelete: "set null", + }), projectId: text("projectId") .notNull() .references(() => projects.projectId, { onDelete: "cascade" }), @@ -85,6 +90,10 @@ export const applicationsRelations = relations( redirects: many(redirects), security: many(security), ports: many(ports), + registry: one(registry, { + fields: [applications.registryId], + references: [registry.registryId], + }), }), ); diff --git a/server/db/schema/registry.ts b/server/db/schema/registry.ts index b502648a6..9a536c7c2 100644 --- a/server/db/schema/registry.ts +++ b/server/db/schema/registry.ts @@ -5,6 +5,7 @@ import { boolean, pgEnum, pgTable, text, timestamp } from "drizzle-orm/pg-core"; import { auth } from "./auth"; import { admins } from "./admin"; import { z } from "zod"; +import { applications } from "./application"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same * database instance for multiple projects. @@ -19,6 +20,7 @@ export const registry = pgTable("registry", { .primaryKey() .$defaultFn(() => nanoid()), registryName: text("registryName").notNull(), + imagePrefix: text("imagePrefix"), username: text("username").notNull(), password: text("password").notNull(), registryUrl: text("registryUrl").notNull(), @@ -31,11 +33,12 @@ export const registry = pgTable("registry", { .references(() => admins.adminId, { onDelete: "cascade" }), }); -export const registryRelations = relations(registry, ({ one }) => ({ +export const registryRelations = relations(registry, ({ one, many }) => ({ admin: one(admins, { fields: [registry.adminId], references: [admins.adminId], }), + applications: many(applications), })); const createSchema = createInsertSchema(registry, { @@ -45,6 +48,8 @@ const createSchema = createInsertSchema(registry, { registryUrl: z.string().min(1), adminId: z.string().min(1), registryId: z.string().min(1), + registryType: z.enum(["selfHosted", "cloud"]), + imagePrefix: z.string().nullable().optional(), }); export const apiCreateRegistry = createSchema @@ -53,8 +58,9 @@ export const apiCreateRegistry = createSchema registryName: z.string().min(1), username: z.string().min(1), password: z.string().min(1), - registryUrl: z.string().min(1), - adminId: z.string().min(1), + registryUrl: z.string(), + registryType: z.enum(["selfHosted", "cloud"]), + imagePrefix: z.string().nullable().optional(), }) .required(); @@ -82,6 +88,8 @@ export const apiUpdateRegistry = createSchema export const apiEnableSelfHostedRegistry = createSchema .pick({ - adminId: true, + registryUrl: true, + username: true, + password: true, }) .required(); diff --git a/server/setup/registry-setup.ts b/server/setup/registry-setup.ts new file mode 100644 index 000000000..9756ff8c7 --- /dev/null +++ b/server/setup/registry-setup.ts @@ -0,0 +1,89 @@ +import type { CreateServiceOptions } from "dockerode"; +import { docker, REGISTRY_PATH } from "../constants"; +import { pullImage } from "../utils/docker/utils"; +import { execAsync } from "../utils/process/execAsync"; +import { generateRandomPassword } from "../auth/random-password"; + +export const initializeRegistry = async ( + username: string, + password: string, +) => { + const imageName = "registry:2.8.3"; + const containerName = "dokploy-registry"; + await generatePassword(username, password); + const randomPass = await generateRandomPassword(); + const settings: CreateServiceOptions = { + Name: containerName, + TaskTemplate: { + ContainerSpec: { + Image: imageName, + Env: [ + "REGISTRY_STORAGE_DELETE_ENABLED=true", + "REGISTRY_AUTH=htpasswd", + "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm", + "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd", + `REGISTRY_HTTP_SECRET=${randomPass.hashedPassword}`, + ], + Mounts: [ + { + Type: "bind", + Source: `${REGISTRY_PATH}/htpasswd`, + Target: "/auth/htpasswd", + ReadOnly: true, + }, + { + Type: "volume", + Source: "registry-data", + Target: "/var/lib/registry", + ReadOnly: false, + }, + ], + }, + Networks: [{ Target: "dokploy-network" }], + RestartPolicy: { + Condition: "on-failure", + }, + }, + Mode: { + Replicated: { + Replicas: 1, + }, + }, + EndpointSpec: { + Ports: [ + { + TargetPort: 5000, + PublishedPort: 5000, + Protocol: "tcp", + PublishMode: "host", + }, + ], + }, + }; + try { + await pullImage(imageName); + + const service = docker.getService(containerName); + const inspect = await service.inspect(); + await service.update({ + version: Number.parseInt(inspect.Version.Index), + ...settings, + }); + console.log("Registry Started βœ…"); + } catch (error) { + await docker.createService(settings); + console.log("Registry Not Found: Starting βœ…"); + } +}; + +const generatePassword = async (username: string, password: string) => { + try { + const command = `htpasswd -nbB ${username} "${password}" > ${REGISTRY_PATH}/htpasswd`; + const result = await execAsync(command); + console.log("Password generated βœ…"); + return result.stdout.trim(); + } catch (error) { + console.error("Error generating password:", error); + return null; + } +}; diff --git a/server/utils/builders/index.ts b/server/utils/builders/index.ts index f952ab867..73ba8fd83 100644 --- a/server/utils/builders/index.ts +++ b/server/utils/builders/index.ts @@ -13,6 +13,7 @@ import { buildCustomDocker } from "./docker-file"; import { buildHeroku } from "./heroku"; import { buildNixpacks } from "./nixpacks"; import { buildPaketo } from "./paketo"; +import { uploadImage } from "../cluster/upload"; // NIXPACKS codeDirectory = where is the path of the code directory // HEROKU codeDirectory = where is the path of the code directory @@ -20,7 +21,7 @@ import { buildPaketo } from "./paketo"; // DOCKERFILE codeDirectory = where is the exact path of the (Dockerfile) export type ApplicationNested = InferResultType< "applications", - { mounts: true; security: true; redirects: true; ports: true } + { mounts: true; security: true; redirects: true; ports: true; registry: true } >; export const buildApplication = async ( application: ApplicationNested, @@ -42,6 +43,10 @@ export const buildApplication = async ( } else if (buildType === "dockerfile") { await buildCustomDocker(application, writeStream); } + + if (application.registryId) { + await uploadImage(application, writeStream); + } await mechanizeDockerContainer(application); writeStream.write("Docker Deployed: βœ…"); } catch (error) { @@ -67,6 +72,7 @@ export const mechanizeDockerContainer = async ( cpuReservation, command, ports, + replicas, } = application; const resources = calculateResources({ @@ -104,7 +110,7 @@ export const mechanizeDockerContainer = async ( }, Mode: { Replicated: { - Replicas: 1, + Replicas: replicas, }, }, EndpointSpec: { diff --git a/server/utils/cluster/upload.ts b/server/utils/cluster/upload.ts new file mode 100644 index 000000000..d033434d7 --- /dev/null +++ b/server/utils/cluster/upload.ts @@ -0,0 +1,67 @@ +import type { ApplicationNested } from "../builders"; +import { execAsync } from "../process/execAsync"; +import { spawnAsync } from "../process/spawnAsync"; +import type { WriteStream } from "node:fs"; + +export const uploadImage = async ( + application: ApplicationNested, + writeStream: WriteStream, +) => { + const registry = application.registry; + + if (!registry) { + throw new Error("Registry not found"); + } + + const { registryUrl, imagePrefix } = registry; + const { appName } = application; + const imageName = `${appName}:latest`; + + let finalURL = registryUrl; + + let registryTag = `${registryUrl}/${imageName}`; + + if (imagePrefix) { + registryTag = `${registryUrl}/${imagePrefix}/${imageName}`; + } + + // registry.digitalocean.com// + // index.docker.io/siumauricio/app-parse-multi-byte-port-e32uh7:latest + if (registry.registryType === "selfHosted") { + finalURL = + process.env.NODE_ENV === "development" ? "localhost:5000" : registryUrl; + registryTag = `${finalURL}/${imageName}`; + } + + try { + console.log(finalURL, registryTag); + writeStream.write( + `πŸ“¦ [Enabled Registry] Uploading image to ${registry.registryType} | ${registryTag} | ${finalURL}\n`, + ); + + await spawnAsync( + "docker", + ["login", finalURL, "-u", registry.username, "-p", registry.password], + (data) => { + if (writeStream.writable) { + writeStream.write(data); + } + }, + ); + + await spawnAsync("docker", ["tag", imageName, registryTag], (data) => { + if (writeStream.writable) { + writeStream.write(data); + } + }); + + await spawnAsync("docker", ["push", registryTag], (data) => { + if (writeStream.writable) { + writeStream.write(data); + } + }); + } catch (error) { + console.log(error); + throw error; + } +}; diff --git a/server/utils/traefik/domain.ts b/server/utils/traefik/domain.ts index 689afbbb9..4356153b0 100644 --- a/server/utils/traefik/domain.ts +++ b/server/utils/traefik/domain.ts @@ -47,10 +47,7 @@ export const removeDomain = async (appName: string, uniqueKey: number) => { } }; -export const createRouterConfig = async ( - app: ApplicationNested, - domain: Domain, -) => { +const createRouterConfig = async (app: ApplicationNested, domain: Domain) => { const { appName, redirects, security } = app; const { certificateType } = domain; diff --git a/server/utils/traefik/registry.ts b/server/utils/traefik/registry.ts new file mode 100644 index 000000000..bab6c9876 --- /dev/null +++ b/server/utils/traefik/registry.ts @@ -0,0 +1,67 @@ +import { loadOrCreateConfig } from "./application"; +import type { FileConfig, HttpRouter } from "./file-types"; +import type { Registry } from "@/server/api/services/registry"; +import { removeDirectoryIfExistsContent } from "../filesystem/directory"; +import { REGISTRY_PATH } from "@/server/constants"; +import { dump } from "js-yaml"; +import { join } from "node:path"; +import { existsSync, mkdirSync, writeFileSync } from "node:fs"; + +export const manageRegistry = async (registry: Registry) => { + if (!existsSync(REGISTRY_PATH)) { + mkdirSync(REGISTRY_PATH, { recursive: true }); + } + const appName = "dokploy-registry"; + const config: FileConfig = loadOrCreateConfig(appName); + const serviceName = `${appName}-service`; + const routerName = `${appName}-router`; + + config.http = config.http || { routers: {}, services: {} }; + config.http.routers = config.http.routers || {}; + config.http.services = config.http.services || {}; + + config.http.routers[routerName] = await createRegistryRouterConfig(registry); + + config.http.services[serviceName] = { + loadBalancer: { + servers: [{ url: `http://${appName}:5000` }], + passHostHeader: true, + }, + }; + + const yamlConfig = dump(config); + const configFile = join(REGISTRY_PATH, "registry.yml"); + writeFileSync(configFile, yamlConfig); +}; + +export const removeSelfHostedRegistry = async () => { + await removeDirectoryIfExistsContent(REGISTRY_PATH); +}; + +const createRegistryRouterConfig = async (registry: Registry) => { + const { registryUrl } = registry; + const url = + process.env.NODE_ENV === "production" + ? registryUrl + : "dokploy-registry.docker.localhost"; + const routerConfig: HttpRouter = { + rule: `Host(\`${url}\`)`, + service: "dokploy-registry-service", + ...(process.env.NODE_ENV === "production" + ? { + middlewares: ["redirect-to-https"], + } + : {}), + entryPoints: [ + "web", + ...(process.env.NODE_ENV === "production" ? ["websecure"] : []), + ], + ...(process.env.NODE_ENV === "production" + ? { + tls: { certResolver: "letsencrypt" }, + } + : {}), + }; + + return routerConfig; +}; From c45017e204a279b1ee113cee8e109c3734a5a14a Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 13 May 2024 01:28:50 -0600 Subject: [PATCH 03/28] feat: add show cluster --- .../cluster/registry/add-docker-registry.tsx | 2 - .../cluster/registry/show-registry.tsx | 4 +- .../settings/cluster/worker/add-worker.tsx | 80 +++++++++++++++++++ .../settings/cluster/worker/show-workers.tsx | 62 ++++++++++++++ components/shared/date-tooltip.tsx | 11 ++- pages/dashboard/settings/cluster.tsx | 2 + server/api/root.ts | 2 + server/api/routers/cluster.ts | 17 ++++ 8 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 components/dashboard/settings/cluster/worker/add-worker.tsx create mode 100644 components/dashboard/settings/cluster/worker/show-workers.tsx create mode 100644 server/api/routers/cluster.ts diff --git a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx index c5cf228da..8e7f1dd23 100644 --- a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx +++ b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx @@ -62,8 +62,6 @@ export const AddRegistry = () => { resolver: zodResolver(AddRegistrySchema), }); - console.log(form.formState.errors); - const password = form.watch("password"); const username = form.watch("username"); const registryUrl = form.watch("registryUrl"); diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx index 3bfc3bada..c02c6ae6a 100644 --- a/components/dashboard/settings/cluster/registry/show-registry.tsx +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -23,8 +23,8 @@ export const ShowRegistry = () => {
- Clusters - Add cluster to your application. + Registry + Add registry to your application.
diff --git a/components/dashboard/settings/cluster/worker/add-worker.tsx b/components/dashboard/settings/cluster/worker/add-worker.tsx new file mode 100644 index 000000000..5a7bccaea --- /dev/null +++ b/components/dashboard/settings/cluster/worker/add-worker.tsx @@ -0,0 +1,80 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { AlertTriangle, PlusIcon } from "lucide-react"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { z } from "zod"; + +const AddWorkerSchema = z.object({ + name: z.string().min(1, { + message: "Name is required", + }), + description: z.string().optional(), +}); + +type AddWorker = z.infer; + +export const AddWorker = () => { + const utils = api.useUtils(); + + const { data, isLoading } = api.cluster.addWorker.useQuery(); + + return ( + + + + + + + Add a new worker + Add a new worker + + {/* {isError && ( +
+ + + {error?.message} + +
+ )} */} +
+ 1. Go to your new server and run the following command + + curl https://get.docker.com | sh -s -- --version 24.0 + +
+ +
+ + 2. Run the following command to add the node(server) to your cluster + + {data} +
+
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/worker/show-workers.tsx b/components/dashboard/settings/cluster/worker/show-workers.tsx new file mode 100644 index 000000000..bb0deb8fa --- /dev/null +++ b/components/dashboard/settings/cluster/worker/show-workers.tsx @@ -0,0 +1,62 @@ +import React from "react"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; + +import { api } from "@/utils/api"; +import { AddWorker } from "./add-worker"; +import { DateTooltip } from "@/components/shared/date-tooltip"; + +export const ShowCluster = () => { + const { data, isLoading } = api.cluster.getWorkers.useQuery(); + // console.log(data) + return ( + + +
+ Cluster + Add nodes to your cluster +
+ +
+ +
+ {isLoading &&
Loading...
} + {data?.map((worker, index) => ( +
+ + {worker.Description.Hostname} + + + {worker.Status.State} + + + {worker.Spec.Availability} + + + {worker.ManagerStatus.Reachability} + + + {worker?.Spec?.Role} + + + + {worker?.Description.Engine.EngineVersion} + + + {/* Created */} + +
+ ))} +
+
+
+ ); +}; diff --git a/components/shared/date-tooltip.tsx b/components/shared/date-tooltip.tsx index 2538ebf74..552d629dd 100644 --- a/components/shared/date-tooltip.tsx +++ b/components/shared/date-tooltip.tsx @@ -4,19 +4,26 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; import { format, formatDistanceToNow } from "date-fns"; interface Props { date: string; children?: React.ReactNode; + className?: string; } -export const DateTooltip = ({ date, children }: Props) => { +export const DateTooltip = ({ date, children, className }: Props) => { return ( - + {children}{" "} {formatDistanceToNow(new Date(date), { addSuffix: true, diff --git a/pages/dashboard/settings/cluster.tsx b/pages/dashboard/settings/cluster.tsx index 98ce5cfe9..d433e9020 100644 --- a/pages/dashboard/settings/cluster.tsx +++ b/pages/dashboard/settings/cluster.tsx @@ -1,5 +1,6 @@ import { ShowCertificates } from "@/components/dashboard/settings/certificates/show-certificates"; import { ShowRegistry } from "@/components/dashboard/settings/cluster/registry/show-registry"; +import { ShowCluster } from "@/components/dashboard/settings/cluster/worker/show-workers"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { validateRequest } from "@/server/auth/auth"; @@ -10,6 +11,7 @@ const Page = () => { return (
+
); }; diff --git a/server/api/root.ts b/server/api/root.ts index d9b02e20a..da192b6b5 100644 --- a/server/api/root.ts +++ b/server/api/root.ts @@ -21,6 +21,7 @@ import { portRouter } from "./routers/port"; import { adminRouter } from "./routers/admin"; import { dockerRouter } from "./routers/docker"; import { registryRouter } from "./routers/registry"; +import { clusterRouter } from "./routers/cluster"; /** * This is the primary router for your server. * @@ -49,6 +50,7 @@ export const appRouter = createTRPCRouter({ redirects: redirectsRouter, port: portRouter, registry: registryRouter, + cluster: clusterRouter, }); // export type definition of API diff --git a/server/api/routers/cluster.ts b/server/api/routers/cluster.ts new file mode 100644 index 000000000..9a6ff6e7f --- /dev/null +++ b/server/api/routers/cluster.ts @@ -0,0 +1,17 @@ +import { docker } from "@/server/constants"; +import { createTRPCRouter, protectedProcedure } from "../trpc"; +import { getPublicIpWithFallback } from "@/server/wss/terminal"; + +export const clusterRouter = createTRPCRouter({ + getWorkers: protectedProcedure.query(async () => { + const workers = await docker.listNodes(); + // console.log(workers); + return workers; + }), + addWorker: protectedProcedure.query(async ({ input }) => { + const result = await docker.swarmInspect(); + return `docker swarm join --token ${ + result.JoinTokens.Worker + } ${await getPublicIpWithFallback()}:2377`; + }), +}); From d19dec801033ed6e173780ae3051829c414b707a Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 13 May 2024 03:15:09 -0600 Subject: [PATCH 04/28] refactor: set the registry url in image in case we have a registry asociated --- .../settings/cluster/worker/show-workers.tsx | 2 +- pages/_error.tsx | 4 ++-- server/api/routers/registry.ts | 1 + server/api/routers/settings.ts | 1 + server/utils/builders/index.ts | 17 ++++++++++++++++- 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/dashboard/settings/cluster/worker/show-workers.tsx b/components/dashboard/settings/cluster/worker/show-workers.tsx index bb0deb8fa..470ab86db 100644 --- a/components/dashboard/settings/cluster/worker/show-workers.tsx +++ b/components/dashboard/settings/cluster/worker/show-workers.tsx @@ -41,7 +41,7 @@ export const ShowCluster = () => { {worker.Spec.Availability}
- {worker.ManagerStatus.Reachability} + {worker?.ManagerStatus?.Reachability || "-"} {worker?.Spec?.Role} diff --git a/pages/_error.tsx b/pages/_error.tsx index fb3bf23cf..4939d0180 100644 --- a/pages/_error.tsx +++ b/pages/_error.tsx @@ -12,8 +12,8 @@ export default function Custom404({ statusCode }: Props) {
-
-

+
+

{statusCode ? `An error ${statusCode} occurred on server` : "An error occurred on client"} diff --git a/server/api/routers/registry.ts b/server/api/routers/registry.ts index 0fe097765..4779b9488 100644 --- a/server/api/routers/registry.ts +++ b/server/api/routers/registry.ts @@ -64,6 +64,7 @@ export const registryRouter = createTRPCRouter({ return true; } catch (error) { + console.log(error); return false; } }), diff --git a/server/api/routers/settings.ts b/server/api/routers/settings.ts index 366530d80..dabb33081 100644 --- a/server/api/routers/settings.ts +++ b/server/api/routers/settings.ts @@ -238,3 +238,4 @@ export const settingsRouter = createTRPCRouter({ return readConfigInPath(input.path); }), }); +// apt-get install apache2-utils diff --git a/server/utils/builders/index.ts b/server/utils/builders/index.ts index 73ba8fd83..d2611e2b2 100644 --- a/server/utils/builders/index.ts +++ b/server/utils/builders/index.ts @@ -81,16 +81,31 @@ export const mechanizeDockerContainer = async ( cpuLimit, cpuReservation, }); + const volumesMount = generateVolumeMounts(mounts); const bindsMount = generateBindMounts(mounts); const filesMount = generateFileMounts(appName, mounts); const envVariables = prepareEnvironmentVariables(env); + const registry = application.registry; + + const image = + sourceType === "docker" + ? dockerImage! + : registry + ? `${registry.registryUrl}/${appName}` + : `${appName}:latest`; + const settings: CreateServiceOptions = { + authconfig: { + password: registry?.password || "", + username: registry?.username || "", + serveraddress: registry?.registryUrl || "", + }, Name: appName, TaskTemplate: { ContainerSpec: { - Image: sourceType === "docker" ? dockerImage! : `${appName}:latest`, + Image: image, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], ...(command From 08517d6f3651a741e5e8b18ac7471b7240278438 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Tue, 14 May 2024 03:09:07 -0600 Subject: [PATCH 05/28] feat: add update registry and fix the docker url markup --- Dockerfile | 3 +- .../cluster/registry/add-docker-registry.tsx | 22 +- .../cluster/registry/show-registry.tsx | 6 +- .../registry/update-docker-registry.tsx | 275 ++++++++++++++++++ server/api/routers/registry.ts | 13 +- server/api/services/registry.ts | 21 +- server/db/schema/registry.ts | 21 +- server/setup/registry-setup.ts | 4 +- server/utils/builders/index.ts | 15 +- server/utils/cluster/upload.ts | 26 +- server/utils/traefik/registry.ts | 27 +- 11 files changed, 366 insertions(+), 67 deletions(-) create mode 100644 components/dashboard/settings/cluster/registry/update-docker-registry.tsx diff --git a/Dockerfile b/Dockerfile index 97d7b26a7..6d3e58758 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,7 +26,7 @@ FROM node:18-slim AS production # Install dependencies only for production ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable && apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* +RUN corepack enable && apt-get update && apt-get install -y curl && apt-get install -y apache2-utils && rm -rf /var/lib/apt/lists/* WORKDIR /app @@ -47,7 +47,6 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-l # Install docker RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh - # Install Nixpacks and tsx # | VERBOSE=1 VERSION=1.21.0 bash RUN curl -sSL https://nixpacks.com/install.sh -o install.sh \ diff --git a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx index 8e7f1dd23..04ac32707 100644 --- a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx +++ b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx @@ -217,10 +217,6 @@ export const AddRegistry = () => { variant={"secondary"} isLoading={isLoading} onClick={async () => { - if (!form.formState.isValid) { - toast.error("Please fill all the fields"); - return; - } await testRegistry({ username: username, password: password, @@ -228,13 +224,17 @@ export const AddRegistry = () => { registryName: registryName, registryType: "cloud", imagePrefix: imagePrefix, - }).then((data) => { - if (data) { - toast.success("Registry Tested Successfully"); - } else { - toast.error("Registry Test Failed"); - } - }); + }) + .then((data) => { + if (data) { + toast.success("Registry Tested Successfully"); + } else { + toast.error("Registry Test Failed"); + } + }) + .catch(() => { + toast.error("Error to test the registry"); + }); }} > Test Registry diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx index c02c6ae6a..30ed18fe9 100644 --- a/components/dashboard/settings/cluster/registry/show-registry.tsx +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -10,6 +10,7 @@ import { Server } from "lucide-react"; import { AddRegistry } from "./add-docker-registry"; import { AddSelfHostedRegistry } from "./add-self-docker-registry"; import { DeleteRegistry } from "./delete-registry"; +import { UpdateDockerRegistry } from "./update-docker-registry"; export const ShowRegistry = () => { const { data } = api.registry.all.useQuery(); @@ -49,8 +50,6 @@ export const ShowRegistry = () => {

- - {/* */}

) : (
@@ -63,12 +62,11 @@ export const ShowRegistry = () => { {index + 1}. {registry.registryName}
+
))} - -
{/* */}
)} diff --git a/components/dashboard/settings/cluster/registry/update-docker-registry.tsx b/components/dashboard/settings/cluster/registry/update-docker-registry.tsx new file mode 100644 index 000000000..c84c019ac --- /dev/null +++ b/components/dashboard/settings/cluster/registry/update-docker-registry.tsx @@ -0,0 +1,275 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { cn } from "@/lib/utils"; +import { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { AlertTriangle, PenBoxIcon } from "lucide-react"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { z } from "zod"; + +const updateRegistry = z.object({ + registryName: z.string().min(1, { + message: "Registry name is required", + }), + username: z.string().min(1, { + message: "Username is required", + }), + password: z.string(), + registryUrl: z.string().min(1, { + message: "Registry URL is required", + }), + imagePrefix: z.string(), +}); + +type UpdateRegistry = z.infer; + +interface Props { + registryId: string; +} + +export const UpdateDockerRegistry = ({ registryId }: Props) => { + const utils = api.useUtils(); + const { mutateAsync: testRegistry, isLoading } = + api.registry.testRegistry.useMutation(); + const { data, refetch } = api.registry.one.useQuery( + { + registryId, + }, + { + enabled: !!registryId, + }, + ); + + const isCloud = data?.registryType === "cloud"; + const { mutateAsync, isError, error } = api.registry.update.useMutation(); + + const form = useForm({ + defaultValues: { + imagePrefix: "", + registryName: "", + username: "", + password: "", + registryUrl: "", + }, + resolver: zodResolver(updateRegistry), + }); + + const password = form.watch("password"); + const username = form.watch("username"); + const registryUrl = form.watch("registryUrl"); + const registryName = form.watch("registryName"); + const imagePrefix = form.watch("imagePrefix"); + + useEffect(() => { + if (data) { + form.reset({ + imagePrefix: data.imagePrefix || "", + registryName: data.registryName || "", + username: data.username || "", + password: "", + registryUrl: data.registryUrl || "", + }); + } + }, [form, form.reset, data]); + + const onSubmit = async (data: UpdateRegistry) => { + await mutateAsync({ + registryId, + ...(data.password ? { password: data.password } : {}), + registryName: data.registryName, + username: data.username, + registryUrl: data.registryUrl, + imagePrefix: data.imagePrefix, + }) + .then(async (data) => { + toast.success("Registry Updated"); + await refetch(); + await utils.registry.all.invalidate(); + }) + .catch(() => { + toast.error("Error to update the registry"); + }); + }; + return ( + + + + + + + Registry + Update the registry information + + {isError && ( +
+ + + {error?.message} + +
+ )} + +
+ +
+
+ ( + + Registry Name + + + + + + + )} + /> + + ( + + Username + + + + + + + )} + /> + + ( + + Password + + + + + + + )} + /> + {isCloud && ( + ( + + Image Prefix + + + + + + + )} + /> + )} + + ( + + Registry URL + + + + + + + )} + /> +
+
+
+ + + {isCloud && ( + + )} + + + + +
+
+ ); +}; diff --git a/server/api/routers/registry.ts b/server/api/routers/registry.ts index 4779b9488..63ffa213c 100644 --- a/server/api/routers/registry.ts +++ b/server/api/routers/registry.ts @@ -3,6 +3,7 @@ import { apiEnableSelfHostedRegistry, apiFindOneRegistry, apiRemoveRegistry, + apiTestRegistry, apiUpdateRegistry, } from "@/server/db/schema"; import { @@ -10,7 +11,7 @@ import { findAllRegistry, findRegistryById, removeRegistry, - updaterRegistry, + updateRegistry, } from "../services/registry"; import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; import { TRPCError } from "@trpc/server"; @@ -33,7 +34,7 @@ export const registryRouter = createTRPCRouter({ .input(apiUpdateRegistry) .mutation(async ({ input }) => { const { registryId, ...rest } = input; - const application = await updaterRegistry(registryId, { + const application = await updateRegistry(registryId, { ...rest, }); @@ -49,11 +50,11 @@ export const registryRouter = createTRPCRouter({ all: protectedProcedure.query(async () => { return await findAllRegistry(); }), - findOne: adminProcedure.input(apiFindOneRegistry).query(async ({ input }) => { + one: adminProcedure.input(apiFindOneRegistry).query(async ({ input }) => { return await findRegistryById(input.registryId); }), testRegistry: protectedProcedure - .input(apiCreateRegistry) + .input(apiTestRegistry) .mutation(async ({ input }) => { try { const result = await docker.checkAuth({ @@ -76,6 +77,10 @@ export const registryRouter = createTRPCRouter({ ...input, registryName: "Self Hosted Registry", registryType: "selfHosted", + registryUrl: + process.env.NODE_ENV === "production" + ? input.registryUrl + : "dokploy-registry.docker.localhost", imagePrefix: null, }); diff --git a/server/api/services/registry.ts b/server/api/services/registry.ts index 149927d5f..48077d055 100644 --- a/server/api/services/registry.ts +++ b/server/api/services/registry.ts @@ -3,8 +3,12 @@ import { TRPCError } from "@trpc/server"; import { db } from "@/server/db"; import { eq } from "drizzle-orm"; import { findAdmin } from "./admin"; -import { removeSelfHostedRegistry } from "@/server/utils/traefik/registry"; +import { + manageRegistry, + removeSelfHostedRegistry, +} from "@/server/utils/traefik/registry"; import { removeService } from "@/server/utils/docker/utils"; +import { initializeRegistry } from "@/server/setup/registry-setup"; export type Registry = typeof registry.$inferSelect; @@ -59,7 +63,7 @@ export const removeRegistry = async (registryId: string) => { } }; -export const updaterRegistry = async ( +export const updateRegistry = async ( registryId: string, registryData: Partial, ) => { @@ -70,9 +74,15 @@ export const updaterRegistry = async ( ...registryData, }) .where(eq(registry.registryId, registryId)) - .returning(); + .returning() + .then((res) => res[0]); - return response[0]; + if (response?.registryType === "selfHosted") { + await manageRegistry(response); + await initializeRegistry(response.username, response.password); + } + + return response; } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -84,6 +94,9 @@ export const updaterRegistry = async ( export const findRegistryById = async (registryId: string) => { const registryResponse = await db.query.registry.findFirst({ where: eq(registry.registryId, registryId), + columns: { + password: false, + }, }); if (!registryResponse) { throw new TRPCError({ diff --git a/server/db/schema/registry.ts b/server/db/schema/registry.ts index 9a536c7c2..7921c5aa4 100644 --- a/server/db/schema/registry.ts +++ b/server/db/schema/registry.ts @@ -64,6 +64,15 @@ export const apiCreateRegistry = createSchema }) .required(); +export const apiTestRegistry = createSchema.pick({}).extend({ + registryName: z.string().min(1), + username: z.string().min(1), + password: z.string().min(1), + registryUrl: z.string(), + registryType: z.enum(["selfHosted", "cloud"]), + imagePrefix: z.string().nullable().optional(), +}); + export const apiRemoveRegistry = createSchema .pick({ registryId: true, @@ -76,15 +85,9 @@ export const apiFindOneRegistry = createSchema }) .required(); -export const apiUpdateRegistry = createSchema - .pick({ - password: true, - registryName: true, - username: true, - registryUrl: true, - registryId: true, - }) - .required(); +export const apiUpdateRegistry = createSchema.partial().extend({ + registryId: z.string().min(1), +}); export const apiEnableSelfHostedRegistry = createSchema .pick({ diff --git a/server/setup/registry-setup.ts b/server/setup/registry-setup.ts index 9756ff8c7..94d592f7f 100644 --- a/server/setup/registry-setup.ts +++ b/server/setup/registry-setup.ts @@ -10,7 +10,7 @@ export const initializeRegistry = async ( ) => { const imageName = "registry:2.8.3"; const containerName = "dokploy-registry"; - await generatePassword(username, password); + await generateRegistryPassword(username, password); const randomPass = await generateRandomPassword(); const settings: CreateServiceOptions = { Name: containerName, @@ -76,7 +76,7 @@ export const initializeRegistry = async ( } }; -const generatePassword = async (username: string, password: string) => { +const generateRegistryPassword = async (username: string, password: string) => { try { const command = `htpasswd -nbB ${username} "${password}" > ${REGISTRY_PATH}/htpasswd`; const result = await execAsync(command); diff --git a/server/utils/builders/index.ts b/server/utils/builders/index.ts index d2611e2b2..715a1fe34 100644 --- a/server/utils/builders/index.ts +++ b/server/utils/builders/index.ts @@ -89,12 +89,15 @@ export const mechanizeDockerContainer = async ( const registry = application.registry; - const image = - sourceType === "docker" - ? dockerImage! - : registry - ? `${registry.registryUrl}/${appName}` - : `${appName}:latest`; + let image = sourceType === "docker" ? dockerImage! : `${appName}:latest`; + + if (registry) { + image = `${registry.registryUrl}/${appName}`; + + if (registry.imagePrefix) { + image = `${registry.registryUrl}/${registry.imagePrefix}/${appName}`; + } + } const settings: CreateServiceOptions = { authconfig: { diff --git a/server/utils/cluster/upload.ts b/server/utils/cluster/upload.ts index d033434d7..234fdbd54 100644 --- a/server/utils/cluster/upload.ts +++ b/server/utils/cluster/upload.ts @@ -1,5 +1,4 @@ import type { ApplicationNested } from "../builders"; -import { execAsync } from "../process/execAsync"; import { spawnAsync } from "../process/spawnAsync"; import type { WriteStream } from "node:fs"; @@ -13,25 +12,20 @@ export const uploadImage = async ( throw new Error("Registry not found"); } - const { registryUrl, imagePrefix } = registry; + const { registryUrl, imagePrefix, registryType } = registry; const { appName } = application; const imageName = `${appName}:latest`; - let finalURL = registryUrl; + const finalURL = + registryType === "selfHosted" + ? process.env.NODE_ENV === "development" + ? "localhost:5000" + : registryUrl + : registryUrl; - let registryTag = `${registryUrl}/${imageName}`; - - if (imagePrefix) { - registryTag = `${registryUrl}/${imagePrefix}/${imageName}`; - } - - // registry.digitalocean.com// - // index.docker.io/siumauricio/app-parse-multi-byte-port-e32uh7:latest - if (registry.registryType === "selfHosted") { - finalURL = - process.env.NODE_ENV === "development" ? "localhost:5000" : registryUrl; - registryTag = `${finalURL}/${imageName}`; - } + const registryTag = imagePrefix + ? `${registryUrl}/${imagePrefix}/${imageName}` + : `${finalURL}/${imageName}`; try { console.log(finalURL, registryTag); diff --git a/server/utils/traefik/registry.ts b/server/utils/traefik/registry.ts index bab6c9876..6f2960ea2 100644 --- a/server/utils/traefik/registry.ts +++ b/server/utils/traefik/registry.ts @@ -1,18 +1,19 @@ -import { loadOrCreateConfig } from "./application"; import type { FileConfig, HttpRouter } from "./file-types"; import type { Registry } from "@/server/api/services/registry"; import { removeDirectoryIfExistsContent } from "../filesystem/directory"; import { REGISTRY_PATH } from "@/server/constants"; -import { dump } from "js-yaml"; +import { dump, load } from "js-yaml"; import { join } from "node:path"; -import { existsSync, mkdirSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; export const manageRegistry = async (registry: Registry) => { if (!existsSync(REGISTRY_PATH)) { mkdirSync(REGISTRY_PATH, { recursive: true }); } + const appName = "dokploy-registry"; - const config: FileConfig = loadOrCreateConfig(appName); + const config: FileConfig = loadOrCreateConfig(); + const serviceName = `${appName}-service`; const routerName = `${appName}-router`; @@ -40,12 +41,8 @@ export const removeSelfHostedRegistry = async () => { const createRegistryRouterConfig = async (registry: Registry) => { const { registryUrl } = registry; - const url = - process.env.NODE_ENV === "production" - ? registryUrl - : "dokploy-registry.docker.localhost"; const routerConfig: HttpRouter = { - rule: `Host(\`${url}\`)`, + rule: `Host(\`${registryUrl}\`)`, service: "dokploy-registry-service", ...(process.env.NODE_ENV === "production" ? { @@ -65,3 +62,15 @@ const createRegistryRouterConfig = async (registry: Registry) => { return routerConfig; }; + +const loadOrCreateConfig = (): FileConfig => { + const configPath = join(REGISTRY_PATH, "registry.yml"); + if (existsSync(configPath)) { + const yamlStr = readFileSync(configPath, "utf8"); + const parsedConfig = (load(yamlStr) as FileConfig) || { + http: { routers: {}, services: {} }, + }; + return parsedConfig; + } + return { http: { routers: {}, services: {} } }; +}; From 744f80070066732c6a9ffb4ce8160f53c3badb1c Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Thu, 16 May 2024 01:55:37 -0600 Subject: [PATCH 06/28] chore: remove --advertise-ip on swarm script --- docker/prod.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/prod.sh b/docker/prod.sh index 77513175b..4dc23da28 100644 --- a/docker/prod.sh +++ b/docker/prod.sh @@ -46,7 +46,7 @@ else fi docker swarm leave --force 2>/dev/null -docker swarm init --advertise-addr 127.0.0.1 --listen-addr 0.0.0.0; +docker swarm init; echo "Swarm initialized" From 42e9aa18349749feb7d7d66836a3a1916c3f6de7 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Thu, 16 May 2024 22:09:40 -0600 Subject: [PATCH 07/28] refactor: remove listen address of swarm initialize --- server/setup/setup.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/setup/setup.ts b/server/setup/setup.ts index c59877022..263865c95 100644 --- a/server/setup/setup.ts +++ b/server/setup/setup.ts @@ -5,10 +5,7 @@ export const initializeSwarm = async () => { if (swarmInitialized) { console.log("Swarm is already initilized"); } else { - await docker.swarmInit({ - AdvertiseAddr: "127.0.0.1", - ListenAddr: "0.0.0.0", - }); + await docker.swarmInit({}); console.log("Swarm was initilized"); } }; From 976d1f312f17e1aef4f8e7920e0d099d45a18a28 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Fri, 17 May 2024 02:56:50 -0600 Subject: [PATCH 08/28] feat: add table to show nodes and add dropdown to add manager & workers --- .../cluster/nodes/manager/add-manager.tsx | 49 +++++++ .../settings/cluster/nodes/show-node-data.tsx | 43 ++++++ .../settings/cluster/nodes/show-nodes.tsx | 131 ++++++++++++++++++ .../cluster/nodes/workers/add-worker.tsx | 47 +++++++ .../cluster/nodes/workers/delete-worker.tsx | 62 +++++++++ .../settings/cluster/worker/add-worker.tsx | 80 ----------- .../settings/cluster/worker/show-workers.tsx | 62 --------- pages/dashboard/settings/cluster.tsx | 5 +- server/api/routers/cluster.ts | 37 ++++- server/api/services/cluster.ts | 41 ++++++ 10 files changed, 409 insertions(+), 148 deletions(-) create mode 100644 components/dashboard/settings/cluster/nodes/manager/add-manager.tsx create mode 100644 components/dashboard/settings/cluster/nodes/show-node-data.tsx create mode 100644 components/dashboard/settings/cluster/nodes/show-nodes.tsx create mode 100644 components/dashboard/settings/cluster/nodes/workers/add-worker.tsx create mode 100644 components/dashboard/settings/cluster/nodes/workers/delete-worker.tsx delete mode 100644 components/dashboard/settings/cluster/worker/add-worker.tsx delete mode 100644 components/dashboard/settings/cluster/worker/show-workers.tsx create mode 100644 server/api/services/cluster.ts diff --git a/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx b/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx new file mode 100644 index 000000000..8c6b1db8c --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx @@ -0,0 +1,49 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { api } from "@/utils/api"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +export const AddManager = () => { + const { data } = api.cluster.addManager.useQuery(); + + return ( + <> + + + e.preventDefault()} + > + Add Manager + + + + + Add a new manager + Add a new manager + +
+ 1. Go to your new server and run the following command + + curl https://get.docker.com | sh -s -- --version 24.0 + +
+ +
+ + 2. Run the following command to add the node(server) to your + cluster + + {data} +
+
+
+ + ); +}; diff --git a/components/dashboard/settings/cluster/nodes/show-node-data.tsx b/components/dashboard/settings/cluster/nodes/show-node-data.tsx new file mode 100644 index 000000000..c597b9480 --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/show-node-data.tsx @@ -0,0 +1,43 @@ +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; + +interface Props { + data: unknown; +} + +export const ShowNodeData = ({ data }: Props) => { + return ( + + + e.preventDefault()} + > + View Config + + + + + Node Config + + See in detail the metadata of this node + + +
+ +
+							{JSON.stringify(data, null, 2)}
+						
+
+
+
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/nodes/show-nodes.tsx b/components/dashboard/settings/cluster/nodes/show-nodes.tsx new file mode 100644 index 000000000..47cbee4c0 --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/show-nodes.tsx @@ -0,0 +1,131 @@ +import React from "react"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { api } from "@/utils/api"; +import { AddWorker } from "./workers/add-worker"; +import { DateTooltip } from "@/components/shared/date-tooltip"; +import { Badge } from "@/components/ui/badge"; +import { DeleteWorker } from "./workers/delete-worker"; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { MoreHorizontal, PlusIcon } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { ShowNodeData } from "./show-node-data"; +import { AddManager } from "./manager/add-manager"; + +export const ShowNodes = () => { + const { data, isLoading } = api.cluster.getNodes.useQuery(); + return ( + + +
+ Cluster + Add nodes to your cluster +
+
+ + + + + + Actions + + + + +
+
+ +
+ {isLoading &&
Loading...
} + + A list of your managers / workers. + + + Hostname + Status + Role + Availability + Engine Version + Created + + Actions + + + + {data?.map((node) => { + const isManager = node.Spec.Role === "manager"; + return ( + + + {node.Description.Hostname} + + + {node.Status.State} + + + + {node?.Spec?.Role} + + + + {node.Spec.Availability} + + + + {node?.Description.Engine.EngineVersion} + + + + + Created{" "} + + + + + + + + + Actions + + {!node?.ManagerStatus?.Leader && ( + + )} + + + + + ); + })} + +
+
+
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx b/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx new file mode 100644 index 000000000..f05561581 --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx @@ -0,0 +1,47 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { api } from "@/utils/api"; + +export const AddWorker = () => { + const { data } = api.cluster.addWorker.useQuery(); + + return ( + + + e.preventDefault()} + > + Add Worker + + + + + Add a new worker + Add a new worker + +
+ 1. Go to your new server and run the following command + + curl https://get.docker.com | sh -s -- --version 24.0 + +
+ +
+ + 2. Run the following command to add the node(server) to your cluster + + {data} +
+
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/nodes/workers/delete-worker.tsx b/components/dashboard/settings/cluster/nodes/workers/delete-worker.tsx new file mode 100644 index 000000000..2d3810ca8 --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/workers/delete-worker.tsx @@ -0,0 +1,62 @@ +import React from "react"; +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 { TrashIcon } from "lucide-react"; +import { toast } from "sonner"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; + +interface Props { + nodeId: string; +} +export const DeleteWorker = ({ nodeId }: Props) => { + const { mutateAsync, isLoading } = api.cluster.removeWorker.useMutation(); + const utils = api.useUtils(); + return ( + + + e.preventDefault()}> + Delete + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + worker. + + + + Cancel + { + await mutateAsync({ + nodeId, + }) + .then(async () => { + utils.cluster.getNodes.invalidate(); + toast.success("Worker deleted succesfully"); + }) + .catch(() => { + toast.error("Error to delete the worker"); + }); + }} + > + Confirm + + + + + ); +}; diff --git a/components/dashboard/settings/cluster/worker/add-worker.tsx b/components/dashboard/settings/cluster/worker/add-worker.tsx deleted file mode 100644 index 5a7bccaea..000000000 --- a/components/dashboard/settings/cluster/worker/add-worker.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { api } from "@/utils/api"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, PlusIcon } from "lucide-react"; -import { useEffect } from "react"; -import { useForm } from "react-hook-form"; -import { toast } from "sonner"; -import { z } from "zod"; - -const AddWorkerSchema = z.object({ - name: z.string().min(1, { - message: "Name is required", - }), - description: z.string().optional(), -}); - -type AddWorker = z.infer; - -export const AddWorker = () => { - const utils = api.useUtils(); - - const { data, isLoading } = api.cluster.addWorker.useQuery(); - - return ( - - - - - - - Add a new worker - Add a new worker - - {/* {isError && ( -
- - - {error?.message} - -
- )} */} -
- 1. Go to your new server and run the following command - - curl https://get.docker.com | sh -s -- --version 24.0 - -
- -
- - 2. Run the following command to add the node(server) to your cluster - - {data} -
-
-
- ); -}; diff --git a/components/dashboard/settings/cluster/worker/show-workers.tsx b/components/dashboard/settings/cluster/worker/show-workers.tsx deleted file mode 100644 index 470ab86db..000000000 --- a/components/dashboard/settings/cluster/worker/show-workers.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import React from "react"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; - -import { api } from "@/utils/api"; -import { AddWorker } from "./add-worker"; -import { DateTooltip } from "@/components/shared/date-tooltip"; - -export const ShowCluster = () => { - const { data, isLoading } = api.cluster.getWorkers.useQuery(); - // console.log(data) - return ( - - -
- Cluster - Add nodes to your cluster -
- -
- -
- {isLoading &&
Loading...
} - {data?.map((worker, index) => ( -
- - {worker.Description.Hostname} - - - {worker.Status.State} - - - {worker.Spec.Availability} - - - {worker?.ManagerStatus?.Reachability || "-"} - - - {worker?.Spec?.Role} - - - - {worker?.Description.Engine.EngineVersion} - - - {/* Created */} - -
- ))} -
-
-
- ); -}; diff --git a/pages/dashboard/settings/cluster.tsx b/pages/dashboard/settings/cluster.tsx index d433e9020..969e97aaa 100644 --- a/pages/dashboard/settings/cluster.tsx +++ b/pages/dashboard/settings/cluster.tsx @@ -1,6 +1,5 @@ -import { ShowCertificates } from "@/components/dashboard/settings/certificates/show-certificates"; import { ShowRegistry } from "@/components/dashboard/settings/cluster/registry/show-registry"; -import { ShowCluster } from "@/components/dashboard/settings/cluster/worker/show-workers"; +import { ShowNodes } from "@/components/dashboard/settings/cluster/nodes/show-nodes"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { validateRequest } from "@/server/auth/auth"; @@ -11,7 +10,7 @@ const Page = () => { return (
- +
); }; diff --git a/server/api/routers/cluster.ts b/server/api/routers/cluster.ts index 9a6ff6e7f..2e1d98261 100644 --- a/server/api/routers/cluster.ts +++ b/server/api/routers/cluster.ts @@ -1,17 +1,48 @@ import { docker } from "@/server/constants"; import { createTRPCRouter, protectedProcedure } from "../trpc"; import { getPublicIpWithFallback } from "@/server/wss/terminal"; +import type { DockerNode } from "../services/cluster"; +import { z } from "zod"; +import { TRPCError } from "@trpc/server"; +import { execAsync } from "@/server/utils/process/execAsync"; export const clusterRouter = createTRPCRouter({ - getWorkers: protectedProcedure.query(async () => { - const workers = await docker.listNodes(); - // console.log(workers); + getNodes: protectedProcedure.query(async () => { + const workers: DockerNode[] = await docker.listNodes(); + return workers; }), + removeWorker: protectedProcedure + .input( + z.object({ + nodeId: z.string(), + }), + ) + .mutation(async ({ input }) => { + try { + await execAsync( + `docker node update --availability drain ${input.nodeId}`, + ); + await execAsync(`docker node rm ${input.nodeId} --force`); + return true; + } catch (error) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Error to remove the node", + cause: error, + }); + } + }), addWorker: protectedProcedure.query(async ({ input }) => { const result = await docker.swarmInspect(); return `docker swarm join --token ${ result.JoinTokens.Worker } ${await getPublicIpWithFallback()}:2377`; }), + addManager: protectedProcedure.query(async ({ input }) => { + const result = await docker.swarmInspect(); + return `docker swarm join --token ${ + result.JoinTokens.Manager + } ${await getPublicIpWithFallback()}:2377`; + }), }); diff --git a/server/api/services/cluster.ts b/server/api/services/cluster.ts new file mode 100644 index 000000000..ea71d1aee --- /dev/null +++ b/server/api/services/cluster.ts @@ -0,0 +1,41 @@ +export interface DockerNode { + ID: string; + Version: { + Index: number; + }; + CreatedAt: string; + UpdatedAt: string; + Spec: { + Name: string; + Labels: Record; + Role: "worker" | "manager"; + Availability: "active" | "pause" | "drain"; + }; + Description: { + Hostname: string; + Platform: { + Architecture: string; + OS: string; + }; + Resources: { + NanoCPUs: number; + MemoryBytes: number; + }; + Engine: { + EngineVersion: string; + Plugins: Array<{ + Type: string; + Name: string; + }>; + }; + }; + Status: { + State: "unknown" | "down" | "ready" | "disconnected"; + Message: string; + Addr: string; + }; + ManagerStatus?: { + Leader: boolean; + Addr: string; + }; +} From 667067811cf3597887ab66e08f4f6d36983c60b3 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Fri, 17 May 2024 22:59:31 -0600 Subject: [PATCH 09/28] refactor: improve interface for cluster --- .../settings/cluster/nodes/add-node.tsx | 67 ++++++ .../cluster/nodes/manager/add-manager.tsx | 58 ++++-- .../settings/cluster/nodes/show-nodes.tsx | 197 ++++++++++-------- .../cluster/nodes/workers/add-worker.tsx | 58 ++++-- .../cluster/registry/show-registry.tsx | 2 +- 5 files changed, 254 insertions(+), 128 deletions(-) create mode 100644 components/dashboard/settings/cluster/nodes/add-node.tsx diff --git a/components/dashboard/settings/cluster/nodes/add-node.tsx b/components/dashboard/settings/cluster/nodes/add-node.tsx new file mode 100644 index 000000000..43c21630a --- /dev/null +++ b/components/dashboard/settings/cluster/nodes/add-node.tsx @@ -0,0 +1,67 @@ +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Button } from "@/components/ui/button"; +import { ExternalLink, PlusIcon } from "lucide-react"; +import { AddWorker } from "./workers/add-worker"; +import { AddManager } from "./manager/add-manager"; +import Link from "next/link"; + +export const AddNode = () => { + return ( + + + + + + + Add Node + + Follow the steps to add a new node to your cluster, before you start + working with this feature, you need to understand how docker swarm + works.{" "} + + Docker Swarm + + + + Architecture + + + + +
+ + + Worker + Manager + + + + + + + + +
+
+
+ ); +}; diff --git a/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx b/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx index 8c6b1db8c..ebb4c7f30 100644 --- a/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx +++ b/components/dashboard/settings/cluster/nodes/manager/add-manager.tsx @@ -1,49 +1,63 @@ -import { Button } from "@/components/ui/button"; import { - Dialog, - DialogContent, DialogDescription, DialogHeader, DialogTitle, - DialogTrigger, } from "@/components/ui/dialog"; import { api } from "@/utils/api"; -import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { CardContent } from "@/components/ui/card"; +import { CopyIcon } from "lucide-react"; +import copy from "copy-to-clipboard"; +import { toast } from "sonner"; + export const AddManager = () => { const { data } = api.cluster.addManager.useQuery(); return ( <> - - - e.preventDefault()} - > - Add Manager - - - +
+ Add a new manager Add a new manager -
+
1. Go to your new server and run the following command - + curl https://get.docker.com | sh -s -- --version 24.0 +
-
+
- 2. Run the following command to add the node(server) to your + 2. Run the following command to add the node(manager) to your cluster - {data} + + {data} + +
- -
+ +
); }; diff --git a/components/dashboard/settings/cluster/nodes/show-nodes.tsx b/components/dashboard/settings/cluster/nodes/show-nodes.tsx index 47cbee4c0..95d105aba 100644 --- a/components/dashboard/settings/cluster/nodes/show-nodes.tsx +++ b/components/dashboard/settings/cluster/nodes/show-nodes.tsx @@ -7,7 +7,6 @@ import { CardTitle, } from "@/components/ui/card"; import { api } from "@/utils/api"; -import { AddWorker } from "./workers/add-worker"; import { DateTooltip } from "@/components/shared/date-tooltip"; import { Badge } from "@/components/ui/badge"; import { DeleteWorker } from "./workers/delete-worker"; @@ -20,7 +19,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { MoreHorizontal, PlusIcon } from "lucide-react"; +import { HelpCircle, LockIcon, MoreHorizontal } from "lucide-react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, @@ -29,10 +28,19 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { ShowNodeData } from "./show-node-data"; -import { AddManager } from "./manager/add-manager"; +import { AddNode } from "./add-node"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; export const ShowNodes = () => { const { data, isLoading } = api.cluster.getNodes.useQuery(); + const { data: registry } = api.registry.all.useQuery(); + + const haveAtLeastOneRegistry = !!(registry && registry?.length > 0); return ( @@ -40,91 +48,114 @@ export const ShowNodes = () => { Cluster Add nodes to your cluster
-
- - - - - - Actions - - - - -
+ {haveAtLeastOneRegistry && ( +
+ +
+ )} -
- {isLoading &&
Loading...
} - - A list of your managers / workers. - - - Hostname - Status - Role - Availability - Engine Version - Created + {haveAtLeastOneRegistry ? ( +
+ {isLoading &&
Loading...
} +
+ A list of your managers / workers. + + + Hostname + Status + Role + Availability + Engine Version + Created - Actions - - - - {data?.map((node) => { - const isManager = node.Spec.Role === "manager"; - return ( - - - {node.Description.Hostname} - - - {node.Status.State} - - - - {node?.Spec?.Role} - - - - {node.Spec.Availability} - + Actions + + + + {data?.map((node) => { + const isManager = node.Spec.Role === "manager"; + return ( + + + {node.Description.Hostname} + + + {node.Status.State} + + + + {node?.Spec?.Role} + + + + {node.Spec.Availability} + - - {node?.Description.Engine.EngineVersion} - + + {node?.Description.Engine.EngineVersion} + - - - Created{" "} - - - - - - - - - Actions - - {!node?.ManagerStatus?.Leader && ( - - )} - - - - - ); - })} - -
-
+ + + Created{" "} + + + + + + + + + Actions + + {!node?.ManagerStatus?.Leader && ( + + )} + + + + + ); + })} + + +
+ ) : ( +
+ +
+ + To add nodes to your cluster, you need to configure at least one + registry. + + + + + + + + Nodes need a registry to pull images from. + + + +
+ +
    +
  • + Docker Registry: Use custom registries like + Docker Hub, DigitalOcean Registry, etc. +
  • +
  • + Self-Hosted Docker Registry: Automatically set + up a local registry to store all images. +
  • +
+
+ )}
); diff --git a/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx b/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx index f05561581..9cca90e45 100644 --- a/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx +++ b/components/dashboard/settings/cluster/nodes/workers/add-worker.tsx @@ -1,47 +1,61 @@ -import { Button } from "@/components/ui/button"; +import { CardContent } from "@/components/ui/card"; import { - Dialog, - DialogContent, DialogDescription, DialogHeader, DialogTitle, - DialogTrigger, } from "@/components/ui/dialog"; -import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; import { api } from "@/utils/api"; +import copy from "copy-to-clipboard"; +import { CopyIcon } from "lucide-react"; +import { toast } from "sonner"; export const AddWorker = () => { const { data } = api.cluster.addWorker.useQuery(); return ( - - - e.preventDefault()} - > - Add Worker - - - +
+ Add a new worker Add a new worker -
+
1. Go to your new server and run the following command - + curl https://get.docker.com | sh -s -- --version 24.0 +
-
+
- 2. Run the following command to add the node(server) to your cluster + 2. Run the following command to add the node(worker) to your cluster + + + + {data} + - {data}
- -
+ +
); }; diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx index 30ed18fe9..fe403df03 100644 --- a/components/dashboard/settings/cluster/registry/show-registry.tsx +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -22,7 +22,7 @@ export const ShowRegistry = () => { return (
- +
Registry Add registry to your application. From 5806068e2e3c78923d4ed8f9f564a21f637d5c09 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Fri, 17 May 2024 23:43:07 -0600 Subject: [PATCH 10/28] refactor: improve UI --- .../application/delete-application.tsx | 4 +- .../application/domains/delete-domain.tsx | 4 +- .../application/domains/show-domains.tsx | 14 +- .../application/domains/update-domain.tsx | 4 +- .../application/update-application.tsx | 2 +- .../dashboard/mariadb/delete-mariadb.tsx | 98 +++++----- .../dashboard/mariadb/update-mariadb.tsx | 2 +- components/dashboard/mongo/delete-mongo.tsx | 98 +++++----- components/dashboard/mongo/update-mongo.tsx | 2 +- components/dashboard/mysql/delete-mysql.tsx | 98 +++++----- components/dashboard/mysql/update-mysql.tsx | 2 +- .../dashboard/postgres/delete-postgres.tsx | 98 +++++----- .../dashboard/postgres/update-postgres.tsx | 2 +- components/dashboard/redis/delete-redis.tsx | 98 +++++----- components/dashboard/redis/update-redis.tsx | 2 +- .../certificates/show-certificates.tsx | 30 +-- .../settings/cluster/nodes/add-node.tsx | 3 +- .../cluster/registry/show-registry.tsx | 6 +- .../destination/show-destinations.tsx | 6 +- .../settings/github/github-setup.tsx | 16 +- .../settings/users/add-permissions.tsx | 11 +- .../dashboard/settings/users/add-user.tsx | 5 +- .../dashboard/settings/users/delete-user.tsx | 10 +- .../dashboard/settings/users/show-users.tsx | 172 +++++++++++------- .../services/application/[applicationId].tsx | 2 +- .../services/mariadb/[mariadbId].tsx | 2 +- .../[projectId]/services/mongo/[mongoId].tsx | 2 +- .../[projectId]/services/mysql/[mysqlId].tsx | 2 +- .../services/postgres/[postgresId].tsx | 2 +- .../[projectId]/services/redis/[redisId].tsx | 2 +- 30 files changed, 430 insertions(+), 369 deletions(-) diff --git a/components/dashboard/application/delete-application.tsx b/components/dashboard/application/delete-application.tsx index b92866746..aa6fd9025 100644 --- a/components/dashboard/application/delete-application.tsx +++ b/components/dashboard/application/delete-application.tsx @@ -25,8 +25,8 @@ export const DeleteApplication = ({ applicationId }: Props) => { return ( - diff --git a/components/dashboard/application/domains/delete-domain.tsx b/components/dashboard/application/domains/delete-domain.tsx index 88521758e..80c2f194b 100644 --- a/components/dashboard/application/domains/delete-domain.tsx +++ b/components/dashboard/application/domains/delete-domain.tsx @@ -24,8 +24,8 @@ export const DeleteDomain = ({ domainId }: Props) => { return ( - diff --git a/components/dashboard/application/domains/show-domains.tsx b/components/dashboard/application/domains/show-domains.tsx index f315e02ab..c12d91401 100644 --- a/components/dashboard/application/domains/show-domains.tsx +++ b/components/dashboard/application/domains/show-domains.tsx @@ -40,7 +40,9 @@ export const ShowDomains = ({ applicationId }: Props) => {
{data && data?.length > 0 && ( - + + Add Domain + )}
@@ -51,7 +53,9 @@ export const ShowDomains = ({ applicationId }: Props) => { To access to the application is required to set at least 1 domain - Add Domain + + Add Domain +
) : (
@@ -75,8 +79,10 @@ export const ShowDomains = ({ applicationId }: Props) => { - - +
+ + +
); })} diff --git a/components/dashboard/application/domains/update-domain.tsx b/components/dashboard/application/domains/update-domain.tsx index 0d6c9b344..7262c35ba 100644 --- a/components/dashboard/application/domains/update-domain.tsx +++ b/components/dashboard/application/domains/update-domain.tsx @@ -115,8 +115,8 @@ export const UpdateDomain = ({ domainId }: Props) => { return ( - diff --git a/components/dashboard/application/update-application.tsx b/components/dashboard/application/update-application.tsx index 983a37ff4..5dd58df0b 100644 --- a/components/dashboard/application/update-application.tsx +++ b/components/dashboard/application/update-application.tsx @@ -90,7 +90,7 @@ export const UpdateApplication = ({ applicationId }: Props) => { diff --git a/components/dashboard/mariadb/delete-mariadb.tsx b/components/dashboard/mariadb/delete-mariadb.tsx index ca6a2f0b0..0687a2bdf 100644 --- a/components/dashboard/mariadb/delete-mariadb.tsx +++ b/components/dashboard/mariadb/delete-mariadb.tsx @@ -1,13 +1,13 @@ import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, + 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"; @@ -16,47 +16,47 @@ import { useRouter } from "next/router"; import { toast } from "sonner"; interface Props { - mariadbId: string; + mariadbId: string; } export const DeleteMariadb = ({ mariadbId }: Props) => { - const { mutateAsync, isLoading } = api.mariadb.remove.useMutation(); - const { push } = useRouter(); - return ( - - - - - - - Are you absolutely sure? - - This action cannot be undone. This will permanently delete the - database - - - - Cancel - { - await mutateAsync({ - mariadbId, - }) - .then((data) => { - push(`/dashboard/project/${data?.projectId}`); - toast.success("Database delete succesfully"); - }) - .catch(() => { - toast.error("Error to delete the database"); - }); - }} - > - Confirm - - - - - ); + const { mutateAsync, isLoading } = api.mariadb.remove.useMutation(); + const { push } = useRouter(); + return ( + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + database + + + + Cancel + { + await mutateAsync({ + mariadbId, + }) + .then((data) => { + push(`/dashboard/project/${data?.projectId}`); + toast.success("Database delete succesfully"); + }) + .catch(() => { + toast.error("Error to delete the database"); + }); + }} + > + Confirm + + + + + ); }; diff --git a/components/dashboard/mariadb/update-mariadb.tsx b/components/dashboard/mariadb/update-mariadb.tsx index 962f4a133..46ca19bd3 100644 --- a/components/dashboard/mariadb/update-mariadb.tsx +++ b/components/dashboard/mariadb/update-mariadb.tsx @@ -90,7 +90,7 @@ export const UpdateMariadb = ({ mariadbId }: Props) => { diff --git a/components/dashboard/mongo/delete-mongo.tsx b/components/dashboard/mongo/delete-mongo.tsx index 184d7988a..35e1eaa0b 100644 --- a/components/dashboard/mongo/delete-mongo.tsx +++ b/components/dashboard/mongo/delete-mongo.tsx @@ -1,13 +1,13 @@ import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, + 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"; @@ -16,47 +16,47 @@ import { useRouter } from "next/router"; import { toast } from "sonner"; interface Props { - mongoId: string; + mongoId: string; } export const DeleteMongo = ({ mongoId }: Props) => { - const { mutateAsync, isLoading } = api.mongo.remove.useMutation(); - const { push } = useRouter(); - return ( - - - - - - - Are you absolutely sure? - - This action cannot be undone. This will permanently delete the - database - - - - Cancel - { - await mutateAsync({ - mongoId, - }) - .then((data) => { - push(`/dashboard/project/${data?.projectId}`); - toast.success("Database delete succesfully"); - }) - .catch(() => { - toast.error("Error to delete the database"); - }); - }} - > - Confirm - - - - - ); + const { mutateAsync, isLoading } = api.mongo.remove.useMutation(); + const { push } = useRouter(); + return ( + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + database + + + + Cancel + { + await mutateAsync({ + mongoId, + }) + .then((data) => { + push(`/dashboard/project/${data?.projectId}`); + toast.success("Database delete succesfully"); + }) + .catch(() => { + toast.error("Error to delete the database"); + }); + }} + > + Confirm + + + + + ); }; diff --git a/components/dashboard/mongo/update-mongo.tsx b/components/dashboard/mongo/update-mongo.tsx index 6f511df23..fa7a52839 100644 --- a/components/dashboard/mongo/update-mongo.tsx +++ b/components/dashboard/mongo/update-mongo.tsx @@ -90,7 +90,7 @@ export const UpdateMongo = ({ mongoId }: Props) => { diff --git a/components/dashboard/mysql/delete-mysql.tsx b/components/dashboard/mysql/delete-mysql.tsx index dc5e68b8a..373c68fdb 100644 --- a/components/dashboard/mysql/delete-mysql.tsx +++ b/components/dashboard/mysql/delete-mysql.tsx @@ -1,13 +1,13 @@ import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, + 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"; @@ -16,47 +16,47 @@ import { useRouter } from "next/router"; import { toast } from "sonner"; interface Props { - mysqlId: string; + mysqlId: string; } export const DeleteMysql = ({ mysqlId }: Props) => { - const { mutateAsync, isLoading } = api.mysql.remove.useMutation(); - const { push } = useRouter(); - return ( - - - - - - - Are you absolutely sure? - - This action cannot be undone. This will permanently delete the - database - - - - Cancel - { - await mutateAsync({ - mysqlId, - }) - .then((data) => { - push(`/dashboard/project/${data?.projectId}`); - toast.success("Database delete succesfully"); - }) - .catch(() => { - toast.error("Error to delete the database"); - }); - }} - > - Confirm - - - - - ); + const { mutateAsync, isLoading } = api.mysql.remove.useMutation(); + const { push } = useRouter(); + return ( + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + database + + + + Cancel + { + await mutateAsync({ + mysqlId, + }) + .then((data) => { + push(`/dashboard/project/${data?.projectId}`); + toast.success("Database delete succesfully"); + }) + .catch(() => { + toast.error("Error to delete the database"); + }); + }} + > + Confirm + + + + + ); }; diff --git a/components/dashboard/mysql/update-mysql.tsx b/components/dashboard/mysql/update-mysql.tsx index 3c7831ac6..cd281281a 100644 --- a/components/dashboard/mysql/update-mysql.tsx +++ b/components/dashboard/mysql/update-mysql.tsx @@ -90,7 +90,7 @@ export const UpdateMysql = ({ mysqlId }: Props) => { diff --git a/components/dashboard/postgres/delete-postgres.tsx b/components/dashboard/postgres/delete-postgres.tsx index 96b15f802..ce64c44b0 100644 --- a/components/dashboard/postgres/delete-postgres.tsx +++ b/components/dashboard/postgres/delete-postgres.tsx @@ -1,13 +1,13 @@ import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, + 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"; @@ -16,47 +16,47 @@ import { useRouter } from "next/router"; import { toast } from "sonner"; interface Props { - postgresId: string; + postgresId: string; } export const DeletePostgres = ({ postgresId }: Props) => { - const { mutateAsync, isLoading } = api.postgres.remove.useMutation(); - const { push } = useRouter(); - return ( - - - - - - - Are you absolutely sure? - - This action cannot be undone. This will permanently delete the - database - - - - Cancel - { - await mutateAsync({ - postgresId, - }) - .then((data) => { - push(`/dashboard/project/${data?.projectId}`); - toast.success("Database delete succesfully"); - }) - .catch(() => { - toast.error("Error to delete the database"); - }); - }} - > - Confirm - - - - - ); + const { mutateAsync, isLoading } = api.postgres.remove.useMutation(); + const { push } = useRouter(); + return ( + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + database + + + + Cancel + { + await mutateAsync({ + postgresId, + }) + .then((data) => { + push(`/dashboard/project/${data?.projectId}`); + toast.success("Database delete succesfully"); + }) + .catch(() => { + toast.error("Error to delete the database"); + }); + }} + > + Confirm + + + + + ); }; diff --git a/components/dashboard/postgres/update-postgres.tsx b/components/dashboard/postgres/update-postgres.tsx index fd77fad22..45f0aa89c 100644 --- a/components/dashboard/postgres/update-postgres.tsx +++ b/components/dashboard/postgres/update-postgres.tsx @@ -90,7 +90,7 @@ export const UpdatePostgres = ({ postgresId }: Props) => { diff --git a/components/dashboard/redis/delete-redis.tsx b/components/dashboard/redis/delete-redis.tsx index 509e8fc4a..62db598b4 100644 --- a/components/dashboard/redis/delete-redis.tsx +++ b/components/dashboard/redis/delete-redis.tsx @@ -1,13 +1,13 @@ import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, + 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"; @@ -16,47 +16,47 @@ import { useRouter } from "next/router"; import { toast } from "sonner"; interface Props { - redisId: string; + redisId: string; } export const DeleteRedis = ({ redisId }: Props) => { - const { mutateAsync, isLoading } = api.redis.remove.useMutation(); - const { push } = useRouter(); - return ( - - - - - - - Are you absolutely sure? - - This action cannot be undone. This will permanently delete the - database - - - - Cancel - { - await mutateAsync({ - redisId, - }) - .then((data) => { - push(`/dashboard/project/${data?.projectId}`); - toast.success("Database delete succesfully"); - }) - .catch(() => { - toast.error("Error to delete the database"); - }); - }} - > - Confirm - - - - - ); + const { mutateAsync, isLoading } = api.redis.remove.useMutation(); + const { push } = useRouter(); + return ( + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the + database + + + + Cancel + { + await mutateAsync({ + redisId, + }) + .then((data) => { + push(`/dashboard/project/${data?.projectId}`); + toast.success("Database delete succesfully"); + }) + .catch(() => { + toast.error("Error to delete the database"); + }); + }} + > + Confirm + + + + + ); }; diff --git a/components/dashboard/redis/update-redis.tsx b/components/dashboard/redis/update-redis.tsx index b668bdfff..8ac239b39 100644 --- a/components/dashboard/redis/update-redis.tsx +++ b/components/dashboard/redis/update-redis.tsx @@ -90,7 +90,7 @@ export const UpdateRedis = ({ redisId }: Props) => { diff --git a/components/dashboard/settings/certificates/show-certificates.tsx b/components/dashboard/settings/certificates/show-certificates.tsx index a67e55076..963bc571e 100644 --- a/components/dashboard/settings/certificates/show-certificates.tsx +++ b/components/dashboard/settings/certificates/show-certificates.tsx @@ -33,21 +33,23 @@ export const ShowCertificates = () => {
) : (
- {data?.map((destination, index) => ( -
- - {index + 1}. {destination.name} - -
- +
+ {data?.map((destination, index) => ( +
+ + {index + 1}. {destination.name} + +
+ +
-
- ))} + ))} +
diff --git a/components/dashboard/settings/cluster/nodes/add-node.tsx b/components/dashboard/settings/cluster/nodes/add-node.tsx index 43c21630a..fd923057d 100644 --- a/components/dashboard/settings/cluster/nodes/add-node.tsx +++ b/components/dashboard/settings/cluster/nodes/add-node.tsx @@ -27,8 +27,7 @@ export const AddNode = () => { Add Node Follow the steps to add a new node to your cluster, before you start - working with this feature, you need to understand how docker swarm - works.{" "} + using this feature, you need to understand how docker swarm works.{" "} {
) : ( -
+
{data?.map((registry, index) => (
{index + 1}. {registry.registryName} -
+
diff --git a/components/dashboard/settings/destination/show-destinations.tsx b/components/dashboard/settings/destination/show-destinations.tsx index b8f1a3c73..b5c0448f4 100644 --- a/components/dashboard/settings/destination/show-destinations.tsx +++ b/components/dashboard/settings/destination/show-destinations.tsx @@ -34,16 +34,16 @@ export const ShowDestinations = () => {
) : ( -
+
{data?.map((destination, index) => (
{index + 1}. {destination.name} -
+
diff --git a/components/dashboard/settings/github/github-setup.tsx b/components/dashboard/settings/github/github-setup.tsx index 6e9a80586..1e78d001f 100644 --- a/components/dashboard/settings/github/github-setup.tsx +++ b/components/dashboard/settings/github/github-setup.tsx @@ -87,10 +87,10 @@ export const GithubSetup = () => { {haveGithubConfigured ? (
- + Github account configured succesfully. - +
@@ -101,9 +101,9 @@ export const GithubSetup = () => { {data?.githubAppName ? (
- Youve successfully created a GitHub app named - {data.githubAppName}! The next step is to install this app in - your GitHub account. + You've successfully created a github app named{" "} + {data.githubAppName}! The next step is to + install this app in your GitHub account.
@@ -121,12 +121,12 @@ export const GithubSetup = () => { ) : (
- - To integrate your GitHub account with our services, youll +

+ To integrate your GitHub account with our services, you'll need to create and install a GitHub app. This process is straightforward and only takes a few minutes. Click the button below to get started. - +

diff --git a/components/dashboard/settings/users/add-permissions.tsx b/components/dashboard/settings/users/add-permissions.tsx index d241aef1e..cf80803d7 100644 --- a/components/dashboard/settings/users/add-permissions.tsx +++ b/components/dashboard/settings/users/add-permissions.tsx @@ -23,11 +23,11 @@ import { extractServices } from "@/pages/dashboard/project/[projectId]"; import { api } from "@/utils/api"; import { AlertBlock } from "@/components/shared/alert-block"; import { zodResolver } from "@hookform/resolvers/zod"; -import { ListTodo } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; const addPermissions = z.object({ accesedProjects: z.array(z.string()).optional(), @@ -107,9 +107,12 @@ export const AddUserPermissions = ({ userId }: Props) => { return ( - + e.preventDefault()} + > + Add Permissions + diff --git a/components/dashboard/settings/users/add-user.tsx b/components/dashboard/settings/users/add-user.tsx index f9790b042..ee8edfead 100644 --- a/components/dashboard/settings/users/add-user.tsx +++ b/components/dashboard/settings/users/add-user.tsx @@ -25,6 +25,7 @@ import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { PlusIcon } from "lucide-react"; const addUser = z.object({ email: z @@ -66,7 +67,9 @@ export const AddUser = () => { return ( - + diff --git a/components/dashboard/settings/users/delete-user.tsx b/components/dashboard/settings/users/delete-user.tsx index dce95bd6b..f39047952 100644 --- a/components/dashboard/settings/users/delete-user.tsx +++ b/components/dashboard/settings/users/delete-user.tsx @@ -14,6 +14,7 @@ import { Button } from "@/components/ui/button"; import { api } from "@/utils/api"; import { TrashIcon } from "lucide-react"; import { toast } from "sonner"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; interface Props { authId: string; @@ -24,9 +25,12 @@ export const DeleteUser = ({ authId }: Props) => { return ( - + e.preventDefault()} + > + Delete User + diff --git a/components/dashboard/settings/users/show-users.tsx b/components/dashboard/settings/users/show-users.tsx index 226f86a8c..55c304110 100644 --- a/components/dashboard/settings/users/show-users.tsx +++ b/components/dashboard/settings/users/show-users.tsx @@ -6,7 +6,7 @@ import { CardTitle, } from "@/components/ui/card"; import { api } from "@/utils/api"; -import { CopyIcon, Users } from "lucide-react"; +import { MoreHorizontal, Users } from "lucide-react"; import { AddUser } from "./add-user"; import { DeleteUser } from "./delete-user"; import { format } from "date-fns"; @@ -14,7 +14,24 @@ import { useEffect, useState } from "react"; import { AddUserPermissions } from "./add-permissions"; import copy from "copy-to-clipboard"; import { toast } from "sonner"; -import { UpdateUser } from "./update-user"; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { Badge } from "@/components/ui/badge"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Button } from "@/components/ui/button"; export const ShowUsers = () => { const { data } = api.user.all.useQuery(); @@ -25,82 +42,109 @@ export const ShowUsers = () => { return (
- - - Users - Add, manage and delete users. + + +
+ Users + Add, manage and delete users. +
+ + {data && data.length > 0 && ( +
+ +
+ )}
{data?.length === 0 ? (
- To create a user is required to add + To create a user, you need to add:
) : (
- {data?.map((user) => { - return ( -
- - {user.auth.email} - - {!user.isRegistered && ( - - Expire In{" "} - {format(new Date(user.expirationDate), "PPpp")} - - )} + + See all users + + + Email + Status + 2FA + Expiration + Actions + + + + {data?.map((user) => { + return ( + + + {user.auth.email} + + + + {user.isRegistered + ? "Registered" + : "Not Registered"} + + + + {user.auth.is2FAEnabled + ? "2FA Enabled" + : "2FA Not Enabled"} + + + + {format(new Date(user.expirationDate), "PPpp")} + + - - {user.isRegistered ? "Registered" : "Not Registered"} - - {user.auth.is2FAEnabled && ( - - {user.auth.is2FAEnabled - ? "2FA Enabled" - : "2FA Not Enabled"} - - )} + + + + + + + Actions + {!user.isRegistered && ( + { + copy( + `${origin}/invitation?token=${user.token}`, + ); + toast.success( + "Invitation Copied to clipboard", + ); + }} + > + Copy Invitation + + )} -
- {!user.isRegistered && ( -
-
- - {`${url}/invitation?token=${user.token}`} - -
- -
- )} + {user.isRegistered && ( + + )} - {user.isRegistered && ( - - )} - {user.isRegistered && } - -
- - ); - })} -
- -
+ +
+
+
+
+ ); + })} +
+
)} diff --git a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx index 71f46eab7..81e927931 100644 --- a/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx +++ b/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx @@ -135,7 +135,7 @@ const Service = ( Domains Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( diff --git a/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx b/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx index 87a86df64..8d43e4cf3 100644 --- a/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx +++ b/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx @@ -116,7 +116,7 @@ const Mariadb = ( Logs Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( diff --git a/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx b/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx index 8d50bd326..409b9bd6d 100644 --- a/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx +++ b/pages/dashboard/project/[projectId]/services/mongo/[mongoId].tsx @@ -118,7 +118,7 @@ const Mongo = ( Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( diff --git a/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx b/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx index 22ea3cccb..873d6c9e1 100644 --- a/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx +++ b/pages/dashboard/project/[projectId]/services/mysql/[mysqlId].tsx @@ -117,7 +117,7 @@ const MySql = ( Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( diff --git a/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx b/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx index 9277b2f7b..0573b5783 100644 --- a/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx +++ b/pages/dashboard/project/[projectId]/services/postgres/[postgresId].tsx @@ -118,7 +118,7 @@ const Postgresql = ( Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( diff --git a/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx b/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx index 9d4ca9595..2d1df4223 100644 --- a/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx +++ b/pages/dashboard/project/[projectId]/services/redis/[redisId].tsx @@ -116,7 +116,7 @@ const Redis = ( Advanced -
+
{(auth?.rol === "admin" || user?.canDeleteServices) && ( From d52f66a7168e9adcf8abc6825850944be27f69fe Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 18 May 2024 03:07:51 -0600 Subject: [PATCH 11/28] feat: add experimental swarm settings --- .../cluster/modify-swarm-settings.tsx | 472 ++++ .../cluster/show-cluster-settings.tsx | 3 + .../advanced/ports/update-port.tsx | 4 +- .../advanced/redirects/update-redirect.tsx | 4 +- .../advanced/security/update-security.tsx | 4 +- .../database/backups/update-backup.tsx | 4 +- components/layouts/project-layout.tsx | 2 +- components/ui/form.tsx | 1 - drizzle/0012_chubby_umar.sql | 7 + drizzle/meta/0012_snapshot.json | 2386 +++++++++++++++++ drizzle/meta/_journal.json | 7 + server/db/schema/application.ts | 70 +- server/utils/builders/index.ts | 42 +- server/utils/docker/utils.ts | 86 +- 14 files changed, 3064 insertions(+), 28 deletions(-) create mode 100644 components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx create mode 100644 drizzle/0012_chubby_umar.sql create mode 100644 drizzle/meta/0012_snapshot.json diff --git a/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx b/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx new file mode 100644 index 000000000..1d383f0a1 --- /dev/null +++ b/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx @@ -0,0 +1,472 @@ +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 { api } from "@/utils/api"; +import { AlertBlock } from "@/components/shared/alert-block"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { z } from "zod"; +import { Textarea } from "@/components/ui/textarea"; +import { Settings } from "lucide-react"; + +const HealthCheckSwarmSchema = z + .object({ + Test: z.array(z.string()).optional(), + Interval: z.number().optional(), + Timeout: z.number().optional(), + StartPeriod: z.number().optional(), + Retries: z.number().optional(), + }) + .strict(); + +const RestartPolicySwarmSchema = z + .object({ + Condition: z.string().optional(), + Delay: z.number().optional(), + MaxAttempts: z.number().optional(), + Window: z.number().optional(), + }) + .strict(); + +const PreferenceSchema = z + .object({ + Spread: z.object({ + SpreadDescriptor: z.string(), + }), + }) + .strict(); + +const PlatformSchema = z + .object({ + Architecture: z.string(), + OS: z.string(), + }) + .strict(); + +const PlacementSwarmSchema = z + .object({ + Constraints: z.array(z.string()).optional(), + Preferences: z.array(PreferenceSchema).optional(), + MaxReplicas: z.number().optional(), + Platforms: z.array(PlatformSchema).optional(), + }) + .strict(); + +const UpdateConfigSwarmSchema = z.object({ + Parallelism: z.number(), + Delay: z.number().optional(), + FailureAction: z.string().optional(), + Monitor: z.number().optional(), + MaxFailureRatio: z.number().optional(), + Order: z.string(), +}); + +const ReplicatedSchema = z + .object({ + Replicas: z.number().optional(), + }) + .strict(); + +const ReplicatedJobSchema = z + .object({ + MaxConcurrent: z.number().optional(), + TotalCompletions: z.number().optional(), + }) + .strict(); + +const ServiceModeSwarmSchema = z.object({ + Replicated: ReplicatedSchema.optional(), + Global: z.object({}).optional(), + ReplicatedJob: ReplicatedJobSchema.optional(), + GlobalJob: z.object({}).optional(), +}); + +const LabelsSwarmSchema = z.record(z.string()); + +// const stringToJSONSchema = z +// .string() +// .transform((str, ctx) => { +// try { +// return JSON.parse(str); +// } catch (e) { +// ctx.addIssue({ code: "custom", message: "Invalid JSON format" }); +// return z.NEVER; +// } +// }) +// .superRefine((data, ctx) => { +// const parseResult = HealthCheckSwarmSchema.safeParse(data); +// if (!parseResult.success) { +// for (const error of parseResult.error.issues) { +// const path = error.path.join("."); +// ctx.addIssue({ +// code: z.ZodIssueCode.custom, +// message: `${path} ${error.message}`, +// }); +// } +// // parseResult.error.errors.forEach((error) => { +// // const path = error.path.join("."); +// // ctx.addIssue({ +// // code: z.ZodIssueCode.custom, +// // message: `${path} ${error.message}`, +// // }); +// // }); +// } +// }); +const createStringToJSONSchema = (schema: z.ZodTypeAny) => { + return z + .string() + .transform((str, ctx) => { + if (str === null || str === "") { + return null; + } + try { + return JSON.parse(str); + } catch (e) { + ctx.addIssue({ code: "custom", message: "Invalid JSON format" }); + return z.NEVER; + } + }) + .superRefine((data, ctx) => { + if (data === null) { + return; + } + + if (Object.keys(data).length === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Object cannot be empty", + }); + return; + } + + const parseResult = schema.safeParse(data); + if (!parseResult.success) { + for (const error of parseResult.error.issues) { + const path = error.path.join("."); + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `${path} ${error.message}`, + }); + } + } + }); +}; + +const addSwarmSettings = z.object({ + healthCheckSwarm: createStringToJSONSchema(HealthCheckSwarmSchema).nullable(), + restartPolicySwarm: createStringToJSONSchema( + RestartPolicySwarmSchema, + ).nullable(), + placementSwarm: createStringToJSONSchema(PlacementSwarmSchema).nullable(), + updateConfigSwarm: createStringToJSONSchema( + UpdateConfigSwarmSchema, + ).nullable(), + rollbackConfigSwarm: createStringToJSONSchema( + UpdateConfigSwarmSchema, + ).nullable(), + modeSwarm: createStringToJSONSchema(ServiceModeSwarmSchema).nullable(), + labelsSwarm: createStringToJSONSchema(LabelsSwarmSchema).nullable(), +}); + +type AddSwarmSettings = z.infer; + +interface Props { + applicationId: string; +} + +export const AddSwarmSettings = ({ applicationId }: Props) => { + const { data, refetch } = api.application.one.useQuery( + { + applicationId, + }, + { + enabled: !!applicationId, + }, + ); + + const { mutateAsync, isError, error, isLoading } = + api.application.update.useMutation(); + + const form = useForm({ + defaultValues: { + healthCheckSwarm: null, + restartPolicySwarm: null, + placementSwarm: null, + updateConfigSwarm: null, + rollbackConfigSwarm: null, + modeSwarm: null, + labelsSwarm: null, + }, + resolver: zodResolver(addSwarmSettings), + }); + + useEffect(() => { + if (data) { + console.log(data.healthCheckSwarm, null); + form.reset({ + healthCheckSwarm: data.healthCheckSwarm || null, + restartPolicySwarm: data.restartPolicySwarm || null, + placementSwarm: data.placementSwarm || null, + updateConfigSwarm: data.updateConfigSwarm || null, + rollbackConfigSwarm: data.rollbackConfigSwarm || null, + modeSwarm: data.modeSwarm || null, + labelsSwarm: data.labelsSwarm || null, + }); + } + }, [form, form.formState.isSubmitSuccessful, form.reset, data]); + + const onSubmit = async (data: AddSwarmSettings) => { + console.log(data.restartPolicySwarm); + await mutateAsync({ + applicationId, + healthCheckSwarm: data.healthCheckSwarm + ? JSON.stringify(data.healthCheckSwarm) + : null, + restartPolicySwarm: data.restartPolicySwarm + ? JSON.stringify(data.restartPolicySwarm) + : null, + placementSwarm: data.placementSwarm + ? JSON.stringify(data.placementSwarm) + : null, + updateConfigSwarm: data.updateConfigSwarm + ? JSON.stringify(data.updateConfigSwarm) + : null, + rollbackConfigSwarm: data.rollbackConfigSwarm + ? JSON.stringify(data.rollbackConfigSwarm) + : null, + modeSwarm: data.modeSwarm ? JSON.stringify(data.modeSwarm) : null, + labelsSwarm: data.labelsSwarm ? JSON.stringify(data.labelsSwarm) : null, + }) + .then(async () => { + toast.success("Swarm settings updated"); + refetch(); + }) + .catch(() => { + toast.error("Error to update the swarm settings"); + }); + }; + return ( + + + + + + + Swarm Settings + + Update certain settings using a json object. + + + {isError && {error?.message}} + +
+ + ( + + Health Check + + Check the interface + + +