Discourse не загружается с Apache и перенаправлением прокси

Последние несколько дней я пытался найти способ запустить Discourse вместе с Apache на одном и том же сервере DigitalOcean, но руководства, доступные здесь, на сайте Discourse, либо устарели, либо не подходят для моей ситуации. В одном руководстве используется CentOS и HAProxy (я использую Ubuntu), а в другом — Nginx (я использую Apache).

Я наткнулся на комментарий в теме на форуме DigitalOcean и следовал инструкциям оттуда на тестовом сервере: Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean

Всё, казалось, прошло гладко, включая получение SSL-сертификата от Let’s Encrypt. Моя главная страница и несколько статических HTML-документов работают отлично. Discourse, несмотря на успешную установку без ошибок, не отображается. При переходе по адресу community.mysite.com я вижу только свою главную страницу, при этом в URL указано незащищённое HTTPS. Да, мои настройки DNS верны и указывают на правильный сервер.

Вот мой файл mysite.com.conf:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.mysite.com [OR]
RewriteCond %{SERVER_NAME} =mysite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Вот мой файл mysite.com-le-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Вот мой файл community.mysite.com.conf:

<VirtualHost *:80>
  ServerName community.mysite.com
  ServerAlias www.community.mysite.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>

И наконец, вот мой файл app.yml (конечно, отредактированный):

## это шаблон автономного контейнера Discourse "всё в одном"
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-файлы ЧРЕЗВЫЧАЙНО чувствительны к ошибкам в отступах или выравнивании!
## для проверки файла обращайтесь на http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Let's Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал тот же порт, что и другой веб-сервер, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для подробностей
expose:
      - "8080:80"   # проброс порта хоста 8080 на порт контейнера 80 (http)
      - "8443:443"   # проброс порта хоста 8443 на порт контейнера 443 (https)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объёма памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, либо вы можете переопределить
  db_shared_buffers: "128MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от объёма памяти и количества ядер CPU.
  ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить
  UNICORN_WORKERS: 2

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: community.mysite.com

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (-h опция), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'myemail'

  ## TODO: SMTP-сервер, используемый для проверки новых аккаунтов и отправки уведомлений
  ## Адрес, имя пользователя и пароль SMTP обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: my-smtp-username
  DISCOURSE_SMTP_PASSWORD: "my-smtp-password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)

  ## Если вы добавили шаблон Let's Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: myemail

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на получение)
  ## см. https://meta.discourse.org/t/14857 для подробностей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для подробностей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для выполнения после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты в поле 'От кого' для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма регистрации закомментируйте строку обратно. Выполнять нужно только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Может ли кто-нибудь сказать, где я ошибся или чего мне не хватает? Спасибо!

У вас гораздо больше шансов добиться успеха, если использовать nginx в качестве обратного прокси-сервера.

Если ваша система это позволяет, рассмотрите возможность использования nginx вместо apache2.

значит, сообщество не перенаправляет на ваш домен, а указывает на ваш IP. Существует ли символическая ссылка в /etc/apache2/sites-enabled/?

Загружен ли модуль proxy?
apache2ctl -M

Символической ссылки нет.

Да. К счастью, это один из шагов в руководстве, на которое я дал ссылку.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

возможно, шаг

a2ensite community.yoursite.com

выполнен некорректно — может потребоваться sudo.
Также можно выполнить:

sudo ln -s /etc/apache2/sites-available/community.yoursite.com.conf /etc/apache2/sites-enabled/

Затем:

sudo apachectl configtest

и скрестим пальцы:

sudo systemctl restart apache2

Уважаемый @OrbitStorm,

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

Вот несколько подсказок:

Во-первых, когда вы запускаете Discourse за обратным прокси-сервером, вы не должны включать SSL LETSENCRYPT в конфигурационном файле yml Discourse (см. рабочий пример ниже). Discourse нуждается только в одном порте для связи с обратным прокси-сервером, и это соединение не должно быть зашифровано с помощью SSL.

Во-вторых, если вы посмотрите на вашу основную конфигурацию виртуального хоста, которая отвечает за порт 443 на обратном прокси-сервере:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

В указанной выше конфигурации отсутствуют все необходимые настройки обратного прокси-сервера (см. прилагаемые рабочие конфигурации ниже).

Вот рабочая конфигурация для вас, которая по сути такая же, как описано в различных руководствах на meta (хорошо документирована на этом сайте в других сообщениях, поэтому это по сути дублирование другой документации здесь, на meta):

<VirtualHost *:80>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On
        ErrorLog ${APACHE_LOG_DIR}/discourse_errors.log
        CustomLog ${APACHE_LOG_DIR}/discourse.log combined
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =discourse.your-great-web-site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Обратите внимание, что в конфигурации порта 80 основными необходимыми директивами являются ServerName, RewriteEngine и правила переписывания для перенаправления на порт 443.

