1

如果不更改设置中的任何内容,我将无法连接到托管在 Heroku 上的 PostgreSQL 数据库。我无法在我的应用程序中访问它,并且出现错误

OperationalError: (psycopg2.OperationalError) FATAL:  password authentication failed for user "<heroku user>" FATAL:  no pg_hba.conf entry for host "<address>", user "<user>", database "<database>", SSL off

它说 SSL 关闭,但正如我在 PgAdmin 中确认的那样,这是启用的。当尝试通过 PgAdmin 4 访问数据库时,我遇到了同样的问题,说用户 '' 错误存在致命密码身份验证。

我已经检查了 Heroku 上数据库的凭据,但没有任何改变。难道我做错了什么?我必须改变一些东西pg_hba.conf吗?

编辑:我可以在 Heroku 上的通知中看到,数据库在数据库停止为我工作时已更新。但是,我不确定我是否触发了更新。

这是通知中心:

4

2 回答 2

0

一般来说,在连接到 Heroku Postgres 时硬编码凭据不是一个好主意

不要将数据库凭据复制并粘贴到单独的环境或应用程序代码中。数据库 URL 由 Heroku 管理,在某些情况下会发生变化,例如:

  • 用户启动的数据库凭证轮换使用heroku pg:credentials:rotate.
  • 需要 Heroku Postgres 员工在新硬件上恢复数据库的灾难性硬件故障。
  • 需要 Heroku Postgres 员工轮换数据库凭据的安全问题或威胁。
  • 启用HA的计划上的自动故障转移事件。

最佳实践是在应用程序启动时始终从相应的 Heroku 应用程序中获取数据库 URL 配置变量。例如,您可以使用Heroku CLI遵循12Factor 应用程序配置原则,并像这样调用您的流程:

DATABASE_URL=$(heroku config:get DATABASE_URL -a your-app) your_process

这样,您可以确保您的进程或应用程序始终具有正确的数据库凭据。

根据您屏幕截图中的消息,我怀疑您受到了第二个子弹的影响。不管是什么原因,其中一条消息明确表示

完成后,您的数据库 URL 将更改

于 2020-06-16T20:42:23.613 回答
0

我遇到过同样的问题。感谢@Chris,我以这种方式解决了它。该文件位于 config/database.js (Strapi 3.1.3)

var parseDbUrl = require("parse-database-url");

if (process.env.NODE_ENV === 'production') {
  module.exports = ({ env }) => {
    var dbConfig = parseDbUrl(env('DATABASE_URL', ''));
    return {
      defaultConnection: 'default',
      connections: {
        default: {
          connector: 'bookshelf',
          settings: {
            client: dbConfig.driver,
            host: dbConfig.host,
            port: dbConfig.port,
            database: dbConfig.database,
            username: dbConfig.user,
            password: dbConfig.password,
          },
          options: {
            ssl: false,
          },
        },
      },
    }
  };
} else {
  // to use the default local provider you can return an empty configuration
  module.exports = ({ env }) => ({
    defaultConnection: 'default',
    connections: {
      default: {
        connector: 'bookshelf',
        settings: {
          client: 'sqlite',
          filename: env('DATABASE_FILENAME', '.tmp/data.db'),
        },
        options: {
          useNullAsDefault: true,
        },
      },
    },
  });
}
于 2020-08-06T15:25:41.007 回答