| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | #!/usr/bin/env nodeconst logger = require('./logger').global;async function appStart () {	// Create config file db settings if environment variables have been set	await createDbConfigFromEnvironment();	const migrate             = require('./migrate');	const setup               = require('./setup');	const app                 = require('./app');	const apiValidator        = require('./lib/validator/api');	const internalCertificate = require('./internal/certificate');	const internalIpRanges    = require('./internal/ip_ranges');	return migrate.latest()		.then(setup)		.then(() => {			return apiValidator.loadSchemas;		})		.then(internalIpRanges.fetch)		.then(() => {			internalCertificate.initTimer();			internalIpRanges.initTimer();			const server = app.listen(3000, () => {				logger.info('Backend PID ' + process.pid + ' listening on port 3000 ...');				process.on('SIGTERM', () => {					logger.info('PID ' + process.pid + ' received SIGTERM');					server.close(() => {						logger.info('Stopping.');						process.exit(0);					});				});			});		})		.catch((err) => {			logger.error(err.message);			setTimeout(appStart, 1000);		});}async function createDbConfigFromEnvironment() {	return new Promise((resolve, reject) => {		const envMysqlHost  = process.env.DB_MYSQL_HOST || null;		const envMysqlPort  = process.env.DB_MYSQL_PORT || null;		const envMysqlUser  = process.env.DB_MYSQL_USER || null;		const envMysqlName  = process.env.DB_MYSQL_NAME || null;		const envSqliteFile = process.env.DB_SQLITE_FILE || null;		if ((envMysqlHost && envMysqlPort && envMysqlUser && envMysqlName) || envSqliteFile) {			const fs       = require('fs');			const filename = (process.env.NODE_CONFIG_DIR || './config') + '/' + (process.env.NODE_ENV || 'default') + '.json';			let configData = {};			try {				configData = require(filename);			} catch (err) {				// do nothing			}			if (configData.database && configData.database.engine && !configData.database.fromEnv) {				logger.info('Manual db configuration already exists, skipping config creation from environment variables');				resolve();				return;			}			if (envMysqlHost && envMysqlPort && envMysqlUser && envMysqlName) {				const newConfig = {					fromEnv:  true,					engine:   'mysql',					host:     envMysqlHost,					port:     envMysqlPort,					user:     envMysqlUser,					password: process.env.DB_MYSQL_PASSWORD,					name:     envMysqlName,				};				if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {					// Config is unchanged, skip overwrite					resolve();					return;				}				logger.info('Generating MySQL db configuration from environment variables');				configData.database = newConfig;			} else {				const newConfig = {					fromEnv: true,					engine:  'knex-native',					knex:    {						client:     'sqlite3',						connection: {							filename: envSqliteFile						}					}				};				if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {					// Config is unchanged, skip overwrite					resolve();					return;				}				logger.info('Generating Sqlite db configuration from environment variables');				configData.database = newConfig;			}			// Write config			fs.writeFile(filename, JSON.stringify(configData, null, 2), (err) => {				if (err) {					logger.error('Could not write db config to config file: ' + filename);					reject(err);				} else {					logger.info('Wrote db configuration to config file: ' + filename);					resolve();				}			});		} else {			resolve();		}	});}try {	appStart();} catch (err) {	logger.error(err.message, err);	process.exit(1);}
 |