【问题标题】:GCP Postgres refusing connection from App Engine nodejsGCP Postgres拒绝来自App Engine nodejs的连接
【发布时间】:2021-12-30 03:50:22
【问题描述】:

我正在关注Strapi on CGP App Engine (nodejs- standard env) 的教程,但无法启动应用程序,因为 GCP Postgres 实例(公共 IP)拒绝连接 Error: connect ECONNREFUSED 127.0.0.1:5432

为什么我很困惑

  1. GCP 服务原则权限:<project_name>@appspot.gserviceaccount.comCloud SQL Client 具有 App Engine default service account,因此这应该适用于所有 App Engine 服务。
  2. 我有其他 App Engine 服务 (python) 成功连接到其他 Postgres 数据库。这告诉我我拥有正确的权限、启用了Cloud SQL Admin API 以及正确的用户名/密码。
  3. 链接 GCP Postgres 数据库时,代码在本地 (Docker) 工作,但仅使用 TCP 路由,而不是 Unix Socket SQL 代理:
../../cloud_sql_proxy -instances=<project_name>:europe-west1:<sql_instance_name>=tcp:5432 & (sleep 5 && yarn strapi start)

我可以登录本地托管的 Strapi 应用、添加用户等,所做的更改会反映在 GCP Postgres 数据库中。

  1. 本地部署 (docker-compose.yml) 和应用引擎 (app.yml) 之间的唯一区别是我如何设置环境变量。
#Dockerfile
FROM node:14-buster

RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && apt-get update -y && apt-get install google-cloud-sdk -y
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
#docker-compose.yml
version: "3.8"
services:
  dev:
    build: .
    ports:
      - "1337:1337"
    volumes:
      - .:/src
    command: ["yarn", "run", "start"]
    working_dir: /src
    environment:
      NODE_ENV: "production"
      DATABASE_NAME: '<database name>'
      DATABASE_USERNAME: '<username>'
      DATABASE_PASSWORD: '<password>'
      INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'
# app.yml
runtime: nodejs14
instance_class: F2
service: strapi
env_variables:
  HOST: '0.0.0.0'
  NODE_ENV: 'local'
  DATABASE_NAME: '<database name>'
  DATABASE_USERNAME: '<username>'
  DATABASE_PASSWORD: '<password>'
  INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'

beta_settings:
  cloud_sql_instances: '<project_name>:europe-west1:<instance_name>'

在 nodejs 项目中定义连接的代码,来自 Strapi 教程:

module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
        database: env('DATABASE_NAME'),
        username: env('DATABASE_USERNAME'),
        password: env('DATABASE_PASSWORD'),
      },
      options: { }
    },
  },
});

我错过了什么?我还能检查什么?请有人帮我结束这种疯狂。

【问题讨论】:

    标签: node.js postgresql google-app-engine strapi


    【解决方案1】:

    为我解决了以下问题:

    1. 转到我的应用引擎默认服务主体并为其赋予以下角色(如here 所述)
    • 云 SQL 客户端
    • 云 SQL 编辑器
    • 云 SQL 管理员
    1. 在以下默认连接设置中,将 socketPath 键更改为 'host'

    module.exports = ({ env }) => ({
      defaultConnection: 'default',
      connections: {
        default: {
          connector: 'bookshelf',
          settings: {
            client: 'postgres',
            ----> socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
            database: env('DATABASE_NAME'),
            username: env('DATABASE_USERNAME'),
            password: env('DATABASE_PASSWORD'),
          },
          options: { }
        },
      },
    });

    【讨论】:

    • 不幸的是,改变并没有什么不同。 Strapi/bookshel/Knex 的文档都建议使用socketPath,但来自 Cloud SQL 的文档有一个使用host 的示例。
    • 好的,我将 Strapi 恢复到 3.6.6 并更改为主机确实有效。这是一个令人沮丧的现实。
    • @Jørgen 我正在运行的版本是 3.6.8 社区版
    • 谢谢,我会升级再试一次。
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2018-11-22
    • 2018-07-03
    相关资源
    最近更新 更多