diff --git a/docker-compose.yml b/docker-compose.yml index 4288305..8be74f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,12 +43,14 @@ services: - N8N_PERSONALIZATION_ENABLED=false - N8N_ENCRYPTION_KEY - N8N_USER_MANAGEMENT_JWT_SECRET + - EXTERNAL_HOOK_FILES=/hooks.js ports: - 5678:5678 links: - postgres volumes: - n8n_storage:/home/node/.n8n + - ./n8n/hooks.js:/hooks.js depends_on: postgres: condition: service_healthy diff --git a/n8n/hooks.js b/n8n/hooks.js new file mode 100644 index 0000000..345ee57 --- /dev/null +++ b/n8n/hooks.js @@ -0,0 +1,54 @@ +/** + * A hook that disables the user management and uses owner for all requests + */ +const { dirname, resolve } = require("path"); +const Layer = require("express/lib/router/layer"); + +const n8nDir = dirname(require.resolve("n8n")); +const jwtAuth = require(resolve(n8nDir, "auth/jwt")); + +async function disableUmHook({ app }, config) { + await this.dbCollections.Settings.update( + { key: "userManagement.isInstanceOwnerSetUp" }, + { value: JSON.stringify(true) } + ); + + config.set("userManagement.isInstanceOwnerSetUp", true); + + const owner = await this.dbCollections.User.findOne({ + where: { role: "global:owner" }, + }); + + owner.email = "demo@n8n.io"; + owner.firstName = "Demo"; + owner.lastName = "McDemoFace"; + + await this.dbCollections.User.save(owner); + + jwtAuth.resolveJwt = () => owner; + + const { stack } = app._router; + const index = stack.findIndex((l) => l.name === "cookieParser"); + stack.splice( + index + 4, + 3, + new Layer( + "/", + { + strict: false, + end: false, + }, + async (req, res, next) => { + req.user = owner; + req.cookies = { "n8n-auth": "fake" }; + next(); + } + ) + ); +} + +module.exports = { + n8n: { + ready: [disableUmHook], + }, +};