Skip to content

Commit 5c87214

Browse files
authored
Merge pull request #720 from Dokploy/canary
v0.12.0
2 parents be93406 + 5db5336 commit 5c87214

File tree

96 files changed

+11091
-111
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+11091
-111
lines changed

.circleci/config.yml

+16-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ jobs:
1818
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN
1919
if [ "${CIRCLE_BRANCH}" == "main" ]; then
2020
TAG="latest"
21-
else
21+
elif [ "${CIRCLE_BRANCH}" == "canary" ]; then
2222
TAG="canary"
23+
else
24+
TAG="feature"
2325
fi
2426
docker build --platform linux/amd64 -t dokploy/dokploy:${TAG}-amd64 .
2527
docker push dokploy/dokploy:${TAG}-amd64
@@ -41,8 +43,10 @@ jobs:
4143
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN
4244
if [ "${CIRCLE_BRANCH}" == "main" ]; then
4345
TAG="latest"
44-
else
46+
elif [ "${CIRCLE_BRANCH}" == "canary" ]; then
4547
TAG="canary"
48+
else
49+
TAG="feature"
4650
fi
4751
docker build --platform linux/arm64 -t dokploy/dokploy:${TAG}-arm64 .
4852
docker push dokploy/dokploy:${TAG}-arm64
@@ -72,12 +76,18 @@ jobs:
7276
dokploy/dokploy:${TAG}-amd64 \
7377
dokploy/dokploy:${TAG}-arm64
7478
docker manifest push dokploy/dokploy:${VERSION}
75-
else
79+
elif [ "${CIRCLE_BRANCH}" == "canary" ]; then
7680
TAG="canary"
7781
docker manifest create dokploy/dokploy:${TAG} \
7882
dokploy/dokploy:${TAG}-amd64 \
7983
dokploy/dokploy:${TAG}-arm64
8084
docker manifest push dokploy/dokploy:${TAG}
85+
else
86+
TAG="feature"
87+
docker manifest create dokploy/dokploy:${TAG} \
88+
dokploy/dokploy:${TAG}-amd64 \
89+
dokploy/dokploy:${TAG}-arm64
90+
docker manifest push dokploy/dokploy:${TAG}
8191
fi
8292
8393
workflows:
@@ -89,12 +99,14 @@ workflows:
8999
only:
90100
- main
91101
- canary
102+
- fix/build-i18n
92103
- build-arm64:
93104
filters:
94105
branches:
95106
only:
96107
- main
97108
- canary
109+
- fix/build-i18n
98110
- combine-manifests:
99111
requires:
100112
- build-amd64
@@ -104,3 +116,4 @@ workflows:
104116
only:
105117
- main
106118
- canary
119+
- fix/build-i18n

CONTRIBUTING.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ We have a few guidelines to follow when contributing to this project:
1414

1515
## Commit Convention
1616

17+
1718
Before you create a Pull Request, please make sure your commit message follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.
1819

1920
### Commit Message Format
2021

