Răsfoiți Sursa

Merge pull request #429 from jc21/develop

v2.3.0
jc21 5 ani în urmă
părinte
comite
546f862236

+ 1 - 1
.gitignore

@@ -2,4 +2,4 @@
 .idea
 .idea
 ._*
 ._*
 .vscode
 .vscode
-
+certbot-help.txt

+ 1 - 1
.version

@@ -1 +1 @@
-2.2.4
+2.3.0

+ 44 - 55
Jenkinsfile

@@ -5,6 +5,7 @@ pipeline {
 	options {
 	options {
 		buildDiscarder(logRotator(numToKeepStr: '5'))
 		buildDiscarder(logRotator(numToKeepStr: '5'))
 		disableConcurrentBuilds()
 		disableConcurrentBuilds()
+		ansiColor('xterm')
 	}
 	}
 	environment {
 	environment {
 		IMAGE                      = "nginx-proxy-manager"
 		IMAGE                      = "nginx-proxy-manager"
@@ -55,50 +56,44 @@ pipeline {
 		}
 		}
 		stage('Frontend') {
 		stage('Frontend') {
 			steps {
 			steps {
-				ansiColor('xterm') {
-					sh './scripts/frontend-build'
-				}
+				sh './scripts/frontend-build'
 			}
 			}
 		}
 		}
 		stage('Backend') {
 		stage('Backend') {
 			steps {
 			steps {
-				ansiColor('xterm') {
-					echo 'Checking Syntax ...'
-					// See: https://github.com/yarnpkg/yarn/issues/3254
-					sh '''docker run --rm \\
-						-v "$(pwd)/backend:/app" \\
-						-w /app \\
-						node:latest \\
-						sh -c "yarn install && yarn eslint . && rm -rf node_modules"
-					'''
+				echo 'Checking Syntax ...'
+				// See: https://github.com/yarnpkg/yarn/issues/3254
+				sh '''docker run --rm \\
+					-v "$(pwd)/backend:/app" \\
+					-w /app \\
+					node:latest \\
+					sh -c "yarn install && yarn eslint . && rm -rf node_modules"
+				'''
 
 
-					echo 'Docker Build ...'
-					sh '''docker build --pull --no-cache --squash --compress \\
-						-t "${IMAGE}:ci-${BUILD_NUMBER}" \\
-						-f docker/Dockerfile \\
-						--build-arg TARGETPLATFORM=linux/amd64 \\
-						--build-arg BUILDPLATFORM=linux/amd64 \\
-						--build-arg BUILD_VERSION="${BUILD_VERSION}" \\
-						--build-arg BUILD_COMMIT="${BUILD_COMMIT}" \\
-						--build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \\
-						.
-					'''
-				}
+				echo 'Docker Build ...'
+				sh '''docker build --pull --no-cache --squash --compress \\
+					-t "${IMAGE}:ci-${BUILD_NUMBER}" \\
+					-f docker/Dockerfile \\
+					--build-arg TARGETPLATFORM=linux/amd64 \\
+					--build-arg BUILDPLATFORM=linux/amd64 \\
+					--build-arg BUILD_VERSION="${BUILD_VERSION}" \\
+					--build-arg BUILD_COMMIT="${BUILD_COMMIT}" \\
+					--build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \\
+					.
+				'''
 			}
 			}
 		}
 		}
 		stage('Test') {
 		stage('Test') {
 			steps {
 			steps {
-				ansiColor('xterm') {
-					// Bring up a stack
-					sh 'docker-compose up -d fullstack'
-					sh './scripts/wait-healthy $(docker-compose ps -q fullstack) 120'
+				// Bring up a stack
+				sh 'docker-compose up -d fullstack'
+				sh './scripts/wait-healthy $(docker-compose ps -q fullstack) 120'
 
 
-					// Run tests
-					sh 'rm -rf test/results'
-					sh 'docker-compose up cypress'
-					// Get results
-					sh 'docker cp -L "$(docker-compose ps -q cypress):/results" test/'
-				}
+				// Run tests
+				sh 'rm -rf test/results'
+				sh 'docker-compose up cypress'
+				// Get results
+				sh 'docker cp -L "$(docker-compose ps -q cypress):/results" test/'
 			}
 			}
 			post {
 			post {
 				always {
 				always {
@@ -121,18 +116,16 @@ pipeline {
 				}
 				}
 			}
 			}
 			steps {
 			steps {
-				ansiColor('xterm') {
-					dir(path: 'docs') {
-						sh 'yarn install'
-						sh 'yarn build'
-					}
-
-					dir(path: 'docs/.vuepress/dist') {
-						sh 'tar -czf ../../docs.tgz *'
-					}
+				dir(path: 'docs') {
+					sh 'yarn install'
+					sh 'yarn build'
+				}
 
 
-					archiveArtifacts(artifacts: 'docs/docs.tgz', allowEmptyArchive: false)
+				dir(path: 'docs/.vuepress/dist') {
+					sh 'tar -czf ../../docs.tgz *'
 				}
 				}
+
+				archiveArtifacts(artifacts: 'docs/docs.tgz', allowEmptyArchive: false)
 			}
 			}
 		}
 		}
 		stage('MultiArch Build') {
 		stage('MultiArch Build') {
@@ -142,12 +135,10 @@ pipeline {
 				}
 				}
 			}
 			}
 			steps {
 			steps {
-				ansiColor('xterm') {
-					withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
-						sh "docker login -u '${duser}' -p '${dpass}'"
-						// Buildx with push
-						sh "./scripts/buildx --push ${BUILDX_PUSH_TAGS}"
-					}
+				withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
+					sh "docker login -u '${duser}' -p '${dpass}'"
+					// Buildx with push
+					sh "./scripts/buildx --push ${BUILDX_PUSH_TAGS}"
 				}
 				}
 			}
 			}
 		}
 		}
