PostgREST в Google Cloud SQL: формат URI сокета unix?

Кто-нибудь из вас имеет опыт работы с PostgREST и Cloud SQL?

У меня есть готовый экземпляр SQL с открытым доступом (0.0.0.0/0), и я могу получить к нему доступ с помощью локального PostGREST с помощью прокси-приложения Cloud.

Теперь я хочу запустить Postgrest из экземпляра того же проекта, но я не могу найти формат URI для Postgrest, который поддерживает формат Cloud SQL, поскольку Google SQL Cloud использует только сокеты unix, такие как /cloudsql/INSTANCE_CONNECTION_NAME

Конфигурация 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 ": недопустимый аргумент t (неверное имя файла, имя каталога или синтаксис метки тома.)

Документация

Документ Cloud SQL

PostgREST

Окружающая среда

  • Версия PostgreSQL: 11
  • Версия PostgREST: 6.0.2
  • Операционная система: Win10 и Alpine

person J Dumont    schedule 05.03.2020    source источник
comment
Вы пробовали: postgres//<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432 или, может быть, host вместо unix_sock   -  person marian.vladoi    schedule 05.03.2020
comment
Попробуйте так: db-uri = postgres:///user@/dbname (без пароля). Кроме того, server-unix-socket является только настройка веб-сервера, а не настройка подключения к Интернету. Я предлагаю сначала попробовать строку подключения с psql <db-uri>. Если db-uri правильный, он также будет работать с PostgREST.   -  person Steve Chavez    schedule 06.03.2020
comment
у тебя это работает @ j-dumont? Я попробовал подход Стива Чавеса, но по умолчанию это /var/postgresql/.s.PGSQL.5432, но я не могу найти способ настроить местоположение сокета, поскольку местоположение жестко задано Cloudrun.   -  person eamon1234    schedule 28.07.2020


Ответы (4)


Согласно Подключение к 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

В любом случае, здесь вы можете найти дополнительные параметры для подключения из внешних приложений и из Google Cloud.

person Community    schedule 19.03.2020
comment
Братан, спасибо! меня устраивает. Учтите, что если пароль содержит специальные символы, вам необходимо удалить декабрь.com/html/spec. /esccodes.html - person delta1020; 10.07.2021

Я перепробовал множество вариантов, но не смог заставить его работать сразу же, но я опубликую этот обходной путь.

FWIW Я смог использовать альтернативное расположение сокета с postgrest локально, но затем при попытке использовать местоположение cloudql он, похоже, не интерпретирует его правильно - возможно, двоеточия в пути к сокету отбрасывают его?

В любом случае, как упоминает @ Steve_Chávez, этот подход действительно работает db-uri = postgres:///user:password@/dbname и по умолчанию используется расположение сокета postgrest по умолчанию (/run/postgresql/.s.PGSQL.5432). Итак, в точке входа докера мы можем символически связать это местоположение с фактическим сокетом, введенным Cloud Run.

Сначала добавьте следующее в над Docker3file :

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 в качестве переменной env в облачном режиме. PGRST_DB_URI env var выглядит так postgres://authenticator:password@/postgres

Альтернативный подход, если вам это не нравится, - подключение через бессерверный соединитель vpc.

person eamon1234    schedule 28.07.2020

Я тоже боролся с этим.

Я заканчиваю тем, что делаю однострочник для переменной env DB-URI

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

Однако у меня есть postgrest, работающий в облаке, который позволяет вам указать имя подключения экземпляра через

INSTANCE_CONNECTION_NAME = / cloudsql / идентификатор-проекта: зона: идентификатор-экземпляра

Может быть, вы можете разместить его там, и в конечном итоге вы сделаете это без сервера. Я не уверен, где вы его сейчас запускаете.

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

person Benjamin Gil    schedule 28.08.2020

Сначала вам нужно добавить подключение Cloud SQL к экземпляру Cloud Run: https://cloud.google.com/sql/docs/postgres/connect-run#configuring

После этого вы можете установить переменную среды PGRST_DB_URI для нового развертывания.

Вот правильный формат: postgres://<pg_user>:<pg_pass>@/<db_name>?host=/cloudsql/<cloud_sql_instance_connection_name>

e.g. postgres://postgres:postgres@/postgres?host=/cloudsql/project-id:zone-id-1:sql-instance

person Andras Hegedus    schedule 11.11.2020
comment
Я думаю, это удвоит расходы - person confiq; 06.07.2021