Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
e923db7e94 | |||
e53d9fa3eb | |||
411734f392 | |||
a457a40359 | |||
caa183c8de | |||
0ea5014edb | |||
046cb0b76e | |||
9fd480cf77 | |||
0f94e68dca | |||
c15edf318d | |||
a73cbc7116 | |||
f9876326c9 | |||
7d5ca84501 | |||
0335370cfb | |||
9b852f01e3 | |||
20fd185652 | |||
ad41986bd5 | |||
c826ed8c1f | |||
eaebc48f66 | |||
eb391959aa | |||
dba4340548 |
41
Jenkinsfile
vendored
41
Jenkinsfile
vendored
@ -18,7 +18,38 @@ pipeline {
|
|||||||
sh 'docker pull $DOCKER_CI_TOOLS'
|
sh 'docker pull $DOCKER_CI_TOOLS'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Build') {
|
stage('Build Develop') {
|
||||||
|
when {
|
||||||
|
branch 'develop'
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
ansiColor('xterm') {
|
||||||
|
// Codebase
|
||||||
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install'
|
||||||
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build'
|
||||||
|
sh 'rm -rf node_modules'
|
||||||
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install --prod'
|
||||||
|
sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune'
|
||||||
|
|
||||||
|
// Docker Build
|
||||||
|
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .'
|
||||||
|
|
||||||
|
// Private Registry
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
||||||
|
sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop'
|
||||||
|
|
||||||
|
// Dockerhub
|
||||||
|
sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:develop'
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
|
||||||
|
sh "docker login -u '${duser}' -p '$dpass'"
|
||||||
|
sh 'docker push docker.io/jc21/$IMAGE_NAME:develop'
|
||||||
|
}
|
||||||
|
|
||||||
|
sh 'docker rmi $TEMP_IMAGE_NAME'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Build Master') {
|
||||||
parallel {
|
parallel {
|
||||||
stage('x86_64') {
|
stage('x86_64') {
|
||||||
when {
|
when {
|
||||||
@ -27,10 +58,10 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
ansiColor('xterm') {
|
ansiColor('xterm') {
|
||||||
// Codebase
|
// Codebase
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn --registry=$NPM_REGISTRY install'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install'
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build'
|
||||||
sh 'rm -rf node_modules'
|
sh 'rm -rf node_modules'
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn --registry=$NPM_REGISTRY install --prod'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install --prod'
|
||||||
sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune'
|
sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune'
|
||||||
|
|
||||||
// Docker Build
|
// Docker Build
|
||||||
@ -70,10 +101,10 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
ansiColor('xterm') {
|
ansiColor('xterm') {
|
||||||
// Codebase
|
// Codebase
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn --registry=$NPM_REGISTRY install'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn install'
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf npm run-script build'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf npm run-script build'
|
||||||
sh 'rm -rf node_modules'
|
sh 'rm -rf node_modules'
|
||||||
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn --registry=$NPM_REGISTRY install --prod'
|
sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn install --prod'
|
||||||
|
|
||||||
// Docker Build
|
// Docker Build
|
||||||
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .'
|
sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .'
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
17
TODO.md
17
TODO.md
@ -1,17 +0,0 @@
|
|||||||
# TODO
|
|
||||||
|
|
||||||
- Dashboard stats are caching instead of querying
|
|
||||||
|
|
||||||
Next version:
|
|
||||||
|
|
||||||
- UI Log tail
|
|
||||||
- Enable/Disable a config
|
|
||||||
|
|
||||||
Testing:
|
|
||||||
|
|
||||||
- Access Levels
|
|
||||||
- Adding a proxy host without access to read certs or access lists
|
|
||||||
- Visibility
|
|
||||||
- Forwarding
|
|
||||||
- Cert renewals
|
|
||||||
- Custom certs
|
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "nginx-proxy-manager",
|
"name": "nginx-proxy-manager",
|
||||||
"version": "2.0.3",
|
"version": "2.0.6",
|
||||||
"description": "A beautiful interface for creating Nginx endpoints",
|
"description": "A beautiful interface for creating Nginx endpoints",
|
||||||
"main": "src/backend/index.js",
|
"main": "src/backend/index.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -30,8 +30,8 @@
|
|||||||
"style-loader": "^0.22.1",
|
"style-loader": "^0.22.1",
|
||||||
"tabler-ui": "git+https://github.com/tabler/tabler.git",
|
"tabler-ui": "git+https://github.com/tabler/tabler.git",
|
||||||
"underscore": "^1.8.3",
|
"underscore": "^1.8.3",
|
||||||
"webpack": "^4.12.0",
|
"webpack": "^4.25.1",
|
||||||
"webpack-cli": "^3.0.8",
|
"webpack-cli": "^3.1.2",
|
||||||
"webpack-visualizer-plugin": "^0.1.11"
|
"webpack-visualizer-plugin": "^0.1.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -36,3 +36,17 @@ server {
|
|||||||
root /var/www/html;
|
root /var/www/html;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Default 443 Host
|
||||||
|
server {
|
||||||
|
listen 443 ssl default;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
access_log /data/logs/default.log proxy;
|
||||||
|
|
||||||
|
ssl_certificate /data/nginx/dummycert.pem;
|
||||||
|
ssl_certificate_key /data/nginx/dummykey.pem;
|
||||||
|
include conf.d/include/ssl-ciphers.conf;
|
||||||
|
|
||||||
|
return 444;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
add_header X-Served-By $host;
|
add_header X-Served-By $host;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
proxy_set_header X-Forwarded-Scheme $scheme;
|
proxy_set_header X-Forwarded-Scheme $scheme;
|
||||||
proxy_set_header X-Forwarded-Protocol $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
proxy_pass http://$server:$port;
|
proxy_pass http://$server:$port;
|
||||||
|
1
rootfs/etc/nginx/conf.d/include/resolvers.conf
Normal file
1
rootfs/etc/nginx/conf.d/include/resolvers.conf
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Intentionally blank
|
@ -51,6 +51,10 @@ http {
|
|||||||
|
|
||||||
access_log /data/logs/default.log proxy;
|
access_log /data/logs/default.log proxy;
|
||||||
|
|
||||||
|
# Dynamically generated resolvers file
|
||||||
|
include /etc/nginx/conf.d/include/resolvers.conf;
|
||||||
|
|
||||||
|
# Files generated by NPM
|
||||||
include /etc/nginx/conf.d/*.conf;
|
include /etc/nginx/conf.d/*.conf;
|
||||||
include /data/nginx/proxy_host/*.conf;
|
include /data/nginx/proxy_host/*.conf;
|
||||||
include /data/nginx/redirection_host/*.conf;
|
include /data/nginx/redirection_host/*.conf;
|
||||||
@ -59,6 +63,7 @@ http {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stream {
|
stream {
|
||||||
|
# Files generated by NPM
|
||||||
include /data/nginx/stream/*.conf;
|
include /data/nginx/stream/*.conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/with-contenv bash
|
#!/usr/bin/with-contenv bash
|
||||||
|
|
||||||
|
# Create required folders
|
||||||
mkdir -p /tmp/nginx/body \
|
mkdir -p /tmp/nginx/body \
|
||||||
/var/log/nginx \
|
/var/log/nginx \
|
||||||
/data/nginx \
|
/data/nginx \
|
||||||
@ -12,9 +13,30 @@ mkdir -p /tmp/nginx/body \
|
|||||||
/data/nginx/dead_host \
|
/data/nginx/dead_host \
|
||||||
/data/nginx/temp \
|
/data/nginx/temp \
|
||||||
/var/lib/nginx/cache/public \
|
/var/lib/nginx/cache/public \
|
||||||
/var/lib/nginx/cache/private
|
/var/lib/nginx/cache/private \
|
||||||
|
/var/cache/nginx/proxy_temp
|
||||||
|
|
||||||
touch /var/log/nginx/error.log && chmod 777 /var/log/nginx/error.log
|
touch /var/log/nginx/error.log && chmod 777 /var/log/nginx/error.log && chmod -R 777 /var/cache/nginx
|
||||||
chown root /tmp/nginx
|
chown root /tmp/nginx
|
||||||
|
|
||||||
|
# Dynamically generate resolvers file
|
||||||
|
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/conf.d/include/resolvers.conf
|
||||||
|
|
||||||
|
# Generate dummy self-signed certificate.
|
||||||
|
if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]
|
||||||
|
then
|
||||||
|
echo "Generating dummy SSL certificate..."
|
||||||
|
openssl req \
|
||||||
|
-new \
|
||||||
|
-newkey rsa:2048 \
|
||||||
|
-days 3650 \
|
||||||
|
-nodes \
|
||||||
|
-x509 \
|
||||||
|
-subj '/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost' \
|
||||||
|
-keyout /data/nginx/dummykey.pem \
|
||||||
|
-out /data/nginx/dummycert.pem
|
||||||
|
echo "Complete"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run
|
||||||
exec nginx
|
exec nginx
|
||||||
|
@ -354,7 +354,7 @@ module.exports = function () {
|
|||||||
.insertAndFetch({
|
.insertAndFetch({
|
||||||
owner_user_id: 1,
|
owner_user_id: 1,
|
||||||
domain_names: [host.hostname],
|
domain_names: [host.hostname],
|
||||||
forward_ip: host.forward_server,
|
forward_host: host.forward_server,
|
||||||
forward_port: host.forward_port,
|
forward_port: host.forward_port,
|
||||||
access_list_id: access_list_id,
|
access_list_id: access_list_id,
|
||||||
certificate_id: certificate_id,
|
certificate_id: certificate_id,
|
||||||
|
36
src/backend/migrations/20181019052346_forward_host.js
Normal file
36
src/backend/migrations/20181019052346_forward_host.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const migrate_name = 'forward_host';
|
||||||
|
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.renameColumn('forward_ip', 'forward_host');
|
||||||
|
})
|
||||||
|
.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);
|
||||||
|
};
|
51
src/backend/migrations/20181113041458_http2_support.js
Normal file
51
src/backend/migrations/20181113041458_http2_support.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const migrate_name = 'http2_support';
|
||||||
|
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('http2_support').notNull().unsigned().defaultTo(0);
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] proxy_host Table altered');
|
||||||
|
|
||||||
|
return knex.schema.table('redirection_host', function (redirection_host) {
|
||||||
|
redirection_host.integer('http2_support').notNull().unsigned().defaultTo(0);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] redirection_host Table altered');
|
||||||
|
|
||||||
|
return knex.schema.table('dead_host', function (dead_host) {
|
||||||
|
dead_host.integer('http2_support').notNull().unsigned().defaultTo(0);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
logger.info('[' + migrate_name + '] dead_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);
|
||||||
|
};
|
||||||
|
|
@ -186,6 +186,11 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^(letsencrypt|other)$"
|
"pattern": "^(letsencrypt|other)$"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"description": "HTTP2 Protocol Support",
|
||||||
|
"example": false,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"description": "Should we block common exploits",
|
"description": "Should we block common exploits",
|
||||||
"example": true,
|
"example": true,
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "../definitions.json#/definitions/ssl_forced"
|
"$ref": "../definitions.json#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "../definitions.json#/definitions/http2_support"
|
||||||
|
},
|
||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
@ -50,6 +53,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
@ -101,6 +107,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
@ -138,6 +147,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"advanced_config": {
|
"advanced_config": {
|
||||||
"$ref": "#/definitions/advanced_config"
|
"$ref": "#/definitions/advanced_config"
|
||||||
},
|
},
|
||||||
|
@ -18,9 +18,10 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "../definitions.json#/definitions/domain_names"
|
"$ref": "../definitions.json#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
"forward_ip": {
|
"forward_host": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "ipv4"
|
"minLength": 1,
|
||||||
|
"maxLength": 50
|
||||||
},
|
},
|
||||||
"forward_port": {
|
"forward_port": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
@ -33,6 +34,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "../definitions.json#/definitions/ssl_forced"
|
"$ref": "../definitions.json#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "../definitions.json#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "../definitions.json#/definitions/block_exploits"
|
"$ref": "../definitions.json#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -67,8 +71,8 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
"forward_ip": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_ip"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
"forward_port": {
|
"forward_port": {
|
||||||
"$ref": "#/definitions/forward_port"
|
"$ref": "#/definitions/forward_port"
|
||||||
@ -79,6 +83,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -131,15 +138,15 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
"domain_names",
|
"domain_names",
|
||||||
"forward_ip",
|
"forward_host",
|
||||||
"forward_port"
|
"forward_port"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
"forward_ip": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_ip"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
"forward_port": {
|
"forward_port": {
|
||||||
"$ref": "#/definitions/forward_port"
|
"$ref": "#/definitions/forward_port"
|
||||||
@ -150,6 +157,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -193,8 +203,8 @@
|
|||||||
"domain_names": {
|
"domain_names": {
|
||||||
"$ref": "#/definitions/domain_names"
|
"$ref": "#/definitions/domain_names"
|
||||||
},
|
},
|
||||||
"forward_ip": {
|
"forward_host": {
|
||||||
"$ref": "#/definitions/forward_ip"
|
"$ref": "#/definitions/forward_host"
|
||||||
},
|
},
|
||||||
"forward_port": {
|
"forward_port": {
|
||||||
"$ref": "#/definitions/forward_port"
|
"$ref": "#/definitions/forward_port"
|
||||||
@ -205,6 +215,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
|
@ -32,6 +32,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "../definitions.json#/definitions/ssl_forced"
|
"$ref": "../definitions.json#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "../definitions.json#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "../definitions.json#/definitions/block_exploits"
|
"$ref": "../definitions.json#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -67,6 +70,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -128,6 +134,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
@ -174,6 +183,9 @@
|
|||||||
"ssl_forced": {
|
"ssl_forced": {
|
||||||
"$ref": "#/definitions/ssl_forced"
|
"$ref": "#/definitions/ssl_forced"
|
||||||
},
|
},
|
||||||
|
"http2_support": {
|
||||||
|
"$ref": "#/definitions/http2_support"
|
||||||
|
},
|
||||||
"block_exploits": {
|
"block_exploits": {
|
||||||
"$ref": "#/definitions/block_exploits"
|
"$ref": "#/definitions/block_exploits"
|
||||||
},
|
},
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
listen 80;
|
listen 80;
|
||||||
{% if certificate -%}
|
{% if certificate -%}
|
||||||
listen 443 ssl;
|
listen 443 ssl{% if http2_support %} http2{% endif %};
|
||||||
{% endif %}
|
{% endif %}
|
||||||
server_name {{ domain_names | join: " " }};
|
server_name {{ domain_names | join: " " }};
|
@ -1,7 +1,7 @@
|
|||||||
{% include "_header_comment.conf" %}
|
{% include "_header_comment.conf" %}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
set $server {{ forward_ip }};
|
set $server "{{ forward_host }}";
|
||||||
set $port {{ forward_port }};
|
set $port {{ forward_port }};
|
||||||
|
|
||||||
{% include "_listen.conf" %}
|
{% include "_listen.conf" %}
|
||||||
|
@ -5,5 +5,5 @@
|
|||||||
<span class="loader"></span>
|
<span class="loader"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript" src="/js/main.js?v=<%= version %>"></script>
|
<script type="text/javascript" src="/js/main.bundle.js?v=<%= version %>"></script>
|
||||||
<%- include partials/footer.ejs %>
|
<%- include partials/footer.ejs %>
|
||||||
|
@ -5,5 +5,5 @@
|
|||||||
<span class="loader"></span>
|
<span class="loader"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript" src="/js/login.js?v=<%= version %>"></script>
|
<script type="text/javascript" src="/js/login.bundle.js?v=<%= version %>"></script>
|
||||||
<%- include partials/footer.ejs %>
|
<%- include partials/footer.ejs %>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-12">
|
<div class="col-sm-6 col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="custom-switch">
|
<label class="custom-switch">
|
||||||
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
@ -45,6 +45,15 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-6 col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="custom-switch">
|
||||||
|
<input type="checkbox" class="custom-switch-input" name="http2_support" value="1"<%- http2_support ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
|
<span class="custom-switch-indicator"></span>
|
||||||
|
<span class="custom-switch-description"><%- i18n('all-hosts', 'http2-support') %></span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Lets encrypt -->
|
<!-- Lets encrypt -->
|
||||||
<div class="col-sm-12 col-md-12 letsencrypt">
|
<div class="col-sm-12 col-md-12 letsencrypt">
|
||||||
|
@ -22,6 +22,7 @@ module.exports = Mn.View.extend({
|
|||||||
save: 'button.save',
|
save: 'button.save',
|
||||||
certificate_select: 'select[name="certificate_id"]',
|
certificate_select: 'select[name="certificate_id"]',
|
||||||
ssl_forced: 'input[name="ssl_forced"]',
|
ssl_forced: 'input[name="ssl_forced"]',
|
||||||
|
http2_support: 'input[name="http2_support"]',
|
||||||
letsencrypt: '.letsencrypt'
|
letsencrypt: '.letsencrypt'
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -35,7 +36,11 @@ module.exports = Mn.View.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
||||||
this.ui.ssl_forced.prop('disabled', !enabled).parents('.form-group').css('opacity', enabled ? 1 : 0.5);
|
this.ui.ssl_forced.add(this.ui.http2_support)
|
||||||
|
.prop('disabled', !enabled)
|
||||||
|
.parents('.form-group')
|
||||||
|
.css('opacity', enabled ? 1 : 0.5);
|
||||||
|
this.ui.http2_support.prop('disabled', !enabled);
|
||||||
},
|
},
|
||||||
|
|
||||||
'click @ui.save': function (e) {
|
'click @ui.save': function (e) {
|
||||||
@ -54,6 +59,10 @@ module.exports = Mn.View.extend({
|
|||||||
data.ssl_forced = true;
|
data.ssl_forced = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof data.http2_support !== 'undefined') {
|
||||||
|
data.http2_support = !!data.http2_support;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof data.domain_names === 'string' && data.domain_names) {
|
if (typeof data.domain_names === 'string' && data.domain_names) {
|
||||||
data.domain_names = data.domain_names.split(',');
|
data.domain_names = data.domain_names.split(',');
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,15 @@
|
|||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
<% domain_names.map(function(host) {
|
<% domain_names.map(function(host) {
|
||||||
%>
|
if (host.indexOf('*') === -1) {
|
||||||
<span class="tag"><%- host %></span>
|
%>
|
||||||
<%
|
<span class="tag host-link hover-red" rel="http<%- certificate_id ? 's' : '' %>://<%- host %>"><%- host %></span>
|
||||||
|
<%
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<span class="tag"><%- host %></span>
|
||||||
|
<%
|
||||||
|
}
|
||||||
});
|
});
|
||||||
%>
|
%>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,8 +9,9 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete'
|
delete: 'a.delete',
|
||||||
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
@ -22,6 +23,12 @@ module.exports = Mn.View.extend({
|
|||||||
'click @ui.delete': function (e) {
|
'click @ui.delete': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxDeadDeleteConfirm(this.model);
|
App.Controller.showNginxDeadDeleteConfirm(this.model);
|
||||||
|
},
|
||||||
|
|
||||||
|
'click @ui.host_link': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let win = window.open($(e.currentTarget).attr('rel'), '_blank');
|
||||||
|
win.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 col-md-8">
|
<div class="col-sm-8 col-md-8">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label"><%- i18n('proxy-hosts', 'forward-ip') %><span class="form-required">*</span></label>
|
<label class="form-label"><%- i18n('proxy-hosts', 'forward-host') %><span class="form-required">*</span></label>
|
||||||
<input type="text" name="forward_ip" class="form-control text-monospace" placeholder="000.000.000.000" value="<%- forward_ip %>" autocomplete="off" maxlength="15" required>
|
<input type="text" name="forward_host" class="form-control text-monospace" placeholder="" value="<%- forward_host %>" autocomplete="off" maxlength="50" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4 col-md-4">
|
<div class="col-sm-4 col-md-4">
|
||||||
@ -82,7 +82,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-12">
|
<div class="col-sm-6 col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="custom-switch">
|
<label class="custom-switch">
|
||||||
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
@ -91,6 +91,15 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-6 col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="custom-switch">
|
||||||
|
<input type="checkbox" class="custom-switch-input" name="http2_support" value="1"<%- http2_support ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
|
<span class="custom-switch-indicator"></span>
|
||||||
|
<span class="custom-switch-description"><%- i18n('all-hosts', 'http2-support') %></span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Lets encrypt -->
|
<!-- Lets encrypt -->
|
||||||
<div class="col-sm-12 col-md-12 letsencrypt">
|
<div class="col-sm-12 col-md-12 letsencrypt">
|
||||||
|
@ -9,7 +9,6 @@ const accessListItemTemplate = require('./access-list-item.ejs');
|
|||||||
const Helpers = require('../../../lib/helpers');
|
const Helpers = require('../../../lib/helpers');
|
||||||
|
|
||||||
require('jquery-serializejson');
|
require('jquery-serializejson');
|
||||||
require('jquery-mask-plugin');
|
|
||||||
require('selectize');
|
require('selectize');
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
module.exports = Mn.View.extend({
|
||||||
@ -19,13 +18,14 @@ module.exports = Mn.View.extend({
|
|||||||
ui: {
|
ui: {
|
||||||
form: 'form',
|
form: 'form',
|
||||||
domain_names: 'input[name="domain_names"]',
|
domain_names: 'input[name="domain_names"]',
|
||||||
forward_ip: 'input[name="forward_ip"]',
|
forward_host: 'input[name="forward_host"]',
|
||||||
buttons: '.modal-footer button',
|
buttons: '.modal-footer button',
|
||||||
cancel: 'button.cancel',
|
cancel: 'button.cancel',
|
||||||
save: 'button.save',
|
save: 'button.save',
|
||||||
certificate_select: 'select[name="certificate_id"]',
|
certificate_select: 'select[name="certificate_id"]',
|
||||||
access_list_select: 'select[name="access_list_id"]',
|
access_list_select: 'select[name="access_list_id"]',
|
||||||
ssl_forced: 'input[name="ssl_forced"]',
|
ssl_forced: 'input[name="ssl_forced"]',
|
||||||
|
http2_support: 'input[name="http2_support"]',
|
||||||
letsencrypt: '.letsencrypt'
|
letsencrypt: '.letsencrypt'
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -39,7 +39,12 @@ module.exports = Mn.View.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
||||||
this.ui.ssl_forced.prop('disabled', !enabled).parents('.form-group').css('opacity', enabled ? 1 : 0.5);
|
this.ui.ssl_forced.add(this.ui.http2_support)
|
||||||
|
.prop('disabled', !enabled)
|
||||||
|
.parents('.form-group')
|
||||||
|
.css('opacity', enabled ? 1 : 0.5);
|
||||||
|
|
||||||
|
this.ui.http2_support.prop('disabled', !enabled);
|
||||||
},
|
},
|
||||||
|
|
||||||
'click @ui.save': function (e) {
|
'click @ui.save': function (e) {
|
||||||
@ -63,6 +68,10 @@ module.exports = Mn.View.extend({
|
|||||||
data.ssl_forced = true;
|
data.ssl_forced = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof data.http2_support !== 'undefined') {
|
||||||
|
data.http2_support = !!data.http2_support;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof data.domain_names === 'string' && data.domain_names) {
|
if (typeof data.domain_names === 'string' && data.domain_names) {
|
||||||
data.domain_names = data.domain_names.split(',');
|
data.domain_names = data.domain_names.split(',');
|
||||||
}
|
}
|
||||||
@ -123,12 +132,6 @@ module.exports = Mn.View.extend({
|
|||||||
onRender: function () {
|
onRender: function () {
|
||||||
let view = this;
|
let view = this;
|
||||||
|
|
||||||
// IP Address
|
|
||||||
this.ui.forward_ip.mask('099.099.099.099', {
|
|
||||||
clearIfNotMatch: true,
|
|
||||||
placeholder: '000.000.000.000'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Domain names
|
// Domain names
|
||||||
this.ui.domain_names.selectize({
|
this.ui.domain_names.selectize({
|
||||||
delimiter: ',',
|
delimiter: ',',
|
||||||
|
@ -6,9 +6,15 @@
|
|||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
<% domain_names.map(function(host) {
|
<% domain_names.map(function(host) {
|
||||||
%>
|
if (host.indexOf('*') === -1) {
|
||||||
<span class="tag"><%- host %></span>
|
%>
|
||||||
<%
|
<span class="tag host-link hover-green" rel="http<%- certificate_id ? 's' : '' %>://<%- host %>"><%- host %></span>
|
||||||
|
<%
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<span class="tag"><%- host %></span>
|
||||||
|
<%
|
||||||
|
}
|
||||||
});
|
});
|
||||||
%>
|
%>
|
||||||
</div>
|
</div>
|
||||||
@ -17,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="text-monospace"><%- forward_ip %>:<%- forward_port %></div>
|
<div class="text-monospace"><%- forward_host %>:<%- forward_port %></div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div><%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %></div>
|
<div><%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %></div>
|
||||||
|
@ -9,8 +9,9 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete'
|
delete: 'a.delete',
|
||||||
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
@ -22,6 +23,12 @@ module.exports = Mn.View.extend({
|
|||||||
'click @ui.delete': function (e) {
|
'click @ui.delete': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxProxyDeleteConfirm(this.model);
|
App.Controller.showNginxProxyDeleteConfirm(this.model);
|
||||||
|
},
|
||||||
|
|
||||||
|
'click @ui.host_link': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let win = window.open($(e.currentTarget).attr('rel'), '_blank');
|
||||||
|
win.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-12">
|
<div class="col-sm-6 col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="custom-switch">
|
<label class="custom-switch">
|
||||||
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
<input type="checkbox" class="custom-switch-input" name="ssl_forced" value="1"<%- ssl_forced ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
@ -69,6 +69,15 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-6 col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="custom-switch">
|
||||||
|
<input type="checkbox" class="custom-switch-input" name="http2_support" value="1"<%- http2_support ? ' checked' : '' %><%- certificate_id ? '' : ' disabled' %>>
|
||||||
|
<span class="custom-switch-indicator"></span>
|
||||||
|
<span class="custom-switch-description"><%- i18n('all-hosts', 'http2-support') %></span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Lets encrypt -->
|
<!-- Lets encrypt -->
|
||||||
<div class="col-sm-12 col-md-12 letsencrypt">
|
<div class="col-sm-12 col-md-12 letsencrypt">
|
||||||
|
@ -22,6 +22,7 @@ module.exports = Mn.View.extend({
|
|||||||
save: 'button.save',
|
save: 'button.save',
|
||||||
certificate_select: 'select[name="certificate_id"]',
|
certificate_select: 'select[name="certificate_id"]',
|
||||||
ssl_forced: 'input[name="ssl_forced"]',
|
ssl_forced: 'input[name="ssl_forced"]',
|
||||||
|
http2_support: 'input[name="http2_support"]',
|
||||||
letsencrypt: '.letsencrypt'
|
letsencrypt: '.letsencrypt'
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -35,7 +36,11 @@ module.exports = Mn.View.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
let enabled = id === 'new' || parseInt(id, 10) > 0;
|
||||||
this.ui.ssl_forced.prop('disabled', !enabled).parents('.form-group').css('opacity', enabled ? 1 : 0.5);
|
this.ui.ssl_forced.add(this.ui.http2_support)
|
||||||
|
.prop('disabled', !enabled)
|
||||||
|
.parents('.form-group')
|
||||||
|
.css('opacity', enabled ? 1 : 0.5);
|
||||||
|
this.ui.http2_support.prop('disabled', !enabled);
|
||||||
},
|
},
|
||||||
|
|
||||||
'click @ui.save': function (e) {
|
'click @ui.save': function (e) {
|
||||||
@ -57,6 +62,10 @@ module.exports = Mn.View.extend({
|
|||||||
data.ssl_forced = true;
|
data.ssl_forced = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof data.http2_support !== 'undefined') {
|
||||||
|
data.http2_support = !!data.http2_support;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof data.domain_names === 'string' && data.domain_names) {
|
if (typeof data.domain_names === 'string' && data.domain_names) {
|
||||||
data.domain_names = data.domain_names.split(',');
|
data.domain_names = data.domain_names.split(',');
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,15 @@
|
|||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
<% domain_names.map(function(host) {
|
<% domain_names.map(function(host) {
|
||||||
%>
|
if (host.indexOf('*') === -1) {
|
||||||
<span class="tag"><%- host %></span>
|
%>
|
||||||
<%
|
<span class="tag host-link hover-yellow" rel="http<%- certificate_id ? 's' : '' %>://<%- host %>"><%- host %></span>
|
||||||
|
<%
|
||||||
|
} else {
|
||||||
|
%>
|
||||||
|
<span class="tag"><%- host %></span>
|
||||||
|
<%
|
||||||
|
}
|
||||||
});
|
});
|
||||||
%>
|
%>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,8 +9,9 @@ module.exports = Mn.View.extend({
|
|||||||
tagName: 'tr',
|
tagName: 'tr',
|
||||||
|
|
||||||
ui: {
|
ui: {
|
||||||
edit: 'a.edit',
|
edit: 'a.edit',
|
||||||
delete: 'a.delete'
|
delete: 'a.delete',
|
||||||
|
host_link: '.host-link'
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
@ -22,6 +23,12 @@ module.exports = Mn.View.extend({
|
|||||||
'click @ui.delete': function (e) {
|
'click @ui.delete': function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
App.Controller.showNginxRedirectionDeleteConfirm(this.model);
|
App.Controller.showNginxRedirectionDeleteConfirm(this.model);
|
||||||
|
},
|
||||||
|
|
||||||
|
'click @ui.host_link': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let win = window.open($(e.currentTarget).attr('rel'), '_blank');
|
||||||
|
win.focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
"details": "Details",
|
"details": "Details",
|
||||||
"enable-ssl": "Enable SSL",
|
"enable-ssl": "Enable SSL",
|
||||||
"force-ssl": "Force SSL",
|
"force-ssl": "Force SSL",
|
||||||
|
"http2-support": "HTTP/2 Support",
|
||||||
"domain-names": "Domain Names",
|
"domain-names": "Domain Names",
|
||||||
"cert-provider": "Certificate Provider",
|
"cert-provider": "Certificate Provider",
|
||||||
"block-exploits": "Block Common Exploits",
|
"block-exploits": "Block Common Exploits",
|
||||||
@ -92,7 +93,7 @@
|
|||||||
"empty": "There are no Proxy Hosts",
|
"empty": "There are no Proxy Hosts",
|
||||||
"add": "Add Proxy Host",
|
"add": "Add Proxy Host",
|
||||||
"form-title": "{id, select, undefined{New} other{Edit}} Proxy Host",
|
"form-title": "{id, select, undefined{New} other{Edit}} Proxy Host",
|
||||||
"forward-ip": "Forward IP",
|
"forward-host": "Forward Hostname / IP",
|
||||||
"forward-port": "Forward Port",
|
"forward-port": "Forward Port",
|
||||||
"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>?",
|
||||||
|
@ -13,6 +13,7 @@ const model = Backbone.Model.extend({
|
|||||||
domain_names: [],
|
domain_names: [],
|
||||||
certificate_id: 0,
|
certificate_id: 0,
|
||||||
ssl_forced: false,
|
ssl_forced: false,
|
||||||
|
http2_support: false,
|
||||||
meta: {},
|
meta: {},
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
|
@ -11,7 +11,7 @@ const model = Backbone.Model.extend({
|
|||||||
created_on: null,
|
created_on: null,
|
||||||
modified_on: null,
|
modified_on: null,
|
||||||
domain_names: [],
|
domain_names: [],
|
||||||
forward_ip: '',
|
forward_host: '',
|
||||||
forward_port: null,
|
forward_port: null,
|
||||||
access_list_id: 0,
|
access_list_id: 0,
|
||||||
certificate_id: 0,
|
certificate_id: 0,
|
||||||
@ -19,6 +19,7 @@ const model = Backbone.Model.extend({
|
|||||||
caching_enabled: false,
|
caching_enabled: false,
|
||||||
allow_websocket_upgrade: false,
|
allow_websocket_upgrade: false,
|
||||||
block_exploits: false,
|
block_exploits: false,
|
||||||
|
http2_support: false,
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
meta: {},
|
meta: {},
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
|
@ -16,6 +16,7 @@ const model = Backbone.Model.extend({
|
|||||||
certificate_id: 0,
|
certificate_id: 0,
|
||||||
ssl_forced: false,
|
ssl_forced: false,
|
||||||
block_exploits: false,
|
block_exploits: false,
|
||||||
|
http2_support: false,
|
||||||
advanced_config: '',
|
advanced_config: '',
|
||||||
meta: {},
|
meta: {},
|
||||||
// The following are expansions:
|
// The following are expansions:
|
||||||
|
@ -3,6 +3,18 @@ $yellow: #f1c40f;
|
|||||||
$blue: #467fcf;
|
$blue: #467fcf;
|
||||||
$pink: #f66d9b;
|
$pink: #f66d9b;
|
||||||
|
|
||||||
|
.tag.hover-green:hover, .tag.hover-green:active, .tag.hover-green:focus {
|
||||||
|
background-color: #5eba00;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag.hover-red:hover, .tag.hover-red:active, .tag.hover-red:focus {
|
||||||
|
background-color: #cd201f;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
/* For Card bodies where I don't want padding */
|
/* For Card bodies where I don't want padding */
|
||||||
.card-body.no-padding {
|
.card-body.no-padding {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@ -28,6 +40,12 @@ $pink: #f66d9b;
|
|||||||
border-color: $teal;
|
border-color: $teal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag.hover-teal:hover, .tag.hover-teal:active, .tag.hover-teal:focus {
|
||||||
|
background-color: $teal;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
/* Yellow Outline Buttons */
|
/* Yellow Outline Buttons */
|
||||||
.btn-outline-yellow {
|
.btn-outline-yellow {
|
||||||
color: $yellow;
|
color: $yellow;
|
||||||
@ -48,6 +66,12 @@ $pink: #f66d9b;
|
|||||||
border-color: $yellow;
|
border-color: $yellow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag.hover-yellow:hover, .tag.hover-yellow:active, .tag.hover-yellow:focus {
|
||||||
|
background-color: $yellow;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
/* Blue Outline Buttons */
|
/* Blue Outline Buttons */
|
||||||
.btn-outline-blue {
|
.btn-outline-blue {
|
||||||
color: $blue;
|
color: $blue;
|
||||||
@ -68,6 +92,12 @@ $pink: #f66d9b;
|
|||||||
border-color: $blue;
|
border-color: $blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag.hover-blue:hover, .tag.hover-blue:active, .tag.hover-blue:focus {
|
||||||
|
background-color: $blue;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
/* Pink Outline Buttons */
|
/* Pink Outline Buttons */
|
||||||
.btn-outline-pink {
|
.btn-outline-pink {
|
||||||
color: $pink;
|
color: $pink;
|
||||||
@ -88,6 +118,11 @@ $pink: #f66d9b;
|
|||||||
border-color: $pink;
|
border-color: $pink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag.hover-pink:hover, .tag.hover-pink:active, .tag.hover-pink:focus {
|
||||||
|
background-color: $pink;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
/* dimmer */
|
/* dimmer */
|
||||||
|
|
||||||
.dimmer .loader {
|
.dimmer .loader {
|
||||||
|
@ -10,9 +10,10 @@ module.exports = {
|
|||||||
login: './src/frontend/js/login.js'
|
login: './src/frontend/js/login.js'
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
path: path.resolve(__dirname, 'dist'),
|
path: path.resolve(__dirname, 'dist'),
|
||||||
filename: 'js/[name].js',
|
filename: 'js/[name].bundle.js',
|
||||||
publicPath: '/'
|
chunkFilename: 'js/[name].bundle.[id].js',
|
||||||
|
publicPath: '/'
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
@ -108,41 +109,6 @@ module.exports = {
|
|||||||
to: 'images',
|
to: 'images',
|
||||||
toType: 'dir',
|
toType: 'dir',
|
||||||
context: '/app'
|
context: '/app'
|
||||||
}]),
|
}])
|
||||||
new webpack.optimize.LimitChunkCountPlugin({
|
]
|
||||||
maxChunks: 1, // Must be greater than or equal to one
|
|
||||||
minChunkSize: 999999999
|
|
||||||
})
|
|
||||||
],
|
|
||||||
/*
|
|
||||||
optimization: {
|
|
||||||
splitChunks: {
|
|
||||||
chunks (chunk) {
|
|
||||||
// exclude `my-excluded-chunk`
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
minSize: 999999999,
|
|
||||||
minChunks: 1,
|
|
||||||
name: true,
|
|
||||||
cacheGroups: {
|
|
||||||
vendors: {
|
|
||||||
test: /[\\/]node_modules[\\/]/,
|
|
||||||
priority: -10
|
|
||||||
},
|
|
||||||
default: {
|
|
||||||
minChunks: 2,
|
|
||||||
priority: -20,
|
|
||||||
reuseExistingChunk: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
devServer: {
|
|
||||||
contentBase: path.join(__dirname, 'dist'),
|
|
||||||
compress: true,
|
|
||||||
port: 8080,
|
|
||||||
disableHostCheck: true,
|
|
||||||
host: '0.0.0.0'
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user