diff --git a/.circleci/config.yml b/.circleci/config.yml index f47a561a5..c5e57a973 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -99,14 +99,14 @@ workflows: only: - main - canary - - pull/665 + - fix/build-i18n - build-arm64: filters: branches: only: - main - canary - - pull/665 + - fix/build-i18n - combine-manifests: requires: - build-amd64 @@ -116,4 +116,4 @@ workflows: only: - main - canary - - pull/665 + - fix/build-i18n diff --git a/Dockerfile b/Dockerfile index 74b70db0e..838fbe4f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,6 +35,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var COPY --from=build /prod/dokploy/.next ./.next COPY --from=build /prod/dokploy/dist ./dist COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs +COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs COPY --from=build /prod/dokploy/public ./public COPY --from=build /prod/dokploy/package.json ./package.json COPY --from=build /prod/dokploy/drizzle ./drizzle diff --git a/Dockerfile.cloud b/Dockerfile.cloud index 020ea3d69..0f8427d46 100644 --- a/Dockerfile.cloud +++ b/Dockerfile.cloud @@ -44,6 +44,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var COPY --from=build /prod/dokploy/.next ./.next COPY --from=build /prod/dokploy/dist ./dist COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs +COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs COPY --from=build /prod/dokploy/public ./public COPY --from=build /prod/dokploy/package.json ./package.json COPY --from=build /prod/dokploy/drizzle ./drizzle diff --git a/apps/dokploy/next-i18next.config.js b/apps/dokploy/next-i18next.config.cjs similarity index 100% rename from apps/dokploy/next-i18next.config.js rename to apps/dokploy/next-i18next.config.cjs diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 8bba5e4a3..fc695598a 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -11,7 +11,7 @@ "build-next": "next build", "setup": "tsx -r dotenv/config setup.ts && sleep 5 && pnpm run migration:run", "reset-password": "node -r dotenv/config dist/reset-password.mjs", - "dev": "tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ", + "dev": "TURBOPACK=1 tsx -r dotenv/config ./server/server.ts --project tsconfig.server.json ", "studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts", "migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts", "migration:run": "tsx -r dotenv/config migration.ts", diff --git a/apps/dokploy/pages/dashboard/settings/appearance.tsx b/apps/dokploy/pages/dashboard/settings/appearance.tsx index f074f2898..209d938c6 100644 --- a/apps/dokploy/pages/dashboard/settings/appearance.tsx +++ b/apps/dokploy/pages/dashboard/settings/appearance.tsx @@ -2,13 +2,13 @@ import { AppearanceForm } from "@/components/dashboard/settings/appearance-form" import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; +import nextI18NextConfig from "../../../next-i18next.config.cjs"; const Page = () => { return ( diff --git a/apps/dokploy/pages/dashboard/settings/profile.tsx b/apps/dokploy/pages/dashboard/settings/profile.tsx index 9303354f1..a645a4af3 100644 --- a/apps/dokploy/pages/dashboard/settings/profile.tsx +++ b/apps/dokploy/pages/dashboard/settings/profile.tsx @@ -4,11 +4,10 @@ import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx index c714acd83..c1d3d5480 100644 --- a/apps/dokploy/pages/dashboard/settings/server.tsx +++ b/apps/dokploy/pages/dashboard/settings/server.tsx @@ -3,11 +3,10 @@ import { WebServer } from "@/components/dashboard/settings/web-server"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { SettingsLayout } from "@/components/layouts/settings-layout"; import { appRouter } from "@/server/api/root"; -import { getLocale } from "@/utils/i18n"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD, validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { type ReactElement } from "react"; import superjson from "superjson"; diff --git a/apps/dokploy/server/server.ts b/apps/dokploy/server/server.ts index bf1112333..b65446f8b 100644 --- a/apps/dokploy/server/server.ts +++ b/apps/dokploy/server/server.ts @@ -24,7 +24,7 @@ import { setupTerminalWebSocketServer } from "./wss/terminal"; config({ path: ".env" }); const PORT = Number.parseInt(process.env.PORT || "3000", 10); const dev = process.env.NODE_ENV !== "production"; -const app = next({ dev }); +const app = next({ dev, turbopack: dev }); const handle = app.getRequestHandler(); void app.prepare().then(async () => { try { diff --git a/apps/dokploy/templates/activepieces/index.ts b/apps/dokploy/templates/activepieces/index.ts index 60f8981fd..f1d97ccc3 100644 --- a/apps/dokploy/templates/activepieces/index.ts +++ b/apps/dokploy/templates/activepieces/index.ts @@ -1,40 +1,44 @@ import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - - const apiKey = Array.from({length: 32}, () => - Math.floor(Math.random() * 16).toString(16)).join(''); - const encryptionKey = Array.from({length: 32}, () => - Math.floor(Math.random() * 16).toString(16)).join(''); - const jwtSecret = Array.from({length: 32}, () => - Math.floor(Math.random() * 16).toString(16)).join(''); - const postgresPassword = Array.from({length: 32}, () => - Math.floor(Math.random() * 16).toString(16)).join(''); + const mainDomain = generateRandomDomain(schema); - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "activepieces", - }, - ]; + const apiKey = Array.from({ length: 32 }, () => + Math.floor(Math.random() * 16).toString(16), + ).join(""); + const encryptionKey = Array.from({ length: 32 }, () => + Math.floor(Math.random() * 16).toString(16), + ).join(""); + const jwtSecret = Array.from({ length: 32 }, () => + Math.floor(Math.random() * 16).toString(16), + ).join(""); + const postgresPassword = Array.from({ length: 32 }, () => + Math.floor(Math.random() * 16).toString(16), + ).join(""); - const envs = [ - `AP_HOST=${mainDomain}`, - `AP_API_KEY=${apiKey}`, - `AP_ENCRYPTION_KEY=${encryptionKey}`, - `AP_JWT_SECRET=${jwtSecret}`, - `AP_POSTGRES_PASSWORD=${postgresPassword}`, - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 80, + serviceName: "activepieces", + }, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + const envs = [ + `AP_HOST=${mainDomain}`, + `AP_API_KEY=${apiKey}`, + `AP_ENCRYPTION_KEY=${encryptionKey}`, + `AP_JWT_SECRET=${jwtSecret}`, + `AP_POSTGRES_PASSWORD=${postgresPassword}`, + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/discord-tickets/index.ts b/apps/dokploy/templates/discord-tickets/index.ts index e2a42649a..48b40ed7f 100644 --- a/apps/dokploy/templates/discord-tickets/index.ts +++ b/apps/dokploy/templates/discord-tickets/index.ts @@ -1,46 +1,47 @@ import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const mysqlPassword = generatePassword(); - const mysqlRootPassword = generatePassword(); - const mysqlUser = "tickets"; - const mysqlDatabase = "tickets"; - - // Generate encryption key in the format they use - const encryptionKey = Array.from({length: 48}, () => - Math.floor(Math.random() * 16).toString(16)).join(''); + const mainDomain = generateRandomDomain(schema); + const mysqlPassword = generatePassword(); + const mysqlRootPassword = generatePassword(); + const mysqlUser = "tickets"; + const mysqlDatabase = "tickets"; - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 8169, - serviceName: "bot", - }, - ]; + // Generate encryption key in the format they use + const encryptionKey = Array.from({ length: 48 }, () => + Math.floor(Math.random() * 16).toString(16), + ).join(""); - const envs = [ - `TICKETS_HOST=${mainDomain}`, - `MYSQL_DATABASE=${mysqlDatabase}`, - `MYSQL_PASSWORD=${mysqlPassword}`, - `MYSQL_ROOT_PASSWORD=${mysqlRootPassword}`, - `MYSQL_USER=${mysqlUser}`, - `ENCRYPTION_KEY=${encryptionKey}`, - // These need to be set by the user through the UI - `# Follow the guide at: https://discordtickets.app/self-hosting/installation/docker/#creating-the-discord-application`, - `DISCORD_SECRET=`, - `DISCORD_TOKEN=`, - `SUPER_USERS=YOUR_DISCORD_USER_ID`, // Default super user - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8169, + serviceName: "bot", + }, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + const envs = [ + `TICKETS_HOST=${mainDomain}`, + `MYSQL_DATABASE=${mysqlDatabase}`, + `MYSQL_PASSWORD=${mysqlPassword}`, + `MYSQL_ROOT_PASSWORD=${mysqlRootPassword}`, + `MYSQL_USER=${mysqlUser}`, + `ENCRYPTION_KEY=${encryptionKey}`, + // These need to be set by the user through the UI + "# Follow the guide at: https://discordtickets.app/self-hosting/installation/docker/#creating-the-discord-application", + "DISCORD_SECRET=", + "DISCORD_TOKEN=", + "SUPER_USERS=YOUR_DISCORD_USER_ID", // Default super user + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/invoiceshelf/index.ts b/apps/dokploy/templates/invoiceshelf/index.ts index 2e7c5cf7b..d8ae8f63a 100644 --- a/apps/dokploy/templates/invoiceshelf/index.ts +++ b/apps/dokploy/templates/invoiceshelf/index.ts @@ -1,34 +1,34 @@ import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const dbPassword = generatePassword(); - const dbUsername = "invoiceshelf"; - const dbDatabase = "invoiceshelf"; + const mainDomain = generateRandomDomain(schema); + const dbPassword = generatePassword(); + const dbUsername = "invoiceshelf"; + const dbDatabase = "invoiceshelf"; - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "invoiceshelf", - }, - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 80, + serviceName: "invoiceshelf", + }, + ]; - const envs = [ - `INVOICESHELF_HOST=${mainDomain}`, - `DB_PASSWORD=${dbPassword}`, - `DB_USERNAME=${dbUsername}`, - `DB_DATABASE=${dbDatabase}`, - ]; + const envs = [ + `INVOICESHELF_HOST=${mainDomain}`, + `DB_PASSWORD=${dbPassword}`, + `DB_USERNAME=${dbUsername}`, + `DB_DATABASE=${dbDatabase}`, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/peppermint/index.ts b/apps/dokploy/templates/peppermint/index.ts index 867a52546..2b71d4906 100644 --- a/apps/dokploy/templates/peppermint/index.ts +++ b/apps/dokploy/templates/peppermint/index.ts @@ -1,43 +1,43 @@ import { - type DomainSchema, - type Schema, - type Template, - generateBase64, - generatePassword, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - // Generate domains and secrets - const mainDomain = generateRandomDomain(schema); - const apiDomain = generateRandomDomain(schema); - const postgresPassword = generatePassword(); - const secret = generateBase64(32); + // Generate domains and secrets + const mainDomain = generateRandomDomain(schema); + const apiDomain = generateRandomDomain(schema); + const postgresPassword = generatePassword(); + const secret = generateBase64(32); - // Configure domain routing - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 3000, - serviceName: "peppermint", - }, - { - host: apiDomain, - port: 5003, - serviceName: "peppermint", - }, - ]; + // Configure domain routing + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "peppermint", + }, + { + host: apiDomain, + port: 5003, + serviceName: "peppermint", + }, + ]; - // Set environment variables - const envs = [ - `MAIN_DOMAIN=${mainDomain}`, - `API_DOMAIN=${apiDomain}`, - `POSTGRES_PASSWORD=${postgresPassword}`, - `SECRET=${secret}`, - ]; + // Set environment variables + const envs = [ + `MAIN_DOMAIN=${mainDomain}`, + `API_DOMAIN=${apiDomain}`, + `POSTGRES_PASSWORD=${postgresPassword}`, + `SECRET=${secret}`, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/postiz/index.ts b/apps/dokploy/templates/postiz/index.ts index 440154659..d9eef415a 100644 --- a/apps/dokploy/templates/postiz/index.ts +++ b/apps/dokploy/templates/postiz/index.ts @@ -1,37 +1,37 @@ import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, - generateBase64, + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const dbPassword = generatePassword(); - const dbUser = "postiz"; - const dbName = "postiz"; - const jwtSecret = generateBase64(32); + const mainDomain = generateRandomDomain(schema); + const dbPassword = generatePassword(); + const dbUser = "postiz"; + const dbName = "postiz"; + const jwtSecret = generateBase64(32); - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 5000, - serviceName: "postiz", - }, - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 5000, + serviceName: "postiz", + }, + ]; - const envs = [ - `POSTIZ_HOST=${mainDomain}`, - `DB_PASSWORD=${dbPassword}`, - `DB_USER=${dbUser}`, - `DB_NAME=${dbName}`, - `JWT_SECRET=${jwtSecret}`, - ]; + const envs = [ + `POSTIZ_HOST=${mainDomain}`, + `DB_PASSWORD=${dbPassword}`, + `DB_USER=${dbUser}`, + `DB_NAME=${dbName}`, + `JWT_SECRET=${jwtSecret}`, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/slash/index.ts b/apps/dokploy/templates/slash/index.ts index 5d2bcdb24..4e05f74d9 100644 --- a/apps/dokploy/templates/slash/index.ts +++ b/apps/dokploy/templates/slash/index.ts @@ -1,33 +1,33 @@ import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const dbPassword = generatePassword(); - const dbUser = "slash"; - const dbName = "slash"; + const mainDomain = generateRandomDomain(schema); + const dbPassword = generatePassword(); + const dbUser = "slash"; + const dbName = "slash"; - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 5231, - serviceName: "slash", - }, - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 5231, + serviceName: "slash", + }, + ]; - const envs = [ - `DB_USER=${dbUser}`, - `DB_PASSWORD=${dbPassword}`, - `DB_NAME=${dbName}`, - ]; + const envs = [ + `DB_USER=${dbUser}`, + `DB_PASSWORD=${dbPassword}`, + `DB_NAME=${dbName}`, + ]; - return { - domains, - envs, - }; -} \ No newline at end of file + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 1ad1a012c..40f5e736c 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -706,12 +706,13 @@ export const templates: TemplateData[] = [ id: "peppermint", name: "Peppermint", version: "latest", - description: "Peppermint is a modern, open-source API development platform that helps you build, test and document your APIs.", + description: + "Peppermint is a modern, open-source API development platform that helps you build, test and document your APIs.", logo: "peppermint.svg", links: { github: "https://github.com/Peppermint-Lab/peppermint", website: "https://peppermint.sh/", - docs: "https://docs.peppermint.sh/" + docs: "https://docs.peppermint.sh/", }, tags: ["api", "development", "documentation"], load: () => import("./peppermint/index").then((m) => m.generate), @@ -720,7 +721,8 @@ export const templates: TemplateData[] = [ id: "windmill", name: "Windmill", version: "latest", - description: "A developer platform to build production-grade workflows and internal apps. Open-source alternative to Airplane, Retool, and GitHub Actions.", + description: + "A developer platform to build production-grade workflows and internal apps. Open-source alternative to Airplane, Retool, and GitHub Actions.", logo: "windmill.svg", links: { github: "https://github.com/windmill-labs/windmill", @@ -734,7 +736,8 @@ export const templates: TemplateData[] = [ id: "activepieces", name: "Activepieces", version: "0.35.0", - description: "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.", + description: + "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.", logo: "activepieces.svg", links: { github: "https://github.com/activepieces/activepieces", @@ -748,21 +751,23 @@ export const templates: TemplateData[] = [ id: "invoiceshelf", name: "InvoiceShelf", version: "latest", - description: "InvoiceShelf is a self-hosted open source invoicing system for freelancers and small businesses.", - logo: "invoiceshelf.png", - links: { - github: "https://github.com/InvoiceShelf/invoiceshelf", - website: "https://invoiceshelf.com", - docs: "https://github.com/InvoiceShelf/invoiceshelf#readme", - }, - tags: ["invoice", "business", "finance"], - load: () => import("./invoiceshelf/index").then((m) => m.generate), + description: + "InvoiceShelf is a self-hosted open source invoicing system for freelancers and small businesses.", + logo: "invoiceshelf.png", + links: { + github: "https://github.com/InvoiceShelf/invoiceshelf", + website: "https://invoiceshelf.com", + docs: "https://github.com/InvoiceShelf/invoiceshelf#readme", + }, + tags: ["invoice", "business", "finance"], + load: () => import("./invoiceshelf/index").then((m) => m.generate), }, { id: "postiz", name: "Postiz", version: "latest", - description: "Postiz is a modern, open-source platform for managing and publishing content across multiple channels.", + description: + "Postiz is a modern, open-source platform for managing and publishing content across multiple channels.", logo: "postiz.png", links: { github: "https://github.com/gitroomhq/postiz", @@ -776,7 +781,8 @@ export const templates: TemplateData[] = [ id: "slash", name: "Slash", version: "latest", - description: "Slash is a modern, self-hosted bookmarking service and link shortener that helps you organize and share your favorite links.", + description: + "Slash is a modern, self-hosted bookmarking service and link shortener that helps you organize and share your favorite links.", logo: "slash.png", links: { github: "https://github.com/yourselfhosted/slash", @@ -790,7 +796,8 @@ export const templates: TemplateData[] = [ id: "discord-tickets", name: "Discord Tickets", version: "4.0.21", - description: "An open-source Discord bot for creating and managing support ticket channels.", + description: + "An open-source Discord bot for creating and managing support ticket channels.", logo: "discord-tickets.png", links: { github: "https://github.com/discord-tickets/bot", @@ -799,8 +806,8 @@ export const templates: TemplateData[] = [ }, tags: ["discord", "tickets", "support"], load: () => import("./discord-tickets/index").then((m) => m.generate), - }, - { + }, + { id: "nextcloud-aio", name: "Nextcloud All in One", version: "30.0.2", @@ -814,8 +821,8 @@ export const templates: TemplateData[] = [ }, tags: ["file", "sync"], load: () => import("./nextcloud-aio/index").then((m) => m.generate), - }, - { + }, + { id: "blender", name: "Blender", version: "latest", diff --git a/apps/dokploy/templates/windmill/index.ts b/apps/dokploy/templates/windmill/index.ts index 875b7afaf..5d6aae3c5 100644 --- a/apps/dokploy/templates/windmill/index.ts +++ b/apps/dokploy/templates/windmill/index.ts @@ -1,43 +1,43 @@ import { - type DomainSchema, - type Schema, - type Template, - generatePassword, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const mainDomain = generateRandomDomain(schema); - const postgresPassword = generatePassword(); + const mainDomain = generateRandomDomain(schema); + const postgresPassword = generatePassword(); - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 80, - serviceName: "caddy", - }, - ]; + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 80, + serviceName: "caddy", + }, + ]; - const envs = [ - `WINDMILL_HOST=${mainDomain}`, - `POSTGRES_PASSWORD=${postgresPassword}`, - `DATABASE_URL=postgres://postgres:${postgresPassword}@db/windmill?sslmode=disable`, - ]; + const envs = [ + `WINDMILL_HOST=${mainDomain}`, + `POSTGRES_PASSWORD=${postgresPassword}`, + `DATABASE_URL=postgres://postgres:${postgresPassword}@db/windmill?sslmode=disable`, + ]; - const mounts: Template["mounts"] = [ - { - filePath: "Caddyfile", - content: `:80 { + const mounts: Template["mounts"] = [ + { + filePath: "Caddyfile", + content: `:80 { bind 0.0.0.0 reverse_proxy /ws/* http://lsp:3001 reverse_proxy /* http://windmill_server:8000 }`, - }, - ]; + }, + ]; - return { - domains, - envs, - mounts, - }; -} \ No newline at end of file + return { + domains, + envs, + mounts, + }; +} diff --git a/apps/dokploy/tsconfig.json b/apps/dokploy/tsconfig.json index e132180e8..d2e6532c6 100644 --- a/apps/dokploy/tsconfig.json +++ b/apps/dokploy/tsconfig.json @@ -39,7 +39,8 @@ "**/*.js", ".next/types/**/*.ts", "env.js", - "next.config.mjs" + "next.config.mjs", + "next-i18next.config.mjs" ], "exclude": [ "node_modules", diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts index 0c165c4ef..4790f1a70 100644 --- a/apps/dokploy/utils/i18n.ts +++ b/apps/dokploy/utils/i18n.ts @@ -4,3 +4,12 @@ export function getLocale(cookies: NextApiRequestCookies) { const locale = cookies.DOKPLOY_LOCALE ?? "en"; return locale; } + +// libs/i18n.js +import { serverSideTranslations as originalServerSideTranslations } from "next-i18next/serverSideTranslations"; +import nextI18NextConfig from "../next-i18next.config.cjs"; + +export const serverSideTranslations = ( + locale: string, + namespaces = ["common"], +) => originalServerSideTranslations(locale, namespaces, nextI18NextConfig); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9dd089aa9..8e6ae0500 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,7 +249,7 @@ importers: version: 0.5.1(drizzle-orm@0.30.10(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8) i18next: specifier: ^23.16.4 - version: 23.16.4 + version: 23.16.5 input-otp: specifier: ^1.2.4 version: 1.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -276,7 +276,7 @@ importers: version: 15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-i18next: specifier: ^15.3.1 - version: 15.3.1(i18next@23.16.4)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 15.3.1(i18next@23.16.5)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) next-themes: specifier: ^0.2.1 version: 0.2.1(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -306,7 +306,7 @@ importers: version: 7.52.1(react@18.2.0) react-i18next: specifier: ^15.1.0 - version: 15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recharts: specifier: ^2.12.7 version: 2.12.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4734,8 +4734,8 @@ packages: i18next-fs-backend@2.3.2: resolution: {integrity: sha512-LIwUlkqDZnUI8lnUxBnEj8K/FrHQTT/Sc+1rvDm9E8YvvY5YxzoEAASNx+W5M9DfD5s77lI5vSAFWeTp26B/3Q==} - i18next@23.16.4: - resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + i18next@23.16.5: + resolution: {integrity: sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -5771,8 +5771,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@15.1.0: - resolution: {integrity: sha512-zj3nJynMnZsy2gPZiOTC7XctCY5eQGqT3tcKMmfJWC9FMvgd+960w/adq61j8iPzpwmsXejqID9qC3Mqu1Xu2Q==} + react-i18next@15.1.1: + resolution: {integrity: sha512-R/Vg9wIli2P3FfeI8o1eNJUJue5LWpFsQePCHdQDmX0Co3zkr6kdT8gAseb/yGeWbNz1Txc4bKDQuZYsC0kQfw==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -10946,7 +10946,7 @@ snapshots: i18next-fs-backend@2.3.2: {} - i18next@23.16.4: + i18next@23.16.5: dependencies: '@babel/runtime': 7.25.0 @@ -11450,17 +11450,17 @@ snapshots: neotraverse@0.6.18: {} - next-i18next@15.3.1(i18next@23.16.4)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-i18next@15.3.1(i18next@23.16.5)(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.25.0 '@types/hoist-non-react-statics': 3.3.5 core-js: 3.39.0 hoist-non-react-statics: 3.3.2 - i18next: 23.16.4 + i18next: 23.16.5 i18next-fs-backend: 2.3.2 next: 15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 - react-i18next: 15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-i18next: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-themes@0.2.1(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -11951,11 +11951,11 @@ snapshots: dependencies: react: 18.2.0 - react-i18next@15.1.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.25.0 html-parse-stringify: 3.0.1 - i18next: 23.16.4 + i18next: 23.16.5 react: 18.2.0 optionalDependencies: react-dom: 18.2.0(react@18.2.0)