【问题标题】:PostgREST on Google Cloud SQL: unix socket URI format?Google Cloud SQL 上的 PostgREST:unix 套接字 URI 格式?
【发布时间】:2020-03-05 11:40:39
【问题描述】:

你们中的任何人都有 PostgREST 和 Cloud SQL 方面的经验吗?

我的 SQL 实例已准备好开放访问 (0.0.0.0/0),我可以使用云代理应用程序通过本地 PostGREST 访问它。

现在我想从同一个项目的一个实例中运行 Postgrest,但是 我找不到支持 Cloud SQL 格式的 Postgrest URI 格式,如 Google SQL Cloud 仅使用像 /cloudsql/INSTANCE_CONNECTION_NAME 这样的 unix 套接字

配置 1

db-uri = "postgres://postgres:password@/unix(/cloudsql/INSTANCE_CONNECTION_NAME)/mydatabase"
db-schema = "api"
jwt-secret = "OOcJ7VoSY1mXqod4MKtb9WCCwt9erJkRQ2tzYmLb4Xe="
db-anon-role = "web_anon"
server-port=3000

返回{"details":"could not translate host name \"unix(\" to address: Unknown host\n","code":"","message":"Database connection error"}

配置 2

db-uri = "postgres://postgres:password@/mydatabase?unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME"
db-schema = "api"
jwt-secret = "OOcJ7VoSY1mXqod4MKtb9WCCwt9erJkRQ2tzYmLb4Xe="
db-anon-role = "web_anon"
server-port=3000

解析器拒绝问号 {"details":"invalid URI query parameter: \"unix_socket\"\n","code":"","message":"Database connection error"}

配置 3

db-uri = "postgres://postgres:password@/mydatabase"
db-schema = "api"
jwt-secret = "OOcJ7VoSY1mXqod4MKtb9WCCwt9erJkRQ2tzYmLb4Xe="
db-anon-role = "web_anon"
server-port=3000
server-unix-socket= "/cloudsql/INSTANCE_CONNECTION_NAME"

server-unix-socket 似乎只采用套接字锁定文件路径。喂它/cloudsql/INSTANCE_CONNECTION_NAME 尝试删除文件,如 `postgrest.exe: /cloudsql/INSTANCE_CONNECTION_NAME: DeleteFile "/cloudsql/INSTANCE_CONNECTION_NAME": invalid argument t(文件名、目录名或卷标语法不正确。)

文档

云 SQL 文档

PostgREST

环境

  • PostgreSQL 版本:11
  • PostgREST 版本:6.0.2
  • 操作系统:Win10 和 Alpine

【问题讨论】:

  • 你试过了吗:postgres//<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432,或者host而不是unix_sock
  • 试试看:db-uri = postgres:///user@/dbname(无密码)。此外,server-unix-socket 只是一个网络服务器设置,而不是一个 pg 连接设置。我建议先尝试使用psql <db-uri> 的连接字符串。如果 db-uri 正确,它也可以与 PostgREST 一起使用。
  • 你得到这个工作了吗@j-dumont?我尝试了 steve chavez 方法,但默认为 /var/postgresql/.s.PGSQL.5432 但我找不到自定义套接字位置的方法,因为该位置是由 cloudrun 硬编码的。

标签: google-cloud-sql unix-socket postgrest


【解决方案1】:

首先,您必须将 Cloud SQL 连接添加到 Cloud Run 实例: https://cloud.google.com/sql/docs/postgres/connect-run#configuring

之后,数据库连接将在路径 /cloudsql/<cloud_sql_instance_connection_name> 的 Unix 域套接字上的服务中可用,您可以设置 PGRST_DB_URI 环境变量来反映这一点。

以下是正确的格式: postgres://<pg_user>:<pg_pass>@/<db_name>?host=/cloudsql/<cloud_sql_instance_connection_name>

例如 postgres://postgres:postgres@/postgres?host=/cloudsql/project-id:zone-id-1:sql-instance

【讨论】:

  • 我认为这会使成本翻倍
  • @confiq 为什么会这样?
  • 我认为这有点误会,我认为您的解决方案是运行将执行代理的外部云运行实例!文件夹/cloudsql是在云运行和云功能中生成的,所以不需要添加实例!我的错!
【解决方案2】:

根据Connecting with CloudSQL,例子是:

# postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql//.s.PGSQL.5432

然后你可以试试(正如@marian.vladoi 提到的):

db-uri = "postgres://postgres:password@/mydatabase?unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432"

请记住,连接名称应包括:

ProjectID:Region:DatabaseName

例如:myproject:myregion:myinstance

无论如何,您可以在这里找到connect from external applications 和from within Google Cloud 的更多选项。

【讨论】:

【解决方案3】:

我尝试了很多变体,但无法让它开箱即用,但我会发布这个解决方法。

FWIW 我能够在本地使用带有 postgrest 的备用套接字位置,但是当尝试使用 cloudsql 位置时,它似乎无法正确解释它 - 也许套接字路径中的冒号将其丢弃?

在任何情况下,正如@Steve_Chávez 提到的,这种方法确实有效db-uri = postgres:///user:password@/dbname 并且默认为 postgrest 默认套接字位置 (/run/postgresql/.s.PGSQL.5432)。因此,在 docker 入口点中,我们可以将此位置符号链接到 Cloud Run 注入的实际套接字。

首先,将以下内容添加到Dockerfile(USER 1000 上方):

RUN mkdir -p /run/postgresql/ && chown postgrest:postgrest /run/postgresql/

然后在/etc/entrypoint.bash添加一个可执行文件,其中包含:

set -eEux pipefail

CLOUDSQL_INSTANCE_NAME=${CLOUDSQL_INSTANCE_NAME:-PROJECT_REGION_INSTANCE_NAME}
POSTGRES_SOCKET_LOCATION=/run/postgresql

ln -s /cloudsql/${CLOUDSQL_INSTANCE_NAME}/.s.PGSQL.5432 ${POSTGRES_SOCKET_LOCATION}/.s.PGSQL.5432 
postgrest /etc/postgrest.conf

将 Dockefile 入口点更改为 CMD /etc/entrypoint.sh。然后在云运行中添加CLOUDSQL_INSTANCE_NAME 作为环境变量。 PGRST_DB_URI 环境变量就像postgres://authenticator:password@/postgres

如果您不喜欢这种方式,另一种方法是通过serverless vpc connector 进行连接。

【讨论】:

    【解决方案4】:

    我也为此苦苦挣扎。

    我最终为 DB-URI 环境变量做了一个单行

    host=/cloudsql/project-id:zone:instance-id user=user port=5432 dbname=dbname password=password
    

    但是,我在云运行上运行了 postgrest,它允许您通过以下方式指定实例连接名称

    INSTANCE_CONNECTION_NAME=/cloudsql/project-id:zone:instance-id

    也许你可以在那里托管它,你最终会做无服务器我不确定你目前在哪里运行它。

    https://cloud.google.com/sql/docs/mysql/connect-run

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2015-05-20
      • 1970-01-01
      • 2021-03-27
      • 2019-12-15
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多