diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index d45c3dac0..e210811b0 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -8,7 +8,7 @@ Before submitting this PR, please make sure that:
- [ ] You created a dedicated branch based on the `canary` branch.
- [ ] You have read the suggestions in the CONTRIBUTING.md file https://github.com/Dokploy/dokploy/blob/canary/CONTRIBUTING.md#pull-request
-- [ ] You have tested this PR in your local instance.
+- [ ] You have tested this PR in your local instance. If you have not tested it yet, please do so before submitting. This helps avoid wasting maintainers' time reviewing code that has not been verified by you.
## Issues related (if applicable)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4c1f832db..6ac16b14e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,7 +2,7 @@
Hey, thanks for your interest in contributing to Dokploy! We appreciate your help and taking your time to contribute.
-Before you start, please first discuss the feature/bug you want to add with the owners and comunity via github issues.
+Before you start, please first discuss the feature/bug you want to add with the owners and community via github issues.
We have a few guidelines to follow when contributing to this project:
@@ -11,6 +11,7 @@ We have a few guidelines to follow when contributing to this project:
- [Development](#development)
- [Build](#build)
- [Pull Request](#pull-request)
+- [Important Considerations](#important-considerations-for-pull-requests)
## Commit Convention
@@ -162,8 +163,9 @@ curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.39.1/pack-v0.
- If your pull request fixes an open issue, please reference the issue in the pull request description.
- Once your pull request is merged, you will be automatically added as a contributor to the project.
-**Important Considerations for Pull Requests:**
+### Important Considerations for Pull Requests
+- **Testing is Mandatory:** All Pull Requests **must be tested** before submission. You must verify that your changes work as expected in a local development environment (see [Setup](#setup)). **Pull Requests that have not been tested will be closed.** This policy ensures clean contributions and reduces the time maintainers spend reviewing untested or broken code.
- **Focus and Scope:** Each Pull Request should ideally address a single, well-defined problem or introduce one new feature. This greatly facilitates review and reduces the chances of introducing unintended side effects.
- **Avoid Unfocused Changes:** Please avoid submitting Pull Requests that contain only minor changes such as whitespace adjustments, IDE-generated formatting, or removal of unused variables, unless these are part of a larger, clearly defined refactor or a dedicated "cleanup" Pull Request that addresses a specific `good first issue` or maintenance task.
- **Issue Association:** For any significant change, it's highly recommended to open an issue first to discuss the proposed solution with the community and maintainers. This ensures alignment and avoids duplicated effort. If your PR resolves an existing issue, please link it in the description (e.g., `Fixes #123`, `Closes #456`).
diff --git a/Dockerfile b/Dockerfile
index 5d7bb6770..262862ca6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -65,4 +65,8 @@ RUN curl -sSL https://railpack.com/install.sh | bash
COPY --from=buildpacksio/pack:0.39.1 /usr/local/bin/pack /usr/local/bin/pack
EXPOSE 3000
-CMD [ "pnpm", "start" ]
+
+HEALTHCHECK --interval=10s --timeout=3s --retries=10 \
+ CMD curl -fs http://localhost:3000/api/trpc/settings.health || exit 1
+
+ CMD ["sh", "-c", "pnpm run wait-for-postgres && exec pnpm start"]
diff --git a/README.md b/README.md
index e97735597..927e6ebc6 100644
--- a/README.md
+++ b/README.md
@@ -12,24 +12,8 @@
-
-
-
-
-### [Tuple, the premier screen sharing app for developers](https://tuple.app/dokploy)
-[Available for MacOS & Windows](https://tuple.app/dokploy)
| 🎖 Hero Sponsor |
-| [LX Aer](https://www.lxaer.com/?ref=dokploy) |
| 🎖 Hero Sponsor |
-| [LinkDR](https://linkdr.com/?ref=dokploy) |
| 🎖 Hero Sponsor |
-| [Awesome Tools](https://awesome.tools/) |
| 🎖 Hero Sponsor |
-| [Supafort](https://supafort.com/?ref=dokploy) |
| 🥇 Premium Supporter |
-| [Agentdock](https://agentdock.ai/?ref=dokploy) |
| 🥇 Premium Supporter |
-| [AmericanCloud](https://americancloud.com/?ref=dokploy) |
| 🥈 Elite Contributor |
-| [Tolgee](https://tolgee.io/?utm_source=github_dokploy&utm_medium=banner&utm_campaign=dokploy) |
| 🥈 Elite Contributor |
-| [Cloudblast](https://cloudblast.io/?ref=dokploy) |
| 🥉 Supporting Member |
-
-### Community Backers 🤝
-
-#### Organizations:
-
-[Sponsors on Open Collective](https://opencollective.com/dokploy)
-
-#### Individuals:
-
-[](https://opencollective.com/dokploy)
-
### Contributors 🤝
diff --git a/apps/api/package.json b/apps/api/package.json
index 0f4b1044f..70c8aaac8 100644
--- a/apps/api/package.json
+++ b/apps/api/package.json
@@ -14,7 +14,7 @@
"@hono/node-server": "^1.14.3",
"@hono/zod-validator": "0.3.0",
"dotenv": "^16.4.5",
- "hono": "^4.7.10",
+ "hono": "^4.11.7",
"pino": "9.4.0",
"pino-pretty": "11.2.2",
"react": "18.2.0",
@@ -23,7 +23,7 @@
"zod": "^3.25.32"
},
"devDependencies": {
- "@types/node": "^20.17.51",
+ "@types/node": "^20.16.0",
"@types/react": "^18.2.37",
"@types/react-dom": "^18.2.15",
"tsx": "^4.16.2",
diff --git a/apps/dokploy/__test__/compose/domain/network-service.test.ts b/apps/dokploy/__test__/compose/domain/network-service.test.ts
index b8d03c751..83fe8a166 100644
--- a/apps/dokploy/__test__/compose/domain/network-service.test.ts
+++ b/apps/dokploy/__test__/compose/domain/network-service.test.ts
@@ -4,21 +4,30 @@ import { describe, expect, it } from "vitest";
describe("addDokployNetworkToService", () => {
it("should add network to an empty array", () => {
const result = addDokployNetworkToService([]);
- expect(result).toEqual(["dokploy-network"]);
+ expect(result).toEqual(["dokploy-network", "default"]);
});
it("should not add duplicate network to an array", () => {
const result = addDokployNetworkToService(["dokploy-network"]);
- expect(result).toEqual(["dokploy-network"]);
+ expect(result).toEqual(["dokploy-network", "default"]);
});
it("should add network to an existing array with other networks", () => {
const result = addDokployNetworkToService(["other-network"]);
- expect(result).toEqual(["other-network", "dokploy-network"]);
+ expect(result).toEqual(["other-network", "dokploy-network", "default"]);
});
it("should add network to an object if networks is an object", () => {
const result = addDokployNetworkToService({ "other-network": {} });
- expect(result).toEqual({ "other-network": {}, "dokploy-network": {} });
+ expect(result).toEqual({
+ "other-network": {},
+ "dokploy-network": {},
+ default: {},
+ });
+ });
+
+ it("should not duplicate default network when already present", () => {
+ const result = addDokployNetworkToService(["default", "dokploy-network"]);
+ expect(result).toEqual(["default", "dokploy-network"]);
});
});
diff --git a/apps/dokploy/__test__/drop/drop.test.ts b/apps/dokploy/__test__/drop/drop.test.ts
index 85b9b2c61..dc795fd35 100644
--- a/apps/dokploy/__test__/drop/drop.test.ts
+++ b/apps/dokploy/__test__/drop/drop.test.ts
@@ -147,6 +147,7 @@ const baseApp: ApplicationNested = {
dockerContextPath: null,
rollbackActive: false,
stopGracePeriodSwarm: null,
+ ulimitsSwarm: null,
};
describe("unzipDrop using real zip files", () => {
diff --git a/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts b/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
index c12a272bc..fb448e3af 100644
--- a/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
+++ b/apps/dokploy/__test__/server/mechanizeDockerContainer.test.ts
@@ -6,6 +6,7 @@ type MockCreateServiceOptions = {
TaskTemplate?: {
ContainerSpec?: {
StopGracePeriod?: number;
+ Ulimits?: Array<{ Name: string; Soft: number; Hard: number }>;
};
};
[key: string]: unknown;
@@ -13,11 +14,11 @@ type MockCreateServiceOptions = {
const { inspectMock, getServiceMock, createServiceMock, getRemoteDockerMock } =
vi.hoisted(() => {
- const inspect = vi.fn<[], Promise+ Set resource limits for the container. Each ulimit has + a soft limit (warning threshold) and hard limit + (maximum allowed). Use -1 for unlimited. +
++ No ulimits configured. Click "Add Ulimit" to set + resource limits. +
+ )} +
+ Check to save configs with Go templating (e.g.{" "}
+ {"{{range}}"}).
+
+ Traefik supports Go templating in dynamic configs (e.g.{" "}
+ {"{{range}}"}). Configs using
+ templates will fail standard YAML validation. Check this to save
+ without validation.
+
Linked accounts
+ {accountsLoading ? ( ++ No social accounts linked yet. +
+ ) : ( ++ Click a provider below to link it to your account. You will be + redirected to complete the flow. +
++ To unlock extra features you need an enterprise license key. + Contact us{" "} + + here + + . +
++ Unlock advanced capabilities like SSO, Audit logs, + whitelabeling and more. +
++ Add an OIDC or SAML provider so users can sign in with their + organization's IdP (e.g. Okta, Azure AD). +
++ Or register with email +
+ )}