enhance: Perform port diagnosis at startup only when Listen fails (#8698)
* Change port check * Comment: disableClustering * CHANGELOG * Smart message
This commit is contained in:
		
							parent
							
								
									e3f2d469c0
								
							
						
					
					
						commit
						b6794b614b
					
				
					 7 changed files with 29 additions and 96 deletions
				
			
		|  | @ -77,7 +77,6 @@ | |||
| 		"os-utils": "0.0.14", | ||||
| 		"parse5": "6.0.1", | ||||
| 		"pg": "8.7.3", | ||||
| 		"portscanner": "2.2.0", | ||||
| 		"private-ip": "2.3.3", | ||||
| 		"probe-image-size": "7.2.3", | ||||
| 		"promise-limit": "2.7.0", | ||||
|  | @ -151,7 +150,6 @@ | |||
| 		"@types/nodemailer": "6.4.4", | ||||
| 		"@types/oauth": "0.9.1", | ||||
| 		"@types/parse5": "6.0.3", | ||||
| 		"@types/portscanner": "2.1.1", | ||||
| 		"@types/pug": "2.0.6", | ||||
| 		"@types/punycode": "2.1.0", | ||||
| 		"@types/qrcode": "1.4.2", | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ import * as os from 'node:os'; | |||
| import cluster from 'node:cluster'; | ||||
| import chalk from 'chalk'; | ||||
| import chalkTemplate from 'chalk-template'; | ||||
| import * as portscanner from 'portscanner'; | ||||
| import semver from 'semver'; | ||||
| 
 | ||||
| import Logger from '@/services/logger.js'; | ||||
|  | @ -48,11 +47,6 @@ function greet() { | |||
| 	bootLogger.info(`Misskey v${meta.version}`, null, true); | ||||
| } | ||||
| 
 | ||||
| function isRoot() { | ||||
| 	// maybe process.getuid will be undefined under not POSIX environment (e.g. Windows)
 | ||||
| 	return process.getuid != null && process.getuid() === 0; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Init master process | ||||
|  */ | ||||
|  | @ -67,7 +61,6 @@ export async function masterMain() { | |||
| 		showNodejsVersion(); | ||||
| 		config = loadConfigBoot(); | ||||
| 		await connectDb(); | ||||
| 		await validatePort(config); | ||||
| 	} catch (e) { | ||||
| 		bootLogger.error('Fatal error occurred during initialization', null, true); | ||||
| 		process.exit(1); | ||||
|  | @ -97,8 +90,6 @@ function showEnvironment(): void { | |||
| 		logger.warn('The environment is not in production mode.'); | ||||
| 		logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true); | ||||
| 	} | ||||
| 
 | ||||
| 	logger.info(`You ${isRoot() ? '' : 'do not '}have root privileges`); | ||||
| } | ||||
| 
 | ||||
| function showNodejsVersion(): void { | ||||
|  | @ -152,29 +143,6 @@ async function connectDb(): Promise<void> { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| async function validatePort(config: Config): Promise<void> { | ||||
| 	const isWellKnownPort = (port: number) => port < 1024; | ||||
| 
 | ||||
| 	async function isPortAvailable(port: number): Promise<boolean> { | ||||
| 		return await portscanner.checkPortStatus(port, '127.0.0.1') === 'closed'; | ||||
| 	} | ||||
| 
 | ||||
| 	if (config.port == null || Number.isNaN(config.port)) { | ||||
| 		bootLogger.error('The port is not configured. Please configure port.', null, true); | ||||
| 		process.exit(1); | ||||
| 	} | ||||
| 
 | ||||
| 	if (process.platform === 'linux' && isWellKnownPort(config.port) && !isRoot()) { | ||||
| 		bootLogger.error('You need root privileges to listen on well-known port on Linux', null, true); | ||||
| 		process.exit(1); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!await isPortAvailable(config.port)) { | ||||
| 		bootLogger.error(`Port ${config.port} is already in use`, null, true); | ||||
| 		process.exit(1); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| async function spawnWorkers(limit: number = 1) { | ||||
| 	const workers = Math.min(limit, os.cpus().length); | ||||
| 	bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`); | ||||
|  | @ -186,6 +154,10 @@ function spawnWorker(): Promise<void> { | |||
| 	return new Promise(res => { | ||||
| 		const worker = cluster.fork(); | ||||
| 		worker.on('message', message => { | ||||
| 			if (message === 'listenFailed') { | ||||
| 				bootLogger.error(`The server Listen failed due to the previous error.`); | ||||
| 				process.exit(1); | ||||
| 			} | ||||
| 			if (message !== 'ready') return; | ||||
| 			res(); | ||||
| 		}); | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
|  * Core Server | ||||
|  */ | ||||
| 
 | ||||
| import cluster from 'node:cluster'; | ||||
| import * as fs from 'node:fs'; | ||||
| import * as http from 'node:http'; | ||||
| import Koa from 'koa'; | ||||
|  | @ -142,5 +143,26 @@ export default () => new Promise(resolve => { | |||
| 
 | ||||
| 	initializeStreamingServer(server); | ||||
| 
 | ||||
| 	server.on('error', e => { | ||||
| 		switch ((e as any).code) { | ||||
| 			case 'EACCES': | ||||
| 				serverLogger.error(`You do not have permission to listen on port ${config.port}.`); | ||||
| 				break; | ||||
| 			case 'EADDRINUSE': | ||||
| 				serverLogger.error(`Port ${config.port} is already in use by another process.`); | ||||
| 				break; | ||||
| 			default: | ||||
| 				serverLogger.error(e); | ||||
| 				break; | ||||
| 		} | ||||
| 
 | ||||
| 		if (cluster.isWorker) { | ||||
| 			process.send!('listenFailed'); | ||||
| 		} else { | ||||
| 			// disableClustering
 | ||||
| 			process.exit(1); | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 	server.listen(config.port, resolve); | ||||
| }); | ||||
|  |  | |||
|  | @ -705,11 +705,6 @@ | |||
|   resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" | ||||
|   integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== | ||||
| 
 | ||||
| "@types/portscanner@2.1.1": | ||||
|   version "2.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/@types/portscanner/-/portscanner-2.1.1.tgz#89d5094e16f3d941f20f3889dfa5d3a164b3dd3b" | ||||
|   integrity sha512-1NsVIbgBKvrqxwtMN0V6CLji1ERwKSI/RWz0J3y++CzSwYNGBStCfpIFgxV3ZwxsDR5PoZqoUWhwraDm+Ztn0Q== | ||||
| 
 | ||||
| "@types/pug@2.0.6": | ||||
|   version "2.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" | ||||
|  | @ -1254,13 +1249,6 @@ async@>=0.2.9: | |||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" | ||||
|   integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== | ||||
| 
 | ||||
| async@^2.6.0: | ||||
|   version "2.6.3" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" | ||||
|   integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== | ||||
|   dependencies: | ||||
|     lodash "^4.17.14" | ||||
| 
 | ||||
| async@^3.2.3: | ||||
|   version "3.2.3" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" | ||||
|  | @ -3861,13 +3849,6 @@ is-negative-zero@^2.0.1: | |||
|   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" | ||||
|   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== | ||||
| 
 | ||||
| is-number-like@^1.0.3: | ||||
|   version "1.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" | ||||
|   integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== | ||||
|   dependencies: | ||||
|     lodash.isfinite "^3.3.2" | ||||
| 
 | ||||
| is-number-object@^1.0.4: | ||||
|   version "1.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" | ||||
|  | @ -4498,11 +4479,6 @@ lodash.isequal@^4.5.0: | |||
|   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" | ||||
|   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= | ||||
| 
 | ||||
| lodash.isfinite@^3.3.2: | ||||
|   version "3.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" | ||||
|   integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= | ||||
| 
 | ||||
| lodash.isplainobject@^4.0.6: | ||||
|   version "4.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" | ||||
|  | @ -4548,7 +4524,7 @@ lodash.union@^4.6.0: | |||
|   resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" | ||||
|   integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= | ||||
| 
 | ||||
| lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: | ||||
| lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.21: | ||||
|   version "4.17.21" | ||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||
|   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== | ||||
|  | @ -5541,14 +5517,6 @@ pngjs@^5.0.0: | |||
|   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" | ||||
|   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== | ||||
| 
 | ||||
| portscanner@2.2.0: | ||||
|   version "2.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" | ||||
|   integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== | ||||
|   dependencies: | ||||
|     async "^2.6.0" | ||||
|     is-number-like "^1.0.3" | ||||
| 
 | ||||
| postcss@^8.3.11: | ||||
|   version "8.3.11" | ||||
|   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" | ||||
|  |  | |||
|  | @ -42,7 +42,6 @@ | |||
| 		"nested-property": "4.0.0", | ||||
| 		"parse5": "6.0.1", | ||||
| 		"photoswipe": "5.2.7", | ||||
| 		"portscanner": "2.2.0", | ||||
| 		"prismjs": "1.28.0", | ||||
| 		"private-ip": "2.3.3", | ||||
| 		"promise-limit": "2.7.0", | ||||
|  |  | |||
|  | @ -751,13 +751,6 @@ astral-regex@^2.0.0: | |||
|   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" | ||||
|   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== | ||||
| 
 | ||||
| async@^2.6.0: | ||||
|   version "2.6.3" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" | ||||
|   integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== | ||||
|   dependencies: | ||||
|     lodash "^4.17.14" | ||||
| 
 | ||||
| async@^3.2.0: | ||||
|   version "3.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" | ||||
|  | @ -2519,13 +2512,6 @@ is-negative-zero@^2.0.1: | |||
|   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" | ||||
|   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== | ||||
| 
 | ||||
| is-number-like@^1.0.3: | ||||
|   version "1.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" | ||||
|   integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== | ||||
|   dependencies: | ||||
|     lodash.isfinite "^3.3.2" | ||||
| 
 | ||||
| is-number-object@^1.0.4: | ||||
|   version "1.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" | ||||
|  | @ -2789,11 +2775,6 @@ locate-path@^6.0.0: | |||
|   dependencies: | ||||
|     p-locate "^5.0.0" | ||||
| 
 | ||||
| lodash.isfinite@^3.3.2: | ||||
|   version "3.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" | ||||
|   integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= | ||||
| 
 | ||||
| lodash.merge@^4.6.2: | ||||
|   version "4.6.2" | ||||
|   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" | ||||
|  | @ -2804,7 +2785,7 @@ lodash.once@^4.1.1: | |||
|   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" | ||||
|   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= | ||||
| 
 | ||||
| lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: | ||||
| lodash@^4.17.19, lodash@^4.17.21: | ||||
|   version "4.17.21" | ||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||
|   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== | ||||
|  | @ -3303,14 +3284,6 @@ pngjs@^5.0.0: | |||
|   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" | ||||
|   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== | ||||
| 
 | ||||
| portscanner@2.2.0: | ||||
|   version "2.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" | ||||
|   integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== | ||||
|   dependencies: | ||||
|     async "^2.6.0" | ||||
|     is-number-like "^1.0.3" | ||||
| 
 | ||||
| postcss-selector-parser@^6.0.9: | ||||
|   version "6.0.9" | ||||
|   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue