| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | #!/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;		let envSqliteFile  = process.env.DB_SQLITE_FILE || null;		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) && !envSqliteFile){			envSqliteFile = '/data/database.sqlite';			logger.info(`No valid environment variables for database provided, using default SQLite file '${envSqliteFile}'`);		}		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 knex configuration from environment variables');			configData.database = newConfig;		} else {			const newConfig = {				fromEnv: true,				engine:  'knex-native',				knex:    {					client:     'sqlite3',					connection: {						filename: envSqliteFile					},					useNullAsDefault: true				}			};			if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {				// Config is unchanged, skip overwrite				resolve();				return;			}			logger.info('Generating SQLite knex configuration');			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.debug('Wrote db configuration to config file: ' + filename);				resolve();			}		});	});}try {	appStart();} catch (err) {	logger.error(err.message, err);	process.exit(1);}
 |