Клавиатура и мышь перестали работать + ошибка content-security-policy

Я запускаю собственную инстанцию Discourse по адресу forum.embeetle.com. Она работает стабильно уже несколько лет.

Сегодня утром я заметил, что все взаимодействия с форумом через клавиатуру и мышь в браузере прекратились. Я могу загружать любые страницы форума, но не могу прокручивать, входить в систему, выполнять поиск и т.д.

Я попробовал Firefox и Chromium — проблема сохраняется в обоих случаях.

Инструменты разработчика Firefox показывают следующую ошибку:

Content-Security-Policy: настройки страницы заблокировали загрузку ресурса inline («script-src»). forum.embeetle.com:362:10

Я не выполнял недавних обновлений и не устанавливал новых плагинов.

Есть ли какие-либо предложения, как отладить и исправить это?

Насколько мне известно, у меня стандартная установка на базе Docker, за исключением того, что я запускаю её за обратным прокси-сервером Nginx. Конфигурация Nginx ниже (не уверен, что это имеет значение):

server {
    server_name forum.embeetle.com;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/embeetle/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/embeetle/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    access_log /var/log/nginx/forum.embeetle.access.log;
    error_log /var/log/nginx/forum.embeetle.error.log;

    location / {
         proxy_pass http://unix:/srv/embeetle_forum/discourse/shared/standalone/nginx.http.sock:;
         proxy_set_header Host $http_host;
         proxy_http_version 1.1;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
        error_page 502 =502 /error/offline.html;
        proxy_intercept_errors on;
     }
 
     location /error/ {
         alias /srv/embeetle_forum/error/;
     }
}

server {
    server_name forum.embeetle.com;
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

Похоже, ваш сайт работает нормально в безопасном режиме с отключёнными темами.

Вы правы.

Я не помню, чтобы когда-либо устанавливал тему по умолчанию, но, возможно, я это сделал и забыл об этом.

Я хотел бы временно отключить темы по умолчанию, чтобы наш форум оставался рабочим, пока мы выясняем, что не так с темами. Как это сделать, если я могу получить доступ к административным страницам только при отключенных темах? В безопасном режиме все темы уже отключены, и их включение с последующим повторным отключением, похоже, не дает никакого эффекта.

Доступно три темы (см. ниже). Ни одна из них не включена по умолчанию.

Также в безопасном режиме ошибки Content-Security-Policy не возникает.

Странно, у меня в Safari сообщается, что он отказывается выполнять строку 315. Это встроенный скрипт для прелоадера Discourse-splash. Так что проблема не связана с темой.!

Для немедленного исправления вы можете отключить CSP через настройку сайта:
Screenshot 2023-11-06 at 14.24.11

Только предположение: если проблема всё ещё сохраняется, возможно, ваша серверная среда отправляет что-то неожиданное. Или какой-то другой скрипт мешает (запускаете ли вы какие-либо пользовательские плагины или другие скрипты?)

Обратите внимание, что это оставит вас в уязвимом состоянии, и проблему следует устранить как можно скорее. Но по крайней мере ваш форум снова работает.

Да, у меня происходит именно это.

Пока я применил другое обходное решение, добавив правило перезаписи в конфигурацию nginx (на уровне сервера) следующим образом:

    rewrite ^(.*)$ $1?safe_mode=no_themes break;

Теперь посетители по умолчанию будут использовать безопасный режим.

Чтобы позволить дальнейшее исследование этой проблемы, я также создал копию сервера форума без правила rewrite по адресу https://raw.forum.embeetle.com. Если вы перейдете по этому URL, вы всё ещё увидите исходную проблему.

Я не использую никаких пользовательских скриптов. Я использую некоторые плагины; поэкспериментирую, отключая их, чтобы проверить, есть ли какой-либо эффект.

Вот плагины, которые я использую:

chat уже был отключён.

Я попробовал отключить discourse-math, footnote и spoiler-alert, но проблема сохраняется.

Нашёл: это действительно была проблема с моей конфигурацией nginx, которая теперь случайно добавляла заголовок Content-Security-Policy, слишком строгий для Discourse.

Удаление заголовка Content-Security-Policy решило мою проблему.