Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
24cc455
fix: improve responsive layout for application logs page
TuroYT Apr 9, 2026
36ba9fc
feat: add "Deploy with Fresh Volumes" button for Docker Compose projects
lamualfa Apr 10, 2026
c668f6c
fix: add env -i PATH prefix to fresh volumes down command
lamualfa Apr 10, 2026
6204415
fix: honour metaName for page titles and show a loading state in requ…
Shivam8584 Aug 8, 2026
479e8bb
feat: refactor serviceColumns for project access and enhance data ret…
shuv-o Aug 17, 2026
80859dc
feat(vault): add Phase.dev secrets provider
Aug 18, 2026
e3f4310
Merge branch 'Dokploy:canary' into canary
shuv-o Aug 19, 2026
9c4ad14
feat(dns): rework provider management and support all record types
logical-tech Aug 21, 2026
db2eb4f
fix(dns): send SRV and CAA values to Cloudflare as structured data
logical-tech Aug 21, 2026
130be40
fix(dns): keep the record table on a valid page while filtering
logical-tech Aug 21, 2026
38e855b
fix(dns): preserve every value of a Route53 record set
logical-tech Aug 21, 2026
74d2d41
feat: add Porkbun DNS provider support
outeiroDev Aug 22, 2026
c6f81ce
Merge branch 'Dokploy:canary' into canary
shuv-o Aug 26, 2026
e79239a
fix: detect billing plan across all active Stripe subscriptions
Siumauricio Aug 31, 2026
3f6dfba
fix: only sum currentPriceAmount from the identified plan subscription
Siumauricio Aug 31, 2026
f1e2467
fix/docker-context-path-default: Placeholder with name attribute "doc…
drago1520 Aug 31, 2026
ccfc448
Merge branch 'canary' into fix/responsive-application-logs
TuroYT Aug 31, 2026
e0a9b83
Merge pull request #4180 from TuroYT/fix/responsive-application-logs
narcisonunez Aug 31, 2026
0971e19
Merge branch 'Dokploy:canary' into canary
shuv-o Aug 31, 2026
dada304
feat: allow reset-password script to target a specific user by email
shuv-o Aug 31, 2026
714bf03
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 31, 2026
8db39a8
fix: normalize email argument before lookup in reset-password
shuv-o Aug 31, 2026
7e9b77e
fix: surface the error state instead of "No results." when the log qu…
Shivam8584 Aug 31, 2026
d6ec4bd
fix: prevent deployment commit hash overflow on mobile
rakeshbhugra Aug 31, 2026
1f5f557
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 31, 2026
d181384
Merge pull request #5238 from rakeshbhugra/fix/deployment-commit-hash…
narcisonunez Aug 31, 2026
5345c00
Merge pull request #5237 from shuv-o/feat/reset-password-by-email
narcisonunez Aug 31, 2026
142082f
Merge pull request #5237 from shuv-o/feat/reset-password-by-email
narcisonunez Aug 31, 2026
1ff9294
chore: sync hotfix from main into canary [skip ci]
Aug 31, 2026
a36739e
Merge remote-tracking branch 'origin/canary' into fix/ui-polish-bugs
narcisonunez Aug 31, 2026
880bb55
fix failing test
narcisonunez Aug 31, 2026
e8f4a17
Merge pull request #5014 from Shivam8584/fix/ui-polish-bugs
narcisonunez Aug 31, 2026
ec8e645
fix: only pin --project-directory when compose has mounts
Siumauricio Sep 1, 2026
a1c5701
Merge pull request #5243 from Dokploy/fix/compose-project-directory-b…
Siumauricio Sep 1, 2026
4730807
fix: persist serverThreshold for gotify/ntfy and guard teams dispatch
Siumauricio Sep 1, 2026
a63157c
Merge pull request #5244 from Dokploy/fix/notification-server-thresho…
Siumauricio Sep 1, 2026
91bcf88
fix: use updateJob to replace repeatable schedule job on update in cloud
Siumauricio Sep 1, 2026
4e38925
fix: pass timezone when removing repeatable schedule job
Siumauricio Sep 1, 2026
48e0b74
Merge pull request #5245 from Dokploy/fix/schedule-cloud-update-orpha…
Siumauricio Sep 1, 2026
57c221d
[autofix.ci] apply automated fixes
autofix-ci[bot] Sep 1, 2026
68a0555
fix: write remote traefik config via SFTP instead of exec+base64
Siumauricio Sep 1, 2026
d7ea9cf
Merge pull request #5246 from Dokploy/fix/traefik-remote-config-sftp-…
Siumauricio Sep 1, 2026
5624dff
fix: verify swarm task convergence before marking db deploys done
Siumauricio Sep 1, 2026
3c95912
Merge pull request #5247 from Dokploy/fix/db-deploy-swarm-convergence…
Siumauricio Sep 1, 2026
4453c55
Remove unused journal entry for phase vault provider from _journal.json
Siumauricio Sep 1, 2026
50479f2
Merge branch 'canary' into feat/vault-phase-provider
Siumauricio Sep 1, 2026
a194e1e
Add entry for volatile piledriver in journal with version 7
Siumauricio Sep 1, 2026
43178b6
[autofix.ci] apply automated fixes
autofix-ci[bot] Sep 1, 2026
53a6e92
Merge pull request #5123 from barrynorman/feat/vault-phase-provider
Siumauricio Sep 1, 2026
1ab4a8a
Merge branch 'canary' into feat/dns-records-management
Siumauricio Sep 1, 2026
f1a4f43
refactor: remove DnsPageTransition component and update loading indic…
Siumauricio Sep 1, 2026
e7eb20d
Remove unused journal entry for porkbun DNS provider from _journal.json
Siumauricio Sep 1, 2026
9c444eb
Merge branch 'canary' into feat/porkbun-dns-provider
Siumauricio Sep 1, 2026
1443500
Add new journal entry for wooden_nextwave version 7
Siumauricio Sep 1, 2026
8639605
Merge pull request #5165 from outeiroDev/feat/porkbun-dns-provider
Siumauricio Sep 1, 2026
8cd2ba8
Merge branch 'canary' into feat/dns-records-management
Siumauricio Sep 1, 2026
78fe5e3
Merge pull request #5150 from logical-tech/feat/dns-records-management
Siumauricio Sep 1, 2026
23b1580
bump version to v0.30.4 in package.json
Siumauricio Sep 1, 2026
3a6e18b
Merge pull request #5228 from Dokploy/fix/hubspot-chat-multi-subscrip…
Siumauricio Sep 1, 2026
50acb79
feat: bulk import secrets from vault providers
Siumauricio Sep 1, 2026
8b5c14c
test: fix stale traefik remote-write test expectation
Siumauricio Sep 1, 2026
0478f34
Merge pull request #5250 from Dokploy/feat/vault-bulk-import
Siumauricio Sep 1, 2026
0276021
feat: list associated services in delete server modal
Siumauricio Sep 1, 2026
e1a432d
Merge pull request #5251 from Dokploy/feat/delete-server-services
Siumauricio Sep 1, 2026
a426140
fix: don't leak git provider secrets to non-owner org members
Siumauricio Sep 1, 2026
6239073
fix: strip git provider secrets from compose.one response
Siumauricio Sep 1, 2026
c225188
Merge pull request #5253 from Dokploy/fix/git-provider-secret-leak
Siumauricio Sep 1, 2026
27dab3f
Merge pull request #5249 from Dokploy/canary
Siumauricio Sep 1, 2026
a424f64
chore(api): add local Inngest dev server script
Siumauricio Sep 2, 2026
2e2e0c8
feat: cloud onboarding wizard, billing trial card, and post-checkout …
Siumauricio Sep 2, 2026
0dcfcc1
[autofix.ci] apply automated fixes
autofix-ci[bot] Sep 2, 2026
c32c8d0
Merge pull request #5264 from Dokploy/feat/cloud-onboarding-plan-gate
Siumauricio Sep 2, 2026
e67d9ef
Merge pull request #5231 from drago1520/fix/docker-context-path-default
Siumauricio Sep 2, 2026
56eaa93
Merge branch 'canary' into feat/compose-deploy-fresh-volumes
Siumauricio Sep 2, 2026
c5f1292
[autofix.ci] apply automated fixes
autofix-ci[bot] Sep 2, 2026
fff5612
Merge pull request #4195 from lamualfa/feat/compose-deploy-fresh-volumes
Siumauricio Sep 2, 2026
344febb
bump version to v0.30.5
Siumauricio Sep 2, 2026
f67fab0
Merge pull request #5267 from Dokploy/canary
Siumauricio Sep 2, 2026
04966df
Merge upstream v0.30.5 into canary
AminDhouib Sep 6, 2026
aedf20b
chore(db): re-issue upstream 0188-0190 as fork migration 0199
AminDhouib Sep 6, 2026
513cc2f
docs: record v0.30.5 sync decisions in UPSTREAM_SYNC.md
AminDhouib Sep 6, 2026
a09189f
test(deploy): adapt the real Dockerfile build to upstream's new defau…
AminDhouib Sep 6, 2026
7f5cae9
feat(preview): add Gitea/Forgejo support for preview deployments
ankit8697 Sep 6, 2026
a89f1a6
feat(preview): extend Gitea previews to compose, the author gate and …
AminDhouib Sep 6, 2026
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
10 changes: 9 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,20 @@ pnpm run docker:push

