Install Discourse for development using Docker

根本原因可能是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 个赞

基于上面的经验,现有能够实现用本地数据库客户端连接DockerpostgreSQL数据库的愿望了。

修改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 个赞

这个安装没有正确显示菜单是正常的吗?