BootstrapNginx.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from jinja2 import Environment, FileSystemLoader
  2. from modules.BootstrapBase import BootstrapBase
  3. from pathlib import Path
  4. import os
  5. import sys
  6. import time
  7. class Bootstrap(BootstrapBase):
  8. def bootstrap(self):
  9. # Connect to MySQL
  10. self.connect_mysql()
  11. # wait for Hosts
  12. php_service = os.getenv("PHPFPMHOST") or "php-fpm-mailcow"
  13. rspamd_service = os.getenv("RSPAMDHOST") or "rspamd-mailcow"
  14. sogo_service = os.getenv("SOGOHOST") or os.getenv("IPV4_NETWORK", "172.22.1") + ".248"
  15. self.wait_for_host(php_service)
  16. if not self.isYes(os.getenv("SKIP_RSPAMD", False)):
  17. self.wait_for_host(rspamd_service)
  18. if not self.isYes(os.getenv("SKIP_SOGO", False)):
  19. self.wait_for_host(sogo_service)
  20. # Setup Jinja2 Environment and load vars
  21. self.env = Environment(
  22. loader=FileSystemLoader([
  23. '/etc/nginx/conf.d/custom_templates',
  24. '/etc/nginx/conf.d/config_templates'
  25. ]),
  26. keep_trailing_newline=True,
  27. lstrip_blocks=True,
  28. trim_blocks=True
  29. )
  30. extra_vars = {
  31. "VALID_CERT_DIRS": self.get_valid_cert_dirs(),
  32. 'TRUSTED_PROXIES': [item.strip() for item in os.getenv("TRUSTED_PROXIES", "").split(",") if item.strip()],
  33. 'ADDITIONAL_SERVER_NAMES': [item.strip() for item in os.getenv("ADDITIONAL_SERVER_NAMES", "").split(",") if item.strip()],
  34. }
  35. self.env_vars = self.prepare_template_vars('/overwrites.json', extra_vars)
  36. print("Set Timezone")
  37. self.set_timezone()
  38. print("Render config")
  39. self.render_config("nginx.conf.j2", "/etc/nginx/nginx.conf")
  40. self.render_config("sites-default.conf.j2", "/etc/nginx/includes/sites-default.conf")
  41. self.render_config("server_name.active.j2", "/etc/nginx/conf.d/server_name.active")
  42. self.render_config("listen_plain.active.j2", "/etc/nginx/conf.d/listen_plain.active")
  43. self.render_config("listen_ssl.active.j2", "/etc/nginx/conf.d/listen_ssl.active")
  44. def get_valid_cert_dirs(self):
  45. ssl_dir = '/etc/ssl/mail/'
  46. valid_cert_dirs = []
  47. for d in os.listdir(ssl_dir):
  48. full_path = os.path.join(ssl_dir, d)
  49. if not os.path.isdir(full_path):
  50. continue
  51. cert_path = os.path.join(full_path, 'cert.pem')
  52. key_path = os.path.join(full_path, 'key.pem')
  53. domains_path = os.path.join(full_path, 'domains')
  54. if os.path.isfile(cert_path) and os.path.isfile(key_path) and os.path.isfile(domains_path):
  55. with open(domains_path, 'r') as file:
  56. domains = file.read().strip()
  57. domains_list = domains.split()
  58. if domains_list and os.getenv("MAILCOW_HOSTNAME", "") not in domains_list:
  59. valid_cert_dirs.append({
  60. 'cert_path': full_path + '/',
  61. 'domains': domains
  62. })
  63. return valid_cert_dirs