Это по большей части относится к версии либо 2.2.0, 2.1.5, либо что там было в мастере примерно на время декабря, я уже если честно не помню.
Момент 0: не раздавать статику питоном, т.е. использовать нжинкс, апач или что вашей душе угодно). Питон под напором желающих получить статику помирает и уходит в мир иной.
Момент 0.5: не стоит использовать дев-сервер фласка, а какой-нибудь wsgi-сервак, типа gunicorn или uwsgi. Опять же, дев-сервак - такая себе вещь в плане производительности. Про отключение дебагрежимов, дебаглогов и всего этого даже не говорю.
Мы юзали gunicorn, примерно так,
gunicorn --log-level=warn --bind=unix:/tmp/.sock_openkksctf -w 4 "CTFd:create_app()" -t 4 -D --access-logfile ./access.log --error-logfile ./error.log, -w и -t - параметры, отвечающие за число воркеров и тредов в этих воркерах, подбирай исходя из мощности сервака (число логических ядер).Ну и в нжинксе просто proxy_pass, гайдов, как это сделать - море, в том числе на вики ctfd.
Момент первый: Вот тут лежит файлик, отвечающий за рассылку ивентов. Это одна из фичей цтфд, однако зачастую она никому нафиг не сдалась.
Плюс она генерит зависшие TCP-стримы, которые кладут сервак.
Я отключал тупо вырезанием кода, но вот судя по гитхабу в 2.3.0 добавили возможность вырубить это через конфиг.
Плюс, если используешь SQLite (я её в больших проектах не люблю, но есть люди, умеющие ей хорошо делать), надо правильно настраивать, чтобы она в диск не упиралась. Я просто поставил постгрес и не парился, он отрабатывает достаточно хорошо.