Установка Discourse действительно проста, когда на сервере есть только один экземпляр Discourse. Ситуация усложняется, если вы хотите установить несколько экземпляров Discourse на одном сервере, чтобы снизить затраты.
Официальная установка Discourse не соответствует обычной практике Docker. Сначала установщик Discourse выполняет процедуру начальной загрузки, которая выглядит как процедура установки хоста. После завершения процесса начальной загрузки программа запуска запускает контейнер с именем «app».
Такая гибридная процедура установки отличается, когда дело доходит до настройки с другими веб-сервисами и приложениями, такими как WordPress.
В этой статье мы покажем вам, как установить несколько установок Discourse вместе с другими приложениями, основанными на Docker, на одном сервере Linux. Это совсем не сложно, если вы знакомы с основами командной строки Docker и Linux.
Установка нескольких форумов Discourse на одном сервере
В общем, конфигурация с несколькими Discourse понимается как конфигурация с несколькими сайтами.
Официально Discourse не предоставляет документацию для нескольких установок Discourse на одном сервере. Но не волнуйтесь. Мы покажем вам процесс установки 3-5 отдельных отдельных контейнеров, работающих под Nginx, причем каждый отдельный контейнер соответствует своему соответствующему домену.
В этой статье используем Ubuntu 18.04. Пожалуйста, убедитесь, что у вас установлен Docker в Ubuntu или в любом дистрибутиве Linux, который вы используете.
Предлагаем использовать поставщика облачного сервера, такого как Linode, для быстрого развертывания сервера Linux в облаке.
Используем domain.ru в качестве примера доменного имени в статье. Пожалуйста, убедитесь, что вы изменили его в соответствии со своими доменами или поддоменами.
1. Измените записи DNS вашего домена
Убедитесь, что на панели записей DNS вашего поставщика доменных имен домен и субдомены (включая www) указывают на IP-адрес вашего сервера.
Например, для корневого домена оставьте поле имени хоста пустым (или @), а для поддоменов используйте подстановочный знак ‘*’ при настройке IP-адреса сервера.
2. Поменять местами
Чтобы все ваши контейнерные приложения работали легко и никогда не исчерпывали память после их развертывания, важно, чтобы в вашей системе было необходимое пространство подкачки.
Вы всегда можете настроить swap в зависимости от доступной оперативной памяти в вашей системе. Вы можете выбрать пространство подкачки на основе пакета контейнеров приложений на одном сервере и оценки их совокупного использования ОЗУ. Discourse также проверяет и настраивает swap для вас.
3. Создайте сеть Docker
Докерная сеть позволит контейнерам связываться друг с другом по мере необходимости. Давайте назовем это цепочкой для лучшего понимания.
Вы будете использовать эту сеть при настройке всех ваших контейнеров.
docker network create chain
4. Настройте обратный прокси Nginx
Теперь приступите к настройке обратного прокси Nginx. Обратите внимание, что он действует как интерфейс, который отображает все различные порты контейнера на себя, чтобы вы могли получить к ним доступ через URL-адреса. Вы также можете называть его «материнским контейнером».
docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy
5. Настройка Let’s Encrypt Nginx Proxy Companion
Обратите внимание, что мы говорим docker использовать тома, которые уже объявлены в первом контейнере nginx-proxy. Он использует ту же «цепную» сеть, которую вы создали на шаге 3.
docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion
Этот сопутствующий контейнер для nginx-proxy заботится о настройке SSL-сертификатов с помощью Let’s Encrypt . Вы увидите это при окончательной настройке контейнеров Discourse.
6. WWW Redirection через Nginx (CNAME не требуется, необязательный шаг для использования поддоменов)
Чтобы обеспечить перенаправление запросов domain.ru на www.domain.ru, как и на любой другой сайт, вам необходимо выполнить еще один шаг.
Введите контейнер nginx-proxy:
docker exec -ti nginx-proxy /bin/bash
Теперь вы увидите приглашение root, например:
root@8d04249cc62c:/app#
Помните местоположение /etc/nginx/vhost.d, которое я упоминал в шаге 4? Создайте здесь новый файл, который будет совпадать с именем вашего корневого домена. У вас нет Vim или Nano здесь. Вместо установки Vim или Nano, использовать кошачью команду .
cat >> /etc/nginx/vhost.d/domain.ru
При следующей подсказке все, что вы напишите, будет редактировать файл. Поэтому убедитесь, что вы заменили www.domain.ru своим собственным доменом в следующей строке:
rewrite ^/(.*)$ https://www.domain.ru/$1 permanent;
Нажмите ввод, а затем Ctrl + D, чтобы сохранить его. Введите выход, чтобы выйти из контейнера.
root@8d04249cc62c:/app# exit
Давайте остановим все вышеупомянутые контейнеры (в указанном порядке), которые вы создали до сих пор. Вы не будете использовать перезагрузку, просто запустите их снова, так как вы не хотите, чтобы другие контейнеры слушали при перезапуске каждого из них.
docker stop nginx-proxy docker stop letsencrypt-nginx-proxy-companion docker start nginx-proxy docker start letsencrypt-nginx-proxy-companion
7. Клонировать официальное изображение Discourse Docker
Согласно официальному руководству, клонируйте официальный образ докера дискурса в каталог / var / discourse. Здесь Discourse может сохранять все свои тома Docker, принадлежащие соответствующим контейнерам после установки.
sudo -s git clone https://github.com/discourse/discourse_docker.git /var/discourse cd /var/discourse
8. Скопируйте автономную конфигурацию
Теперь следующий шаг – убедиться, что вы скопировали файл /var/discourse/standalone.yml в / var / discourse / container / как app.yml, прежде чем редактировать его в соответствии с вашими требованиями.
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml
Типичный standalone.yml выглядит следующим образом.
9. Подготовьте автономную конфигурацию
Теперь вам нужно отредактировать этот файл, потому что ваша конфигурация будет основана на nginx.
Порты 80 и 443 уже используются одним и тем же. У вас также есть наш контейнер letsencrypt, и вы должны показать Discourse вашей существующей сети Docker, в которую вы хотите его вставить.
При настройке домена здесь вам также понадобится почтовый сервер для настройки уведомлений на форуме (мы использовали здесь Sendgrid ).
Обратите внимание, что LETSENCRYPT_EMAIL (для уведомления об обновлениях SSL) и DISCOURSE_DEVELOPER_EMAILS (для администратора) могут отличаться при необходимости.
nano /var/discourse/containers/app.yml
10. Настройте автономную конфигурацию
Ниже приводится мой отредактированный файл, переименованный в app.yml для демонстрационных целей. Рекомендуется отредактировать свой собственный файл yml, чтобы избежать проблем с выравниванием.
это универсальный, автономный шаблон контейнера Docker Discourse # После внесения изменений в этот файл необходимо выполнить перестройку /var/discourse/launcher rebuild app # БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ! ФАЙЛЫ YAML ОЧЕНЬ ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ! visit http://www.yamllint.com/ to validate this file as needed templates: "templates/postgres.template.yml" "templates/redis.template.yml" "templates/web.template.yml" "templates/web.ratelimited.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 for details expose: - "80" #- "80:80" # http #- "443:443" # https docker_args: - "--net chain" params: db_default_text_search_config: "pg_catalog.english" ## Установите значение db_shared_buffers не более чем на 25% от общего объема памяти. ## будет установлен автоматически bootstrap на основе обнаруженной оперативной памяти, или вы можете переопределить #db_shared_buffers: "256MB" ## может повысить производительность сортировки, но добавляет использование памяти для каждого соединения #db_work_mem: "40MB" ## Какую версию Git должен использовать этот контейнер? (по умолчанию: тесты-пройдены) #version: tests-passed env: LANG: en_US.UTF-8 # DISCOURSE_DEFAULT_LOCALE: en ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер процессора. ## будет установлен автоматически bootstrap на основе обнаруженных процессоров, или вы можете переопределить #db_shared_buffers: "256MB" ## может повысить производительность сортировки, но добавляет использование памяти для каждого соединения #db_work_mem: "40MB" ## Какую версию Git должен использовать этот контейнер? (по умолчанию: тесты-пройдены) #version: tests-passed env: LANG: en_US.UTF-8 # DISCOURSE_DEFAULT_LOCALE: en ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер процессора. ## будет установлен автоматически bootstrap на основе обнаруженных процессоров, или вы можете переопределить #UNICORN_WORKERS: 3 ## TODO: доменное имя, на которое будет реагировать этот экземпляр дискурса ## Discourse не будет работать с голым IP-номером. DISCOURSE_HOSTNAME: 'domain.ru' VIRTUAL_HOST: 'domain.ru,www.domain.ru' LETSENCRYPT_HOST: 'domain.ru,www.domain.ru' LETSENCRYPT_EMAIL: 'email@domain.ru' ## Раскомментируйте, если вы хотите, чтобы контейнер был запущен с тем же самым именем ## hostname (-h option) как указано выше (default "$hostname-$config") #DOCKER_USE_HOSTNAME: true ## TODO: список писем, разделенных запятыми, которые будут сделаны администратором и разработчиком ## на примере начальной регистрации 'user1@example.com,user2@example.com' DISCOURSE_DEVELOPER_EMAILS: 'email@domain.ru' ## TODO: почтовый сервер SMTP, используемый для проверки новых учетных записей и отправки уведомлений # Требуются SMTP-адрес, имя пользователя и пароль # Предупреждение символ '#' в пароле SMTP может вызвать проблемы! DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net DISCOURSE_SMTP_PORT: 587 DISCOURSE_SMTP_USER_NAME: apikey DISCOURSE_SMTP_PASSWORD: yourpassword DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true) ## Если вы добавили шаблон Lets Encrypt, раскомментируйте его ниже, чтобы получить бесплатный SSL-сертификат #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com ## Адрес CDN http или https для этого экземпляра дискурса (настроенный для вытягивания) ## смотрите https://meta.discourse.org/t/14857 for details #DISCOURSE_CDN_URL: https://discourse-cdn.example.com The Docker container is stateless; all data is stored in /shared volumes: volume: host: /var/discourse/shared/standalone guest: /shared volume: host: /var/discourse/shared/standalone/log/var-log guest: /var/log Plugins go here see https://meta.discourse.org/t/19157 for details hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/discourse/docker_manager.git Any custom commands to run after building run: exec: echo "Beginning of custom commands" ## Если вы хотите установить адрес электронной почты " От " для вашей первой регистрации, раскомментируйте и измените: ## после получения первого письма регистрации, повторно прокомментируйте строку. Он должен работать только один раз. #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'" exec: echo "End of custom commands"
Дважды проверяет следующие детали:
Конфигурация порта должна быть:
expose: - "80" # - "80:80" # http # - "443:443" # https
Существующее имя сети правильно настроено в файле, как показано выше.
docker_args: - "--net chain"
В противном случае вы увидите пустую страницу при проверке домена после установки.
12. Начальная загрузка и запуск
После сохранения вышеуказанного файла выполните следующие команды:
cd /var/discourse ./launcher bootstrap app
Это займет значительное количество времени. В конце процесса начальной загрузки вам будет предложено:
./launcher start app
Обратите внимание, что если бы вы назвали файл xyz.yml, команда изменилась бы соответствующим образом (./launcher start xyz).
Это имя запущенного контейнера, которое вы можете проверить с помощью «docker ps». Теперь, когда вы посещаете домен в вашем браузере, вы увидите следующую страницу:
13. Настройки SSL
С этого момента процесс регистрации довольно прост. После завершения регистрации в админ-панели Docker перейдите в settings>security и включите «force https».
После сохранения остановите контейнер и запустите его снова:
./launcher stop app ./launcher start app
Через несколько секунд SSL начнет работать на вашем форуме. Убедитесь, что вы также позаботились о зависимостях для https.
14. Установите больше экземпляров Discourse в более автономных контейнерах.
Для большего количества контейнеров Discourse вы должны повторить тот же процесс снова, начиная с шага 8 .
Изначально вы использовали приложение. Теперь вы должны использовать другие имена, такие как app2, app3 и т. д.
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
Также потребуется дополнительный шаг для каждого из них, чтобы указать новое местоположение (скажем, standalone2, standalone3 и т. д.) В соответствующих файлах yml для томов Docker (см. Шаг 10). Конечно, вам придется изменить доменное имя.
## Контейнер Docker не имеет состояния; все данные хранятся в /shared volumes: volume: host: /var/discourse/shared/standalone2 guest: /shared volume: host: /var/discourse/shared/standalone2/log/var-log guest: /var/log
После этого выполните остальные шаги, и на том же сервере будет установлено больше Discourse.
Надеюсь, вы найдете эту статью полезной при настройке нескольких форумов Discourse с соответствующими контейнерами Docker.
Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.