diff --git a/mayan/apps/platform/classes.py b/mayan/apps/platform/classes.py index 5c89e855a0..4a6fa715be 100644 --- a/mayan/apps/platform/classes.py +++ b/mayan/apps/platform/classes.py @@ -1,5 +1,7 @@ from __future__ import absolute_import, unicode_literals +import os + import yaml try: from yaml import CSafeLoader as SafeLoader @@ -13,12 +15,25 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.task_manager.classes import Worker +class Variable(object): + def __init__(self, name, default, environment_name): + self.name = name + self.default = default + self.environment_name = environment_name + + def get_value(self): + return os.environ.get(self.environment_name, self.default) + + @python_2_unicode_compatible class PlatformTemplate(object): _registry = {} context = {} + context_defaults = {} label = None + settings = None template_name = None + variables = None @classmethod def all(cls): @@ -38,14 +53,42 @@ class PlatformTemplate(object): def get_context(self): return self.context + def get_context_defaults(self): + return self.context_defaults + def get_label(self): return self.label or self.name + def get_settings_context(self): + result = {} + for setting in self.settings or (): + if setting.value: + result[setting.global_name] = setting.value + + return result + def get_template_name(self): return self.template_name or 'platform/{}.tmpl'.format(self.name) + def get_variables_context(self): + result = {} + for variable in self.variables or (): + result[variable.name] = variable.get_value() + + return result + def render(self, context_string=None): - context = self.get_context() + """ + context_string allows the management command to pass context to this + method as a JSON string + """ + context = {} + + context.update(self.get_context_defaults()) + context.update(self.get_settings_context()) + context.update(self.get_variables_context()) + # get_context goes last to server as the override + context.update(self.get_context()) if context_string: context.update( @@ -59,23 +102,61 @@ class PlatformTemplate(object): ) +from mayan.apps.common.settings import ( + setting_celery_broker_url, setting_celery_result_backend +) + class PlatformTemplateSupervisord(PlatformTemplate): + context_defaults = { + 'BROKER_URL': 'redis://127.0.0.1:6379/0', + 'CELERY_RESULT_BACKEND': 'redis://127.0.0.1:6379/0', + } label = _('Template for Supervisord.') name = 'supervisord' + settings = ( + setting_celery_broker_url, setting_celery_result_backend + ) + variables = ( + Variable( + name='GUNICORN_WORKERS', default=2, + environment_name='MAYAN_GUNICORN_WORKERS' + ), + Variable( + name='DATABASE_CONN_MAX_AGE', default=60, + environment_name='MAYAN_DATABASE_CONN_MAX_AGE' + ), + Variable( + name='DATABASE_ENGINE', default='django.db.backends.postgresql', + environment_name='MAYAN_DATABASE_ENGINE' + ), + Variable( + name='DATABASE_HOST', default='127.0.0.1', + environment_name='MAYAN_DATABASE_HOST' + ), + Variable( + name='DATABASE_NAME', default='mayan', + environment_name='MAYAN_DATABASE_NAME' + ), + Variable( + name='DATABASE_PASSWORD', default='mayanuserpass', + environment_name='MAYAN_DATABASE_PASSWORD' + ), + Variable( + name='DATABASE_USER', default='mayan', + environment_name='MAYAN_DATABASE_USER' + ), + Variable( + name='INSTALLATION_PATH', default='/opt/mayan-edms', + environment_name='MAYAN_INSTALLATION_PATH' + ), + Variable( + name='MEDIA_ROOT', default='/opt/mayan-edms/media', + environment_name='MAYAN_MEDIA_ROOT' + ), + ) def get_context(self): return { - 'gunicorn_workers': 2, - 'result_backend': 'redis://127.0.0.1:6379/0', - 'broker_url': 'redis://127.0.0.1:6379/0', - 'database_conn_max_age': 60, - 'database_engine': 'django.db.backends.postgresql', - 'database_host': '127.0.0.1', - 'database_name': 'mayan', - 'database_password': 'mayanuserpass', - 'database_user': 'mayan', - 'installation_path': '/opt/mayan-edms', - 'media_root': '/opt/mayan-edms/media', 'workers': Worker.all() } diff --git a/mayan/apps/platform/templates/platform/supervisord.tmpl b/mayan/apps/platform/templates/platform/supervisord.tmpl index 59a2d45a78..ba9645c54a 100644 --- a/mayan/apps/platform/templates/platform/supervisord.tmpl +++ b/mayan/apps/platform/templates/platform/supervisord.tmpl @@ -1,29 +1,29 @@ [supervisord] environment= MAYAN_ALLOWED_HOSTS='["*"]', # Allow access to other network hosts other than localhost - MAYAN_CELERY_RESULT_BACKEND="{{ result_backend }}", - MAYAN_BROKER_URL="{{ broker_url }}", - PYTHONPATH={{ installation_path }}/lib/python2.7/site-packages:{{ media_root }}/mayan_settings, - MAYAN_MEDIA_ROOT={{ media_root }}, - MAYAN_DATABASE_ENGINE={{ database_engine }}, - MAYAN_DATABASE_HOST={{ database_host }}, - MAYAN_DATABASE_NAME={{ database_name }}, - MAYAN_DATABASE_PASSWORD={{ database_password }}, - MAYAN_DATABASE_USER={{ database_user }}, - MAYAN_DATABASE_CONN_MAX_AGE={{ database_conn_max_age }}, + MAYAN_CELERY_RESULT_BACKEND="{{ CELERY_RESULT_BACKEND }}", + MAYAN_BROKER_URL="{{ BROKER_URL }}", + PYTHONPATH={{ INSTALLATION_PATH }}/lib/python2.7/site-packages:{{ MEDIA_ROOT }}/mayan_settings, + MAYAN_MEDIA_ROOT={{ MEDIA_ROOT }}, + MAYAN_DATABASE_ENGINE={{ DATABASE_ENGINE }}, + MAYAN_DATABASE_HOST={{ DATABASE_HOST }}, + MAYAN_DATABASE_NAME={{ DATABASE_NAME }}, + MAYAN_DATABASE_PASSWORD={{ DATABASE_PASSWORD }}, + MAYAN_DATABASE_USER={{ DATABASE_USER }}, + MAYAN_DATABASE_CONN_MAX_AGE={{ DATABASE_CONN_MAX_AGE }}, DJANGO_SETTINGS_MODULE=mayan.settings.production [program:mayan-gunicorn] autorestart = true autostart = true -command = {{ installation_path }}/bin/gunicorn -w {{ gunicorn_workers }} mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --timeout 120 +command = {{ INSTALLATION_PATH }}/bin/gunicorn -w {{ GUNICORN_WORKERS }} mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --timeout 120 user = mayan {% for worker in workers %} [program:mayan-worker-{{ worker.name }}] autorestart = true autostart = true -command = nice -n {{ worker.nice_level }} {{ installation_path }}/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q {% for queue in worker.queues %}{{ queue.name }}{% if not forloop.last %},{% endif %}{% endfor %} -n mayan-worker-{{ worker.name }}.%%h --concurrency=1 +command = nice -n {{ worker.nice_level }} {{ INSTALLATION_PATH }}/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q {% for queue in worker.queues %}{{ queue.name }}{% if not forloop.last %},{% endif %}{% endfor %} -n mayan-worker-{{ worker.name }}.%%h --concurrency=1 killasgroup = true numprocs = 1 priority = 998 @@ -35,7 +35,7 @@ user = mayan [program:mayan-celery-beat] autorestart = true autostart = true -command = nice -n 1 {{ installation_path }}/bin/mayan-edms.py celery beat --pidfile= -l ERROR +command = nice -n 1 {{ INSTALLATION_PATH }}/bin/mayan-edms.py celery beat --pidfile= -l ERROR killasgroup = true numprocs = 1 priority = 998