From 17f333ac2a5c789f6426c1d56daa44763ee5c7c2 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 24 Aug 2025 23:44:00 -0600 Subject: [PATCH] =?UTF-8?q?Revert=20"refactor:=20update=20database=20conne?= =?UTF-8?q?ction=20handling=20and=20remove=20unused=20migra=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dokploy/esbuild.config.ts | 5 - apps/dokploy/migrate.ts | 149 +++++++++++++++++++++++ apps/dokploy/server/db/index.ts | 8 +- apps/dokploy/server/db/seed.ts | 29 +++++ packages/server/package.json | 2 +- packages/server/src/db/drizzle.config.ts | 14 +++ packages/server/src/db/migration.ts | 21 ++++ packages/server/src/db/reset.ts | 23 ++++ packages/server/src/db/seed.ts | 35 ++++++ 9 files changed, 274 insertions(+), 12 deletions(-) create mode 100644 apps/dokploy/migrate.ts create mode 100644 apps/dokploy/server/db/seed.ts create mode 100644 packages/server/src/db/drizzle.config.ts create mode 100644 packages/server/src/db/migration.ts create mode 100644 packages/server/src/db/reset.ts create mode 100644 packages/server/src/db/seed.ts diff --git a/apps/dokploy/esbuild.config.ts b/apps/dokploy/esbuild.config.ts index a1747ac55..c84135e5d 100644 --- a/apps/dokploy/esbuild.config.ts +++ b/apps/dokploy/esbuild.config.ts @@ -7,10 +7,6 @@ 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); } @@ -18,7 +14,6 @@ function prepareDefine(config: DotenvParseOutput | undefined) { } const define = prepareDefine(result.parsed); - try { esbuild .build({ diff --git a/apps/dokploy/migrate.ts b/apps/dokploy/migrate.ts new file mode 100644 index 000000000..e1f52c9a3 --- /dev/null +++ b/apps/dokploy/migrate.ts @@ -0,0 +1,149 @@ +// 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 55d6d3a46..3ac6e3940 100644 --- a/apps/dokploy/server/db/index.ts +++ b/apps/dokploy/server/db/index.ts @@ -6,18 +6,14 @@ 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(dbUrl!), { + db = drizzle(postgres(process.env.DATABASE_URL!), { schema, }); } else { if (!global.db) - global.db = drizzle(postgres(dbUrl!), { + global.db = drizzle(postgres(process.env.DATABASE_URL!), { schema, }); diff --git a/apps/dokploy/server/db/seed.ts b/apps/dokploy/server/db/seed.ts new file mode 100644 index 000000000..5b3eb6c62 --- /dev/null +++ b/apps/dokploy/server/db/seed.ts @@ -0,0 +1,29 @@ +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 3b249a65b..dbf7d3c65 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -111,4 +111,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 new file mode 100644 index 000000000..60a3bb937 --- /dev/null +++ b/packages/server/src/db/drizzle.config.ts @@ -0,0 +1,14 @@ +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/migration.ts b/packages/server/src/db/migration.ts new file mode 100644 index 000000000..6fada0833 --- /dev/null +++ b/packages/server/src/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(); +// }); diff --git a/packages/server/src/db/reset.ts b/packages/server/src/db/reset.ts new file mode 100644 index 000000000..c22291478 --- /dev/null +++ b/packages/server/src/db/reset.ts @@ -0,0 +1,23 @@ +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 new file mode 100644 index 000000000..7e2736b00 --- /dev/null +++ b/packages/server/src/db/seed.ts @@ -0,0 +1,35 @@ +// 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); +// });