From bd0bbdea2657dc9506f84a4b0f1d2f9fef5f06e5 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 8 Sep 2024 01:45:39 -0600 Subject: [PATCH 01/73] feat: init multi server feature --- .../dashboard/settings/servers/add-server.tsx | 253 ++ .../settings/servers/setup-server.tsx | 172 + .../settings/servers/show-servers.tsx | 163 + .../settings/web-server/terminal-modal.tsx | 140 +- .../settings/web-server/terminal.tsx | 8 +- .../components/layouts/settings-layout.tsx | 9 +- .../drizzle/0037_small_adam_warlock.sql | 18 + .../dokploy/drizzle/0038_thankful_magneto.sql | 6 + .../drizzle/0039_military_doctor_faustus.sql | 8 + apps/dokploy/drizzle/meta/0037_snapshot.json | 3653 ++++++++++++++++ apps/dokploy/drizzle/meta/0038_snapshot.json | 3672 ++++++++++++++++ apps/dokploy/drizzle/meta/0039_snapshot.json | 3683 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 21 + apps/dokploy/package.json | 6 +- .../pages/dashboard/settings/servers.tsx | 49 + apps/dokploy/pages/index.tsx | 4 +- apps/dokploy/pages/register.tsx | 6 + apps/dokploy/server/api/root.ts | 2 + apps/dokploy/server/api/routers/auth.ts | 18 +- apps/dokploy/server/api/routers/deployment.ts | 7 + apps/dokploy/server/api/routers/project.ts | 6 +- apps/dokploy/server/api/routers/server.ts | 97 + .../dokploy/server/api/services/deployment.ts | 80 + apps/dokploy/server/api/services/project.ts | 9 +- apps/dokploy/server/api/services/server.ts | 72 + apps/dokploy/server/api/trpc.ts | 5 +- apps/dokploy/server/auth/auth.ts | 22 +- apps/dokploy/server/constants/index.ts | 25 + apps/dokploy/server/db/schema/deployment.ts | 29 + apps/dokploy/server/db/schema/index.ts | 1 + apps/dokploy/server/db/schema/server.ts | 82 + apps/dokploy/server/db/schema/ssh-key.ts | 4 +- apps/dokploy/server/queues/queueSetup.ts | 6 +- apps/dokploy/server/utils/filesystem/ssh.ts | 2 +- .../server/utils/servers/setup-server.ts | 235 ++ apps/dokploy/server/wss/terminal.ts | 97 +- pnpm-lock.yaml | 14 +- 37 files changed, 12474 insertions(+), 210 deletions(-) create mode 100644 apps/dokploy/components/dashboard/settings/servers/add-server.tsx create mode 100644 apps/dokploy/components/dashboard/settings/servers/setup-server.tsx create mode 100644 apps/dokploy/components/dashboard/settings/servers/show-servers.tsx create mode 100644 apps/dokploy/drizzle/0037_small_adam_warlock.sql create mode 100644 apps/dokploy/drizzle/0038_thankful_magneto.sql create mode 100644 apps/dokploy/drizzle/0039_military_doctor_faustus.sql create mode 100644 apps/dokploy/drizzle/meta/0037_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0038_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0039_snapshot.json create mode 100644 apps/dokploy/pages/dashboard/settings/servers.tsx create mode 100644 apps/dokploy/server/api/routers/server.ts create mode 100644 apps/dokploy/server/api/services/server.ts create mode 100644 apps/dokploy/server/db/schema/server.ts create mode 100644 apps/dokploy/server/utils/servers/setup-server.ts diff --git a/apps/dokploy/components/dashboard/settings/servers/add-server.tsx b/apps/dokploy/components/dashboard/settings/servers/add-server.tsx new file mode 100644 index 00000000..3fbb8297 --- /dev/null +++ b/apps/dokploy/components/dashboard/settings/servers/add-server.tsx @@ -0,0 +1,253 @@ +import { AlertBlock } from "@/components/shared/alert-block"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + 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 { PlusIcon } 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"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +const Schema = z.object({ + name: z.string().min(1, { + message: "Name is required", + }), + description: z.string().optional(), + ipAddress: z.string().min(1, { + message: "IP Address is required", + }), + port: z.number().optional(), + username: z.string().optional(), + sshKeyId: z.string().min(1, { + message: "SSH Key is required", + }), +}); + +type Schema = z.infer; + +export const AddServer = () => { + const utils = api.useUtils(); + const [isOpen, setIsOpen] = useState(false); + const { data: sshKeys } = api.sshKey.all.useQuery(); + const { mutateAsync, error, isError } = api.server.create.useMutation(); + const form = useForm({ + defaultValues: { + description: "", + name: "", + ipAddress: "", + port: 22, + username: "root", + sshKeyId: "", + }, + resolver: zodResolver(Schema), + }); + + useEffect(() => { + form.reset({ + description: "", + name: "", + ipAddress: "", + port: 22, + username: "root", + sshKeyId: "", + }); + }, [form, form.reset, form.formState.isSubmitSuccessful]); + + const onSubmit = async (data: Schema) => { + await mutateAsync({ + name: data.name, + description: data.description || "", + ipAddress: data.ipAddress || "", + port: data.port || 22, + username: data.username || "root", + sshKeyId: data.sshKeyId || "", + }) + .then(async (data) => { + await utils.server.all.invalidate(); + toast.success("Server Created"); + setIsOpen(false); + }) + .catch(() => { + toast.error("Error to create a server"); + }); + }; + + return ( + + + + + + + Add Server + + Add a server to deploy your applications remotely. + + + {isError && {error?.message}} +
+ +
+ ( + + Name + + + + + + + )} + /> +
+ ( + + Description + +