## Password Reset

In the case you lost your password, you can reset it using the following command
In the case you lost your password, you can reset the owner's password using the following command

```bash
pnpm run reset-password
```

To reset the password of a specific user instead, pass their email as an argument

```bash
pnpm run reset-password -- user@example.com
```

Both commands print the new randomly generated password to the console.

If you want to test the webhooks on development mode using localtunnel, make sure to install [`localtunnel`](https://localtunnel.app/)

```bash
Expand Down
10 changes: 10 additions & 0 deletions apps/api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,13 @@ npm run dev
```
open http://localhost:3000
```

## Inngest

This service uses Inngest to queue deployments. Run the local dev server in a separate terminal:

```
npm run dev:inngest
```

It syncs with the app at `http://localhost:4000/api/inngest` and serves its dashboard at `http://localhost:8288`.
1 change: 1 addition & 0 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"type": "module",
"scripts": {
"dev": "PORT=4000 tsx watch src/index.ts",
"dev:inngest": "npx --yes inngest-cli@1.9.0 dev -u http://localhost:4000/api/inngest --no-discovery",
"build": "rimraf dist && tsc --project tsconfig.json",
"start": "node dist/index.js",
"typecheck": "tsc --noEmit"
Expand Down
65 changes: 65 additions & 0 deletions apps/dokploy/__test__/compose/compose-project-directory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,69 @@ describe("compose createCommand --project-directory", () => {
);
expect(cmd).toContain("-f docker-compose.yml");
});

it("resolves build.context against the compose file's own directory when there are no mounts", () => {
const cmd = createCommand({
...base,
composePath: "./backend/docker-compose.yml",
} as any);

expect(cmd).not.toContain("--project-directory");
expect(cmd).toContain("-f ./backend/docker-compose.yml");
});
});

