Skip to content
This repository was archived by the owner on Nov 23, 2022. It is now read-only.

Commit f0babd6

Browse files
committed
Allow using custom traefik middlewares from exoframe config
Addresses exoframejs/exoframe#278
1 parent b1242ee commit f0babd6

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

src/docker/start.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,17 @@ exports.start = async ({image, username, folder, resultStream, existing = []}) =
229229
}
230230
const additionalLabels = config.labels || {};
231231

232+
const configMiddlewares = Object.keys(additionalLabels)
233+
// we want all middlewares
234+
.filter(label => label.startsWith('traefik.http.middlewares.'))
235+
// map them to name with @docker postfix
236+
.map(label => {
237+
const [middlewareName] = label.replace('traefik.http.middlewares.', '').split('.');
238+
return `${middlewareName}@docker`;
239+
})
240+
// concat with other middlewares from config if present
241+
.concat(config.middlewares || []);
242+
232243
const Labels = Object.assign({}, additionalLabels, {
233244
'exoframe.deployment': name,
234245
'exoframe.user': username,
@@ -238,7 +249,7 @@ exports.start = async ({image, username, folder, resultStream, existing = []}) =
238249
});
239250

240251
// create middlewares array
241-
const middlewares = [];
252+
const middlewares = configMiddlewares || [];
242253

243254
// if we have letsencrypt enabled - enable https redirect
244255
if (serverConfig.letsencrypt && (config.letsencrypt || config.letsencrypt === undefined)) {
@@ -289,7 +300,7 @@ exports.start = async ({image, username, folder, resultStream, existing = []}) =
289300

290301
// remove or stringify all middlewares
291302
if (middlewares.length > 0) {
292-
Labels[`traefik.http.routers.${name}.middlewares`] = middlewares.join(',');
303+
Labels[`traefik.http.routers.${name}.middlewares`] = [...new Set(middlewares)].join(',');
293304
}
294305

295306
// run startFromParams via plugins if available

test/deploy.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,12 @@ test('Should have additional labels', async done => {
699699
expect(containerInfo).toBeDefined();
700700
expect(containerInfo.Labels['custom.label']).toEqual('additional-label');
701701

702+
// check middlewares
703+
const name = completeDeployments[0].Name.slice(1);
704+
const middlewaresLabel = containerInfo.Labels[`traefik.http.routers.${name}.middlewares`];
705+
expect(middlewaresLabel).toContain('my-redirectregex@docker');
706+
expect(middlewaresLabel).toContain('my-test@docker');
707+
702708
// cleanup
703709
const instance = docker.getContainer(containerInfo.Id);
704710
await instance.remove({force: true});

test/fixtures/additional-labels/exoframe.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
"project": "simple-html",
55
"restart": "no",
66
"labels": {
7-
"custom.label": "additional-label"
8-
}
7+
"custom.label": "additional-label",
8+
"traefik.http.middlewares.my-redirectregex.redirectregex.regex": "^https://domain.redirect/(.*)",
9+
"traefik.http.middlewares.my-redirectregex.redirectregex.replacement": "https://domain.new/$${1}"
10+
},
11+
"middlewares": ["my-test@docker"]
912
}

0 commit comments

Comments
 (0)