diff --git a/packages/cli/config/index.ts b/packages/cli/config/index.ts
index 847587460f..380a93c4a8 100644
--- a/packages/cli/config/index.ts
+++ b/packages/cli/config/index.ts
@@ -204,6 +204,13 @@ const config = convict({
},
// How n8n can be reached (Editor & REST-API)
+ path: {
+ format: String,
+ default: '/',
+ arg: 'path',
+ env: 'N8N_PATH',
+ doc: 'Path n8n is deployed to'
+ },
host: {
format: String,
default: 'localhost',
diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts
index 2507b6b136..5cfacd8449 100644
--- a/packages/cli/src/Server.ts
+++ b/packages/cli/src/Server.ts
@@ -1693,9 +1693,21 @@ class App {
});
}
+
+ // Read the index file and replace the path placeholder
+ const editorUiPath = require.resolve('n8n-editor-ui');
+ const filePath = pathJoin(pathDirname(editorUiPath), 'dist', 'index.html');
+ let readIndexFile = readFileSync(filePath, 'utf8');
+ const n8nPath = config.get('path');
+ readIndexFile = readIndexFile.replace(/\/%BASE_PATH%\//g, n8nPath);
+
+ // Serve the altered index.html file separately
+ this.app.get(`/index.html`, async (req: express.Request, res: express.Response) => {
+ res.send(readIndexFile);
+ });
+
// Serve the website
const startTime = (new Date()).toUTCString();
- const editorUiPath = require.resolve('n8n-editor-ui');
this.app.use('/', express.static(pathJoin(pathDirname(editorUiPath), 'dist'), {
index: 'index.html',
setHeaders: (res, path) => {
diff --git a/packages/editor-ui/public/index.html b/packages/editor-ui/public/index.html
index 2f2450023d..9193fda976 100644
--- a/packages/editor-ui/public/index.html
+++ b/packages/editor-ui/public/index.html
@@ -4,7 +4,8 @@
-
+
+
n8n.io - Workflow Automation
diff --git a/packages/editor-ui/src/components/MainSidebar.vue b/packages/editor-ui/src/components/MainSidebar.vue
index 71388c2cd3..c5462690cc 100644
--- a/packages/editor-ui/src/components/MainSidebar.vue
+++ b/packages/editor-ui/src/components/MainSidebar.vue
@@ -16,7 +16,7 @@
-
+
n8n.io
@@ -208,6 +208,8 @@ export default mixins(
data () {
return {
aboutDialogVisible: false,
+ // @ts-ignore
+ basePath: window.BASE_PATH,
isCollapsed: true,
credentialNewDialogVisible: false,
credentialOpenDialogVisible: false,
diff --git a/packages/editor-ui/src/router.ts b/packages/editor-ui/src/router.ts
index e82b30b588..4754098c97 100644
--- a/packages/editor-ui/src/router.ts
+++ b/packages/editor-ui/src/router.ts
@@ -8,7 +8,8 @@ Vue.use(Router);
export default new Router({
mode: 'history',
- base: process.env.BASE_URL,
+ // @ts-ignore
+ base: window.BASE_PATH,
routes: [
{
path: '/execution/:id',
diff --git a/packages/editor-ui/src/store.ts b/packages/editor-ui/src/store.ts
index 80454fc9e4..0e1e5f14c4 100644
--- a/packages/editor-ui/src/store.ts
+++ b/packages/editor-ui/src/store.ts
@@ -38,7 +38,8 @@ export const store = new Vuex.Store({
activeWorkflows: [] as string[],
activeActions: [] as string[],
activeNode: null as string | null,
- baseUrl: process.env.VUE_APP_URL_BASE_API ? process.env.VUE_APP_URL_BASE_API : '/',
+ // @ts-ignore
+ baseUrl: window.BASE_PATH ? window.BASE_PATH : '/',
credentials: null as ICredentialsResponse[] | null,
credentialTypes: null as ICredentialType[] | null,
endpointWebhook: 'webhook',
diff --git a/packages/editor-ui/vue.config.js b/packages/editor-ui/vue.config.js
index cdcd8259f9..c5ffc5fed8 100644
--- a/packages/editor-ui/vue.config.js
+++ b/packages/editor-ui/vue.config.js
@@ -29,5 +29,5 @@ module.exports = {
},
},
},
- publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH : '/',
+ publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH : '/%BASE_PATH%/',
};
diff --git a/packages/nodes-base/nodes/Affinity/AffinityTrigger.node.ts b/packages/nodes-base/nodes/Affinity/AffinityTrigger.node.ts
index 6b57d46804..3d387e7b4d 100644
--- a/packages/nodes-base/nodes/Affinity/AffinityTrigger.node.ts
+++ b/packages/nodes-base/nodes/Affinity/AffinityTrigger.node.ts
@@ -52,10 +52,10 @@ export class AffinityTrigger implements INodeType {
options: [
{
name: 'file.created',
- value: 'file.deleted',
+ value: 'file.created',
},
{
- name: 'file.created',
+ name: 'file.deleted',
value: 'file.deleted',
},
{
@@ -136,7 +136,7 @@ export class AffinityTrigger implements INodeType {
},
{
name: 'opportunity.deleted',
- value: 'organization.deleted',
+ value: 'opportunity.deleted',
},
{
name: 'person.created',