- eventlet worker deprecated in gunicorn 25+; WebSocket hijack broken,
causing all socket.io connections to stay on long-polling forever and
produce 'Bad file descriptor' errors on every poll cycle.
- Replace eventlet monkey_patch / spawn / sleep with gevent equivalents
- async_mode='gevent' in both SocketIO instances
- worker_class='gevent' in gunicorn.conf.py
- Add gevent-websocket to requirements (needed for WS upgrade in gunicorn)