22+
2123
```
2224
<type>[optional scope]: <description>
2325
@@ -235,7 +237,7 @@ export function generate(schema: Schema): Template {
235237

236238
5. Add the logo or image of the template to `public/templates/plausible.svg`
237239

238-
### Recomendations
240+
### Recommendations
239241

240242
- Use the same name of the folder as the id of the template.
241243
- The logo should be in the public folder.

Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var
3535
COPY --from=build /prod/dokploy/.next ./.next
3636
COPY --from=build /prod/dokploy/dist ./dist
3737
COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs
38+
COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs
3839
COPY --from=build /prod/dokploy/public ./public
3940
COPY --from=build /prod/dokploy/package.json ./package.json
4041
COPY --from=build /prod/dokploy/drizzle ./drizzle

Dockerfile.cloud

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var
4444
COPY --from=build /prod/dokploy/.next ./.next
4545
COPY --from=build /prod/dokploy/dist ./dist
4646
COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs
47+
COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs
4748
COPY --from=build /prod/dokploy/public ./public
4849
COPY --from=build /prod/dokploy/package.json ./package.json
4950
COPY --from=build /prod/dokploy/drizzle ./drizzle

apps/dokploy/__test__/drop/drop.test.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ const baseApp: ApplicationNested = {
3232
serverId: "",
3333
branch: null,
3434
dockerBuildStage: "",
35+
project: {
36+
env: "",
37+
adminId: "",
38+
name: "",
39+
description: "",
40+
createdAt: "",
41+
projectId: "",
42+
},
3543
buildArgs: null,
3644
buildPath: "/",
3745
gitlabPathNamespace: "",
+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
import { prepareEnvironmentVariables } from "@dokploy/server/index";
2+
import { describe, expect, it } from "vitest";
3+
4+
const projectEnv = `
5+
ENVIRONMENT=staging
6+
DATABASE_URL=postgres://postgres:postgres@localhost:5432/project_db
7+
PORT=3000
8+
`;
9+
const serviceEnv = `
10+
ENVIRONMENT=\${{project.ENVIRONMENT}}
11+
DATABASE_URL=\${{project.DATABASE_URL}}
12+
SERVICE_PORT=4000
13+
`;
14+
15+
describe("prepareEnvironmentVariables", () => {
16+
it("resolves project variables correctly", () => {
17+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
18+
19+
expect(resolved).toEqual([
20+
"ENVIRONMENT=staging",
21+
"DATABASE_URL=postgres://postgres:postgres@localhost:5432/project_db",
22+
"SERVICE_PORT=4000",
23+
]);
24+
});
25+
26+
it("handles undefined project variables", () => {
27+
const incompleteProjectEnv = `
28+
NODE_ENV=production
29+
`;
30+
31+
const invalidServiceEnv = `
32+
UNDEFINED_VAR=\${{project.UNDEFINED_VAR}}
33+
`;
34+
35+
expect(
36+
() =>
37+
prepareEnvironmentVariables(invalidServiceEnv, incompleteProjectEnv), // Cambiado el orden
38+
).toThrow("Invalid project environment variable: project.UNDEFINED_VAR");
39+
});
40+
it("allows service-specific variables to override project variables", () => {
41+
const serviceSpecificEnv = `
42+
ENVIRONMENT=production
43+
DATABASE_URL=\${{project.DATABASE_URL}}
44+
`;
45+
46+
const resolved = prepareEnvironmentVariables(
47+
serviceSpecificEnv,
48+
projectEnv,
49+
);
50+
51+
expect(resolved).toEqual([
52+
"ENVIRONMENT=production", // Overrides project variable
53+
"DATABASE_URL=postgres://postgres:postgres@localhost:5432/project_db",
54+
]);
55+
});
56+
57+
it("resolves complex references for dynamic endpoints", () => {
58+
const projectEnv = `
59+
BASE_URL=https://api.example.com
60+
API_VERSION=v1
61+
PORT=8000
62+
`;
63+
const serviceEnv = `
64+
API_ENDPOINT=\${{project.BASE_URL}}/\${{project.API_VERSION}}/endpoint
65+
SERVICE_PORT=9000
66+
`;
67+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
68+
69+
expect(resolved).toEqual([
70+
"API_ENDPOINT=https://api.example.com/v1/endpoint",
71+
"SERVICE_PORT=9000",
72+
]);
73+
});
74+
75+
it("handles missing project variables gracefully", () => {
76+
const projectEnv = `
77+
PORT=8080
78+
`;
79+
const serviceEnv = `
80+
MISSING_VAR=\${{project.MISSING_KEY}}
81+
SERVICE_PORT=3000
82+
`;
83+
84+
expect(() => prepareEnvironmentVariables(serviceEnv, projectEnv)).toThrow(
85+
"Invalid project environment variable: project.MISSING_KEY",
86+
);
87+
});
88+
89+
it("overrides project variables with service-specific values", () => {
90+
const projectEnv = `
91+
ENVIRONMENT=staging
92+
DATABASE_URL=postgres://project:project@localhost:5432/project_db
93+
`;
94+
const serviceEnv = `
95+
ENVIRONMENT=\${{project.ENVIRONMENT}}
96+
DATABASE_URL=postgres://service:service@localhost:5432/service_db
97+
SERVICE_NAME=my-service
98+
`;
99+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
100+
101+
expect(resolved).toEqual([
102+
"ENVIRONMENT=staging",
103+
"DATABASE_URL=postgres://service:service@localhost:5432/service_db",
104+
"SERVICE_NAME=my-service",
105+
]);
106+
});
107+
108+
it("handles project variables with normal and unusual characters", () => {
109+
const projectEnv = `
110+
ENVIRONMENT=PRODUCTION
111+
`;
112+
113+
// Needs to be in quotes
114+
const serviceEnv = `
115+
NODE_ENV=\${{project.ENVIRONMENT}}
116+
SPECIAL_VAR="$^@$^@#$^@!#$@#$-\${{project.ENVIRONMENT}}"
117+
`;
118+
119+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
120+
121+
expect(resolved).toEqual([
122+
"NODE_ENV=PRODUCTION",
123+
"SPECIAL_VAR=$^@$^@#$^@!#$@#$-PRODUCTION",
124+
]);
125+
});
126+
127+
it("handles complex cases with multiple references, special characters, and spaces", () => {
128+
const projectEnv = `
129+
ENVIRONMENT=STAGING
130+
APP_NAME=MyApp
131+
`;
132+
133+
const serviceEnv = `
134+
NODE_ENV=\${{project.ENVIRONMENT}}
135+
COMPLEX_VAR="Prefix-$#^!@-\${{project.ENVIRONMENT}}--\${{project.APP_NAME}} Suffix "
136+
`;
137+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
138+
139+
expect(resolved).toEqual([
140+
"NODE_ENV=STAGING",
141+
"COMPLEX_VAR=Prefix-$#^!@-STAGING--MyApp Suffix ",
142+
]);
143+
});
144+
145+
it("handles references enclosed in single quotes", () => {
146+
const projectEnv = `
147+
ENVIRONMENT=STAGING
148+
APP_NAME=MyApp
149+
`;
150+
151+
const serviceEnv = `
152+
NODE_ENV='\${{project.ENVIRONMENT}}'
153+
COMPLEX_VAR='Prefix-$#^!@-\${{project.ENVIRONMENT}}--\${{project.APP_NAME}} Suffix'
154+
`;
155+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
156+
157+
expect(resolved).toEqual([
158+
"NODE_ENV=STAGING",
159+
"COMPLEX_VAR=Prefix-$#^!@-STAGING--MyApp Suffix",
160+
]);
161+
});
162+
163+
it("handles double and single quotes combined", () => {
164+
const projectEnv = `
165+
ENVIRONMENT=PRODUCTION
166+
APP_NAME=MyApp
167+
`;
168+
const serviceEnv = `
169+
NODE_ENV="'\${{project.ENVIRONMENT}}'"
170+
COMPLEX_VAR="'Prefix \"DoubleQuoted\" and \${{project.APP_NAME}}'"
171+
`;
172+
const resolved = prepareEnvironmentVariables(serviceEnv, projectEnv);
173+
174+
expect(resolved).toEqual([
175+
"NODE_ENV='PRODUCTION'",
176+
"COMPLEX_VAR='Prefix \"DoubleQuoted\" and MyApp'",
177+
]);
178+
});
179+
});

apps/dokploy/__test__/traefik/traefik.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ const baseApp: ApplicationNested = {
1313
branch: null,
1414
dockerBuildStage: "",
1515
buildArgs: null,
16+
project: {
17+
env: "",
18+
adminId: "",
19+
name: "",
20+
description: "",
21+
createdAt: "",
22+
projectId: "",
23+
},
1624
buildPath: "/",
1725
gitlabPathNamespace: "",
1826
buildType: "nixpacks",

apps/dokploy/components/dashboard/application/advanced/redirects/add-redirect.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const redirectPresets = [
6161
redirect: {
6262
regex: "^https?://(?:www.)?(.+)",
6363
permanent: true,
64-
replacement: "https://www.$${1}",
64+
replacement: "https://www.${1}",
6565
},
6666
},
6767
{
@@ -70,7 +70,7 @@ const redirectPresets = [
7070
redirect: {
7171
regex: "^https?://www.(.+)",
7272
permanent: true,
73-
replacement: "https://$${1}",
73+
replacement: "https://${1}",
7474
},
7575
},
7676
];

0 commit comments

Comments
 (0)