index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/usr/bin/env node
  2. const logger = require('./logger').global;
  3. async function appStart () {
  4. // Create config file db settings if environment variables have been set
  5. await createDbConfigFromEnvironment();
  6. const migrate = require('./migrate');
  7. const setup = require('./setup');
  8. const app = require('./app');
  9. const apiValidator = require('./lib/validator/api');
  10. const internalCertificate = require('./internal/certificate');
  11. const internalIpRanges = require('./internal/ip_ranges');
  12. return migrate.latest()
  13. .then(setup)
  14. .then(() => {
  15. return apiValidator.loadSchemas;
  16. })
  17. .then(internalIpRanges.fetch)
  18. .then(() => {
  19. internalCertificate.initTimer();
  20. internalIpRanges.initTimer();
  21. const server = app.listen(3000, () => {
  22. logger.info('Backend PID ' + process.pid + ' listening on port 3000 ...');
  23. process.on('SIGTERM', () => {
  24. logger.info('PID ' + process.pid + ' received SIGTERM');
  25. server.close(() => {
  26. logger.info('Stopping.');
  27. process.exit(0);
  28. });
  29. });
  30. });
  31. })
  32. .catch((err) => {
  33. logger.error(err.message);
  34. setTimeout(appStart, 1000);
  35. });
  36. }
  37. async function createDbConfigFromEnvironment(){
  38. return new Promise((resolve, reject) => {
  39. const envMysqlHost = process.env.DB_MYSQL_HOST;
  40. const envMysqlPort = process.env.DB_MYSQL_PORT;
  41. const envMysqlUser = process.env.DB_MYSQL_USER;
  42. const envMysqlName = process.env.DB_MYSQL_NAME;
  43. const envSqliteFile = process.env.DB_SQLITE_FILE;
  44. if ((envMysqlHost && envMysqlPort && envMysqlUser && envMysqlName) || envSqliteFile) {
  45. const fs = require('fs');
  46. const filename = (process.env.NODE_CONFIG_DIR || './config') + '/' + (process.env.NODE_ENV || 'default') + '.json';
  47. let configData = {};
  48. try {
  49. configData = require(filename);
  50. } catch (err) {
  51. // do nothing
  52. }
  53. if (configData.database && configData.database.engine && !configData.database.fromEnv) {
  54. logger.info('Manual db configuration already exists, skipping config creation from environment variables');
  55. resolve();
  56. return;
  57. }
  58. if (envMysqlHost && envMysqlPort && envMysqlUser && envMysqlName) {
  59. const newConfig = {
  60. fromEnv: true,
  61. engine: 'mysql',
  62. host: envMysqlHost,
  63. port: envMysqlPort,
  64. user: envMysqlUser,
  65. password: process.env.DB_MYSQL_PASSWORD,
  66. name: envMysqlName,
  67. };
  68. if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {
  69. // Config is unchanged, skip overwrite
  70. resolve();
  71. return;
  72. }
  73. logger.info('Generating MySQL db configuration from environment variables');
  74. configData.database = newConfig;
  75. } else {
  76. const newConfig = {
  77. fromEnv: true,
  78. engine: 'knex-native',
  79. knex: {
  80. client: 'sqlite3',
  81. connection: {
  82. filename: envSqliteFile
  83. }
  84. }
  85. };
  86. if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {
  87. // Config is unchanged, skip overwrite
  88. resolve();
  89. return;
  90. }
  91. logger.info('Generating Sqlite db configuration from environment variables');
  92. configData.database = newConfig;
  93. }
  94. // Write config
  95. fs.writeFile(filename, JSON.stringify(configData, null, 2), (err) => {
  96. if (err) {
  97. logger.error('Could not write db config to config file: ' + filename);
  98. reject(err);
  99. } else {
  100. logger.info('Wrote db configuration to config file: ' + filename);
  101. resolve();
  102. }
  103. });
  104. } else {
  105. // resolve();
  106. }
  107. });
  108. }
  109. try {
  110. appStart();
  111. } catch (err) {
  112. logger.error(err.message, err);
  113. process.exit(1);
  114. }