Возможно, мне придется разделить это на три отдельных сообщения, но они связаны, поэтому я начну с одного.
Несколько дней назад я использовал этот учебник (How to Scale a Discourse Deployment with a Load Balancer and Managed Database Cluster | DigitalOcean) практически слово в слово и перенес свой отдельный Droplet с Discourse на Digital Ocean на два Droplet внутри балансировщика нагрузки. Пока всё хорошо.
Затем я прошел по этому руководству (Configure an S3 compatible object storage provider for uploads), но после пересборки Discourse из командной строки мой сайт Discourse отображал только пустой экран. Я проверил в инспекторе браузера и обнаружил, что браузер блокирует весь мой контент, так как он предоставляется через HTTP, а не HTTPS. Вероятно, это связано с тем, что балансировщик нагрузки выполняет SSL-терминацию, поэтому весь внешний трафик идет по HTTPS, но сами серверы работают на HTTP.
На этом этапе я снова полностью сломал свои серверы, пытаясь заставить их работать с HTTPS внутри балансировщика нагрузки, но это оказалось просто невозможным. Я не мог заставить Digital Ocean Space/CDN работать с S3/CDN согласно этому руководству (Configure an S3 compatible object storage provider for uploads). Я внимательно изучил его, проверив каждый аспект несколько раз, но ничего не получилось. Единственный способ заставить Discourse пересобраться — удалить параметр DISCOURSE_S3_ENDPOINT: https://sfo3.digitaloceanspaces.com из файла app.yml, но даже после успешной сборки сервер не отвечал. Я получал либо ошибку 503 (сервер не отвечает), либо обычную ошибку браузера «сервер не отвечает» или «сервер отключился». Это зависело от настроек балансировщика нагрузки и DO Space/CDN, которые я пробовал. Я перепробовал все возможные комбинации настроек, но ни одна из них не позволяла отобразить страницу.
Когда я оставил параметр DISCOURSE_S3_ENDPOINT, во время пересборки Discourse возникла следующая ошибка, которая исчезла, когда я закомментировал параметр S3_ENDPOINT:
Aws::S3::Errors::InvalidAccessKeyId: Aws::S3::Errors::InvalidAccessKeyId
Все мои файлы были синхронизированы с S3, поэтому я считаю, что ключ доступа был в порядке, и проблема была вызвана каким-то образом параметром S3_ENDPOINT.
Сегодня я отказался от попыток заставить предыдущую попытку работать, восстановил резервную копию своих Droplet, которые просто балансировали нагрузку только через HTTP, и наконец снова заставил всё работать, выполнив это руководство (Set up file and image uploads to S3), но на этот раз я изменил настройки S3 через панель администратора Discourse, а не редактировал файл app.yml с настройками, рекомендованными в учебнике. В конце концов всё заработало, но важное отличие заключается в том, что я намеренно пропустил настройки CDN S3. Я подтвердил, что изображения, загруженные в сообщения, хранятся на S3, и я могу делать резервные копии Discourse напрямую в S3, и это всё, что мне нужно. Однако теперь у меня есть три проблемы, которые меня беспокоят: одна критическая, а две другие можно игнорировать, хотя я бы хотел подтвердить это здесь, если возможно.
Итак, критическая проблема заключается в том, что пользователи больше не могут входить в систему с помощью кнопки входа Patreon на странице входа Discourse. Отображается следующее сообщение:
К сожалению, произошла ошибка при авторизации вашей учетной записи. Пожалуйста, попробуйте снова.
URL-адрес выглядит так:
https://mbp.community/auth/failure?message=invalid_credentials&origin=https%3A%2F%2Fmbp.community%2Flogin&strategy=patreon
Мне очень пригодится совет о том, что можно попробовать, чтобы заставить это работать, но снова задаюсь вопросом, не связано ли это с тем, что внутри серверы не работают на HTTPS. Как видно из URL-адреса, внешне они используют HTTPS, поэтому точно сказать сложно. Надеюсь, кто-то здесь имеет опыт работы с балансировкой нагрузки Digital Ocean и Discourse.
Две другие проблемы сейчас отмечаются в консоли администратора следующим образом:
Некоторые рекомендации на основе текущих настроек вашего сайта
- Ваш сайт использует SSL. Но
[force_https](https://mbp.community/admin/site_settings/category/all_results?filter=force_https)еще не включен в настройках сайта. - Сервер настроен на загрузку файлов в S3, но CDN S3 не настроен. Это может привести к высоким затратам на S3 и снижению производительности сайта. Подробнее см. «Использование объектного хранилища для загрузок».
Так что я не против попробовать включить force_https, но боюсь, что это заблокирует мне доступ к серверу, поскольку внутри балансированные серверы не работают на HTTPS, и из-за проблем, с которыми я столкнулся вчера, я не хочу тратить еще двенадцать часов, биться головой о стену, наблюдая за бесконечными 15-минутными пересборками Discourse, которые ни к чему не приводят. Если кто-то знает, что безопасно включить force_https с моими конфигурациями, пожалуйста, сообщите об этом.
Что касается второй проблемы, то она также не удалась при добавлении параметров в файл app.yml, поэтому я не хочу пробовать это снова. Можете ли вы подтвердить, что это будет Essentially то же самое, что и параметры, добавленные в файл app.yml? Если да, то я просто проигнорирую это второе сообщение. И наоборот, если это безопасно попробовать по какой-то причине, дайте знать, и я сделаю резервную копию и попробую.
Извините за длинный пост. Надеюсь, вы поймете, в чем я нуждаюсь в совете.