Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
4b44bc8
fix: allow all organization members to access requests functionality …
Harikrishnan1367709 Sep 26, 2025
f7ddc71
chore: naming of redis volume has been made understandable
fir4tozden Nov 16, 2025
b2264a9
chore: naming of postgres volume has been made understandable
fir4tozden Nov 16, 2025
8ca8839
fix: update mount path on editing pg image
Bima42 Nov 18, 2025
d08fdeb
fix: only upgrade those that use default pg path
Bima42 Nov 18, 2025
052fc5f
fix: server time is incorrect
Nov 19, 2025
daff2ad
[autofix.ci] apply automated fixes
autofix-ci[bot] Nov 19, 2025
8a93116
fix: update docker cleanup commands to include --all options
fir4tozden Nov 19, 2025
e86cacc
Merge branch 'Dokploy:canary' into canary
fir4tozden Nov 19, 2025
153390f
Update settings.ts
fir4tozden Nov 19, 2025
e88a9ce
fix: update input handling in application components
Nov 21, 2025
d18fe83
Merge pull request #3082 from Dokploy/3077-cant-put-space-in-services…
Siumauricio Nov 21, 2025
b12e84c
feat: add SQL script to standardize date formats in environment table
Nov 21, 2025
f046ba4
Merge pull request #3083 from Dokploy/2992-inconsistent-date-formats-…
Siumauricio Nov 21, 2025
4840abe
Specify Docker version in installation script
Siumauricio Nov 22, 2025
e136934
Fix newline at end of .env.example file
Siumauricio Nov 25, 2025
73d87c0
feat: enhance error handling in deployment processes
Nov 26, 2025
dbe1733
refactor: update execAsync options type for improved flexibility
Nov 26, 2025
8aff1e7
refactor: simplify execAsync options type for better clarity
Nov 26, 2025
e316bea
Merge pull request #3104 from Dokploy/fix/error-parsing
Siumauricio Nov 26, 2025
965f05c
refactor: improve cleanup operation handling in postgres router
Nov 26, 2025
eb8c6e4
Merge pull request #3105 from Dokploy/Failed-to-schedule-a-backup-for…
Siumauricio Nov 26, 2025
23b2353
refactor: move getMountPath function to services and update logic
Nov 26, 2025
736a732
refactor: remove unused mount-related logic from postgres router
Nov 26, 2025
4fb3ad3
Merge pull request #3048 from Bima42/fix/update-pg-data-path
Siumauricio Nov 26, 2025
cd8c67b
feat: add additional rclone configuration options for S3 integration
Nov 26, 2025
60e6285
Merge pull request #3106 from Dokploy/2884-expired-authentication-not…
Siumauricio Nov 26, 2025
7da1be8
fix: update rclone S3 flags to use quotes for improved parsing
Nov 26, 2025
062037a
Merge pull request #3107 from Dokploy/2883-s3-destinations-test-conne…
Siumauricio Nov 26, 2025
891260f
fix: correct GitLab API URL by removing 'owned' parameter from projec…
Nov 26, 2025
e70c476
Merge pull request #3108 from Dokploy/2690-when-querying-gitlab-proje…
Siumauricio Nov 26, 2025
7833246
refactor: enhance user management actions in dashboard
Nov 26, 2025
ff82248
Merge pull request #3109 from Dokploy/3097-actions-section-not-workin…
Siumauricio Nov 26, 2025
45b75fd
refactor: remove TableCaption from user display in dashboard settings
Nov 26, 2025
5574874
Merge pull request #3110 from Dokploy/3096-show-all-users-not-working…
Siumauricio Nov 26, 2025
bacadcc
refactor: improve error handling in notification components
Nov 26, 2025
33d4f57
Merge pull request #3112 from Dokploy/Email-test-notification-always-…
Siumauricio Nov 26, 2025
ff27f08
feat: add Railpack installation command to builder script
Nov 26, 2025
5d53cf4
Merge pull request #3113 from Dokploy/Wrong-Railpack-version-in-the-b…
Siumauricio Nov 26, 2025
e576c1a
Merge pull request #2698 from Harikrishnan1367709/Users-are-unable-to…
Siumauricio Nov 26, 2025
061ca6c
Merge pull request #3058 from shiqocred/canary
Siumauricio Nov 26, 2025
d3b7e68
Merge pull request #3032 from fir4tozden/canary
Siumauricio Nov 26, 2025
f61fb3a
chore: update dokploy version to v0.25.11
Nov 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ COPY --from=build /prod/dokploy/node_modules ./node_modules


