Если вы хотите разместить другие веб-сайты на том же сервере, где работает Discourse, вам необходимо настроить дополнительный прокси NGINX или HAProxy перед контейнером Docker.
ПРИМЕЧАНИЕ: Это для опытных администраторов
В этом руководстве предполагается, что у вас уже работает Discourse — в противном случае может быть сложно определить, работает ли конфигурация правильно.
Вы не можете использовать ./discourse-setup для настройки Discourse, если другой сервер уже использует порты 80 или 443. Вам нужно будет скопировать и отредактировать файл samples/standalone.yml с помощью вашего любимого текстового редактора.
Установка nginx вне контейнера
Сначала убедитесь, что контейнер не запущен:
cd /var/discourse
./launcher stop app
Затем установите nginx и certbot:
sudo apt-get update && sudo apt-get install nginx certbot python3-certbot-nginx
Изменение определения контейнера
Здесь мы меняем способ настройки Discourse. Мы не хотим, чтобы контейнер прослушивал порты — вместо этого мы заставим его прослушивать специальный файл.
Вам нужно отредактировать /var/discourse/containers/app.yml, чтобы отключить SSL и добавить шаблон для создания сокета nginx. Он должен выглядеть так:
# используемые базовые шаблоны; можно сократить, чтобы уменьшить функциональность в шаблонах контейнеров:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
# - "templates/web.ssl.template.yml" # удалить — HTTPS будет обрабатываться внешним nginx
# - "templates/web.letsencrypt.ssl.template.yml" # удалить — HTTPS будет обрабатываться внешним nginx
- "templates/web.socketed.template.yml" # <-- Добавлено
Обязательно удалите или закомментируйте открытые порты, поставив # в начале строки.
# какие порты открыть?
# expose: закомментируйте весь раздел, поставив # в начале каждой строки
# - "80:80" # http
# - "443:443" # https
Теперь вы можете выполнить
/var/discourse/launcher rebuild app
чтобы пересобрать Discourse и сделать его данные доступными через сокет.
Если вы используете другой обратный прокси, который не поддерживает веб-сокеты, вы можете вместо этого открыть другой порт в разделе выше, например - 8080:80.
Создание «сайта» NGINX для внешнего nginx
Создайте файл сайта для Discourse:
cd /etc/nginx/sites-available
cp default discourse.example.com
cd ../sites-enabled
ln -s ../sites-available/discourse.example.com
Далее отредактируйте этот файл, закомментировав следующие строки:
#listen 80 default_server;
#listen [::]:80 default_server;
и изменив блок server_name и location следующим образом:
server_name discourse.example.com; # <-- измените это
location / {
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
Если вы используете установку с двумя контейнерами, строка сокета будет такой:
proxy_pass http://unix:/var/discourse/shared/web-only/nginx.http.sock:;
Затем в терминале выполните:
certbot --nginx
И следуйте инструкциям. Если вы не понимаете вопросы, скорее всего, вам не следует это делать, но вы можете обратиться к документации certbot за помощью.
@pfaffman считает, что certbot сделает это за вас, но если вы внесете изменения в конфигурацию nginx, вам нужно будет выполнить
sudo service nginx reload
Создание других сайтов
Раздел по настройке Discourse завершён!
Создайте другие NGINX «сайты», затем свяжите и включите их, как в последнем шаге выше.
Советы
sudo netstat -tulpn: эта команда покажет, какие порты используются/var/log/nginx/error.log: это расположение журнала nginx в Ubuntu. Здесь вы найдёте информацию об ошибке, если получите ошибку 502 Bad Gateway.