Искренность — источник всякой гениальности (Л. Бёрне).

9 мин для чтенияКак установить несколько контейнеров Discourse на одном сервере

FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
1 апреля 2020
Как установить несколько контейнеров Discourse на одном сервере
Установка 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». Теперь, когда вы посещаете домен в вашем браузере, вы увидите следующую страницу:

Как установить несколько контейнеров Discourse на одном сервере

Discourse установлен

 

13. Настройки SSL

С этого момента процесс регистрации довольно прост. После завершения регистрации в админ-панели Docker перейдите в settings>security и включите «force https».

Как установить несколько контейнеров Discourse на одном сервере

Принудительно 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.

Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Читайте также

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close