Настройка Discourse на локальном сервере: проблемы с PostgreSQL и скриптом настройки

Здравствуйте, сообщество Discourse!

Я новичок в Docker и задачах системного администрирования Linux в целом. Я пытаюсь убедить свою компанию использовать Discourse, и они попросили сначала провести демонстрацию. Поэтому я пытаюсь запустить его на наших серверах.

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

Конфигурация системы:

  • Операционная система: Ubuntu 20.04.6 LTS
  • Версия Docker: 24.0.5, сборка 24.0.5-0ubuntu1~20.04.1
  • Версия Discourse: 3.2

Проблема:
Я следовал официальному руководству по установке Discourse на облачный сервер (discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub), но сталкиваюсь с ошибками в скрипте discourse-setup, связанными с PostgreSQL.

Предпринятые шаги:

  1. Я подтвердил, что PostgreSQL запущен, проверив список процессов.
  2. Я убедился, что PostgreSQL прослушивает правильный порт (5432) и что файл Unix-сокета существует.
  3. Я столкнулся с ошибками, указывающими на то, что база данных “discourse” и пользователь уже существуют, но при проверке с помощью команды psql ни база данных, ни пользователь не были перечислены.

Вот команды, которые я использовал:

  • Проверка процессов PostgreSQL: ps aux | grep postgres
  • Проверка порта прослушивания PostgreSQL: sudo netstat -plunt | grep postgres
  • Проверка файла Unix-сокета: ls -l /var/run/postgresql/.s.PGSQL.5432
  • Попытка удалить базу данных “discourse” и пользователя: su postgres -c 'psql -c "DROP DATABASE IF EXISTS discourse;"' и su postgres -c 'psql -c "DROP USER IF EXISTS discourse;"'
  • Список баз данных и пользователей: psql -c "\l" и psql -c "\du"

Полученные ошибки:

  • ERROR: database "discourse" already exists
  • ERROR: role "discourse" already exists
  • psql: error: FATAL: role "root" does not exist

Несмотря на эти ошибки, база данных “discourse” и пользователь, похоже, не существуют при прямой проверке в PostgreSQL.
В логах есть и другие ошибки, но я считаю, что эти являются наиболее важными, по крайней мере на данный момент.

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

Заранее спасибо за помощь,
Андреа

Вам не нужно устанавливать PostgreSQL. При стандартной установке у Discourse есть свой собственный PostgreSQL внутри контейнера. Я рекомендую удалить или деинсталлировать PostgreSQL. Есть ли у вас причина использовать существующий PostgreSQL? Что ещё работает на этой машине?

Я не думаю, что это ошибки, скорее сообщения отладки.

Что было написано в конце скрипта?

Привет, @pfaffman,
спасибо за ответ.

Нет, эта машина выделена под Discord, я установил PostgreSQL только после того, как заметил эти ошибки.

Хотел бы я прикрепить лог, но пока не могу.

Вот его завершающая часть:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  if [ $(git rev-parse --is-shallow-repository) == "true" ]; then
      git remote set-branches --add origin main
      git remote set-branches origin tests-passed
      git fetch --depth 1 origin tests-passed
  else
      git fetch --tags --prune-tags --prune --force origin
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"code", "cmd"=>["sudo -H -E -u discourse git reset --hard", "sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  if [ $(git rev-parse --is-shallow-repository) == \"true\" 
]; then\n      git remote set-branches --add origin main\n      git remote set-branches origin $version\n      git fetch --depth 1 origin $version\n  else\n      git fetch --tags --prune-tags --prune --force origin\n  fi\n'", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

Сейчас я попробую удалить PostgreSQL.

Спасибо,
Андреа

У вас закончилась память. Нужно добавить swap-файл и/или добавить оперативной памяти.

Что выводит команда

free -h

?

У меня есть примерно 7 ГБ свободной памяти:

              total        used        free      shared  buff/cache   available
Mem:          7.8Gi       319Mi       599Mi        13Mi       6.9Gi       7.1Gi
Swap:         975Mi       2.0Mi       973Mi

В руководстве рекомендуется около 2 ГБ.

По умолчанию 1 ГБ оперативной памяти достаточно для небольших сообществ Discourse. Для более крупных сообществ мы рекомендуем 2 ГБ оперативной памяти.

Неужели я что-то упускаю?

Хм, это странно. В последнее время сообщают о некоторых странных проблемах с требованиями к оперативной памяти. Попробуйте запустить процесс ещё несколько раз. Некоторые сообщения указывают на то, что сбои происходят периодически.

Редактирование: извините. 127 — это оперативная память, 128 — неизвестно.

Вы выполняете стандартную установку с нуля с помощью команды discourse-setup? (Вы упоминаете об этом в исходном посте.)

Находитесь ли вы за каким-либо брандмауэром, который может препятствовать доступу сервера к GitHub и другим репозиториям?

Да, верно, я следую руководству GitHub.
Если проблема не в PostgreSQL, а в последнем сообщении, вот точка в логе, где происходит сбой:

  set -o errexit
  if [ $(git rev-parse --is-shallow-repository) == "true" ]; then
      git remote set-branches --add origin main
      git remote set-branches origin tests-passed
      git fetch --depth 1 origin tests-passed
  else
      git fetch --tags --prune-tags --prune --force origin
  fi
'
fatal: unable to access 'https://github.com/discourse/discourse.git/': server certificate verification failed. CAfile: none CRLfile: 
none

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

Это проблема с сетью Docker. Как вы установили Docker? Попробуйте удалить его и установить другим способом.

Есть ли у вас брандмауэр в ОС или в сети? Это также может быть проблема с DNS. Как говорят, это всегда DNS.

Я знаю, что на данный момент в ОС нет брандмауэра, но по вопросам установки Docker мне нужно проконсультироваться с IT-отделом.
Есть ли у вас какие-либо предположения, с какой проблемой DNS мы можем столкнуться? Есть ли какие-либо разделы логов или отладочные сообщения, которые могли бы помочь (я всё ещё не могу прикреплять файлы)?

@pfaffman понял, что у меня тоже были эти детали в истории команд оболочки.

   63  sudo apt install docker.io
   64  sudo apt remove containerd runc
   65  sudo apt remove containerd
   66  curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
   67  echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
   68  sudo apt update
   69  sudo apt install docker-ce
   70  sudo apt upgrade
   71  sudo apt install docker.io

Я не думаю, что можно установить одновременно docker-ce и docker.io. Возможно, стоит удалить оба пакета, а затем установить только один из них.

Обычно я использую https://get.docker.com/. Я бы создал новую виртуальную машину и использовал только этот метод.