diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..33bd3288 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,62 @@ +name: Bug Report +description: Create a bug report +labels: ['bug'] +body: + - type: markdown + attributes: + value: | + Before opening a new issue, please do a search of existing issues. + + If you need help with your own project, you can start a discussion in the [Q&A Section](https://github.com/Dokploy/dokploy/discussions). + - type: textarea + attributes: + label: To Reproduce + description: A step-by-step description of how to reproduce the issue, or a link to the reproducible repository. + placeholder: | + 1. Create a application + 2. Click X + 3. Y will happen + validations: + required: true + - type: textarea + attributes: + label: Current vs. Expected behavior + description: A clear and concise description of what the bug is, and what you expected to happen. + placeholder: 'Following the steps from the previous section, I expected A to happen, but I observed B instead' + validations: + required: true + - type: textarea + attributes: + label: Provide environment information + description: Please provide the following information about your environment. + render: bash + placeholder: | + Operating System: + OS: Ubuntu 20.04 + Arch: arm64 + Dokploy version: 0.2.2' + VPS Provider: DigitalOcean, Hetzner, Linode, etc. + What applications/services are you tying to deploy? + eg - Database, Nextjs App, laravel, etc. + validations: + required: true + - type: dropdown + attributes: + label: Which area(s) are affected? (Select all that apply) + multiple: true + options: + - 'Installation' + - 'Application' + - 'Databases' + - 'Docker Compose' + - 'Traefik' + - 'Docker' + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: | + Any extra information that might help us investigate. + placeholder: | + I tested on a DigitalOcean VPS with Ubuntu 20.04 and Docker version 20.10.12. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..da4c3352 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Questions? + url: https://github.com/Dokploy/dokploy/discussions + about: Ask your questions here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..bfa9de8b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,33 @@ +name: Feature Request +description: Suggest a new feature or improvement to the project +labels: ['enhancement'] +body: + - type: textarea + attributes: + label: What problem will this feature address? + description: A clear and concise description of what the problem is. + placeholder: | + I'm always frustrated when I can't do X + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + placeholder: Add X to the core + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + placeholder: | + Maybe use Y as a workaround? + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false \ No newline at end of file diff --git a/README.md b/README.md index 58cb0961..2f766e6a 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,37 @@ -

Dokploy

+
+ +
-
-Reflex Logo
-
+ +
+Dokploy is a free self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. +### Features -Dokploy is a free self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases using Docker and Traefik. Designed to enhance efficiency and security, Dokploy allows you to deploy your applications on any VPS. +Dokploy include multiples features to make your life easier. - -## Explanation -[English](README.md) | [中文](README-zh.md) | [Deutsch](README-de.md) | [Русский Язык](README-ru.md) +* **Applications**: Deploy any type of application (Node.js, PHP, Python, Go, Ruby, etc.). +* **Databases**: Create and manage databases with support for MySQL, PostgreSQL, MongoDB, MariaDB, Redis. +* **Backups**: Automate backups for databases to a external storage destination. +* **Docker Compose**: Native support for Docker Compose to manage complex applications. +* **Multi Node**: Scale applications to multiples nodes using docker swarm to manage the cluster. +* **Templates**: Deploy in a single click open source templates (Plausible, Pocketbase, Calcom, etc.). +* **Traefik Integration**: Automatically integrates with Traefik for routing and load balancing. +* **Real-time Monitoring**: Monitor CPU, memory, storage, and network usage, for every resource. +* **Docker Management**: Easily deploy and manage Docker containers. +* **CLI (Soon⌛)**: Manage your applications and databases using the command line. +* **Self-Hosted**: Self-host Dokploy on your VPS. -## 🌟 Features - -- **Applications**: Deploy any type of application (Node.js, PHP, Python, Go, Ruby, etc.) with ease. -- **Databases**: Create and manage databases with support for MySQL, PostgreSQL, MongoDB, MariaDB, Redis, and more. -- **Docker Management**: Easily deploy and manage Docker containers. -- **Traefik Integration**: Automatically integrates with Traefik for routing and load balancing. -- **Real-time Monitoring**: Monitor CPU, memory, storage, and network usage. -- **Database Backups**: Automate backups with support for multiple storage destinations. - - ## 🚀 Getting Started To get started run the following command in a VPS: @@ -40,20 +41,54 @@ To get started run the following command in a VPS: curl -sSL https://dokploy.com/install.sh | sh ``` -Tested Systems: -- Ubuntu 24.04 LTS (Noble Numbat) -- Ubuntu 23.10 (Mantic Minotaur) -- Ubuntu 22.04 LTS (Jammy Jellyfish) -- Ubuntu 20.04 LTS (Focal Fossa) -- Ubuntu 18.04 LTS (Bionic Beaver) +## 📄 Documentation + +For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com). + + +## Video Tutorial + + Watch the video + + + +## Donations + +If you like dokploy, and want to support the project to cover the costs of hosting, testing and development new features, you can donate to the project using the following link: + +Thanks to all the supporters! + +https://opencollective.com/dokploy + + + + + +## Contributors + + + + + + + +## Support OS + +- Ubuntu 24.04 LTS +- Ubuntu 23.10 +- Ubuntu 22.04 LTS +- Ubuntu 20.04 LTS +- Ubuntu 18.04 LTS - Debian 12 - Debian 11 - Fedora 40 - Centos 9 - Centos 8 -## 📄 Documentation -For detailed documentation, visit [docs.dokploy.com/docs](https://docs.dokploy.com). + +## Explanation +[English](README.md) | [中文](README-zh.md) | [Deutsch](README-de.md) | [Русский Язык](README-ru.md) + diff --git a/components/dashboard/application/advanced/traefik/update-traefik-config.tsx b/components/dashboard/application/advanced/traefik/update-traefik-config.tsx index 13bec242..659353ec 100644 --- a/components/dashboard/application/advanced/traefik/update-traefik-config.tsx +++ b/components/dashboard/application/advanced/traefik/update-traefik-config.tsx @@ -19,7 +19,7 @@ import { import { api } from "@/utils/api"; import { AlertBlock } from "@/components/shared/alert-block"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; @@ -58,6 +58,7 @@ export const validateAndFormatYAML = (yamlText: string) => { }; export const UpdateTraefikConfig = ({ applicationId }: Props) => { + const [open, setOpen] = useState(false); const { data, refetch } = api.application.readTraefikConfig.useQuery( { applicationId, @@ -81,7 +82,7 @@ export const UpdateTraefikConfig = ({ applicationId }: Props) => { traefikConfig: data || "", }); } - }, [form, form.reset, data]); + }, [data]); const onSubmit = async (data: UpdateTraefikConfig) => { const { valid, error } = validateAndFormatYAML(data.traefikConfig); @@ -100,6 +101,8 @@ export const UpdateTraefikConfig = ({ applicationId }: Props) => { .then(async () => { toast.success("Traefik config Updated"); refetch(); + setOpen(false); + form.reset(); }) .catch(() => { toast.error("Error to update the traefik config"); @@ -107,7 +110,12 @@ export const UpdateTraefikConfig = ({ applicationId }: Props) => { }; return ( - + { + setOpen(open) + if (!open) { + form.reset(); + } + }}> @@ -122,7 +130,7 @@ export const UpdateTraefikConfig = ({ applicationId }: Props) => {
@@ -209,7 +209,7 @@ export const AddVolumes = ({ /> @@ -233,7 +233,7 @@ export const AddVolumes = ({ /> diff --git a/components/dashboard/application/environment/show.tsx b/components/dashboard/application/environment/show.tsx index 72f25d2e..1e91e491 100644 --- a/components/dashboard/application/environment/show.tsx +++ b/components/dashboard/application/environment/show.tsx @@ -124,7 +124,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => { { { { {
{ { { { { { Space - + Actions diff --git a/components/dashboard/settings/web-server/show-main-traefik-config.tsx b/components/dashboard/settings/web-server/show-main-traefik-config.tsx index 4a14d220..16f69b77 100644 --- a/components/dashboard/settings/web-server/show-main-traefik-config.tsx +++ b/components/dashboard/settings/web-server/show-main-traefik-config.tsx @@ -95,7 +95,7 @@ export const ShowMainTraefikConfig = ({ children }: Props) => {
{
{
{props.disabled && ( -
+
)}
); diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx index 775c93a9..3c9ec741 100644 --- a/components/ui/dialog.tsx +++ b/components/ui/dialog.tsx @@ -36,12 +36,14 @@ const DialogContent = React.forwardRef< - {children} +
+ {children} +
Close diff --git a/package.json b/package.json index 36b8dab3..8e70c6ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.2.2", + "version": "v0.2.3", "private": true, "license": "AGPL-3.0-only", "type": "module", diff --git a/server/utils/backups/mongo.ts b/server/utils/backups/mongo.ts index ff2fbd18..5fc1e23f 100644 --- a/server/utils/backups/mongo.ts +++ b/server/utils/backups/mongo.ts @@ -8,7 +8,7 @@ import { getServiceContainer } from "../docker/utils"; // mongodb://mongo:Bqh7AQl-PRbnBu@localhost:27017/?tls=false&directConnection=true export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => { - const { appName, databasePassword } = mongo; + const { appName, databasePassword, databaseUser } = mongo; const { prefix, database } = backup; const destination = backup.destination; const backupFileName = `${new Date().toISOString()}.dump.gz`; @@ -23,7 +23,7 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => { ); await execAsync( - `docker exec ${containerId} sh -c "mongodump -d '${database}' -u 'mongo' -p '${databasePassword}' --authenticationDatabase=admin --archive=${containerPath} --gzip"`, + `docker exec ${containerId} sh -c "mongodump -d '${database}' -u '${databaseUser}' -p '${databasePassword}' --authenticationDatabase=admin --archive=${containerPath} --gzip"`, ); await execAsync(`docker cp ${containerId}:${containerPath} ${hostPath}`); await uploadToS3(destination, bucketDestination, hostPath); diff --git a/styles/globals.css b/styles/globals.css index 629d2985..5b71cdff 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -127,10 +127,8 @@ background-color: transparent; } - .compose-file-editor .cm-editor { @apply min-h-[25rem]; - }