copied from internal repo
This commit is contained in:
280
file_generator/generate_nginx.py
Normal file
280
file_generator/generate_nginx.py
Normal file
@@ -0,0 +1,280 @@
|
||||
import hashlib
|
||||
import os
|
||||
import random
|
||||
import shutil
|
||||
|
||||
from jinja2 import Template
|
||||
|
||||
from conpeek_setup import util
|
||||
|
||||
|
||||
def generate_upstream_name():
|
||||
# Define a helper function to generate a 7-character MD5 hash from a random number
|
||||
def generate_part():
|
||||
random_number = str(random.randint(0, 32767)) # Equivalent to $RANDOM in bash
|
||||
md5_hash = hashlib.md5(random_number.encode()).hexdigest()
|
||||
return md5_hash[:7]
|
||||
|
||||
# Generate the upstream name by concatenating four parts with hyphens
|
||||
upstream_name = f"{generate_part()}-{generate_part()}-{generate_part()}-{generate_part()}"
|
||||
return upstream_name
|
||||
|
||||
def generate_custom_settings(template_file_path, config_location, app_installation_domain):
|
||||
util.print_black_light(f"Preparing custom settings")
|
||||
|
||||
file = open(template_file_path, 'r')
|
||||
template_content = file.read()
|
||||
template = Template(template_content)
|
||||
|
||||
data = {
|
||||
"app_installation_domain": app_installation_domain[1:].replace(".", "\.")
|
||||
}
|
||||
|
||||
output_text = template.render(data)
|
||||
output_file = os.path.join(config_location, "custom_settings.conf")
|
||||
|
||||
with open(output_file, "w") as file:
|
||||
file.write(output_text)
|
||||
|
||||
|
||||
def generate_default_config(template_file_path, config_location, access_ip, cert_name):
|
||||
util.print_black_light(f"Preparing default.conf")
|
||||
|
||||
file = open(template_file_path, 'r')
|
||||
template_content = file.read()
|
||||
template = Template(template_content)
|
||||
|
||||
data = {
|
||||
"nginx_ip": access_ip,
|
||||
"network_domain": cert_name,
|
||||
}
|
||||
|
||||
output_text = template.render(data)
|
||||
|
||||
output_file = os.path.join(config_location, "default.conf")
|
||||
|
||||
with open(output_file, "w") as file:
|
||||
file.write(output_text)
|
||||
|
||||
|
||||
def generate_config(template_file_path, config_location, listening_port, internal_ip, access_ip, external_ip, server_name, cert_name, app_installation_domain):
|
||||
util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
|
||||
|
||||
file = open(template_file_path, 'r')
|
||||
template_content = file.read()
|
||||
template = Template(template_content)
|
||||
|
||||
data = {
|
||||
"upstream_name": generate_upstream_name(),
|
||||
"service_port": listening_port, # Example list of ports
|
||||
"ip_v4": internal_ip,
|
||||
"nginx_ip": access_ip,
|
||||
"server_name": server_name + app_installation_domain,
|
||||
"network_domain": cert_name,
|
||||
"app_installation_domain": app_installation_domain[1:]
|
||||
}
|
||||
|
||||
output_text = template.render(data)
|
||||
|
||||
output_file = os.path.join(config_location, server_name + app_installation_domain + ".conf")
|
||||
|
||||
with open(output_file, "w") as file:
|
||||
file.write(output_text)
|
||||
|
||||
|
||||
def generate_frontend_config(template_file_path, ready_config_location, internal_ip, server_name, app_name, app_installation_domain, service_port='brak_portu'):
|
||||
util.print_black_light(f"Preparing {server_name}{app_installation_domain}")
|
||||
file = open(template_file_path, 'r')
|
||||
template_content = file.read()
|
||||
template = Template(template_content)
|
||||
|
||||
data = {
|
||||
"internal_ip": internal_ip,
|
||||
"server_name": server_name + app_installation_domain,
|
||||
"app_name": app_name,
|
||||
"service_port": service_port,
|
||||
"app_installation_domain": app_installation_domain[1:]
|
||||
}
|
||||
|
||||
output_text = template.render(data)
|
||||
output_file = os.path.join(ready_config_location, server_name + app_installation_domain + ".conf")
|
||||
|
||||
with open(output_file, "w") as file:
|
||||
file.write(output_text)
|
||||
|
||||
|
||||
def run(config, developer_mode=False):
|
||||
util.print_black_light("Preparing nginx file")
|
||||
|
||||
output_directory = os.path.join(util.get_output_path(), "etc/nginx")
|
||||
template_nginx_directory = os.path.join(util.get_templates_path(), "nginx")
|
||||
|
||||
shutil.rmtree(output_directory, ignore_errors=True)
|
||||
os.makedirs(output_directory, exist_ok=True)
|
||||
|
||||
internal_ip = config["new_machine_network"]["internal_ip"]
|
||||
external_ip = config["new_machine_network"]["internal_ip"] # listen IP same as redirectIP, due to NAT in universal inteface in ŁDZ cloud
|
||||
|
||||
access_ip = config["new_machine_network"]["internal_ip"]
|
||||
if config.has_option('new_machine_network', 'access_ip'):
|
||||
access_ip = config["new_machine_network"]["access_ip"]
|
||||
|
||||
app_installation_domain = "." + config["new_machine_network"]["app_installation_domain"] # code fault, it must be this dot here, for fix in the future
|
||||
cert_name = "conpeek_ssl"
|
||||
|
||||
tenant_data = util.get_minimal_configuration()
|
||||
|
||||
reverse_proxy_directory = os.path.join(util.get_output_path(), "etc/nginx/reverse_proxy")
|
||||
shutil.rmtree(reverse_proxy_directory, ignore_errors=True)
|
||||
os.makedirs(reverse_proxy_directory, exist_ok=True)
|
||||
|
||||
frontend_directory = os.path.join(util.get_output_path(), "etc/nginx/frontend")
|
||||
shutil.rmtree(frontend_directory, ignore_errors=True)
|
||||
os.makedirs(frontend_directory, exist_ok=True)
|
||||
|
||||
reverse_proxy_replacements = {
|
||||
# api tenant login
|
||||
f"{tenant_data['tenant_login_api_server_name']}": tenant_data['tenant_login_api_server_port'],
|
||||
# api tenant
|
||||
f"api-{tenant_data['api_tenant_name']}": tenant_data['api_tenant_port'],
|
||||
# api operator
|
||||
f"api-{tenant_data['operator_api_server_response_name']}": tenant_data['operator_api_server_response_port'],
|
||||
# session_server
|
||||
f"{tenant_data['session_server_name']}": tenant_data['private_api_port'],
|
||||
f"public-api-{tenant_data['session_server_name']}": tenant_data['public_api_port'],
|
||||
f"api-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_api_port'],
|
||||
# cdr_server
|
||||
f"api-{tenant_data['cdr_server_name']}": tenant_data['cdr_server_api_port'],
|
||||
# report server
|
||||
f"api-{tenant_data['report_server_name']}": tenant_data['report_server_api_port'],
|
||||
# local contact db server
|
||||
f"api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_api_port'],
|
||||
f"public-api-{tenant_data['local_contact_db_name']}": tenant_data['local_contact_db_public_api_port'],
|
||||
# hubspot server
|
||||
f"api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_api_port'],
|
||||
f"public-api-{tenant_data['hubspot_server_name']}": tenant_data['hubspot_server_public_api_port'],
|
||||
# ticketing server
|
||||
f"api-{tenant_data['ticketing_server_name']}": tenant_data['ticketing_server_api_port'],
|
||||
# gus server
|
||||
f"api-{tenant_data['gus_server_name']}": tenant_data['gus_server_public_api_port'],
|
||||
# meets
|
||||
f"{tenant_data['meets_server_name']}": tenant_data['meets_server_port'],
|
||||
# bss api server
|
||||
f"api-{tenant_data['tenant_bss_api_server_name']}": tenant_data['tenant_bss_api_server_initial_application_port'],
|
||||
# sms server
|
||||
f"api-{tenant_data['sms_server_name']}": tenant_data['sms_server_api_port'],
|
||||
f"public-api-{tenant_data['sms_server_name']}": tenant_data['sms_server_public_api_port'],
|
||||
# mailbox server
|
||||
f"api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_api_port'],
|
||||
f"public-api-{tenant_data['mailbox_server_name']}": tenant_data['mailbox_server_public_api_port'],
|
||||
# facebook server
|
||||
f"api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_api_port'],
|
||||
f"public-api-{tenant_data['facebook_server_name']}": tenant_data['facebook_server_public_api_port'],
|
||||
# messagebird server
|
||||
f"api-{tenant_data['messagebird_server_name']}": tenant_data['messagebird_server_api_port'],
|
||||
# tenant_web_polling_server
|
||||
f"{tenant_data['api_tenant_web_polling_name']}": tenant_data['api_tenant_web_polling_port'],
|
||||
# bot server
|
||||
f"api-{tenant_data['bot_server_name']}": tenant_data['bot_server_api_port'],
|
||||
|
||||
# verto
|
||||
f"api-{tenant_data['freeswitch_name']}": 6900,
|
||||
f"verto-routing-{tenant_data['freeswitch_name']}": 9800,
|
||||
f"verto-stun-{tenant_data['freeswitch_name']}": 9801,
|
||||
f"verto-no-stun-{tenant_data['freeswitch_name']}": 9802,
|
||||
f"verto-ext-stun-{tenant_data['freeswitch_name']}": 9803,
|
||||
f"verto-ext-no-stun-{tenant_data['freeswitch_name']}": 9804,
|
||||
|
||||
# metrics
|
||||
"invitation": 3900,
|
||||
"conpeek-exporter": 9850,
|
||||
"statsd-exporter": 9851,
|
||||
"statsd-api-exporter": 9852,
|
||||
"ping-exporter": 9853,
|
||||
"node-exporter": 9854,
|
||||
"freeswitch-exporter": 9855,
|
||||
"process-exporter": 9856,
|
||||
"docker-exporter": 9857,
|
||||
|
||||
# frontend
|
||||
"app": 81,
|
||||
"wallboard": 81,
|
||||
"device": 81,
|
||||
"operator": 81,
|
||||
"docs": 81,
|
||||
"desk": 81
|
||||
}
|
||||
|
||||
if developer_mode:
|
||||
reverse_proxy_replacements["app-prod"] = 81
|
||||
|
||||
for name in reverse_proxy_replacements.keys():
|
||||
generate_config(os.path.join(template_nginx_directory, "nginx-proxy.tmpl"), reverse_proxy_directory, reverse_proxy_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
|
||||
|
||||
generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), reverse_proxy_directory, app_installation_domain)
|
||||
generate_custom_settings(os.path.join(template_nginx_directory, "custom_settings.tmpl"), frontend_directory, app_installation_domain)
|
||||
generate_default_config(os.path.join(template_nginx_directory, "default.tmpl"), reverse_proxy_directory, access_ip, cert_name)
|
||||
|
||||
reverse_proxy_wss_replacements = {
|
||||
f"wss-{tenant_data['session_server_name']}": tenant_data['wss_port'],
|
||||
f"wss-monitoring-{tenant_data['session_server_name']}": tenant_data['monitoring_initial_wss_port'],
|
||||
f"wss-monitoring-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
|
||||
f"wss-{tenant_data['user_notification_server_name']}": tenant_data['user_notification_server_wss_port'],
|
||||
f"wss-{tenant_data['messaging_server_name']}": tenant_data['messaging_server_wss_port'],
|
||||
}
|
||||
|
||||
for name in reverse_proxy_wss_replacements.keys():
|
||||
generate_config(os.path.join(template_nginx_directory, "nginx-web-socket.tmpl"), reverse_proxy_directory, reverse_proxy_wss_replacements[name], internal_ip, access_ip, external_ip, name, cert_name, app_installation_domain)
|
||||
|
||||
frontend_replacements = {
|
||||
"app": "app_tenant",
|
||||
"wallboard": "app_wallboard",
|
||||
"device": "app_device",
|
||||
"operator": "app_operator"
|
||||
}
|
||||
|
||||
if developer_mode:
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_production_template.tmpl"), frontend_directory, internal_ip, "app-prod", "app_tenant", app_installation_domain)
|
||||
|
||||
for name in frontend_replacements.keys():
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "docker_frontend_template.tmpl"), frontend_directory, internal_ip, name, frontend_replacements[name], app_installation_domain)
|
||||
|
||||
# server specific
|
||||
|
||||
# docs
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "docker_docs_template.tmpl"), frontend_directory, internal_ip, "docs", "docs", app_installation_domain)
|
||||
# desk
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "docker_desk_template.tmpl"), frontend_directory, internal_ip, "desk", "app_desk", app_installation_domain)
|
||||
# api tenant plugin frontend
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "tenant_plugin_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['tenant_plugin_api_server_name'], None, app_installation_domain, tenant_data['tenant_plugin_api_server_initial_application_port'])
|
||||
# api tenant plugin reverse proxy
|
||||
generate_config(os.path.join(template_nginx_directory, "tenant_plugin_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['tenant_plugin_api_server_initial_application_port'], internal_ip, access_ip, external_ip, tenant_data['tenant_plugin_api_server_name'], cert_name, app_installation_domain)
|
||||
# file server
|
||||
generate_config(os.path.join(template_nginx_directory, "nginx-file-server.tmpl"), reverse_proxy_directory, tenant_data['file_server_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['file_server_name']}", cert_name, app_installation_domain)
|
||||
# messaging server
|
||||
generate_config(os.path.join(template_nginx_directory, "nginx-messaging-server.tmpl"), reverse_proxy_directory, tenant_data['messaging_server_public_api_port'], internal_ip, access_ip, external_ip, f"api-{tenant_data['messaging_server_name']}", cert_name, app_installation_domain)
|
||||
# api tenant plugin frontend
|
||||
generate_frontend_config(os.path.join(template_nginx_directory, "tenant_web_polling_frontend_template.tmpl"), frontend_directory, internal_ip, tenant_data['api_tenant_web_polling_name'], None, app_installation_domain, tenant_data['api_tenant_web_polling_port'])
|
||||
# api tenant plugin reverse proxy
|
||||
generate_config(os.path.join(template_nginx_directory, "tenant_web_polling_reverse_proxy_template.tmpl"), reverse_proxy_directory, tenant_data['api_tenant_web_polling_port'], internal_ip, access_ip, external_ip, tenant_data['api_tenant_web_polling_name'], cert_name, app_installation_domain)
|
||||
|
||||
files_to_copy = [
|
||||
"nginx.conf",
|
||||
"nginx.conf_frontend"
|
||||
]
|
||||
|
||||
for file in files_to_copy:
|
||||
util.copy_file(os.path.join(template_nginx_directory, file), output_directory)
|
||||
|
||||
# custom docker entrypoint scripts
|
||||
|
||||
frontend_custom_template_directory = os.path.join(util.get_templates_path(), "nginx")
|
||||
frontend_custom_directory = os.path.join(util.get_output_path(), "custom/frontend")
|
||||
os.makedirs(frontend_custom_directory, exist_ok=True)
|
||||
util.copy_file(os.path.join(frontend_custom_template_directory, "custom.sh"), frontend_custom_directory)
|
||||
|
||||
if config.has_option("custom", "operator_name"):
|
||||
util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', config["custom"]["operator_name"])
|
||||
else:
|
||||
util.basic_on_location_sed(os.path.join(frontend_custom_directory, "custom.sh"), 'OPERATOR_NAME', 'Conpeek')
|
||||
|
||||
Reference in New Issue
Block a user