From ad41fc052f9b5e41b366c5c4f023c65791f7c24d Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 16 Jul 2025 10:43:36 +0200 Subject: [PATCH] [ADD] Environment variables to supervisor config --- allianceauth/bin/allianceauth.py | 4 +- allianceauth/project_template/supervisor.conf | 57 ++++++++++++------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/allianceauth/bin/allianceauth.py b/allianceauth/bin/allianceauth.py index 20cfb53d..ac87c267 100644 --- a/allianceauth/bin/allianceauth.py +++ b/allianceauth/bin/allianceauth.py @@ -13,6 +13,7 @@ class StartProject(BaseStartProject): parser.add_argument('--celery', help='The path to the celery executable.') parser.add_argument('--gunicorn', help='The path to the gunicorn executable.') parser.add_argument('--memmon', help='The path to the memmon executable.') + parser.add_argument('--venv_directory', help='The path to the virtual environment directory.') def create_project(parser, options, args): @@ -27,7 +28,7 @@ def create_project(parser, options, args): allianceauth_path = os.path.dirname(allianceauth.__file__) template_path = os.path.join(allianceauth_path, 'project_template') - # Determine locations of commands to render supervisor cond + # Determine locations of commands to render supervisor configuration command_options = { 'template': template_path, 'python': shutil.which('python'), @@ -35,6 +36,7 @@ def create_project(parser, options, args): 'celery': shutil.which('celery'), 'memmon': shutil.which('memmon'), 'extensions': ['py', 'conf', 'json'], + 'venv_directory': os.getenv('VIRTUAL_ENV'), } # Strip 'start' out of the arguments, leaving project name (and optionally destination dir) diff --git a/allianceauth/project_template/supervisor.conf b/allianceauth/project_template/supervisor.conf index 3c74a372..dba343ec 100644 --- a/allianceauth/project_template/supervisor.conf +++ b/allianceauth/project_template/supervisor.conf @@ -1,22 +1,37 @@ +[supervisord] +environment = + AA_USER = allianceserver, ; The user under which the processes will run + AA_PROJECT_NAME = {{ project_name }}, ; The name of the project + AA_PROJECT_DIRECTORY = {{ project_directory }}, ; The directory of the project + AA_VENV_DIRECTORY = {{ venv_directory }}, ; The directory of the virtual environment + AA_COMMAND_CELERY = {{ celery }}, ; The command to run Celery + AA_COMMAND_GUNICORN = {{ gunicorn }}, ; The command to run Gunicorn + AA_COMMAND_MEMMON = {{ memmon }} ; The command to run Memmon + [program:beat] -command = {{ celery }} -A {{ project_name }} beat -directory = {{ project_directory }} -user = allianceserver -stdout_logfile = {{ project_directory }}/log/%(program_name)s.log -stderr_logfile = {{ project_directory }}/log/%(program_name)s.log +command = %(ENV_AA_COMMAND_CELERY)s + -A %(ENV_AA_PROJECT_NAME)s beat +directory = %(ENV_AA_VENV_DIRECTORY)s +user = %(ENV_AA_USER)s +stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log +stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log autostart = true autorestart = true startsecs = 10 priority = 998 [program:worker] -command = {{ celery }} -A {{ project_name }} worker --pool=threads --concurrency=5 -n %(program_name)s_%(process_num)02d -directory = {{ project_directory }} -user = allianceserver +command = %(ENV_AA_COMMAND_CELERY)s + -A %(ENV_AA_PROJECT_NAME)s worker + --pool=threads + --concurrency=5 + -n %(program_name)s_%(process_num)02d +directory = %(ENV_AA_VENV_DIRECTORY)s +user = %(ENV_AA_USER)s numprocs = 1 process_name = %(program_name)s_%(process_num)02d -stdout_logfile = {{ project_directory }}/log/%(program_name)s.log -stderr_logfile = {{ project_directory }}/log/%(program_name)s.log +stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log +stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log autostart = true autorestart = true startsecs = 10 @@ -26,22 +41,26 @@ priority = 998 {% if gunicorn %} [program:gunicorn] -user = allianceserver -directory = {{ project_directory }} -command = {{ gunicorn }} {{ project_name }}.wsgi --workers=3 --timeout 120 -stdout_logfile = {{ project_directory }}/log/%(program_name)s.log -stderr_logfile = {{ project_directory }}/log/%(program_name)s.log +user = %(ENV_AA_USER)s +directory = %(ENV_AA_VENV_DIRECTORY)s +command = %(ENV_AA_COMMAND_GUNICORN)s %(ENV_AA_PROJECT_NAME)s.wsgi + --workers=3 + --timeout 120 +stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log +stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log autostart = true autorestart = true stopsignal = INT {% endif %} [eventlistener:memmon] -command = {{ memmon }} -p worker_00=256MB -p gunicorn=256MB -directory = {{ project_directory }} +command = %(ENV_AA_COMMAND_MEMMON)s + -p worker_00=256MB + -p gunicorn=256MB +directory = %(ENV_AA_VENV_DIRECTORY)s events = TICK_60 -stdout_logfile = {{ project_directory }}/log/memmon.log -stderr_logfile = {{ project_directory }}/log/memmon.log +stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/memmon.log +stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/memmon.log [group:{{ project_name }}] programs = beat,worker{% if gunicorn %},gunicorn{% endif %}