diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx
index d256a5119..7a9ac676d 100644
--- a/apps/dokploy/components/layouts/side.tsx
+++ b/apps/dokploy/components/layouts/side.tsx
@@ -18,6 +18,7 @@ import {
Forward,
GalleryVerticalEnd,
GitBranch,
+ Key,
KeyRound,
Loader2,
type LucideIcon,
@@ -396,6 +397,15 @@ const MENU: Menu = {
// Only enabled for admins in cloud environments
isEnabled: ({ auth, isCloud }) => !!(auth?.role === "owner" && isCloud),
},
+ {
+ isSingle: true,
+ title: "License",
+ url: "/dashboard/settings/license",
+ icon: Key,
+ // Only enabled for admins in non-cloud environments
+ isEnabled: ({ auth, isCloud }) =>
+ !!((auth?.role === "owner" || auth?.role === "admin") && !isCloud),
+ },
],
help: [
diff --git a/apps/dokploy/pages/dashboard/settings/license.tsx b/apps/dokploy/pages/dashboard/settings/license.tsx
new file mode 100644
index 000000000..c281ddc64
--- /dev/null
+++ b/apps/dokploy/pages/dashboard/settings/license.tsx
@@ -0,0 +1,84 @@
+import { IS_CLOUD, validateRequest } from "@dokploy/server";
+import { createServerSideHelpers } from "@trpc/react-query/server";
+import type { GetServerSidePropsContext } from "next";
+import type { ReactElement } from "react";
+import superjson from "superjson";
+import { DashboardLayout } from "@/components/layouts/dashboard-layout";
+import { LicenseKeySettings } from "@/components/proprietary/license-keys/license-key";
+import { Card } from "@/components/ui/card";
+import { appRouter } from "@/server/api/root";
+import { getLocale, serverSideTranslations } from "@/utils/i18n";
+
+const Page = () => {
+ return (
+
+ );
+};
+
+export default Page;
+
+Page.getLayout = (page: ReactElement) => {
+ return {page};
+};
+
+export async function getServerSideProps(
+ ctx: GetServerSidePropsContext<{ serviceId: string }>,
+) {
+ const { req, res } = ctx;
+ const locale = await getLocale(req.cookies);
+ if (IS_CLOUD) {
+ return {
+ redirect: {
+ permanent: true,
+ destination: "/dashboard/projects",
+ },
+ };
+ }
+ const { user, session } = await validateRequest(ctx.req);
+ if (!user) {
+ return {
+ redirect: {
+ permanent: true,
+ destination: "/",
+ },
+ };
+ }
+ if (user.role === "member") {
+ return {
+ redirect: {
+ permanent: true,
+ destination: "/dashboard/settings/profile",
+ },
+ };
+ }
+
+ const helpers = createServerSideHelpers({
+ router: appRouter,
+ ctx: {
+ req: req as any,
+ res: res as any,
+ db: null as any,
+ session: session as any,
+ user: user as any,
+ },
+ transformer: superjson,
+ });
+ await helpers.user.get.prefetch();
+
+ return {
+ props: {
+ trpcState: helpers.dehydrate(),
+ ...(await serverSideTranslations(locale, ["settings"])),
+ },
+ };
+}
diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx
index 7de3578d5..dbe4917dd 100644
--- a/apps/dokploy/pages/dashboard/settings/server.tsx
+++ b/apps/dokploy/pages/dashboard/settings/server.tsx
@@ -7,7 +7,6 @@ import { ShowBackups } from "@/components/dashboard/database/backups/show-backup
import { WebDomain } from "@/components/dashboard/settings/web-domain";
import { WebServer } from "@/components/dashboard/settings/web-server";
import { DashboardLayout } from "@/components/layouts/dashboard-layout";
-import { LicenseKeySettings } from "@/components/proprietary/license-keys/license-key";
import { Card } from "@/components/ui/card";
import { appRouter } from "@/server/api/root";
import { api } from "@/utils/api";
@@ -29,13 +28,6 @@ const Page = () => {
/>
-
-
-
);