Также, если вы используете mod_pagespeed Apache2, вам следует его отключить, так как я еще не смог заставить mod_pagespeed работать с Discourse (и не вижу в этом необходимости).

Вот основная конфигурация, где выполняется «реальная работа»:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        SSLProxyEngine on      # включите это только после настройки и проверки работы Let's Encrypt
  	    RewriteEngine on
  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/           # мы не используем порт, мы используем сокеты your-great-web-site
        #ProxyPassReverse / http://127.0.0.1:8888/    # мы не используем порт, мы используем сокеты your-great-web-site
        ProxyPass / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        ErrorLog ${APACHE_LOG_DIR}/discourse_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/discourse_ssl.log combined   #лог доступа отключен для продакшена

        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/discourse.your-great-web-site.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/discourse.your-great-web-site.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Все наши конфигурации Discourse используют сокеты Unix-домена, поэтому вам нужно изменить конфигурацию в соответствии с вашими требованиями.

Главный момент, который нужно понять (вкратце), заключается в том, что вы должны отключить LETSENCRYPT в конфигурации сборки Discourse (файл yml) и предоставить только одну точку входа в Discourse: в нашем случае это сокет Unix-домена, в вашем случае — одиночный TCP/IP-сокет.

Затем вы настраиваете обратный прокси к этой точке входа из файла виртуального хоста для порта 443 (не из виртуального хоста порта 80). Виртуальный хост порта 80 просто перенаправляет на порт 443. Весь SSL для порта 443 обрабатывается LETSENCRYPT на уровне обратного прокси-сервера. В вашем файле yml Discourse SSL не требуется (см. рабочий пример ниже).

Вот один из наших рабочих файлов yml (для конфигурации выше), который вы можете изучить:

/var/discourse/containers$ cat socket-only.yml
# ВАЖНО: УСТАНОВИТЕ СЕКРЕТНЫЙ ПАРОЛЬ в Postgres для пользователя Discourse
# TODO: замените SOME_SECRET в этом шаблоне

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
#  - "templates/sshd.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал один порт с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
#  - "80:80"   # http
#  - "443:443" # https

# Используйте ключ 'links' для связывания контейнеров, т.е. используйте флаг Docker --link.
links:
  - link:
      name: data
      alias: data

# Любые дополнительные аргументы для Docker?
# docker_args:

params:
  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: latest
  db_shared_buffers: "4GB"

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер CPU.
  ## будет установлено автоматически при загрузке на основе обнаруженных CPU, или вы можете переопределить
  #UNICORN_WORKERS: 3
  UNICORN_WORKERS: 8

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
  DISCOURSE_HOSTNAME: 'discourse.your-great-web-site.com'

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (-h опция), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'tim@discourse.your-great-web-site.com'

  ## TODO: SMTP-сервер, используемый для проверки новых аккаунтов и отправки уведомлений
  # SMTP ADDRESS, username, и password обязательны
  # ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: not_for_reply@discourse.your-great-web-site.com
  DISCOURSE_SMTP_PASSWORD: my_super_secret_cool_password
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## TODO: настройка подключения к базам данных
  DISCOURSE_DB_SOCKET: ''
  #DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: another_super_secret_cool_password
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data

  DISCOURSE_MAXMIND_LICENSE_KEY: my_max_mind_key
  ## Адрес http или https CDN для этого экземпляра Discourse (настроен для извлечения)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

volumes:
  - volume:
      host: /var/discourse/shared/socket-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/socket-only/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/unixneo/legacy-info.git

## Помните, это синтаксис YAML — у вас может быть только один блок с именем
run:
  - exec: echo "Начало пользовательских команд"

  ## Если вы хотите настроить вход по паролю для root, раскомментируйте и измените:
  ## Используйте только одну из следующих строк:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## Если вы хотите авторизовать дополнительных пользователей, раскомментируйте и измените:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Конец пользовательских команд"
  #- exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Авторизованные SSH-ключи для этого контейнера:"; } NF>=2 {print $NF;}'

Это действительно просто, когда вы понимаете основы; а понимание основ очень помогает :slight_smile:

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

Мы запускаем Discourse как за обратными прокси-серверами Apache2, так и nginx. Фактически, мы используем обратные прокси-серверы по многим причинам. Одна из причин заключается в том, что мы можем использовать обратный прокси-сервер для фильтрации плохих ботов и т.д. (это совершенно отдельная тема).

Запуск Dockerized Discourse (любое количество сайтов, один или 100) за обратным прокси-сервером на сайте с Apache2 не представляет сложности; но полезно понимать основные концепции.

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

С наилучшими пожеланиями…

@neounix Я очень ценю ваш невероятно подробный ответ, но, похоже, большинство проблем, с которыми я сталкиваюсь, возникают из-за невозможности найти подходящий актуальный учебник. В нескольких руководствах здесь рекомендуется включить SSL для Discourse в файле yml, а одно из таких руководств утверждает, что мне не нужно добавлять информацию о прокси в файлы VirtualHost, поскольку Let’s Encrypt должен сделать это автоматически. Ваши примеры радикально отличаются даже от моих настроек по умолчанию, что делает их столь же запутанными, как попытка совместить конфигурацию CentOS с Ubuntu.

