setup.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. const config = require('./lib/config');
  2. const logger = require('./logger').setup;
  3. const certificateModel = require('./models/certificate');
  4. const userModel = require('./models/user');
  5. const userPermissionModel = require('./models/user_permission');
  6. const utils = require('./lib/utils');
  7. const authModel = require('./models/auth');
  8. const settingModel = require('./models/setting');
  9. const certbot = require('./lib/certbot');
  10. /**
  11. * Creates a default admin users if one doesn't already exist in the database
  12. *
  13. * @returns {Promise}
  14. */
  15. const setupDefaultUser = () => {
  16. return userModel
  17. .query()
  18. .select('id', )
  19. .where('is_deleted', 0)
  20. .first()
  21. .then((row) => {
  22. if (!row || !row.id) {
  23. // Create a new user and set password
  24. const email = (process.env.INITIAL_ADMIN_EMAIL || '[email protected]').toLowerCase();
  25. const password = process.env.INITIAL_ADMIN_PASSWORD || 'changeme';
  26. logger.info('Creating a new user: ' + email + ' with password: ' + password);
  27. const data = {
  28. is_deleted: 0,
  29. email: email,
  30. name: 'Administrator',
  31. nickname: 'Admin',
  32. avatar: '',
  33. roles: ['admin'],
  34. };
  35. return userModel
  36. .query()
  37. .insertAndFetch(data)
  38. .then((user) => {
  39. return authModel
  40. .query()
  41. .insert({
  42. user_id: user.id,
  43. type: 'password',
  44. secret: password,
  45. meta: {},
  46. })
  47. .then(() => {
  48. return userPermissionModel.query().insert({
  49. user_id: user.id,
  50. visibility: 'all',
  51. proxy_hosts: 'manage',
  52. redirection_hosts: 'manage',
  53. dead_hosts: 'manage',
  54. streams: 'manage',
  55. access_lists: 'manage',
  56. certificates: 'manage',
  57. });
  58. });
  59. })
  60. .then(() => {
  61. logger.info('Initial admin setup completed');
  62. });
  63. } else if (config.debug()) {
  64. logger.info('Admin user setup not required');
  65. }
  66. });
  67. };
  68. /**
  69. * Creates default settings if they don't already exist in the database
  70. *
  71. * @returns {Promise}
  72. */
  73. const setupDefaultSettings = () => {
  74. return settingModel
  75. .query()
  76. .select('id')
  77. .where({id: 'default-site'})
  78. .first()
  79. .then((row) => {
  80. if (!row || !row.id) {
  81. settingModel
  82. .query()
  83. .insert({
  84. id: 'default-site',
  85. name: 'Default Site',
  86. description: 'What to show when Nginx is hit with an unknown Host',
  87. value: 'congratulations',
  88. meta: {},
  89. })
  90. .then(() => {
  91. logger.info('Default settings added');
  92. });
  93. }
  94. if (config.debug()) {
  95. logger.info('Default setting setup not required');
  96. }
  97. });
  98. };
  99. /**
  100. * Installs all Certbot plugins which are required for an installed certificate
  101. *
  102. * @returns {Promise}
  103. */
  104. const setupCertbotPlugins = () => {
  105. return certificateModel
  106. .query()
  107. .where('is_deleted', 0)
  108. .andWhere('provider', 'letsencrypt')
  109. .then((certificates) => {
  110. if (certificates && certificates.length) {
  111. let plugins = [];
  112. let promises = [];
  113. certificates.map(function (certificate) {
  114. if (certificate.meta && certificate.meta.dns_challenge === true) {
  115. if (plugins.indexOf(certificate.meta.dns_provider) === -1) {
  116. plugins.push(certificate.meta.dns_provider);
  117. }
  118. // Make sure credentials file exists
  119. const credentials_loc = '/etc/letsencrypt/credentials/credentials-' + certificate.id;
  120. // Escape single quotes and backslashes
  121. const escapedCredentials = certificate.meta.dns_provider_credentials.replaceAll('\'', '\\\'').replaceAll('\\', '\\\\');
  122. const credentials_cmd = '[ -f \'' + credentials_loc + '\' ] || { mkdir -p /etc/letsencrypt/credentials 2> /dev/null; echo \'' + escapedCredentials + '\' > \'' + credentials_loc + '\' && chmod 600 \'' + credentials_loc + '\'; }';
  123. promises.push(utils.exec(credentials_cmd));
  124. }
  125. });
  126. return certbot.installPlugins(plugins)
  127. .then(() => {
  128. if (promises.length) {
  129. return Promise.all(promises)
  130. .then(() => {
  131. logger.info('Added Certbot plugins ' + plugins.join(', '));
  132. });
  133. }
  134. });
  135. }
  136. });
  137. };
  138. /**
  139. * Starts a timer to call run the logrotation binary every two days
  140. * @returns {Promise}
  141. */
  142. const setupLogrotation = () => {
  143. const intervalTimeout = 1000 * 60 * 60 * 24 * 2; // 2 days
  144. const runLogrotate = async () => {
  145. try {
  146. await utils.exec('logrotate /etc/logrotate.d/nginx-proxy-manager');
  147. logger.info('Logrotate completed.');
  148. } catch (e) { logger.warn(e); }
  149. };
  150. logger.info('Logrotate Timer initialized');
  151. setInterval(runLogrotate, intervalTimeout);
  152. // And do this now as well
  153. return runLogrotate();
  154. };
  155. module.exports = function () {
  156. return setupDefaultUser()
  157. .then(setupDefaultSettings)
  158. .then(setupCertbotPlugins)
  159. .then(setupLogrotation);
  160. };