diff --git a/config-sample.ini b/config-sample.ini index c7f5f2df2..a18d940a4 100644 --- a/config-sample.ini +++ b/config-sample.ini @@ -3,6 +3,7 @@ instanceName= [Network] +# port setting is relevant only for web deployments, desktop builds run on random free port port=8080 # true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure). https=false diff --git a/electron.js b/electron.js index 99eb48c29..867cbfc0b 100644 --- a/electron.js +++ b/electron.js @@ -2,9 +2,9 @@ const electron = require('electron'); const path = require('path'); -const config = require('./src/services/config'); const log = require('./src/services/log'); const url = require("url"); +const port = require('./src/services/port'); const app = electron.app; const globalShortcut = electron.globalShortcut; @@ -23,7 +23,7 @@ function onClosed() { mainWindow = null; } -function createMainWindow() { +async function createMainWindow() { const win = new electron.BrowserWindow({ width: 1200, height: 900, @@ -31,10 +31,8 @@ function createMainWindow() { icon: path.join(__dirname, 'src/public/images/app-icons/png/256x256.png') }); - const port = config['Network']['port'] || '3000'; - win.setMenu(null); - win.loadURL('http://localhost:' + port); + win.loadURL('http://localhost:' + await port); win.on('closed', onClosed); win.webContents.on('new-window', (e, url) => { diff --git a/package.json b/package.json index 5020ac50d..14d8725c7 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "express": "~4.16.3", "express-session": "^1.15.6", "fs-extra": "^6.0.1", + "get-port": "^4.0.0", "helmet": "^3.12.1", "html": "^1.0.0", "image-type": "^3.0.0", diff --git a/src/services/port.js b/src/services/port.js new file mode 100644 index 000000000..4748c98e6 --- /dev/null +++ b/src/services/port.js @@ -0,0 +1,10 @@ +const getPort = require('get-port'); +const config = require('./config'); +const utils = require('./utils'); + +if (utils.isElectron()) { + module.exports = getPort(); +} +else { + module.exports = Promise.resolve(config['Network']['port'] || '3000'); +} \ No newline at end of file diff --git a/src/www b/src/www index 146acfed6..28d9a982d 100755 --- a/src/www +++ b/src/www @@ -18,70 +18,53 @@ const log = require('./services/log'); const appInfo = require('./services/app_info'); const messagingService = require('./services/messaging'); const utils = require('./services/utils'); -const sqlInit = require('./services/sql_init.js'); +const sqlInit = require('./services/sql_init'); +const port = require('./services/port'); -const port = normalizePort(config['Network']['port'] || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ let httpServer; -if (config['Network']['https']) { - const options = { - key: fs.readFileSync(config['Network']['keyPath']), - cert: fs.readFileSync(config['Network']['certPath']) - }; +async function startTrilium() { + const usedPort = await port; - httpServer = https.createServer(options, app); + app.set('port', usedPort); - log.info("App HTTPS server starting up at port " + port); -} -else { - httpServer = http.createServer(app); + if (config['Network']['https']) { + const options = { + key: fs.readFileSync(config['Network']['keyPath']), + cert: fs.readFileSync(config['Network']['certPath']) + }; - log.info("App HTTP server starting up at port " + port); -} + httpServer = https.createServer(options, app); -log.info(JSON.stringify(appInfo, null, 2)); + log.info("App HTTPS server starting up at port " + usedPort); + } + else { + httpServer = http.createServer(app); -/** - * Listen on provided port, on all network interfaces. - */ - -httpServer.keepAliveTimeout = 120000 * 5; -httpServer.listen(port); -httpServer.on('error', onError); -httpServer.on('listening', onListening); - -sqlInit.dbReady.then(() => messagingService.init(httpServer, sessionParser)); - -if (utils.isElectron()) { - const electronRouting = require('./routes/electron'); - electronRouting(app); -} - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - const port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; + log.info("App HTTP server starting up at port " + usedPort); } - if (port >= 0) { - // port number - return port; - } + log.info(JSON.stringify(appInfo, null, 2)); - return false; + /** + * Listen on provided port, on all network interfaces. + */ + + httpServer.keepAliveTimeout = 120000 * 5; + httpServer.listen(usedPort); + httpServer.on('error', onError); + httpServer.on('listening', () => debug('Listening on port' + httpServer.address().port)); + + sqlInit.dbReady.then(() => messagingService.init(httpServer, sessionParser)); + + if (utils.isElectron()) { + const electronRouting = require('./routes/electron'); + electronRouting(app); + } } +startTrilium(); + /** * Event listener for HTTP server "error" event. */ @@ -91,36 +74,19 @@ function onError(error) { throw error; } - const bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': - console.error(bind + ' requires elevated privileges'); + console.error('Port requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': - console.error(bind + ' is already in use'); + console.error('Port is already in use'); process.exit(1); break; default: throw error; } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - const addr = httpServer.address(); - const bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - - debug('Listening on ' + bind); } \ No newline at end of file