3232159d29
- deploy.sh: one-click deployment (venv + pip deps + .env + gunicorn + systemd + firewall) - gunicorn_config.py: unified gunicorn config with env var overrides - .env.example: full env var template (admin, security, port, session, backup, etc.) - app.py: optional dotenv .env file loading - requirements.txt: add python-dotenv
45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""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")
|