Compare commits
	
		
			74 Commits
		
	
	
		
			v2.11.1
			...
			51414ced3a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					51414ced3a | ||
| 
						 | 
					5e35e538af | ||
| 
						 | 
					13fec42d1f | ||
| 
						 | 
					b4560d7dde | ||
| 
						 | 
					d3a654b546 | ||
| 
						 | 
					bed387ebd4 | ||
| 
						 | 
					6ac9a82279 | ||
| 
						 | 
					3754a569ba | ||
| 
						 | 
					b383f46656 | ||
| 
						 | 
					516b4d991c | ||
| 
						 | 
					8d80af3a26 | ||
| 
						 | 
					1f45e6a5e9 | ||
| 
						 | 
					dcb9628c36 | ||
| 
						 | 
					029b184398 | ||
| 
						 | 
					2422587530 | ||
| 
						 | 
					4ee940d3dc | ||
| 
						 | 
					47dddc548b | ||
| 
						 | 
					256a667e2c | ||
| 
						 | 
					79cd0c5294 | ||
| 
						 | 
					09a03edfd7 | ||
| 
						 | 
					35f0fe745d | ||
| 
						 | 
					f1e433714e | ||
| 
						 | 
					035eaed0a4 | ||
| 
						 | 
					4b100a384d | ||
| 
						 | 
					c5c5fa0a5a | ||
| 
						 | 
					280bac8b43 | ||
| 
						 | 
					02aefa50cd | ||
| 
						 | 
					4d91cfc397 | ||
| 
						 | 
					79a453f2fe | ||
| 
						 | 
					c62c09569d | ||
| 
						 | 
					09bcf4010c | ||
| 
						 | 
					6aeade6c98 | ||
| 
						 | 
					8655b7d2db | ||
| 
						 | 
					2d929dffa8 | ||
| 
						 | 
					52eaa042d8 | ||
| 
						 | 
					b35aa50b88 | ||
| 
						 | 
					c575a706b5 | ||
| 
						 | 
					587b97c2d3 | ||
| 
						 | 
					317003beda | ||
| 
						 | 
					5a761236c5 | ||
| 
						 | 
					b135527347 | ||
| 
						 | 
					abca9cc89c | ||
| 
						 | 
					6721923601 | ||
| 
						 | 
					a88f77c1a5 | ||
| 
						 | 
					a5b21d0306 | ||
| 
						 | 
					8eab8d71f2 | ||
| 
						 | 
					d06572bb5f | ||
| 
						 | 
					d40f9e06fc | ||
| 
						 | 
					69ec017a53 | ||
| 
						 | 
					fa67f257ef | ||
| 
						 | 
					0dcd648c9d | ||
| 
						 | 
					c989a282e3 | ||
| 
						 | 
					5aff969c04 | ||
| 
						 | 
					bfbf7519ec | ||
| 
						 | 
					bf36c7966a | ||
| 
						 | 
					63cd9ba08f | ||
| 
						 | 
					e3d4882c3d | ||
| 
						 | 
					3e1b73143e | ||
| 
						 | 
					10ece3548d | ||
| 
						 | 
					0503a6af75 | ||
| 
						 | 
					55d765e785 | ||
| 
						 | 
					1fb9a75a33 | ||
| 
						 | 
					9c2e838d61 | ||
| 
						 | 
					c55e47aacf | ||
| 
						 | 
					40d81d6e44 | ||
| 
						 | 
					1c84eaac02 | ||
| 
						 | 
					577954ef8c | ||
| 
						 | 
					f0c75641d8 | ||
| 
						 | 
					e42e2acf12 | ||
| 
						 | 
					eaa11fe460 | ||
| 
						 | 
					5b53825ccb | ||
| 
						 | 
					a94660120f | ||
| 
						 | 
					39f4836485 | ||
| 
						 | 
					47b868bfc6 | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -3,3 +3,7 @@
 | 
				
			|||||||
._*
 | 
					._*
 | 
				
			||||||
.vscode
 | 
					.vscode
 | 
				
			||||||
