# Gunicorn configuration file for Sharey # Save as: gunicorn.conf.py import multiprocessing import os # Server socket bind = "0.0.0.0:8866" backlog = 2048 # Worker processes workers = multiprocessing.cpu_count() * 2 + 1 worker_class = "sync" worker_connections = 1000 timeout = 30 keepalive = 2 # Restart workers after this many requests, to help prevent memory leaks max_requests = 1000 max_requests_jitter = 50 # Logging accesslog = "logs/gunicorn_access.log" errorlog = "logs/gunicorn_error.log" loglevel = "info" access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' # Process naming proc_name = "sharey" # Server mechanics daemon = False pidfile = "logs/gunicorn.pid" user = None group = None tmp_upload_dir = None # SSL (uncomment if you have SSL certificates) # keyfile = "/path/to/keyfile" # certfile = "/path/to/certfile" # Security limit_request_line = 4096 limit_request_fields = 100 limit_request_field_size = 8190 # Performance tuning preload_app = True enable_stdio_inheritance = True # Worker timeout for file uploads (increase for large files) graceful_timeout = 120 def when_ready(server): server.log.info("Sharey server is ready. Listening on: %s", server.address) def worker_int(worker): worker.log.info("worker received INT or QUIT signal") def pre_fork(server, worker): server.log.info("Worker spawned (pid: %s)", worker.pid) def post_fork(server, worker): server.log.info("Worker spawned (pid: %s)", worker.pid) def post_worker_init(worker): worker.log.info("Worker initialized (pid: %s)", worker.pid) def worker_abort(worker): worker.log.info("Worker received SIGABRT signal")