diff --git a/src/backend/migrations/20190219223711_root_config.js b/src/backend/migrations/20190219223711_root_config.js new file mode 100644 index 00000000..8bfa3de1 --- /dev/null +++ b/src/backend/migrations/20190219223711_root_config.js @@ -0,0 +1,37 @@ +'use strict'; + +const migrate_name = 'rootpath_config'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.text('advanced_rootconfig').notNull().defaultTo(''); + proxy_host.integer('enabled_rootconfig').notNull().unsigned().defaultTo(0); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; diff --git a/src/backend/schema/endpoints/proxy-hosts.json b/src/backend/schema/endpoints/proxy-hosts.json index df7cb119..5cb9dac8 100644 --- a/src/backend/schema/endpoints/proxy-hosts.json +++ b/src/backend/schema/endpoints/proxy-hosts.json @@ -69,6 +69,12 @@ }, "meta": { "type": "object" + }, + "advanced_rootconfig": { + "type": "string" + }, + "enabled_rootconfig": { + "type": "boolean" } }, "properties": { @@ -128,6 +134,12 @@ }, "meta": { "$ref": "#/definitions/meta" + }, + "advanced_rootconfig": { + "$ref": "#/definitions/advanced_rootconfig" + }, + "enabled_rootconfig": { + "$ref": "#/definitions/enabled_rootconfig" } }, "links": [ @@ -215,6 +227,12 @@ }, "meta": { "$ref": "#/definitions/meta" + }, + "advanced_rootconfig": { + "$ref": "#/definitions/advanced_rootconfig" + }, + "enabled_rootconfig": { + "$ref": "#/definitions/enabled_rootconfig" } } }, @@ -285,6 +303,12 @@ }, "meta": { "$ref": "#/definitions/meta" + }, + "advanced_rootconfig": { + "$ref": "#/definitions/advanced_rootconfig" + }, + "enabled_rootconfig": { + "$ref": "#/definitions/enabled_rootconfig" } } }, diff --git a/src/backend/templates/proxy_host.conf b/src/backend/templates/proxy_host.conf index 52e70583..52d55b96 100644 --- a/src/backend/templates/proxy_host.conf +++ b/src/backend/templates/proxy_host.conf @@ -34,6 +34,8 @@ server { # Proxy! include conf.d/include/proxy.conf; + + {{advanced_rootconfig}} } } {% endif %} diff --git a/src/frontend/js/app/nginx/proxy/form.ejs b/src/frontend/js/app/nginx/proxy/form.ejs index 0962916f..8d8dcea6 100644 --- a/src/frontend/js/app/nginx/proxy/form.ejs +++ b/src/frontend/js/app/nginx/proxy/form.ejs @@ -59,7 +59,7 @@ -
+
- +
+
+ +
+
+
+
+ + +
+
diff --git a/src/frontend/js/app/nginx/proxy/form.js b/src/frontend/js/app/nginx/proxy/form.js index fcc394de..79e2b492 100644 --- a/src/frontend/js/app/nginx/proxy/form.js +++ b/src/frontend/js/app/nginx/proxy/form.js @@ -27,12 +27,21 @@ module.exports = Mn.View.extend({ ssl_forced: 'input[name="ssl_forced"]', hsts_enabled: 'input[name="hsts_enabled"]', hsts_subdomains: 'input[name="hsts_subdomains"]', + enable_rootpath: 'input[name="enabled_rootconfig"]', + config_rootpath: 'textarea[name="advanced_rootconfig"]', http2_support: 'input[name="http2_support"]', forward_scheme: 'select[name="forward_scheme"]', letsencrypt: '.letsencrypt' }, events: { + 'change @ui.enable_rootpath': function(e) { + if (e.target.checked) { + this.ui.config_rootpath.parent().show(); + } else { + this.ui.config_rootpath.parent().hide(); + } + }, 'change @ui.certificate_select': function () { let id = this.ui.certificate_select.val(); if (id === 'new') { @@ -102,6 +111,7 @@ module.exports = Mn.View.extend({ data.hsts_enabled = !!data.hsts_enabled; data.hsts_subdomains = !!data.hsts_subdomains; data.ssl_forced = !!data.ssl_forced; + data.enabled_rootconfig = !!data.enabled_rootconfig; if (typeof data.domain_names === 'string' && data.domain_names) { data.domain_names = data.domain_names.split(','); @@ -162,6 +172,7 @@ module.exports = Mn.View.extend({ onRender: function () { let view = this; + this.ui.enable_rootpath.trigger('change'); this.ui.ssl_forced.trigger('change'); this.ui.hsts_enabled.trigger('change'); diff --git a/src/frontend/js/i18n/messages.json b/src/frontend/js/i18n/messages.json index 8c0dcdfb..ab38bb7f 100644 --- a/src/frontend/js/i18n/messages.json +++ b/src/frontend/js/i18n/messages.json @@ -106,7 +106,8 @@ "help-content": "A Proxy Host is the incoming endpoint for a web service that you want to forward.\nIt provides optional SSL termination for your service that might not have SSL support built in.\nProxy Hosts are the most common use for the Nginx Proxy Manager.", "access-list": "Access List", "allow-websocket-upgrade": "Websockets Support", - "ignore-invalid-upstream-ssl": "Ignore Invalid SSL" + "ignore-invalid-upstream-ssl": "Ignore Invalid SSL", + "advanced-config-root": "Custom config of /" }, "redirection-hosts": { "title": "Redirection Hosts", diff --git a/src/frontend/js/models/proxy-host.js b/src/frontend/js/models/proxy-host.js index e169fa02..e8df469d 100644 --- a/src/frontend/js/models/proxy-host.js +++ b/src/frontend/js/models/proxy-host.js @@ -26,6 +26,8 @@ const model = Backbone.Model.extend({ advanced_config: '', enabled: true, meta: {}, + enabled_rootconfig: false, + advanced_rootconfig: null, // The following are expansions: owner: null, access_list: null,