Аватары, логотипы сайтов и ошибки сертификатов

Что говорит лог production.log (в запущенном Docker-контейнере), когда вы пытаетесь войти с ошибкой (при этом force_https=true)?

@RGJ – Мне нравится ваше решение! Нужно ли мне принудительно включать HTTPS с помощью последнего предложения? Касательно proxy_pass https.
РЕДАКТИРОВАНИЕ: Я получаю ошибку 502, если просто использую proxy_pass https://192.168.86.108.
РЕДАКТИРОВАНИЕ 2: Я закрыл порт 80 в Discourse через app.yml, но это всё равно не работало — я только что перечитал ваш пост. Есть ли у контейнера Discourse собственный экземпляр Nginx? То есть, по сути, я передаю прокси прокси? Извините, я сейчас действительно запутался.

@itsbhanusharma, мне закомментировать 80:80 #http и последовать совету @RGJ, используя proxy_pass https?

Почему вы не следуете здесь поддерживаемому процессу для мультисайта? Вы по сути изобретаете очень хрупкое колесо.

Сейчас предоставлено так много ссылок, @Stephen, что я растерялся и не могу во всём этом разобраться. Я думал, что следую поддерживаемым процессам. Разве комментарии выше не поддерживаются? :pensive:

Да, потому что вы не использовали force_https, отсюда и тег unsupported-install выше. Если вы отклоняетесь от поддерживаемого пути, вы не получите особой помощи.

Начните здесь:

Существует отдельное руководство по обработке инкапсуляции SSL для многосайтовых конфигураций.

Итак, стандартный контейнер работает только с http? Как то, что я пытаюсь сделать, связано с несколькими сайтами? Я не пытаюсь разместить несколько доменов, у меня один домен. Не могли бы вы прояснить, как это решает мою проблему?

Что вы имели в виду, сказав:

Я уже настроил серверы Discourse примерно в 5 случаях, и все они проявляют странное поведение; не уверен, действительно ли это ошибка или у кого-то ещё был подобный опыт.

Независимые инфраструктуры, никак не связанные друг с другом.
Но все с очень похожими настройками, как указано выше.

Так почему же nginx вообще проксирует хост? Что ещё происходит на машинах?

У нас есть несколько ВМ, которые не доступны извне; трафик маршрутизируется через прокси (который доступен извне) к внутренней ВМ Discourse. Аналогичная ситуация в каждой из отдельных установок. Это проясняет?

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

Я считаю, что правильное сочетание решений было следующим:

Как указал @itsbhanusharma:
РЕДАКТИРОВАТЬ /var/discourse/containers/app.yml и изменить порты на пользовательские, я использовал:

- "8080:80" #http
- "4343:443" #https

Выполнил ./launcher rebuild app

Затем я изменил наш внешнедоступный прокси-сервер для перенаправления запросов с 80/443 на http://internal_ip:8080.

После выполнения sudo nginx -t и sudo systemctl restart nginx я вошел в систему на сервере https://discourse.mobiusnode.io (который все еще демонстрировал вышеуказанные проблемы) и включил force_https, после чего, похоже, все начало работать.

Теперь я собираюсь воспроизвести это на оставшихся серверах/инфраструктурах.

Во вложении — окно инкогнито с входом на сайт с активным SSL-ключом, отображаются изображения и т. д.

Чтобы прояснить ситуацию: это не то, что я предлагал.

Я лишь попросил вас открыть порт 80 на локальном IP-адресе и завершить SSL-соединение на вашем обратном прокси-сервере.

Так, не использовать SSL на моем внешнем прокси, а перенаправлять обычные http-запросы на сервер Discourse и позволить force_https обрабатывать эти запросы? Как тогда передается сертификат? Через первый экземпляр Nginx? Вот здесь у меня всё ломается.

Что ж, главное, чтобы это работало, и вы могли бы чисто восстановить или обновить систему. Похоже, вы уже делаете то, что предложил @itsbhanusharma в своём последнем сообщении.

Если вы используете один IP-адрес для нескольких SSL-соединений, на передней панели вашего прокси-сервера должен быть установлен SAN-сертификат. Если сеть защищена, все остальное за ней может быть не зашифровано.

Для Discourse необходимо включить параметр force_https, если пользователь подключается через SSL, и вам нужно убедиться, что упомянутый выше заголовок сохраняется и передаётся дальше.

Нет, существует технология под названием SNI (указание имени сервера).

Я прекрасно понимаю, но раз все сертификаты выдаются Let’s Encrypt, какой смысл запрашивать отдельные сертификаты? Let’s Encrypt поддерживает SAN, так почему бы не использовать эту возможность?