describe("compose createCommand --env-file", () => {
it("points --env-file at the generated .env next to a nested compose file", () => {
const cmd = createCommand(
{
...base,
composePath: "./deploy/docker-compose.yml",
createEnvFile: true,
} as any,
"/etc/dokploy/compose/compose-app/code",
);

expect(cmd).toContain("--env-file deploy/.env");
expect(cmd).toContain(
"--project-directory /etc/dokploy/compose/compose-app/code",
);
});

it("omits --env-file when createEnvFile is disabled", () => {
const cmd = createCommand(
{ ...base, composePath: "./deploy/docker-compose.yml" } as any,
"/etc/dokploy/compose/compose-app/code",
);

expect(cmd).not.toContain("--env-file");
});

it("uses the code-root .env for raw sourceType", () => {
const cmd = createCommand(
{
...base,
sourceType: "raw",
composePath: "docker-compose.yml",
createEnvFile: true,
} as any,
"/etc/dokploy/compose/compose-app/code",
);

expect(cmd).toContain("--env-file .env");
});

it("does not add --env-file to stack deploy (unsupported flag)", () => {
const cmd = createCommand(
{
...base,
composeType: "stack",
composePath: "./deploy/docker-compose.yml",
createEnvFile: true,
} as any,
"/etc/dokploy/compose/compose-app/code",
);

expect(cmd).not.toContain("--env-file");
});
});
12 changes: 12 additions & 0 deletions apps/dokploy/__test__/deploy/application.real.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ vi.mock("@dokploy/server/services/deployment", () => ({
createDeployment: vi.fn(),
updateDeploymentStatus: vi.fn(),
updateDeployment: vi.fn(),
// deployApplication's catch block calls this. Without it in the mock, any
// real deploy failure is reported as "No getDeploymentErrorMessage export is
// defined on the mock" and the actual build error is lost.
getDeploymentErrorMessage: vi.fn().mockResolvedValue("Error building"),
}));

