Установка Discourse на CloudPanel

:warning: Этот метод установки официально не поддерживается. Используйте на свой страх и риск.

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

:information_source: Это неподдерживаемая установка, подходящая для тех, кто имеет опыт работы с CloudPanel, является опытным системным администратором, уверенно работает с Docker и обратными прокси, а также успешно выполнил стандартную установку.

Почему CloudPanel

Почему вы можете захотеть установить форум Discourse на VPS или выделенный сервер с CloudPanel?

Вот мои причины:

Я предпочитаю использовать графический интерфейс для администрирования сервера и сайта. Я так или иначе использовал большинство панелей управления веб-хостингом.

По сравнению с остальными, CloudPanel очень лёгкий и минималистичный и не перегружен. В нём есть всё, что мне нужно, представлено очень просто и интуитивно. И всё. В нём нет ничего лишнего.

Я разрабатываю, размещаю и управляю множеством блогов Ghost, сайтов Wordpress, сайтов Drupal и других типов сайтов, а также форумами Discourse. Мне действительно нужен только один сервер, где я могу разместить свои форумы Discourse рядом с блогами Ghost и сайтами Wordpress и Drupal. (Я не хочу платить за отдельный сервер и поддерживать его для каждого экземпляра Discourse.)

CloudPanel включает (из коробки) встроенный Nginx и простой интерфейс для настройки и управления обратными прокси, которые необходимы для запуска одного или нескольких экземпляров Discourse на одном сервере или вместе с другими типами веб-сайтов.

Команда Discourse (и сотрудники форума Meta здесь) не предоставляют поддержку альтернативных серверных сред, таких как Cpanel, Plesk или (как в данном случае) CloudPanel, или других, которые возникают из командной строки.

Поэтому я решил поделиться своей настройкой и процессом на случай, если это окажется полезным для других.

[Если кто-то попробует этот метод, пожалуйста, дайте мне знать, как/работает ли это для вас, или если я могу улучшить это руководство! :heart_eyes: ]

Установка Docker

В Putty (или другом терминале), из корневой директории, выполните:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

Создание сайта с обратным прокси в CloudPanel

→ Нажимаем кнопку + Добавить сайт

Для моего экземпляра Discourse я использую доменное имя noobish.me, поэтому отныне, где бы вы ни увидели его в остальной части этих инструкций, замените noobish.me на ваше реальное доменное имя (например, yoursite.com)

→ Мы создаём новый «Сайт с обратным прокси» в CloudPanel для домена, где мы хотим разместить наш форум Discourse (конечно, A-запись DNS домена должна указывать на тот же IP-адрес, что и наш CloudPanel.)

Подготовка домена и настройка SSL

Для моего сайта я использую имена серверов Cloudflare для указания домена. В Cloudflare я установил SSL в режим Full или Full (strict).

Я также создаю правило страницы Cloudflare. Посетите этот пост, чтобы узнать почему.

Я также использую бесплатный SSL-сертификат Cloudflare Origin Certificate для своего домена, который я «Импортирую» в CloudPanel в настройках сайта «SSL/TLS» для этого сайта (просто вставив и сертификат, и закрытый ключ, которые я загрузил для этого доменного имени из своей учётной записи Cloudflare.)

Установка Discourse

Вернитесь в Putty (или другой терминал), из корневой директории (c d Enter, чтобы вернуться в корень) → Установите стандартную установку Discourse с помощью этих команд…

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

Enter

cd /var/discourse

Enter

chmod 700 containers

Копирование конфигурации Standalone

Теперь мы копируем файл /var/discourse/standalone.yml в /var/discourse/containers/ как app.yml перед его редактированием в соответствии с настройками нашего сайта.

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

Редактирование файла app.yml

Помимо изменения файла app.yml в соответствии с нашими конкретными настройками сайта, нам нужно изменить ещё 3 вещи в этом файле перед сохранением…

В разделе templates: нам нужно добавить:

  - "templates/web.socketed.template.yml"

Поскольку я использую Cloudflare, в разделе templates: я также добавляю:

  - "templates/cloudflare.template.yml"

В разделе expose: нам нужно закомментировать:

  #- "80:80"   # http
  #- "443:443" # https

В разделе env: нам нужно добавить:

   DISCOURSE_FORCE_HTTPS: true
