Compare commits

...

16 Commits

Author SHA1 Message Date
Sergey Kolesnik
0a4df97937
Merge 299bc0854c1a71a411eaf93d724bd8186ead50ed into c4df89df1f11ef8cb26ab375d161f6c82e72d401 2025-02-06 11:02:02 +01:00
Jamie Curnow
c4df89df1f
Fix dashboard loading loop and freezing the page 2025-02-06 13:38:47 +10:00
jc21
34c703f8b4
Merge branch 'master' into develop 2025-02-06 08:52:55 +10:00
Jamie Curnow
0a05d8f0ad
Bump version 2025-02-06 08:39:03 +10:00
jc21
0a9141fad5
Merge pull request #4208 from badkeyy/feature/add-zone-edit-certbot-plugin
Add ZoneEdit certbot plugin
2025-02-06 08:33:11 +10:00
jc21
42836774b7
Merge branch 'develop' into feature/add-zone-edit-certbot-plugin 2025-02-06 08:33:01 +10:00
Julian Gassner
c05f9695d0
Merge branch 'develop' into feature/add-zone-edit-certbot-plugin 2025-01-15 15:37:53 +01:00
Julian Gassner
6343b398f0 Add --no-deps 2025-01-15 14:36:38 +00:00
jc21
b4f49969d6
Merge pull request #4261 from NginxProxyManager/develop
v2.12.2
2024-12-29 14:40:05 +10:00
Sergey Kolesnik
299bc0854c
Merge branch 'NginxProxyManager:develop' into develop 2024-12-24 10:34:32 -05:00
Sergey Kolesnik
75dbbebf8d
Merge branch 'NginxProxyManager:develop' into develop 2024-12-23 19:18:09 -05:00
Sergey 'dreik' Kolesnik
f6abe27a8a eslint 2024-12-09 03:49:03 +03:00
Sergey 'dreik' Kolesnik
d8ca38cb26 client_max_body_size setting 2024-12-09 03:17:48 +03:00
Julian Gassner
1e322804ce Add ZoneEdit certbot plugin 2024-12-04 16:47:36 +01:00
jc21
5084cb7296
Merge pull request #4077 from NginxProxyManager/develop
v2.12.1
2024-10-17 09:49:07 +10:00
jc21
e677bfa2e8
Merge pull request #4073 from NginxProxyManager/develop
v2.12.0
2024-10-16 15:41:55 +10:00
17 changed files with 542 additions and 476 deletions

View File

@ -1 +1 @@
2.12.2 2.12.3

View File

@ -1,7 +1,7 @@
<p align="center"> <p align="center">
<img src="https://nginxproxymanager.com/github.png"> <img src="https://nginxproxymanager.com/github.png">
<br><br> <br><br>
<img src="https://img.shields.io/badge/version-2.12.2-green.svg?style=for-the-badge"> <img src="https://img.shields.io/badge/version-2.12.3-green.svg?style=for-the-badge">
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager"> <a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge"> <img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge">
</a> </a>

View File

@ -0,0 +1,34 @@
const migrate_name = 'client_max_body_size';
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.integer('client_max_body_size').notNull().unsigned().defaultTo('1');
})
.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);
};

View File

@ -9,6 +9,7 @@
"domain_names", "domain_names",
"forward_host", "forward_host",
"forward_port", "forward_port",
"client_max_body_size",
"access_list_id", "access_list_id",
"certificate_id", "certificate_id",
"ssl_forced", "ssl_forced",
@ -52,6 +53,11 @@
"minimum": 1, "minimum": 1,
"maximum": 65535 "maximum": 65535
}, },
"client_max_body_size": {
"type": "integer",
"minimum": 1,
"maximum": 4096
},
"access_list_id": { "access_list_id": {
"$ref": "../common.json#/properties/access_list_id" "$ref": "../common.json#/properties/access_list_id"
}, },
@ -112,6 +118,9 @@
"forward_port": { "forward_port": {
"$ref": "#/properties/forward_port" "$ref": "#/properties/forward_port"
}, },
"client_max_body_size": {
"$ref": "#/properties/client_max_body_size"
},
"forward_path": { "forward_path": {
"type": "string" "type": "string"
}, },

View File

@ -34,6 +34,7 @@
"domain_names": ["test.example.com"], "domain_names": ["test.example.com"],
"forward_host": "127.0.0.1", "forward_host": "127.0.0.1",
"forward_port": 8989, "forward_port": 8989,
"client_max_body_size": 1,
"access_list_id": 0, "access_list_id": 0,
"certificate_id": 0, "certificate_id": 0,
"ssl_forced": false, "ssl_forced": false,