vi.mock("@dokploy/server/utils/notifications/build-success", () => ({
Expand Down Expand Up @@ -455,6 +459,14 @@ describe(
buildType: "dockerfile",
customGitBuildPath: "/deno",
dockerfile: "Dockerfile",
// Upstream v0.30.5 (f1e2467bb) changed the *default* build context
// from "the directory holding the Dockerfile" to the repository
// root, so the UI placeholder claiming the default is "." is now
// true. examples/deno/Dockerfile does `COPY deno.json .`, which
// only resolves when the context is the deno/ directory, so the
// context now has to be stated explicitly - exactly the migration
// every existing subdirectory-Dockerfile app has to make.
dockerContextPath: "/deno",
});
currentAppName = dockerfileAppName;
allTestAppNames.push(dockerfileAppName);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
[
{
"headers": {
"content-type": "application/json",
"x-github-event": "pull_request",
"x-gitea-delivery": "00000000-0000-0000-0000-000000000000",
"x-gitea-event": "pull_request",
"x-gitea-event-type": "pull_request"
},
"body": {
"action": "opened",
"number": 1,
"repository": {
"name": "web",
"full_name": "repoowner/web",
"owner": {
"login": "repoowner"
}
},
"pull_request": {
"id": 1,
"number": 1,
"title": "Add a thing",
"html_url": "http://localhost:3939/repoowner/web/pulls/1",
"merged": false,
"user": {
"login": "writer"
},
"labels": [],
"base": {
"ref": "main"
},
"head": {
"ref": "feature/thing",
"sha": "d2253306c8cccbc2b76bbaea89092d23db7778f3",
"repo": {
"name": "web",
"owner": {
"login": "repoowner"
}
}
}
}
}
},
{
"headers": {
"content-type": "application/json",
"x-github-event": "pull_request",
"x-gitea-delivery": "00000000-0000-0000-0000-000000000001",
"x-gitea-event": "pull_request",
"x-gitea-event-type": "pull_request_sync"
},
"body": {
"action": "synchronized",
"number": 1,
"repository": {
"name": "web",
"full_name": "repoowner/web",
"owner": {
"login": "repoowner"
}
},
"pull_request": {
"id": 1,
"number": 1,
"title": "Add a thing",
"html_url": "http://localhost:3939/repoowner/web/pulls/1",
"merged": false,
"user": {
"login": "writer"
},
"labels": [],
"base": {
"ref": "main"
},
"head": {
"ref": "feature/thing",
"sha": "03ed76d4fc6b09b7e793dc009f918f47aeca45c1",
"repo": {
"name": "web",
"owner": {
"login": "repoowner"
}
}
}
}
}
},
{
"headers": {
"content-type": "application/json",
"x-github-event": "pull_request",
"x-gitea-delivery": "00000000-0000-0000-0000-000000000002",
"x-gitea-event": "pull_request",
"x-gitea-event-type": "pull_request_label"
},
"body": {
"action": "label_updated",
"number": 1,
"repository": {
"name": "web",
"full_name": "repoowner/web",
"owner": {
"login": "repoowner"
}
},
"pull_request": {
"id": 1,
"number": 1,
"title": "Add a thing",
"html_url": "http://localhost:3939/repoowner/web/pulls/1",
"merged": false,
"user": {
"login": "writer"
},
"labels": [
{
"name": "preview"
}
],
"base": {
"ref": "main"
},
"head": {
"ref": "feature/thing",
"sha": "03ed76d4fc6b09b7e793dc009f918f47aeca45c1",
"repo": {
"name": "web",
"owner": {
"login": "repoowner"
}
}
}
}
}
},
{
"headers": {
"content-type": "application/json",
"x-github-event": "pull_request",
"x-gitea-delivery": "00000000-0000-0000-0000-000000000003",
"x-gitea-event": "pull_request",
"x-gitea-event-type": "pull_request_label"
},
"body": {
"action": "label_cleared",
"number": 1,
"repository": {
"name": "web",
"full_name": "repoowner/web",
"owner": {
"login": "repoowner"
}
},
"pull_request": {
"id": 1,
"number": 1,
"title": "Add a thing",
"html_url": "http://localhost:3939/repoowner/web/pulls/1",
"merged": false,
"user": {
"login": "writer"
},
"labels": [
{
"name": "preview"
}
],
"base": {
"ref": "main"
},
"head": {
"ref": "feature/thing",
"sha": "03ed76d4fc6b09b7e793dc009f918f47aeca45c1",
"repo": {
"name": "web",
"owner": {
"login": "repoowner"
}
}
}
}
}
},
{
"headers": {
"content-type": "application/json",
"x-github-event": "issue_comment",
"x-gitea-delivery": "00000000-0000-0000-0000-000000000004",
"x-gitea-event": "issue_comment",
"x-gitea-event-type": "pull_request_comment"
},
"body": {
"action": "created",
"number": null,
"repository": {
"name": "web",
"full_name": "repoowner/web",
"owner": {
"login": "repoowner"
}
},
"pull_request": {
"id": 1,
"number": 1,
"title": "Add a thing",
"html_url": "http://localhost:3939/repoowner/web/pulls/1",
"merged": false,
"user": {
"login": "writer"
},
"labels": [],
"base": {
"ref": "main"
},
"head": {
"ref": "feature/thing",
"sha": "03ed76d4fc6b09b7e793dc009f918f47aeca45c1",
"repo": {
"name": "web",
"owner": {
"login": "repoowner"
}
}
}
}
}
}
]
Loading