mealie/gunicorn_conf.py

75 lines
2.6 KiB
Python

# https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/docker-images/gunicorn_conf.py
import json
import multiprocessing
import os
class GunicornConfig:
"""Configuration to generate the properties for Gunicorn"""
def __init__(self):
# Env Variables
self.host = os.getenv("HOST", "127.0.0.1")
self.port = os.getenv("API_PORT", "9000")
self.log_level: str = os.getenv("LOG_LEVEL", "info")
self.bind: str = os.getenv("BIND", None)
self.errorlog: str = os.getenv("ERROR_LOG", "-") or None
self.accesslog: str = os.getenv("ACCESS_LOG", "-") or None
self.graceful_timeout: int = int(os.getenv("GRACEFUL_TIMEOUT", "120"))
self.timeout = int(os.getenv("TIMEOUT", "120"))
self.keepalive = int(os.getenv("KEEP_ALIVE", "5"))
self.workers_per_core = float(os.getenv("WORKERS_PER_CORE", "1"))
self.web_concurrency_str: str = os.getenv("WEB_CONCURRENCY", None)
self.max_workers_str: str = os.getenv("MAX_WORKERS", None)
# Computed Variables
self.cores = multiprocessing.cpu_count()
self.default_bind = f"{self.host}:{self.port}"
self.default_web_concorrency = self.workers_per_core * self.cores
self.workers = self.get_workers()
def get_workers(self) -> int:
if self.web_concurrency_str:
web_concurrency = int(self.web_concurrency_str)
assert web_concurrency > 0
else:
web_concurrency = max(int(self.default_web_concorrency), 2)
if self.max_workers_str:
web_concurrency = min(web_concurrency, int(self.max_workers_str))
return web_concurrency
gunicorn_conf = GunicornConfig()
# Gunicorn config variables
loglevel = gunicorn_conf.log_level
workers = gunicorn_conf.workers
bind = gunicorn_conf.bind or gunicorn_conf.default_bind
errorlog = gunicorn_conf.errorlog
accesslog = gunicorn_conf.accesslog
graceful_timeout = gunicorn_conf.graceful_timeout
timeout = gunicorn_conf.timeout
keepalive = gunicorn_conf.keepalive
# For debugging and testing
log_data = {
"loglevel": loglevel,
"workers": workers,
"bind": bind,
"graceful_timeout": graceful_timeout,
"timeout": timeout,
"keepalive": keepalive,
"errorlog": errorlog,
"accesslog": accesslog,
# Additional, non-gunicorn variables
"workers_per_core": gunicorn_conf.workers_per_core,
"use_max_workers": gunicorn_conf.max_workers_str,
"host": gunicorn_conf.host,
"port": gunicorn_conf.port,
}
print("---- Gunicorn Configuration ----", json.dumps(log_data, indent=4)) # noqa: T001