-
+
- Subscribe
+ {t("plan.cloud.go")}
@@ -365,53 +420,46 @@ export function Pricing() {
const faqs = [
[
{
- question: "How does Dokploy's Open Source plan work?",
- answer:
- "You can host Dokploy UI on your own infrastructure and you will be responsible for the maintenance and updates.",
+ question: "faq.q1",
+ answer: "faq.a1",
},
{
- question: "Do I need to provide my own server for the managed plan?",
- answer:
- "Yes, in the managed plan, you provide your own server eg(Hetzner, Hostinger, AWS, ETC.) VPS, and we manage the Dokploy UI infrastructure for you.",
+ question: "faq.q2",
+ answer: "faq.a2",
},
{
- question: "What happens if I need more than one server?",
- answer:
- "The first server costs $4.50/month, if you buy more than one it will be $3.50/month per server.",
+ question: "faq.q3",
+ answer: "faq.a3",
},
],
[
{
- question: "Is there a limit on the number of deployments?",
- answer:
- "No, there is no limit on the number of deployments in any of the plans.",
+ question: "faq.q4",
+ answer: "faq.a4",
},
{
- question: "What happens if I exceed my purchased server limit?",
- answer:
- "The most recently added servers will be deactivated. You won't be able to create services on inactive servers until they are reactivated.",
+ question: "faq.q5",
+ answer: "faq.a5",
},
{
- question: "Do you offer a refunds?",
- answer:
- "We do not offer refunds. However, you can cancel your subscription at any time. Feel free to try our open-source version for free before making a purchase.",
+ question: "faq.q6",
+ answer: "faq.a6",
},
],
[
{
- question: "What kind of support do you offer?",
- answer:
- "We offer community support for the open source version and priority support for paid plans.",
+ question: "faq.q7",
+ answer: "faq.a7",
},
{
- question: "Is Dokploy open-source?",
- answer:
- "Yes, Dokploy is fully open-source. You can contribute or modify it as needed for your projects.",
+ question: "faq.q8",
+ answer: "faq.a8",
},
],
];
export function Faqs() {
+ const t = useTranslations("Pricing");
return (
- {"Frequently asked questions"}
+ {t("faq.title")}
- If you can’t find what you’re looking for, please send us an email
- to:{" "}
+ {t("faq.description")}:{" "}
support@dokploy.com
@@ -441,10 +488,10 @@ export function Faqs() {
{column.map((faq, faqIndex) => (
- {faq.question}
+ {t(faq.question)}
- {faq.answer}
+ {t(faq.answer)}
))}
diff --git a/apps/website/components/ui/animated-shiny-text.tsx b/apps/website/components/ui/animated-shiny-text.tsx
new file mode 100644
index 000000000..174e4d194
--- /dev/null
+++ b/apps/website/components/ui/animated-shiny-text.tsx
@@ -0,0 +1,40 @@
+import type { CSSProperties, FC, ReactNode } from "react";
+
+import { cn } from "@/lib/utils";
+
+interface AnimatedShinyTextProps {
+ children: ReactNode;
+ className?: string;
+ shimmerWidth?: number;
+}
+
+const AnimatedShinyText: FC = ({
+ children,
+ className,
+ shimmerWidth = 100,
+}) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default AnimatedShinyText;
diff --git a/apps/website/components/ui/hover-border-gradient.tsx b/apps/website/components/ui/hover-border-gradient.tsx
new file mode 100644
index 000000000..c8bc25094
--- /dev/null
+++ b/apps/website/components/ui/hover-border-gradient.tsx
@@ -0,0 +1,100 @@
+"use client";
+import type React from "react";
+import { useEffect, useRef, useState } from "react";
+
+import { cn } from "@/lib/utils";
+import { motion } from "framer-motion";
+
+type Direction = "TOP" | "LEFT" | "BOTTOM" | "RIGHT";
+
+export function HoverBorderGradient({
+ children,
+ containerClassName,
+ className,
+ as: Tag = "button",
+ duration = 1,
+ clockwise = true,
+ ...props
+}: React.PropsWithChildren<
+ {
+ as?: React.ElementType;
+ containerClassName?: string;
+ className?: string;
+ duration?: number;
+ clockwise?: boolean;
+ } & React.HTMLAttributes
+>) {
+ const [hovered, setHovered] = useState(false);
+ const [direction, setDirection] = useState("TOP");
+
+ const rotateDirection = (currentDirection: Direction): Direction => {
+ const directions: Direction[] = ["TOP", "LEFT", "BOTTOM", "RIGHT"];
+ const currentIndex = directions.indexOf(currentDirection);
+ const nextIndex = clockwise
+ ? (currentIndex - 1 + directions.length) % directions.length
+ : (currentIndex + 1) % directions.length;
+ return directions[nextIndex];
+ };
+
+ const movingMap: Record = {
+ TOP: "radial-gradient(20.7% 50% at 50% 0%, hsl(0, 0%, 100%) 0%, rgba(255, 255, 255, 0) 100%)",
+ LEFT: "radial-gradient(16.6% 43.1% at 0% 50%, hsl(0, 0%, 100%) 0%, rgba(255, 255, 255, 0) 100%)",
+ BOTTOM:
+ "radial-gradient(20.7% 50% at 50% 100%, hsl(0, 0%, 100%) 0%, rgba(255, 255, 255, 0) 100%)",
+ RIGHT:
+ "radial-gradient(16.2% 41.199999999999996% at 100% 50%, hsl(0, 0%, 100%) 0%, rgba(255, 255, 255, 0) 100%)",
+ };
+
+ const highlight =
+ "radial-gradient(75% 181.15942028985506% at 50% 50%, #3275F8 0%, rgba(255, 255, 255, 0) 100%)";
+
+ useEffect(() => {
+ if (!hovered) {
+ const interval = setInterval(() => {
+ setDirection((prevState) => rotateDirection(prevState));
+ }, duration * 1000);
+ return () => clearInterval(interval);
+ }
+ }, [hovered]);
+ return (
+ ) => {
+ setHovered(true);
+ }}
+ onMouseLeave={() => setHovered(false)}
+ className={cn(
+ "relative flex rounded-full border content-center bg-black/20 hover:bg-black/10 transition duration-500 dark:bg-white/20 items-center flex-col flex-nowrap gap-10 h-min justify-center overflow-visible p-px decoration-clone w-fit",
+ containerClassName,
+ )}
+ {...props}
+ >
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/apps/website/locales/en.json b/apps/website/locales/en.json
index 7c401706c..1a04f5d52 100644
--- a/apps/website/locales/en.json
+++ b/apps/website/locales/en.json
@@ -4,18 +4,33 @@
"features": "Features",
"faqs": "FAQ",
"docs": "Docs",
+ "pricing": "Pricing",
"support": "Support",
+ "dashboard": "Dashboard",
"discord": "Discord",
"i18nButtonPlaceholder": "Language",
"i18nEn": "English",
"i18nZh-Hans": "简体中文"
},
"hero": {
+ "cloud": "Introducing Dokploy Cloud",
"deploy": "Deploy",
"anywhere": "Anywhere",
"with": "with Total Freedom and Ease.",
"des": "Streamline your operations with our all-in-one platform—perfect for managing projects, data, and system health with simplicity and efficiency.",
- "featuredIn": "Featured in"
+ "featuredIn": "Featured in",
+ "sponsors": {
+ "title": "Sponsors",
+ "description": "Dokploy is an open source project that is maintained by a community of volunteers. We would like to thank our sponsors for their support and contributions to the project, which help us to continue to develop and improve Dokploy.",
+ "level": {
+ "hero": "Hero Sponsors",
+ "premium": "Premium Supporters",
+ "supporting": "Supporting Members",
+ "community": "Community Backers",
+ "organizations": "Organizations",
+ "individuals": "Individuals"
+ }
+ }
},
"primaryFeatures": {
"title": "Comprehensive Control for Your Digital Ecosystem",
@@ -92,5 +107,70 @@
"intro": "https://docs.dokploy.com/get-started/introduction",
"install": "https://docs.dokploy.com/en/docs/core/get-started/introduction"
}
+ },
+ "Pricing": {
+ "swirlyDoodleTitle": "Simple & Affordable,",
+ "restTitle": "Pricing.",
+ "description": "Deploy Smarter, Scale Faster – Without Breaking the Bank",
+ "billingCycle": {
+ "monthly": "Monthly",
+ "annual": "Annual"
+ },
+ "plan": {
+ "free": {
+ "title": "Free",
+ "subTitle": "Open Source",
+ "section": {
+ "title": "Dokploy Open Source",
+ "description": "Manager your own infrastructure installing dokploy ui in your own server."
+ },
+ "features": {
+ "f1": "Complete Flexibility: Install Dokploy UI on your own infrastructure",
+ "f2": "Unlimited Deployments",
+ "f3": "Self-hosted Infrastructure",
+ "f4": "Community Support",
+ "f5": "Access to Core Features",
+ "f6": "Dokploy Integration",
+ "f7": "Basic Backups",
+ "f8": "Access to All Updates",
+ "f9": "Unlimited Servers"
+ },
+ "go": "Installation"
+ },
+ "cloud": {
+ "title": "Recommended",
+ "section": {
+ "title": "Dokploy Plan",
+ "description": " to manage Dokploy UI infrastructure, we take care of it for you."
+ },
+ "servers": "{serverQuantity}Servers (You bring the servers)",
+ "features": {
+ "f1": "Managed Hosting: No need to manage your own servers",
+ "f2": "Priority Support",
+ "f3": "Future-Proof Features"
+ },
+ "go": "Subscribe"
+ }
+ },
+ "faq": {
+ "title": "Frequently asked questions",
+ "description": "If you can’t find what you’re looking for, please send us an email to",
+ "q1": "How does Dokploy's Open Source plan work?",
+ "a1": "You can host Dokploy UI on your own infrastructure and you will be responsible for the maintenance and updates.",
+ "q2": "Do I need to provide my own server for the managed plan?",
+ "a2": "Yes, in the managed plan, you provide your own server eg(Hetzner, Hostinger, AWS, ETC.) VPS, and we manage the Dokploy UI infrastructure for you.",
+ "q3": "What happens if I need more than one server?",
+ "a3": "The first server costs $4.50/month, if you buy more than one it will be $3.50/month per server.",
+ "q4": "Is there a limit on the number of deployments?",
+ "a4": "No, there is no limit on the number of deployments in any of the plans.",
+ "q5": "What happens if I exceed my purchased server limit?",
+ "a5": "The most recently added servers will be deactivated. You won't be able to create services on inactive servers until they are reactivated.",
+ "q6": "Do you offer a refunds?",
+ "a6": "We do not offer refunds. However, you can cancel your subscription at any time. Feel free to try our open-source version for free before making a purchase.",
+ "q7": "What kind of support do you offer?",
+ "a7": "We offer community support for the open source version and priority support for paid plans.",
+ "q8": "Is Dokploy open-source?",
+ "a8": "Yes, Dokploy is fully open-source. You can contribute or modify it as needed for your projects."
+ }
}
}
diff --git a/apps/website/locales/zh-Hans.json b/apps/website/locales/zh-Hans.json
index c852c2abd..be742e676 100644
--- a/apps/website/locales/zh-Hans.json
+++ b/apps/website/locales/zh-Hans.json
@@ -4,18 +4,33 @@
"features": "特性",
"faqs": "FAQ",
"docs": "文档",
+ "pricing": "价格",
"support": "赞助",
+ "dashboard": "控制台",
"discord": "Discord",
"i18nButtonPlaceholder": "语言",
"i18nEn": "English",
"i18nZh-Hans": "简体中文"
},
"hero": {
+ "cloud": "隆重介绍 Dokploy 云",
"deploy": "部署在",
"anywhere": "任何设施之上",
"with": "",
"des": "以前所未有的简洁和高效提供一站式项目、数据的管理以及系统监控。",
- "featuredIn": "发布于"
+ "featuredIn": "发布于",
+ "sponsors": {
+ "title": "赞助名单",
+ "description": "Dokploy 是由社区成员共同支持的完全免费的开源项目,您的慷慨解囊将帮助我们继续开发和改进 Dokploy。",
+ "level": {
+ "hero": "特别赞助",
+ "premium": "金牌赞助",
+ "supporting": "银牌赞助",
+ "community": "铜牌赞助",
+ "organizations": "组织赞助",
+ "individuals": "个人赞助"
+ }
+ }
},
"primaryFeatures": {
"title": "全面掌控您的基础设施",
@@ -92,5 +107,70 @@
"intro": "https://docs.dokploy.com/cn/docs/core/get-started/introduction",
"install": "https://docs.dokploy.com/cn/docs/core/get-started/introduction"
}
+ },
+ "Pricing": {
+ "swirlyDoodleTitle": "简洁明了的,",
+ "restTitle": "定价",
+ "description": "更聪明的部署方式,更快的扩容速度,以及不会让你破产的账单。",
+ "billingCycle": {
+ "monthly": "按月",
+ "annual": "按年"
+ },
+ "plan": {
+ "free": {
+ "title": "免费",
+ "subTitle": "开源版本",
+ "section": {
+ "title": "部署Dokploy的开源版本",
+ "description": "自行管理您的基础设施,不收取任何费用"
+ },
+ "features": {
+ "f1": "灵活的架构,您可以单独部署 Dokploy 管理端",
+ "f2": "无限数量的部署",
+ "f3": "自维护的基础设施",
+ "f4": "来自社区的有限支持",
+ "f5": "所有功能可用",
+ "f6": "Dokploy 集成",
+ "f7": "基础备份服务",
+ "f8": "跟随开源版本更新",
+ "f9": "无限服务器数量"
+ },
+ "go": "立即开始"
+ },
+ "cloud": {
+ "title": "推荐(年付更优惠)",
+ "section": {
+ "title": "Dokploy 云",
+ "description": "使用我们的云服务,一站式管理您所有的部署。"
+ },
+ "servers": "{serverQuantity}台受控服务器",
+ "features": {
+ "f1": "由 Dokploy 云提供支持的独立控制面板",
+ "f2": "优先技术支持",
+ "f3": "优先体验先行功能"
+ },
+ "go": "订阅"
+ }
+ },
+ "faq": {
+ "title": "常见问题",
+ "description": "如果您的问题不在以下列表,请随时向我们致信",
+ "q1": "Dokploy 的开源版本是什么?",
+ "a1": "您可以免费安装 Dokploy 开源版本,并自行负责 Dokploy 的日后维护工作",
+ "q2": "付费计划还需要自己的服务器吗?",
+ "a2": "是的,在付费计划中,您依然需要提供您用于实际运行服务的服务器(如阿里云、腾讯云、AWS 等),我们会为您管理 Dokploy 控制面板。",
+ "q3": "如果我需要管理更多的服务器怎么办?",
+ "a3": "第一台服务器的费用为 $4.5/月,之后每台的费用是 $3.5/月。",
+ "q4": "部署服务的数量有限制吗?",
+ "a4": "不管您如何使用 Dokploy,我们都不会限制您部署服务的数量。",
+ "q5": "如果我意外超过了最大服务器数量怎么办?",
+ "a5": "最新添加的服务器将被停用,您将不能向其创建服务,直到它们被重新激活。",
+ "q6": "关于退款服务的政策?",
+ "a6": "您可以随时取消您的订阅,但请原谅我们无法提供退款服务,您可以无限试用开源版本,然后再购买。",
+ "q7": "关于技术支持?",
+ "a7": "付费计划可以得到优先的技术支持,开源版本则是由社区提供技术支持。",
+ "q8": "Dokploy 开源吗?",
+ "a8": "是的,Dokploy 完全开源,您可以参与贡献或者是 Fork 后自行修改以用于您的私人需求。"
+ }
}
}
diff --git a/apps/website/tailwind.config.ts b/apps/website/tailwind.config.ts
index 87e094bd9..a177e3743 100644
--- a/apps/website/tailwind.config.ts
+++ b/apps/website/tailwind.config.ts
@@ -10,9 +10,6 @@ const config = {
],
prefix: "",
theme: {
- // fontFamily: {
- // sans: ["var(--font-sans)", ...fontFamily.sans],
- // },
fontSize: {
xs: ["0.75rem", { lineHeight: "1rem" }],
sm: ["0.875rem", { lineHeight: "1.5rem" }],
@@ -75,7 +72,6 @@ const config = {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
-
"4xl": "2rem",
},
fontFamily: {
@@ -84,17 +80,34 @@ const config = {
},
keyframes: {
"accordion-down": {
- from: { height: "0" },
- to: { height: "var(--radix-accordion-content-height)" },
+ from: {
+ height: "0",
+ },
+ to: {
+ height: "var(--radix-accordion-content-height)",
+ },
},
"accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: "0" },
+ from: {
+ height: "var(--radix-accordion-content-height)",
+ },
+ to: {
+ height: "0",
+ },
+ },
+ "shiny-text": {
+ "0%, 90%, 100%": {
+ "background-position": "calc(-100% - var(--shiny-width)) 0",
+ },
+ "30%, 60%": {
+ "background-position": "calc(100% + var(--shiny-width)) 0",
+ },
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
+ "shiny-text": "shiny-text 8s infinite",
},
},
},
diff --git a/packages/server/src/db/drizzle.config.ts b/packages/server/src/db/drizzle.config.ts
index f556649be..60a3bb937 100644
--- a/packages/server/src/db/drizzle.config.ts
+++ b/packages/server/src/db/drizzle.config.ts
@@ -4,7 +4,7 @@ export default defineConfig({
schema: "./server/db/schema/index.ts",
dialect: "postgresql",
dbCredentials: {
- url: process.env.DATABASE_URL || "",
+ url: process.env.DATABASE_URL!,
},
out: "drizzle",
migrations: {
diff --git a/packages/server/src/db/index.ts b/packages/server/src/db/index.ts
index c81531447..d5e1d7128 100644
--- a/packages/server/src/db/index.ts
+++ b/packages/server/src/db/index.ts
@@ -7,12 +7,12 @@ declare global {
export let db: PostgresJsDatabase;
if (process.env.NODE_ENV === "production") {
- db = drizzle(postgres(process.env.DATABASE_URL || ""), {
+ db = drizzle(postgres(process.env.DATABASE_URL!), {
schema,
});
} else {
if (!global.db)
- global.db = drizzle(postgres(process.env.DATABASE_URL || ""), {
+ global.db = drizzle(postgres(process.env.DATABASE_URL!), {
schema,
});
diff --git a/packages/server/src/db/migration.ts b/packages/server/src/db/migration.ts
index 75a79b349..6fada0833 100644
--- a/packages/server/src/db/migration.ts
+++ b/packages/server/src/db/migration.ts
@@ -2,7 +2,7 @@
// import { migrate } from "drizzle-orm/postgres-js/migrator";
// import postgres from "postgres";
-// const connectionString = process.env.DATABASE_URL || "";
+// const connectionString = process.env.DATABASE_URL!;
// const sql = postgres(connectionString, { max: 1 });
// const db = drizzle(sql);
diff --git a/packages/server/src/db/reset.ts b/packages/server/src/db/reset.ts
index 4a4dbecba..7497bec33 100644
--- a/packages/server/src/db/reset.ts
+++ b/packages/server/src/db/reset.ts
@@ -3,7 +3,7 @@ import { sql } from "drizzle-orm";
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
-const connectionString = process.env.DATABASE_URL || "";
+const connectionString = process.env.DATABASE_URL!;
const pg = postgres(connectionString, { max: 1 });
const db = drizzle(pg);
diff --git a/packages/server/src/db/schema/auth.ts b/packages/server/src/db/schema/auth.ts
index e8deb3c02..0f8640fc9 100644
--- a/packages/server/src/db/schema/auth.ts
+++ b/packages/server/src/db/schema/auth.ts
@@ -50,6 +50,8 @@ export const auth = pgTable("auth", {
.$defaultFn(() => new Date().toISOString()),
resetPasswordToken: text("resetPasswordToken"),
resetPasswordExpiresAt: text("resetPasswordExpiresAt"),
+ confirmationToken: text("confirmationToken"),
+ confirmationExpiresAt: text("confirmationExpiresAt"),
});
export const authRelations = relations(auth, ({ many }) => ({
diff --git a/packages/server/src/db/seed.ts b/packages/server/src/db/seed.ts
index 9e19cb0f3..7e2736b00 100644
--- a/packages/server/src/db/seed.ts
+++ b/packages/server/src/db/seed.ts
@@ -3,7 +3,7 @@
// import postgres from "postgres";
// import { users } from "./schema";
-// const connectionString = process.env.DATABASE_URL || "";
+// const connectionString = process.env.DATABASE_URL!;
// const pg = postgres(connectionString, { max: 1 });
// const db = drizzle(pg);
diff --git a/packages/server/src/emails/emails/notion-magic-link.tsx b/packages/server/src/emails/emails/notion-magic-link.tsx
index 89cc3444c..b2286c340 100644
--- a/packages/server/src/emails/emails/notion-magic-link.tsx
+++ b/packages/server/src/emails/emails/notion-magic-link.tsx
@@ -15,9 +15,7 @@ interface NotionMagicLinkEmailProps {
loginCode?: string;
}
-const baseUrl = process.env.VERCEL_URL
- ? `https://${process.env.VERCEL_URL}`
- : "";
+const baseUrl = process.env.VERCEL_URL!;
export const NotionMagicLinkEmail = ({
loginCode,
diff --git a/packages/server/src/emails/emails/plaid-verify-identity.tsx b/packages/server/src/emails/emails/plaid-verify-identity.tsx
index 2fce846a8..650ab4866 100644
--- a/packages/server/src/emails/emails/plaid-verify-identity.tsx
+++ b/packages/server/src/emails/emails/plaid-verify-identity.tsx
@@ -15,9 +15,7 @@ interface PlaidVerifyIdentityEmailProps {
validationCode?: string;
}
-const baseUrl = process.env.VERCEL_URL
- ? `https://${process.env.VERCEL_URL}`
- : "";
+const baseUrl = process.env.VERCEL_URL!;
export const PlaidVerifyIdentityEmail = ({
validationCode,
diff --git a/packages/server/src/emails/emails/stripe-welcome.tsx b/packages/server/src/emails/emails/stripe-welcome.tsx
index 232f4a2ce..9377853be 100644
--- a/packages/server/src/emails/emails/stripe-welcome.tsx
+++ b/packages/server/src/emails/emails/stripe-welcome.tsx
@@ -13,9 +13,7 @@ import {
} from "@react-email/components";
import * as React from "react";
-const baseUrl = process.env.VERCEL_URL
- ? `https://${process.env.VERCEL_URL}`
- : "";
+const baseUrl = process.env.VERCEL_URL!;
export const StripeWelcomeEmail = () => (
diff --git a/packages/server/src/emails/emails/vercel-invite-user.tsx b/packages/server/src/emails/emails/vercel-invite-user.tsx
index bd7404ab9..53b31987c 100644
--- a/packages/server/src/emails/emails/vercel-invite-user.tsx
+++ b/packages/server/src/emails/emails/vercel-invite-user.tsx
@@ -29,9 +29,7 @@ interface VercelInviteUserEmailProps {
inviteFromLocation?: string;
}
-const baseUrl = process.env.VERCEL_URL
- ? `https://${process.env.VERCEL_URL}`
- : "";
+const baseUrl = process.env.VERCEL_URL!;
export const VercelInviteUserEmail = ({
username,
diff --git a/packages/server/src/services/admin.ts b/packages/server/src/services/admin.ts
index 94bd92d9c..a52b1a6ef 100644
--- a/packages/server/src/services/admin.ts
+++ b/packages/server/src/services/admin.ts
@@ -20,7 +20,7 @@ export const createInvitation = async (
const result = await tx
.insert(auth)
.values({
- email: input.email,
+ email: input.email.toLowerCase(),
rol: "user",
password: bcrypt.hashSync("01231203012312", 10),
})
diff --git a/packages/server/src/services/auth.ts b/packages/server/src/services/auth.ts
index 0003c61a1..11e2d24cc 100644
--- a/packages/server/src/services/auth.ts
+++ b/packages/server/src/services/auth.ts
@@ -24,7 +24,7 @@ export const createAdmin = async (input: typeof apiCreateAdmin._type) => {
const newAuth = await tx
.insert(auth)
.values({
- email: input.email,
+ email: input.email.toLowerCase(),
password: hashedPassword,
rol: "admin",
})
@@ -93,7 +93,7 @@ export const findAuthByEmail = async (email: string) => {
if (!result) {
throw new TRPCError({
code: "NOT_FOUND",
- message: "Auth not found",
+ message: "User not found",
});
}
return result;
diff --git a/packages/server/src/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts
index 27bc99a4f..828320279 100644
--- a/packages/server/src/setup/traefik-setup.ts
+++ b/packages/server/src/setup/traefik-setup.ts
@@ -9,8 +9,8 @@ import type { FileConfig } from "../utils/traefik/file-types";
import type { MainTraefikConfig } from "../utils/traefik/types";
const TRAEFIK_SSL_PORT =
- Number.parseInt(process.env.TRAEFIK_SSL_PORT ?? "", 10) || 443;
-const TRAEFIK_PORT = Number.parseInt(process.env.TRAEFIK_PORT ?? "", 10) || 80;
+ Number.parseInt(process.env.TRAEFIK_SSL_PORT!, 10) || 443;
+const TRAEFIK_PORT = Number.parseInt(process.env.TRAEFIK_PORT!, 10) || 80;
interface TraefikOptions {
enableDashboard?: boolean;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d78af3e01..89a32a154 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13454,7 +13454,7 @@ snapshots:
eslint: 8.45.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.45.0))(eslint@8.45.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1)(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.45.0))(eslint@8.45.0))(eslint@8.45.0)
eslint-plugin-jsx-a11y: 6.9.0(eslint@8.45.0)
eslint-plugin-react: 7.35.0(eslint@8.45.0)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0)
@@ -13478,7 +13478,7 @@ snapshots:
enhanced-resolve: 5.17.1
eslint: 8.45.0
eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.45.0))(eslint@8.45.0))(eslint@8.45.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1)(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.45.0))(eslint@8.45.0))(eslint@8.45.0)
fast-glob: 3.3.2
get-tsconfig: 4.7.5
is-core-module: 2.15.0
@@ -13500,7 +13500,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1)(eslint@8.45.0):
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.45.0)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.45.0))(eslint@8.45.0))(eslint@8.45.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5