@@ -193,17 +184,15 @@ pipeline {
 				}
 				}
 			}
 			}
 			steps {
 			steps {
-				ansiColor('xterm') {
-					script {
-						def comment = pullRequest.comment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}`")
-					}
+				script {
+					def comment = pullRequest.comment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}`")
 				}
 				}
 			}
 			}
 		}
 		}
 	}
 	}
 	post {
 	post {
 		always {
 		always {
-			sh 'docker-compose down --rmi all --remove-orphans --volumes -t 30'
+			//sh 'docker-compose down --rmi all --remove-orphans --volumes -t 30'
 			sh 'echo Reverting ownership'
 			sh 'echo Reverting ownership'
 			sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} chown -R $(id -u):$(id -g) /data'
 			sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} chown -R $(id -u):$(id -g) /data'
 		}
 		}

+ 131 - 12
README.md

@@ -1,16 +1,19 @@
 <p align="center">
 <p align="center">
-  <img src="https://nginxproxymanager.com/github.png">
-  <br><br>
-  <img src="https://img.shields.io/badge/version-2.2.4-green.svg?style=for-the-badge">
-  <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">
-  </a>
-  <a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
-    <img src="https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge">
-  </a>
-  <a href="https://ci.nginxproxymanager.com/blue/organizations/jenkins/nginx-proxy-manager/branches/">
-    <img src="https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge">
-  </a>
+	<img src="https://nginxproxymanager.com/github.png">
+	<br><br>
+	<img src="https://img.shields.io/badge/version-2.3.0-green.svg?style=for-the-badge">
+	<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">
+	</a>
+	<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
+		<img src="https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge">
+	</a>
+	<a href="https://ci.nginxproxymanager.com/blue/organizations/jenkins/nginx-proxy-manager/branches/">
+		<img src="https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge">
+	</a>
+	<a href="https://gitter.im/nginx-proxy-manager/community">
+		<img alt="Gitter" src="https://img.shields.io/gitter/room/nginx-proxy-manager/community?style=for-the-badge">
+	</a>
 </p>
 </p>
 
 
 This project comes as a pre-built docker image that enables you to easily forward to your websites
 This project comes as a pre-built docker image that enables you to easily forward to your websites
@@ -48,3 +51,119 @@ I won't go in to too much detail here but here are the basics for someone new to
 2. Add port forwarding for port 80 and 443 to the server hosting this project
 2. Add port forwarding for port 80 and 443 to the server hosting this project
 3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns)
 3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns)
 4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services
 4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services
