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