mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 15:53:33 +00:00 
			
		
		
		
	fixed migration and setup
more info: https://github.com/knex/knex/issues/2820
This commit is contained in:
		| @@ -22,22 +22,6 @@ exports.up = function (knex/*, Promise*/) { | |||||||
| 	}) | 	}) | ||||||
| 		.then(() => { | 		.then(() => { | ||||||
| 			logger.info('[' + migrate_name + '] setting Table created'); | 			logger.info('[' + migrate_name + '] setting Table created'); | ||||||
|  |  | ||||||
| 			// TODO: add settings |  | ||||||
| 			let settingModel = require('../models/setting'); |  | ||||||
|  |  | ||||||
| 			return settingModel |  | ||||||
| 				.query() |  | ||||||
| 				.insert({ |  | ||||||
| 					id:          'default-site', |  | ||||||
| 					name:        'Default Site', |  | ||||||
| 					description: 'What to show when Nginx is hit with an unknown Host', |  | ||||||
| 					value:       'congratulations', |  | ||||||
| 					meta:        {} |  | ||||||
| 				}); |  | ||||||
| 		}) |  | ||||||
| 		.then(() => { |  | ||||||
| 			logger.info('[' + migrate_name + '] Default settings added'); |  | ||||||
| 		}); | 		}); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										240
									
								
								backend/setup.js
									
									
									
									
									
								
							
							
						
						
									
										240
									
								
								backend/setup.js
									
									
									
									
									
								
							| @@ -5,111 +5,145 @@ const logger              = require('./logger').setup; | |||||||