+
+
+## Contributors
+
+Special thanks to the following contributors:
+
+<!-- prettier-ignore-start -->
+<!-- markdownlint-disable -->
+<table>
+	<tr>
+		<td align="center">
+			<a href="https://github.com/Subv">
+				<img src="https://avatars1.githubusercontent.com/u/357072?s=460&u=d8adcdc91d749ae53e177973ed9b6bb6c4c894a3&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Sebastian Valle</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/Indemnity83">
+				<img src="https://avatars3.githubusercontent.com/u/35218?s=460&u=7082004ff35138157c868d7d9c683ccebfce5968&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Kyle Klaus</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/theraw">
+				<img src="https://avatars1.githubusercontent.com/u/32969774?s=460&u=6b359971e15685fb0359e6a8c065a399b40dc228&v=4" width="80px;" alt=""/>
+				<br /><sub><b>ƬHE ЯAW</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/spalger">
+				<img src="https://avatars2.githubusercontent.com/u/1329312?s=400&u=565223e38f1c052afb4c5dcca3fcf1c63ba17ae7&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Spencer</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/Xantios">
+				<img src="https://avatars3.githubusercontent.com/u/1507836?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Xantios Krugor</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/dpanesso">
+				<img src="https://avatars2.githubusercontent.com/u/2687121?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>David Panesso</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/IronTooch">
+				<img src="https://avatars3.githubusercontent.com/u/27360514?s=460&u=69bf854a6647c55725f62ecb8d39249c6c0b2602&v=4" width="80px;" alt=""/>
+				<br /><sub><b>IronTooch</b></sub>
+			</a>
+		</td>
+	</tr>
+	<tr>
+		<td align="center">
+			<a href="https://github.com/damianog">
+				<img src="https://avatars1.githubusercontent.com/u/2786682?s=460&u=76c6136fae797abb76b951cd8a246dcaecaf21af&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Damiano</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/tfmm">
+				<img src="https://avatars3.githubusercontent.com/u/6880538?s=460&u=ce0160821cc4aa802df8395200f2d4956a5bc541&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Russ</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/margaale">
+				<img src="https://avatars3.githubusercontent.com/u/20794934?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Marcelo Castagna</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/Steven-Harris">
+				<img src="https://avatars2.githubusercontent.com/u/7720242?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Steven Harris</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/jlesage">
+				<img src="https://avatars0.githubusercontent.com/u/1791123?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Jocelyn Le Sage</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/cmer">
+				<img src="https://avatars0.githubusercontent.com/u/412?s=460&u=67dd8b2e3661bfd6f68ec1eaa5b9821bd8a321cd&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Carl Mercier</b></sub>
+			</a>
+		</td>
+		<td align="center">
+			<a href="https://github.com/the1ts">
+				<img src="https://avatars1.githubusercontent.com/u/84956?s=460&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Paul Mansfield</b></sub>
+			</a>
+		</td>
+	</tr>
+	<tr>
+		<td align="center">
+			<a href="https://github.com/OhHeyAlan">
+				<img src="https://avatars0.githubusercontent.com/u/11955126?s=460&u=fbaa5a1a4f73ef8960132c703349bfd037fe2630&v=4" width="80px;" alt=""/>
+				<br /><sub><b>OhHeyAlan</b></sub>
+			</a>
+		</td>
+	</tr>
+	<tr>
+		<td align="center">
+			<a href="https://github.com/dogmatic69">
+				<img src="https://avatars2.githubusercontent.com/u/94674?s=460&u=ca7647de53145c6283b6373ade5dc94ba99347db&v=4" width="80px;" alt=""/>
+				<br /><sub><b>Carl Sutton</b></sub>
+			</a>
+		</td>
+	</tr>
+</table>
+<!-- markdownlint-enable -->
+<!-- prettier-ignore-end -->

+ 3 - 3
backend/internal/access-list.js

