Skip to content

Commit d4719ec

Browse files
authored
Merge pull request #3845 from Dokploy/canary
🚀 Release v0.28.2
2 parents e679a32 + 8d56544 commit d4719ec

File tree

11 files changed

+106
-56
lines changed

11 files changed

+106
-56
lines changed

apps/dokploy/__test__/deploy/application.command.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ vi.mock("@dokploy/server/db", () => {
1414
set: vi.fn(() => chain),
1515
where: vi.fn(() => chain),
1616
returning: vi.fn().mockResolvedValue([{}] as any),
17+
from: vi.fn(() => chain),
18+
innerJoin: vi.fn(() => chain),
19+
then: (resolve: (v: any) => void) => {
20+
resolve([]);
21+
},
1722
} as any;
1823
return chain;
1924
};
2025

2126
return {
2227
db: {
23-
select: vi.fn(),
28+
select: vi.fn(() => createChainableMock()),
2429
insert: vi.fn(),
2530
update: vi.fn(() => createChainableMock()),
2631
delete: vi.fn(),
@@ -31,6 +36,9 @@ vi.mock("@dokploy/server/db", () => {
3136
patch: {
3237
findMany: vi.fn().mockResolvedValue([]),
3338
},
39+
member: {
40+
findMany: vi.fn().mockResolvedValue([]),
41+
},
3442
},
3543
},
3644
};

apps/dokploy/__test__/deploy/application.real.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ vi.mock("@dokploy/server/db", () => {
1515
set: vi.fn(() => chain),
1616
where: vi.fn(() => chain),
1717
returning: vi.fn().mockResolvedValue([{}]),
18+
from: vi.fn(() => chain),
19+
innerJoin: vi.fn(() => chain),
20+
then: (resolve: (v: any) => void) => {
21+
resolve([]);
22+
},
1823
};
1924
return chain;
2025
};
2126

2227
return {
2328
db: {
24-
select: vi.fn(),
29+
select: vi.fn(() => createChainableMock()),
2530
insert: vi.fn(),
2631
update: vi.fn(() => createChainableMock()),
2732
delete: vi.fn(),
@@ -32,6 +37,9 @@ vi.mock("@dokploy/server/db", () => {
3237
patch: {
3338
findMany: vi.fn().mockResolvedValue([]),
3439
},
40+
member: {
41+
findMany: vi.fn().mockResolvedValue([]),
42+
},
3543
},
3644
},
3745
};

apps/dokploy/__test__/setup.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ vi.mock("@dokploy/server/db", () => {
1212
chain.where = () => chain;
1313
chain.values = () => chain;
1414
chain.returning = () => Promise.resolve([{}]);
15-
chain.then = undefined;
15+
chain.from = () => chain;
16+
chain.innerJoin = () => chain;
17+
chain.then = (resolve: (value: unknown) => void) => {
18+
resolve([]);
19+
};
1620

1721
const tableMock = {
1822
findFirst: vi.fn(() => Promise.resolve(undefined)),
@@ -21,7 +25,6 @@ vi.mock("@dokploy/server/db", () => {
2125
update: vi.fn(() => chain),
2226
delete: vi.fn(() => chain),
2327
};
24-
const createQueryMock = () => tableMock;
2528

2629
return {
2730
db: {

apps/dokploy/components/dashboard/settings/git/github/add-github-provider.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const AddGithubProvider = () => {
3030
const url = document.location.origin;
3131
const manifest = JSON.stringify(
3232
{
33-
redirect_url: `${origin}/api/providers/github/setup?organizationId=${activeOrganization?.id}&userId=${session?.user?.id}`,
33+
redirect_url: `${origin}/api/providers/github/setup?organizationId=${activeOrganization?.id ?? ""}&userId=${session?.user?.id ?? ""}`,
3434
name: `Dokploy-${format(new Date(), "yyyy-MM-dd")}-${randomString()}`,
3535
url: origin,
3636
hook_attributes: {
@@ -52,7 +52,7 @@ export const AddGithubProvider = () => {
5252
);
5353

5454
setManifest(manifest);
55-
}, [data?.id]);
55+
}, [data?.id, activeOrganization?.id, session?.user?.id]);
5656

5757
return (
5858
<Dialog open={isOpen} onOpenChange={setIsOpen}>
@@ -131,7 +131,11 @@ export const AddGithubProvider = () => {
131131
Unsure if you already have an app?
132132
</a>
133133
<Button
134-
disabled={isOrganization && organizationName.length < 1}
134+
disabled={
135+
(isOrganization && organizationName.length < 1) ||
136+
!activeOrganization?.id ||
137+
!session?.user?.id
138+
}
135139
type="submit"
136140
className="self-end"
137141
>

apps/dokploy/components/shared/breadcrumb-sidebar.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ interface Props {
3232
}
3333

3434
export const BreadcrumbSidebar = ({ list }: Props) => {
35-
console.log(list);
3635
return (
3736
<header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12">
3837
<div className="flex items-center justify-between w-full">

apps/dokploy/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dokploy",
3-
"version": "v0.28.1",
3+
"version": "v0.28.2",
44
"private": true,
55
"license": "Apache-2.0",
66
"type": "module",

apps/dokploy/proprietary/README.md

Lines changed: 0 additions & 18 deletions
This file was deleted.

apps/dokploy/server/db/index.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { dbUrl } from "@dokploy/server/db/constants";
2+
import * as schema from "@dokploy/server/db/schema";
3+
import { and, eq } from "drizzle-orm";
4+
import { drizzle, type PostgresJsDatabase } from "drizzle-orm/postgres-js";
5+
import postgres from "postgres";
6+
7+
export { and, eq };
8+
9+
type Database = PostgresJsDatabase<typeof schema>;
10+
/**
11+
* Evita problemas de redeclaración global en monorepos.
12+
* No usamos `declare global`.
13+
*/
14+
const globalForDb = globalThis as unknown as {
15+
db?: Database;
16+
};
17+
18+
let dbConnection: Database;
19+
20+
if (process.env.NODE_ENV === "production") {
21+
// En producción no usamos global cache
22+
dbConnection = drizzle(postgres(dbUrl), {
23+
schema,
24+
});
25+
} else {
26+
// En desarrollo reutilizamos conexión para evitar múltiples conexiones
27+
if (!globalForDb.db) {
28+
globalForDb.db = drizzle(postgres(dbUrl), {
29+
schema,
30+
});
31+
}
32+
33+
dbConnection = globalForDb.db;
34+
}
35+
36+
export const db: Database = dbConnection;
37+
38+
export { dbUrl };

packages/server/src/lib/auth.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,25 @@ const { handler, api } = betterAuth({
7373
disabled: process.env.NODE_ENV === "production",
7474
},
7575
async trustedOrigins() {
76-
const trustedOrigins = await getTrustedOrigins();
7776
if (IS_CLOUD) {
78-
return trustedOrigins;
77+
return getTrustedOrigins();
7978
}
80-
const settings = await getWebServerSettings();
81-
if (!settings) {
82-
return [];
83-
}
84-
return [
85-
...(settings?.serverIp ? [`http://${settings?.serverIp}:3000`] : []),
86-
...(settings?.host ? [`https://${settings?.host}`] : []),
87-
...(process.env.NODE_ENV === "development"
79+
const [trustedOrigins, settings] = await Promise.all([
80+
getTrustedOrigins(),
81+
getWebServerSettings(),
82+
]);
83+
if (!settings) return [];
84+
const devOrigins =
85+
process.env.NODE_ENV === "development"
8886
? [
8987
"http://localhost:3000",
9088
"https://absolutely-handy-falcon.ngrok-free.app",
9189
]
92-
: []),
90+
: [];
91+
return [
92+
...(settings?.serverIp ? [`http://${settings?.serverIp}:3000`] : []),
93+
...(settings?.host ? [`https://${settings?.host}`] : []),
94+
...devOrigins,
9395
...trustedOrigins,
9496
];
9597
},

packages/server/src/services/admin.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -117,23 +117,33 @@ export const getDokployUrl = async () => {
117117
return `http://${settings?.serverIp}:${process.env.PORT}`;
118118
};
119119

120+
const TRUSTED_ORIGINS_CACHE_TTL_MS = 30 * 60_000;
121+
let trustedOriginsCache: { data: string[]; expiresAt: number } | null = null;
122+
120123
export const getTrustedOrigins = async () => {
121-
const members = await db.query.member.findMany({
122-
where: eq(member.role, "owner"),
123-
with: {
124-
user: true,
125-
},
126-
});
124+
const runQuery = async () => {
125+
const rows = await db
126+
.select({ trustedOrigins: user.trustedOrigins })
127+
.from(member)
128+
.innerJoin(user, eq(member.userId, user.id))
129+
.where(eq(member.role, "owner"));
130+
return Array.from(new Set(rows.flatMap((r) => r.trustedOrigins ?? [])));
131+
};
127132

128-
if (members.length === 0) {
129-
return [];
133+
if (IS_CLOUD) {
134+
const now = Date.now();
135+
if (trustedOriginsCache && now < trustedOriginsCache.expiresAt) {
136+
return trustedOriginsCache.data;
137+
}
138+
const trustedOrigins = await runQuery();
139+
trustedOriginsCache = {
140+
data: trustedOrigins,
141+
expiresAt: now + TRUSTED_ORIGINS_CACHE_TTL_MS,
142+
};
143+
return trustedOrigins;
130144
}
131145

132-
const trustedOrigins = members.flatMap(
133-
(member) => member.user.trustedOrigins || [],
134-
);
135-
136-
return Array.from(new Set(trustedOrigins));
146+
return runQuery();
137147
};
138148

139149
export const getTrustedProviders = async () => {

0 commit comments

Comments
 (0)