Postgres, похоже, не запущен при запуске Discourse локально с помощью Docker

Для моей компании необходимо разработать некоторые функции, используя REST API нашего экземпляра Discourse. Для локальной разработки и тестирования я уже довольно долгое время успешно следую инструкции по адресу Install Discourse for development using Docker.

Прошло несколько недель с тех пор, как я последний раз занимался разработкой. Вчера я хотел снова запустить Discourse локально и выполнил привычную команду git pull && d/boot_dev && d/bundle install && d/rails s. Однако последняя команда d/rails s завершается ошибкой:

URGENT: Failed to initialize site default: ActiveRecord::ConnectionNotEstablished connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

/home/discourse/.bundle/gems/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:69:in `rescue in new_client'
[...]

Когда я открываю терминал внутри контейнера discourse_dev и выполняю ls -la /var/run/postgresql/, я вижу, что файла сокета .s.PGSQL.5432 здесь действительно нет.

Хорошо, я подумал, что, возможно, не стоит было слепо выполнять git pull в первую очередь, поэтому я переключился на тег v4.4.0 и даже на тег v3.3.0 и попытался снова. Но я получаю точно такую же ошибку.

Мне кажется, что база данных Postgres не запущена внутри контейнера discourse_dev?

Странно то, что если я клонирую репозиторий discourse в новую папку (даже с последним кодом из ветки main) и запущу Discourse с помощью Docker, этой ошибки не возникает, и Discourse успешно запускается.
Но, разумеется, в этом случае база данных пустая, что немного неудобно. Я понимаю, что данные сохраняются внутри tmp/postgres, и их можно скопировать из старой папки в новую. Но сделать это уже невозможно, так как я не знал об этом вчера, и в своих вчерашних попытках устранения неполадок я удалил все временные папки, а также папки node_modules и .pnpm-store и так далее. Однако проблема сохраняется.

Есть ли у кого-нибудь идея, что здесь происходит, или что я могу сделать для устранения неполадок?

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

Когда я выполняю sudo cp -pr discourse/data/postgres discourse2/data/postgres, возникает та же проблема при попытке запуска Discourse из папки discourse2. Наоборот, если я удаляю discourse/data/postgres, мой оригинальный экземпляр Discourse запускается нормально, но, конечно, без данных :frowning:

Извините за неудобства. Скорее всего, это связано с недавним обновлением: PostgreSQL 15 update. Старые файлы данных PG 13 несовместимы с образом discourse_dev, который теперь использует PG 15, однако наша автоматизированная процедура обновления базы данных не предназначена для сред разработки.

Есть ли какая-то конкретная причина, по которой вы хотите сохранить старые файлы данных?

Вы можете выполнить команду rake dev:populate внутри контейнера, чтобы сгенерировать тестовые данные.

Не используйте эту инструкцию. Её нужно обновить или удалить.

Используйте эту: Developing Discourse using a Dev Container

О, это имеет огромный смысл. Большое спасибо за объяснение. Я узнал(а), что в любом случае это плохая идея — бездумно выполнять git pull в ветке main, так как можно случайно сломать многое :slight_smile:

Только из-за некоторых настроек администратора, в частности касающихся Discourse Connect. Также настроек REST API, настроек некоторых плагинов и некоторых конкретных ручных групп пользователей. У нас есть специфическая настройка SSO, которая управляет категориями и группами пользователей (+ членство в группах) через REST API. Я вообще не беспокоюсь о фактическом содержимом, таком как сообщения и ответы, во время разработки, поэтому, полагаю, rake dev:populate мне не поможет.

Никаких обид.

Если ваш тестовый или продакшн-сайт уже обновлён до PostgreSQL 15, вы можете восстановить резервную копию оттуда.

В качестве альтернативы вы можете попробовать обновить вручную локальные файлы данных. Это может помочь:

cd discourse
mkdir data/postgres_new
docker run --rm \
	--entrypoint=/bin/bash \
	-v "$(pwd)/data/postgres":/var/lib/postgresql/13/data \
	-v "$(pwd)/data/postgres_new":/var/lib/postgresql/15/data \
	tianon/postgres-upgrade:13-to-15 \
	-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
	docker-upgrade"
mv data/postgres data/postgres_old
mv data/postgres_new data/postgres
docker run --rm -v "$(pwd)/data/postgres":/postgres \
discourse/discourse_dev:release chown -R postgres:postgres /postgres

(Если вы используете процессор на базе архитектуры ARM, вам придётся собрать свой собственный образ.)

Огромное спасибо за ваш конструктивный ответ!
Это пригодится, когда я и мои коллеги обновим локальный экземпляр Discourse до версии новее 3.4.0.

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