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")}