Для справки, вы можете нажать сюда, чтобы увидеть содержимое моего рабочего app.yml на noobish.me, где я использую и Cloudflare, и Mailgun...
## это шаблон контейнера Docker Discourse all-in-one, standalone
##
## После внесения изменений в этот файл вы ДОЛЖНЫ выполнить пересборку
## /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"
  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

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

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

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

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

  DISCOURSE_FORCE_HTTPS: true

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

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

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

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

  ## TODO: SMTP-сервер почты, используемый для проверки новых учётных записей и отправки уведомлений
  ## SMTP ADDRESS, username и password обязательны
  # WARNING символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (требуется некоторыми провайдерами)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (адрес для отправки уведомлений)

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

  ## Ключ IP-адреса геолокации Maxmind для поиска IP-адресов
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер 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 "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты 'From' для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации закомментируйте строку снова. Это нужно выполнить только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Затем мы сохраняем и выходим из файла app.yml…

CTRL-X

y

Enter

Далее мы устанавливаем права доступа для файла app.yml…

chmod o-rwx containers/app.yml

затем…

Запуск приложения (Bootstrap)

cd /var/discourse
./launcher bootstrap app

Это займёт значительное время. В конце процесса запуска вам будет предложено:

./launcher start app

Редактирование файла Vhost

Теперь мы возвращаемся в CloudPanel и вставляем код ниже в «Редактор Vhost» для нашего сайта Discourse (заменяя то, что там уже есть). Конечно, замените yoursite.com на ваше реальное доменное имя.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  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 $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

Перезапуск Nginx

Далее нам нужно перезапустить Nginx, что можно сделать, нажав кнопку в административной панели CloudPanel…

Поздравляем!

Теперь в нашем браузере мы можем перейти к URL нашего сайта и запустить мастер настройки Discourse…

Мирное сосуществование

Теперь я могу самостоятельно размещать и управлять своим сайтом Discourse рядом с моими сайтами Ghost, Wordpress, Drupal и другими типами сайтов, используя чистую и лёгкую панель управления, с минимальной необходимостью в будущем использовать терминал/командную строку.


Чтобы установить дополнительные экземпляры Discourse…

3 лайка

Вам следует удалить эти шаги и создать файл app.yml, не вызывая этой ошибки. Это запутывает.

(Если вы собираетесь заменить весь файл, зачем копировать пример?) Лучше указать, что нужно изменить в существующем образце. Похоже, речь идёт о шаблоне сокета и принудительном HTTPS.

Это приводит к наличию двух копий PostgreSQL, что потребляет больше оперативной памяти, чем одна копия. Это работает, но не является лучшей практикой.

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

3 лайка

Спасибо @pfaffman

Вы правы. Это работает, но процедура слишком запутанная. Она выполнена в неправильном порядке. Я ценю ваши предложения и исправлю это.

Не могли бы вы уточнить, почему вы так считаете?

Потому что это сложно, и это хорошая идея только для тех, кто может разобраться в этом самостоятельно. Это довольно расточительно, и если цель — просто запустить два дискурса, то в большинстве случаев два отдельных виртуальных сервера (VM) — это более дешёвое и простое решение.

2 лайка

Ещё раз спасибо, @pfaffman — я упростил процедуру и убрал раздел о добавлении второго сайта Discourse на тот же сервер.

1 лайк

Я получил это сообщение:

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
usage: gpg [options] --dearmor [file]
curl: (23) Failed writing body

Почему?

Привет, Антонио. Добро пожаловать.

Похоже, это проблема с Docker, а не с Discourse. Скорее всего, вам будет эффективнее поискать решение, указав вашу ОС и обновив docker-ce, чем задавать вопрос здесь.

Вы пытаетесь использовать Discourse или CloudPanel?

1 лайк

Я только что следовал руководству здесь. Я выполнил первую команду для установки Docker, и сервер ответил вот так
команда:

1 лайк

В конце каждой из этих строк не должно быть обратных слешей. Обратный слэш экранирует символ новой строки, из-за чего оболочка воспринимает следующую строку как продолжение текущей.

В данном случае это приводит к попытке выполнить всё как одну команду, что и вызывает ошибку:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable"

Просто уберите обратные слэши в конце строк — это решит проблему:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
2 лайка

спасибо, теперь всё работает нормально

2 лайка

Спасибо @Simon_Manning — я убрал обратные слеши в фрагменте кода в руководстве в первом сообщении.

2 лайка

Извините, у меня теперь такая ошибка: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** пожалуйста, прокрутите вверх и найдите сообщения об ошибках, появившиеся ранее; их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

Я не знаком с CloudPanel, но сообщения об ошибке, похоже, говорят сами за себя:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"