| const userModel           = require('./models/user'); | const userModel           = require('./models/user'); | ||||||
| const userPermissionModel = require('./models/user_permission'); | const userPermissionModel = require('./models/user_permission'); | ||||||
| const authModel           = require('./models/auth'); | const authModel           = require('./models/auth'); | ||||||
|  | const settingModel        = require('./models/setting'); | ||||||
| const debug_mode          = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; | const debug_mode          = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; | ||||||
|  |  | ||||||
|  | function setupJwt(resolve, reject) { | ||||||
|  | 	// Now go and check if the jwt gpg keys have been created and if not, create them | ||||||
|  | 	if (!config.has('jwt') || !config.has('jwt.key') || !config.has('jwt.pub')) { | ||||||
|  | 		logger.info('Creating a new JWT key pair...'); | ||||||
|  |  | ||||||
|  | 		// jwt keys are not configured properly | ||||||
|  | 		const filename  = config.util.getEnv('NODE_CONFIG_DIR') + '/' + (config.util.getEnv('NODE_ENV') || 'default') + '.json'; | ||||||
|  | 		let config_data = {}; | ||||||
|  |  | ||||||
|  | 		try { | ||||||
|  | 			config_data = require(filename); | ||||||
|  | 		} catch (err) { | ||||||
|  | 			// do nothing | ||||||
|  | 			if (debug_mode) { | ||||||
|  | 				logger.debug(filename + ' config file could not be required'); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Now create the keys and save them in the config. | ||||||
|  | 		let key = new NodeRSA({b: 2048}); | ||||||
|  | 		key.generateKeyPair(); | ||||||
|  |  | ||||||
|  | 		config_data.jwt = { | ||||||
|  | 			key: key.exportKey('private').toString(), | ||||||
|  | 			pub: key.exportKey('public').toString() | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		// Write config | ||||||
|  | 		fs.writeFile(filename, JSON.stringify(config_data, null, 2), (err) => { | ||||||
|  | 			if (err) { | ||||||
|  | 				logger.error('Could not write JWT key pair to config file: ' + filename); | ||||||
|  | 				reject(err); | ||||||
|  | 			} else { | ||||||
|  | 				logger.info('Wrote JWT key pair to config file: ' + filename); | ||||||
|  |  | ||||||
|  | 				logger.warn('Restarting interface to apply new configuration'); | ||||||
|  | 				process.exit(0); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 	} else { | ||||||
|  | 		// JWT key pair exists | ||||||
|  | 		if (debug_mode) { | ||||||
|  | 			logger.debug('JWT Keypair already exists'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		resolve(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function setupDefaultUser() { | ||||||
|  | 	(userModel | ||||||
|  | 		.query() | ||||||
|  | 		.select(userModel.raw('COUNT(`id`) as `count`')) | ||||||
|  | 		.where('is_deleted', 0) | ||||||
|  | 		.first() | ||||||
|  | 	).then( (row) => { | ||||||
|  | 		if (!row.count) { | ||||||
|  | 			// Create a new user and set password | ||||||
|  | 			logger.info('Creating a new user: admin@example.com with password: changeme'); | ||||||
|  |  | ||||||
|  | 			let data = { | ||||||
|  | 				is_deleted: 0, | ||||||
|  | 				email:      'admin@example.com', | ||||||
|  | 				name:       'Administrator', | ||||||
|  | 				nickname:   'Admin', | ||||||
|  | 				avatar:     '', | ||||||
|  | 				roles:      ['admin'] | ||||||
|  | 			}; | ||||||
|  |  | ||||||
|  | 			return userModel | ||||||
|  | 				.query() | ||||||
|  | 				.insertAndFetch(data) | ||||||
|  | 				.then( (user) => { | ||||||
|  | 					return authModel | ||||||
|  | 						.query() | ||||||
|  | 						.insert({ | ||||||
|  | 							user_id: user.id, | ||||||
|  | 							type:    'password', | ||||||
|  | 							secret:  'changeme', | ||||||
|  | 							meta:    {} | ||||||
|  | 						}) | ||||||
|  | 						.then(() => { | ||||||
|  | 							return userPermissionModel | ||||||
|  | 								.query() | ||||||
|  | 								.insert({ | ||||||
|  | 									user_id:           user.id, | ||||||
|  | 									visibility:        'all', | ||||||
|  | 									proxy_hosts:       'manage', | ||||||
|  | 									redirection_hosts: 'manage', | ||||||
|  | 									dead_hosts:        'manage', | ||||||
|  | 									streams:           'manage', | ||||||
|  | 									access_lists:      'manage', | ||||||
|  | 									certificates:      'manage' | ||||||
|  | 								}); | ||||||
|  | 						}); | ||||||
|  | 				}) | ||||||
|  | 				.then(() => { | ||||||
|  | 					logger.info('Initial admin setup completed'); | ||||||
|  | 				}); | ||||||
|  | 		} else if (debug_mode) { | ||||||
|  | 			logger.debug('Admin user setup not required'); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function setupDefaultSettings() { | ||||||
|  | 	return settingModel | ||||||
|  | 		.query() | ||||||
|  | 		.select(userModel.raw('COUNT(`id`) as `count`')) | ||||||
|  | 		.first() | ||||||
|  | 		.then( (row) => { | ||||||
|  | 			if (!row.count) { | ||||||
|  | 				settingModel | ||||||
|  | 					.query() | ||||||
|  | 					.insert({ | ||||||
|  | 						id:          'default-site', | ||||||
|  | 						name:        'Default Site', | ||||||
|  | 						description: 'What to show when Nginx is hit with an unknown Host', | ||||||
|  | 						value:       'congratulations', | ||||||
|  | 						meta:        {} | ||||||
|  | 					}).then(() => { | ||||||
|  | 						logger.info('Default settings added'); | ||||||
|  | 					}); | ||||||
|  | 			} if (debug_mode) { | ||||||
|  | 				logger.debug('Default setting setup not required'); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | } | ||||||
|  |  | ||||||
| module.exports = function () { | module.exports = function () { | ||||||
| 	return new Promise((resolve, reject) => { | 	return new Promise((resolve, reject) => { | ||||||
| 		// Now go and check if the jwt gpg keys have been created and if not, create them | 		return setupJwt(resolve, reject); | ||||||
| 		if (!config.has('jwt') || !config.has('jwt.key') || !config.has('jwt.pub')) { | 	}).then(() => { | ||||||
| 			logger.info('Creating a new JWT key pair...'); | 		return setupDefaultUser(); | ||||||
|  | 	}).then(() => { | ||||||
| 			// jwt keys are not configured properly | 		return setupDefaultSettings(); | ||||||
| 			const filename  = config.util.getEnv('NODE_CONFIG_DIR') + '/' + (config.util.getEnv('NODE_ENV') || 'default') + '.json'; | 	}); | ||||||
| 			let config_data = {}; |  | ||||||
|  |  | ||||||
| 			try { |  | ||||||
| 				config_data = require(filename); |  | ||||||
| 			} catch (err) { |  | ||||||
| 				// do nothing |  | ||||||
| 				if (debug_mode) { |  | ||||||
| 					logger.debug(filename + ' config file could not be required'); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// Now create the keys and save them in the config. |  | ||||||
| 			let key = new NodeRSA({b: 2048}); |  | ||||||
| 			key.generateKeyPair(); |  | ||||||
|  |  | ||||||
| 			config_data.jwt = { |  | ||||||
| 				key: key.exportKey('private').toString(), |  | ||||||
| 				pub: key.exportKey('public').toString() |  | ||||||
| 			}; |  | ||||||
|  |  | ||||||
| 			// Write config |  | ||||||
| 			fs.writeFile(filename, JSON.stringify(config_data, null, 2), (err) => { |  | ||||||
| 				if (err) { |  | ||||||
| 					logger.error('Could not write JWT key pair to config file: ' + filename); |  | ||||||
| 					reject(err); |  | ||||||
| 				} else { |  | ||||||
| 					logger.info('Wrote JWT key pair to config file: ' + filename); |  | ||||||
|  |  | ||||||
| 					logger.warn('Restarting interface to apply new configuration'); |  | ||||||
| 					process.exit(0); |  | ||||||
| 				} |  | ||||||
| 			}); |  | ||||||
|  |  | ||||||
| 		} else { |  | ||||||
| 			// JWT key pair exists |  | ||||||
| 			if (debug_mode) { |  | ||||||
| 				logger.debug('JWT Keypair already exists'); |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			resolve(); |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| 		.then(() => { |  | ||||||
| 			return userModel |  | ||||||
| 				.query() |  | ||||||
| 				.select(userModel.raw('COUNT(`id`) as `count`')) |  | ||||||
| 				.where('is_deleted', 0) |  | ||||||
| 				.first(); |  | ||||||
| 		}) |  | ||||||
| 		.then((row) => { |  | ||||||
| 			if (!row.count) { |  | ||||||
| 				// Create a new user and set password |  | ||||||
| 				logger.info('Creating a new user: admin@example.com with password: changeme'); |  | ||||||
|  |  | ||||||
| 				let data = { |  | ||||||
| 					is_deleted: 0, |  | ||||||
| 					email:      'admin@example.com', |  | ||||||
| 					name:       'Administrator', |  | ||||||
| 					nickname:   'Admin', |  | ||||||
| 					avatar:     '', |  | ||||||
| 					roles:      ['admin'] |  | ||||||
| 				}; |  | ||||||
|  |  | ||||||
| 				return userModel |  | ||||||
| 					.query() |  | ||||||
| 					.insertAndFetch(data) |  | ||||||
| 					.then((user) => { |  | ||||||
| 						return authModel |  | ||||||
| 							.query() |  | ||||||
| 							.insert({ |  | ||||||
| 								user_id: user.id, |  | ||||||
| 								type:    'password', |  | ||||||
| 								secret:  'changeme', |  | ||||||
| 								meta:    {} |  | ||||||
| 							}) |  | ||||||
| 							.then(() => { |  | ||||||
| 								return userPermissionModel |  | ||||||
| 									.query() |  | ||||||
| 									.insert({ |  | ||||||
| 										user_id:           user.id, |  | ||||||
| 										visibility:        'all', |  | ||||||
| 										proxy_hosts:       'manage', |  | ||||||
| 										redirection_hosts: 'manage', |  | ||||||
| 										dead_hosts:        'manage', |  | ||||||
| 										streams:           'manage', |  | ||||||
| 										access_lists:      'manage', |  | ||||||
| 										certificates:      'manage' |  | ||||||
| 									}); |  | ||||||
| 							}); |  | ||||||
| 					}) |  | ||||||
| 					.then(() => { |  | ||||||
| 						logger.info('Initial setup completed'); |  | ||||||
| 					}); |  | ||||||
| 			} else if (debug_mode) { |  | ||||||
| 				logger.debug('Admin user setup not required'); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user