123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #!/usr/bin/env node
- const 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);
- }
|