certbot-help.txt
 | 
					certbot-help.txt
 | 
				
			||||||
 | 
					test/node_modules
 | 
				
			||||||
 | 
					*/node_modules
 | 
				
			||||||
 | 
					docker/dev/dnsrouter-config.json.tmp
 | 
				
			||||||
 | 
					docker/dev/resolv.conf
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										124
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -18,10 +18,8 @@ pipeline {
 | 
				
			|||||||
		BUILD_VERSION              = getVersion()
 | 
							BUILD_VERSION              = getVersion()
 | 
				
			||||||
		MAJOR_VERSION              = '2'
 | 
							MAJOR_VERSION              = '2'
 | 
				
			||||||
		BRANCH_LOWER               = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}"
 | 
							BRANCH_LOWER               = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}"
 | 
				
			||||||
		COMPOSE_PROJECT_NAME       = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}"
 | 
							BUILDX_NAME                = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}"
 | 
				
			||||||
		COMPOSE_FILE               = 'docker/docker-compose.ci.yml'
 | 
					 | 
				
			||||||
		COMPOSE_INTERACTIVE_NO_CLI = 1
 | 
							COMPOSE_INTERACTIVE_NO_CLI = 1
 | 
				
			||||||
		BUILDX_NAME                = "${COMPOSE_PROJECT_NAME}"
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	stages {
 | 
						stages {
 | 
				
			||||||
		stage('Environment') {
 | 
							stage('Environment') {
 | 
				
			||||||
@@ -92,81 +90,63 @@ pipeline {
 | 
				
			|||||||
							sh 'yarn install'
 | 
												sh 'yarn install'
 | 
				
			||||||
							sh 'yarn build'
 | 
												sh 'yarn build'
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						dir(path: 'docs/.vuepress/dist') {
 | 
					 | 
				
			||||||
							sh 'tar -czf ../../docs.tgz *'
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
						archiveArtifacts(artifacts: 'docs/docs.tgz', allowEmptyArchive: false)
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				stage('Cypress') {
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							stage('Test Sqlite') {
 | 
				
			||||||
 | 
								environment {
 | 
				
			||||||
 | 
									COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_sqlite"
 | 
				
			||||||
 | 
									COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.sqlite.yml'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								when {
 | 
				
			||||||
 | 
									not {
 | 
				
			||||||
 | 
										equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			steps {
 | 
								steps {
 | 
				
			||||||
						// Creating will also create the network prior to
 | 
									sh 'rm -rf ./test/results/junit/*'
 | 
				
			||||||
						// using it in parallel stages below and mitigating
 | 
									sh './scripts/ci/fulltest-cypress'
 | 
				
			||||||
						// a race condition.
 | 
					 | 
				
			||||||
						sh 'docker-compose build cypress-sqlite'
 | 
					 | 
				
			||||||
						sh 'docker-compose build cypress-mysql'
 | 
					 | 
				
			||||||
						sh 'docker-compose create cypress-sqlite'
 | 
					 | 
				
			||||||
						sh 'docker-compose create cypress-mysql'
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		stage('Integration Tests') {
 | 
					 | 
				
			||||||
			parallel {
 | 
					 | 
				
			||||||
				stage('Sqlite') {
 | 
					 | 
				
			||||||
					steps {
 | 
					 | 
				
			||||||
						// Bring up a stack
 | 
					 | 
				
			||||||
						sh 'docker-compose up -d fullstack-sqlite'
 | 
					 | 
				
			||||||
						sh './scripts/wait-healthy $(docker-compose ps --all -q fullstack-sqlite) 120'
 | 
					 | 
				
			||||||
						// Stop and Start it, as this will test it's ability to restart with existing data
 | 
					 | 
				
			||||||
						sh 'docker-compose stop fullstack-sqlite'
 | 
					 | 
				
			||||||
						sh 'docker-compose start fullstack-sqlite'
 | 
					 | 
				
			||||||
						sh './scripts/wait-healthy $(docker-compose ps --all -q fullstack-sqlite) 120'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
						// Run tests
 | 
					 | 
				
			||||||
						sh 'rm -rf test/results-sqlite'
 | 
					 | 
				
			||||||
						sh 'docker-compose up cypress-sqlite'
 | 
					 | 
				
			||||||
						// Get results
 | 
					 | 
				
			||||||
						sh 'docker cp -L "$(docker-compose ps --all -q cypress-sqlite):/test/results" test/results-sqlite'
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			post {
 | 
								post {
 | 
				
			||||||
				always {
 | 
									always {
 | 
				
			||||||
					// Dumps to analyze later
 | 
										// Dumps to analyze later
 | 
				
			||||||
					sh 'mkdir -p debug/sqlite'
 | 
										sh 'mkdir -p debug/sqlite'
 | 
				
			||||||
							sh 'docker-compose logs fullstack-sqlite > debug/sqlite/docker_fullstack_sqlite.log'
 | 
										sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/sqlite/docker_fullstack.log 2>&1'
 | 
				
			||||||
							// Cypress videos and screenshot artifacts
 | 
										sh 'docker logs $(docker-compose ps --all -q stepca) > debug/sqlite/docker_stepca.log 2>&1'
 | 
				
			||||||
							dir(path: 'test/results-sqlite') {
 | 
										sh 'docker logs $(docker-compose ps --all -q pdns) > debug/sqlite/docker_pdns.log 2>&1'
 | 
				
			||||||
								archiveArtifacts allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml'
 | 
										sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/sqlite/docker_pdns-db.log 2>&1'
 | 
				
			||||||
							}
 | 
										sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/sqlite/docker_dnsrouter.log 2>&1'
 | 
				
			||||||
							junit 'test/results-sqlite/junit/*'
 | 
										junit 'test/results/junit/*'
 | 
				
			||||||
 | 
										sh 'docker-compose down --remove-orphans --volumes -t 30 || true'
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
				stage('Mysql') {
 | 
							stage('Test Mysql') {
 | 
				
			||||||
 | 
								environment {
 | 
				
			||||||
 | 
									COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_mysql"
 | 
				
			||||||
 | 
									COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.mysql.yml'
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								when {
 | 
				
			||||||
 | 
									not {
 | 
				
			||||||
 | 
										equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			steps {
 | 
								steps {
 | 
				
			||||||
						// Bring up a stack
 | 
									sh 'rm -rf ./test/results/junit/*'
 | 
				
			||||||
						sh 'docker-compose up -d fullstack-mysql'
 | 
									sh './scripts/ci/fulltest-cypress'
 | 
				
			||||||
						sh './scripts/wait-healthy $(docker-compose ps --all -q fullstack-mysql) 120'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
						// Run tests
 | 
					 | 
				
			||||||
						sh 'rm -rf test/results-mysql'
 | 
					 | 
				
			||||||
						sh 'docker-compose up cypress-mysql'
 | 
					 | 
				
			||||||
						// Get results
 | 
					 | 
				
			||||||
						sh 'docker cp -L "$(docker-compose ps --all -q cypress-mysql):/test/results" test/results-mysql'
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			post {
 | 
								post {
 | 
				
			||||||
				always {
 | 
									always {
 | 
				
			||||||
					// Dumps to analyze later
 | 
										// Dumps to analyze later
 | 
				
			||||||
					sh 'mkdir -p debug/mysql'
 | 
										sh 'mkdir -p debug/mysql'
 | 
				
			||||||
							sh 'docker-compose logs fullstack-mysql > debug/mysql/docker_fullstack_mysql.log'
 | 
										sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/mysql/docker_fullstack.log 2>&1'
 | 
				
			||||||
							sh 'docker-compose logs db > debug/mysql/docker_db.log'
 | 
										sh 'docker logs $(docker-compose ps --all -q stepca) > debug/mysql/docker_stepca.log 2>&1'
 | 
				
			||||||
							// Cypress videos and screenshot artifacts
 | 
										sh 'docker logs $(docker-compose ps --all -q pdns) > debug/mysql/docker_pdns.log 2>&1'
 | 
				
			||||||
							dir(path: 'test/results-mysql') {
 | 
										sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/mysql/docker_pdns-db.log 2>&1'
 | 
				
			||||||
								archiveArtifacts allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml'
 | 
										sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/mysql/docker_dnsrouter.log 2>&1'
 | 
				
			||||||
							}
 | 
										junit 'test/results/junit/*'
 | 
				
			||||||
							junit 'test/results-mysql/junit/*'
 | 
										sh 'docker-compose down --remove-orphans --volumes -t 30 || true'
 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -185,30 +165,17 @@ pipeline {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		stage('Docs / Comment') {
 | 
							stage('Docs / Comment') {
 | 
				
			||||||
			parallel {
 | 
								parallel {
 | 
				
			||||||
				stage('Master Docs') {
 | 
									stage('Docs Job') {
 | 
				
			||||||
					when {
 | 
										when {
 | 
				
			||||||
						allOf {
 | 
											allOf {
 | 
				
			||||||
							branch 'master'
 | 
												branch pattern: "^(develop|master)\$", comparator: "REGEXP"
 | 
				
			||||||
							not {
 | 
												not {
 | 
				
			||||||
								equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
													equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					steps {
 | 
										steps {
 | 
				
			||||||
						npmDocsReleaseMaster()
 | 
											build wait: false, job: 'nginx-proxy-manager-docs', parameters: [string(name: 'docs_branch', value: "$BRANCH_NAME")]
 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				stage('Develop Docs') {
 | 
					 | 
				
			||||||
					when {
 | 
					 | 
				
			||||||
						allOf {
 | 
					 | 
				
			||||||
							branch 'develop'
 | 
					 | 
				
			||||||
							not {
 | 
					 | 
				
			||||||
								equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					steps {
 | 
					 | 
				
			||||||
						npmDocsReleaseDevelop()
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				stage('PR Comment') {
 | 
									stage('PR Comment') {
 | 
				
			||||||
@@ -231,9 +198,8 @@ pipeline {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	post {
 | 
						post {
 | 
				
			||||||
		always {
 | 
							always {
 | 
				
			||||||
			sh 'docker-compose down --remove-orphans --volumes -t 30'
 | 
					 | 
				
			||||||
			sh 'echo Reverting ownership'
 | 
								sh 'echo Reverting ownership'
 | 
				
			||||||
			sh 'docker run --rm -v $(pwd):/data jc21/ci-tools chown -R $(id -u):$(id -g) /data'
 | 
								sh 'docker run --rm -v "$(pwd):/data" jc21/ci-tools chown -R "$(id -u):$(id -g)" /data'
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		success {
 | 
							success {
 | 
				
			||||||
			juxtapose event: 'success'
 | 
								juxtapose event: 'success'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.11.1-green.svg?style=for-the-badge">
 | 
						<img src="https://img.shields.io/badge/version-2.11.2-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>
 | 
				
			||||||
@@ -19,7 +19,7 @@ running at home or otherwise, including free SSL, without having to know too muc
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Project Goal
 | 
					## Project Goal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
I created this project to fill a personal need to provide users with a easy way to accomplish reverse
 | 
					I created this project to fill a personal need to provide users with an easy way to accomplish reverse
 | 
				
			||||||
proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed.
 | 
					proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed.
 | 
				
			||||||
While there might be advanced options they are optional and the project should be as simple as possible
 | 
					While there might be advanced options they are optional and the project should be as simple as possible
 | 
				
			||||||
so that the barrier for entry here is low.
 | 
					so that the barrier for entry here is low.
 | 
				
			||||||
@@ -59,7 +59,7 @@ I won't go in to too much detail here but here are the basics for someone new to
 | 
				
			|||||||
version: '3.8'
 | 
					version: '3.8'
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  app:
 | 
					  app:
 | 
				
			||||||
    image: 'jc21/nginx-proxy-manager:latest'
 | 
					    image: 'docker.io/jc21/nginx-proxy-manager:latest'
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - '80:80'
 | 
					      - '80:80'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,7 +204,6 @@ const internalAccessList = {
 | 
				
			|||||||
						});
 | 
											});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			.then(internalNginx.reload)
 | 
					 | 
				
			||||||
			.then(() => {
 | 
								.then(() => {
 | 
				
			||||||
				// Add to audit log
 | 
									// Add to audit log
 | 
				
			||||||
				return internalAuditLog.add(access, {
 | 
									return internalAuditLog.add(access, {
 | 
				
			||||||
@@ -227,7 +226,7 @@ const internalAccessList = {
 | 
				
			|||||||
						if (row.proxy_host_count) {
 | 
											if (row.proxy_host_count) {
 | 
				
			||||||
							return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
 | 
												return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					})
 | 
										}).then(internalNginx.reload)
 | 
				
			||||||
					.then(() => {
 | 
										.then(() => {
 | 
				
			||||||
						return internalAccessList.maskItems(row);
 | 
											return internalAccessList.maskItems(row);
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@
 | 
				
			|||||||
		"bcrypt": "^5.0.0",
 | 
							"bcrypt": "^5.0.0",
 | 
				
			||||||
		"body-parser": "^1.19.0",
 | 
							"body-parser": "^1.19.0",
 | 
				
			||||||
		"compression": "^1.7.4",
 | 
							"compression": "^1.7.4",
 | 
				
			||||||
		"express": "^4.17.3",
 | 
							"express": "^4.19.2",
 | 
				
			||||||
		"express-fileupload": "^1.1.9",
 | 
							"express-fileupload": "^1.1.9",
 | 
				
			||||||
		"gravatar": "^1.8.0",
 | 
							"gravatar": "^1.8.0",
 | 
				
			||||||
		"json-schema-ref-parser": "^8.0.0",
 | 
							"json-schema-ref-parser": "^8.0.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -172,7 +172,7 @@
 | 
				
			|||||||
      "description": "Domain Names separated by a comma",
 | 
					      "description": "Domain Names separated by a comma",
 | 
				
			||||||
      "example": "*.jc21.com,blog.jc21.com",
 | 
					      "example": "*.jc21.com,blog.jc21.com",
 | 
				
			||||||
      "type": "array",
 | 
					      "type": "array",
 | 
				
			||||||
      "maxItems": 30,
 | 
					      "maxItems": 100,
 | 
				
			||||||
      "uniqueItems": true,
 | 
					      "uniqueItems": true,
 | 
				
			||||||
      "items": {
 | 
					      "items": {
 | 
				
			||||||
        "type": "string",
 | 
					        "type": "string",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
  {% include "_hsts_map.conf" %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  location {{ path }} {
 | 
					  location {{ path }} {
 | 
				
			||||||
 | 
					    {{ advanced_config }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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-Proto  $scheme;
 | 
					    proxy_set_header X-Forwarded-Proto  $scheme;
 | 
				
			||||||
@@ -19,8 +19,5 @@
 | 
				
			|||||||
    proxy_set_header Connection $http_connection;
 | 
					    proxy_set_header Connection $http_connection;
 | 
				
			||||||
    proxy_http_version 1.1;
 | 
					    proxy_http_version 1.1;
 | 
				
			||||||
    {% endif %}
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {{ advanced_config }}
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -407,21 +407,23 @@ blueimp-md5@^2.16.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96"
 | 
					  resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96"
 | 
				
			||||||
  integrity sha512-x5PKJHY5rHQYaADj6NwPUR2QRCUVSggPzrUKkeENpj871o9l9IefJbO2jkT5UvYykeOK9dx0VmkIo6dZ+vThYw==
 | 
					  integrity sha512-x5PKJHY5rHQYaADj6NwPUR2QRCUVSggPzrUKkeENpj871o9l9IefJbO2jkT5UvYykeOK9dx0VmkIo6dZ+vThYw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
body-parser@1.19.2, body-parser@^1.19.0:
 | 
					body-parser@1.20.2, body-parser@^1.19.0:
 | 
				
			||||||
  version "1.19.2"
 | 
					  version "1.20.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
 | 
					  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
 | 
				
			||||||
  integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
 | 
					  integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bytes "3.1.2"
 | 
					    bytes "3.1.2"
 | 
				
			||||||
    content-type "~1.0.4"
 | 
					    content-type "~1.0.5"
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "2.0.0"
 | 
				
			||||||
    http-errors "1.8.1"
 | 
					    destroy "1.2.0"
 | 
				
			||||||
 | 
					    http-errors "2.0.0"
 | 
				
			||||||
    iconv-lite "0.4.24"
 | 
					    iconv-lite "0.4.24"
 | 
				
			||||||
    on-finished "~2.3.0"
 | 
					    on-finished "2.4.1"
 | 
				
			||||||
    qs "6.9.7"
 | 
					    qs "6.11.0"
 | 
				
			||||||
    raw-body "2.4.3"
 | 
					    raw-body "2.5.2"
 | 
				
			||||||
    type-is "~1.6.18"
 | 
					    type-is "~1.6.18"
 | 
				
			||||||
 | 
					    unpipe "1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
boxen@^4.2.0:
 | 
					boxen@^4.2.0:
 | 
				
			||||||
  version "4.2.0"
 | 
					  version "4.2.0"
 | 
				
			||||||
@@ -524,6 +526,17 @@ cacheable-request@^6.0.0:
 | 
				
			|||||||
    normalize-url "^4.1.0"
 | 
					    normalize-url "^4.1.0"
 | 
				
			||||||
    responselike "^1.0.2"
 | 
					    responselike "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					call-bind@^1.0.7:
 | 
				
			||||||
 | 
					  version "1.0.7"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
 | 
				
			||||||
 | 
					  integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    es-define-property "^1.0.0"
 | 
				
			||||||
 | 
					    es-errors "^1.3.0"
 | 
				
			||||||
 | 
					    function-bind "^1.1.2"
 | 
				
			||||||
 | 
					    get-intrinsic "^1.2.4"
 | 
				
			||||||
 | 
					    set-function-length "^1.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
call-me-maybe@^1.0.1:
 | 
					call-me-maybe@^1.0.1:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
 | 
					  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
 | 
				
			||||||
@@ -728,20 +741,20 @@ content-disposition@0.5.4:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    safe-buffer "5.2.1"
 | 
					    safe-buffer "5.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
content-type@~1.0.4:
 | 
					content-type@~1.0.4, content-type@~1.0.5:
 | 
				
			||||||
  version "1.0.4"
 | 
					  version "1.0.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 | 
					  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
 | 
				
			||||||
  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 | 
					  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cookie-signature@1.0.6:
 | 
					cookie-signature@1.0.6:
 | 
				
			||||||
  version "1.0.6"
 | 
					  version "1.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
 | 
					  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
 | 
				
			||||||
  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
 | 
					  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cookie@0.4.2:
 | 
					cookie@0.6.0:
 | 
				
			||||||
  version "0.4.2"
 | 
					  version "0.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
 | 
					  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
 | 
				
			||||||
  integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
 | 
					  integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-util-is@~1.0.0:
 | 
					core-util-is@~1.0.0:
 | 
				
			||||||
  version "1.0.2"
 | 
					  version "1.0.2"
 | 
				
			||||||
@@ -831,25 +844,29 @@ defer-to-connect@^1.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
 | 
					  resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
 | 
				
			||||||
  integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
 | 
					  integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define-data-property@^1.1.4:
 | 
				
			||||||
 | 
					  version "1.1.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
 | 
				
			||||||
 | 
					  integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    es-define-property "^1.0.0"
 | 
				
			||||||
 | 
					    es-errors "^1.3.0"
 | 
				
			||||||
 | 
					    gopd "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
delegates@^1.0.0:
 | 
					delegates@^1.0.0:
 | 
				
			||||||
  version "1.0.0"
 | 
					  version "1.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
 | 
					  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
 | 
				
			||||||
  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
 | 
					  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
depd@^2.0.0:
 | 
					depd@2.0.0, depd@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
 | 
					  resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
 | 
				
			||||||
  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
 | 
					  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
depd@~1.1.2:
 | 
					destroy@1.2.0:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
 | 
					  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
 | 
				
			||||||
  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
 | 
					  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
 | 
				
			||||||
 | 
					 | 
				
			||||||
destroy@~1.0.4:
 | 
					 | 
				
			||||||
  version "1.0.4"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
 | 
					 | 
				
			||||||
  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
detect-libc@^1.0.2:
 | 
					detect-libc@^1.0.2:
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
@@ -950,6 +967,18 @@ error-ex@^1.3.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    is-arrayish "^0.2.1"
 | 
					    is-arrayish "^0.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					es-define-property@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
 | 
				
			||||||
 | 
					  integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    get-intrinsic "^1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					es-errors@^1.3.0:
 | 
				
			||||||
 | 
					  version "1.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
 | 
				
			||||||
 | 
					  integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
escalade@^3.1.1:
 | 
					escalade@^3.1.1:
 | 
				
			||||||
  version "3.1.1"
 | 
					  version "3.1.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
 | 
					  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
 | 
				
			||||||
@@ -1104,38 +1133,39 @@ express-fileupload@^1.1.9:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    busboy "^0.3.1"
 | 
					    busboy "^0.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
express@^4.17.3:
 | 
					express@^4.19.2:
 | 
				
			||||||
  version "4.17.3"
 | 
					  version "4.19.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
 | 
					  resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
 | 
				
			||||||
  integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
 | 
					  integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    accepts "~1.3.8"
 | 
					    accepts "~1.3.8"
 | 
				
			||||||
    array-flatten "1.1.1"
 | 
					    array-flatten "1.1.1"
 | 
				
			||||||
    body-parser "1.19.2"
 | 
					    body-parser "1.20.2"
 | 
				
			||||||
    content-disposition "0.5.4"
 | 
					    content-disposition "0.5.4"
 | 
				
			||||||
    content-type "~1.0.4"
 | 
					    content-type "~1.0.4"
 | 
				
			||||||
    cookie "0.4.2"
 | 
					    cookie "0.6.0"
 | 
				
			||||||
    cookie-signature "1.0.6"
 | 
					    cookie-signature "1.0.6"
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "2.0.0"
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
    escape-html "~1.0.3"
 | 
					    escape-html "~1.0.3"
 | 
				
			||||||
    etag "~1.8.1"
 | 
					    etag "~1.8.1"
 | 
				
			||||||
    finalhandler "~1.1.2"
 | 
					    finalhandler "1.2.0"
 | 
				
			||||||
    fresh "0.5.2"
 | 
					    fresh "0.5.2"
 | 
				
			||||||
 | 
					    http-errors "2.0.0"
 | 
				
			||||||
    merge-descriptors "1.0.1"
 | 
					    merge-descriptors "1.0.1"
 | 
				
			||||||
    methods "~1.1.2"
 | 
					    methods "~1.1.2"
 | 
				
			||||||
    on-finished "~2.3.0"
 | 
					    on-finished "2.4.1"
 | 
				
			||||||
    parseurl "~1.3.3"
 | 
					    parseurl "~1.3.3"
 | 
				
			||||||
    path-to-regexp "0.1.7"
 | 
					    path-to-regexp "0.1.7"
 | 
				
			||||||
    proxy-addr "~2.0.7"
 | 
					    proxy-addr "~2.0.7"
 | 
				
			||||||
    qs "6.9.7"
 | 
					    qs "6.11.0"
 | 
				
			||||||
    range-parser "~1.2.1"
 | 
					    range-parser "~1.2.1"
 | 
				
			||||||
    safe-buffer "5.2.1"
 | 
					    safe-buffer "5.2.1"
 | 
				
			||||||
    send "0.17.2"
 | 
					    send "0.18.0"
 | 
				
			||||||
    serve-static "1.14.2"
 | 
					    serve-static "1.15.0"
 | 
				
			||||||
    setprototypeof "1.2.0"
 | 
					    setprototypeof "1.2.0"
 | 
				
			||||||
    statuses "~1.5.0"
 | 
					    statuses "2.0.1"
 | 
				
			||||||
    type-is "~1.6.18"
 | 
					    type-is "~1.6.18"
 | 
				
			||||||
    utils-merge "1.0.1"
 | 
					    utils-merge "1.0.1"
 | 
				
			||||||
    vary "~1.1.2"
 | 
					    vary "~1.1.2"
 | 
				
			||||||
@@ -1183,17 +1213,17 @@ fill-range@^7.0.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    to-regex-range "^5.0.1"
 | 
					    to-regex-range "^5.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
finalhandler@~1.1.2:
 | 
					finalhandler@1.2.0:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
 | 
					  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
 | 
				
			||||||
  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
 | 
					  integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
    escape-html "~1.0.3"
 | 
					    escape-html "~1.0.3"
 | 
				
			||||||
    on-finished "~2.3.0"
 | 
					    on-finished "2.4.1"
 | 
				
			||||||
    parseurl "~1.3.3"
 | 
					    parseurl "~1.3.3"
 | 
				
			||||||
    statuses "~1.5.0"
 | 
					    statuses "2.0.1"
 | 
				
			||||||
    unpipe "~1.0.0"
 | 
					    unpipe "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
find-up@^2.0.0:
 | 
					find-up@^2.0.0:
 | 
				
			||||||
@@ -1276,6 +1306,11 @@ function-bind@^1.1.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 | 
					  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 | 
				
			||||||
  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 | 
					  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function-bind@^1.1.2:
 | 
				
			||||||
 | 
					  version "1.1.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
 | 
				
			||||||
 | 
					  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gauge@^3.0.0:
 | 
					gauge@^3.0.0:
 | 
				
			||||||
  version "3.0.2"
 | 
					  version "3.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
 | 
					  resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
 | 
				
			||||||
@@ -1324,6 +1359,17 @@ get-caller-file@^2.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
 | 
					  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
 | 
				
			||||||
  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 | 
					  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
 | 
				
			||||||
 | 
					  version "1.2.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
 | 
				
			||||||
 | 
					  integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    es-errors "^1.3.0"
 | 
				
			||||||
 | 
					    function-bind "^1.1.2"
 | 
				
			||||||
 | 
					    has-proto "^1.0.1"
 | 
				
			||||||
 | 
					    has-symbols "^1.0.3"
 | 
				
			||||||
 | 
					    hasown "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get-package-type@^0.1.0:
 | 
					get-package-type@^0.1.0:
 | 
				
			||||||
  version "0.1.0"
 | 
					  version "0.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
 | 
					  resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
 | 
				
			||||||
@@ -1400,6 +1446,13 @@ globals@^13.19.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    type-fest "^0.20.2"
 | 
					    type-fest "^0.20.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gopd@^1.0.1:
 | 
				
			||||||
 | 
					  version "1.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
 | 
				
			||||||
 | 
					  integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    get-intrinsic "^1.1.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
got@^9.6.0:
 | 
					got@^9.6.0:
 | 
				
			||||||
  version "9.6.0"
 | 
					  version "9.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
 | 
					  resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
 | 
				
			||||||
@@ -1457,6 +1510,23 @@ has-flag@^4.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
 | 
					  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
 | 
				
			||||||
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 | 
					  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					has-property-descriptors@^1.0.2:
 | 
				
			||||||
 | 
					  version "1.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
 | 
				
			||||||
 | 
					  integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    es-define-property "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					has-proto@^1.0.1:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
 | 
				
			||||||
 | 
					  integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					has-symbols@^1.0.3:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
 | 
				
			||||||
 | 
					  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
has-unicode@^2.0.0, has-unicode@^2.0.1:
 | 
					has-unicode@^2.0.0, has-unicode@^2.0.1:
 | 
				
			||||||
  version "2.0.1"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
 | 
					  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
 | 
				
			||||||
@@ -1474,20 +1544,27 @@ has@^1.0.3:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    function-bind "^1.1.1"
 | 
					    function-bind "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hasown@^2.0.0:
 | 
				
			||||||
 | 
					  version "2.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
 | 
				
			||||||
 | 
					  integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    function-bind "^1.1.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
 | 
					http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
 | 
				
			||||||
  version "4.1.1"
 | 
					  version "4.1.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
 | 
					  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
 | 
				
			||||||
  integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
 | 
					  integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
http-errors@1.8.1:
 | 
					http-errors@2.0.0:
 | 
				
			||||||
  version "1.8.1"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
 | 
					  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
 | 
				
			||||||
  integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
 | 
					  integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "2.0.0"
 | 
				
			||||||
    inherits "2.0.4"
 | 
					    inherits "2.0.4"
 | 
				
			||||||
    setprototypeof "1.2.0"
 | 
					    setprototypeof "1.2.0"
 | 
				
			||||||
    statuses ">= 1.5.0 < 2"
 | 
					    statuses "2.0.1"
 | 
				
			||||||
    toidentifier "1.0.1"
 | 
					    toidentifier "1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
http-proxy-agent@^4.0.1:
 | 
					http-proxy-agent@^4.0.1:
 | 
				
			||||||
@@ -1615,9 +1692,9 @@ interpret@^2.2.0:
 | 
				
			|||||||
  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
 | 
					  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ip@^2.0.0:
 | 
					ip@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
 | 
					  resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
 | 
				
			||||||
  integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
 | 
					  integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ipaddr.js@1.9.1:
 | 
					ipaddr.js@1.9.1:
 | 
				
			||||||
  version "1.9.1"
 | 
					  version "1.9.1"
 | 
				
			||||||
@@ -2365,6 +2442,11 @@ object-assign@^4.1.0, object-assign@^4.1.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 | 
					  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 | 
				
			||||||
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 | 
					  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					object-inspect@^1.13.1:
 | 
				
			||||||
 | 
					  version "1.13.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
 | 
				
			||||||
 | 
					  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
objection@3.0.1:
 | 
					objection@3.0.1:
 | 
				
			||||||
  version "3.0.1"
 | 
					  version "3.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/objection/-/objection-3.0.1.tgz#f67dc698187d10524e5d1b5d37a54e5bba49a42a"
 | 
					  resolved "https://registry.yarnpkg.com/objection/-/objection-3.0.1.tgz#f67dc698187d10524e5d1b5d37a54e5bba49a42a"
 | 
				
			||||||
@@ -2373,10 +2455,10 @@ objection@3.0.1:
 | 
				
			|||||||
    ajv "^8.6.2"
 | 
					    ajv "^8.6.2"
 | 
				
			||||||
    db-errors "^0.2.3"
 | 
					    db-errors "^0.2.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on-finished@~2.3.0:
 | 
					on-finished@2.4.1:
 | 
				
			||||||
  version "2.3.0"
 | 
					  version "2.4.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
 | 
					  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
 | 
				
			||||||
  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
 | 
					  integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    ee-first "1.1.1"
 | 
					    ee-first "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2653,10 +2735,12 @@ pupa@^2.0.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    escape-goat "^2.0.0"
 | 
					    escape-goat "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qs@6.9.7:
 | 
					qs@6.11.0:
 | 
				
			||||||
  version "6.9.7"
 | 
					  version "6.11.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
 | 
					  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
 | 
				
			||||||
  integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
 | 
					  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    side-channel "^1.0.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
querystring@0.2.0:
 | 
					querystring@0.2.0:
 | 
				
			||||||
  version "0.2.0"
 | 
					  version "0.2.0"
 | 
				
			||||||
@@ -2673,13 +2757,13 @@ range-parser@~1.2.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
 | 
					  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
 | 
				
			||||||
  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
 | 
					  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
raw-body@2.4.3:
 | 
					raw-body@2.5.2:
 | 
				
			||||||
  version "2.4.3"
 | 
					  version "2.5.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
 | 
					  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
 | 
				
			||||||
  integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==
 | 
					  integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    bytes "3.1.2"
 | 
					    bytes "3.1.2"
 | 
				
			||||||
    http-errors "1.8.1"
 | 
					    http-errors "2.0.0"
 | 
				
			||||||
    iconv-lite "0.4.24"
 | 
					    iconv-lite "0.4.24"
 | 
				
			||||||
    unpipe "1.0.0"
 | 
					    unpipe "1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2866,40 +2950,52 @@ semver@^7.3.5, semver@^7.3.8:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    lru-cache "^6.0.0"
 | 
					    lru-cache "^6.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
send@0.17.2:
 | 
					send@0.18.0:
 | 
				
			||||||
  version "0.17.2"
 | 
					  version "0.18.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
 | 
					  resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
 | 
				
			||||||
  integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
 | 
					  integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "2.6.9"
 | 
					    debug "2.6.9"
 | 
				
			||||||
    depd "~1.1.2"
 | 
					    depd "2.0.0"
 | 
				
			||||||
    destroy "~1.0.4"
 | 
					    destroy "1.2.0"
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
    escape-html "~1.0.3"
 | 
					    escape-html "~1.0.3"
 | 
				
			||||||
    etag "~1.8.1"
 | 
					    etag "~1.8.1"
 | 
				
			||||||
    fresh "0.5.2"
 | 
					    fresh "0.5.2"
 | 
				
			||||||
    http-errors "1.8.1"
 | 
					    http-errors "2.0.0"
 | 
				
			||||||
    mime "1.6.0"
 | 
					    mime "1.6.0"
 | 
				
			||||||
    ms "2.1.3"
 | 
					    ms "2.1.3"
 | 
				
			||||||
    on-finished "~2.3.0"
 | 
					    on-finished "2.4.1"
 | 
				
			||||||
    range-parser "~1.2.1"
 | 
					    range-parser "~1.2.1"
 | 
				
			||||||
    statuses "~1.5.0"
 | 
					    statuses "2.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
serve-static@1.14.2:
 | 
					serve-static@1.15.0:
 | 
				
			||||||
  version "1.14.2"
 | 
					  version "1.15.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
 | 
					  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
 | 
				
			||||||
  integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
 | 
					  integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    encodeurl "~1.0.2"
 | 
					    encodeurl "~1.0.2"
 | 
				
			||||||
    escape-html "~1.0.3"
 | 
					    escape-html "~1.0.3"
 | 
				
			||||||
    parseurl "~1.3.3"
 | 
					    parseurl "~1.3.3"
 | 
				
			||||||
    send "0.17.2"
 | 
					    send "0.18.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set-blocking@^2.0.0, set-blocking@~2.0.0:
 | 
					set-blocking@^2.0.0, set-blocking@~2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
 | 
					  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
 | 
				
			||||||
  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 | 
					  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set-function-length@^1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
 | 
				
			||||||
 | 
					  integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    define-data-property "^1.1.4"
 | 
				
			||||||
 | 
					    es-errors "^1.3.0"
 | 
				
			||||||
 | 
					    function-bind "^1.1.2"
 | 
				
			||||||
 | 
					    get-intrinsic "^1.2.4"
 | 
				
			||||||
 | 
					    gopd "^1.0.1"
 | 
				
			||||||
 | 
					    has-property-descriptors "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
setprototypeof@1.2.0:
 | 
					setprototypeof@1.2.0:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
 | 
					  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
 | 
				
			||||||
@@ -2917,6 +3013,16 @@ shebang-regex@^3.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
 | 
					  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
 | 
				
			||||||
  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 | 
					  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					side-channel@^1.0.4:
 | 
				
			||||||
 | 
					  version "1.0.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
 | 
				
			||||||
 | 
					  integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    call-bind "^1.0.7"
 | 
				
			||||||
 | 
					    es-errors "^1.3.0"
 | 
				
			||||||
 | 
					    get-intrinsic "^1.2.4"
 | 
				
			||||||
 | 
					    object-inspect "^1.13.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
signal-exit@^3.0.0, signal-exit@^3.0.2:
 | 
					signal-exit@^3.0.0, signal-exit@^3.0.2:
 | 
				
			||||||
  version "3.0.3"
 | 
					  version "3.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
 | 
					  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
 | 
				
			||||||
@@ -2986,10 +3092,10 @@ ssri@^8.0.0, ssri@^8.0.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    minipass "^3.1.1"
 | 
					    minipass "^3.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
 | 
					statuses@2.0.1:
 | 
				
			||||||
  version "1.5.0"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
 | 
					  resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
 | 
				
			||||||
  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
 | 
					  integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
streamsearch@0.1.2:
 | 
					streamsearch@0.1.2:
 | 
				
			||||||
  version "0.1.2"
 | 
					  version "0.1.2"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								docker/dev/dnsrouter-config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "log": {
 | 
				
			||||||
 | 
					        "format": "nice",
 | 
				
			||||||
 | 
					        "level": "debug"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "servers": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "host": "0.0.0.0",
 | 
				
			||||||
 | 
					            "port": 53,
 | 
				
			||||||
 | 
					            "upstreams": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "regex": "website[0-9]+.example\\.com",
 | 
				
			||||||
 | 
					                    "upstream": "127.0.0.11"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "regex": ".*\\.example\\.com",
 | 
				
			||||||
 | 
					                    "upstream": "1.1.1.1"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "regex": "local",
 | 
				
			||||||
 | 
					                    "nxdomain": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "internal": null,
 | 
				
			||||||
 | 
					            "default_upstream": "127.0.0.11"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								docker/dev/letsencrypt.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					text = True
 | 
				
			||||||
 | 
					non-interactive = True
 | 
				
			||||||
 | 
					webroot-path = /data/letsencrypt-acme-challenge
 | 
				
			||||||
 | 
					key-type = ecdsa
 | 
				
			||||||
 | 
					elliptic-curve = secp384r1
 | 
				
			||||||
 | 
					preferred-chain = ISRG Root X1
 | 
				
			||||||
 | 
					server =
 | 
				
			||||||
							
								
								
									
										255
									
								
								docker/dev/pdns-db.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,255 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					How this was generated:
 | 
				
			||||||
 | 
					1. bring up an empty pdns stack
 | 
				
			||||||
 | 
					2. use api to create a zone ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					curl -X POST \
 | 
				
			||||||
 | 
					  'http://npm.dev:8081/api/v1/servers/localhost/zones' \
 | 
				
			||||||
 | 
					  --header 'X-API-Key: npm' \
 | 
				
			||||||
 | 
					  --header 'Content-Type: application/json' \
 | 
				
			||||||
 | 
					  --data-raw '{
 | 
				
			||||||
 | 
					  "name": "example.com.",
 | 
				
			||||||
 | 
					  "kind": "Native",
 | 
				
			||||||
 | 
					  "masters": [],
 | 
				
			||||||
 | 
					  "nameservers": [
 | 
				
			||||||
 | 
					    "ns1.pdns.",
 | 
				
			||||||
 | 
					    "ns2.pdns."
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Dump sql:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker exec -ti npm.pdns.db mysqldump -u pdns -p pdns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 | 
				
			||||||
 | 
					/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
 | 
				
			||||||
 | 
					/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 | 
				
			||||||
 | 
					/*!40101 SET NAMES utf8mb4 */;
 | 
				
			||||||
 | 
					/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 | 
				
			||||||
 | 
					/*!40103 SET TIME_ZONE='+00:00' */;
 | 
				
			||||||
 | 
					/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
 | 
				
			||||||
 | 
					/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 | 
				
			||||||
 | 
					/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 | 
				
			||||||
 | 
					/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `comments`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `comments`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `comments` (
 | 
				
			||||||
 | 
					  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `domain_id` int(11) NOT NULL,
 | 
				
			||||||
 | 
					  `name` varchar(255) NOT NULL,
 | 
				
			||||||
 | 
					  `type` varchar(10) NOT NULL,
 | 
				
			||||||
 | 
					  `modified_at` int(11) NOT NULL,
 | 
				
			||||||
 | 
					  `account` varchar(40) CHARACTER SET utf8mb3 DEFAULT NULL,
 | 
				
			||||||
 | 
					  `comment` text CHARACTER SET utf8mb3 NOT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `comments_name_type_idx` (`name`,`type`),
 | 
				
			||||||
 | 
					  KEY `comments_order_idx` (`domain_id`,`modified_at`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `comments`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `comments` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `comments` DISABLE KEYS */;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `comments` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `cryptokeys`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `cryptokeys`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `cryptokeys` (
 | 
				
			||||||
 | 
					  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `domain_id` int(11) NOT NULL,
 | 
				
			||||||
 | 
					  `flags` int(11) NOT NULL,
 | 
				
			||||||
 | 
					  `active` tinyint(1) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `published` tinyint(1) DEFAULT 1,
 | 
				
			||||||
 | 
					  `content` text DEFAULT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `domainidindex` (`domain_id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `cryptokeys`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `cryptokeys` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `cryptokeys` DISABLE KEYS */;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `cryptokeys` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `domainmetadata`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `domainmetadata`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `domainmetadata` (
 | 
				
			||||||
 | 
					  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `domain_id` int(11) NOT NULL,
 | 
				
			||||||
 | 
					  `kind` varchar(32) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `content` text DEFAULT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `domainmetadata_idx` (`domain_id`,`kind`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `domainmetadata`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `domainmetadata` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `domainmetadata` DISABLE KEYS */;
 | 
				
			||||||
 | 
					INSERT INTO `domainmetadata` VALUES
 | 
				
			||||||
 | 
					(1,1,'SOA-EDIT-API','DEFAULT');
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `domainmetadata` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `domains`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `domains`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `domains` (
 | 
				
			||||||
 | 
					  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `name` varchar(255) NOT NULL,
 | 
				
			||||||
 | 
					  `master` varchar(128) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `last_check` int(11) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `type` varchar(8) NOT NULL,
 | 
				
			||||||
 | 
					  `notified_serial` int(10) unsigned DEFAULT NULL,
 | 
				
			||||||
 | 
					  `account` varchar(40) CHARACTER SET utf8mb3 DEFAULT NULL,
 | 
				
			||||||
 | 
					  `options` varchar(64000) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `catalog` varchar(255) DEFAULT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  UNIQUE KEY `name_index` (`name`),
 | 
				
			||||||
 | 
					  KEY `catalog_idx` (`catalog`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `domains`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `domains` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `domains` DISABLE KEYS */;
 | 
				
			||||||
 | 
					INSERT INTO `domains` VALUES
 | 
				
			||||||
 | 
					(1,'example.com','',NULL,'NATIVE',NULL,'',NULL,NULL);
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `domains` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `records`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `records`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `records` (
 | 
				
			||||||
 | 
					  `id` bigint(20) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `domain_id` int(11) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `type` varchar(10) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `content` varchar(64000) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `ttl` int(11) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `prio` int(11) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `disabled` tinyint(1) DEFAULT 0,
 | 
				
			||||||
 | 
					  `ordername` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
 | 
				
			||||||
 | 
					  `auth` tinyint(1) DEFAULT 1,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  KEY `nametype_index` (`name`,`type`),
 | 
				
			||||||
 | 
					  KEY `domain_id` (`domain_id`),
 | 
				
			||||||
 | 
					  KEY `ordername` (`ordername`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `records`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `records` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `records` DISABLE KEYS */;
 | 
				
			||||||
 | 
					INSERT INTO `records` VALUES
 | 
				
			||||||
 | 
					(1,1,'example.com','NS','ns1.pdns',1500,0,0,NULL,1),
 | 
				
			||||||
 | 
					(2,1,'example.com','NS','ns2.pdns',1500,0,0,NULL,1),
 | 
				
			||||||
 | 
					(3,1,'example.com','SOA','a.misconfigured.dns.server.invalid hostmaster.example.com 2023030501 10800 3600 604800 3600',1500,0,0,NULL,1);
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `records` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `supermasters`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `supermasters`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `supermasters` (
 | 
				
			||||||
 | 
					  `ip` varchar(64) NOT NULL,
 | 
				
			||||||
 | 
					  `nameserver` varchar(255) NOT NULL,
 | 
				
			||||||
 | 
					  `account` varchar(40) CHARACTER SET utf8mb3 NOT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`ip`,`nameserver`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `supermasters`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `supermasters` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `supermasters` DISABLE KEYS */;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `supermasters` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Table structure for table `tsigkeys`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS `tsigkeys`;
 | 
				
			||||||
 | 
					/*!40101 SET @saved_cs_client     = @@character_set_client */;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = utf8 */;
 | 
				
			||||||
 | 
					CREATE TABLE `tsigkeys` (
 | 
				
			||||||
 | 
					  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					  `name` varchar(255) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `algorithm` varchar(50) DEFAULT NULL,
 | 
				
			||||||
 | 
					  `secret` varchar(255) DEFAULT NULL,
 | 
				
			||||||
 | 
					  PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					  UNIQUE KEY `namealgoindex` (`name`,`algorithm`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
				
			||||||
 | 
					/*!40101 SET character_set_client = @saved_cs_client */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- Dumping data for table `tsigkeys`
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCK TABLES `tsigkeys` WRITE;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `tsigkeys` DISABLE KEYS */;
 | 
				
			||||||
 | 
					/*!40000 ALTER TABLE `tsigkeys` ENABLE KEYS */;
 | 
				
			||||||
 | 
					UNLOCK TABLES;
 | 
				
			||||||
 | 
					/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 | 
				
			||||||
 | 
					/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 | 
				
			||||||
 | 
					/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
 | 
				
			||||||
 | 
					/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 | 
				
			||||||
 | 
					/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
 | 
				
			||||||
 | 
					/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 | 
				
			||||||
 | 
					/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 | 
				
			||||||
							
								
								
									
										12
									
								
								docker/dev/pebble-config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
						"pebble": {
 | 
				
			||||||
 | 
							"listenAddress": "0.0.0.0:443",
 | 
				
			||||||
 | 
							"managementListenAddress": "0.0.0.0:15000",
 | 
				
			||||||
 | 
							"certificate": "test/certs/localhost/cert.pem",
 | 
				
			||||||
 | 
							"privateKey": "test/certs/localhost/key.pem",
 | 
				
			||||||
 | 
							"httpPort": 80,
 | 
				
			||||||
 | 
							"tlsPort": 443,
 | 
				
			||||||
 | 
							"ocspResponderURL": "",
 | 
				
			||||||
 | 
							"externalAccountBindingRequired": false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								docker/docker-compose.ci.mysql.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production.
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fullstack:
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      DB_MYSQL_HOST: 'db-mysql'
 | 
				
			||||||
 | 
					      DB_MYSQL_PORT: '3306'
 | 
				
			||||||
 | 
					      DB_MYSQL_USER: 'npm'
 | 
				
			||||||
 | 
					      DB_MYSQL_PASSWORD: 'npmpass'
 | 
				
			||||||
 | 
					      DB_MYSQL_NAME: 'npm'
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - db-mysql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  db-mysql:
 | 
				
			||||||
 | 
					    image: jc21/mariadb-aria
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      MYSQL_ROOT_PASSWORD: 'npm'
 | 
				
			||||||
 | 
					      MYSQL_DATABASE: 'npm'
 | 
				
			||||||
 | 
					      MYSQL_USER: 'npm'
 | 
				
			||||||
 | 
					      MYSQL_PASSWORD: 'npmpass'
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - mysql_vol:/var/lib/mysql
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - fulltest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volumes:
 | 
				
			||||||
 | 
					  mysql_vol:
 | 
				
			||||||
							
								
								
									
										9
									
								
								docker/docker-compose.ci.sqlite.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production.
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fullstack:
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      DB_SQLITE_FILE: '/data/mydb.sqlite'
 | 
				
			||||||
 | 
					      PUID: 1000
 | 
				
			||||||
 | 
					      PGID: 1000
 | 
				
			||||||
 | 
					      DISABLE_IPV6: 'true'
 | 
				
			||||||
@@ -1,91 +1,110 @@
 | 
				
			|||||||
# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production.
 | 
					# WARNING: This is a CI docker-compose file used for building
 | 
				
			||||||
version: '3.8'
 | 
					# and testing of the entire app, it should not be used for production.
 | 
				
			||||||
 | 
					# This is a base compose file, it should be extended with a
 | 
				
			||||||
 | 
					# docker-compose.ci.*.yml file
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fullstack-mysql:
 | 
					  fullstack:
 | 
				
			||||||
    image: "${IMAGE}:ci-${BUILD_NUMBER}"
 | 
					    image: "${IMAGE}:${BRANCH_LOWER}-ci-${BUILD_NUMBER}"
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      DEBUG: 'true'
 | 
					      DEBUG: 'true'
 | 
				
			||||||
      LE_STAGING: 'true'
 | 
					 | 
				
			||||||
      FORCE_COLOR: 1
 | 
					      FORCE_COLOR: 1
 | 
				
			||||||
      DB_MYSQL_HOST: 'db'
 | 
					 | 
				
			||||||
      DB_MYSQL_PORT: '3306'
 | 
					 | 
				
			||||||
      DB_MYSQL_USER: 'npm'
 | 
					 | 
				
			||||||
      DB_MYSQL_PASSWORD: 'npm'
 | 
					 | 
				
			||||||
      DB_MYSQL_NAME: 'npm'
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - npm_data_mysql:/data
 | 
					      - 'npm_data_ci:/data'
 | 
				
			||||||
      - npm_le_mysql:/etc/letsencrypt
 | 
					      - 'npm_le_ci:/etc/letsencrypt'
 | 
				
			||||||
    expose:
 | 
					      - './dev/letsencrypt.ini:/etc/letsencrypt.ini:ro'
 | 
				
			||||||
      - 81
 | 
					      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
				
			||||||
      - 80
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
      - 443
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "/usr/bin/check-health"]
 | 
				
			||||||
 | 
					      interval: 10s
 | 
				
			||||||
 | 
					      timeout: 3s
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      fulltest:
 | 
				
			||||||
 | 
					        aliases:
 | 
				
			||||||
 | 
					          - website1.example.com
 | 
				
			||||||
 | 
					          - website2.example.com
 | 
				
			||||||
 | 
					          - website3.example.com
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  stepca:
 | 
				
			||||||
 | 
					    image: jc21/testca
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
				
			||||||
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      fulltest:
 | 
				
			||||||
 | 
					        aliases:
 | 
				
			||||||
 | 
					          - ca.internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pdns:
 | 
				
			||||||
 | 
					    image: pschiffe/pdns-mysql
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      PDNS_master: 'yes'
 | 
				
			||||||
 | 
					      PDNS_api: 'yes'
 | 
				
			||||||
 | 
					      PDNS_api_key: 'npm'
 | 
				
			||||||
 | 
					      PDNS_webserver: 'yes'
 | 
				
			||||||
 | 
					      PDNS_webserver_address: '0.0.0.0'
 | 
				
			||||||
 | 
					      PDNS_webserver_password: 'npm'
 | 
				
			||||||
 | 
					      PDNS_webserver-allow-from: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
 | 
				
			||||||
 | 
					      PDNS_version_string: 'anonymous'
 | 
				
			||||||
 | 
					      PDNS_default_ttl: 1500
 | 
				
			||||||
 | 
					      PDNS_allow_axfr_ips: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
 | 
				
			||||||
 | 
					      PDNS_gmysql_host: pdns-db
 | 
				
			||||||
 | 
					      PDNS_gmysql_port: 3306
 | 
				
			||||||
 | 
					      PDNS_gmysql_user: pdns
 | 
				
			||||||
 | 
					      PDNS_gmysql_password: pdns
 | 
				
			||||||
 | 
					      PDNS_gmysql_dbname: pdns
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      - db
 | 
					      - pdns-db
 | 
				
			||||||
    healthcheck:
 | 
					    networks:
 | 
				
			||||||
      test: ["CMD", "/usr/bin/check-health"]
 | 
					      fulltest:
 | 
				
			||||||
      interval: 10s
 | 
					        aliases:
 | 
				
			||||||
      timeout: 3s
 | 
					          - ns1.pdns
 | 
				
			||||||
 | 
					          - ns2.pdns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fullstack-sqlite:
 | 
					  pdns-db:
 | 
				
			||||||
    image: "${IMAGE}:ci-${BUILD_NUMBER}"
 | 
					    image: mariadb
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      DEBUG: 'true'
 | 
					      MYSQL_ROOT_PASSWORD: 'pdns'
 | 
				
			||||||
      LE_STAGING: 'true'
 | 
					      MYSQL_DATABASE: 'pdns'
 | 
				
			||||||
      FORCE_COLOR: 1
 | 
					      MYSQL_USER: 'pdns'
 | 
				
			||||||
      DB_SQLITE_FILE: '/data/mydb.sqlite'
 | 
					      MYSQL_PASSWORD: 'pdns'
 | 
				
			||||||
      PUID: 1000
 | 
					 | 
				
			||||||
      PGID: 1000
 | 
					 | 
				
			||||||
      DISABLE_IPV6: 'true'
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - npm_data_sqlite:/data
 | 
					      - 'pdns_mysql_vol:/var/lib/mysql'
 | 
				
			||||||
      - npm_le_sqlite:/etc/letsencrypt
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
    expose:
 | 
					      - './dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro'
 | 
				
			||||||
      - 81
 | 
					    networks:
 | 
				
			||||||
      - 80
 | 
					      - fulltest
 | 
				
			||||||
      - 443
 | 
					 | 
				
			||||||
    healthcheck:
 | 
					 | 
				
			||||||
      test: ["CMD", "/usr/bin/check-health"]
 | 
					 | 
				
			||||||
      interval: 10s
 | 
					 | 
				
			||||||
      timeout: 3s
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  db:
 | 
					  dnsrouter:
 | 
				
			||||||
    image: jc21/mariadb-aria
 | 
					    image: jc21/dnsrouter
 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      MYSQL_ROOT_PASSWORD: 'npm'
 | 
					 | 
				
			||||||
      MYSQL_DATABASE: 'npm'
 | 
					 | 
				
			||||||
      MYSQL_USER: 'npm'
 | 
					 | 
				
			||||||
      MYSQL_PASSWORD: 'npm'
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - mysql_data:/var/lib/mysql
 | 
					      - ./dev/dnsrouter-config.json.tmp:/dnsrouter-config.json:ro
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - fulltest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cypress-mysql:
 | 
					  cypress:
 | 
				
			||||||
    image: "${IMAGE}-cypress:ci-${BUILD_NUMBER}"
 | 
					    image: "${IMAGE}-cypress:ci-${BUILD_NUMBER}"
 | 
				
			||||||
    build:
 | 
					    build:
 | 
				
			||||||
      context: ../test/
 | 
					      context: ../
 | 
				
			||||||
      dockerfile: cypress/Dockerfile
 | 
					      dockerfile: test/cypress/Dockerfile
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      CYPRESS_baseUrl: 'http://fullstack-mysql:81'
 | 
					      CYPRESS_baseUrl: 'http://fullstack:81'
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - cypress_logs_mysql:/results
 | 
					      - 'cypress_logs:/results'
 | 
				
			||||||
    command: cypress run --browser chrome --config-file=${CYPRESS_CONFIG:-cypress/config/ci.json}
 | 
					      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
				
			||||||
 | 
					    command: cypress run --browser chrome --config-file=cypress/config/ci.js
 | 
				
			||||||
  cypress-sqlite:
 | 
					    networks:
 | 
				
			||||||
    image: "${IMAGE}-cypress:ci-${BUILD_NUMBER}"
 | 
					      - fulltest
 | 
				
			||||||
    build:
 | 
					 | 
				
			||||||
      context: ../test/
 | 
					 | 
				
			||||||
      dockerfile: cypress/Dockerfile
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      CYPRESS_baseUrl: "http://fullstack-sqlite:81"
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - cypress_logs_sqlite:/results
 | 
					 | 
				
			||||||
    command: cypress run --browser chrome --config-file=${CYPRESS_CONFIG:-cypress/config/ci.json}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
volumes:
 | 
					volumes:
 | 
				
			||||||
  cypress_logs_mysql:
 | 
					  cypress_logs:
 | 
				
			||||||
  cypress_logs_sqlite:
 | 
					  npm_data_ci:
 | 
				
			||||||
  npm_data_mysql:
 | 
					  npm_le_ci:
 | 
				
			||||||
  npm_data_sqlite:
 | 
					  pdns_mysql_vol:
 | 
				
			||||||
  npm_le_sqlite:
 | 
					
 | 
				
			||||||
  npm_le_mysql:
 | 
					networks:
 | 
				
			||||||
  mysql_data:
 | 
					  fulltest:
 | 
				
			||||||
 | 
					    name: "npm-${BRANCH_LOWER}-ci-${BUILD_NUMBER}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# WARNING: This is a DEVELOPMENT docker-compose file, it should not be used for production.
 | 
					# WARNING: This is a DEVELOPMENT docker-compose file, it should not be used for production.
 | 
				
			||||||
version: '3.8'
 | 
					 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  npm:
 | 
					  npm:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								docker/rootfs/etc/nginx/conf.d/include/log.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					log_format proxy '[$time_local] $upstream_cache_status $upstream_status $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] [Sent-to $server] "$http_user_agent" "$http_referer"';
 | 
				
			||||||
 | 
					log_format standard '[$time_local] $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] "$http_user_agent" "$http_referer"';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					access_log /data/logs/fallback_access.log proxy;
 | 
				
			||||||
@@ -43,10 +43,8 @@ http {
 | 
				
			|||||||
	proxy_cache_path              /var/lib/nginx/cache/public  levels=1:2 keys_zone=public-cache:30m max_size=192m;
 | 
						proxy_cache_path              /var/lib/nginx/cache/public  levels=1:2 keys_zone=public-cache:30m max_size=192m;
 | 
				
			||||||
	proxy_cache_path              /var/lib/nginx/cache/private levels=1:2 keys_zone=private-cache:5m max_size=1024m;
 | 
						proxy_cache_path              /var/lib/nginx/cache/private levels=1:2 keys_zone=private-cache:5m max_size=1024m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_format proxy '[$time_local] $upstream_cache_status $upstream_status $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] [Sent-to $server] "$http_user_agent" "$http_referer"';
 | 
						# Log format and fallback log file
 | 
				
			||||||
	log_format standard '[$time_local] $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] "$http_user_agent" "$http_referer"';
 | 
						include /etc/nginx/conf.d/include/log.conf;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	access_log /data/logs/fallback_access.log proxy;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Dynamically generated resolvers file
 | 
						# Dynamically generated resolvers file
 | 
				
			||||||
	include /etc/nginx/conf.d/include/resolvers.conf;
 | 
						include /etc/nginx/conf.d/include/resolvers.conf;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,4 +25,4 @@ chown -R "$PUID:$PGID" /etc/nginx/conf.d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Prevents errors when installing python certbot plugins when non-root
 | 
					# Prevents errors when installing python certbot plugins when non-root
 | 
				
			||||||
chown "$PUID:$PGID" /opt/certbot /opt/certbot/bin
 | 
					chown "$PUID:$PGID" /opt/certbot /opt/certbot/bin
 | 
				
			||||||
chown -R "$PUID:$PGID" /opt/certbot/lib/python*/site-packages
 | 
					find /opt/certbot/lib/python*/site-packages -not -user "$PUID" -execdir chown "$PUID:$PGID" {} \+
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								docs/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,8 +1,9 @@
 | 
				
			|||||||
.vuepress/dist
 | 
					dist
 | 
				
			||||||
node_modules
 | 
					node_modules
 | 
				
			||||||
ts
 | 
					ts
 | 
				
			||||||
.temp
 | 
					.temp
 | 
				
			||||||
.cache
 | 
					.cache
 | 
				
			||||||
 | 
					.vitepress/cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.yarn/*
 | 
					.yarn/*
 | 
				
			||||||
!.yarn/releases
 | 
					!.yarn/releases
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								docs/.vitepress/config.mts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					import { defineConfig, type DefaultTheme } from 'vitepress';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// https://vitepress.dev/reference/site-config
 | 
				
			||||||
 | 
					export default defineConfig({
 | 
				
			||||||
 | 
						title: "Nginx Proxy Manager",
 | 
				
			||||||
 | 
						description: "Expose your services easily and securely",
 | 
				
			||||||
 | 
						head: [
 | 
				
			||||||
 | 
							["link", { rel: "icon", href: "/icon.png" }],
 | 
				
			||||||
 | 
							["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }],
 | 
				
			||||||
 | 
							["meta", { property: "og:title", content: "Nginx Proxy Manager" }],
 | 
				
			||||||
 | 
							["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
 | 
				
			||||||
 | 
							["meta", { property: "og:type", content: "website" }],
 | 
				
			||||||
 | 
							["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }],
 | 
				
			||||||
 | 
							["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }],
 | 
				
			||||||
 | 
							["meta", { name: "twitter:card", content: "summary"}],
 | 
				
			||||||
 | 
							["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}],
 | 
				
			||||||
 | 
							["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
 | 
				
			||||||
 | 
							["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}],
 | 
				
			||||||
 | 
							["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}],
 | 
				
			||||||
 | 
							// GA
 | 
				
			||||||
 | 
							['script', { async: 'true', src: 'https://www.googletagmanager.com/gtag/js?id=G-TXT8F5WY5B'}],
 | 
				
			||||||
 | 
							['script', {}, "window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-TXT8F5WY5B');"],
 | 
				
			||||||
 | 
						],
 | 
				
			||||||
 | 
						sitemap: {
 | 
				
			||||||
 | 
							hostname: 'https://nginxproxymanager.com'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						metaChunk: true,
 | 
				
			||||||
 | 
						srcDir: './src',
 | 
				
			||||||
 | 
						outDir: './dist',
 | 
				
			||||||
 | 
						themeConfig: {
 | 
				
			||||||
 | 
							// https://vitepress.dev/reference/default-theme-config
 | 
				
			||||||
 | 
							logo: { src: '/logo.svg', width: 24, height: 24 },
 | 
				
			||||||
 | 
							nav: [
 | 
				
			||||||
 | 
								{ text: 'Setup', link: '/setup/' },
 | 
				
			||||||
 | 
							],
 | 
				
			||||||
 | 
							sidebar: [
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									items: [
 | 
				
			||||||
 | 
										// { text: 'Home', link: '/' },
 | 
				
			||||||
 | 
										{ text: 'Guide', link: '/guide/' },
 | 
				
			||||||
 | 
										{ text: 'Screenshots', link: '/screenshots/' },
 | 
				
			||||||
 | 
										{ text: 'Setup Instructions', link: '/setup/' },
 | 
				
			||||||
 | 
										{ text: 'Advanced Configuration', link: '/advanced-config/' },
 | 
				
			||||||
 | 
										{ text: 'Upgrading', link: '/upgrading/' },
 | 
				
			||||||
 | 
										{ text: 'Frequently Asked Questions', link: '/faq/' },
 | 
				
			||||||
 | 
										{ text: 'Third Party', link: '/third-party/' },
 | 
				
			||||||
 | 
									]
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							],
 | 
				
			||||||
 | 
							socialLinks: [
 | 
				
			||||||
 | 
								{ icon: 'github', link: 'https://github.com/NginxProxyManager/nginx-proxy-manager' }
 | 
				
			||||||
 | 
							],
 | 
				
			||||||
 | 
							search: {
 | 
				
			||||||
 | 
								provider: 'local'
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							footer: {
 | 
				
			||||||
 | 
								message: 'Released under the MIT License.',
 | 
				
			||||||
 | 
								copyright: 'Copyright © 2016-present jc21.com'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										27
									
								
								docs/.vitepress/theme/custom.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					:root {
 | 
				
			||||||
 | 
						--vp-home-hero-name-color: transparent;
 | 
				
			||||||
 | 
						--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #f15833 30%, #FAA42F);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						--vp-home-hero-image-background-image: linear-gradient(-45deg, #aaaaaa 50%, #777777 50%);
 | 
				
			||||||
 | 
						--vp-home-hero-image-filter: blur(44px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						--vp-c-brand-1: #f15833;
 | 
				
			||||||
 | 
						--vp-c-brand-2: #FAA42F;
 | 
				
			||||||
 | 
						--vp-c-brand-3: #f15833;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @media (min-width: 640px) {
 | 
				
			||||||
 | 
						:root {
 | 
				
			||||||
 | 
							--vp-home-hero-image-filter: blur(56px);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @media (min-width: 960px) {
 | 
				
			||||||
 | 
						:root {
 | 
				
			||||||
 | 
							--vp-home-hero-image-filter: blur(68px);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.inline-img img {
 | 
				
			||||||
 | 
						display: inline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										4
									
								
								docs/.vitepress/theme/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					import DefaultTheme from 'vitepress/theme'
 | 
				
			||||||
 | 
					import './custom.css'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default DefaultTheme
 | 
				
			||||||
@@ -1,120 +0,0 @@
 | 
				
			|||||||
import { defineUserConfig } from 'vuepress';
 | 
					 | 
				
			||||||
import { defaultTheme } from 'vuepress'
 | 
					 | 
				
			||||||
import { googleAnalyticsPlugin } from '@vuepress/plugin-google-analytics';
 | 
					 | 
				
			||||||
import { searchPlugin } from '@vuepress/plugin-search'
 | 
					 | 
				
			||||||
import { sitemapPlugin } from 'vuepress-plugin-sitemap2';
 | 
					 | 
				
			||||||
import zoomingPlugin from 'vuepress-plugin-zooming';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineUserConfig({
 | 
					 | 
				
			||||||
  locales: {
 | 
					 | 
				
			||||||
    "/": {
 | 
					 | 
				
			||||||
      lang: "en-US",
 | 
					 | 
				
			||||||
      title: "Nginx Proxy Manager",
 | 
					 | 
				
			||||||
      description: "Expose your services easily and securely",
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  head: [
 | 
					 | 
				
			||||||
    ["link", { rel: "icon", href: "/icon.png" }],
 | 
					 | 
				
			||||||
    ["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }],
 | 
					 | 
				
			||||||
    ["meta", { property: "og:title", content: "Nginx Proxy Manager" }],
 | 
					 | 
				
			||||||
    ["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
 | 
					 | 
				
			||||||
    ["meta", { property: "og:type", content: "website" }],
 | 
					 | 
				
			||||||
    ["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }],
 | 
					 | 
				
			||||||
    ["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }],
 | 
					 | 
				
			||||||
    ["meta", { name: "twitter:card", content: "summary"}],
 | 
					 | 
				
			||||||
    ["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}],
 | 
					 | 
				
			||||||
    ["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}],
 | 
					 | 
				
			||||||
    ["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}],
 | 
					 | 
				
			||||||
    ["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}],
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  theme: defaultTheme({
 | 
					 | 
				
			||||||
    logo: '/icon.png',
 | 
					 | 
				
			||||||
    repo: "jc21/nginx-proxy-manager",
 | 
					 | 
				
			||||||
    docsRepo: 'https://github.com/jc21/nginx-proxy-manager',
 | 
					 | 
				
			||||||
    docsBranch: 'develop',
 | 
					 | 
				
			||||||
    docsDir: 'docs',
 | 
					 | 
				
			||||||
    editLinkPattern: ':repo/edit/:branch/:path',
 | 
					 | 
				
			||||||
    locales: {
 | 
					 | 
				
			||||||
      '/': {
 | 
					 | 
				
			||||||
        label: 'English',
 | 
					 | 
				
			||||||
        selectLanguageText: 'Languages',
 | 
					 | 
				
			||||||
        selectLanguageName: 'English',
 | 
					 | 
				
			||||||
        editLinkText: 'Edit this page on GitHub',
 | 
					 | 
				
			||||||
        navbar: [
 | 
					 | 
				
			||||||
          { text: 'Setup', link: '/setup/' }
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
        sidebar: {
 | 
					 | 
				
			||||||
          '/': [
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Home',
 | 
					 | 
				
			||||||
              link: '/'
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            { 
 | 
					 | 
				
			||||||
              text: 'Guide',
 | 
					 | 
				
			||||||
              link: '/guide/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Screenshots',
 | 
					 | 
				
			||||||
              link:  '/screenshots/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Setup Instructions',
 | 
					 | 
				
			||||||
              link: '/setup/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Advanced Configuration',
 | 
					 | 
				
			||||||
              link: '/advanced-config/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Upgrading',
 | 
					 | 
				
			||||||
              link: '/upgrading/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Frequently Asked Questions',
 | 
					 | 
				
			||||||
              link: '/faq/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              text: 'Third Party',
 | 
					 | 
				
			||||||
              link: '/third-party/',
 | 
					 | 
				
			||||||
              collapsible: true,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ],
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }),
 | 
					 | 
				
			||||||
  markdown: {
 | 
					 | 
				
			||||||
    code: {
 | 
					 | 
				
			||||||
      lineNumbers: false,
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  plugins: [
 | 
					 | 
				
			||||||
    googleAnalyticsPlugin({
 | 
					 | 
				
			||||||
      id: 'UA-99675467-4'
 | 
					 | 
				
			||||||
    }),
 | 
					 | 
				
			||||||
    sitemapPlugin({
 | 
					 | 
				
			||||||
      hostname: "https://nginxproxymanager.com",
 | 
					 | 
				
			||||||
    }),
 | 
					 | 
				
			||||||
    zoomingPlugin({
 | 
					 | 
				
			||||||
      selector: '.zooming',
 | 
					 | 
				
			||||||
      delay: 1000,
 | 
					 | 
				
			||||||
      options: {
 | 
					 | 
				
			||||||
        bgColor: 'black',
 | 
					 | 
				
			||||||
        zIndex: 10000,
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
    }),
 | 
					 | 
				
			||||||
    searchPlugin({
 | 
					 | 
				
			||||||
      locales: {
 | 
					 | 
				
			||||||
        '/': {
 | 
					 | 
				
			||||||
          placeholder: 'Search',
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
    }),
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 57 KiB  | 
@@ -1,258 +0,0 @@
 | 
				
			|||||||
:root {
 | 
					 | 
				
			||||||
  // brand colors
 | 
					 | 
				
			||||||
  --c-brand: #f15833;
 | 
					 | 
				
			||||||
  --c-brand-light: #f15833;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // background colors
 | 
					 | 
				
			||||||
  --c-bg: #ffffff;
 | 
					 | 
				
			||||||
  --c-bg-light: #f3f4f5;
 | 
					 | 
				
			||||||
  --c-bg-lighter: #eeeeee;
 | 
					 | 
				
			||||||
  --c-bg-dark: #ebebec;
 | 
					 | 
				
			||||||
  --c-bg-darker: #e6e6e6;
 | 
					 | 
				
			||||||
  --c-bg-navbar: var(--c-bg);
 | 
					 | 
				
			||||||
  --c-bg-sidebar: var(--c-bg);
 | 
					 | 
				
			||||||
  --c-bg-arrow: #cccccc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // text colors
 | 
					 | 
				
			||||||
  --c-text: #663015;
 | 
					 | 
				
			||||||
  --c-text-accent: var(--c-brand);
 | 
					 | 
				
			||||||
  --c-text-light: #863f1c;
 | 
					 | 
				
			||||||
  --c-text-lighter: #b65626;
 | 
					 | 
				
			||||||
  --c-text-lightest: #f15833;
 | 
					 | 
				
			||||||
  --c-text-quote: #999999;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // border colors
 | 
					 | 
				
			||||||
  --c-border: #eaecef;
 | 
					 | 
				
			||||||
  --c-border-dark: #dfe2e5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // custom container colors
 | 
					 | 
				
			||||||
  --c-tip: #42b983;
 | 
					 | 
				
			||||||
  --c-tip-bg: var(--c-bg-light);
 | 
					 | 
				
			||||||
  --c-tip-title: var(--c-text);
 | 
					 | 
				
			||||||
  --c-tip-text: var(--c-text);
 | 
					 | 
				
			||||||
  --c-tip-text-accent: var(--c-text-accent);
 | 
					 | 
				
			||||||
  --c-warning: #ffc310;
 | 
					 | 
				
			||||||
  --c-warning-bg: #fffae3;
 | 
					 | 
				
			||||||
  --c-warning-bg-light: #fff3ba;
 | 
					 | 
				
			||||||
  --c-warning-bg-lighter: #fff0b0;
 | 
					 | 
				
			||||||
  --c-warning-border-dark: #f7dc91;
 | 
					 | 
				
			||||||
  --c-warning-details-bg: #fff5ca;
 | 
					 | 
				
			||||||
  --c-warning-title: #f1b300;
 | 
					 | 
				
			||||||
  --c-warning-text: #746000;
 | 
					 | 
				
			||||||
  --c-warning-text-accent: #edb100;
 | 
					 | 
				
			||||||
  --c-warning-text-light: #c1971c;
 | 
					 | 
				
			||||||
  --c-warning-text-quote: #ccab49;
 | 
					 | 
				
			||||||
  --c-danger: #f11e37;
 | 
					 | 
				
			||||||
  --c-danger-bg: #ffe0e0;
 | 
					 | 
				
			||||||
  --c-danger-bg-light: #ffcfde;
 | 
					 | 
				
			||||||
  --c-danger-bg-lighter: #ffc9c9;
 | 
					 | 
				
			||||||
  --c-danger-border-dark: #f1abab;
 | 
					 | 
				
			||||||
  --c-danger-details-bg: #ffd4d4;
 | 
					 | 
				
			||||||
  --c-danger-title: #ed1e2c;
 | 
					 | 
				
			||||||
  --c-danger-text: #660000;
 | 
					 | 
				
			||||||
  --c-danger-text-accent: #bd1a1a;
 | 
					 | 
				
			||||||
  --c-danger-text-light: #b5474d;
 | 
					 | 
				
			||||||
  --c-danger-text-quote: #c15b5b;
 | 
					 | 
				
			||||||
  --c-details-bg: #eeeeee;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // badge component colors
 | 
					 | 
				
			||||||
  --c-badge-tip: var(--c-tip);
 | 
					 | 
				
			||||||
  --c-badge-warning: #ecc808;
 | 
					 | 
				
			||||||
  --c-badge-warning-text: var(--c-bg);
 | 
					 | 
				
			||||||
  --c-badge-danger: #dc2626;
 | 
					 | 
				
			||||||
  --c-badge-danger-text: var(--c-bg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // transition vars
 | 
					 | 
				
			||||||
  --t-color: 0.3s ease;
 | 
					 | 
				
			||||||
  --t-transform: 0.3s ease;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // code blocks vars
 | 
					 | 
				
			||||||
  --code-bg-color: #282c34;
 | 
					 | 
				
			||||||
  --code-hl-bg-color: rgba(0, 0, 0, 0.66);
 | 
					 | 
				
			||||||
  --code-ln-color: #9e9e9e;
 | 
					 | 
				
			||||||
  --code-ln-wrapper-width: 3.5rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // font vars
 | 
					 | 
				
			||||||
  --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
 | 
					 | 
				
			||||||
    Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
 | 
					 | 
				
			||||||
  --font-family-code: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // layout vars
 | 
					 | 
				
			||||||
  --navbar-height: 3.6rem;
 | 
					 | 
				
			||||||
  --navbar-padding-v: 0.7rem;
 | 
					 | 
				
			||||||
  --navbar-padding-h: 1.5rem;
 | 
					 | 
				
			||||||
  --sidebar-width: 20rem;
 | 
					 | 
				
			||||||
  --sidebar-width-mobile: calc(var(--sidebar-width) * 0.82);
 | 
					 | 
				
			||||||
  --content-width: 740px;
 | 
					 | 
				
			||||||
  --homepage-width: 960px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
html.dark {
 | 
					 | 
				
			||||||
  // brand colors
 | 
					 | 
				
			||||||
  --c-brand: #f15833;
 | 
					 | 
				
			||||||
  --c-brand-light: #f15833;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // background colors
 | 
					 | 
				
			||||||
  --c-bg: #22272e;
 | 
					 | 
				
			||||||
  --c-bg-light: #2b313a;
 | 
					 | 
				
			||||||
  --c-bg-lighter: #262c34;
 | 
					 | 
				
			||||||
  --c-bg-dark: #343b44;
 | 
					 | 
				
			||||||
  --c-bg-darker: #37404c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // text colors
 | 
					 | 
				
			||||||
  --c-text: #adbac7;
 | 
					 | 
				
			||||||
  --c-text-light: #96a7b7;
 | 
					 | 
				
			||||||
  --c-text-lighter: #8b9eb0;
 | 
					 | 
				
			||||||
  --c-text-lightest: #8094a8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // border colors
 | 
					 | 
				
			||||||
  --c-border: #3e4c5a;
 | 
					 | 
				
			||||||
  --c-border-dark: #34404c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // custom container colors
 | 
					 | 
				
			||||||
  --c-tip: #318a62;
 | 
					 | 
				
			||||||
  --c-warning: #e0ad15;
 | 
					 | 
				
			||||||
  --c-warning-bg: #2d2f2d;
 | 
					 | 
				
			||||||
  --c-warning-bg-light: #423e2a;
 | 
					 | 
				
			||||||
  --c-warning-bg-lighter: #44442f;
 | 
					 | 
				
			||||||
  --c-warning-border-dark: #957c35;
 | 
					 | 
				
			||||||
  --c-warning-details-bg: #39392d;
 | 
					 | 
				
			||||||
  --c-warning-title: #fdca31;
 | 
					 | 
				
			||||||
  --c-warning-text: #d8d96d;
 | 
					 | 
				
			||||||
  --c-warning-text-accent: #ffbf00;
 | 
					 | 
				
			||||||
  --c-warning-text-light: #ddb84b;
 | 
					 | 
				
			||||||
  --c-warning-text-quote: #ccab49;
 | 
					 | 
				
			||||||
  --c-danger: #fc1e38;
 | 
					 | 
				
			||||||
  --c-danger-bg: #39232c;
 | 
					 | 
				
			||||||
  --c-danger-bg-light: #4b2b35;
 | 
					 | 
				
			||||||
  --c-danger-bg-lighter: #553040;
 | 
					 | 
				
			||||||
  --c-danger-border-dark: #a25151;
 | 
					 | 
				
			||||||
  --c-danger-details-bg: #482936;
 | 
					 | 
				
			||||||
  --c-danger-title: #fc2d3b;
 | 
					 | 
				
			||||||
  --c-danger-text: #ea9ca0;
 | 
					 | 
				
			||||||
  --c-danger-text-accent: #fd3636;
 | 
					 | 
				
			||||||
  --c-danger-text-light: #d9777c;
 | 
					 | 
				
			||||||
  --c-danger-text-quote: #d56b6b;
 | 
					 | 
				
			||||||
  --c-details-bg: #323843;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // badge component colors
 | 
					 | 
				
			||||||
  --c-badge-warning: var(--c-warning);
 | 
					 | 
				
			||||||
  --c-badge-warning-text: #3c2e05;
 | 
					 | 
				
			||||||
  --c-badge-danger: var(--c-danger);
 | 
					 | 
				
			||||||
  --c-badge-danger-text: #401416;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // code blocks vars
 | 
					 | 
				
			||||||
  --code-hl-bg-color: #363b46;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-back-to-top
 | 
					 | 
				
			||||||
.back-to-top {
 | 
					 | 
				
			||||||
  --back-to-top-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --back-to-top-color-hover: var(--c-brand-light);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-docsearch
 | 
					 | 
				
			||||||
.DocSearch {
 | 
					 | 
				
			||||||
  --docsearch-primary-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --docsearch-text-color: var(--c-text);
 | 
					 | 
				
			||||||
  --docsearch-highlight-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --docsearch-muted-color: var(--c-text-quote);
 | 
					 | 
				
			||||||
  --docsearch-container-background: rgba(9, 10, 17, 0.8);
 | 
					 | 
				
			||||||
  --docsearch-modal-background: var(--c-bg-light);
 | 
					 | 
				
			||||||
  --docsearch-searchbox-background: var(--c-bg-lighter);
 | 
					 | 
				
			||||||
  --docsearch-searchbox-focus-background: var(--c-bg);
 | 
					 | 
				
			||||||
  --docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);
 | 
					 | 
				
			||||||
  --docsearch-hit-color: var(--c-text-light);
 | 
					 | 
				
			||||||
  --docsearch-hit-active-color: var(--c-bg);
 | 
					 | 
				
			||||||
  --docsearch-hit-background: var(--c-bg);
 | 
					 | 
				
			||||||
  --docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);
 | 
					 | 
				
			||||||
  --docsearch-footer-background: var(--c-bg);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// dark plugin-docsearch
 | 
					 | 
				
			||||||
html.dark .DocSearch {
 | 
					 | 
				
			||||||
  --docsearch-logo-color: var(--c-text);
 | 
					 | 
				
			||||||
  --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;
 | 
					 | 
				
			||||||
  --docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d,
 | 
					 | 
				
			||||||
    0 2px 2px 0 rgba(3, 4, 9, 0.3);
 | 
					 | 
				
			||||||
  --docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);
 | 
					 | 
				
			||||||
  --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5),
 | 
					 | 
				
			||||||
    0 -4px 8px 0 rgba(0, 0, 0, 0.2);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-external-link-icon
 | 
					 | 
				
			||||||
.external-link-icon {
 | 
					 | 
				
			||||||
  --external-link-icon-color: var(--c-text-quote);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-medium-zoom
 | 
					 | 
				
			||||||
.medium-zoom-overlay {
 | 
					 | 
				
			||||||
  --medium-zoom-bg-color: var(--c-bg);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-nprogress
 | 
					 | 
				
			||||||
#nprogress {
 | 
					 | 
				
			||||||
  --nprogress-color: var(--c-brand);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-pwa-popup
 | 
					 | 
				
			||||||
.pwa-popup {
 | 
					 | 
				
			||||||
  --pwa-popup-text-color: var(--c-text);
 | 
					 | 
				
			||||||
  --pwa-popup-bg-color: var(--c-bg);
 | 
					 | 
				
			||||||
  --pwa-popup-border-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --pwa-popup-shadow: 0 4px 16px var(--c-brand);
 | 
					 | 
				
			||||||
  --pwa-popup-btn-text-color: var(--c-bg);
 | 
					 | 
				
			||||||
  --pwa-popup-btn-bg-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --pwa-popup-btn-hover-bg-color: var(--c-brand-light);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// plugin-search
 | 
					 | 
				
			||||||
.search-box {
 | 
					 | 
				
			||||||
  --search-bg-color: var(--c-bg);
 | 
					 | 
				
			||||||
  --search-accent-color: var(--c-brand);
 | 
					 | 
				
			||||||
  --search-text-color: var(--c-text);
 | 
					 | 
				
			||||||
  --search-border-color: var(--c-border);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  --search-item-text-color: var(--c-text-lighter);
 | 
					 | 
				
			||||||
  --search-item-focus-bg-color: var(--c-bg-light);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.home .hero img {
 | 
					 | 
				
			||||||
  max-width: 500px !important;
 | 
					 | 
				
			||||||
  height: 100%;
 | 
					 | 
				
			||||||
  width: 100%
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.center {
 | 
					 | 
				
			||||||
  margin: 0 auto;
 | 
					 | 
				
			||||||
  width: 80%
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#main-title {
 | 
					 | 
				
			||||||
  display: none
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.center {
 | 
					 | 
				
			||||||
  margin: 0 auto;
 | 
					 | 
				
			||||||
  width: 80%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#main-title {
 | 
					 | 
				
			||||||
  display: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.hero {
 | 
					 | 
				
			||||||
  margin: 150px 25px 70px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@font-face {
 | 
					 | 
				
			||||||
  font-family: 'Nerd Font';
 | 
					 | 
				
			||||||
  src: url("/nerd-font.woff2") format("woff2");
 | 
					 | 
				
			||||||
  font-weight: 400;
 | 
					 | 
				
			||||||
  font-style: normal;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
code {
 | 
					 | 
				
			||||||
  font-family: 'Nerd Font', source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										893
									
								
								docs/.yarn/releases/yarn-4.0.2.cjs
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,3 +0,0 @@
 | 
				
			|||||||
nodeLinker: node-modules
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
yarnPath: .yarn/releases/yarn-4.0.2.cjs
 | 
					 | 
				
			||||||
@@ -1,41 +0,0 @@
 | 
				
			|||||||
---
 | 
					 | 
				
			||||||
home: true
 | 
					 | 
				
			||||||
heroImage: /logo.png
 | 
					 | 
				
			||||||
actions:
 | 
					 | 
				
			||||||
  - text: Get Started
 | 
					 | 
				
			||||||
    link: /guide/
 | 
					 | 
				
			||||||
    type: primary
 | 
					 | 
				
			||||||
footer: MIT Licensed | Copyright © 2016-present jc21.com
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div class="features">
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Get Connected</h2>
 | 
					 | 
				
			||||||
    <p>
 | 
					 | 
				
			||||||
      Expose web services on your network ·
 | 
					 | 
				
			||||||
      Free SSL with Let's Encrypt  ·
 | 
					 | 
				
			||||||
      Designed with security in mind  ·
 | 
					 | 
				
			||||||
      Perfect for home networks
 | 
					 | 
				
			||||||
    </p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Proxy Hosts</h2>
 | 
					 | 
				
			||||||
    <p>Expose your private network Web services and get connected anywhere.</p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Beautiful UI</h2>
 | 
					 | 
				
			||||||
    <p>Based on Tabler, the interface is a pleasure to use. Configuring a server has never been so fun.</p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Free SSL</h2>
 | 
					 | 
				
			||||||
    <p>Built in Let’s Encrypt support allows you to secure your Web services at no cost to you. The certificates even renew themselves!</p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Docker FTW</h2>
 | 
					 | 
				
			||||||
    <p>Built as a Docker Image, Nginx Proxy Manager only requires a database.</p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
  <div class="feature">
 | 
					 | 
				
			||||||
    <h2>Multiple Users</h2>
 | 
					 | 
				
			||||||
    <p>Configure other users to either view or manage their own hosts. Full access permissions are available.</p>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
../../README.md
 | 
					 | 
				
			||||||
@@ -1,23 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "docs",
 | 
					 | 
				
			||||||
  "version": "1.0.0",
 | 
					 | 
				
			||||||
  "description": "",
 | 
					 | 
				
			||||||
  "main": "index.js",
 | 
					 | 
				
			||||||
  "devDependencies": {
 | 
					 | 
				
			||||||
    "vuepress": "^2.0.0-rc.0"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "dev": "vuepress dev",
 | 
					    "dev": "vitepress dev --host",
 | 
				
			||||||
    "build": "vuepress build"
 | 
					    "build": "vitepress build",
 | 
				
			||||||
 | 
					    "preview": "vitepress preview"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "author": "",
 | 
					  "devDependencies": {
 | 
				
			||||||
  "license": "ISC",
 | 
					    "vitepress": "^1.1.4"
 | 
				
			||||||
  "packageManager": "yarn@4.0.2",
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {}
 | 
				
			||||||
    "@vuepress/plugin-google-analytics": "2.0.0-rc.0",
 | 
					 | 
				
			||||||
    "@vuepress/plugin-search": "2.0.0-rc.0",
 | 
					 | 
				
			||||||
    "@vuepress/theme-default": "^2.0.0-rc.0",
 | 
					 | 
				
			||||||
    "vuepress-plugin-sitemap2": "^2.0.0-rc.5",
 | 
					 | 
				
			||||||
    "vuepress-plugin-zooming": "^1.1.8"
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +0,0 @@
 | 
				
			|||||||
# Screenshots
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/login.png" alt="Login" title="Login" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/dashboard.png" alt="Dashboard" title="Dashboard" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts.png" alt="Proxy Hosts" title="Proxy Hosts" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts-add.png" alt="Add Proxy Host" title="Add Proxy Host" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/redirection-hosts.png" alt="Redirection Hosts" title="Redirection Hosts" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/dead-hosts.png" alt="404 Hosts" title="404 Hosts" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/permissions.png" alt="User Permissions" title="User Permissions" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/certificates.png" alt="Certificates" title="Certificates" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/audit-log.png" alt="Audit Log" title="Audit Log" width="200"/>
 | 
					 | 
				
			||||||
<img class="no-medium-zoom zooming" src="/screenshots/custom-settings.png" alt="Custom Settings" title="Custom Settings" width="200"/>
 | 
					 | 
				
			||||||
@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Advanced Configuration
 | 
					# Advanced Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Running processes as a user/group
 | 
					## Running processes as a user/group
 | 
				
			||||||
@@ -1,26 +1,26 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# FAQ
 | 
					# FAQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Do I have to use Docker?
 | 
					## Do I have to use Docker?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Yes, that's how this project is packaged.
 | 
					Yes, that's how this project is packaged.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This makes it easier to support the project when I have control over the version of Nginx and NodeJS
 | 
					This makes it easier to support the project when we have control over the version of Nginx other packages
 | 
				
			||||||
being used. In future this could change if the backend was no longer using NodeJS and it's long list
 | 
					use by the project.
 | 
				
			||||||
of dependencies.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Can I run it on a Raspberry Pi?
 | 
					## Can I run it on a Raspberry Pi?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Yes! The docker image is multi-arch and is built for a variety of architectures. If yours is
 | 
					Yes! The docker image is multi-arch and is built for a variety of architectures. If yours is
 | 
				
			||||||
[not listed](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags) please open a
 | 
					[not listed](https://hub.docker.com/r/jc21/nginx-proxy-manager/tags) please open a
 | 
				
			||||||
[GitHub issue](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
 | 
					[GitHub issue](https://github.com/NginxProxyManager/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## I can't get my service to proxy properly?
 | 
					## I can't get my service to proxy properly?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Your best bet is to ask the [Reddit community for support](https://www.reddit.com/r/nginxproxymanager/). There's safety in numbers.
 | 
					Your best bet is to ask the [Reddit community for support](https://www.reddit.com/r/nginxproxymanager/). There's safety in numbers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Gitter is best left for anyone contributing to the project to ask for help about internals, code reviews etc.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## When adding username and password access control to a proxy host, I can no longer login into the app.
 | 
					## When adding username and password access control to a proxy host, I can no longer login into the app.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Having an Access Control List (ACL) with username and password requires the browser to always send this username and password in the `Authorization` header on each request. If your proxied app also requires authentication (like Nginx Proxy Manager itself), most likely the app will also use the `Authorization` header to transmit this information, as this is the standardized header meant for this kind of information. However having multiples of the same headers is not allowed in the [internet standard](https://www.rfc-editor.org/rfc/rfc7230#section-3.2.2) and almost all apps do not support multiple values in the `Authorization` header. Hence one of the two logins will be broken. This can only be fixed by either removing one of the logins or by changing the app to use other non-standard headers for authorization.
 | 
					Having an Access Control List (ACL) with username and password requires the browser to always send this username and password in the `Authorization` header on each request. If your proxied app also requires authentication (like Nginx Proxy Manager itself), most likely the app will also use the `Authorization` header to transmit this information, as this is the standardized header meant for this kind of information. However having multiples of the same headers is not allowed in the [internet standard](https://www.rfc-editor.org/rfc/rfc7230#section-3.2.2) and almost all apps do not support multiple values in the `Authorization` header. Hence one of the two logins will be broken. This can only be fixed by either removing one of the logins or by changing the app to use other non-standard headers for authorization.
 | 
				
			||||||
							
								
								
									
										126
									
								
								docs/src/guide/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,126 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Guide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::: raw
 | 
				
			||||||
 | 
					<p align="center">
 | 
				
			||||||
 | 
						<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager" style="display:inline;margin-right:5px;">
 | 
				
			||||||
 | 
							<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge" style="display:inline;">
 | 
				
			||||||
 | 
						</a>
 | 
				
			||||||
 | 
						<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager" style="display:inline;margin-right:5px;">
 | 
				
			||||||
 | 
							<img src="https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge" style="display:inline;">
 | 
				
			||||||
 | 
						</a>
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This project comes as a pre-built docker image that enables you to easily forward to your websites
 | 
				
			||||||
 | 
					running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [Quick Setup](#quick-setup)
 | 
				
			||||||
 | 
					- [Full Setup](/setup/)
 | 
				
			||||||
 | 
					- [Screenshots](/screenshots/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Project Goal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I created this project to fill a personal need to provide users with an easy way to accomplish reverse
 | 
				
			||||||
 | 
					proxying hosts with SSL termination and it had to be so easy that a monkey could do it. This goal hasn't changed.
 | 
				
			||||||
 | 
					While there might be advanced options they are optional and the project should be as simple as possible
 | 
				
			||||||
 | 
					so that the barrier for entry here is low.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::: raw
 | 
				
			||||||
 | 
					<a href="https://www.buymeacoffee.com/jc21" target="_blank"><img src="http://public.jc21.com/github/by-me-a-coffee.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a>
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Beautiful and Secure Admin Interface based on [Tabler](https://tabler.github.io/)
 | 
				
			||||||
 | 
					- Easily create forwarding domains, redirections, streams and 404 hosts without knowing anything about Nginx
 | 
				
			||||||
 | 
					- Free SSL using Let's Encrypt or provide your own custom SSL certificates
 | 
				
			||||||
 | 
					- Access Lists and basic HTTP Authentication for your hosts
 | 
				
			||||||
 | 
					- Advanced Nginx configuration available for super users
 | 
				
			||||||
 | 
					- User management, permissions and audit log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Hosting your home network
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I won't go in to too much detail here but here are the basics for someone new to this self-hosted world.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Your home router will have a Port Forwarding section somewhere. Log in and find it
 | 
				
			||||||
 | 
					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)
 | 
				
			||||||
 | 
					4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Quick Setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Install Docker and Docker-Compose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [Docker Install documentation](https://docs.docker.com/get-docker/)
 | 
				
			||||||
 | 
					- [Docker-Compose Install documentation](https://docs.docker.com/compose/install/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. Create a docker-compose.yml file similar to this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yml
 | 
				
			||||||
 | 
					version: '3.8'
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  app:
 | 
				
			||||||
 | 
					    image: 'jc21/nginx-proxy-manager:latest'
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - '80:80'
 | 
				
			||||||
 | 
					      - '81:81'
 | 
				
			||||||
 | 
					      - '443:443'
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./data:/data
 | 
				
			||||||
 | 
					      - ./letsencrypt:/etc/letsencrypt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is the bare minimum configuration required. See the [documentation](https://nginxproxymanager.com/setup/) for more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Bring up your stack by running
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					docker-compose up -d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If using docker-compose-plugin
 | 
				
			||||||
 | 
					docker compose up -d
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. Log in to the Admin UI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When your docker container is running, connect to it on port `81` for the admin interface.
 | 
				
			||||||
 | 
					Sometimes this can take a little bit because of the entropy of keys.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[http://127.0.0.1:81](http://127.0.0.1:81)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Default Admin User:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Email:    admin@example.com
 | 
				
			||||||
 | 
					Password: changeme
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Immediately after logging in with this default user you will be asked to modify your details and change your password.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All are welcome to create pull requests for this project, against the `develop` branch. Official releases are created from the `master` branch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CI is used in this project. All PR's must pass before being considered. After passing,
 | 
				
			||||||
 | 
					docker builds for PR's are available on dockerhub for manual verifications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documentation within the `develop` branch is available for preview at
 | 
				
			||||||
 | 
					[https://develop.nginxproxymanager.com](https://develop.nginxproxymanager.com)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Contributors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Special thanks to [all of our contributors](https://github.com/NginxProxyManager/nginx-proxy-manager/graphs/contributors).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Getting Support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. [Found a bug?](https://github.com/NginxProxyManager/nginx-proxy-manager/issues)
 | 
				
			||||||
 | 
					2. [Discussions](https://github.com/NginxProxyManager/nginx-proxy-manager/discussions)
 | 
				
			||||||
 | 
					3. [Reddit](https://reddit.com/r/nginxproxymanager)
 | 
				
			||||||
							
								
								
									
										32
									
								
								docs/src/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					# https://vitepress.dev/reference/default-theme-home-page
 | 
				
			||||||
 | 
					layout: home
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hero:
 | 
				
			||||||
 | 
					  name: "Nginx Proxy Manager"
 | 
				
			||||||
 | 
					  tagline: Expose your services easily and securely
 | 
				
			||||||
 | 
					  image:
 | 
				
			||||||
 | 
					    src: /logo.svg
 | 
				
			||||||
 | 
					    alt: NPM Logo
 | 
				
			||||||
 | 
					  actions:
 | 
				
			||||||
 | 
					    - theme: brand
 | 
				
			||||||
 | 
					      text: Get Started
 | 
				
			||||||
 | 
					      link: /guide/
 | 
				
			||||||
 | 
					    - theme: alt
 | 
				
			||||||
 | 
					      text: GitHub
 | 
				
			||||||
 | 
					      link: https://github.com/NginxProxyManager/nginx-proxy-manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					features:
 | 
				
			||||||
 | 
					  - title: Get Connected
 | 
				
			||||||
 | 
					    details: Expose web services on your network · Free SSL with Let's Encrypt  · Designed with security in mind  · Perfect for home networks
 | 
				
			||||||
 | 
					  - title: Proxy Hosts
 | 
				
			||||||
 | 
					    details: Expose your private network Web services and get connected anywhere.
 | 
				
			||||||
 | 
					  - title: Beautiful UI
 | 
				
			||||||
 | 
					    details: Based on Tabler, the interface is a pleasure to use. Configuring a server has never been so fun.
 | 
				
			||||||
 | 
					  - title: Free SSL
 | 
				
			||||||
 | 
					    details: Built in Let’s Encrypt support allows you to secure your Web services at no cost to you. The certificates even renew themselves!
 | 
				
			||||||
 | 
					  - title: Docker FTW
 | 
				
			||||||
 | 
					    details: Built as a Docker Image, Nginx Proxy Manager only requires a database.
 | 
				
			||||||
 | 
					  - title: Multiple Users
 | 
				
			||||||
 | 
					    details: Configure other users to either view or manage their own hosts. Full access permissions are available.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB  | 
| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB  | 
| 
		 Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB  | 
| 
		 Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB  | 
| 
		 Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB  | 
| 
		 Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 173 KiB  | 
| 
		 Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB  | 
| 
		 Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB  | 
| 
		 Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB  | 
| 
		 Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB  | 
| 
		 Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB  | 
| 
		 Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB  | 
| 
		 Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB  | 
| 
		 Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 162 KiB  | 
							
								
								
									
										20
									
								
								docs/src/screenshots/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Screenshots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::: raw
 | 
				
			||||||
 | 
					<div class="inline-img">
 | 
				
			||||||
 | 
						<a href="/screenshots/login.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/login.png" alt="Login" title="Login" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/dashboard.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/dashboard.png" alt="Dashboard" title="Dashboard" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/proxy-hosts.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts.png" alt="Proxy Hosts" title="Proxy Hosts" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/proxy-hosts-add.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/proxy-hosts-add.png" alt="Add Proxy Host" title="Add Proxy Host" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/redirection-hosts.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/redirection-hosts.png" alt="Redirection Hosts" title="Redirection Hosts" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/dead-hosts.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/dead-hosts.png" alt="404 Hosts" title="404 Hosts" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/permissions.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/permissions.png" alt="User Permissions" title="User Permissions" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/certificates.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/certificates.png" alt="Certificates" title="Certificates" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/audit-log.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/audit-log.png" alt="Audit Log" title="Audit Log" width="200"/></a>
 | 
				
			||||||
 | 
						<a href="/screenshots/custom-settings.png" target="_blank"><img class="no-medium-zoom zooming" src="/screenshots/custom-settings.png" alt="Custom Settings" title="Custom Settings" width="200"/></a>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Full Setup Instructions
 | 
					# Full Setup Instructions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Running the App
 | 
					## Running the App
 | 
				
			||||||
@@ -120,7 +124,7 @@ Please note that the `jc21/mariadb-aria:latest` image might have some problems o
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
After the app is running for the first time, the following will happen:
 | 
					After the app is running for the first time, the following will happen:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. GPG keys will be generated and saved in the data folder
 | 
					1. JWT keys will be generated and saved in the data folder
 | 
				
			||||||
2. The database will initialize with table structures
 | 
					2. The database will initialize with table structures
 | 
				
			||||||
3. A default admin user will be created
 | 
					3. A default admin user will be created
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Third Party
 | 
					# Third Party
 | 
				
			||||||
 | 
					
 | 
				
			||||||
As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documentation of those
 | 
					As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documentation of those
 | 
				
			||||||
@@ -12,5 +16,4 @@ Known integrations:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you would like your integration of NPM listed, please open a
 | 
					If you would like your integration of NPM listed, please open a
 | 
				
			||||||
[Github issue](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=)
 | 
					[Github issue](https://github.com/NginxProxyManager/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=)
 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,8 +1,12 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					outline: deep
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Upgrading
 | 
					# Upgrading
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
docker-compose pull
 | 
					docker compose pull
 | 
				
			||||||
docker-compose up -d
 | 
					docker compose up -d
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This project will automatically update any databases or other requirements so you don't have to follow
 | 
					This project will automatically update any databases or other requirements so you don't have to follow
 | 
				
			||||||
							
								
								
									
										4120
									
								
								docs/yarn.lock
									
									
									
									
									
								
							
							
						
						@@ -265,7 +265,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
        this.ui.domain_names.selectize({
 | 
					        this.ui.domain_names.selectize({
 | 
				
			||||||
            delimiter:    ',',
 | 
					            delimiter:    ',',
 | 
				
			||||||
            persist:      false,
 | 
					            persist:      false,
 | 
				
			||||||
            maxOptions:   30,
 | 
					            maxOptions:   100,
 | 
				
			||||||
            create:       function (input) {
 | 
					            create:       function (input) {
 | 
				
			||||||
                return {
 | 
					                return {
 | 
				
			||||||
                    value: input,
 | 
					                    value: input,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -233,7 +233,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
        this.ui.domain_names.selectize({
 | 
					        this.ui.domain_names.selectize({
 | 
				
			||||||
            delimiter:    ',',
 | 
					            delimiter:    ',',
 | 
				
			||||||
            persist:      false,
 | 
					            persist:      false,
 | 
				
			||||||
            maxOptions:   30,
 | 
					            maxOptions:   100,
 | 
				
			||||||
            create:       function (input) {
 | 
					            create:       function (input) {
 | 
				
			||||||
                return {
 | 
					                return {
 | 
				
			||||||
                    value: input,
 | 
					                    value: input,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -271,7 +271,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
        this.ui.domain_names.selectize({
 | 
					        this.ui.domain_names.selectize({
 | 
				
			||||||
            delimiter:    ',',
 | 
					            delimiter:    ',',
 | 
				
			||||||
            persist:      false,
 | 
					            persist:      false,
 | 
				
			||||||
            maxOptions:   30,
 | 
					            maxOptions:   100,
 | 
				
			||||||
            create:       function (input) {
 | 
					            create:       function (input) {
 | 
				
			||||||
                return {
 | 
					                return {
 | 
				
			||||||
                    value: input,
 | 
					                    value: input,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -235,7 +235,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
        this.ui.domain_names.selectize({
 | 
					        this.ui.domain_names.selectize({
 | 
				
			||||||
            delimiter:    ',',
 | 
					            delimiter:    ',',
 | 
				
			||||||
            persist:      false,
 | 
					            persist:      false,
 | 
				
			||||||
            maxOptions:   30,
 | 
					            maxOptions:   100,
 | 
				
			||||||
            create:       function (input) {
 | 
					            create:       function (input) {
 | 
				
			||||||
                return {
 | 
					                return {
 | 
				
			||||||
                    value: input,
 | 
					                    value: input,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3809,9 +3809,9 @@ invariant@^2.2.2:
 | 
				
			|||||||
    loose-envify "^1.0.0"
 | 
					    loose-envify "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ip@^2.0.0:
 | 
					ip@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
 | 
					  resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
 | 
				
			||||||
  integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
 | 
					  integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
is-accessor-descriptor@^0.1.6:
 | 
					is-accessor-descriptor@^0.1.6:
 | 
				
			||||||
  version "0.1.6"
 | 
					  version "0.1.6"
 | 
				
			||||||
@@ -6514,22 +6514,10 @@ tapable@^1.0.0, tapable@^1.1.3:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
 | 
					  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
 | 
				
			||||||
  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 | 
					  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tar@^6.0.2:
 | 
					tar@^6.0.2, tar@^6.1.11, tar@^6.1.2:
 | 
				
			||||||
  version "6.1.11"
 | 
					  version "6.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
 | 
					  resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
 | 
				
			||||||
  integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
 | 
					  integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    chownr "^2.0.0"
 | 
					 | 
				
			||||||
    fs-minipass "^2.0.0"
 | 
					 | 
				
			||||||
    minipass "^3.0.0"
 | 
					 | 
				
			||||||
    minizlib "^2.1.1"
 | 
					 | 
				
			||||||
    mkdirp "^1.0.3"
 | 
					 | 
				
			||||||
    yallist "^4.0.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
tar@^6.1.11, tar@^6.1.2:
 | 
					 | 
				
			||||||
  version "6.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
 | 
					 | 
				
			||||||
  integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    chownr "^2.0.0"
 | 
					    chownr "^2.0.0"
 | 
				
			||||||
    fs-minipass "^2.0.0"
 | 
					    fs-minipass "^2.0.0"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@
 | 
				
			|||||||
		"name": "Cloudflare",
 | 
							"name": "Cloudflare",
 | 
				
			||||||
		"package_name": "certbot-dns-cloudflare",
 | 
							"package_name": "certbot-dns-cloudflare",
 | 
				
			||||||
		"version": "=={{certbot-version}}",
 | 
							"version": "=={{certbot-version}}",
 | 
				
			||||||
		"dependencies": "cloudflare acme=={{certbot-version}}",
 | 
							"dependencies": "cloudflare==2.19.* acme=={{certbot-version}}",
 | 
				
			||||||
		"credentials": "# Cloudflare API token\ndns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567",
 | 
							"credentials": "# Cloudflare API token\ndns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567",
 | 
				
			||||||
		"full_plugin_name": "dns-cloudflare"
 | 
							"full_plugin_name": "dns-cloudflare"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
@@ -90,7 +90,7 @@
 | 
				
			|||||||
	"duckdns": {
 | 
						"duckdns": {
 | 
				
			||||||
		"name": "DuckDNS",
 | 
							"name": "DuckDNS",
 | 
				
			||||||
		"package_name": "certbot-dns-duckdns",
 | 
							"package_name": "certbot-dns-duckdns",
 | 
				
			||||||
		"version": "~=0.9",
 | 
							"version": "~=1.0",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_duckdns_token=your-duckdns-token",
 | 
							"credentials": "dns_duckdns_token=your-duckdns-token",
 | 
				
			||||||
		"full_plugin_name": "dns-duckdns"
 | 
							"full_plugin_name": "dns-duckdns"
 | 
				
			||||||
@@ -127,6 +127,14 @@
 | 
				
			|||||||
		"credentials": "dns_dnsmadeeasy_api_key = 1c1a3c91-4770-4ce7-96f4-54c0eb0e457a\ndns_dnsmadeeasy_secret_key = c9b5625f-9834-4ff8-baba-4ed5f32cae55",
 | 
							"credentials": "dns_dnsmadeeasy_api_key = 1c1a3c91-4770-4ce7-96f4-54c0eb0e457a\ndns_dnsmadeeasy_secret_key = c9b5625f-9834-4ff8-baba-4ed5f32cae55",
 | 
				
			||||||
		"full_plugin_name": "dns-dnsmadeeasy"
 | 
							"full_plugin_name": "dns-dnsmadeeasy"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"dnsmulti": {
 | 
				
			||||||
 | 
							"name": "DnsMulti",
 | 
				
			||||||
 | 
							"package_name": "certbot-dns-multi",
 | 
				
			||||||
 | 
							"version": "~=4.9",
 | 
				
			||||||
 | 
							"dependencies": "",
 | 
				
			||||||
 | 
							"credentials": "# See https://go-acme.github.io/lego/dns/#dns-providers for list of providers and their settings\n# Example provider configuration for DreamHost\n# dns_multi_provider = dreamhost\n# DREAMHOST_API_KEY = ABCDEFG1234",
 | 
				
			||||||
 | 
							"full_plugin_name": "dns-multi"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"dnspod": {
 | 
						"dnspod": {
 | 
				
			||||||
		"name": "DNSPod",
 | 
							"name": "DNSPod",
 | 
				
			||||||
		"package_name": "certbot-dns-dnspod",
 | 
							"package_name": "certbot-dns-dnspod",
 | 
				
			||||||
@@ -159,6 +167,14 @@
 | 
				
			|||||||
		"credentials": "dns_dynu_auth_token = YOUR_DYNU_AUTH_TOKEN",
 | 
							"credentials": "dns_dynu_auth_token = YOUR_DYNU_AUTH_TOKEN",
 | 
				
			||||||
		"full_plugin_name": "dns-dynu"
 | 
							"full_plugin_name": "dns-dynu"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"easydns": {
 | 
				
			||||||
 | 
							"name": "easyDNS",
 | 
				
			||||||
 | 
							"package_name": "certbot-dns-easydns",
 | 
				
			||||||
 | 
							"version": "~=0.1.2",
 | 
				
			||||||
 | 
							"dependencies": "",
 | 
				
			||||||
 | 
							"credentials": "dns_easydns_usertoken = YOUR_EASYDNS_USERTOKEN\ndns_easydns_userkey = YOUR_EASYDNS_USERKEY\ndns_easydns_endpoint = https://rest.easydns.net",
 | 
				
			||||||
 | 
							"full_plugin_name": "dns-easydns"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"eurodns": {
 | 
						"eurodns": {
 | 
				
			||||||
		"name": "EuroDNS",
 | 
							"name": "EuroDNS",
 | 
				
			||||||
		"package_name": "certbot-dns-eurodns",
 | 
							"package_name": "certbot-dns-eurodns",
 | 
				
			||||||
@@ -167,6 +183,14 @@
 | 
				
			|||||||
		"credentials": "dns_eurodns_applicationId = myuser\ndns_eurodns_apiKey = mysecretpassword\ndns_eurodns_endpoint = https://rest-api.eurodns.com/user-api-gateway/proxy",
 | 
							"credentials": "dns_eurodns_applicationId = myuser\ndns_eurodns_apiKey = mysecretpassword\ndns_eurodns_endpoint = https://rest-api.eurodns.com/user-api-gateway/proxy",
 | 
				
			||||||
		"full_plugin_name": "dns-eurodns"
 | 
							"full_plugin_name": "dns-eurodns"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"freedns": {
 | 
				
			||||||
 | 
							"name": "FreeDNS",
 | 
				
			||||||
 | 
							"package_name": "certbot-dns-freedns",
 | 
				
			||||||
 | 
							"version": "~=0.1.0",
 | 
				
			||||||
 | 
							"dependencies": "",
 | 
				
			||||||
 | 
							"credentials": "dns_freedns_username = myremoteuser\ndns_freedns_password = verysecureremoteuserpassword",
 | 
				
			||||||
 | 
							"full_plugin_name": "dns-freedns"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"gandi": {
 | 
						"gandi": {
 | 
				
			||||||
		"name": "Gandi Live DNS",
 | 
							"name": "Gandi Live DNS",
 | 
				
			||||||
		"package_name": "certbot_plugin_gandi",
 | 
							"package_name": "certbot_plugin_gandi",
 | 
				
			||||||
@@ -178,7 +202,7 @@
 | 
				
			|||||||
	"godaddy": {
 | 
						"godaddy": {
 | 
				
			||||||
		"name": "GoDaddy",
 | 
							"name": "GoDaddy",
 | 
				
			||||||
		"package_name": "certbot-dns-godaddy",
 | 
							"package_name": "certbot-dns-godaddy",
 | 
				
			||||||
		"version": "=={{certbot-version}}",
 | 
							"version": "==2.8.0",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_godaddy_secret = 0123456789abcdef0123456789abcdef01234567\ndns_godaddy_key = abcdef0123456789abcdef01234567abcdef0123",
 | 
							"credentials": "dns_godaddy_secret = 0123456789abcdef0123456789abcdef01234567\ndns_godaddy_key = abcdef0123456789abcdef01234567abcdef0123",
 | 
				
			||||||
		"full_plugin_name": "dns-godaddy"
 | 
							"full_plugin_name": "dns-godaddy"
 | 
				
			||||||
@@ -215,10 +239,18 @@
 | 
				
			|||||||
		"credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef",
 | 
							"credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef",
 | 
				
			||||||
		"full_plugin_name": "dns-hetzner"
 | 
							"full_plugin_name": "dns-hetzner"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"hover": {
 | 
				
			||||||
 | 
							"name": "Hover",
 | 
				
			||||||
 | 
							"package_name": "certbot-dns-hover",
 | 
				
			||||||
 | 
							"version": "~=1.2.1",
 | 
				
			||||||
 | 
							"dependencies": "",
 | 
				
			||||||
 | 
							"credentials": "dns_hover_hoverurl = https://www.hover.com\ndns_hover_username = hover-admin-username\ndns_hover_password = hover-admin-password\ndns_hover_totpsecret = 2fa-totp-secret",
 | 
				
			||||||
 | 
							"full_plugin_name": "dns-hover"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"infomaniak": {
 | 
						"infomaniak": {
 | 
				
			||||||
		"name": "Infomaniak",
 | 
							"name": "Infomaniak",
 | 
				
			||||||
		"package_name": "certbot-dns-infomaniak",
 | 
							"package_name": "certbot-dns-infomaniak",
 | 
				
			||||||
		"version": "~=0.1.12",
 | 
							"version": "~=0.2.2",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_infomaniak_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
 | 
							"credentials": "dns_infomaniak_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
 | 
				
			||||||
		"full_plugin_name": "dns-infomaniak"
 | 
							"full_plugin_name": "dns-infomaniak"
 | 
				
			||||||
@@ -386,15 +418,23 @@
 | 
				
			|||||||
	"strato": {
 | 
						"strato": {
 | 
				
			||||||
		"name": "Strato",
 | 
							"name": "Strato",
 | 
				
			||||||
		"package_name": "certbot-dns-strato",
 | 
							"package_name": "certbot-dns-strato",
 | 
				
			||||||
		"version": "~=0.1.1",
 | 
							"version": "~=0.2.1",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_strato_username = user\ndns_strato_password = pass\n# uncomment if youre using two factor authentication:\n# dns_strato_totp_devicename = 2fa_device\n# dns_strato_totp_secret = 2fa_secret\n#\n# uncomment if domain name contains special characters\n# insert domain display name as seen on your account page here\n# dns_strato_domain_display_name = my-punicode-url.de\n#\n# if youre not using strato.de or another special endpoint you can customise it below\n# you will probably only need to adjust the host, but you can also change the complete endpoint url\n# dns_strato_custom_api_scheme = https\n# dns_strato_custom_api_host = www.strato.de\n# dns_strato_custom_api_port = 443\n# dns_strato_custom_api_path = \"/apps/CustomerService\"",
 | 
							"credentials": "dns_strato_username = user\ndns_strato_password = pass\n# uncomment if youre using two factor authentication:\n# dns_strato_totp_devicename = 2fa_device\n# dns_strato_totp_secret = 2fa_secret\n#\n# uncomment if domain name contains special characters\n# insert domain display name as seen on your account page here\n# dns_strato_domain_display_name = my-punicode-url.de\n#\n# if youre not using strato.de or another special endpoint you can customise it below\n# you will probably only need to adjust the host, but you can also change the complete endpoint url\n# dns_strato_custom_api_scheme = https\n# dns_strato_custom_api_host = www.strato.de\n# dns_strato_custom_api_port = 443\n# dns_strato_custom_api_path = \"/apps/CustomerService\"",
 | 
				
			||||||
		"full_plugin_name": "dns-strato"
 | 
							"full_plugin_name": "dns-strato"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						"timeweb": {
 | 
				
			||||||
 | 
							"name": "Timeweb Cloud",
 | 
				
			||||||
 | 
							"package_name": "certbot-dns-timeweb",
 | 
				
			||||||
 | 
							"version": "~=1.0.1",
 | 
				
			||||||
 | 
							"dependencies": "",
 | 
				
			||||||
 | 
							"credentials": "dns_timeweb_api_key = XXXXXXXXXXXXXXXXXXX",
 | 
				
			||||||
 | 
							"full_plugin_name": "dns-timeweb"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	"transip": {
 | 
						"transip": {
 | 
				
			||||||
		"name": "TransIP",
 | 
							"name": "TransIP",
 | 
				
			||||||
		"package_name": "certbot-dns-transip",
 | 
							"package_name": "certbot-dns-transip",
 | 
				
			||||||
		"version": "~=0.4.3",
 | 
							"version": "~=0.5.2",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_transip_username = my_username\ndns_transip_key_file = /etc/letsencrypt/transip-rsa.key",
 | 
							"credentials": "dns_transip_username = my_username\ndns_transip_key_file = /etc/letsencrypt/transip-rsa.key",
 | 
				
			||||||
		"full_plugin_name": "dns-transip"
 | 
							"full_plugin_name": "dns-transip"
 | 
				
			||||||
@@ -415,12 +455,12 @@
 | 
				
			|||||||
		"credentials": "dns_vultr_key = YOUR_VULTR_API_KEY",
 | 
							"credentials": "dns_vultr_key = YOUR_VULTR_API_KEY",
 | 
				
			||||||
		"full_plugin_name": "dns-vultr"
 | 
							"full_plugin_name": "dns-vultr"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"websupportsk": {
 | 
						"websupport": {
 | 
				
			||||||
		"name": "Websupport.sk",
 | 
							"name": "Websupport.sk",
 | 
				
			||||||
		"package_name": "certbot-dns-websupportsk",
 | 
							"package_name": "certbot-dns-websupport",
 | 
				
			||||||
		"version": "~=0.1.6",
 | 
							"version": "~=2.0.1",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_websupportsk_api_key = <api_key>\ndns_websupportsk_secret = <secret>\ndns_websupportsk_domain = example.com",
 | 
							"credentials": "dns_websupport_identifier = <api_key>\ndns_websupport_secret_key = <secret>",
 | 
				
			||||||
		"full_plugin_name": "dns-websupportsk"
 | 
							"full_plugin_name": "dns-websupport"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ if hash docker 2>/dev/null; then
 | 
				
			|||||||
		-e NODE_OPTIONS=--openssl-legacy-provider \
 | 
							-e NODE_OPTIONS=--openssl-legacy-provider \
 | 
				
			||||||
		-v "$(pwd)/frontend:/app/frontend" \
 | 
							-v "$(pwd)/frontend:/app/frontend" \
 | 
				
			||||||
		-v "$(pwd)/global:/app/global" \
 | 
							-v "$(pwd)/global:/app/global" \
 | 
				
			||||||
		-w /app/frontend "$DOCKER_IMAGE" \
 | 
							-w /app/frontend "${DOCKER_IMAGE}" \
 | 
				
			||||||
		sh -c "yarn install && yarn build && yarn build && chown -R $(id -u):$(id -g) /app/frontend"
 | 
							sh -c "yarn install && yarn build && yarn build && chown -R $(id -u):$(id -g) /app/frontend"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	echo -e "${BLUE}❯ ${GREEN}Building Frontend Complete${RESET}"
 | 
						echo -e "${BLUE}❯ ${GREEN}Building Frontend Complete${RESET}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										89
									
								
								scripts/ci/fulltest-cypress
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					STACK="${1:-sqlite}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 | 
				
			||||||
 | 
					# remember this is running in "ci" folder..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Some defaults for running this script outside of CI
 | 
				
			||||||
 | 
					export COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-npm_local_fulltest}"
 | 
				
			||||||
 | 
					export IMAGE="${IMAGE:-nginx-proxy-manager}"
 | 
				
			||||||
 | 
					export BRANCH_LOWER="${BRANCH_LOWER:-unknown}"
 | 
				
			||||||
 | 
					export BUILD_NUMBER="${BUILD_NUMBER:-0000}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "${COMPOSE_FILE:-}" = "" ]; then
 | 
				
			||||||
 | 
						export COMPOSE_FILE="docker/docker-compose.ci.yml:docker/docker-compose.ci.${STACK}.yml"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Colors
 | 
				
			||||||
 | 
					BLUE='\E[1;34m'
 | 
				
			||||||
 | 
					RED='\E[1;31m'
 | 
				
			||||||
 | 
					CYAN='\E[1;36m'
 | 
				
			||||||
 | 
					GREEN='\E[1;32m'
 | 
				
			||||||
 | 
					RESET='\E[0m'
 | 
				
			||||||
 | 
					YELLOW='\E[1;33m'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export BLUE CYAN GREEN RESET YELLOW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -e "${BLUE}❯ ${CYAN}Starting fullstack cypress testing ...${RESET}"
 | 
				
			||||||
 | 
					echo -e "${BLUE}❯ $(docker-compose config)${RESET}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# $1: container_name
 | 
				
			||||||
 | 
					get_container_ip () {
 | 
				
			||||||
 | 
						local container_name=$1
 | 
				
			||||||
 | 
						local container
 | 
				
			||||||
 | 
						local ip
 | 
				
			||||||
 | 
						container=$(docker-compose ps --all -q "${container_name}" | tail -n1)
 | 
				
			||||||
 | 
						ip=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container")
 | 
				
			||||||
 | 
						echo "$ip"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bring up a stack, in steps so we can inject IPs everywhere
 | 
				
			||||||
 | 
					docker-compose up -d pdns pdns-db
 | 
				
			||||||
 | 
					PDNS_IP=$(get_container_ip "pdns")
 | 
				
			||||||
 | 
					echo -e "${BLUE}❯ ${YELLOW}PDNS IP is ${PDNS_IP}${RESET}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# adjust the dnsrouter config
 | 
				
			||||||
 | 
					LOCAL_DNSROUTER_CONFIG="$DIR/../../docker/dev/dnsrouter-config.json"
 | 
				
			||||||
 | 
					rm -rf "$LOCAL_DNSROUTER_CONFIG.tmp"
 | 
				
			||||||
 | 
					# IMPORTANT: changes to dnsrouter-config.json will affect this line:
 | 
				
			||||||
 | 
					jq --arg a "$PDNS_IP" '.servers[0].upstreams[1].upstream = $a' "$LOCAL_DNSROUTER_CONFIG" > "$LOCAL_DNSROUTER_CONFIG.tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker-compose up -d dnsrouter
 | 
				
			||||||
 | 
					DNSROUTER_IP=$(get_container_ip "dnsrouter")
 | 
				
			||||||
 | 
					echo -e "${BLUE}❯ ${YELLOW}DNS Router IP is ${DNSROUTER_IP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "${DNSROUTER_IP:-}" = "" ]; then
 | 
				
			||||||
 | 
						echo -e "${RED}❯ ERROR: DNS Router IP is not set${RESET}"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# mount the resolver
 | 
				
			||||||
 | 
					LOCAL_RESOLVE="$DIR/../../docker/dev/resolv.conf"
 | 
				
			||||||
 | 
					rm -rf "${LOCAL_RESOLVE}"
 | 
				
			||||||
 | 
					printf "nameserver %s\noptions ndots:0" "${DNSROUTER_IP}" > "${LOCAL_RESOLVE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# bring up all remaining containers, except cypress!
 | 
				
			||||||
 | 
					docker-compose up -d --remove-orphans stepca
 | 
				
			||||||
 | 
					docker-compose pull db-mysql || true # ok to fail
 | 
				
			||||||
 | 
					docker-compose up -d --remove-orphans --pull=never fullstack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# wait for main container to be healthy
 | 
				
			||||||
 | 
					bash "$DIR/../wait-healthy" "$(docker-compose ps --all -q fullstack)" 120
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Run tests
 | 
				
			||||||
 | 
					rm -rf "$DIR/../../test/results"
 | 
				
			||||||
 | 
					docker-compose up --build cypress
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get results
 | 
				
			||||||
 | 
					docker cp -L "$(docker-compose ps --all -q cypress):/test/results" "$DIR/../../test/"
 | 
				
			||||||
 | 
					docker cp -L "$(docker-compose ps --all -q fullstack):/data/logs" "$DIR/../../test/results/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$2" = "cleanup" ]; then
 | 
				
			||||||
 | 
						echo -e "${BLUE}❯ ${CYAN}Cleaning up containers ...${RESET}"
 | 
				
			||||||
 | 
						docker-compose down --remove-orphans --volumes -t 30
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -e "${BLUE}❯ ${GREEN}Fullstack cypress testing complete${RESET}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 | 
					DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 | 
				
			||||||
. "$DIR/../.common.sh"
 | 
					. "$DIR/../.common.sh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DOCKER_IMAGE=nginxproxymanager/nginx-full:certbot-node
 | 
					TESTING_IMAGE=nginxproxymanager/nginx-full:certbot-node
 | 
				
			||||||
docker pull "${DOCKER_IMAGE}"
 | 
					docker pull "${TESTING_IMAGE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Test
 | 
					# Test
 | 
				
			||||||
echo -e "${BLUE}❯ ${CYAN}Testing backend ...${RESET}"
 | 
					echo -e "${BLUE}❯ ${CYAN}Testing backend ...${RESET}"
 | 
				
			||||||
@@ -12,20 +12,20 @@ docker run --rm \
 | 
				
			|||||||
	-v "$(pwd)/backend:/app" \
 | 
						-v "$(pwd)/backend:/app" \
 | 
				
			||||||
	-v "$(pwd)/global:/app/global" \
 | 
						-v "$(pwd)/global:/app/global" \
 | 
				
			||||||
	-w /app \
 | 
						-w /app \
 | 
				
			||||||
	"${DOCKER_IMAGE}" \
 | 
						"${TESTING_IMAGE}" \
 | 
				
			||||||
	sh -c 'yarn install && yarn eslint . && rm -rf node_modules'
 | 
						sh -c 'yarn install && yarn eslint . && rm -rf node_modules'
 | 
				
			||||||
echo -e "${BLUE}❯ ${GREEN}Testing Complete${RESET}"
 | 
					echo -e "${BLUE}❯ ${GREEN}Testing Complete${RESET}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build
 | 
					# Build
 | 
				
			||||||
echo -e "${BLUE}❯ ${CYAN}Building ...${RESET}"
 | 
					echo -e "${BLUE}❯ ${CYAN}Building ...${RESET}"
 | 
				
			||||||
docker build --pull --no-cache --compress \
 | 
					docker build --pull --no-cache --compress \
 | 
				
			||||||
	-t "${IMAGE}:ci-${BUILD_NUMBER}" \
 | 
						-t "${IMAGE:-nginx-proxy-manager}:${BRANCH_LOWER:-unknown}-ci-${BUILD_NUMBER:-0000}" \
 | 
				
			||||||
	-f docker/Dockerfile \
 | 
						-f docker/Dockerfile \
 | 
				
			||||||
	--progress=plain \
 | 
						--progress=plain \
 | 
				
			||||||
	--build-arg TARGETPLATFORM=linux/amd64 \
 | 
						--build-arg TARGETPLATFORM=linux/amd64 \
 | 
				
			||||||
	--build-arg BUILDPLATFORM=linux/amd64 \
 | 
						--build-arg BUILDPLATFORM=linux/amd64 \
 | 
				
			||||||
	--build-arg BUILD_VERSION="${BUILD_VERSION}" \
 | 
						--build-arg BUILD_VERSION="${BUILD_VERSION:-unknown}" \
 | 
				
			||||||
	--build-arg BUILD_COMMIT="${BUILD_COMMIT}" \
 | 
						--build-arg BUILD_COMMIT="${BUILD_COMMIT:-unknown}" \
 | 
				
			||||||
	--build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \
 | 
						--build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \
 | 
				
			||||||
	.
 | 
						.
 | 
				
			||||||
echo -e "${BLUE}❯ ${GREEN}Building Complete${RESET}"
 | 
					echo -e "${BLUE}❯ ${GREEN}Building Complete${RESET}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,9 +23,8 @@ until [ "${HEALTHY}" = "healthy" ]; do
 | 
				
			|||||||
	((LOOPCOUNT++))
 | 
						((LOOPCOUNT++))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ "$LOOPCOUNT" == "$LIMIT" ]; then
 | 
						if [ "$LOOPCOUNT" == "$LIMIT" ]; then
 | 
				
			||||||
		echo ""
 | 
					 | 
				
			||||||
		echo ""
 | 
					 | 
				
			||||||
		echo -e "${BLUE}❯ ${RED}Timed out waiting for healthy${RESET}"
 | 
							echo -e "${BLUE}❯ ${RED}Timed out waiting for healthy${RESET}"
 | 
				
			||||||
 | 
							docker logs --tail 50 "$SERVICE"
 | 
				
			||||||
		exit 1
 | 
							exit 1
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
node_modules
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								test/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,4 +1,2 @@
 | 
				
			|||||||
.vscode
 | 
					results/*
 | 
				
			||||||
node_modules
 | 
					cypress/results/*
 | 
				
			||||||
results
 | 
					 | 
				
			||||||
cypress/videos
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,12 @@
 | 
				
			|||||||
FROM cypress/included:9.4.1
 | 
					FROM cypress/included:13.9.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --chown=1000 ./ /test
 | 
					COPY --chown=1000 ./test /test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# mkcert
 | 
					# Disable Cypress CLI colors
 | 
				
			||||||
ENV MKCERT=1.4.2
 | 
					ENV FORCE_COLOR=0
 | 
				
			||||||
RUN wget -O /usr/bin/mkcert "https://github.com/FiloSottile/mkcert/releases/download/v${MKCERT}/mkcert-v${MKCERT}-linux-amd64" \
 | 
					ENV NO_COLOR=1
 | 
				
			||||||
	&& chmod +x /usr/bin/mkcert
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /test
 | 
					WORKDIR /test
 | 
				
			||||||
RUN yarn install
 | 
					RUN yarn install && yarn cache clean
 | 
				
			||||||
ENTRYPOINT []
 | 
					ENTRYPOINT []
 | 
				
			||||||
CMD ["cypress", "run"]
 | 
					CMD ["cypress", "run"]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								test/cypress/config/ci.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					const { defineConfig } = require('cypress');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = defineConfig({
 | 
				
			||||||
 | 
						requestTimeout: 30000,
 | 
				
			||||||
 | 
						defaultCommandTimeout: 20000,
 | 
				
			||||||
 | 
						reporter: 'cypress-multi-reporters',
 | 
				
			||||||
 | 
						reporterOptions: {
 | 
				
			||||||
 | 
							configFile: 'multi-reporter.json'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						video: true,
 | 
				
			||||||
 | 
						videosFolder: 'results/videos',
 | 
				
			||||||
 | 
						screenshotsFolder: 'results/screenshots',
 | 
				
			||||||
 | 
						e2e: {
 | 
				
			||||||
 | 
							setupNodeEvents(on, config) {
 | 
				
			||||||
 | 
								return require("../plugins/index.js")(on, config);
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							env: {
 | 
				
			||||||
 | 
								swaggerBase: '{{baseUrl}}/api/schema',
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							baseUrl: 'http://localhost:1234',
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
	"requestTimeout": 30000,
 | 
					 | 
				
			||||||
	"defaultCommandTimeout": 20000,
 | 
					 | 
				
			||||||
	"reporter": "cypress-multi-reporters",
 | 
					 | 
				
			||||||
	"reporterOptions": {
 | 
					 | 
				
			||||||
		"configFile": "multi-reporter.json"
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"videosFolder": "results/videos",
 | 
					 | 
				
			||||||
	"screenshotsFolder": "results/screenshots",
 | 
					 | 
				
			||||||
	"env": {
 | 
					 | 
				
			||||||
		"swaggerBase": "{{baseUrl}}/api/schema",
 | 
					 | 
				
			||||||
		"RETRIES": 4
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										22
									
								
								test/cypress/config/dev.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					const { defineConfig } = require('cypress');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = defineConfig({
 | 
				
			||||||
 | 
						requestTimeout: 30000,
 | 
				
			||||||
 | 
						defaultCommandTimeout: 20000,
 | 
				
			||||||
 | 
						reporter: 'cypress-multi-reporters',
 | 
				
			||||||
 | 
						reporterOptions: {
 | 
				
			||||||
 | 
							configFile: 'multi-reporter.json'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						video: false,
 | 
				
			||||||
 | 
						videosFolder: 'results/videos',
 | 
				
			||||||
 | 
						screenshotsFolder: 'results/screenshots',
 | 
				
			||||||
 | 
						e2e: {
 | 
				
			||||||
 | 
							setupNodeEvents(on, config) {
 | 
				
			||||||
 | 
								return require("../plugins/index.js")(on, config);
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							env: {
 | 
				
			||||||
 | 
								swaggerBase: '{{baseUrl}}/api/schema',
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							baseUrl: 'http://localhost:1234',
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
	"requestTimeout": 30000,
 | 
					 | 
				
			||||||
	"defaultCommandTimeout": 20000,
 | 
					 | 
				
			||||||
	"reporter": "cypress-multi-reporters",
 | 
					 | 
				
			||||||
	"reporterOptions": {
 | 
					 | 
				
			||||||
		"configFile": "multi-reporter.json"
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"videos": false,
 | 
					 | 
				
			||||||
	"screenshotsFolder": "results/screenshots",
 | 
					 | 
				
			||||||
	"env": {
 | 
					 | 
				
			||||||
		"swaggerBase": "{{baseUrl}}/api/schema",
 | 
					 | 
				
			||||||
		"RETRIES": 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "name": "Using fixtures to represent data",
 | 
					 | 
				
			||||||
  "email": "hello@cypress.io",
 | 
					 | 
				
			||||||
  "body": "Fixtures are a great way to mock data for responses to routes"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,8 +1,12 @@
 | 
				
			|||||||
const _     = require('lodash');
 | 
					const _ = require("lodash");
 | 
				
			||||||
const chalk = require('chalk');
 | 
					const chalk = require("chalk");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function () {
 | 
					module.exports = function() {
 | 
				
			||||||
	var arr = _.values(arguments);
 | 
						var arr = _.values(arguments);
 | 
				
			||||||
	arr.unshift(chalk.blue.bold('[') + chalk.yellow.bold('Backend API') + chalk.blue.bold(']'));
 | 
						arr.unshift(
 | 
				
			||||||
 | 
							chalk.blue.bold("[") +
 | 
				
			||||||
 | 
								chalk.yellow.bold("Backend API") +
 | 
				
			||||||
 | 
								chalk.blue.bold("]"),
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
	console.log.apply(null, arr);
 | 
						console.log.apply(null, arr);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,20 +9,32 @@
 | 
				
			|||||||
// ***********************************************
 | 
					// ***********************************************
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'cypress-wait-until';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Cypress.Commands.add('randomString', (length) => {
 | 
				
			||||||
 | 
						var result           = '';
 | 
				
			||||||
 | 
						var characters       = 'ABCDEFGHIJK LMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 | 
				
			||||||
 | 
						var charactersLength = characters.length;
 | 
				
			||||||
 | 
						for (var i = 0; i < length; i++) {
 | 
				
			||||||
 | 
							result += characters.charAt(Math.floor(Math.random() * charactersLength));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Check the swagger schema:
 | 
					 * Check the swagger schema:
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param {string}  method        API Method in swagger doc, "get", "put", "post", "delete"
 | 
					 * @param {string}  method        API Method in swagger doc, "get", "put", "post", "delete"
 | 
				
			||||||
 * @param {number}  statusCode    API status code in swagger doc
 | 
					 * @param {integer} code          Swagger doc endpoint response code, exactly as defined in swagger doc
 | 
				
			||||||
 * @param {string}  path          Swagger doc endpoint path, exactly as defined in swagger doc
 | 
					 * @param {string}  path          Swagger doc endpoint path, exactly as defined in swagger doc
 | 
				
			||||||
 * @param {*}       data          The API response data to check against the swagger schema
 | 
					 * @param {*}       data          The API response data to check against the swagger schema
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
Cypress.Commands.add('validateSwaggerSchema', (method, statusCode, path, data) => {
 | 
					Cypress.Commands.add('validateSwaggerSchema', (method, code, path, data) => {
 | 
				
			||||||
	cy.task('validateSwaggerSchema', {
 | 
						cy.task('validateSwaggerSchema', {
 | 
				
			||||||
		file:           Cypress.env('swaggerBase'),
 | 
							file:           Cypress.env('swaggerBase'),
 | 
				
			||||||
		endpoint:       path,
 | 
							endpoint:       path,
 | 
				
			||||||
		method:         method,
 | 
							method:         method,
 | 
				
			||||||
		statusCode:     statusCode,
 | 
							statusCode:     code,
 | 
				
			||||||
		responseSchema: data,
 | 
							responseSchema: data,
 | 
				
			||||||
		verbose:        true
 | 
							verbose:        true
 | 
				
			||||||
	}).should('equal', null);
 | 
						}).should('equal', null);
 | 
				
			||||||
@@ -40,3 +52,19 @@ Cypress.Commands.add('getToken', () => {
 | 
				
			|||||||
		cy.wrap(res.token);
 | 
							cy.wrap(res.token);
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: copied from v3, is this usable?
 | 
				
			||||||
 | 
					Cypress.Commands.add('waitForCertificateStatus', (token, certID, expected, timeout = 60) => {
 | 
				
			||||||
 | 
						cy.log(`Waiting for certificate (${certID}) status (${expected}) timeout (${timeout})`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cy.waitUntil(() => cy.task('backendApiGet', {
 | 
				
			||||||
 | 
							token: token,
 | 
				
			||||||
 | 
							path:  `/api/certificates/${certID}`
 | 
				
			||||||
 | 
						}).then((data) => {
 | 
				
			||||||
 | 
							return data.result.status === expected;
 | 
				
			||||||
 | 
						}), {
 | 
				
			||||||
 | 
							errorMsg: 'Waiting for certificate status failed',
 | 
				
			||||||
 | 
							timeout:  timeout * 1000,
 | 
				
			||||||
 | 
							interval: 5000
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,3 @@
 | 
				
			|||||||
require('cypress-plugin-retries');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import './commands';
 | 
					import './commands';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cypress.on('uncaught:exception', (/*err, runnable*/) => {
 | 
					Cypress.on('uncaught:exception', (/*err, runnable*/) => {
 | 
				
			||||||
@@ -4,19 +4,19 @@
 | 
				
			|||||||
	"description": "",
 | 
						"description": "",
 | 
				
			||||||
	"main": "index.js",
 | 
						"main": "index.js",
 | 
				
			||||||
	"dependencies": {
 | 
						"dependencies": {
 | 
				
			||||||
		"@jc21/cypress-swagger-validation": "^0.0.9",
 | 
							"@jc21/cypress-swagger-validation": "^0.2.6",
 | 
				
			||||||
		"@jc21/restler": "^3.4.0",
 | 
							"@jc21/restler": "^3.4.0",
 | 
				
			||||||
		"chalk": "^4.1.0",
 | 
							"chalk": "^4.1.0",
 | 
				
			||||||
		"cypress": "^9.4.1",
 | 
							"cypress": "^13.9.0",
 | 
				
			||||||
		"cypress-multi-reporters": "^1.4.0",
 | 
							"cypress-multi-reporters": "^1.6.4",
 | 
				
			||||||
		"cypress-plugin-retries": "^1.5.2",
 | 
							"cypress-wait-until": "^3.0.1",
 | 
				
			||||||
		"eslint": "^7.6.0",
 | 
							"eslint": "^9.3.0",
 | 
				
			||||||
		"eslint-plugin-align-assignments": "^1.1.2",
 | 
							"eslint-plugin-align-assignments": "^1.1.2",
 | 
				
			||||||
		"eslint-plugin-chai-friendly": "^0.6.0",
 | 
							"eslint-plugin-chai-friendly": "^0.7.4",
 | 
				
			||||||
		"eslint-plugin-cypress": "^2.11.1",
 | 
							"eslint-plugin-cypress": "^3.2.0",
 | 
				
			||||||
		"lodash": "^4.17.19",
 | 
							"lodash": "^4.17.21",
 | 
				
			||||||
		"mocha": "^8.1.1",
 | 
							"mocha": "^10.4.0",
 | 
				
			||||||
		"mocha-junit-reporter": "^2.0.0"
 | 
							"mocha-junit-reporter": "^2.2.1"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"scripts": {
 | 
						"scripts": {
 | 
				
			||||||
		"cypress": "cypress open --config-file=cypress/config/dev.json --config baseUrl=${BASE_URL:-http://127.0.0.1:3081}",
 | 
							"cypress": "cypress open --config-file=cypress/config/dev.json --config baseUrl=${BASE_URL:-http://127.0.0.1:3081}",
 | 
				
			||||||
 
 | 
				
			|||||||