diff --git a/apps/website/app/[locale]/[...rest]/page.tsx b/apps/website/app/[locale]/[...rest]/page.tsx new file mode 100644 index 000000000..4583936ca --- /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 000000000..89e15a9b0 --- /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 000000000..fa38b6a30 --- /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 000000000..c6c1b2bbf --- /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 fc43d46d3..7c05c3105 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 5225642b4..f68a31c12 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 2847ee100..000000000 --- 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 6c7b5a1ff..3e18a1490 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 117b4d001..10a6d60ea 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 3c188e55b..c1235add3 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 (