"""Gunicorn configuration for SOCKS Manager. Usage: gunicorn -c gunicorn_config.py run:app All values can be overridden via environment variables: SM_HOST bind address (default: 0.0.0.0) SM_PORT bind port (default: 5000) SM_WORKERS worker count (default: 1 — keep 1 for SOCKS5 thread singleton) SM_TIMEOUT worker timeout (default: 30) """ import multiprocessing import os _host = os.environ.get("SM_HOST", "0.0.0.0") _port = os.environ.get("SM_PORT", "5000") _workers = int(os.environ.get("SM_WORKERS", 1)) _timeout = int(os.environ.get("SM_TIMEOUT", 30)) bind = f"{_host}:{_port}" workers = _workers timeout = _timeout graceful_timeout = 30 worker_class = "sync" # Periodic worker recycling to prevent memory leaks max_requests = 1000 max_requests_jitter = 100 # Request size limits limit_request_line = 8190 limit_request_fields = 100 limit_request_field_size = 8190 # Logging → journald accesslog = "-" errorlog = "-" loglevel = os.environ.get("SM_LOG_LEVEL", "INFO").lower() # Preload app (faster fork, fails fast). Keep True when workers=1. preload_app = True # PID file pidfile = os.path.join(os.path.dirname(os.path.abspath(__file__)), "gunicorn.pid")