Мой сайт на Discourse подвергается множеству атак со стороны плохих ботов/краулеров с пустым user agent. Обычно я редактировал бы конфигурацию nginx, но при использовании метода установки через Docker это недоступно. Я не хочу добавлять отдельный RP-сервер только для этого, если можно избежать.
Вы можете посмотреть discourse_docker/templates/web.ratelimited.template.yml at main · discourse/discourse_docker · GitHub как пример того, как изменить конфигурацию nginx внутри контейнера.
Для всех остальных, кто хочет сделать именно это, я создал файл /var/discourse/templates/web.blockemptyua.yml со следующим содержимым:
run:
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /listen 443 ssl http2;/
to: |
listen 443 ssl http2;
if ($http_user_agent = "") { return 403; }
Затем в файле /var/discourse/containers/app.yml я добавил этот новый файл шаблона в конец списка шаблонов в верхней части файла, после чего выполнил команду ./launcher rebuild app.
Теперь Nginx отклоняет все запросы с пустым User-Agent.
Редактирование: Изменил место для совпадения и замены, чтобы оно было более подходящим.
Я не знаком с Docker, поэтому, чтобы быть уверенным, так как я буду нервничать каждый раз, когда вижу replace в любом месте…
Это не полная замена содержимого discourse.conf, а добавление этого, верно?
Это заменяет строку внутри файла. Таким образом, оно находит первое вхождение:
listen 443 ssl http2;
и заменяет его на
listen 443 ssl http2;
if ($http_user_agent = "") { return 403; }
чтобы просто добавить новую строку в файл в нужном месте. Остальная часть файла не затрагивается. Для безопасного исправления файла используется тот же механизм, что и в официальных шаблонах.
Как я уже говорил ранее, я не знаю Docker. Я просто бедный конечный пользователь с докторской степенью по копированию и вставке.
Поэтому вот одно замечание для будущих поисковиков:
web.blockemptyua.yml не может быть первым из объявленных шаблонов. Точнее, он должен идти после web.template.yml (или, возможно, даже после каждого шаблона web.*).
Здесь порядок имеет значение, насколько я понимаю, и если мы пытаемся использовать его первым, пересборка/инициализация останавливается с ошибкой, потому что в этот момент файла /etc/nginx/conf.d/discourse.conf ещё нет.
Ну, каждый день что-то новое ![]()
Действительно, это должно быть в конце. Я отредактировал свой пост, чтобы добавить это ![]()