diff --git a/.github/sponsors/logo.png b/.github/sponsors/logo.png new file mode 100644 index 00000000..a5a548b8 Binary files /dev/null and b/.github/sponsors/logo.png differ diff --git a/.github/sponsors/lxaer.png b/.github/sponsors/lxaer.png new file mode 100644 index 00000000..167c0653 Binary files /dev/null and b/.github/sponsors/lxaer.png differ diff --git a/README.md b/README.md index c21ac2b0..33891a3c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@
-

Dokploy

- - + + Dokploy - Open Source Alternative to Vercel, Heroku and Netlify. +

diff --git a/apps/docs/content/docs/core/get-started/installation.mdx b/apps/docs/content/docs/core/get-started/installation.mdx index b0fef8fc..96e264b3 100644 --- a/apps/docs/content/docs/core/get-started/installation.mdx +++ b/apps/docs/content/docs/core/get-started/installation.mdx @@ -3,7 +3,6 @@ title: Installation description: "Get Dokploy up and running on your server within minutes with this easy-to-follow installation guide." --- - Follow these steps in order to set up Dokploy locally and deploy it to your server, effectively managing Docker containers and applications: You need to follow this steps in the same order: @@ -30,8 +29,9 @@ We have tested on the following Linux Distros: ### Providers -- [DigitalOcean](https://www.digitalocean.com/pricing/droplets#basic-droplets) -- [Hetzner](https://www.hetzner.com/cloud/) +- [Hostinger](https://www.hostinger.com/vps-hosting?ref=dokploy) Get 20% Discount using this referral link: [Referral Link](https://hostinger.com?REFERRALCODE=1SIUMAURICI97) +- [DigitalOcean](https://www.digitalocean.com/pricing/droplets#basic-droplets) Get 200$ credits for free with this referral link: [Referral Link](https://m.do.co/c/db24efd43f35) +- [Hetzner](https://www.hetzner.com/cloud/) Get 20€ credits for free with this referral link: [Referral Link](https://hetzner.cloud/?ref=vou4fhxJ1W2D) - [Linode](https://www.linode.com/es/pricing/#compute-shared) - [Vultr](https://www.vultr.com/pricing/#cloud-compute) - [Scaleway](https://www.scaleway.com/en/pricing/?tags=baremetal,available) @@ -42,11 +42,12 @@ We have tested on the following Linux Distros: To ensure a smooth experience with Dokploy, your server should have at least 2GB of RAM and 30GB of disk space. This specification helps to handle the resources consumed by Docker during builds and prevents system freezes. +import { Callout } from "fumadocs-ui/components/callout"; -import { Callout } from 'fumadocs-ui/components/callout'; - -**Suggestion:** For cost efficiency with reliable service, we recommend Hetzner as the best value-for-money VPS provider. - + + **Suggestion:** For cost efficiency with reliable service, we recommend + Hetzner as the best value-for-money VPS provider. + ### Docker @@ -64,9 +65,16 @@ After running the installation script, Dokploy and its dependencies will be set Open your web browser and navigate to `http://your-ip-from-your-vps:3000`. You will be directed to the initial setup page where you can configure the administrative account for Dokploy. - ### Initial Configuration 1. **Create an Admin Account:** Fill in the necessary details to set up your administrator account. This account will be the admin account for Dokploy. - \ No newline at end of file +{" "} + + diff --git a/apps/docs/content/docs/core/templates/overview.cn.mdx b/apps/docs/content/docs/core/templates/overview.cn.mdx index 39c11d3e..8609412e 100644 --- a/apps/docs/content/docs/core/templates/overview.cn.mdx +++ b/apps/docs/content/docs/core/templates/overview.cn.mdx @@ -19,7 +19,6 @@ description: Deploy open source templates with Dokploy - **AppSmith**: 开源的 CRM 替代方案 - **Meilisearch**: 一个快速的搜索 API,轻松集成到您的应用、网站和工作流中 - **Odoo**: 开源的 ERP 替代方案 -- **Plausible**: 开源分析平台 - **Rocketchat**: 开源的聊天平台 - **Uptime Kuma**: 开源的运行时间监控 - **PhpMyAdmin**: 开源数据库管理 @@ -28,9 +27,7 @@ description: Deploy open source templates with Dokploy - **excalidraw**: 开源协作绘图工具 - **Directus**: 现代数据栈 🐰 — Directus 是一个即时的 REST+GraphQL API 和直观的无代码数据协作应用程序,适用于任何 SQL 数据库 - **Baserow**: 构建管理面板、内部工具和仪表板的平台 -- **Minio**: 开源对象存储 - **Metabase**: 开源商业智能 -- **Grafana**: 开源的指标仪表板 - **Wordpress**: 开源内容管理系统 ## 创建您自己的模板 diff --git a/apps/docs/content/docs/core/templates/overview.mdx b/apps/docs/content/docs/core/templates/overview.mdx index 1823fc5b..363650f6 100644 --- a/apps/docs/content/docs/core/templates/overview.mdx +++ b/apps/docs/content/docs/core/templates/overview.mdx @@ -19,7 +19,6 @@ The following templates are available: - **AppSmith**: Open Source CRM Alternative - **Meilisearch**: A lightning-fast search API that fits effortlessly into your apps, websites, and workflow - **Odoo**: Open Source ERP Alternative -- **Plausible**: Open source analytics platform - **Rocketchat**: Open Source Chat Platform - **Uptime Kuma**: Open Source Uptime Monitoring - **PhpMyAdmin**: Open Source Database Administration @@ -28,9 +27,7 @@ The following templates are available: - **excalidraw**: Open Source Collaborative Drawing Tool - **Directus**: The Modern Data Stack 🐰 — Directus is an instant REST+GraphQL API and intuitive no-code data collaboration app for any SQL database. - **Baserow**: Platform to build admin panels, internal tools, and dashboards -- **Minio**: Open Source Object Storage - **Metabase**: Open Source Business Intelligence -- **Grafana**: Open Source Dashboard for your metrics - **Wordpress**: Open Source Content Management System - **Open WebUI**: Free and Open Source ChatGPT Alternative - **Teable**: Open Source Airtable Alternative, Developer Friendly, No-code Database Built on Postgres diff --git a/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx b/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx index 4078ae4c..d8d32e19 100644 --- a/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx @@ -81,7 +81,10 @@ export const ShowClusterSettings = ({ applicationId }: Props) => { const onSubmit = async (data: AddCommand) => { await mutateAsync({ applicationId, - registryId: data?.registryId === "none" ? null : data?.registryId, + registryId: + data?.registryId === "none" || !data?.registryId + ? null + : data?.registryId, replicas: data?.replicas, }) .then(async () => { diff --git a/apps/dokploy/components/dashboard/project/add-template.tsx b/apps/dokploy/components/dashboard/project/add-template.tsx index 40a1d670..1bc78f48 100644 --- a/apps/dokploy/components/dashboard/project/add-template.tsx +++ b/apps/dokploy/components/dashboard/project/add-template.tsx @@ -89,9 +89,9 @@ export const AddTemplate = ({ projectId }: Props) => {
- Create Template + Create from Template - Deploy a open source template to your project + Create an open source application from a template {isError && {error?.message}} @@ -234,7 +234,7 @@ export const AddTemplate = ({ projectId }: Props) => { )} { @@ -264,8 +264,9 @@ export const AddTemplate = ({ projectId }: Props) => { Are you absolutely sure? - This will deploy {template.name} template to - your project. + This will create an application from the{" "} + {template.name} template and add it to your + project. @@ -278,7 +279,7 @@ export const AddTemplate = ({ projectId }: Props) => { }) .then(async () => { toast.success( - `${template.name} template created succesfully`, + `Succesfully created ${template.name} application from template`, ); utils.project.one.invalidate({ @@ -288,7 +289,7 @@ export const AddTemplate = ({ projectId }: Props) => { }) .catch(() => { toast.error( - `Error to delete ${template.name} template`, + `Error creating ${template.name} application from template`, ); }); }} diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index f80a24fb..a6bdc5b9 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -63,8 +63,8 @@ export const ShowProjects = () => { project?.mysql.length === 0 && project?.postgres.length === 0 && project?.redis.length === 0 && - project?.applications.length === 0; - project?.compose.length === 0; + project?.applications.length === 0 && + project?.compose.length === 0; const totalServices = project?.mariadb.length + diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 03668718..ccc1bc14 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.8.1", + "version": "v0.8.2", "private": true, "license": "Apache-2.0", "type": "module", diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index f98b981b..00df9b82 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -356,18 +356,28 @@ export const settingsRouter = createTRPCRouter({ return false; }), - readStatsLogs: adminProcedure.input(apiReadStatsLogs).query(({ input }) => { - const rawConfig = readMonitoringConfig(); - const parsedConfig = parseRawConfig( - rawConfig as string, - input.page, - input.sort, - input.search, - input.status, - ); + readStatsLogs: adminProcedure + .meta({ + openapi: { + path: "/read-stats-logs", + method: "POST", + override: true, + enabled: false, + }, + }) + .input(apiReadStatsLogs) + .query(({ input }) => { + const rawConfig = readMonitoringConfig(); + const parsedConfig = parseRawConfig( + rawConfig as string, + input.page, + input.sort, + input.search, + input.status, + ); - return parsedConfig; - }), + return parsedConfig; + }), readStats: adminProcedure.query(() => { const rawConfig = readMonitoringConfig(); const processedLogs = processLogs(rawConfig as string); diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 66a717b6..5603b188 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -326,7 +326,7 @@ export const templates: TemplateData[] = [ description: "Glitchtip is simple, open source error tracking", logo: "glitchtip.png", links: { - github: "https://github.com/glitchtip/glitchtip", + github: "https://gitlab.com/glitchtip/", website: "https://glitchtip.com/", docs: "https://glitchtip.com/documentation", }, diff --git a/apps/website/app/[locale]/[...rest]/page.tsx b/apps/website/app/[locale]/[...rest]/page.tsx new file mode 100644 index 00000000..4583936c --- /dev/null +++ b/apps/website/app/[locale]/[...rest]/page.tsx @@ -0,0 +1,5 @@ +import { notFound } from "next/navigation"; + +export default function CatchAll() { + notFound(); +} diff --git a/apps/website/app/[locale]/layout.tsx b/apps/website/app/[locale]/layout.tsx new file mode 100644 index 00000000..89e15a9b --- /dev/null +++ b/apps/website/app/[locale]/layout.tsx @@ -0,0 +1,97 @@ +import clsx from "clsx"; +import { Inter, Lexend } from "next/font/google"; +import "@/styles/tailwind.css"; +import GoogleAnalytics from "@/components/analitycs/google"; + +import { NextIntlClientProvider } from "next-intl"; +import { getMessages } from "next-intl/server"; + +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: { + default: "Dokploy - Effortless Deployment Solutions", + template: "%s | Simplify Your DevOps", + }, + alternates: { + canonical: "https://dokploy.com", + languages: { + en: "https://dokploy.com", + }, + }, + description: + "Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.", + applicationName: "Dokploy", + keywords: [ + "Dokploy", + "Docker", + "Traefik", + "deployment", + "VPS", + "application management", + "database management", + "DevOps", + "cloud infrastructure", + "UI Self hosted", + ], + referrer: "origin", + robots: "index, follow", + openGraph: { + type: "website", + url: "https://dokploy.com", + title: "Dokploy - Effortless Deployment Solutions", + description: + "Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.", + siteName: "Dokploy", + images: [ + { + url: "http://dokploy.com/og.png", + }, + ], + }, + twitter: { + card: "summary_large_image", + site: "@Dokploy", + creator: "@Dokploy", + title: "Dokploy - Simplify Your DevOps", + description: + "Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.", + images: "https://dokploy.com/og.png", + }, +}; + +const inter = Inter({ + subsets: ["latin"], + display: "swap", + variable: "--font-inter", +}); + +const lexend = Lexend({ + subsets: ["latin"], + display: "swap", + variable: "--font-lexend", +}); + +export default async function RootLayout({ + children, + params, +}: { + children: React.ReactNode; + params: { locale: string }; +}) { + const { locale } = params; + const messages = await getMessages(); + return ( + + + + + {children} + + + + ); +} diff --git a/apps/website/app/[locale]/not-found.tsx b/apps/website/app/[locale]/not-found.tsx new file mode 100644 index 00000000..fa38b6a3 --- /dev/null +++ b/apps/website/app/[locale]/not-found.tsx @@ -0,0 +1,5 @@ +import { SlimLayout } from "@/components/SlimLayout"; + +export default function NotFound() { + return ; +} diff --git a/apps/website/app/[locale]/page.tsx b/apps/website/app/[locale]/page.tsx new file mode 100644 index 00000000..c6c1b2bb --- /dev/null +++ b/apps/website/app/[locale]/page.tsx @@ -0,0 +1,25 @@ +import { CallToAction } from "@/components/CallToAction"; +import { Faqs } from "@/components/Faqs"; +import { Footer } from "@/components/Footer"; +import { Header } from "@/components/Header"; +import { Hero } from "@/components/Hero"; +import { PrimaryFeatures } from "@/components/PrimaryFeatures"; +import { SecondaryFeatures } from "@/components/SecondaryFeatures"; +import { Testimonials } from "../../components/Testimonials"; + +export default function Home() { + return ( +
+
+
+ + + + + {/* */} + +
+
+
+ ); +} diff --git a/apps/website/app/layout.tsx b/apps/website/app/layout.tsx index fc43d46d..7c05c310 100644 --- a/apps/website/app/layout.tsx +++ b/apps/website/app/layout.tsx @@ -1,85 +1,11 @@ -import clsx from "clsx"; -import { Inter, Lexend } from "next/font/google"; -import "@/styles/tailwind.css"; -import GoogleAnalytics from "@/components/analitycs/google"; -import type { Metadata } from "next"; +import type { ReactNode } from "react"; -export const metadata: Metadata = { - title: { - default: "Dokploy - Effortless Deployment Solutions", - template: "%s | Simplify Your DevOps", - }, - alternates: { - canonical: "https://dokploy.com", - languages: { - en: "https://dokploy.com", - }, - }, - description: - "Streamline your deployment process with Dokploy. Effortlessly manage applications and databases on any VPS using Docker and Traefik for improved performance and security.", - applicationName: "Dokploy", - keywords: [ - "Dokploy", - "Docker", - "Traefik", - "deployment", - "VPS", - "application management", - "database management", - "DevOps", - "cloud infrastructure", - "UI Self hosted", - ], - referrer: "origin", - robots: "index, follow", - openGraph: { - type: "website", - url: "https://dokploy.com", - title: "Dokploy - Effortless Deployment Solutions", - description: - "Simplify your DevOps with Dokploy. Deploy applications and manage databases efficiently on any VPS.", - siteName: "Dokploy", - images: [ - { - url: "http://dokploy.com/og.png", - }, - ], - }, - twitter: { - card: "summary_large_image", - site: "@Dokploy", - creator: "@Dokploy", - title: "Dokploy - Simplify Your DevOps", - description: - "Deploy applications and manage databases with ease using Dokploy. Learn how our platform can elevate your infrastructure management.", - images: "https://dokploy.com/og.png", - }, +type Props = { + children: ReactNode; }; -const inter = Inter({ - subsets: ["latin"], - display: "swap", - variable: "--font-inter", -}); - -const lexend = Lexend({ - subsets: ["latin"], - display: "swap", - variable: "--font-lexend", -}); - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - {children} - - ); +// Since we have a `not-found.tsx` page on the root, a layout file +// is required, even if it's just passing children through. +export default function RootLayout({ children }: Props) { + return children; } diff --git a/apps/website/app/not-found.tsx b/apps/website/app/not-found.tsx index 5225642b..f68a31c1 100644 --- a/apps/website/app/not-found.tsx +++ b/apps/website/app/not-found.tsx @@ -1,27 +1,13 @@ -import Link from "next/link"; +"use client"; -import { SlimLayout } from "../components/SlimLayout"; -// import { Button } from "../components/Button"; -import { Logo } from "../components/shared/Logo"; +import NextError from "next/error"; export default function NotFound() { return ( - -
- - - -
-

404

-

- Page not found -

-

- Sorry, we couldn’t find the page you’re looking for. -

- {/* */} -
+ + + + + ); } diff --git a/apps/website/app/page.tsx b/apps/website/app/page.tsx deleted file mode 100644 index 2847ee10..00000000 --- a/apps/website/app/page.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { CallToAction } from "../components/CallToAction"; -import { Faqs } from "../components/Faqs"; -import { Footer } from "../components/Footer"; -import { Header } from "../components/Header"; -import { Hero } from "../components/Hero"; -import { PrimaryFeatures } from "../components/PrimaryFeatures"; -import { SecondaryFeatures } from "../components/SecondaryFeatures"; -import { Testimonials } from "../components/Testimonials"; - -export default function Home() { - return ( -
-
-
- - - - - {/* */} - -
-
-
- ); -} diff --git a/apps/website/components/CallToAction.tsx b/apps/website/components/CallToAction.tsx index 6c7b5a1f..3e18a149 100644 --- a/apps/website/components/CallToAction.tsx +++ b/apps/website/components/CallToAction.tsx @@ -1,12 +1,15 @@ import { Container } from "@/components/Container"; +import { useTranslations } from "next-intl"; import Link from "next/link"; import { Button } from "./ui/button"; export function CallToAction() { + const t = useTranslations("HomePage"); + const linkT = useTranslations("Link"); return (
- +

- Unlock Your Deployment Potential + {t("callToAction.title")}

- Streamline your deployments with our PaaS. Effortlessly manage - Docker containers and traffic with Traefik. Boost your - infrastructure's efficiency and security today + {t("callToAction.des")}

- {/* @ts-expect-error */} -
diff --git a/apps/website/components/Faqs.tsx b/apps/website/components/Faqs.tsx index 117b4d00..10a6d60e 100644 --- a/apps/website/components/Faqs.tsx +++ b/apps/website/components/Faqs.tsx @@ -1,63 +1,57 @@ +import { useTranslations } from "next-intl"; import { Container } from "./Container"; const faqs = [ [ { - question: "What is dokploy?", - answer: - "Dokploy is a stable, easy-to-use deployment solution designed to simplify the application management process. Think of Dokploy as a free alternative self-hostable solution to platforms like Heroku, Vercel, and Netlify.", + question: "faq.q1", + answer: "faq.a1", }, { - question: "Why Choose Dokploy?", - answer: "Simplicity, Flexibility, and Fast", + question: "faq.q2", + answer: "faq.a2", }, { - question: "Is free?", - answer: - "Yes, dokploy is totally free. You can use it for personal projects, small teams, or even for large-scale applications.", + question: "faq.q3", + answer: "faq.a3", }, { - question: "Is it open source?", - answer: "Yes, dokploy is open source and free to use.", + question: "faq.q4", + answer: "faq.a4", }, ], [ { - question: "What type of applications can i deploy with dokploy?", - answer: - "Dokploy is a great choice for any type of application. You can deploy your code to dokploy and manage it from the dashboard. We support a wide range of languages and frameworks, so you can choose the one that best fits your needs.", + question: "faq.q5", + answer: "faq.a5", }, { - question: "How do I request a feature or report a bug?", - answer: - "Currently we are working on fixing bug fixes, but we will be releasing new features soon. You can also request features or report bugs.", + question: "faq.q6", + answer: "faq.a6", }, { - question: "Do you track the usage of Dokploy?", - answer: "No, we don't track any usage data.", + question: "faq.q7", + answer: "faq.a7", }, ], [ { - question: - "Are there any user forums or communities where I can interact with other users?", - answer: - "Yes, we have active github discussions where you can share ideas, ask for help, and connect with other users.", + question: "faq.q8", + answer: "faq.a8", }, { - question: "What types of applications can I deploy with Dokploy?", - answer: - "Dokploy supports a variety of applications, including those built with Docker, as well as applications from any Git repository, offering custom builds with Nixpacks, Dockerfiles, or Buildpacks like Heroku and Paketo.", + question: "faq.q9", + answer: "faq.a9", }, { - question: "How does Dokploy handle database management?", - answer: - "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management directly from the dashboard.", + question: "faq.q10", + answer: "faq.a10", }, ], ]; export function Faqs() { + const t = useTranslations("HomePage"); return (
- Frequently asked questions + {t("faq.title")}

- If you can’t find what you’re looking for, email our support team - and if you’re lucky someone will get back to you. + {t("faq.des")}

    @@ -84,10 +77,10 @@ export function Faqs() { {column.map((faq, faqIndex) => (
  • - {faq.question} + {t(faq.question)}

    - {faq.answer} + {t(faq.answer)}

  • ))} diff --git a/apps/website/components/Footer.tsx b/apps/website/components/Footer.tsx index 3c188e55..c1235add 100644 --- a/apps/website/components/Footer.tsx +++ b/apps/website/components/Footer.tsx @@ -1,15 +1,19 @@ import Link from "next/link"; +import { useTranslations } from "next-intl"; import { Container } from "./Container"; import { NavLink } from "./NavLink"; import { Logo } from "./shared/Logo"; export function Footer() { + const t = useTranslations("HomePage"); + const linkT = useTranslations("Link"); + return (