; Notes: ; priority=1 --> Lower priorities indicate programs that start first and shut down last ; killasgroup=true --> send kill signal to child processes too [program:{{ bench_name }}-frappe-web] command={{ bench_dir }}/env/bin/gunicorn -b 127.0.0.1:{{ webserver_port }} -w {{ gunicorn_workers }} -t {{ http_timeout }} frappe.app:application --preload priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/web.log stderr_logfile={{ bench_dir }}/logs/web.error.log user={{ user }} directory={{ sites_dir }} {% if use_rq %} [program:{{ bench_name }}-frappe-schedule] command={{ bench_cmd }} schedule priority=3 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/schedule.log stderr_logfile={{ bench_dir }}/logs/schedule.error.log user={{ user }} directory={{ bench_dir }} [program:{{ bench_name }}-frappe-default-worker] command={{ bench_cmd }} worker --queue default priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=1560 directory={{ bench_dir }} killasgroup=true numprocs={{ background_workers }} process_name=%(program_name)s-%(process_num)d [program:{{ bench_name }}-frappe-short-worker] command={{ bench_cmd }} worker --queue short priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=360 directory={{ bench_dir }} killasgroup=true numprocs={{ background_workers }} process_name=%(program_name)s-%(process_num)d [program:{{ bench_name }}-frappe-long-worker] command={{ bench_cmd }} worker --queue long priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=1560 directory={{ bench_dir }} killasgroup=true numprocs={{ background_workers }} process_name=%(program_name)s-%(process_num)d {% else %} [program:{{ bench_name }}-frappe-workerbeat] command={{ bench_dir }}/env/bin/python -m frappe.celery_app beat -s beat.schedule priority=3 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/workerbeat.log stderr_logfile={{ bench_dir }}/logs/workerbeat.error.log user={{ user }} directory={{ sites_dir }} [program:{{ bench_name }}-frappe-worker] command={{ bench_dir }}/env/bin/python -m frappe.celery_app worker -n jobs@%%h -Ofair --soft-time-limit 360 --time-limit 390 --loglevel INFO priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=400 directory={{ sites_dir }} killasgroup=true [program:{{ bench_name }}-frappe-longjob-worker] command={{ bench_dir }}/env/bin/python -m frappe.celery_app worker -n longjobs@%%h -Ofair --soft-time-limit 1500 --time-limit 1530 --loglevel INFO priority=2 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=1540 directory={{ sites_dir }} killasgroup=true [program:{{ bench_name }}-frappe-async-worker] command={{ bench_dir }}/env/bin/python -m frappe.celery_app worker -n async@%%h -Ofair --soft-time-limit 1500 --time-limit 1530 --loglevel INFO priority=2 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/worker.log stderr_logfile={{ bench_dir }}/logs/worker.error.log user={{ user }} stopwaitsecs=1540 directory={{ sites_dir }} killasgroup=true {% endif %} {% if not skip_redis %} [program:{{ bench_name }}-redis-cache] command={{ redis_server }} {{ redis_cache_config }} priority=1 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/redis-cache.log stderr_logfile={{ bench_dir }}/logs/redis-cache.error.log user={{ user }} directory={{ sites_dir }} [program:{{ bench_name }}-redis-queue] command={{ redis_server }} {{ redis_queue_config }} priority=1 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/redis-queue.log stderr_logfile={{ bench_dir }}/logs/redis-queue.error.log user={{ user }} directory={{ sites_dir }} {% endif %} {% if not skip_redis %} [program:{{ bench_name }}-redis-socketio] command={{ redis_server }} {{ redis_socketio_config }} priority=1 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/redis-socketio.log stderr_logfile={{ bench_dir }}/logs/redis-socketio.error.log user={{ user }} directory={{ sites_dir }} {% endif %} {% if node %} [program:{{ bench_name }}-node-socketio] command={{ node }} {{ bench_dir }}/apps/frappe/socketio.js priority=4 autostart=true autorestart=true stdout_logfile={{ bench_dir }}/logs/node-socketio.log stderr_logfile={{ bench_dir }}/logs/node-socketio.error.log user={{ user }} directory={{ bench_dir }} {% endif %} [group:{{ bench_name }}-web] programs={{ bench_name }}-frappe-web {%- if node -%} ,{{ bench_name }}-node-socketio {%- endif%} {% if use_rq %} [group:{{ bench_name }}-workers] programs={{ bench_name }}-frappe-schedule,{{ bench_name }}-frappe-default-worker,{{ bench_name }}-frappe-short-worker,{{ bench_name }}-frappe-long-worker {% else %} [group:{{ bench_name }}-workers] programs={{ bench_name }}-frappe-workerbeat,{{ bench_name }}-frappe-worker,{{ bench_name }}-frappe-longjob-worker,{{ bench_name }}-frappe-async-worker {% endif %} {% if not skip_redis %} [group:{{ bench_name }}-redis] programs={{ bench_name }}-redis-cache,{{ bench_name }}-redis-queue,{{ bench_name }}-redis-socketio {% endif %}