View File

@ -34,6 +34,7 @@
"domain_names": ["test.example.com"], "domain_names": ["test.example.com"],
"forward_host": "192.168.0.10", "forward_host": "192.168.0.10",
"forward_port": 8989, "forward_port": 8989,
"client_max_body_size": 1,
"access_list_id": 0, "access_list_id": 0,
"certificate_id": 0, "certificate_id": 0,
"ssl_forced": false, "ssl_forced": false,

View File

@ -41,6 +41,9 @@
"forward_port": { "forward_port": {
"$ref": "../../../../components/proxy-host-object.json#/properties/forward_port" "$ref": "../../../../components/proxy-host-object.json#/properties/forward_port"
}, },
"client_max_body_size": {
"$ref": "../../../../components/proxy-host-object.json#/properties/client_max_body_size"
},
"certificate_id": { "certificate_id": {
"$ref": "../../../../components/proxy-host-object.json#/properties/certificate_id" "$ref": "../../../../components/proxy-host-object.json#/properties/certificate_id"
}, },
@ -100,6 +103,7 @@
"domain_names": ["test.example.com"], "domain_names": ["test.example.com"],
"forward_host": "192.168.0.10", "forward_host": "192.168.0.10",
"forward_port": 8989, "forward_port": 8989,
"client_max_body_size": 1,
"access_list_id": 0, "access_list_id": 0,
"certificate_id": 0, "certificate_id": 0,
"ssl_forced": false, "ssl_forced": false,

View File

@ -29,6 +29,9 @@
"forward_port": { "forward_port": {
"$ref": "../../../components/proxy-host-object.json#/properties/forward_port" "$ref": "../../../components/proxy-host-object.json#/properties/forward_port"
}, },
"client_max_body_size": {
"$ref": "../../../components/proxy-host-object.json#/properties/client_max_body_size"
},
"certificate_id": { "certificate_id": {
"$ref": "../../../components/proxy-host-object.json#/properties/certificate_id" "$ref": "../../../components/proxy-host-object.json#/properties/certificate_id"
}, },
@ -88,6 +91,7 @@
"domain_names": ["test.example.com"], "domain_names": ["test.example.com"],
"forward_host": "127.0.0.1", "forward_host": "127.0.0.1",
"forward_port": 8989, "forward_port": 8989,
"client_max_body_size": 1,
"access_list_id": 0, "access_list_id": 0,
"certificate_id": 0, "certificate_id": 0,
"ssl_forced": false, "ssl_forced": false,

View File

@ -47,6 +47,8 @@ proxy_http_version 1.1;
} }
{% endif %} {% endif %}
client_max_body_size {{ client_max_body_size }}m;
# Custom # Custom
include /data/nginx/custom/server_proxy[.]conf; include /data/nginx/custom/server_proxy[.]conf;
} }

View File

