Dockerを使用して開発用にDiscourseをインストールする

根本的な原因は、pg15でデフォルトの認証ルールが変更されたことかもしれません。

設定ファイルパス: /etc/postgresql/15/main/pg_hba.conf

ファイルの内容は以下の通りです:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# \"local\" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::/0 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

実行されたバックアップコマンドは次のとおりです:

pg_dump --schema=public -T public.pg_* --file=‘/src/tmp/backups/default/2026-02-02-063003/dump.sql.gz’ --no-owner --no-privileges --verbose --compress=4 --username=postgres discourse_development

上記のコマンドがエラーになるのは、local all postgres peer ルールが原因です: Peer authentication failed for user "postgres"

解決策: peerをtrustに変更し、ローカル環境からのすべてのコマンドを許可します。つまり、すべてのコマンドで検証(パスワード入力も不要)が不要になります。

具体的な手順:

  1. コンテナ内の/etc/postgresql/15/main/pg_hba.confをローカルにコピーします

sudo docker cp discourse_dev:/etc/postgresql/15/main/pg_hba.conf ~/discourse/data/pg_hba.conf

権限を644に変更します

sudo chmod 644 ~/discourse/data/pg_hba.conf

data/pg_hba.confの設定を変更します

# Database administrative login by Unix domain socket
local   all   postgres   trust
  1. d/boot_devファイルを変更し、data/pg_hba.confをコンテナにマウントして、pgのデフォルト設定ファイルを上書きします。
docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    -v \"$DATA_DIR:/shared/postgres_data:delegated\" \
    # 下記の行が追加されたもので、設定ファイルをコンテナにマウントし、コンテナには読み取り専用権限のみを付与します
    -v \"$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro\" \
    -v \"$SOURCE_DIR:/src:delegated\" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot
  1. 現在のコンテナを停止・削除し、新しいコンテナを再構築します
d/shotdown_dev
d/boot_dev
  1. 再構築後、フロントエンドとバックエンドのアプリケーションを起動し、バックアップが正常に機能するかテストします
d/rails s

# 別のコマンドラインで実行
d/ember-cli

バックアップページで、バックアップをクリックし、数秒待ってからバックアップファイルリストを確認します。

「いいね!」 1

これまでの経験に基づき、ローカルデータベースクライアントからDocker内のPostgreSQLデータベースに接続するという要望が実現可能になりました。

d/boot_devファイルの設定を以下のように変更します。

docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    # ポートマッピングを追加
    -p $local_publish:55432:5432 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # 設定ファイルのマップを維持
    -v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot

すべてのpgへの接続リクエストを許可します。

data/pg_hba.confファイルの設定を以下のように変更します。

# IPv4 local connections:
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::/0 trust

再構築

d/shutdown_dev
d/boot_dev

これでローカルデータベースクライアントから接続できるようになりました

私はDBeaverを使用しています。

  1. データベースポート番号は55432で、d/boot_devと一致させています。ローカルでの競合を避けるために55432にしています。
  2. データベース名
  3. 「すべてのデータベースを表示」にチェックを入れることを推奨します
  4. ユーザー名
  5. 接続テストをします
  6. 確定をクリックして保存します

これで、ローカルでデータベース内のデータを快適に確認できるようになりました。

「いいね!」 1

このインストールでメニューが正しく表示されないのは正常ですか?

こんにちは。Ubuntu 26.04 のマシンでこのチュートリアルに従ったところ、すべてが正常に動作しているように見えますが、メールが送信されていないようです。

専用ターミナルで d/mailhog を起動し、テストユーザーの登録後に送信されたメールの HTML/CSS コードは確認できましたが、指定したメールアドレスには何も届きません…

何が間違っていたのでしょうか?また、どのように修正すればよいでしょうか?:folded_hands:

メールは http://localhost:8025 に表示されるはずです(MailHog のポートです)。

これは本番環境のインストールではないため、インターネットを介してメールは送信されません。そのためには、完全な本番環境のインストールと、互換性のあるメールサービスが必要です(最近では、信頼性を管理するコストがかかるため、通常は実際の費用がかかります :money_bag:)。

「いいね!」 1

@merefield ありがとうございます。localhost:8025 は確かに確認していたのですが、なぜか動作しませんでした。今は問題なく動作しています。

「いいね!」 1

この解決策は機能しますか?d/boot_dev --init の先へ進めませんでした。

更新:
わかりました。discourse_dev コンテナ内の discourse ユーザーのように、開発者の UID が 1000 でない場合、これは機能しないようです。

uid=1000(discourse) gid=1000(discourse) groups=1000(discourse)

私が直面した一連の問題
nastee@station ~/vendsrc/discourse > ./d/boot_dev --init
Using source in: /home/nastee/vendsrc/discourse
Using data in:   /home/nastee/vendsrc/discourse/data/postgres
release: Pulling from discourse/discourse_dev
.....
Digest: sha256:e118af085d4be0486d4d9bfa83ac1c519d9975bed9a08180d10d5ad7c508632c
Status: Downloaded newer image for discourse/discourse_dev:release
docker.io/discourse/discourse_dev:release
f517752802e70b8a9110972bb3ddc0e9343d0c430603e4a9ae3eacc5ec69a2cf
Installing gems...
There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path.

参考: There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path - #2 by jacque006

そのファイルを 777 に設定しました(いやらしいですが)。そうすると、少なくとも Gems のインストールは進むようになりました。しかし、次の docker exec プロセスがソースディレクトリに書き込もうとした際に失敗しました。なぜなら、それが私のユーザーとして実行されていないからです。エラーは以下の通りです:

 EACCES  EACCES: permission denied, open '/src/_tmp_82_62be1aeb82e80c1d1054dac8bdbc5923'

仕方ないので、sudo chmod 4777 . を実行しました。ここで「.」は d/ を実行しているクローンされたソースディレクトリです。

その結果、以下のようなエラーになりました:

 EACCES  Error while trying to symlink "../../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier" to "/src/docs/developer-guides/node_modules/prettier". The error happened while trying to create the parent directory for the symlink target. Details: Error: EACCES: permission denied, mkdir '/src/docs/developer-guides/node_modules'

さらに別の権限エラーに遭遇し、結局 chmod 777 -R . を実行して諦めました。

最終的に以下のようなエラーに至りました:

connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory