mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
Feat/monorepo (#292)
* feat(create-turbo): apply official-starter transform * refactor: move folder * wip: monorepo * feat: add builf * refactor: add pr * update * add .env * refactor: update build * refactor: update build docker * refactor: add progress plain * refactor: remove node pty * refactor: remove * remove * refactor: update * refacotr: uopdate * refactor: add remix app * add env * refactor: add pnpm start * refactor: remove * refactor: remove folders * refactor: remove .dockerfile * chore: update biome * test * choe: add husky * remove .docker folder * feat: add docs website * refactor: add husky * chore(version): bump version * refactor: add new changes * refactor: update circle path * refactor: update * refactor: update * refactor: update dockerfile * refactor: update dockerfile * refactor: update command * refactor: update * refactor: update dockerfile * refactor: add tsx * refactor: update dockerfile * refactor: add deps * refactor: up[date * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: yuodate * refactor: remove * refactor: uncomment * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: updare * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: imprt * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: remove * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: change path * refactor: update * refactor: update * refactor: upoadte * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: add * refactor: update * refactor: update * refactor: add * refactor: update * refactor: remove * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: removed * refactor: update * refactor: update * refactor: update * refactor: add config * refactor: update * refactor: add * refactor: update * refactor: update * refactor: remove * refactor: update * refactor: remove * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: add docs * refactor: update * refactor: add website * refactor: update * refactor: update * refactor: update * refactor: update * refactor: add ignore builds * refactor: update * refactor: update * refactor: add * refactor: update * refactor: update * refactor: remove needs * refactor: update * refactor: update * refactor: add config * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: remove * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: add * refactor: update * refactor: update * refactor: update * refactor: update * refactor: upodate * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update * refactor: update package json * refactor: add biome * refactor: add sponsors * refactor: update * refactor: update * refactor: remove * refactor: update * refactor: update * refactor: update * refactor: update scripts * refactor: remove * refactor: update * refactor: remove --------- Co-authored-by: Turbobot <turbobot@vercel.com>
This commit is contained in:
104
apps/docs/app/[lang]/[[...slug]]/page.tsx
Normal file
104
apps/docs/app/[lang]/[[...slug]]/page.tsx
Normal file
@@ -0,0 +1,104 @@
|
||||
import { getLanguages, getPage } from "@/app/source";
|
||||
import { url, baseUrl } from "@/utils/metadata";
|
||||
import { DocsBody, DocsPage } from "fumadocs-ui/page";
|
||||
import type { Metadata } from "next";
|
||||
import { notFound, permanentRedirect } from "next/navigation";
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: {
|
||||
params: { lang: string; slug?: string[] };
|
||||
}) {
|
||||
const page = getPage(params.slug, params.lang);
|
||||
|
||||
if (page == null) {
|
||||
permanentRedirect("/docs/core/get-started/introduction");
|
||||
}
|
||||
|
||||
const MDX = page.data.exports.default;
|
||||
|
||||
return (
|
||||
<DocsPage toc={page.data.exports.toc}>
|
||||
<DocsBody>
|
||||
<h1>{page.data.title}</h1>
|
||||
<MDX />
|
||||
</DocsBody>
|
||||
</DocsPage>
|
||||
);
|
||||
}
|
||||
|
||||
export async function generateStaticParams() {
|
||||
return getLanguages().flatMap(({ language, pages }) =>
|
||||
pages.map((page) => ({
|
||||
lang: language,
|
||||
slug: page.slugs,
|
||||
})),
|
||||
);
|
||||
}
|
||||
|
||||
export function generateMetadata({
|
||||
params,
|
||||
}: {
|
||||
params: { lang: string; slug?: string[] };
|
||||
}) {
|
||||
const page = getPage(params.slug, params.lang);
|
||||
if (page == null) {
|
||||
permanentRedirect("/docs/core/get-started/introduction");
|
||||
}
|
||||
return {
|
||||
title: page.data.title,
|
||||
|
||||
description: page.data.description,
|
||||
robots: "index,follow",
|
||||
alternates: {
|
||||
canonical: new URL(`${baseUrl}${page.url}`).toString(),
|
||||
languages: {
|
||||
zh: `${baseUrl}/cn${page.url.replace("/cn", "")}`,
|
||||
en: `${baseUrl}/en${page.url.replace("/en", "")}`,
|
||||
},
|
||||
},
|
||||
openGraph: {
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
url: new URL(`${baseUrl}`).toString(),
|
||||
images: [
|
||||
{
|
||||
url: new URL(
|
||||
`${baseUrl}/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.7cfd81d9.png&w=828&q=75`,
|
||||
).toString(),
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: page.data.title,
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
creator: "@siumauricio",
|
||||
title: page.data.title,
|
||||
description: page.data.description,
|
||||
images: [
|
||||
{
|
||||
url: new URL(
|
||||
`${baseUrl}/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo.7cfd81d9.png&w=828&q=75`,
|
||||
).toString(),
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: page.data.title,
|
||||
},
|
||||
],
|
||||
},
|
||||
applicationName: "Dokploy Docs",
|
||||
keywords: [
|
||||
"dokploy",
|
||||
"vps",
|
||||
"open source",
|
||||
"cloud",
|
||||
"self hosting",
|
||||
"free",
|
||||
],
|
||||
icons: {
|
||||
icon: "/icon.svg",
|
||||
},
|
||||
} satisfies Metadata;
|
||||
}
|
||||
128
apps/docs/app/[lang]/layout.tsx
Normal file
128
apps/docs/app/[lang]/layout.tsx
Normal file
@@ -0,0 +1,128 @@
|
||||
import { RootToggle } from "fumadocs-ui/components/layout/root-toggle";
|
||||
import { I18nProvider } from "fumadocs-ui/i18n";
|
||||
import { DocsLayout } from "fumadocs-ui/layout";
|
||||
import { RootProvider } from "fumadocs-ui/provider";
|
||||
import { Inter } from "next/font/google";
|
||||
import type { ReactNode } from "react";
|
||||
import { baseOptions } from "../layout.config";
|
||||
import { pageTree } from "../source";
|
||||
import "../global.css";
|
||||
import GoogleAnalytics from "@/components/analytics/google";
|
||||
import {
|
||||
LibraryIcon,
|
||||
type LucideIcon,
|
||||
PlugZapIcon,
|
||||
TerminalIcon,
|
||||
} from "lucide-react";
|
||||
const inter = Inter({
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
interface Mode {
|
||||
param: string;
|
||||
name: string;
|
||||
package: string;
|
||||
description: string;
|
||||
icon: LucideIcon;
|
||||
}
|
||||
|
||||
const modes: Mode[] = [
|
||||
{
|
||||
param: "core/get-started/introduction",
|
||||
name: "Core",
|
||||
package: "Dokploy",
|
||||
description: "The core",
|
||||
icon: LibraryIcon,
|
||||
},
|
||||
{
|
||||
param: "cli",
|
||||
name: "CLI",
|
||||
package: "fumadocs-ui",
|
||||
description: "Interactive CLI",
|
||||
icon: TerminalIcon,
|
||||
},
|
||||
{
|
||||
param: "api",
|
||||
name: "API",
|
||||
package: "fumadocs-mdx",
|
||||
description: "API Documentation",
|
||||
icon: PlugZapIcon,
|
||||
},
|
||||
];
|
||||
|
||||
export default function Layout({
|
||||
params,
|
||||
children,
|
||||
}: {
|
||||
params: { lang: string };
|
||||
children: ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html
|
||||
lang={params.lang}
|
||||
className={inter.className}
|
||||
suppressHydrationWarning
|
||||
>
|
||||
<GoogleAnalytics />
|
||||
<body>
|
||||
<I18nProvider
|
||||
locale={params.lang}
|
||||
translations={{
|
||||
en: {
|
||||
name: "English",
|
||||
},
|
||||
cn: {
|
||||
name: "Chinese",
|
||||
toc: "目錄",
|
||||
search: "搜尋文檔",
|
||||
lastUpdate: "最後更新於",
|
||||
searchNoResult: "沒有結果",
|
||||
previousPage: "上一頁",
|
||||
nextPage: "下一頁",
|
||||
chooseLanguage: "選擇語言",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<RootProvider>
|
||||
<DocsLayout
|
||||
i18n
|
||||
tree={pageTree[params.lang]}
|
||||
nav={{
|
||||
title: params.lang === "cn" ? "目錄" : "Dokploy",
|
||||
url: `/${params.lang}`,
|
||||
transparentMode: "none",
|
||||
}}
|
||||
sidebar={{
|
||||
// defaultOpenLevel: 0,
|
||||
|
||||
banner: (
|
||||
<RootToggle
|
||||
options={modes.map((mode) => {
|
||||
return {
|
||||
url: `/${params.lang}/docs/${mode.param}`,
|
||||
icon: (
|
||||
<mode.icon
|
||||
className="size-9 shrink-0 rounded-md bg-gradient-to-t from-background/80 p-1.5"
|
||||
style={{
|
||||
backgroundColor: `hsl(var(--${mode.param}-color)/.3)`,
|
||||
color: `hsl(var(--${mode.param}-color))`,
|
||||
}}
|
||||
/>
|
||||
),
|
||||
title: mode.name,
|
||||
description: mode.description,
|
||||
};
|
||||
})}
|
||||
/>
|
||||
),
|
||||
}}
|
||||
{...baseOptions}
|
||||
>
|
||||
{children}
|
||||
</DocsLayout>
|
||||
</RootProvider>
|
||||
</I18nProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user