@ -26,7 +26,7 @@ module.exports = {
* Users * Users
*/ */
showUsers: function () { showUsers: function () {
let controller = this; const controller = this;
if (Cache.User.isAdmin()) { if (Cache.User.isAdmin()) {
require(['./main', './users/main'], (App, View) => { require(['./main', './users/main'], (App, View) => {
controller.navigate('/users'); controller.navigate('/users');
@ -93,8 +93,7 @@ module.exports = {
* Dashboard * Dashboard
*/ */
showDashboard: function () { showDashboard: function () {
let controller = this; const controller = this;
require(['./main', './dashboard/main'], (App, View) => { require(['./main', './dashboard/main'], (App, View) => {
controller.navigate('/'); controller.navigate('/');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -106,7 +105,7 @@ module.exports = {
*/ */
showNginxProxy: function () { showNginxProxy: function () {
if (Cache.User.isAdmin() || Cache.User.canView('proxy_hosts')) { if (Cache.User.isAdmin() || Cache.User.canView('proxy_hosts')) {
let controller = this; const controller = this;
require(['./main', './nginx/proxy/main'], (App, View) => { require(['./main', './nginx/proxy/main'], (App, View) => {
controller.navigate('/nginx/proxy'); controller.navigate('/nginx/proxy');
@ -146,8 +145,7 @@ module.exports = {
*/ */
showNginxRedirection: function () { showNginxRedirection: function () {
if (Cache.User.isAdmin() || Cache.User.canView('redirection_hosts')) { if (Cache.User.isAdmin() || Cache.User.canView('redirection_hosts')) {
let controller = this; const controller = this;
require(['./main', './nginx/redirection/main'], (App, View) => { require(['./main', './nginx/redirection/main'], (App, View) => {
controller.navigate('/nginx/redirection'); controller.navigate('/nginx/redirection');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -186,8 +184,7 @@ module.exports = {
*/ */
showNginxStream: function () { showNginxStream: function () {
if (Cache.User.isAdmin() || Cache.User.canView('streams')) { if (Cache.User.isAdmin() || Cache.User.canView('streams')) {
let controller = this; const controller = this;
require(['./main', './nginx/stream/main'], (App, View) => { require(['./main', './nginx/stream/main'], (App, View) => {
controller.navigate('/nginx/stream'); controller.navigate('/nginx/stream');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -226,8 +223,7 @@ module.exports = {
*/ */
showNginxDead: function () { showNginxDead: function () {
if (Cache.User.isAdmin() || Cache.User.canView('dead_hosts')) { if (Cache.User.isAdmin() || Cache.User.canView('dead_hosts')) {
let controller = this; const controller = this;
require(['./main', './nginx/dead/main'], (App, View) => { require(['./main', './nginx/dead/main'], (App, View) => {
controller.navigate('/nginx/404'); controller.navigate('/nginx/404');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -278,8 +274,7 @@ module.exports = {
*/ */
showNginxAccess: function () { showNginxAccess: function () {
if (Cache.User.isAdmin() || Cache.User.canView('access_lists')) { if (Cache.User.isAdmin() || Cache.User.canView('access_lists')) {
let controller = this; const controller = this;
require(['./main', './nginx/access/main'], (App, View) => { require(['./main', './nginx/access/main'], (App, View) => {
controller.navigate('/nginx/access'); controller.navigate('/nginx/access');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -318,8 +313,7 @@ module.exports = {
*/ */
showNginxCertificates: function () { showNginxCertificates: function () {
if (Cache.User.isAdmin() || Cache.User.canView('certificates')) { if (Cache.User.isAdmin() || Cache.User.canView('certificates')) {
let controller = this; const controller = this;
require(['./main', './nginx/certificates/main'], (App, View) => { require(['./main', './nginx/certificates/main'], (App, View) => {
controller.navigate('/nginx/certificates'); controller.navigate('/nginx/certificates');
App.UI.showAppContent(new View()); App.UI.showAppContent(new View());
@ -383,7 +377,7 @@ module.exports = {
* Audit Log * Audit Log
*/ */
showAuditLog: function () { showAuditLog: function () {
let controller = this; const controller = this;
if (Cache.User.isAdmin()) { if (Cache.User.isAdmin()) {
require(['./main', './audit-log/main'], (App, View) => { require(['./main', './audit-log/main'], (App, View) => {
controller.navigate('/audit-log'); controller.navigate('/audit-log');
@ -411,7 +405,7 @@ module.exports = {
* Settings * Settings
*/ */
showSettings: function () { showSettings: function () {
let controller = this; const controller = this;
if (Cache.User.isAdmin()) { if (Cache.User.isAdmin()) {
require(['./main', './settings/main'], (App, View) => { require(['./main', './settings/main'], (App, View) => {
controller.navigate('/settings'); controller.navigate('/settings');

View File

@ -24,7 +24,7 @@ module.exports = Mn.View.extend({
}, },
templateContext: function () { templateContext: function () {
let view = this; const view = this;
return { return {
getUserName: function () { getUserName: function () {
@ -48,8 +48,8 @@ module.exports = Mn.View.extend({
}, },
onRender: function () { onRender: function () {
let view = this; const view = this;
if (typeof view.stats.hosts === 'undefined') {
Api.Reports.getHostStats() Api.Reports.getHostStats()
.then(response => { .then(response => {
if (!view.isDestroyed()) { if (!view.isDestroyed()) {
@ -60,6 +60,7 @@ module.exports = Mn.View.extend({
.catch(err => { .catch(err => {
console.log(err); console.log(err);
}); });
}
}, },
/** /**
@ -70,8 +71,7 @@ module.exports = Mn.View.extend({
// calculate the available columns based on permissions for the objects // calculate the available columns based on permissions for the objects
// and store as a variable // and store as a variable
//let view = this; const perms = ['proxy_hosts', 'redirection_hosts', 'streams', 'dead_hosts'];
let perms = ['proxy_hosts', 'redirection_hosts', 'streams', 'dead_hosts'];
perms.map(perm => { perms.map(perm => {
this.columns += Cache.User.isAdmin() || Cache.User.canView(perm) ? 1 : 0; this.columns += Cache.User.isAdmin() || Cache.User.canView(perm) ? 1 : 0;

View File

@ -81,7 +81,12 @@
</label> </label>
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12">
<div class="form-group">
<label class="form-label"><%- i18n('proxy-hosts', 'client-max-body-size' ) %></label>
<input name="client_max_body_size" type="number" class="form-control text-monospace" placeholder="1" value="<%- client_max_body_size %>" required>
</div>
</div>
<div class="col-sm-12 col-md-12"> <div class="col-sm-12 col-md-12">
<div class="form-group"> <div class="form-group">
<label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label> <label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label>

View File

@ -160,6 +160,7 @@ module.exports = Mn.View.extend({
// Manipulate // Manipulate
data.forward_port = parseInt(data.forward_port, 10); data.forward_port = parseInt(data.forward_port, 10);
data.client_max_body_size = parseInt(data.client_max_body_size, 10);
data.block_exploits = !!data.block_exploits; data.block_exploits = !!data.block_exploits;
data.caching_enabled = !!data.caching_enabled; data.caching_enabled = !!data.caching_enabled;
data.allow_websocket_upgrade = !!data.allow_websocket_upgrade; data.allow_websocket_upgrade = !!data.allow_websocket_upgrade;

View File

@ -125,6 +125,7 @@
"forward-scheme": "Scheme", "forward-scheme": "Scheme",
"forward-host": "Forward Hostname / IP", "forward-host": "Forward Hostname / IP",
"forward-port": "Forward Port", "forward-port": "Forward Port",
"client-max-body-size": "Max proxied upload size (Mb)",
"delete": "Delete Proxy Host", "delete": "Delete Proxy Host",
"delete-confirm": "Are you sure you want to delete the Proxy host for: <strong>{domains}</strong>?", "delete-confirm": "Are you sure you want to delete the Proxy host for: <strong>{domains}</strong>?",
"help-title": "What is a Proxy Host?", "help-title": "What is a Proxy Host?",

View File

@ -12,6 +12,7 @@ const model = Backbone.Model.extend({
forward_scheme: 'http', forward_scheme: 'http',
forward_host: '', forward_host: '',
forward_port: null, forward_port: null,
client_max_body_size: 1,
access_list_id: 0, access_list_id: 0,
certificate_id: 0, certificate_id: 0,
ssl_forced: false, ssl_forced: false,

View File

@ -534,5 +534,13 @@
"dependencies": "", "dependencies": "",
"credentials": "edgedns_client_secret = as3d1asd5d1a32sdfsdfs2d1asd5=\nedgedns_host = sdflskjdf-dfsdfsdf-sdfsdfsdf.luna.akamaiapis.net\nedgedns_access_token = kjdsi3-34rfsdfsdf-234234fsdfsdf\nedgedns_client_token = dkfjdf-342fsdfsd-23fsdfsdfsdf", "credentials": "edgedns_client_secret = as3d1asd5d1a32sdfsdfs2d1asd5=\nedgedns_host = sdflskjdf-dfsdfsdf-sdfsdfsdf.luna.akamaiapis.net\nedgedns_access_token = kjdsi3-34rfsdfsdf-234234fsdfsdf\nedgedns_client_token = dkfjdf-342fsdfsd-23fsdfsdfsdf",
"full_plugin_name": "edgedns" "full_plugin_name": "edgedns"
},
"zoneedit": {
"name": "ZoneEdit",
"package_name": "certbot-dns-zoneedit",
"version": "~=0.3.2",
"dependencies": "--no-deps dnspython",
"credentials": "dns_zoneedit_user = <login-user-id>\ndns_zoneedit_token = <dyn-authentication-token>",
"full_plugin_name": "dns-zoneedit"
} }
} }

View File

@ -18,6 +18,7 @@ describe('Proxy Hosts endpoints', () => {
forward_scheme: 'http', forward_scheme: 'http',
forward_host: '1.1.1.1', forward_host: '1.1.1.1',
forward_port: 80, forward_port: 80,
client_max_body_size: 1,
access_list_id: '0', access_list_id: '0',
certificate_id: 0, certificate_id: 0,
meta: { meta: {