From b05af62b7b56a4b0422a8c843f3565ac74ad5964 Mon Sep 17 00:00:00 2001 From: yni9ht Date: Thu, 23 Jan 2025 14:49:28 +0800 Subject: [PATCH 1/4] feat: add alist template --- apps/dokploy/public/templates/alist.svg | 10 +++++++++ .../templates/alist/docker-compose.yml | 14 ++++++++++++ apps/dokploy/templates/alist/index.ts | 22 +++++++++++++++++++ apps/dokploy/templates/templates.ts | 15 +++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 apps/dokploy/public/templates/alist.svg create mode 100644 apps/dokploy/templates/alist/docker-compose.yml create mode 100644 apps/dokploy/templates/alist/index.ts diff --git a/apps/dokploy/public/templates/alist.svg b/apps/dokploy/public/templates/alist.svg new file mode 100644 index 000000000..37d5fdcd9 --- /dev/null +++ b/apps/dokploy/public/templates/alist.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/templates/alist/docker-compose.yml b/apps/dokploy/templates/alist/docker-compose.yml new file mode 100644 index 000000000..9ff67c943 --- /dev/null +++ b/apps/dokploy/templates/alist/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.3' +services: + alist: + image: xhofe/alist:v3.41.0 + volumes: + - alist-data:/opt/alist/data + environment: + - PUID=0 + - PGID=0 + - UMASK=022 + restart: unless-stopped + +volumes: + alist-data: \ No newline at end of file diff --git a/apps/dokploy/templates/alist/index.ts b/apps/dokploy/templates/alist/index.ts new file mode 100644 index 000000000..2a27f5708 --- /dev/null +++ b/apps/dokploy/templates/alist/index.ts @@ -0,0 +1,22 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 5244, + serviceName: "alist", + }, + ]; + + return { + domains, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 1bdb1ec1f..82a00d50b 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1341,4 +1341,19 @@ export const templates: TemplateData[] = [ tags: ["dashboard", "monitoring"], load: () => import("./homarr/index").then((m) => m.generate), }, + { + id: "alist", + name: "AList", + version: "v3.41.0", + description: + "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", + logo: "alist.svg", + links: { + github: "https://github.com/AlistGo/alist", + website: "https://alist.nn.ci", + docs: "https://alist.nn.ci/guide/install/docker.html", + }, + tags: ["file", "webdav", "storage"], + load: () => import("./alist/index").then((m) => m.generate), + }, ]; From 41cf3d7b7758bb2b129e0548a14ba358037c6422 Mon Sep 17 00:00:00 2001 From: Roody <18101218+RoodyCode@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:32:08 +0100 Subject: [PATCH 2/4] style: fix incosistent spacing --- apps/dokploy/components/dashboard/project/add-template.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/project/add-template.tsx b/apps/dokploy/components/dashboard/project/add-template.tsx index faee27ef3..bc8929b2b 100644 --- a/apps/dokploy/components/dashboard/project/add-template.tsx +++ b/apps/dokploy/components/dashboard/project/add-template.tsx @@ -308,7 +308,7 @@ export const AddTemplate = ({ projectId }: Props) => { {/* Create Button */}
Date: Thu, 23 Jan 2025 20:20:59 +0700 Subject: [PATCH 3/4] Update ru translation --- apps/dokploy/public/locales/ru/settings.json | 24 ++++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/apps/dokploy/public/locales/ru/settings.json b/apps/dokploy/public/locales/ru/settings.json index 1e71d7102..0d87ed159 100644 --- a/apps/dokploy/public/locales/ru/settings.json +++ b/apps/dokploy/public/locales/ru/settings.json @@ -1,5 +1,6 @@ { "settings.common.save": "Сохранить", + "settings.common.enterTerminal": "Открыть терминал", "settings.server.domain.title": "Домен сервера", "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", "settings.server.domain.form.domain": "Домен", @@ -7,18 +8,26 @@ "settings.server.domain.form.certificate.label": "Сертификат", "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", "settings.server.domain.form.certificateOptions.none": "Нет", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (По умолчанию)", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", "settings.server.webServer.title": "Веб-сервер", "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.storage.label": "Дисковое пространство", "settings.server.webServer.actions": "Действия", "settings.server.webServer.reload": "Перезагрузить", "settings.server.webServer.watchLogs": "Просмотр логов", "settings.server.webServer.updateServerIp": "Изменить IP адрес", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", + "settings.server.webServer.traefik.managePorts": "Назначение портов", + "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", + "settings.server.webServer.traefik.targetPort": "Внутренний порт", + "settings.server.webServer.traefik.publishedPort": "Внешний порт", + "settings.server.webServer.traefik.addPort": "Добавить порт", + "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", + "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", + "settings.server.webServer.traefik.publishMode": "Режим сопоставления", + "settings.server.webServer.storage.label": "Дисковое пространство", "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", @@ -40,5 +49,10 @@ "settings.appearance.themes.dark": "Темная", "settings.appearance.themes.system": "Системная", "settings.appearance.language": "Язык", - "settings.appearance.languageDescription": "Select a language for your dashboard" + "settings.appearance.languageDescription": "Выберите язык для панели управления", + + "settings.terminal.connectionSettings": "Настройки подключения", + "settings.terminal.ipAddress": "IP адрес", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Имя пользователя" } From 0a826fbf1c0b73b8c2538792ce4324b152c4fe46 Mon Sep 17 00:00:00 2001 From: vishalkadam47 Date: Fri, 24 Jan 2025 06:13:54 +0530 Subject: [PATCH 4/4] feat: add dropdown menu for service domains and add download functionality for SSH keys --- .../components/dashboard/projects/show.tsx | 100 ++++++++++++++++-- .../settings/ssh-keys/handle-ssh-keys.tsx | 58 +++++++++- 2 files changed, 147 insertions(+), 11 deletions(-) diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index afeabf309..ca83b5889 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -23,8 +23,10 @@ import { import { DropdownMenu, DropdownMenuContent, + DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, + DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; @@ -149,14 +151,91 @@ export const ShowProjects = () => { href={`/dashboard/project/${project.projectId}`} > - - + {project.applications.length > 0 || + project.compose.length > 0 ? ( + + + + + e.stopPropagation()} + > + {project.applications.length > 0 && ( + + + Applications + + {project.applications.map((app) => ( +
+ + + + {app.name} + + + {app.domains.map((domain) => ( + + + {domain.host} + + + + ))} + +
+ ))} +
+ )} + {project.compose.length > 0 && ( + + + Compose + + {project.compose.map((comp) => ( +
+ + + + {comp.name} + + + {comp.domains.map((domain) => ( + + + {domain.host} + + + + ))} + +
+ ))} +
+ )} +
+
+ ) : null} @@ -182,7 +261,10 @@ export const ShowProjects = () => { - + e.stopPropagation()} + > Actions diff --git a/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx b/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx index f100979e3..fc48134a2 100644 --- a/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx +++ b/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx @@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea"; import { sshKeyCreate, type sshKeyType } from "@/server/db/validations"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { PenBoxIcon, PlusIcon } from "lucide-react"; +import { DownloadIcon, PenBoxIcon, PlusIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -111,6 +111,26 @@ export const HandleSSHKeys = ({ sshKeyId }: Props) => { toast.error("Error generating the SSH Key"); }); + const downloadKey = ( + content: string, + defaultFilename: string, + keyType: "private" | "public", + ) => { + const keyName = form.watch("name"); + const filename = keyName + ? `${keyName}${sshKeyId ? `_${sshKeyId}` : ""}_${keyType}_${defaultFilename}` + : `${keyType}_${defaultFilename}`; + const blob = new Blob([content], { type: "text/plain" }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }; + return ( @@ -245,7 +265,41 @@ export const HandleSSHKeys = ({ sshKeyId }: Props) => { )} /> - + +
+ {form.watch("privateKey") && ( + + )} + {form.watch("publicKey") && ( + + )} +