From cbf6f95891b327657e5c3c7c945c88b541c46930 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:19:33 -0600 Subject: [PATCH 1/5] refactor: update database connection handling and remove unused migration and seed files --- apps/dokploy/esbuild.config.ts | 6 + apps/dokploy/migrate.ts | 149 ----------------------- apps/dokploy/server/db/index.ts | 8 +- apps/dokploy/server/db/migration.ts | 21 ---- apps/dokploy/server/db/seed.ts | 29 ----- packages/server/package.json | 31 +++-- packages/server/src/db/drizzle.config.ts | 14 --- packages/server/src/db/index.ts | 21 ---- packages/server/src/db/migration.ts | 21 ---- packages/server/src/db/reset.ts | 23 ---- packages/server/src/db/seed.ts | 35 ------ 11 files changed, 33 insertions(+), 325 deletions(-) delete mode 100644 apps/dokploy/migrate.ts delete mode 100644 apps/dokploy/server/db/migration.ts delete mode 100644 apps/dokploy/server/db/seed.ts delete mode 100644 packages/server/src/db/drizzle.config.ts delete mode 100644 packages/server/src/db/index.ts delete mode 100644 packages/server/src/db/migration.ts delete mode 100644 packages/server/src/db/reset.ts delete mode 100644 packages/server/src/db/seed.ts diff --git a/apps/dokploy/esbuild.config.ts b/apps/dokploy/esbuild.config.ts index c84135e5d..6d96cf058 100644 --- a/apps/dokploy/esbuild.config.ts +++ b/apps/dokploy/esbuild.config.ts @@ -7,6 +7,10 @@ function prepareDefine(config: DotenvParseOutput | undefined) { const define = {}; // @ts-ignore for (const [key, value] of Object.entries(config)) { + // Skip DATABASE_URL to allow runtime environment variable override + if (key === "DATABASE_URL") { + continue; + } // @ts-ignore define[`process.env.${key}`] = JSON.stringify(value); } @@ -14,6 +18,8 @@ function prepareDefine(config: DotenvParseOutput | undefined) { } const define = prepareDefine(result.parsed); + +console.log(define); try { esbuild .build({ diff --git a/apps/dokploy/migrate.ts b/apps/dokploy/migrate.ts deleted file mode 100644 index e1f52c9a3..000000000 --- a/apps/dokploy/migrate.ts +++ /dev/null @@ -1,149 +0,0 @@ -// import { drizzle } from "drizzle-orm/postgres-js"; -// import { nanoid } from "nanoid"; -// import postgres from "postgres"; -// import * as schema from "./server/db/schema"; - -// const connectionString = process.env.DATABASE_URL!; - -// const sql = postgres(connectionString, { max: 1 }); -// const db = drizzle(sql, { -// schema, -// }); - -// await db -// .transaction(async (db) => { -// const admins = await db.query.admins.findMany({ -// with: { -// auth: true, -// users: { -// with: { -// auth: true, -// }, -// }, -// }, -// }); -// for (const admin of admins) { -// const user = await db -// .insert(schema.users_temp) -// .values({ -// id: admin.adminId, -// email: admin.auth.email, -// token: admin.auth.token || "", -// emailVerified: true, -// updatedAt: new Date(), -// role: "admin", -// serverIp: admin.serverIp, -// image: admin.auth.image, -// certificateType: admin.certificateType, -// host: admin.host, -// letsEncryptEmail: admin.letsEncryptEmail, -// sshPrivateKey: admin.sshPrivateKey, -// enableDockerCleanup: admin.enableDockerCleanup, -// enableLogRotation: admin.enableLogRotation, -// enablePaidFeatures: admin.enablePaidFeatures, -// metricsConfig: admin.metricsConfig, -// cleanupCacheApplications: admin.cleanupCacheApplications, -// cleanupCacheOnPreviews: admin.cleanupCacheOnPreviews, -// cleanupCacheOnCompose: admin.cleanupCacheOnCompose, -// stripeCustomerId: admin.stripeCustomerId, -// stripeSubscriptionId: admin.stripeSubscriptionId, -// serversQuantity: admin.serversQuantity, -// }) -// .returning() -// .then((user) => user[0]); - -// await db.insert(schema.account).values({ -// providerId: "credential", -// userId: user?.id || "", -// password: admin.auth.password, -// is2FAEnabled: admin.auth.is2FAEnabled || false, -// createdAt: new Date(admin.auth.createdAt) || new Date(), -// updatedAt: new Date(admin.auth.createdAt) || new Date(), -// }); - -// const organization = await db -// .insert(schema.organization) -// .values({ -// name: "My Organization", -// slug: nanoid(), -// ownerId: user?.id || "", -// createdAt: new Date(admin.createdAt) || new Date(), -// }) -// .returning() -// .then((organization) => organization[0]); - -// for (const member of admin.users) { -// const userTemp = await db -// .insert(schema.users_temp) -// .values({ -// id: member.userId, -// email: member.auth.email, -// token: member.token || "", -// emailVerified: true, -// updatedAt: new Date(admin.createdAt) || new Date(), -// role: "user", -// image: member.auth.image, -// createdAt: admin.createdAt, -// canAccessToAPI: member.canAccessToAPI || false, -// canAccessToDocker: member.canAccessToDocker || false, -// canAccessToGitProviders: member.canAccessToGitProviders || false, -// canAccessToSSHKeys: member.canAccessToSSHKeys || false, -// canAccessToTraefikFiles: member.canAccessToTraefikFiles || false, -// canCreateProjects: member.canCreateProjects || false, -// canCreateServices: member.canCreateServices || false, -// canDeleteProjects: member.canDeleteProjects || false, -// canDeleteServices: member.canDeleteServices || false, -// accessedProjects: member.accessedProjects || [], -// accessedServices: member.accessedServices || [], -// }) -// .returning() -// .then((userTemp) => userTemp[0]); - -// await db.insert(schema.account).values({ -// providerId: "credential", -// userId: member?.userId || "", -// password: member.auth.password, -// is2FAEnabled: member.auth.is2FAEnabled || false, -// createdAt: new Date(member.auth.createdAt) || new Date(), -// updatedAt: new Date(member.auth.createdAt) || new Date(), -// }); - -// await db.insert(schema.member).values({ -// organizationId: organization?.id || "", -// userId: userTemp?.id || "", -// role: "admin", -// createdAt: new Date(member.createdAt) || new Date(), -// }); -// } -// } -// }) -// .then(() => { -// console.log("Migration finished"); -// }) -// .catch((error) => { -// console.error(error); -// }); - -// await db -// .transaction(async (db) => { -// const projects = await db.query.projects.findMany({ -// with: { -// user: { -// with: { -// organizations: true, -// }, -// }, -// }, -// }); -// for (const project of projects) { -// const _user = await db.update(schema.projects).set({ -// organizationId: project.user.organizations[0]?.id || "", -// }); -// } -// }) -// .then(() => { -// console.log("Migration finished"); -// }) -// .catch((error) => { -// console.error(error); -// }); diff --git a/apps/dokploy/server/db/index.ts b/apps/dokploy/server/db/index.ts index 3ac6e3940..55d6d3a46 100644 --- a/apps/dokploy/server/db/index.ts +++ b/apps/dokploy/server/db/index.ts @@ -6,14 +6,18 @@ declare global { var db: PostgresJsDatabase | undefined; } +const dbUrl = + process.env.DATABASE_URL || + "postgres://dokploy:amukds4wi9001583845717ad2@dokploy-postgres:5432/dokploy"; + export let db: PostgresJsDatabase; if (process.env.NODE_ENV === "production") { - db = drizzle(postgres(process.env.DATABASE_URL!), { + db = drizzle(postgres(dbUrl!), { schema, }); } else { if (!global.db) - global.db = drizzle(postgres(process.env.DATABASE_URL!), { + global.db = drizzle(postgres(dbUrl!), { schema, }); diff --git a/apps/dokploy/server/db/migration.ts b/apps/dokploy/server/db/migration.ts deleted file mode 100644 index fa2e1a80f..000000000 --- a/apps/dokploy/server/db/migration.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { drizzle } from "drizzle-orm/postgres-js"; -import { migrate } from "drizzle-orm/postgres-js/migrator"; -import postgres from "postgres"; - -const connectionString = process.env.DATABASE_URL!; - -const sql = postgres(connectionString, { max: 1 }); -const db = drizzle(sql); - -export const migration = async () => - await migrate(db, { migrationsFolder: "drizzle" }) - .then(() => { - console.log("Migration complete"); - sql.end(); - }) - .catch((error) => { - console.log("Migration failed", error); - }) - .finally(() => { - sql.end(); - }); diff --git a/apps/dokploy/server/db/seed.ts b/apps/dokploy/server/db/seed.ts deleted file mode 100644 index 5b3eb6c62..000000000 --- a/apps/dokploy/server/db/seed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { drizzle } from "drizzle-orm/postgres-js"; -import postgres from "postgres"; - -const connectionString = process.env.DATABASE_URL!; - -const pg = postgres(connectionString, { max: 1 }); -const _db = drizzle(pg); - -async function seed() { - console.log("> Seed:", process.env.DATABASE_PATH, "\n"); - - // const authenticationR = await db - // .insert(users) - // .values([ - // { - // email: "user1@hotmail.com", - // password: password("12345671"), - // }, - // ]) - // .onConflictDoNothing() - // .returning(); - - // console.log("\nSemillas Update:", authenticationR.length); -} - -seed().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/packages/server/package.json b/packages/server/package.json index dbf7d3c65..fc531d540 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,21 +1,32 @@ { "name": "@dokploy/server", "version": "1.0.0", - "main": "./src/index.ts", + "main": "./dist/index.js", "type": "module", "exports": { - ".": "./src/index.ts", + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs.js" + }, "./db": { - "import": "./src/db/index.ts", + "import": "./dist/db/index.js", "require": "./dist/db/index.cjs.js" }, - "./setup/*": { - "import": "./src/setup/*.ts", - "require": "./dist/setup/index.cjs.js" + "./*": { + "import": "./dist/*", + "require": "./dist/*.cjs" }, - "./constants": { - "import": "./src/constants/index.ts", - "require": "./dist/constants.cjs.js" + "./dist": { + "import": "./dist/index.js", + "require": "./dist/index.cjs.js" + }, + "./dist/db": { + "import": "./dist/db/index.js", + "require": "./dist/db/index.cjs.js" + }, + "./dist/db/schema": { + "import": "./dist/db/schema/index.js", + "require": "./dist/db/schema/index.cjs.js" } }, "scripts": { @@ -111,4 +122,4 @@ "node": "^20.16.0", "pnpm": ">=9.12.0" } -} +} \ No newline at end of file diff --git a/packages/server/src/db/drizzle.config.ts b/packages/server/src/db/drizzle.config.ts deleted file mode 100644 index 60a3bb937..000000000 --- a/packages/server/src/db/drizzle.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - schema: "./server/db/schema/index.ts", - dialect: "postgresql", - dbCredentials: { - url: process.env.DATABASE_URL!, - }, - out: "drizzle", - migrations: { - table: "migrations", - schema: "public", - }, -}); diff --git a/packages/server/src/db/index.ts b/packages/server/src/db/index.ts deleted file mode 100644 index 3ac6e3940..000000000 --- a/packages/server/src/db/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { drizzle, type PostgresJsDatabase } from "drizzle-orm/postgres-js"; -import postgres from "postgres"; -import * as schema from "./schema"; - -declare global { - var db: PostgresJsDatabase | undefined; -} - -export let db: PostgresJsDatabase; -if (process.env.NODE_ENV === "production") { - db = drizzle(postgres(process.env.DATABASE_URL!), { - schema, - }); -} else { - if (!global.db) - global.db = drizzle(postgres(process.env.DATABASE_URL!), { - schema, - }); - - db = global.db; -} diff --git a/packages/server/src/db/migration.ts b/packages/server/src/db/migration.ts deleted file mode 100644 index 6fada0833..000000000 --- a/packages/server/src/db/migration.ts +++ /dev/null @@ -1,21 +0,0 @@ -// import { drizzle } from "drizzle-orm/postgres-js"; -// import { migrate } from "drizzle-orm/postgres-js/migrator"; -// import postgres from "postgres"; - -// const connectionString = process.env.DATABASE_URL!; - -// const sql = postgres(connectionString, { max: 1 }); -// const db = drizzle(sql); - -// export const migration = async () => -// await migrate(db, { migrationsFolder: "drizzle" }) -// .then(() => { -// console.log("Migration complete"); -// sql.end(); -// }) -// .catch((error) => { -// console.log("Migration failed", error); -// }) -// .finally(() => { -// sql.end(); -// }); diff --git a/packages/server/src/db/reset.ts b/packages/server/src/db/reset.ts deleted file mode 100644 index c22291478..000000000 --- a/packages/server/src/db/reset.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { sql } from "drizzle-orm"; -// Credits to Louistiti from Drizzle Discord: https://discord.com/channels/1043890932593987624/1130802621750448160/1143083373535973406 -import { drizzle } from "drizzle-orm/postgres-js"; -import postgres from "postgres"; - -const connectionString = process.env.DATABASE_URL!; - -const pg = postgres(connectionString, { max: 1 }); -const db = drizzle(pg); - -const clearDb = async (): Promise => { - try { - const tablesQuery = sql`DROP SCHEMA public CASCADE; CREATE SCHEMA public; DROP schema drizzle CASCADE;`; - const tables = await db.execute(tablesQuery); - console.log(tables); - await pg.end(); - } catch (error) { - console.error("Error cleaning database", error); - } finally { - } -}; - -clearDb(); diff --git a/packages/server/src/db/seed.ts b/packages/server/src/db/seed.ts deleted file mode 100644 index 7e2736b00..000000000 --- a/packages/server/src/db/seed.ts +++ /dev/null @@ -1,35 +0,0 @@ -// import bc from "bcrypt"; -// import { drizzle } from "drizzle-orm/postgres-js"; -// import postgres from "postgres"; -// import { users } from "./schema"; - -// const connectionString = process.env.DATABASE_URL!; - -// const pg = postgres(connectionString, { max: 1 }); -// const db = drizzle(pg); - -// function password(txt: string) { -// return bc.hashSync(txt, 10); -// } - -// async function seed() { -// console.log("> Seed:", process.env.DATABASE_PATH, "\n"); - -// // const authenticationR = await db -// // .insert(users) -// // .values([ -// // { -// // email: "user1@hotmail.com", -// // password: password("12345671"), -// // }, -// // ]) -// // .onConflictDoNothing() -// // .returning(); - -// // console.log("\nSemillas Update:", authenticationR.length); -// } - -// seed().catch((e) => { -// console.error(e); -// process.exit(1); -// }); From 8c420ff4f5b080c26d1c28fd9d5a685876a28555 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:20:32 -0600 Subject: [PATCH 2/5] refactor: update package.json to use TypeScript source files instead of compiled JavaScript --- packages/server/package.json | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index fc531d540..3b249a65b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,32 +1,21 @@ { "name": "@dokploy/server", "version": "1.0.0", - "main": "./dist/index.js", + "main": "./src/index.ts", "type": "module", "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.cjs.js" - }, + ".": "./src/index.ts", "./db": { - "import": "./dist/db/index.js", + "import": "./src/db/index.ts", "require": "./dist/db/index.cjs.js" }, - "./*": { - "import": "./dist/*", - "require": "./dist/*.cjs" + "./setup/*": { + "import": "./src/setup/*.ts", + "require": "./dist/setup/index.cjs.js" }, - "./dist": { - "import": "./dist/index.js", - "require": "./dist/index.cjs.js" - }, - "./dist/db": { - "import": "./dist/db/index.js", - "require": "./dist/db/index.cjs.js" - }, - "./dist/db/schema": { - "import": "./dist/db/schema/index.js", - "require": "./dist/db/schema/index.cjs.js" + "./constants": { + "import": "./src/constants/index.ts", + "require": "./dist/constants.cjs.js" } }, "scripts": { From 03588bf375544ac1d284ebe39227372555e8af85 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:21:01 -0600 Subject: [PATCH 3/5] chore: remove console.log statement from esbuild configuration --- apps/dokploy/esbuild.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/dokploy/esbuild.config.ts b/apps/dokploy/esbuild.config.ts index 6d96cf058..a1747ac55 100644 --- a/apps/dokploy/esbuild.config.ts +++ b/apps/dokploy/esbuild.config.ts @@ -19,7 +19,6 @@ function prepareDefine(config: DotenvParseOutput | undefined) { const define = prepareDefine(result.parsed); -console.log(define); try { esbuild .build({ From c42054b965e4dcfb27cff60fcbffba4e52075d55 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:22:42 -0600 Subject: [PATCH 4/5] feat(migration): implement database migration functionality using drizzle-orm --- apps/dokploy/server/db/migration.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/dokploy/server/db/migration.ts diff --git a/apps/dokploy/server/db/migration.ts b/apps/dokploy/server/db/migration.ts new file mode 100644 index 000000000..fa2e1a80f --- /dev/null +++ b/apps/dokploy/server/db/migration.ts @@ -0,0 +1,21 @@ +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; + +const connectionString = process.env.DATABASE_URL!; + +const sql = postgres(connectionString, { max: 1 }); +const db = drizzle(sql); + +export const migration = async () => + await migrate(db, { migrationsFolder: "drizzle" }) + .then(() => { + console.log("Migration complete"); + sql.end(); + }) + .catch((error) => { + console.log("Migration failed", error); + }) + .finally(() => { + sql.end(); + }); From aa434cbdeab8a2506c48ac0ecc811e91425837a3 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:25:04 -0600 Subject: [PATCH 5/5] feat(db): add database connection setup using drizzle-orm for PostgreSQL --- packages/server/src/db/index.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 packages/server/src/db/index.ts diff --git a/packages/server/src/db/index.ts b/packages/server/src/db/index.ts new file mode 100644 index 000000000..3ac6e3940 --- /dev/null +++ b/packages/server/src/db/index.ts @@ -0,0 +1,21 @@ +import { drizzle, type PostgresJsDatabase } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as schema from "./schema"; + +declare global { + var db: PostgresJsDatabase | undefined; +} + +export let db: PostgresJsDatabase; +if (process.env.NODE_ENV === "production") { + db = drizzle(postgres(process.env.DATABASE_URL!), { + schema, + }); +} else { + if (!global.db) + global.db = drizzle(postgres(process.env.DATABASE_URL!), { + schema, + }); + + db = global.db; +}