Похоже, что ваш email не был настроен во время выполнения ./discourse-setup или в файле app.yml (вы можете отредактировать его вручную в любое время). :thinking:

2 лайка

Прошу прощения у всех, я преподаватель в школе Ферми и пытаюсь установить сообщество Discourse для нашей школы. Поскольку мы используем облачные панели, я следовал этому руководству, но, похоже, чего-то не хватает. Возможно ли получить помощь и более подробное руководство? Большое спасибо.

1 лайк

Я думаю, что использование расширенной установки может быть не тем, что вам нужно, если у вас нет достаточных знаний в системном администрировании. Ещё один важный момент: такая установка попадает в категорию unsupported-install, что снижает вероятность получения помощи здесь, если у вас возникнут проблемы.

Если у вас есть бюджет и в зависимости от размера вашего сообщества, возможно, лучше разместить Discourse на другом сервере и следовать стандартной процедуре установки.

1 лайк

Извините, но для чего нужен такой сервис? На мой взгляд, возможно, руководство недостаточно подробное. Оно предназначено для системных администраторов, и достаточно было бы просто указать различные шаги. У нас говорят: никто не рождается уже образованным. Спасибо за вашу помощь и ваше время.

1 лайк

Совершенно верно. Именно поэтому была рекомендована стандартная установка.

И вот почему, @denvergeeks, я изначально не считал хорошей идеей создание подобного руководства. Его сложно написать, сложно поддерживать, и только вы можете его проверить.

4 лайка

Извините, но я не согласен. Я уже использую Cloud Panel с различными доменами, к тому же сообщество Discourse будет размещено на поддомене, и предпосылка автора становится вполне очевидной (руководство предназначено для тех, кто использует Cloud Panel с различными сервисами, установленными на VPS). Нужно лишь немного усилий, чтобы всё описать более подробно. В конце концов, обмен знаниями — это основа сообществ, иначе я бы купил уже готовое и установленное программное обеспечение. В любом случае я не хочу никого беспокоить: если возможно получить помощь, то спасибо; если нет, я больше не буду вас беспокоить.

1 лайк

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

Мне кажется, стоит заменить разделы «Установка Discourse» и «Инициализация приложения» на что-то более близкое к следующему:

Установка и настройка Discourse

Следуйте стандартной установке до шагов 1–6

Выполните действия, описанные сейчас в разделе «Редактирование файла app.yml»

Пересоберите Discourse:

./launcher rebuild app

Затем в разделе «Поздравляем!» добавьте после скриншота строку вроде: «Продолжите работу, следуя остальной части документации по стандартной установке». По сути, нужно переработать руководство, добавив шаги, которые дополняют стандартную установку, вместо того чтобы предлагать альтернативные инструкции по установке.

Я считаю, что предоставленная вами информация о CloudPanel очень полезна, а инструкции понятны. Сторона Discourse просто выиграет от меньшего отклонения от стандартной установки, что сделает процесс безопаснее, а также от добавления тега unsupported-install, чтобы более явно предупредить: здесь могут быть подводные камни.

2 лайка

Обсуждение немного ушло от исходной темы, но будьте уверены: мы рады помочь. :slight_smile:

Подводя итог:

Если у вас есть базовые знания в области ИТ, вы можете следовать стандартной инструкции по установке. Вам также понадобится доменное имя и настройка сервиса отправки электронной почты, например Mailgun (инструкция здесь: Configure Mailgun for email when using Digital Ocean for DNS).

Обратите внимание: мы обычно не помогаем по вопросам, выходящим за рамки этого форума. Например, вопрос «Как зарегистрировать доменное имя?» здесь не уместен.

Если у вас нет базовых знаний в области ИТ, в зависимости от вашего бюджета вы можете запросить платную поддержку в канале Marketplace.

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

Также знайте, что мы предоставляем скидки для образовательных целей, поскольку вы упомянули, что это для вашей школы:

Есть ли скидки для образовательных или некоммерческих организаций?

Да! Если вы официально признаны образовательным учреждением, мы предлагаем скидку 85%. Если вы официально признаны некоммерческой организацией, освобождённой от федеральных налогов, мы предлагаем скидку 50%. Эти скидки действуют только на наши базовые, профессиональные и бизнес-планы, не суммируются с другими скидками и должны оплачиваться ежемесячно или ежегодно с помощью дебетовой/кредитной карты. Пожалуйста, свяжитесь с нами после начала пробного периода, и мы добавим скидку на ваш счёт.

4 лайка