index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 || null;
  40. const envMysqlPort = process.env.DB_MYSQL_PORT || null;
  41. const envMysqlUser = process.env.DB_MYSQL_USER || null;
  42. const envMysqlName = process.env.DB_MYSQL_NAME || null;
  43. let envSqliteFile = process.env.DB_SQLITE_FILE || null;
  44. const fs = require('fs');
  45. const filename = (process.env.NODE_CONFIG_DIR || './config') + '/' + (process.env.NODE_ENV || 'default') + '.json';
  46. let configData = {};
  47. try {
  48. configData = require(filename);
  49. } catch (err) {
  50. // do nothing
  51. }
  52. if (configData.database && configData.database.engine && !configData.database.fromEnv) {
  53. logger.info('Manual db configuration already exists, skipping config creation from environment variables');
  54. resolve();
  55. return;
  56. }
  57. if ((!envMysqlHost || !envMysqlPort || !envMysqlUser || !envMysqlName) && !envSqliteFile){
  58. envSqliteFile = '/data/database.sqlite';
  59. logger.info(`No valid environment variables for database provided, using default SQLite file '${envSqliteFile}'`);
  60. }
  61. if (envMysqlHost && envMysqlPort && envMysqlUser && envMysqlName) {
  62. const newConfig = {
  63. fromEnv: true,
  64. engine: 'mysql',
  65. host: envMysqlHost,
  66. port: envMysqlPort,
  67. user: envMysqlUser,
  68. password: process.env.DB_MYSQL_PASSWORD,
  69. name: envMysqlName,
  70. };
  71. if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {
  72. // Config is unchanged, skip overwrite
  73. resolve();
  74. return;
  75. }
  76. logger.info('Generating MySQL knex configuration from environment variables');
  77. configData.database = newConfig;
  78. } else {
  79. const newConfig = {
  80. fromEnv: true,
  81. engine: 'knex-native',
  82. knex: {
  83. client: 'sqlite3',
  84. connection: {
  85. filename: envSqliteFile
  86. },
  87. useNullAsDefault: true
  88. }
  89. };
  90. if (JSON.stringify(configData.database) === JSON.stringify(newConfig)) {
  91. // Config is unchanged, skip overwrite
  92. resolve();
  93. return;
  94. }
  95. logger.info('Generating SQLite knex configuration');
  96. configData.database = newConfig;
  97. }
  98. // Write config
  99. fs.writeFile(filename, JSON.stringify(configData, null, 2), (err) => {
  100. if (err) {
  101. logger.error('Could not write db config to config file: ' + filename);
  102. reject(err);
  103. } else {
  104. logger.debug('Wrote db configuration to config file: ' + filename);
  105. resolve();
  106. }
  107. });
  108. });
  109. }
  110. try {
  111. appStart();
  112. } catch (err) {
  113. logger.error(err.message, err);
  114. process.exit(1);
  115. }