@@ -71,7 +71,7 @@ const internalAccessList = {
 				// re-fetch with expansions
 				// re-fetch with expansions
 				return internalAccessList.get(access, {
 				return internalAccessList.get(access, {
 					id:     data.id,
 					id:     data.id,
-					expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients']
+					expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients', 'proxy_hosts.access_list.items']
 				}, true /* <- skip masking */);
 				}, true /* <- skip masking */);
 			})
 			})
 			.then((row) => {
 			.then((row) => {
@@ -216,7 +216,7 @@ const internalAccessList = {
 				// re-fetch with expansions
 				// re-fetch with expansions
 				return internalAccessList.get(access, {
 				return internalAccessList.get(access, {
 					id:     data.id,
 					id:     data.id,
-					expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients']
+					expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients', 'proxy_hosts.access_list.items']
 				}, true /* <- skip masking */);
 				}, true /* <- skip masking */);
 			})
 			})
 			.then((row) => {
 			.then((row) => {
@@ -254,7 +254,7 @@ const internalAccessList = {
 					.joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0')
 					.joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0')
 					.where('access_list.is_deleted', 0)
 					.where('access_list.is_deleted', 0)
 					.andWhere('access_list.id', data.id)
 					.andWhere('access_list.id', data.id)
-					.allowEager('[owner,items,clients,proxy_hosts,proxy_hosts.access_list.clients]')
+					.allowEager('[owner,items,clients,proxy_hosts,proxy_hosts.access_list.clients,proxy_hosts.access_list.items]')
 					.omit(['access_list.is_deleted'])
 					.omit(['access_list.is_deleted'])
 					.first();
 					.first();
 
 

+ 3 - 3
backend/internal/proxy-host.js

@@ -73,7 +73,7 @@ const internalProxyHost = {
 				// re-fetch with cert
 				// re-fetch with cert
 				return internalProxyHost.get(access, {
 				return internalProxyHost.get(access, {
 					id:     row.id,
 					id:     row.id,
-					expand: ['certificate', 'owner', 'access_list.clients']
+					expand: ['certificate', 'owner', 'access_list.clients', 'access_list.items']
 				});
 				});
 			})
 			})
 			.then((row) => {
 			.then((row) => {
@@ -186,7 +186,7 @@ const internalProxyHost = {
 			.then(() => {
 			.then(() => {
 				return internalProxyHost.get(access, {
 				return internalProxyHost.get(access, {
 					id:     data.id,
 					id:     data.id,
-					expand: ['owner', 'certificate', 'access_list.clients']
+					expand: ['owner', 'certificate', 'access_list.clients', 'access_list.items']
 				})
 				})
 					.then((row) => {
 					.then((row) => {
 						// Configure nginx
 						// Configure nginx
@@ -219,7 +219,7 @@ const internalProxyHost = {
 					.query()
 					.query()
 					.where('is_deleted', 0)
 					.where('is_deleted', 0)
 					.andWhere('id', data.id)
 					.andWhere('id', data.id)
-					.allowEager('[owner,access_list,access_list.clients,certificate]')
+					.allowEager('[owner,access_list,access_list.clients,access_list.items,certificate]')
 					.first();
 					.first();
 
 
 				if (access_data.permission_visibility !== 'all') {
 				if (access_data.permission_visibility !== 'all') {

+ 2 - 0
backend/templates/proxy_host.conf

@@ -23,9 +23,11 @@ server {
   location / {
   location / {
 
 
     {% if access_list_id > 0 %}
     {% if access_list_id > 0 %}
+    {% if access_list.items.length > 0 %}
     # Authorization
     # Authorization
     auth_basic            "Authorization required";
     auth_basic            "Authorization required";
     auth_basic_user_file  /data/access/{{ access_list_id }};
     auth_basic_user_file  /data/access/{{ access_list_id }};
+    {% endif %}
 
 
     # Access Rules
     # Access Rules
     {% for client in access_list.clients %}
     {% for client in access_list.clients %}

+ 0 - 1
docker/Dockerfile

@@ -16,7 +16,6 @@ ENV S6_FIX_ATTRS_HIDDEN=1
 ENV NODE_ENV=production
 ENV NODE_ENV=production
 
 
 RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \
 RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \
-	&& rm -rf /etc/nginx \
 	&& apk update \
 	&& apk update \
 	&& apk add python2 certbot jq \
 	&& apk add python2 certbot jq \
 	&& rm -rf /var/cache/apk/*
 	&& rm -rf /var/cache/apk/*

+ 0 - 1
docker/dev/Dockerfile

@@ -6,7 +6,6 @@ ENV SUPPRESS_NO_CONFIG_WARNING=1
 ENV S6_FIX_ATTRS_HIDDEN=1
 ENV S6_FIX_ATTRS_HIDDEN=1
 
 
 RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \
 RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \
-	&& rm -rf /etc/nginx \
 	&& apk update \
 	&& apk update \
 	&& apk add python2 certbot jq \
 	&& apk add python2 certbot jq \
 	&& rm -rf /var/cache/apk/*
 	&& rm -rf /var/cache/apk/*

+ 5 - 2
docker/rootfs/etc/nginx/nginx.conf

@@ -26,12 +26,15 @@ http {
 	tcp_nopush                    on;
 	tcp_nopush                    on;
 	tcp_nodelay                   on;
 	tcp_nodelay                   on;
 	client_body_temp_path         /tmp/nginx/body 1 2;
 	client_body_temp_path         /tmp/nginx/body 1 2;
-	keepalive_timeout             65;
+	keepalive_timeout             90s;
+        proxy_connect_timeout         90s;
+        proxy_send_timeout            90s;
+        proxy_read_timeout            90s;
 	ssl_prefer_server_ciphers     on;
 	ssl_prefer_server_ciphers     on;
 	gzip                          on;
 	gzip                          on;
 	proxy_ignore_client_abort     off;
 	proxy_ignore_client_abort     off;
 	client_max_body_size          2000m;
 	client_max_body_size          2000m;
-	server_names_hash_bucket_size 64;
+	server_names_hash_bucket_size 1024;
 	proxy_http_version            1.1;
 	proxy_http_version            1.1;
 	proxy_set_header              X-Forwarded-Scheme $scheme;
 	proxy_set_header              X-Forwarded-Scheme $scheme;
 	proxy_set_header              X-Forwarded-For $proxy_add_x_forwarded_for;
 	proxy_set_header              X-Forwarded-For $proxy_add_x_forwarded_for;

+ 1 - 1
docker/rootfs/root/.bashrc

@@ -16,5 +16,5 @@ alias h='cd ~;clear;'
 
 
 echo -e -n '\E[1;34m'
 echo -e -n '\E[1;34m'
 figlet -w 120 "NginxProxyManager"
 figlet -w 120 "NginxProxyManager"
-echo -e "\E[1;36mVersion \E[1;32m${NPM_BUILD_VERSION:-2.0.0-dev}\E[1;36m (${NPM_BUILD_COMMIT:-dev}) ${NPM_BUILD_DATE:-0000-00-00}, Nginx \E[1;32m${NGINX_VERSION:-unknown}\E[1;36m, Alpine \E[1;32m${VERSION_ID:-unknown}\E[1;36m, Kernel \E[1;32m$(uname -r)\E[0m"
+echo -e "\E[1;36mVersion \E[1;32m${NPM_BUILD_VERSION:-2.0.0-dev} (${NPM_BUILD_COMMIT:-dev}) ${NPM_BUILD_DATE:-0000-00-00}\E[1;36m, OpenResty \E[1;32m${OPENRESTY_VERSION:-unknown}\E[1;36m, Alpine \E[1;32m${VERSION_ID:-unknown}\E[1;36m, Kernel \E[1;32m$(uname -r)\E[0m"
 echo
 echo

+ 17 - 0
scripts/.common.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Colors
+BLUE='\E[1;34m'
+CYAN='\E[1;36m'
+GREEN='\E[1;32m'
+RED='\E[1;31m'
+RESET='\E[0m'
+YELLOW='\E[1;33m'
+
+export BLUE CYAN GREEN RED RESET YELLOW
+
+# Docker Compose
+COMPOSE_PROJECT_NAME="npmdev"
+COMPOSE_FILE="docker/docker-compose.dev.yml"
+
+export COMPOSE_FILE COMPOSE_PROJECT_NAME

+ 2 - 5
scripts/buildx

@@ -1,10 +1,7 @@
 #!/bin/bash
 #!/bin/bash
 
 
-CYAN='\E[1;36m'
-YELLOW='\E[1;33m'
-BLUE='\E[1;34m'
-GREEN='\E[1;32m'
-RESET='\E[0m'
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+. "$DIR/.common.sh"
 
 
 echo -e "${BLUE}❯ ${CYAN}Building docker multiarch: ${YELLOW}${*}${RESET}"
 echo -e "${BLUE}❯ ${CYAN}Building docker multiarch: ${YELLOW}${*}${RESET}"
 
 

+ 1 - 9
scripts/destroy-dev

@@ -1,15 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-RED='\E[1;31m'
-RESET='\E[0m'
-
-COMPOSE_PROJECT_NAME="npmdev"
-COMPOSE_FILE="docker/docker-compose.dev.yml"
-export COMPOSE_FILE COMPOSE_PROJECT_NAME
+. "$DIR/.common.sh"
 
 
 # Ensure docker-compose exists
 # Ensure docker-compose exists
 # Make sure docker exists
 # Make sure docker exists

+ 1 - 6
scripts/docs-build

@@ -1,12 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-RED='\E[1;31m'
-GREEN='\E[1;32m'
-RESET='\E[0m'
+. "$DIR/.common.sh"
 
 
 # Ensure docker-compose exists
 # Ensure docker-compose exists
 if hash docker 2>/dev/null; then
 if hash docker 2>/dev/null; then

+ 2 - 5
scripts/docs-upload

@@ -2,11 +2,8 @@
 
 
 # Note: This script is designed to be run inside CI builds
 # Note: This script is designed to be run inside CI builds
 
 
-CYAN='\E[1;36m'
-YELLOW='\E[1;33m'
-BLUE='\E[1;34m'
-GREEN='\E[1;32m'
-RESET='\E[0m'
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+. "$DIR/.common.sh"
 
 
 echo -e "${BLUE}❯ ${CYAN}Uploading docs in: ${YELLOW}$1${RESET}"
 echo -e "${BLUE}❯ ${CYAN}Uploading docs in: ${YELLOW}$1${RESET}"
 
 

+ 1 - 6
scripts/frontend-build

@@ -1,12 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-RED='\E[1;31m'
-GREEN='\E[1;32m'
-RESET='\E[0m'
+. "$DIR/.common.sh"
 
 
 DOCKER_IMAGE=jc21/alpine-nginx-full:node
 DOCKER_IMAGE=jc21/alpine-nginx-full:node
 
 

+ 1 - 10
scripts/start-dev

@@ -1,16 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-YELLOW='\E[1;33m'
-RED='\E[1;31m'
-RESET='\E[0m'
-
-COMPOSE_PROJECT_NAME="npmdev"
-COMPOSE_FILE="docker/docker-compose.dev.yml"
-export COMPOSE_FILE COMPOSE_PROJECT_NAME
+. "$DIR/.common.sh"
 
 
 # Ensure docker-compose exists
 # Ensure docker-compose exists
 if hash docker-compose 2>/dev/null; then
 if hash docker-compose 2>/dev/null; then

+ 1 - 9
scripts/stop-dev

@@ -1,15 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-RED='\E[1;31m'
-RESET='\E[0m'
-
-COMPOSE_PROJECT_NAME="npmdev"
-COMPOSE_FILE="docker/docker-compose.dev.yml"
-export COMPOSE_FILE COMPOSE_PROJECT_NAME
+. "$DIR/.common.sh"
 
 
 # Ensure docker-compose exists
 # Ensure docker-compose exists
 # Make sure docker exists
 # Make sure docker exists

+ 1 - 9
scripts/test-dev

@@ -1,15 +1,7 @@
 #!/bin/bash -e
 #!/bin/bash -e
 
 
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-CYAN='\E[1;36m'
-BLUE='\E[1;34m'
-RED='\E[1;31m'
-RESET='\E[0m'
-
-COMPOSE_PROJECT_NAME="npmdev"
-COMPOSE_FILE="docker/docker-compose.dev.yml"
-export COMPOSE_FILE COMPOSE_PROJECT_NAME
+. "$DIR/.common.sh"
 
 
 # Ensure docker-compose exists
 # Ensure docker-compose exists
 if hash docker-compose 2>/dev/null; then
 if hash docker-compose 2>/dev/null; then

+ 2 - 6
scripts/wait-healthy

@@ -1,11 +1,7 @@
 #!/bin/bash
 #!/bin/bash
 
 
-CYAN='\E[1;36m'
-YELLOW='\E[1;33m'
-BLUE='\E[1;34m'
-GREEN='\E[1;32m'
-RED='\E[1;31m'
-RESET='\E[0m'
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+. "$DIR/.common.sh"
 
 
 if [ "$1" == "" ]; then
 if [ "$1" == "" ]; then
 	echo "Waits for a docker container to be healthy."
 	echo "Waits for a docker container to be healthy."

+ 1 - 1
test/cypress/Dockerfile

@@ -1,4 +1,4 @@
-FROM cypress/included:4.0.2
+FROM cypress/included:4.6.0
 
 
 COPY --chown=1000 ./test /test
 COPY --chown=1000 ./test /test
 
 

+ 1 - 1
test/package.json

@@ -7,7 +7,7 @@
 		"@jc21/cypress-swagger-validation": "^0.0.5",
 		"@jc21/cypress-swagger-validation": "^0.0.5",
 		"@jc21/restler": "^3.4.0",
 		"@jc21/restler": "^3.4.0",
 		"chalk": "^3.0.0",
 		"chalk": "^3.0.0",
-		"cypress": "^4.0.2",
+		"cypress": "^4.6.0",
 		"cypress-plugin-retries": "^1.5.2",
 		"cypress-plugin-retries": "^1.5.2",
 		"eslint": "^6.7.2",
 		"eslint": "^6.7.2",
 		"eslint-plugin-align-assignments": "^1.1.2",
 		"eslint-plugin-align-assignments": "^1.1.2",