mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-11-04 01:15:14 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v2.12.2
			...
			f6abe27a8a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f6abe27a8a | ||
| 
						 | 
					d8ca38cb26 | 
							
								
								
									
										38
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@@ -167,44 +167,6 @@ pipeline {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stage('Test Postgres') {
 | 
					 | 
				
			||||||
			environment {
 | 
					 | 
				
			||||||
				COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_postgres"
 | 
					 | 
				
			||||||
				COMPOSE_FILE         = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.postgres.yml'
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			when {
 | 
					 | 
				
			||||||
				not {
 | 
					 | 
				
			||||||
					equals expected: 'UNSTABLE', actual: currentBuild.result
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			steps {
 | 
					 | 
				
			||||||
				sh 'rm -rf ./test/results/junit/*'
 | 
					 | 
				
			||||||
				sh './scripts/ci/fulltest-cypress'
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			post {
 | 
					 | 
				
			||||||
				always {
 | 
					 | 
				
			||||||
					// Dumps to analyze later
 | 
					 | 
				
			||||||
					sh 'mkdir -p debug/postgres'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q fullstack) > debug/postgres/docker_fullstack.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q stepca) > debug/postgres/docker_stepca.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q pdns) > debug/postgres/docker_pdns.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q pdns-db) > debug/postgres/docker_pdns-db.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q dnsrouter) > debug/postgres/docker_dnsrouter.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q db-postgres) > debug/postgres/docker_db-postgres.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q authentik) > debug/postgres/docker_authentik.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q authentik-redis) > debug/postgres/docker_authentik-redis.log 2>&1'
 | 
					 | 
				
			||||||
					sh 'docker logs $(docker-compose ps --all -q authentik-ldap) > debug/postgres/docker_authentik-ldap.log 2>&1'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					junit 'test/results/junit/*'
 | 
					 | 
				
			||||||
					sh 'docker-compose down --remove-orphans --volumes -t 30 || true'
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				unstable {
 | 
					 | 
				
			||||||
					dir(path: 'testing/results') {
 | 
					 | 
				
			||||||
						archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		stage('MultiArch Build') {
 | 
							stage('MultiArch Build') {
 | 
				
			||||||
			when {
 | 
								when {
 | 
				
			||||||
				not {
 | 
									not {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<p align="center">
 | 
					<p align="center">
 | 
				
			||||||
	<img src="https://nginxproxymanager.com/github.png">
 | 
						<img src="https://nginxproxymanager.com/github.png">
 | 
				
			||||||
	<br><br>
 | 
						<br><br>
 | 
				
			||||||
	<img src="https://img.shields.io/badge/version-2.12.2-green.svg?style=for-the-badge">
 | 
						<img src="https://img.shields.io/badge/version-2.12.1-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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,7 @@ const internalAccessList = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				return internalAccessList.build(row)
 | 
									return internalAccessList.build(row)
 | 
				
			||||||
					.then(() => {
 | 
										.then(() => {
 | 
				
			||||||
						if (parseInt(row.proxy_host_count, 10)) {
 | 
											if (row.proxy_host_count) {
 | 
				
			||||||
							return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
 | 
												return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
@@ -223,7 +223,7 @@ const internalAccessList = {
 | 
				
			|||||||
			.then((row) => {
 | 
								.then((row) => {
 | 
				
			||||||
				return internalAccessList.build(row)
 | 
									return internalAccessList.build(row)
 | 
				
			||||||
					.then(() => {
 | 
										.then(() => {
 | 
				
			||||||
						if (parseInt(row.proxy_host_count, 10)) {
 | 
											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(internalNginx.reload)
 | 
				
			||||||
@@ -252,10 +252,7 @@ const internalAccessList = {
 | 
				
			|||||||
				let query = accessListModel
 | 
									let query = accessListModel
 | 
				
			||||||
					.query()
 | 
										.query()
 | 
				
			||||||
					.select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count'))
 | 
										.select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count'))
 | 
				
			||||||
					.leftJoin('proxy_host', function() {
 | 
										.joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0')
 | 
				
			||||||
						this.on('proxy_host.access_list_id', '=', 'access_list.id')
 | 
					 | 
				
			||||||
							.andOn('proxy_host.is_deleted', '=', 0);
 | 
					 | 
				
			||||||
					})
 | 
					 | 
				
			||||||
					.where('access_list.is_deleted', 0)
 | 
										.where('access_list.is_deleted', 0)
 | 
				
			||||||
					.andWhere('access_list.id', data.id)
 | 
										.andWhere('access_list.id', data.id)
 | 
				
			||||||
					.allowGraph('[owner,items,clients,proxy_hosts.[certificate,access_list.[clients,items]]]')
 | 
										.allowGraph('[owner,items,clients,proxy_hosts.[certificate,access_list.[clients,items]]]')
 | 
				
			||||||
@@ -376,10 +373,7 @@ const internalAccessList = {
 | 
				
			|||||||
				let query = accessListModel
 | 
									let query = accessListModel
 | 
				
			||||||
					.query()
 | 
										.query()
 | 
				
			||||||
					.select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count'))
 | 
										.select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count'))
 | 
				
			||||||
					.leftJoin('proxy_host', function() {
 | 
										.joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0')
 | 
				
			||||||
						this.on('proxy_host.access_list_id', '=', 'access_list.id')
 | 
					 | 
				
			||||||
							.andOn('proxy_host.is_deleted', '=', 0);
 | 
					 | 
				
			||||||
					})
 | 
					 | 
				
			||||||
					.where('access_list.is_deleted', 0)
 | 
										.where('access_list.is_deleted', 0)
 | 
				
			||||||
					.groupBy('access_list.id')
 | 
										.groupBy('access_list.id')
 | 
				
			||||||
					.allowGraph('[owner,items,clients]')
 | 
										.allowGraph('[owner,items,clients]')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
const error            = require('../lib/error');
 | 
					const error         = require('../lib/error');
 | 
				
			||||||
const auditLogModel    = require('../models/audit-log');
 | 
					const auditLogModel = require('../models/audit-log');
 | 
				
			||||||
const {castJsonIfNeed} = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const internalAuditLog = {
 | 
					const internalAuditLog = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,9 +22,9 @@ const internalAuditLog = {
 | 
				
			|||||||
					.allowGraph('[user]');
 | 
										.allowGraph('[user]');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Query is used for searching
 | 
									// Query is used for searching
 | 
				
			||||||
				if (typeof search_query === 'string' && search_query.length > 0) {
 | 
									if (typeof search_query === 'string') {
 | 
				
			||||||
					query.where(function () {
 | 
										query.where(function () {
 | 
				
			||||||
						this.where(castJsonIfNeed('meta'), 'like', '%' + search_query + '%');
 | 
											this.where('meta', 'like', '%' + search_query + '%');
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ const internalHost        = require('./host');
 | 
				
			|||||||
const internalNginx       = require('./nginx');
 | 
					const internalNginx       = require('./nginx');
 | 
				
			||||||
const internalAuditLog    = require('./audit-log');
 | 
					const internalAuditLog    = require('./audit-log');
 | 
				
			||||||
const internalCertificate = require('./certificate');
 | 
					const internalCertificate = require('./certificate');
 | 
				
			||||||
const {castJsonIfNeed}    = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function omissions () {
 | 
					function omissions () {
 | 
				
			||||||
	return ['is_deleted'];
 | 
						return ['is_deleted'];
 | 
				
			||||||
@@ -410,16 +409,16 @@ const internalDeadHost = {
 | 
				
			|||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.groupBy('id')
 | 
										.groupBy('id')
 | 
				
			||||||
					.allowGraph('[owner,certificate]')
 | 
										.allowGraph('[owner,certificate]')
 | 
				
			||||||
					.orderBy(castJsonIfNeed('domain_names'), 'ASC');
 | 
										.orderBy('domain_names', 'ASC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
					query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
										query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Query is used for searching
 | 
									// Query is used for searching
 | 
				
			||||||
				if (typeof search_query === 'string' && search_query.length > 0) {
 | 
									if (typeof search_query === 'string') {
 | 
				
			||||||
					query.where(function () {
 | 
										query.where(function () {
 | 
				
			||||||
						this.where(castJsonIfNeed('domain_names'), 'like', '%' + search_query + '%');
 | 
											this.where('domain_names', 'like', '%' + search_query + '%');
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,6 @@ const _                    = require('lodash');
 | 
				
			|||||||
const proxyHostModel       = require('../models/proxy_host');
 | 
					const proxyHostModel       = require('../models/proxy_host');
 | 
				
			||||||
const redirectionHostModel = require('../models/redirection_host');
 | 
					const redirectionHostModel = require('../models/redirection_host');
 | 
				
			||||||
const deadHostModel        = require('../models/dead_host');
 | 
					const deadHostModel        = require('../models/dead_host');
 | 
				
			||||||
const {castJsonIfNeed}     = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const internalHost = {
 | 
					const internalHost = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,7 +17,7 @@ const internalHost = {
 | 
				
			|||||||
	cleanSslHstsData: function (data, existing_data) {
 | 
						cleanSslHstsData: function (data, existing_data) {
 | 
				
			||||||
		existing_data = existing_data === undefined ? {} : existing_data;
 | 
							existing_data = existing_data === undefined ? {} : existing_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const combined_data = _.assign({}, existing_data, data);
 | 
							let combined_data = _.assign({}, existing_data, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!combined_data.certificate_id) {
 | 
							if (!combined_data.certificate_id) {
 | 
				
			||||||
			combined_data.ssl_forced    = false;
 | 
								combined_data.ssl_forced    = false;
 | 
				
			||||||
@@ -74,7 +73,7 @@ const internalHost = {
 | 
				
			|||||||
	 * @returns {Promise}
 | 
						 * @returns {Promise}
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	getHostsWithDomains: function (domain_names) {
 | 
						getHostsWithDomains: function (domain_names) {
 | 
				
			||||||
		const promises = [
 | 
							let promises = [
 | 
				
			||||||
			proxyHostModel
 | 
								proxyHostModel
 | 
				
			||||||
				.query()
 | 
									.query()
 | 
				
			||||||
				.where('is_deleted', 0),
 | 
									.where('is_deleted', 0),
 | 
				
			||||||
@@ -126,19 +125,19 @@ const internalHost = {
 | 
				
			|||||||
	 * @returns {Promise}
 | 
						 * @returns {Promise}
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	isHostnameTaken: function (hostname, ignore_type, ignore_id) {
 | 
						isHostnameTaken: function (hostname, ignore_type, ignore_id) {
 | 
				
			||||||
		const promises = [
 | 
							let promises = [
 | 
				
			||||||
			proxyHostModel
 | 
								proxyHostModel
 | 
				
			||||||
				.query()
 | 
									.query()
 | 
				
			||||||
				.where('is_deleted', 0)
 | 
									.where('is_deleted', 0)
 | 
				
			||||||
				.andWhere(castJsonIfNeed('domain_names'), 'like', '%' + hostname + '%'),
 | 
									.andWhere('domain_names', 'like', '%' + hostname + '%'),
 | 
				
			||||||
			redirectionHostModel
 | 
								redirectionHostModel
 | 
				
			||||||
				.query()
 | 
									.query()
 | 
				
			||||||
				.where('is_deleted', 0)
 | 
									.where('is_deleted', 0)
 | 
				
			||||||
				.andWhere(castJsonIfNeed('domain_names'), 'like', '%' + hostname + '%'),
 | 
									.andWhere('domain_names', 'like', '%' + hostname + '%'),
 | 
				
			||||||
			deadHostModel
 | 
								deadHostModel
 | 
				
			||||||
				.query()
 | 
									.query()
 | 
				
			||||||
				.where('is_deleted', 0)
 | 
									.where('is_deleted', 0)
 | 
				
			||||||
				.andWhere(castJsonIfNeed('domain_names'), 'like', '%' + hostname + '%')
 | 
									.andWhere('domain_names', 'like', '%' + hostname + '%')
 | 
				
			||||||
		];
 | 
							];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return Promise.all(promises)
 | 
							return Promise.all(promises)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ const internalHost        = require('./host');
 | 
				
			|||||||
const internalNginx       = require('./nginx');
 | 
					const internalNginx       = require('./nginx');
 | 
				
			||||||
const internalAuditLog    = require('./audit-log');
 | 
					const internalAuditLog    = require('./audit-log');
 | 
				
			||||||
const internalCertificate = require('./certificate');
 | 
					const internalCertificate = require('./certificate');
 | 
				
			||||||
const {castJsonIfNeed}    = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function omissions () {
 | 
					function omissions () {
 | 
				
			||||||
	return ['is_deleted', 'owner.is_deleted'];
 | 
						return ['is_deleted', 'owner.is_deleted'];
 | 
				
			||||||
@@ -417,16 +416,16 @@ const internalProxyHost = {
 | 
				
			|||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.groupBy('id')
 | 
										.groupBy('id')
 | 
				
			||||||
					.allowGraph('[owner,access_list,certificate]')
 | 
										.allowGraph('[owner,access_list,certificate]')
 | 
				
			||||||
					.orderBy(castJsonIfNeed('domain_names'), 'ASC');
 | 
										.orderBy('domain_names', 'ASC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
					query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
										query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Query is used for searching
 | 
									// Query is used for searching
 | 
				
			||||||
				if (typeof search_query === 'string' && search_query.length > 0) {
 | 
									if (typeof search_query === 'string') {
 | 
				
			||||||
					query.where(function () {
 | 
										query.where(function () {
 | 
				
			||||||
						this.where(castJsonIfNeed('domain_names'), 'like', `%${search_query}%`);
 | 
											this.where('domain_names', 'like', '%' + search_query + '%');
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ const internalHost         = require('./host');
 | 
				
			|||||||
const internalNginx        = require('./nginx');
 | 
					const internalNginx        = require('./nginx');
 | 
				
			||||||
const internalAuditLog     = require('./audit-log');
 | 
					const internalAuditLog     = require('./audit-log');
 | 
				
			||||||
const internalCertificate  = require('./certificate');
 | 
					const internalCertificate  = require('./certificate');
 | 
				
			||||||
const {castJsonIfNeed}     = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function omissions () {
 | 
					function omissions () {
 | 
				
			||||||
	return ['is_deleted'];
 | 
						return ['is_deleted'];
 | 
				
			||||||
@@ -410,16 +409,16 @@ const internalRedirectionHost = {
 | 
				
			|||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.groupBy('id')
 | 
										.groupBy('id')
 | 
				
			||||||
					.allowGraph('[owner,certificate]')
 | 
										.allowGraph('[owner,certificate]')
 | 
				
			||||||
					.orderBy(castJsonIfNeed('domain_names'), 'ASC');
 | 
										.orderBy('domain_names', 'ASC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
					query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
										query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Query is used for searching
 | 
									// Query is used for searching
 | 
				
			||||||
				if (typeof search_query === 'string' && search_query.length > 0) {
 | 
									if (typeof search_query === 'string') {
 | 
				
			||||||
					query.where(function () {
 | 
										query.where(function () {
 | 
				
			||||||
						this.where(castJsonIfNeed('domain_names'), 'like', `%${search_query}%`);
 | 
											this.where('domain_names', 'like', '%' + search_query + '%');
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ const utils            = require('../lib/utils');
 | 
				
			|||||||
const streamModel      = require('../models/stream');
 | 
					const streamModel      = require('../models/stream');
 | 
				
			||||||
const internalNginx    = require('./nginx');
 | 
					const internalNginx    = require('./nginx');
 | 
				
			||||||
const internalAuditLog = require('./audit-log');
 | 
					const internalAuditLog = require('./audit-log');
 | 
				
			||||||
const {castJsonIfNeed} = require('../lib/helpers');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function omissions () {
 | 
					function omissions () {
 | 
				
			||||||
	return ['is_deleted'];
 | 
						return ['is_deleted'];
 | 
				
			||||||
@@ -294,21 +293,21 @@ const internalStream = {
 | 
				
			|||||||
	getAll: (access, expand, search_query) => {
 | 
						getAll: (access, expand, search_query) => {
 | 
				
			||||||
		return access.can('streams:list')
 | 
							return access.can('streams:list')
 | 
				
			||||||
			.then((access_data) => {
 | 
								.then((access_data) => {
 | 
				
			||||||
				const query = streamModel
 | 
									let query = streamModel
 | 
				
			||||||
					.query()
 | 
										.query()
 | 
				
			||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.groupBy('id')
 | 
										.groupBy('id')
 | 
				
			||||||
					.allowGraph('[owner]')
 | 
										.allowGraph('[owner]')
 | 
				
			||||||
					.orderByRaw('CAST(incoming_port AS INTEGER) ASC');
 | 
										.orderBy('incoming_port', 'ASC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
					query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
										query.andWhere('owner_user_id', access.token.getUserId(1));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Query is used for searching
 | 
									// Query is used for searching
 | 
				
			||||||
				if (typeof search_query === 'string' && search_query.length > 0) {
 | 
									if (typeof search_query === 'string') {
 | 
				
			||||||
					query.where(function () {
 | 
										query.where(function () {
 | 
				
			||||||
						this.where(castJsonIfNeed('incoming_port'), 'like', `%${search_query}%`);
 | 
											this.where('incoming_port', 'like', '%' + search_query + '%');
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -328,9 +327,9 @@ const internalStream = {
 | 
				
			|||||||
	 * @returns {Promise}
 | 
						 * @returns {Promise}
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	getCount: (user_id, visibility) => {
 | 
						getCount: (user_id, visibility) => {
 | 
				
			||||||
		const query = streamModel
 | 
							let query = streamModel
 | 
				
			||||||
			.query()
 | 
								.query()
 | 
				
			||||||
			.count('id AS count')
 | 
								.count('id as count')
 | 
				
			||||||
			.where('is_deleted', 0);
 | 
								.where('is_deleted', 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (visibility !== 'all') {
 | 
							if (visibility !== 'all') {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,7 @@ const fs      = require('fs');
 | 
				
			|||||||
const NodeRSA = require('node-rsa');
 | 
					const NodeRSA = require('node-rsa');
 | 
				
			||||||
const logger  = require('../logger').global;
 | 
					const logger  = require('../logger').global;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const keysFile         = '/data/keys.json';
 | 
					const keysFile = '/data/keys.json';
 | 
				
			||||||
const mysqlEngine      = 'mysql2';
 | 
					 | 
				
			||||||
const postgresEngine   = 'pg';
 | 
					 | 
				
			||||||
const sqliteClientName = 'sqlite3';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
let instance = null;
 | 
					let instance = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -17,7 +14,7 @@ const configure = () => {
 | 
				
			|||||||
		let configData;
 | 
							let configData;
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			configData = require(filename);
 | 
								configData = require(filename);
 | 
				
			||||||
		} catch (_) {
 | 
							} catch (err) {
 | 
				
			||||||
			// do nothing
 | 
								// do nothing
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,7 +34,7 @@ const configure = () => {
 | 
				
			|||||||
		logger.info('Using MySQL configuration');
 | 
							logger.info('Using MySQL configuration');
 | 
				
			||||||
		instance = {
 | 
							instance = {
 | 
				
			||||||
			database: {
 | 
								database: {
 | 
				
			||||||
				engine:   mysqlEngine,
 | 
									engine:   'mysql2',
 | 
				
			||||||
				host:     envMysqlHost,
 | 
									host:     envMysqlHost,
 | 
				
			||||||
				port:     process.env.DB_MYSQL_PORT || 3306,
 | 
									port:     process.env.DB_MYSQL_PORT || 3306,
 | 
				
			||||||
				user:     envMysqlUser,
 | 
									user:     envMysqlUser,
 | 
				
			||||||
@@ -49,33 +46,13 @@ const configure = () => {
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const envPostgresHost = process.env.DB_POSTGRES_HOST || null;
 | 
					 | 
				
			||||||
	const envPostgresUser = process.env.DB_POSTGRES_USER || null;
 | 
					 | 
				
			||||||
	const envPostgresName = process.env.DB_POSTGRES_NAME || null;
 | 
					 | 
				
			||||||
	if (envPostgresHost && envPostgresUser && envPostgresName) {
 | 
					 | 
				
			||||||
		// we have enough postgres creds to go with postgres
 | 
					 | 
				
			||||||
		logger.info('Using Postgres configuration');
 | 
					 | 
				
			||||||
		instance = {
 | 
					 | 
				
			||||||
			database: {
 | 
					 | 
				
			||||||
				engine:   postgresEngine,
 | 
					 | 
				
			||||||
				host:     envPostgresHost,
 | 
					 | 
				
			||||||
				port:     process.env.DB_POSTGRES_PORT || 5432,
 | 
					 | 
				
			||||||
				user:     envPostgresUser,
 | 
					 | 
				
			||||||
				password: process.env.DB_POSTGRES_PASSWORD,
 | 
					 | 
				
			||||||
				name:     envPostgresName,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			keys: getKeys(),
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const envSqliteFile = process.env.DB_SQLITE_FILE || '/data/database.sqlite';
 | 
						const envSqliteFile = process.env.DB_SQLITE_FILE || '/data/database.sqlite';
 | 
				
			||||||
	logger.info(`Using Sqlite: ${envSqliteFile}`);
 | 
						logger.info(`Using Sqlite: ${envSqliteFile}`);
 | 
				
			||||||
	instance = {
 | 
						instance = {
 | 
				
			||||||
		database: {
 | 
							database: {
 | 
				
			||||||
			engine: 'knex-native',
 | 
								engine: 'knex-native',
 | 
				
			||||||
			knex:   {
 | 
								knex:   {
 | 
				
			||||||
				client:     sqliteClientName,
 | 
									client:     'sqlite3',
 | 
				
			||||||
				connection: {
 | 
									connection: {
 | 
				
			||||||
					filename: envSqliteFile
 | 
										filename: envSqliteFile
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
@@ -166,27 +143,7 @@ module.exports = {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	isSqlite: function () {
 | 
						isSqlite: function () {
 | 
				
			||||||
		instance === null && configure();
 | 
							instance === null && configure();
 | 
				
			||||||
		return instance.database.knex && instance.database.knex.client === sqliteClientName;
 | 
							return instance.database.knex && instance.database.knex.client === 'sqlite3';
 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Is this a mysql configuration?
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * @returns {boolean}
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	isMysql: function () {
 | 
					 | 
				
			||||||
		instance === null && configure();
 | 
					 | 
				
			||||||
		return instance.database.engine === mysqlEngine;
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
		 * Is this a postgres configuration?
 | 
					 | 
				
			||||||
		 *
 | 
					 | 
				
			||||||
		 * @returns {boolean}
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
	isPostgres: function () {
 | 
					 | 
				
			||||||
		instance === null && configure();
 | 
					 | 
				
			||||||
		return instance.database.engine === postgresEngine;
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,4 @@
 | 
				
			|||||||
const moment       = require('moment');
 | 
					const moment = require('moment');
 | 
				
			||||||
const {isPostgres} = require('./config');
 | 
					 | 
				
			||||||
const {ref}        = require('objection');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,16 +45,6 @@ module.exports = {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		return obj;
 | 
							return obj;
 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Casts a column to json if using postgres
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * @param {string} colName
 | 
					 | 
				
			||||||
	 * @returns {string|Objection.ReferenceBuilder}
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	castJsonIfNeed: function (colName) {
 | 
					 | 
				
			||||||
		return isPostgres() ? ref(colName).castText() : colName;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										34
									
								
								backend/migrations/20241209025008_client_max_body_size.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								backend/migrations/20241209025008_client_max_body_size.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					const migrate_name = 'client_max_body_size';
 | 
				
			||||||
 | 
					const logger       = require('../logger').migrate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Migrate
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see http://knexjs.org/#Schema
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param   {Object}  knex
 | 
				
			||||||
 | 
					 * @param   {Promise} Promise
 | 
				
			||||||
 | 
					 * @returns {Promise}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					exports.up = function (knex/*, Promise*/) {
 | 
				
			||||||
 | 
						logger.info('[' + migrate_name + '] Migrating Up...');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return knex.schema.table('proxy_host', function (proxy_host) {
 | 
				
			||||||
 | 
							proxy_host.integer('client_max_body_size').notNull().unsigned().defaultTo('1');
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
							.then(() => {
 | 
				
			||||||
 | 
								logger.info('[' + migrate_name + '] proxy_host Table altered');
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Undo Migrate
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param   {Object}  knex
 | 
				
			||||||
 | 
					 * @param   {Promise} Promise
 | 
				
			||||||
 | 
					 * @returns {Promise}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					exports.down = function (knex, Promise) {
 | 
				
			||||||
 | 
						logger.warn('[' + migrate_name + '] You can\'t migrate down this one.');
 | 
				
			||||||
 | 
						return Promise.resolve(true);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -17,9 +17,6 @@ const boolFields = [
 | 
				
			|||||||
	'preserve_path',
 | 
						'preserve_path',
 | 
				
			||||||
	'ssl_forced',
 | 
						'ssl_forced',
 | 
				
			||||||
	'block_exploits',
 | 
						'block_exploits',
 | 
				
			||||||
	'hsts_enabled',
 | 
					 | 
				
			||||||
	'hsts_subdomains',
 | 
					 | 
				
			||||||
	'http2_support',
 | 
					 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RedirectionHost extends Model {
 | 
					class RedirectionHost extends Model {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@
 | 
				
			|||||||
		"node-rsa": "^1.0.8",
 | 
							"node-rsa": "^1.0.8",
 | 
				
			||||||
		"objection": "3.0.1",
 | 
							"objection": "3.0.1",
 | 
				
			||||||
		"path": "^0.12.7",
 | 
							"path": "^0.12.7",
 | 
				
			||||||
		"pg": "^8.13.1",
 | 
					 | 
				
			||||||
		"signale": "1.4.0",
 | 
							"signale": "1.4.0",
 | 
				
			||||||
		"sqlite3": "5.1.6",
 | 
							"sqlite3": "5.1.6",
 | 
				
			||||||
		"temp-write": "^4.0.0"
 | 
							"temp-write": "^4.0.0"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@
 | 
				
			|||||||
		"domain_names",
 | 
							"domain_names",
 | 
				
			||||||
		"forward_host",
 | 
							"forward_host",
 | 
				
			||||||
		"forward_port",
 | 
							"forward_port",
 | 
				
			||||||
 | 
							"client_max_body_size",
 | 
				
			||||||
		"access_list_id",
 | 
							"access_list_id",
 | 
				
			||||||
		"certificate_id",
 | 
							"certificate_id",
 | 
				
			||||||
		"ssl_forced",
 | 
							"ssl_forced",
 | 
				
			||||||
@@ -52,6 +53,11 @@
 | 
				
			|||||||
			"minimum": 1,
 | 
								"minimum": 1,
 | 
				
			||||||
			"maximum": 65535
 | 
								"maximum": 65535
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							"client_max_body_size": {
 | 
				
			||||||
 | 
								"type": "integer",
 | 
				
			||||||
 | 
								"minimum": 1,
 | 
				
			||||||
 | 
								"maximum": 4096
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		"access_list_id": {
 | 
							"access_list_id": {
 | 
				
			||||||
			"$ref": "../common.json#/properties/access_list_id"
 | 
								"$ref": "../common.json#/properties/access_list_id"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -112,6 +118,9 @@
 | 
				
			|||||||
					"forward_port": {
 | 
										"forward_port": {
 | 
				
			||||||
						"$ref": "#/properties/forward_port"
 | 
											"$ref": "#/properties/forward_port"
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 | 
										"client_max_body_size": {
 | 
				
			||||||
 | 
											"$ref": "#/properties/client_max_body_size"
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
					"forward_path": {
 | 
										"forward_path": {
 | 
				
			||||||
						"type": "string"
 | 
											"type": "string"
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
									"domain_names": ["test.example.com"],
 | 
														"domain_names": ["test.example.com"],
 | 
				
			||||||
									"forward_host": "127.0.0.1",
 | 
														"forward_host": "127.0.0.1",
 | 
				
			||||||
									"forward_port": 8989,
 | 
														"forward_port": 8989,
 | 
				
			||||||
 | 
														"client_max_body_size": 1,
 | 
				
			||||||
									"access_list_id": 0,
 | 
														"access_list_id": 0,
 | 
				
			||||||
									"certificate_id": 0,
 | 
														"certificate_id": 0,
 | 
				
			||||||
									"ssl_forced": false,
 | 
														"ssl_forced": false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
								"domain_names": ["test.example.com"],
 | 
													"domain_names": ["test.example.com"],
 | 
				
			||||||
								"forward_host": "192.168.0.10",
 | 
													"forward_host": "192.168.0.10",
 | 
				
			||||||
								"forward_port": 8989,
 | 
													"forward_port": 8989,
 | 
				
			||||||
 | 
													"client_max_body_size": 1,
 | 
				
			||||||
								"access_list_id": 0,
 | 
													"access_list_id": 0,
 | 
				
			||||||
								"certificate_id": 0,
 | 
													"certificate_id": 0,
 | 
				
			||||||
								"ssl_forced": false,
 | 
													"ssl_forced": false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,9 @@
 | 
				
			|||||||
						"forward_port": {
 | 
											"forward_port": {
 | 
				
			||||||
							"$ref": "../../../../components/proxy-host-object.json#/properties/forward_port"
 | 
												"$ref": "../../../../components/proxy-host-object.json#/properties/forward_port"
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
 | 
											"client_max_body_size": {
 | 
				
			||||||
 | 
												"$ref": "../../../../components/proxy-host-object.json#/properties/client_max_body_size"
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
						"certificate_id": {
 | 
											"certificate_id": {
 | 
				
			||||||
							"$ref": "../../../../components/proxy-host-object.json#/properties/certificate_id"
 | 
												"$ref": "../../../../components/proxy-host-object.json#/properties/certificate_id"
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
@@ -100,6 +103,7 @@
 | 
				
			|||||||
								"domain_names": ["test.example.com"],
 | 
													"domain_names": ["test.example.com"],
 | 
				
			||||||
								"forward_host": "192.168.0.10",
 | 
													"forward_host": "192.168.0.10",
 | 
				
			||||||
								"forward_port": 8989,
 | 
													"forward_port": 8989,
 | 
				
			||||||
 | 
													"client_max_body_size": 1,
 | 
				
			||||||
								"access_list_id": 0,
 | 
													"access_list_id": 0,
 | 
				
			||||||
								"certificate_id": 0,
 | 
													"certificate_id": 0,
 | 
				
			||||||
								"ssl_forced": false,
 | 
													"ssl_forced": false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,9 @@
 | 
				
			|||||||
						"forward_port": {
 | 
											"forward_port": {
 | 
				
			||||||
							"$ref": "../../../components/proxy-host-object.json#/properties/forward_port"
 | 
												"$ref": "../../../components/proxy-host-object.json#/properties/forward_port"
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
 | 
											"client_max_body_size": {
 | 
				
			||||||
 | 
												"$ref": "../../../components/proxy-host-object.json#/properties/client_max_body_size"
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
						"certificate_id": {
 | 
											"certificate_id": {
 | 
				
			||||||
							"$ref": "../../../components/proxy-host-object.json#/properties/certificate_id"
 | 
												"$ref": "../../../components/proxy-host-object.json#/properties/certificate_id"
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
@@ -88,6 +91,7 @@
 | 
				
			|||||||
								"domain_names": ["test.example.com"],
 | 
													"domain_names": ["test.example.com"],
 | 
				
			||||||
								"forward_host": "127.0.0.1",
 | 
													"forward_host": "127.0.0.1",
 | 
				
			||||||
								"forward_port": 8989,
 | 
													"forward_port": 8989,
 | 
				
			||||||
 | 
													"client_max_body_size": 1,
 | 
				
			||||||
								"access_list_id": 0,
 | 
													"access_list_id": 0,
 | 
				
			||||||
								"certificate_id": 0,
 | 
													"certificate_id": 0,
 | 
				
			||||||
								"ssl_forced": false,
 | 
													"ssl_forced": false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,18 +15,18 @@ const certbot             = require('./lib/certbot');
 | 
				
			|||||||
const setupDefaultUser = () => {
 | 
					const setupDefaultUser = () => {
 | 
				
			||||||
	return userModel
 | 
						return userModel
 | 
				
			||||||
		.query()
 | 
							.query()
 | 
				
			||||||
		.select('id', )
 | 
							.select(userModel.raw('COUNT(`id`) as `count`'))
 | 
				
			||||||
		.where('is_deleted', 0)
 | 
							.where('is_deleted', 0)
 | 
				
			||||||
		.first()
 | 
							.first()
 | 
				
			||||||
		.then((row) => {
 | 
							.then((row) => {
 | 
				
			||||||
			if (!row || !row.id) {
 | 
								if (!row.count) {
 | 
				
			||||||
				// Create a new user and set password
 | 
									// Create a new user and set password
 | 
				
			||||||
				const email    = process.env.INITIAL_ADMIN_EMAIL || 'admin@example.com';
 | 
									let email    = process.env.INITIAL_ADMIN_EMAIL || 'admin@example.com';
 | 
				
			||||||
				const password = process.env.INITIAL_ADMIN_PASSWORD || 'changeme';
 | 
									let password = process.env.INITIAL_ADMIN_PASSWORD || 'changeme';
 | 
				
			||||||
 | 
									
 | 
				
			||||||
				logger.info('Creating a new user: ' + email + ' with password: ' + password);
 | 
									logger.info('Creating a new user: ' + email + ' with password: ' + password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				const data = {
 | 
									let data = {
 | 
				
			||||||
					is_deleted: 0,
 | 
										is_deleted: 0,
 | 
				
			||||||
					email:      email,
 | 
										email:      email,
 | 
				
			||||||
					name:       'Administrator',
 | 
										name:       'Administrator',
 | 
				
			||||||
@@ -77,11 +77,11 @@ const setupDefaultUser = () => {
 | 
				
			|||||||
const setupDefaultSettings = () => {
 | 
					const setupDefaultSettings = () => {
 | 
				
			||||||
	return settingModel
 | 
						return settingModel
 | 
				
			||||||
		.query()
 | 
							.query()
 | 
				
			||||||
		.select('id')
 | 
							.select(settingModel.raw('COUNT(`id`) as `count`'))
 | 
				
			||||||
		.where({id: 'default-site'})
 | 
							.where({id: 'default-site'})
 | 
				
			||||||
		.first()
 | 
							.first()
 | 
				
			||||||
		.then((row) => {
 | 
							.then((row) => {
 | 
				
			||||||
			if (!row || !row.id) {
 | 
								if (!row.count) {
 | 
				
			||||||
				settingModel
 | 
									settingModel
 | 
				
			||||||
					.query()
 | 
										.query()
 | 
				
			||||||
					.insert({
 | 
										.insert({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,5 @@ server {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Custom
 | 
					 | 
				
			||||||
  include /data/nginx/custom/server_dead[.]conf;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,8 @@ proxy_http_version 1.1;
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  client_max_body_size {{ client_max_body_size }}m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Custom
 | 
					  # Custom
 | 
				
			||||||
  include /data/nginx/custom/server_proxy[.]conf;
 | 
					  include /data/nginx/custom/server_proxy[.]conf;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2735,67 +2735,11 @@ path@^0.12.7:
 | 
				
			|||||||
    process "^0.11.1"
 | 
					    process "^0.11.1"
 | 
				
			||||||
    util "^0.10.3"
 | 
					    util "^0.10.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pg-cloudflare@^1.1.1:
 | 
					 | 
				
			||||||
  version "1.1.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98"
 | 
					 | 
				
			||||||
  integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg-connection-string@2.5.0:
 | 
					pg-connection-string@2.5.0:
 | 
				
			||||||
  version "2.5.0"
 | 
					  version "2.5.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
 | 
					  resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
 | 
				
			||||||
  integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
 | 
					  integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pg-connection-string@^2.7.0:
 | 
					 | 
				
			||||||
  version "2.7.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37"
 | 
					 | 
				
			||||||
  integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg-int8@1.0.1:
 | 
					 | 
				
			||||||
  version "1.0.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
 | 
					 | 
				
			||||||
  integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg-pool@^3.7.0:
 | 
					 | 
				
			||||||
  version "3.7.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec"
 | 
					 | 
				
			||||||
  integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg-protocol@^1.7.0:
 | 
					 | 
				
			||||||
  version "1.7.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93"
 | 
					 | 
				
			||||||
  integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg-types@^2.1.0:
 | 
					 | 
				
			||||||
  version "2.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
 | 
					 | 
				
			||||||
  integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    pg-int8 "1.0.1"
 | 
					 | 
				
			||||||
    postgres-array "~2.0.0"
 | 
					 | 
				
			||||||
    postgres-bytea "~1.0.0"
 | 
					 | 
				
			||||||
    postgres-date "~1.0.4"
 | 
					 | 
				
			||||||
    postgres-interval "^1.1.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pg@^8.13.1:
 | 
					 | 
				
			||||||
  version "8.13.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.1.tgz#6498d8b0a87ff76c2df7a32160309d3168c0c080"
 | 
					 | 
				
			||||||
  integrity sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    pg-connection-string "^2.7.0"
 | 
					 | 
				
			||||||
    pg-pool "^3.7.0"
 | 
					 | 
				
			||||||
    pg-protocol "^1.7.0"
 | 
					 | 
				
			||||||
    pg-types "^2.1.0"
 | 
					 | 
				
			||||||
    pgpass "1.x"
 | 
					 | 
				
			||||||
  optionalDependencies:
 | 
					 | 
				
			||||||
    pg-cloudflare "^1.1.1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pgpass@1.x:
 | 
					 | 
				
			||||||
  version "1.0.5"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
 | 
					 | 
				
			||||||
  integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    split2 "^4.1.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
picomatch@^2.0.4, picomatch@^2.2.1:
 | 
					picomatch@^2.0.4, picomatch@^2.2.1:
 | 
				
			||||||
  version "2.2.2"
 | 
					  version "2.2.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
 | 
					  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
 | 
				
			||||||
@@ -2814,28 +2758,6 @@ pkg-conf@^2.1.0:
 | 
				
			|||||||
    find-up "^2.0.0"
 | 
					    find-up "^2.0.0"
 | 
				
			||||||
    load-json-file "^4.0.0"
 | 
					    load-json-file "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
postgres-array@~2.0.0:
 | 
					 | 
				
			||||||
  version "2.0.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
 | 
					 | 
				
			||||||
  integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
postgres-bytea@~1.0.0:
 | 
					 | 
				
			||||||
  version "1.0.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
 | 
					 | 
				
			||||||
  integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
postgres-date@~1.0.4:
 | 
					 | 
				
			||||||
  version "1.0.7"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
 | 
					 | 
				
			||||||
  integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
postgres-interval@^1.1.0:
 | 
					 | 
				
			||||||
  version "1.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
 | 
					 | 
				
			||||||
  integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    xtend "^4.0.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prelude-ls@^1.2.1:
 | 
					prelude-ls@^1.2.1:
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
 | 
					  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
 | 
				
			||||||
@@ -3272,11 +3194,6 @@ socks@^2.6.2:
 | 
				
			|||||||
    ip "^2.0.0"
 | 
					    ip "^2.0.0"
 | 
				
			||||||
    smart-buffer "^4.2.0"
 | 
					    smart-buffer "^4.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
split2@^4.1.0:
 | 
					 | 
				
			||||||
  version "4.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
 | 
					 | 
				
			||||||
  integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sprintf-js@~1.0.2:
 | 
					sprintf-js@~1.0.2:
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 | 
					  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 | 
				
			||||||
@@ -3748,11 +3665,6 @@ xdg-basedir@^4.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
 | 
					  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
 | 
				
			||||||
  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 | 
					  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xtend@^4.0.0:
 | 
					 | 
				
			||||||
  version "4.0.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
 | 
					 | 
				
			||||||
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
y18n@^4.0.0:
 | 
					y18n@^4.0.0:
 | 
				
			||||||
  version "4.0.1"
 | 
					  version "4.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"
 | 
					  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
AUTHENTIK_SECRET_KEY=gl8woZe8L6IIX8SC0c5Ocsj0xPkX5uJo5DVZCFl+L/QGbzuplfutYuua2ODNLEiDD3aFd9H2ylJmrke0
 | 
					 | 
				
			||||||
AUTHENTIK_REDIS__HOST=authentik-redis
 | 
					 | 
				
			||||||
AUTHENTIK_POSTGRESQL__HOST=db-postgres
 | 
					 | 
				
			||||||
AUTHENTIK_POSTGRESQL__USER=authentik
 | 
					 | 
				
			||||||
AUTHENTIK_POSTGRESQL__NAME=authentik
 | 
					 | 
				
			||||||
AUTHENTIK_POSTGRESQL__PASSWORD=07EKS5NLI6Tpv68tbdvrxfvj
 | 
					 | 
				
			||||||
AUTHENTIK_BOOTSTRAP_PASSWORD=admin
 | 
					 | 
				
			||||||
AUTHENTIK_BOOTSTRAP_EMAIL=admin@example.com
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							@@ -29,8 +29,7 @@ COPY scripts/install-s6 /tmp/install-s6
 | 
				
			|||||||
RUN rm -f /etc/nginx/conf.d/production.conf \
 | 
					RUN rm -f /etc/nginx/conf.d/production.conf \
 | 
				
			||||||
	&& chmod 644 /etc/logrotate.d/nginx-proxy-manager \
 | 
						&& chmod 644 /etc/logrotate.d/nginx-proxy-manager \
 | 
				
			||||||
	&& /tmp/install-s6 "${TARGETPLATFORM}" \
 | 
						&& /tmp/install-s6 "${TARGETPLATFORM}" \
 | 
				
			||||||
	&& rm -f /tmp/install-s6 \
 | 
						&& rm -f /tmp/install-s6
 | 
				
			||||||
	&& chmod 644 -R /root/.cache
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Certs for testing purposes
 | 
					# Certs for testing purposes
 | 
				
			||||||
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
 | 
					COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,78 +0,0 @@
 | 
				
			|||||||
# 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:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  cypress:
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      CYPRESS_stack: 'postgres'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  fullstack:
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      DB_POSTGRES_HOST: 'db-postgres'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PORT: '5432'
 | 
					 | 
				
			||||||
      DB_POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      DB_POSTGRES_NAME: 'npm'
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
      - authentik
 | 
					 | 
				
			||||||
      - authentik-worker
 | 
					 | 
				
			||||||
      - authentik-ldap
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  db-postgres:
 | 
					 | 
				
			||||||
    image: postgres:latest
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      POSTGRES_DB: 'npm'
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - psql_vol:/var/lib/postgresql/data
 | 
					 | 
				
			||||||
      - ./ci/postgres:/docker-entrypoint-initdb.d
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - fulltest
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-redis:
 | 
					 | 
				
			||||||
    image: 'redis:alpine'
 | 
					 | 
				
			||||||
    command: --save 60 1 --loglevel warning
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    healthcheck:
 | 
					 | 
				
			||||||
      test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
 | 
					 | 
				
			||||||
      start_period: 20s
 | 
					 | 
				
			||||||
      interval: 30s
 | 
					 | 
				
			||||||
      retries: 5
 | 
					 | 
				
			||||||
      timeout: 3s
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - redis_vol:/data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/server:2024.10.1
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    command: server
 | 
					 | 
				
			||||||
    env_file:
 | 
					 | 
				
			||||||
      - ci.env
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik-redis
 | 
					 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-worker:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/server:2024.10.1
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    command: worker
 | 
					 | 
				
			||||||
    env_file:
 | 
					 | 
				
			||||||
      - ci.env
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik-redis
 | 
					 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-ldap:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/ldap:2024.10.1
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      AUTHENTIK_HOST: 'http://authentik:9000'
 | 
					 | 
				
			||||||
      AUTHENTIK_INSECURE: 'true'
 | 
					 | 
				
			||||||
      AUTHENTIK_TOKEN: 'wKYZuRcI0ETtb8vWzMCr04oNbhrQUUICy89hSpDln1OEKLjiNEuQ51044Vkp'
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
volumes:
 | 
					 | 
				
			||||||
  psql_vol:
 | 
					 | 
				
			||||||
  redis_vol:
 | 
					 | 
				
			||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
services:
 | 
					services:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fullstack:
 | 
					  fullstack:
 | 
				
			||||||
    image: npm2dev:core
 | 
					    image: nginxproxymanager:dev
 | 
				
			||||||
    container_name: npm2dev.core
 | 
					    container_name: npm_core
 | 
				
			||||||
    build:
 | 
					    build:
 | 
				
			||||||
      context: ./
 | 
					      context: ./
 | 
				
			||||||
      dockerfile: ./dev/Dockerfile
 | 
					      dockerfile: ./dev/Dockerfile
 | 
				
			||||||
@@ -26,17 +26,11 @@ services:
 | 
				
			|||||||
      DEVELOPMENT: 'true'
 | 
					      DEVELOPMENT: 'true'
 | 
				
			||||||
      LE_STAGING: 'true'
 | 
					      LE_STAGING: 'true'
 | 
				
			||||||
      # db:
 | 
					      # db:
 | 
				
			||||||
      # DB_MYSQL_HOST: 'db'
 | 
					      DB_MYSQL_HOST: 'db'
 | 
				
			||||||
      # DB_MYSQL_PORT: '3306'
 | 
					      DB_MYSQL_PORT: '3306'
 | 
				
			||||||
      # DB_MYSQL_USER: 'npm'
 | 
					      DB_MYSQL_USER: 'npm'
 | 
				
			||||||
      # DB_MYSQL_PASSWORD: 'npm'
 | 
					      DB_MYSQL_PASSWORD: 'npm'
 | 
				
			||||||
      # DB_MYSQL_NAME: 'npm'
 | 
					      DB_MYSQL_NAME: 'npm'
 | 
				
			||||||
      # db-postgres:
 | 
					 | 
				
			||||||
      DB_POSTGRES_HOST: 'db-postgres'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PORT: '5432'
 | 
					 | 
				
			||||||
      DB_POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      DB_POSTGRES_NAME: 'npm'
 | 
					 | 
				
			||||||
      # DB_SQLITE_FILE: "/data/database.sqlite"
 | 
					      # DB_SQLITE_FILE: "/data/database.sqlite"
 | 
				
			||||||
      # DISABLE_IPV6: "true"
 | 
					      # DISABLE_IPV6: "true"
 | 
				
			||||||
      # Required for DNS Certificate provisioning testing:
 | 
					      # Required for DNS Certificate provisioning testing:
 | 
				
			||||||
@@ -55,15 +49,11 @@ services:
 | 
				
			|||||||
      timeout: 3s
 | 
					      timeout: 3s
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      - db
 | 
					      - db
 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
      - authentik
 | 
					 | 
				
			||||||
      - authentik-worker
 | 
					 | 
				
			||||||
      - authentik-ldap
 | 
					 | 
				
			||||||
    working_dir: /app
 | 
					    working_dir: /app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  db:
 | 
					  db:
 | 
				
			||||||
    image: jc21/mariadb-aria
 | 
					    image: jc21/mariadb-aria
 | 
				
			||||||
    container_name: npm2dev.db
 | 
					    container_name: npm_db
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 33306:3306
 | 
					      - 33306:3306
 | 
				
			||||||
    networks:
 | 
					    networks:
 | 
				
			||||||
@@ -76,22 +66,8 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - db_data:/var/lib/mysql
 | 
					      - db_data:/var/lib/mysql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  db-postgres:
 | 
					 | 
				
			||||||
    image: postgres:latest
 | 
					 | 
				
			||||||
    container_name: npm2dev.db-postgres
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - nginx_proxy_manager
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      POSTGRES_DB: 'npm'
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - psql_data:/var/lib/postgresql/data
 | 
					 | 
				
			||||||
      - ./ci/postgres:/docker-entrypoint-initdb.d
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  stepca:
 | 
					  stepca:
 | 
				
			||||||
    image: jc21/testca
 | 
					    image: jc21/testca
 | 
				
			||||||
    container_name: npm2dev.stepca
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
					      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
				
			||||||
      - '/etc/localtime:/etc/localtime:ro'
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
@@ -102,7 +78,6 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  dnsrouter:
 | 
					  dnsrouter:
 | 
				
			||||||
    image: jc21/dnsrouter
 | 
					    image: jc21/dnsrouter
 | 
				
			||||||
    container_name: npm2dev.dnsrouter
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - ./dev/dnsrouter-config.json.tmp:/dnsrouter-config.json:ro
 | 
					      - ./dev/dnsrouter-config.json.tmp:/dnsrouter-config.json:ro
 | 
				
			||||||
    networks:
 | 
					    networks:
 | 
				
			||||||
@@ -110,7 +85,7 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  swagger:
 | 
					  swagger:
 | 
				
			||||||
    image: swaggerapi/swagger-ui:latest
 | 
					    image: swaggerapi/swagger-ui:latest
 | 
				
			||||||
    container_name: npm2dev.swagger
 | 
					    container_name: npm_swagger
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 3082:80
 | 
					      - 3082:80
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
@@ -121,7 +96,7 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  squid:
 | 
					  squid:
 | 
				
			||||||
    image: ubuntu/squid
 | 
					    image: ubuntu/squid
 | 
				
			||||||
    container_name: npm2dev.squid
 | 
					    container_name: npm_squid
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - './dev/squid.conf:/etc/squid/squid.conf:ro'
 | 
					      - './dev/squid.conf:/etc/squid/squid.conf:ro'
 | 
				
			||||||
      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
					      - './dev/resolv.conf:/etc/resolv.conf:ro'
 | 
				
			||||||
@@ -133,7 +108,6 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  pdns:
 | 
					  pdns:
 | 
				
			||||||
    image: pschiffe/pdns-mysql
 | 
					    image: pschiffe/pdns-mysql
 | 
				
			||||||
    container_name: npm2dev.pdns
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - '/etc/localtime:/etc/localtime:ro'
 | 
					      - '/etc/localtime:/etc/localtime:ro'
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
@@ -162,7 +136,6 @@ services:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  pdns-db:
 | 
					  pdns-db:
 | 
				
			||||||
    image: mariadb
 | 
					    image: mariadb
 | 
				
			||||||
    container_name: npm2dev.pdns-db
 | 
					 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      MYSQL_ROOT_PASSWORD: 'pdns'
 | 
					      MYSQL_ROOT_PASSWORD: 'pdns'
 | 
				
			||||||
      MYSQL_DATABASE: 'pdns'
 | 
					      MYSQL_DATABASE: 'pdns'
 | 
				
			||||||
@@ -176,8 +149,7 @@ services:
 | 
				
			|||||||
      - nginx_proxy_manager
 | 
					      - nginx_proxy_manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cypress:
 | 
					  cypress:
 | 
				
			||||||
    image: npm2dev:cypress
 | 
					    image: "npm_dev_cypress"
 | 
				
			||||||
    container_name: npm2dev.cypress
 | 
					 | 
				
			||||||
    build:
 | 
					    build:
 | 
				
			||||||
      context: ../
 | 
					      context: ../
 | 
				
			||||||
      dockerfile: test/cypress/Dockerfile
 | 
					      dockerfile: test/cypress/Dockerfile
 | 
				
			||||||
@@ -192,77 +164,16 @@ services:
 | 
				
			|||||||
    networks:
 | 
					    networks:
 | 
				
			||||||
      - nginx_proxy_manager
 | 
					      - nginx_proxy_manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  authentik-redis:
 | 
					 | 
				
			||||||
    image: 'redis:alpine'
 | 
					 | 
				
			||||||
    container_name: npm2dev.authentik-redis
 | 
					 | 
				
			||||||
    command: --save 60 1 --loglevel warning
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - nginx_proxy_manager
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    healthcheck:
 | 
					 | 
				
			||||||
      test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
 | 
					 | 
				
			||||||
      start_period: 20s
 | 
					 | 
				
			||||||
      interval: 30s
 | 
					 | 
				
			||||||
      retries: 5
 | 
					 | 
				
			||||||
      timeout: 3s
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - redis_data:/data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/server:2024.10.1
 | 
					 | 
				
			||||||
    container_name: npm2dev.authentik
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    command: server
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - nginx_proxy_manager
 | 
					 | 
				
			||||||
    env_file:
 | 
					 | 
				
			||||||
      - ci.env
 | 
					 | 
				
			||||||
    ports:
 | 
					 | 
				
			||||||
      - 9000:9000 
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik-redis
 | 
					 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-worker:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/server:2024.10.1
 | 
					 | 
				
			||||||
    container_name: npm2dev.authentik-worker
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    command: worker
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - nginx_proxy_manager
 | 
					 | 
				
			||||||
    env_file:
 | 
					 | 
				
			||||||
      - ci.env
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik-redis
 | 
					 | 
				
			||||||
      - db-postgres
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-ldap:
 | 
					 | 
				
			||||||
    image: ghcr.io/goauthentik/ldap:2024.10.1
 | 
					 | 
				
			||||||
    container_name: npm2dev.authentik-ldap
 | 
					 | 
				
			||||||
    networks:
 | 
					 | 
				
			||||||
      - nginx_proxy_manager
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      AUTHENTIK_HOST: 'http://authentik:9000'
 | 
					 | 
				
			||||||
      AUTHENTIK_INSECURE: 'true'
 | 
					 | 
				
			||||||
      AUTHENTIK_TOKEN: 'wKYZuRcI0ETtb8vWzMCr04oNbhrQUUICy89hSpDln1OEKLjiNEuQ51044Vkp'
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - authentik
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
volumes:
 | 
					volumes:
 | 
				
			||||||
  npm_data:
 | 
					  npm_data:
 | 
				
			||||||
    name: npm2dev_core_data
 | 
					    name: npm_core_data
 | 
				
			||||||
  le_data:
 | 
					  le_data:
 | 
				
			||||||
    name: npm2dev_le_data
 | 
					    name: npm_le_data
 | 
				
			||||||
  db_data:
 | 
					  db_data:
 | 
				
			||||||
    name: npm2dev_db_data
 | 
					    name: npm_db_data
 | 
				
			||||||
  pdns_mysql:
 | 
					  pdns_mysql:
 | 
				
			||||||
    name: npnpm2dev_pdns_mysql
 | 
					    name: npm_pdns_mysql
 | 
				
			||||||
  psql_data:
 | 
					 | 
				
			||||||
    name: npm2dev_psql_data
 | 
					 | 
				
			||||||
  redis_data:
 | 
					 | 
				
			||||||
    name: npm2dev_redis_data
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
networks:
 | 
					networks:
 | 
				
			||||||
  nginx_proxy_manager:
 | 
					  nginx_proxy_manager:
 | 
				
			||||||
    name: npm2dev_network
 | 
					    name: npm_network
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -181,7 +181,6 @@ You can add your custom configuration snippet files at `/data/nginx/custom` as f
 | 
				
			|||||||
 - `/data/nginx/custom/server_stream.conf`: Included at the end of every stream server block
 | 
					 - `/data/nginx/custom/server_stream.conf`: Included at the end of every stream server block
 | 
				
			||||||
 - `/data/nginx/custom/server_stream_tcp.conf`: Included at the end of every TCP stream server block
 | 
					 - `/data/nginx/custom/server_stream_tcp.conf`: Included at the end of every TCP stream server block
 | 
				
			||||||
 - `/data/nginx/custom/server_stream_udp.conf`: Included at the end of every UDP stream server block
 | 
					 - `/data/nginx/custom/server_stream_udp.conf`: Included at the end of every UDP stream server block
 | 
				
			||||||
 - `/data/nginx/custom/server_dead.conf`: Included at the end of every 404 server block
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Every file is optional.
 | 
					Every file is optional.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,8 @@ services:
 | 
				
			|||||||
      # Add any other Stream port you want to expose
 | 
					      # Add any other Stream port you want to expose
 | 
				
			||||||
      # - '21:21' # FTP
 | 
					      # - '21:21' # FTP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    environment:
 | 
					    # Uncomment the next line if you uncomment anything in the section
 | 
				
			||||||
 | 
					    # environment:
 | 
				
			||||||
      # Uncomment this if you want to change the location of
 | 
					      # Uncomment this if you want to change the location of
 | 
				
			||||||
      # the SQLite DB file within the container
 | 
					      # the SQLite DB file within the container
 | 
				
			||||||
      # DB_SQLITE_FILE: "/data/database.sqlite"
 | 
					      # DB_SQLITE_FILE: "/data/database.sqlite"
 | 
				
			||||||
@@ -98,53 +99,6 @@ Please note, that `DB_MYSQL_*` environment variables will take precedent over `D
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
:::
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Using Postgres database
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Similar to the MySQL server setup:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```yml
 | 
					 | 
				
			||||||
services:
 | 
					 | 
				
			||||||
  app:
 | 
					 | 
				
			||||||
    image: 'jc21/nginx-proxy-manager:latest'
 | 
					 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    ports:
 | 
					 | 
				
			||||||
      # These ports are in format <host-port>:<container-port>
 | 
					 | 
				
			||||||
      - '80:80' # Public HTTP Port
 | 
					 | 
				
			||||||
      - '443:443' # Public HTTPS Port
 | 
					 | 
				
			||||||
      - '81:81' # Admin Web Port
 | 
					 | 
				
			||||||
      # Add any other Stream port you want to expose
 | 
					 | 
				
			||||||
      # - '21:21' # FTP
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      # Postgres parameters:
 | 
					 | 
				
			||||||
      DB_POSTGRES_HOST: 'db'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PORT: '5432'
 | 
					 | 
				
			||||||
      DB_POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      DB_POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      DB_POSTGRES_NAME: 'npm'
 | 
					 | 
				
			||||||
      # Uncomment this if IPv6 is not enabled on your host
 | 
					 | 
				
			||||||
      # DISABLE_IPV6: 'true'
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - ./data:/data
 | 
					 | 
				
			||||||
      - ./letsencrypt:/etc/letsencrypt
 | 
					 | 
				
			||||||
    depends_on:
 | 
					 | 
				
			||||||
      - db
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  db:
 | 
					 | 
				
			||||||
    image: postgres:latest
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      POSTGRES_USER: 'npm'
 | 
					 | 
				
			||||||
      POSTGRES_PASSWORD: 'npmpass'
 | 
					 | 
				
			||||||
      POSTGRES_DB: 'npm'
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - ./postgres:/var/lib/postgresql/data
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
::: warning
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Custom Postgres schema is not supported, as such `public` will be used.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Running on Raspberry PI / ARM devices
 | 
					## Running on Raspberry PI / ARM devices
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The docker images support the following architectures:
 | 
					The docker images support the following architectures:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								docs/src/third-party/index.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								docs/src/third-party/index.md
									
									
									
									
										vendored
									
									
								
							@@ -12,7 +12,6 @@ Known integrations:
 | 
				
			|||||||
- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
 | 
					- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager)
 | 
				
			||||||
- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)
 | 
					- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager)
 | 
				
			||||||
- [Proxmox Scripts](https://github.com/ej52/proxmox-scripts/tree/main/apps/nginx-proxy-manager)
 | 
					- [Proxmox Scripts](https://github.com/ej52/proxmox-scripts/tree/main/apps/nginx-proxy-manager)
 | 
				
			||||||
- [Proxmox VE Helper-Scripts](https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanager)
 | 
					 | 
				
			||||||
- [nginxproxymanagerGraf](https://github.com/ma-karai/nginxproxymanagerGraf)
 | 
					- [nginxproxymanagerGraf](https://github.com/ma-karai/nginxproxymanagerGraf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -873,9 +873,9 @@ mitt@^3.0.1:
 | 
				
			|||||||
  integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
 | 
					  integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nanoid@^3.3.7:
 | 
					nanoid@^3.3.7:
 | 
				
			||||||
  version "3.3.8"
 | 
					  version "3.3.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
 | 
					  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
 | 
				
			||||||
  integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
 | 
					  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
oniguruma-to-js@0.4.3:
 | 
					oniguruma-to-js@0.4.3:
 | 
				
			||||||
  version "0.4.3"
 | 
					  version "0.4.3"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,8 +50,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
    onRender: function () {
 | 
					    onRender: function () {
 | 
				
			||||||
        let view = this;
 | 
					        let view = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (typeof view.stats.hosts === 'undefined') {
 | 
					        Api.Reports.getHostStats()
 | 
				
			||||||
            Api.Reports.getHostStats()
 | 
					 | 
				
			||||||
                .then(response => {
 | 
					                .then(response => {
 | 
				
			||||||
                    if (!view.isDestroyed()) {
 | 
					                    if (!view.isDestroyed()) {
 | 
				
			||||||
                        view.stats.hosts = response;
 | 
					                        view.stats.hosts = response;
 | 
				
			||||||
@@ -61,7 +60,6 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
                .catch(err => {
 | 
					                .catch(err => {
 | 
				
			||||||
                    console.log(err);
 | 
					                    console.log(err);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,12 @@
 | 
				
			|||||||
                                </label>
 | 
					                                </label>
 | 
				
			||||||
                            </div>
 | 
					                            </div>
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
 | 
					                        <div class="col-sm-12 col-md-12">
 | 
				
			||||||
 | 
					                            <div class="form-group">
 | 
				
			||||||
 | 
					                                <label class="form-label"><%- i18n('proxy-hosts', 'client-max-body-size' ) %></label>
 | 
				
			||||||
 | 
					                                <input name="client_max_body_size" type="number" class="form-control text-monospace" placeholder="1" value="<%- client_max_body_size %>" required>
 | 
				
			||||||
 | 
					                            </div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
                        <div class="col-sm-12 col-md-12">
 | 
					                        <div class="col-sm-12 col-md-12">
 | 
				
			||||||
                            <div class="form-group">
 | 
					                            <div class="form-group">
 | 
				
			||||||
                                <label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label>
 | 
					                                <label class="form-label"><%- i18n('proxy-hosts', 'access-list') %></label>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,6 +160,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // Manipulate
 | 
					            // Manipulate
 | 
				
			||||||
            data.forward_port            = parseInt(data.forward_port, 10);
 | 
					            data.forward_port            = parseInt(data.forward_port, 10);
 | 
				
			||||||
 | 
					            data.client_max_body_size    = parseInt(data.client_max_body_size, 10);
 | 
				
			||||||
            data.block_exploits          = !!data.block_exploits;
 | 
					            data.block_exploits          = !!data.block_exploits;
 | 
				
			||||||
            data.caching_enabled         = !!data.caching_enabled;
 | 
					            data.caching_enabled         = !!data.caching_enabled;
 | 
				
			||||||
            data.allow_websocket_upgrade = !!data.allow_websocket_upgrade;
 | 
					            data.allow_websocket_upgrade = !!data.allow_websocket_upgrade;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,6 +125,7 @@
 | 
				
			|||||||
      "forward-scheme": "Scheme",
 | 
					      "forward-scheme": "Scheme",
 | 
				
			||||||
      "forward-host": "Forward Hostname / IP",
 | 
					      "forward-host": "Forward Hostname / IP",
 | 
				
			||||||
      "forward-port": "Forward Port",
 | 
					      "forward-port": "Forward Port",
 | 
				
			||||||
 | 
					      "client-max-body-size": "Max proxied upload size (Mb)",
 | 
				
			||||||
      "delete": "Delete Proxy Host",
 | 
					      "delete": "Delete Proxy Host",
 | 
				
			||||||
      "delete-confirm": "Are you sure you want to delete the Proxy host for: <strong>{domains}</strong>?",
 | 
					      "delete-confirm": "Are you sure you want to delete the Proxy host for: <strong>{domains}</strong>?",
 | 
				
			||||||
      "help-title": "What is a Proxy Host?",
 | 
					      "help-title": "What is a Proxy Host?",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ const model = Backbone.Model.extend({
 | 
				
			|||||||
            forward_scheme:          'http',
 | 
					            forward_scheme:          'http',
 | 
				
			||||||
            forward_host:            '',
 | 
					            forward_host:            '',
 | 
				
			||||||
            forward_port:            null,
 | 
					            forward_port:            null,
 | 
				
			||||||
 | 
					            client_max_body_size:    1,
 | 
				
			||||||
            access_list_id:          0,
 | 
					            access_list_id:          0,
 | 
				
			||||||
            certificate_id:          0,
 | 
					            certificate_id:          0,
 | 
				
			||||||
            ssl_forced:              false,
 | 
					            ssl_forced:              false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
		"credentials": "dns_acmedns_api_url = http://acmedns-server/\ndns_acmedns_registration_file = /data/acme-registration.json",
 | 
							"credentials": "dns_acmedns_api_url = http://acmedns-server/\ndns_acmedns_registration_file = /data/acme-registration.json",
 | 
				
			||||||
		"full_plugin_name": "dns-acmedns"
 | 
							"full_plugin_name": "dns-acmedns"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"active24": {
 | 
						"active24":{
 | 
				
			||||||
		"name": "Active24",
 | 
							"name": "Active24",
 | 
				
			||||||
		"package_name": "certbot-dns-active24",
 | 
							"package_name": "certbot-dns-active24",
 | 
				
			||||||
		"version": "~=1.5.1",
 | 
							"version": "~=1.5.1",
 | 
				
			||||||
@@ -18,7 +18,7 @@
 | 
				
			|||||||
	"aliyun": {
 | 
						"aliyun": {
 | 
				
			||||||
		"name": "Aliyun",
 | 
							"name": "Aliyun",
 | 
				
			||||||
		"package_name": "certbot-dns-aliyun",
 | 
							"package_name": "certbot-dns-aliyun",
 | 
				
			||||||
		"version": "~=2.0.0",
 | 
							"version": "~=0.38.1",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_aliyun_access_key = 12345678\ndns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef",
 | 
							"credentials": "dns_aliyun_access_key = 12345678\ndns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef",
 | 
				
			||||||
		"full_plugin_name": "dns-aliyun"
 | 
							"full_plugin_name": "dns-aliyun"
 | 
				
			||||||
@@ -31,14 +31,6 @@
 | 
				
			|||||||
		"credentials": "# This plugin supported API authentication using either Service Principals or utilizing a Managed Identity assigned to the virtual machine.\n# Regardless which authentication method used, the identity will need the “DNS Zone Contributor” role assigned to it.\n# As multiple Azure DNS Zones in multiple resource groups can exist, the config file needs a mapping of zone to resource group ID. Multiple zones -> ID mappings can be listed by using the key dns_azure_zoneX where X is a unique number. At least 1 zone mapping is required.\n\n# Using a service principal (option 1)\ndns_azure_sp_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\ndns_azure_sp_client_secret = E-xqXU83Y-jzTI6xe9fs2YC~mck3ZzUih9\ndns_azure_tenant_id = ed1090f3-ab18-4b12-816c-599af8a88cf7\n\n# Using used assigned MSI (option 2)\n# dns_azure_msi_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\n\n# Using system assigned MSI (option 3)\n# dns_azure_msi_system_assigned = true\n\n# Zones (at least one always required)\ndns_azure_zone1 = example.com:/subscriptions/c135abce-d87d-48df-936c-15596c6968a5/resourceGroups/dns1\ndns_azure_zone2 = example.org:/subscriptions/99800903-fb14-4992-9aff-12eaf2744622/resourceGroups/dns2",
 | 
							"credentials": "# This plugin supported API authentication using either Service Principals or utilizing a Managed Identity assigned to the virtual machine.\n# Regardless which authentication method used, the identity will need the “DNS Zone Contributor” role assigned to it.\n# As multiple Azure DNS Zones in multiple resource groups can exist, the config file needs a mapping of zone to resource group ID. Multiple zones -> ID mappings can be listed by using the key dns_azure_zoneX where X is a unique number. At least 1 zone mapping is required.\n\n# Using a service principal (option 1)\ndns_azure_sp_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\ndns_azure_sp_client_secret = E-xqXU83Y-jzTI6xe9fs2YC~mck3ZzUih9\ndns_azure_tenant_id = ed1090f3-ab18-4b12-816c-599af8a88cf7\n\n# Using used assigned MSI (option 2)\n# dns_azure_msi_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\n\n# Using system assigned MSI (option 3)\n# dns_azure_msi_system_assigned = true\n\n# Zones (at least one always required)\ndns_azure_zone1 = example.com:/subscriptions/c135abce-d87d-48df-936c-15596c6968a5/resourceGroups/dns1\ndns_azure_zone2 = example.org:/subscriptions/99800903-fb14-4992-9aff-12eaf2744622/resourceGroups/dns2",
 | 
				
			||||||
		"full_plugin_name": "dns-azure"
 | 
							"full_plugin_name": "dns-azure"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"beget": {
 | 
					 | 
				
			||||||
		"name":"Beget",
 | 
					 | 
				
			||||||
		"package_name": "certbot-beget-plugin",
 | 
					 | 
				
			||||||
		"version": "~=1.0.0.dev9",
 | 
					 | 
				
			||||||
		"dependencies": "",
 | 
					 | 
				
			||||||
		"credentials": "# Beget API credentials used by Certbot\nbeget_plugin_username = username\nbeget_plugin_password = password",
 | 
					 | 
				
			||||||
		"full_plugin_name": "beget-plugin"
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"bunny": {
 | 
						"bunny": {
 | 
				
			||||||
		"name": "bunny.net",
 | 
							"name": "bunny.net",
 | 
				
			||||||
		"package_name": "certbot-dns-bunny",
 | 
							"package_name": "certbot-dns-bunny",
 | 
				
			||||||
@@ -255,14 +247,6 @@
 | 
				
			|||||||
		"credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef",
 | 
							"credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef",
 | 
				
			||||||
		"full_plugin_name": "dns-hetzner"
 | 
							"full_plugin_name": "dns-hetzner"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"hostingnl": {
 | 
					 | 
				
			||||||
		"name": "Hosting.nl",
 | 
					 | 
				
			||||||
		"package_name": "certbot-dns-hostingnl",
 | 
					 | 
				
			||||||
		"version": "~=0.1.5",
 | 
					 | 
				
			||||||
		"dependencies": "",
 | 
					 | 
				
			||||||
		"credentials": "dns_hostingnl_api_key = 0123456789abcdef0123456789abcdef",
 | 
					 | 
				
			||||||
		"full_plugin_name": "dns-hostingnl"
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"hover": {
 | 
						"hover": {
 | 
				
			||||||
		"name": "Hover",
 | 
							"name": "Hover",
 | 
				
			||||||
		"package_name": "certbot-dns-hover",
 | 
							"package_name": "certbot-dns-hover",
 | 
				
			||||||
@@ -418,7 +402,7 @@
 | 
				
			|||||||
	"porkbun": {
 | 
						"porkbun": {
 | 
				
			||||||
		"name": "Porkbun",
 | 
							"name": "Porkbun",
 | 
				
			||||||
		"package_name": "certbot-dns-porkbun",
 | 
							"package_name": "certbot-dns-porkbun",
 | 
				
			||||||
		"version": "~=0.9",
 | 
							"version": "~=0.2",
 | 
				
			||||||
		"dependencies": "",
 | 
							"dependencies": "",
 | 
				
			||||||
		"credentials": "dns_porkbun_key=your-porkbun-api-key\ndns_porkbun_secret=your-porkbun-api-secret",
 | 
							"credentials": "dns_porkbun_key=your-porkbun-api-key\ndns_porkbun_secret=your-porkbun-api-secret",
 | 
				
			||||||
		"full_plugin_name": "dns-porkbun"
 | 
							"full_plugin_name": "dns-porkbun"
 | 
				
			||||||
@@ -511,7 +495,7 @@
 | 
				
			|||||||
		"credentials": "dns_websupport_identifier = <api_key>\ndns_websupport_secret_key = <secret>",
 | 
							"credentials": "dns_websupport_identifier = <api_key>\ndns_websupport_secret_key = <secret>",
 | 
				
			||||||
		"full_plugin_name": "dns-websupport"
 | 
							"full_plugin_name": "dns-websupport"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"wedos": {
 | 
						"wedos":{
 | 
				
			||||||
		"name": "Wedos",
 | 
							"name": "Wedos",
 | 
				
			||||||
		"package_name": "certbot-dns-wedos",
 | 
							"package_name": "certbot-dns-wedos",
 | 
				
			||||||
		"version": "~=2.2",
 | 
							"version": "~=2.2",
 | 
				
			||||||
@@ -527,4 +511,4 @@
 | 
				
			|||||||
		"credentials": "edgedns_client_secret = as3d1asd5d1a32sdfsdfs2d1asd5=\nedgedns_host = sdflskjdf-dfsdfsdf-sdfsdfsdf.luna.akamaiapis.net\nedgedns_access_token = kjdsi3-34rfsdfsdf-234234fsdfsdf\nedgedns_client_token = dkfjdf-342fsdfsd-23fsdfsdfsdf",
 | 
							"credentials": "edgedns_client_secret = as3d1asd5d1a32sdfsdfs2d1asd5=\nedgedns_host = sdflskjdf-dfsdfsdf-sdfsdfsdf.luna.akamaiapis.net\nedgedns_access_token = kjdsi3-34rfsdfsdf-234234fsdfsdf\nedgedns_client_token = dkfjdf-342fsdfsd-23fsdfsdfsdf",
 | 
				
			||||||
		"full_plugin_name": "edgedns"
 | 
							"full_plugin_name": "edgedns"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ YELLOW='\E[1;33m'
 | 
				
			|||||||
export BLUE CYAN GREEN RED RESET YELLOW
 | 
					export BLUE CYAN GREEN RED RESET YELLOW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Docker Compose
 | 
					# Docker Compose
 | 
				
			||||||
COMPOSE_PROJECT_NAME="npm2dev"
 | 
					COMPOSE_PROJECT_NAME="npmdev"
 | 
				
			||||||
COMPOSE_FILE="docker/docker-compose.dev.yml"
 | 
					COMPOSE_FILE="docker/docker-compose.dev.yml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export COMPOSE_FILE COMPOSE_PROJECT_NAME
 | 
					export COMPOSE_FILE COMPOSE_PROJECT_NAME
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,8 +67,6 @@ printf "nameserver %s\noptions ndots:0" "${DNSROUTER_IP}" > "${LOCAL_RESOLVE}"
 | 
				
			|||||||
# bring up all remaining containers, except cypress!
 | 
					# bring up all remaining containers, except cypress!
 | 
				
			||||||
docker-compose up -d --remove-orphans stepca squid
 | 
					docker-compose up -d --remove-orphans stepca squid
 | 
				
			||||||
docker-compose pull db-mysql || true # ok to fail
 | 
					docker-compose pull db-mysql || true # ok to fail
 | 
				
			||||||
docker-compose pull db-postgres || true # ok to fail
 | 
					 | 
				
			||||||
docker-compose pull authentik authentik-redis authentik-ldap || true # ok to fail
 | 
					 | 
				
			||||||
docker-compose up -d --remove-orphans --pull=never fullstack
 | 
					docker-compose up -d --remove-orphans --pull=never fullstack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# wait for main container to be healthy
 | 
					# wait for main container to be healthy
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,11 +36,12 @@ if hash docker-compose 2>/dev/null; then
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	# bring up all remaining containers, except cypress!
 | 
						# bring up all remaining containers, except cypress!
 | 
				
			||||||
	docker-compose up -d --remove-orphans stepca squid
 | 
						docker-compose up -d --remove-orphans stepca squid
 | 
				
			||||||
	docker-compose pull db db-postgres authentik-redis authentik authentik-worker authentik-ldap
 | 
						docker-compose pull db
 | 
				
			||||||
	docker-compose build --pull --parallel fullstack
 | 
						docker-compose up -d --remove-orphans --pull=never fullstack
 | 
				
			||||||
	docker-compose up -d --remove-orphans fullstack
 | 
					 | 
				
			||||||
	docker-compose up -d --remove-orphans swagger
 | 
						docker-compose up -d --remove-orphans swagger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# docker-compose up -d --remove-orphans --force-recreate --build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# wait for main container to be healthy
 | 
						# wait for main container to be healthy
 | 
				
			||||||
	bash "$DIR/wait-healthy" "$(docker-compose ps --all -q fullstack)" 120
 | 
						bash "$DIR/wait-healthy" "$(docker-compose ps --all -q fullstack)" 120
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,10 +53,10 @@ if hash docker-compose 2>/dev/null; then
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if [ "$1" == "-f" ]; then
 | 
						if [ "$1" == "-f" ]; then
 | 
				
			||||||
		echo -e "${BLUE}❯ ${YELLOW}Following Backend Container:${RESET}"
 | 
							echo -e "${BLUE}❯ ${YELLOW}Following Backend Container:${RESET}"
 | 
				
			||||||
		docker logs -f npm2dev.core
 | 
							docker logs -f npm_core
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		echo -e "${YELLOW}Hint:${RESET} You can follow the output of some of the containers with:"
 | 
							echo -e "${YELLOW}Hint:${RESET} You can follow the output of some of the containers with:"
 | 
				
			||||||
		echo "  docker logs -f npm2dev.core"
 | 
							echo "  docker logs -f npm_core"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
	echo -e "${RED}❯ docker-compose command is not available${RESET}"
 | 
						echo -e "${RED}❯ docker-compose command is not available${RESET}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,64 +0,0 @@
 | 
				
			|||||||
/// <reference types="cypress" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe('LDAP with Authentik', () => {
 | 
					 | 
				
			||||||
	let token;
 | 
					 | 
				
			||||||
	if (Cypress.env('skipStackCheck') === 'true' || Cypress.env('stack') === 'postgres') {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		before(() => {
 | 
					 | 
				
			||||||
			cy.getToken().then((tok) => {
 | 
					 | 
				
			||||||
				token = tok;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// cy.task('backendApiPut', {
 | 
					 | 
				
			||||||
				// 	token: token,
 | 
					 | 
				
			||||||
				// 	path:  '/api/settings/ldap-auth',
 | 
					 | 
				
			||||||
				// 	data:  {
 | 
					 | 
				
			||||||
				// 		value: {
 | 
					 | 
				
			||||||
				// 			host: 'authentik-ldap:3389',
 | 
					 | 
				
			||||||
				// 			base_dn: 'ou=users,DC=ldap,DC=goauthentik,DC=io',
 | 
					 | 
				
			||||||
				// 			user_dn: 'cn={{USERNAME}},ou=users,DC=ldap,DC=goauthentik,DC=io',
 | 
					 | 
				
			||||||
				// 			email_property: 'mail',
 | 
					 | 
				
			||||||
				// 			name_property: 'sn',
 | 
					 | 
				
			||||||
				// 			self_filter: '(&(cn={{USERNAME}})(ak-active=TRUE))',
 | 
					 | 
				
			||||||
				// 			auto_create_user: true
 | 
					 | 
				
			||||||
				// 		}
 | 
					 | 
				
			||||||
				// 	}
 | 
					 | 
				
			||||||
				// }).then((data) => {
 | 
					 | 
				
			||||||
				// 	cy.validateSwaggerSchema('put', 200, '/settings/{name}', data);
 | 
					 | 
				
			||||||
				// 	expect(data.result).to.have.property('id');
 | 
					 | 
				
			||||||
				// 	expect(data.result.id).to.be.greaterThan(0);
 | 
					 | 
				
			||||||
				// });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// cy.task('backendApiPut', {
 | 
					 | 
				
			||||||
				// 	token: token,
 | 
					 | 
				
			||||||
				// 	path:  '/api/settings/auth-methods',
 | 
					 | 
				
			||||||
				// 	data:  {
 | 
					 | 
				
			||||||
				// 		value: [
 | 
					 | 
				
			||||||
				// 			'local',
 | 
					 | 
				
			||||||
				// 			'ldap'
 | 
					 | 
				
			||||||
				// 		]
 | 
					 | 
				
			||||||
				// 	}
 | 
					 | 
				
			||||||
				// }).then((data) => {
 | 
					 | 
				
			||||||
				// 	cy.validateSwaggerSchema('put', 200, '/settings/{name}', data);
 | 
					 | 
				
			||||||
				// 	expect(data.result).to.have.property('id');
 | 
					 | 
				
			||||||
				// 	expect(data.result.id).to.be.greaterThan(0);
 | 
					 | 
				
			||||||
				// });
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		it.skip('Should log in with LDAP', function() {
 | 
					 | 
				
			||||||
			// cy.task('backendApiPost', {
 | 
					 | 
				
			||||||
			// 	token: token,
 | 
					 | 
				
			||||||
			// 	path:  '/api/auth',
 | 
					 | 
				
			||||||
			// 	data:  {
 | 
					 | 
				
			||||||
			// 		// Authentik LDAP creds:
 | 
					 | 
				
			||||||
			// 		type: 'ldap',
 | 
					 | 
				
			||||||
			// 		identity: 'cypress',
 | 
					 | 
				
			||||||
			// 		secret: 'fqXBfUYqHvYqiwBHWW7f'
 | 
					 | 
				
			||||||
			// 	}
 | 
					 | 
				
			||||||
			// }).then((data) => {
 | 
					 | 
				
			||||||
			// 	cy.validateSwaggerSchema('post', 200, '/auth', data);
 | 
					 | 
				
			||||||
			// 	expect(data.result).to.have.property('token');
 | 
					 | 
				
			||||||
			// });
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
@@ -1,97 +0,0 @@
 | 
				
			|||||||
/// <reference types="cypress" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe('OAuth with Authentik', () => {
 | 
					 | 
				
			||||||
	let token;
 | 
					 | 
				
			||||||
	if (Cypress.env('skipStackCheck') === 'true' || Cypress.env('stack') === 'postgres') {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		before(() => {
 | 
					 | 
				
			||||||
			cy.getToken().then((tok) => {
 | 
					 | 
				
			||||||
				token = tok;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// cy.task('backendApiPut', {
 | 
					 | 
				
			||||||
				// 	token: token,
 | 
					 | 
				
			||||||
				// 	path:  '/api/settings/oauth-auth',
 | 
					 | 
				
			||||||
				// 	data:  {
 | 
					 | 
				
			||||||
				// 		value: {
 | 
					 | 
				
			||||||
				// 			client_id: '7iO2AvuUp9JxiSVkCcjiIbQn4mHmUMBj7yU8EjqU',
 | 
					 | 
				
			||||||
				// 			client_secret: 'VUMZzaGTrmXJ8PLksyqzyZ6lrtz04VvejFhPMBP9hGZNCMrn2LLBanySs4ta7XGrDr05xexPyZT1XThaf4ubg00WqvHRVvlu4Naa1aMootNmSRx3VAk6RSslUJmGyHzq',
 | 
					 | 
				
			||||||
				// 			authorization_url: 'http://authentik:9000/application/o/authorize/',
 | 
					 | 
				
			||||||
				// 			resource_url: 'http://authentik:9000/application/o/userinfo/',
 | 
					 | 
				
			||||||
				// 			token_url: 'http://authentik:9000/application/o/token/',
 | 
					 | 
				
			||||||
				// 			logout_url: 'http://authentik:9000/application/o/npm/end-session/',
 | 
					 | 
				
			||||||
				// 			identifier: 'preferred_username',
 | 
					 | 
				
			||||||
				// 			scopes: [],
 | 
					 | 
				
			||||||
				// 			auto_create_user: true
 | 
					 | 
				
			||||||
				// 		}
 | 
					 | 
				
			||||||
				// 	}
 | 
					 | 
				
			||||||
				// }).then((data) => {
 | 
					 | 
				
			||||||
				// 	cy.validateSwaggerSchema('put', 200, '/settings/{name}', data);
 | 
					 | 
				
			||||||
				// 	expect(data.result).to.have.property('id');
 | 
					 | 
				
			||||||
				// 	expect(data.result.id).to.be.greaterThan(0);
 | 
					 | 
				
			||||||
				// });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// cy.task('backendApiPut', {
 | 
					 | 
				
			||||||
				// 	token: token,
 | 
					 | 
				
			||||||
				// 	path:  '/api/settings/auth-methods',
 | 
					 | 
				
			||||||
				// 	data:  {
 | 
					 | 
				
			||||||
				// 		value: [
 | 
					 | 
				
			||||||
				// 			'local',
 | 
					 | 
				
			||||||
				// 			'oauth'
 | 
					 | 
				
			||||||
				// 		]
 | 
					 | 
				
			||||||
				// 	}
 | 
					 | 
				
			||||||
				// }).then((data) => {
 | 
					 | 
				
			||||||
				// 	cy.validateSwaggerSchema('put', 200, '/settings/{name}', data);
 | 
					 | 
				
			||||||
				// 	expect(data.result).to.have.property('id');
 | 
					 | 
				
			||||||
				// 	expect(data.result.id).to.be.greaterThan(0);
 | 
					 | 
				
			||||||
				// });
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		it.skip('Should log in with OAuth', function() {
 | 
					 | 
				
			||||||
			// cy.task('backendApiGet', {
 | 
					 | 
				
			||||||
			// 	path:  '/oauth/login?redirect_base=' + encodeURI(Cypress.config('baseUrl')),
 | 
					 | 
				
			||||||
			// }).then((data) => {
 | 
					 | 
				
			||||||
			// 	expect(data).to.have.property('result');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	cy.origin('http://authentik:9000', {args: data.result}, (url) => {
 | 
					 | 
				
			||||||
			// 		cy.visit(url);
 | 
					 | 
				
			||||||
			// 		cy.get('ak-flow-executor')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('ak-stage-identification')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('input[name="uidField"]', { visible: true })
 | 
					 | 
				
			||||||
			// 		.type('cypress');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	cy.get('ak-flow-executor')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('ak-stage-identification')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('button[type="submit"]', { visible: true })
 | 
					 | 
				
			||||||
			// 		.click();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	cy.get('ak-flow-executor')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('ak-stage-password')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('input[name="password"]', { visible: true })
 | 
					 | 
				
			||||||
			// 		.type('fqXBfUYqHvYqiwBHWW7f');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	cy.get('ak-flow-executor')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('ak-stage-password')
 | 
					 | 
				
			||||||
			// 		.shadow()
 | 
					 | 
				
			||||||
			// 		.find('button[type="submit"]', { visible: true })
 | 
					 | 
				
			||||||
			// 		.click();
 | 
					 | 
				
			||||||
			// 	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	// we should be logged in
 | 
					 | 
				
			||||||
			// 	cy.get('#root p.chakra-text')
 | 
					 | 
				
			||||||
			// 		.first()
 | 
					 | 
				
			||||||
			// 		.should('have.text', 'Nginx Proxy Manager');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 	// logout:
 | 
					 | 
				
			||||||
			// 	cy.clearLocalStorage();
 | 
					 | 
				
			||||||
			// });
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
@@ -18,6 +18,7 @@ describe('Proxy Hosts endpoints', () => {
 | 
				
			|||||||
				forward_scheme: 'http',
 | 
									forward_scheme: 'http',
 | 
				
			||||||
				forward_host:   '1.1.1.1',
 | 
									forward_host:   '1.1.1.1',
 | 
				
			||||||
				forward_port:   80,
 | 
									forward_port:   80,
 | 
				
			||||||
 | 
									client_max_body_size: 1,
 | 
				
			||||||
				access_list_id: '0',
 | 
									access_list_id: '0',
 | 
				
			||||||
				certificate_id: 0,
 | 
									certificate_id: 0,
 | 
				
			||||||
				meta:           {
 | 
									meta:           {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user