Вы абсолютно правы, утверждая, что понимание основ имеет большое значение, но проблема в том, что основы не описаны должным образом, а если они и описаны, то это было три года назад, без учёта того, что кто-то использует Apache вместо Nginx или Ubuntu вместо CentOS. Также стоит отметить, что Discourse — единственная причина, по которой я вообще пользуюсь Docker.

После четырёх дней попыток просто установить приложение вместе с Apache я сдаюсь. Бесплатно или нет, это не стоит головной боли, и я не собираюсь продолжать рыться на форумах, чтобы снова и снова натыкаться на скопированные ссылки на одни и те же два устаревших и неполных руководства. У меня никогда не было столь фрустрирующего опыта с простой установкой программного обеспечения для форумов, пока я не столкнулся с Discourse. Это говорит само за себя. XenForo и Invision — две платформы, с которыми у меня огромный опыт, и их установка и использование — сплошное удовольствие.

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

В любом случае, желаю вам удачи.

Несмотря на полное намерение отказаться от Discourse из-за полного отсутствия текущей документации, которая не была бы сфокусирована исключительно на CentOS/Nginx, невероятно щедрый и терпеливый сотрудник DigitalOcean ответил на созданный мной тред и после некоторых проб и ошибок помог составить простое пошаговое руководство для потенциальных пользователей Discourse, оказавшихся в той же ситуации, что и я.

Напомню, что речь идет о следующих условиях:

Установка Discourse на том же сервере, что и Apache | Использование Ubuntu 18.04 | DigitalOcean

благодарность Bobbyiliev из DigitalOcean
Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean (первый ответ)

Предварительные требования

  • На всякий случай убедитесь, что вы создали резервную копию вашего Droplet, чтобы в случае возникновения проблем можно было вернуться к рабочей версии.
  • Подключитесь к вашему Droplet по SSH.
  • Установлен Apache; вы можете следовать инструкциям по его установке здесь:

Шаг 1 — Установка Docker

Для установки Docker выполните инструкции по ссылке:

Шаг 2 — Загрузка Discourse

Сначала создайте директорию, в которой будут храниться файлы Discourse:

mkdir /var/discourse

Затем клонируйте официальный Docker-образ Discourse в директорию /var/discourse:

git clone https://github.com/discourse/discourse_docker.git /var/discourse

Шаг 3 — Настройка Discourse для прослушивания порта 8080

Мы будем использовать шаблон standalone.yml, который включает все необходимые сервисы, такие как PostgreSQL, Redis и другие.

Скопируйте пример файла следующей командой:

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

Затем откройте файл /var/discourse/containers/app.yml в любимом редакторе и измените порты на строках 23 и 24:

## Какие TCP/IP порты должен открывать этот контейнер?
expose:
  - "8080:80"   # перенаправление порта хоста 8080 на порт контейнера 80 (http)
  - "8443:443"   # перенаправление порта хоста 8443 на порт контейнера 443 (https)

Также, если у вас пока нет SSL-сертификата, обязательно закомментируйте строку 16:

  #- "templates/web.ssl.template.yml"

Просто добавьте символ # перед строкой - "templates/web.ssl.template.yml", иначе Discourse не запустится.

Шаг 4 — Настройка Discourse

Перейдите в директорию:

cd /var/discourse

Затем запустите Discourse (поскольку это первый запуск службы, он выполнит начальную настройку приложения с учетом новых изменений в файле app.yml):

./discourse-setup

Примечание: Убедитесь, что указаны корректные настройки почтового сервера, иначе настройка может завершиться ошибкой.

Шаг 5 — Настройка Apache

В директории /etc/apache2/sites-available/ создайте новый файл с именем forum.example.com.conf и добавьте следующее содержимое виртуального хоста:

<VirtualHost *:80>
  ServerName forum.example.com
  ServerAlias www.forum.example.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>
  • Активируйте виртуальный хост следующей командой:
a2ensite forum.example.com
  • Включите модуль Proxy:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
  • Перезапустите Apache:
systemctl restart apache2

После этого вы сможете получить доступ к Discourse напрямую через доменное имя.


Примечание 1: При установке Discourse файл app.yml может быть перезаписан, и строки 16/17 (SSL) будут раскомментированы. Вам нужно снова закомментировать эти строки, а затем пересобрать приложение (не забудьте сменить директорию): ./launcher rebuild app.

Примечание 2: В данном руководстве SSL для Discourse не включен. Как ни странно, не существует документации по включению SSL Let’s Encrypt, если он уже включен для Apache. Если кто-то найдет решение этой проблемы, пожалуйста, сообщите.