# Install docker
RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh && curl https://rclone.org/install.sh | bash
RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh --version 28.5.2 && rm get-docker.sh && curl https://rclone.org/install.sh | bash

# Install Nixpacks and tsx
# | VERBOSE=1 VERSION=1.21.0 bash
Expand Down
2 changes: 1 addition & 1 deletion apps/dokploy/.env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
DATABASE_URL="postgres://dokploy:amukds4wi9001583845717ad2@localhost:5432/dokploy"
PORT=3000
NODE_ENV=development
NODE_ENV=development
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@ export const AddApplication = ({ environmentId, projectName }: Props) => {
placeholder="Frontend"
{...field}
onChange={(e) => {
const val = e.target.value?.trim() || "";
const serviceName = slugify(val);
const val = e.target.value || "";
const serviceName = slugify(val.trim());
form.setValue("appName", `${slug}-${serviceName}`);
field.onChange(val);
}}
Expand Down
4 changes: 2 additions & 2 deletions apps/dokploy/components/dashboard/project/add-compose.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,8 @@ export const AddCompose = ({ environmentId, projectName }: Props) => {
placeholder="Frontend"
{...field}
onChange={(e) => {
const val = e.target.value?.trim() || "";
const serviceName = slugify(val);
const val = e.target.value || "";
const serviceName = slugify(val.trim());
form.setValue("appName", `${slug}-${serviceName}`);
field.onChange(val);
}}
Expand Down
4 changes: 2 additions & 2 deletions apps/dokploy/components/dashboard/project/add-database.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,8 @@ export const AddDatabase = ({ environmentId, projectName }: Props) => {
placeholder="Name"
{...field}
onChange={(e) => {
const val = e.target.value?.trim() || "";
const serviceName = slugify(val);
const val = e.target.value || "";
const serviceName = slugify(val.trim());
form.setValue("appName", `${slug}-${serviceName}`);
field.onChange(val);
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1261,8 +1261,10 @@ export const HandleNotifications = ({ notificationId }: Props) => {
});
}
toast.success("Connection Success");
} catch {
toast.error("Error testing the provider");
} catch (error) {
toast.error(
`Error testing the provider ${error instanceof Error ? error.message : "Unknown error"}`,
);
}
}}
>
Expand Down
192 changes: 92 additions & 100 deletions apps/dokploy/components/dashboard/settings/users/show-users.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
Expand Down Expand Up @@ -68,7 +67,6 @@ export const ShowUsers = () => {
) : (
<div className="flex flex-col gap-4 min-h-[25vh]">
<Table>
<TableCaption>See all users</TableCaption>
<TableHeader>
<TableRow>
<TableHead className="w-[100px]">Email</TableHead>
Expand Down Expand Up @@ -111,35 +109,75 @@ export const ShowUsers = () => {
</TableCell>

<TableCell className="text-right flex justify-end">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="ghost"
className="h-8 w-8 p-0"
>
<span className="sr-only">Open menu</span>
<MoreHorizontal className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuLabel>
Actions
</DropdownMenuLabel>
{member.role !== "owner" && (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="ghost"
className="h-8 w-8 p-0"
>
<span className="sr-only">
Open menu
</span>
<MoreHorizontal className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuLabel>
Actions
</DropdownMenuLabel>

{member.role !== "owner" && (
<AddUserPermissions
userId={member.user.id}
/>
)}

{member.role !== "owner" && (
<>
{!isCloud && (
<DialogAction
title="Delete User"
description="Are you sure you want to delete this user?"
type="destructive"
onClick={async () => {
{!isCloud && (
<DialogAction
title="Delete User"
description="Are you sure you want to delete this user?"
type="destructive"
onClick={async () => {
await mutateAsync({
userId: member.user.id,
})
.then(() => {
toast.success(
"User deleted successfully",
);
refetch();
})
.catch(() => {
toast.error(
"Error deleting destination",
);
});
}}
>
<DropdownMenuItem
className="w-full cursor-pointer text-red-500 hover:!text-red-600"
onSelect={(e) => e.preventDefault()}
>
Delete User
</DropdownMenuItem>
</DialogAction>
)}

<DialogAction
title="Unlink User"
description="Are you sure you want to unlink this user?"
type="destructive"
onClick={async () => {
if (!isCloud) {
const orgCount =
await utils.user.checkUserOrganizations.fetch(
{
userId: member.user.id,
},
);

console.log(orgCount);

if (orgCount === 1) {
await mutateAsync({
userId: member.user.id,
})
Expand All @@ -151,86 +189,40 @@ export const ShowUsers = () => {
})
.catch(() => {
toast.error(
"Error deleting destination",
"Error deleting user",
);
});
}}
>
<DropdownMenuItem
className="w-full cursor-pointer text-red-500 hover:!text-red-600"
onSelect={(e) =>
e.preventDefault()
}
>
Delete User
</DropdownMenuItem>
</DialogAction>
)}

<DialogAction
title="Unlink User"
description="Are you sure you want to unlink this user?"
type="destructive"
onClick={async () => {
if (!isCloud) {
const orgCount =
await utils.user.checkUserOrganizations.fetch(
{
userId: member.user.id,
},
);

console.log(orgCount);

if (orgCount === 1) {
await mutateAsync({
userId: member.user.id,
})
.then(() => {
toast.success(
"User deleted successfully",
);
refetch();
})
.catch(() => {
toast.error(
"Error deleting user",
);
});
return;
}
return;
}
}

const { error } =
await authClient.organization.removeMember(
{
memberIdOrEmail: member.id,
},
);
const { error } =
await authClient.organization.removeMember(
{
memberIdOrEmail: member.id,
},
);

if (!error) {
toast.success(
"User unlinked successfully",
);
refetch();
} else {
toast.error(
"Error unlinking user",
);
}
}}
if (!error) {
toast.success(
"User unlinked successfully",
);
refetch();
} else {
toast.error("Error unlinking user");
}
}}
>
<DropdownMenuItem
className="w-full cursor-pointer text-red-500 hover:!text-red-600"
onSelect={(e) => e.preventDefault()}
>
<DropdownMenuItem
className="w-full cursor-pointer text-red-500 hover:!text-red-600"
onSelect={(e) => e.preventDefault()}
>
Unlink User
</DropdownMenuItem>
</DialogAction>
</>
)}
</DropdownMenuContent>
</DropdownMenu>
Unlink User
</DropdownMenuItem>
</DialogAction>
</DropdownMenuContent>
</DropdownMenu>
)}
</TableCell>
</TableRow>
);
Expand Down
20 changes: 13 additions & 7 deletions apps/dokploy/components/ui/time-badge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,20 @@ export function TimeBadge() {
.padStart(2, "0")}`;
};

const formattedTime = new Intl.DateTimeFormat("en-US", {
timeZone: serverTime.timezone,
timeStyle: "medium",
hour12: false,
}).format(time);

return (
<div className="inline-flex items-center gap-2 rounded-md border px-2 py-1 text-xs sm:text-sm whitespace-nowrap max-w-full overflow-hidden">
<span className="hidden sm:inline">Server Time:</span>
<span className="font-medium tabular-nums">
{time.toLocaleTimeString()}
</span>
<span className="hidden sm:inline text-muted-foreground">
({serverTime.timezone} | {getUtcOffset(serverTime.timezone)})
<div className="inline-flex items-center rounded-full border p-1 text-xs whitespace-nowrap max-w-full overflow-hidden gap-1">
<div className="inline-flex items-center px-1 gap-1">
<span className="hidden sm:inline">Server Time:</span>
<span className="font-medium tabular-nums">{formattedTime}</span>
</div>
<span className="hidden sm:inline text-primary/70 border rounded-full bg-foreground/5 px-1.5 py-0.5">
{serverTime.timezone} | {getUtcOffset(serverTime.timezone)}
</span>
</div>
);
Expand Down
9 changes: 9 additions & 0 deletions apps/dokploy/drizzle/0121_rainy_cargill.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- Fix inconsistent date formats in environment.createdAt field
-- Convert PostgreSQL timestamp format to ISO 8601 format
-- This addresses issue #2992 where old environments have PostgreSQL timestamp format
-- while new ones have ISO 8601 format

UPDATE "environment"
SET "createdAt" = to_char("createdAt"::timestamptz, 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')
WHERE "createdAt" NOT LIKE '%T%';

Loading