首页 > 解决方案 > Google App Engine Rails Postgres 无法连接到 Cloud SQL 数据库:没有这样的文件或目录

问题描述

我有一个应该通过 Google Cloud App Engine 托管的 Rails 应用程序。它有一个 Postgres 数据库设置。我遵循了本教程:https ://cloud.google.com/ruby/rails/using-cloudsql-postgres

我在 app.yaml 中添加了所有配置:

entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby

env_variables:
  SECRET_KEY_BASE: [SECRET_KEY]

beta_settings:
  cloud_sql_instances: [INSTANCE]

和database.yml:

production:
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  username: postgres
  password: [DB_PASSWORD]
  database: [DB_DATABASE]
  host: /cloudsql/[INSTANCE]

Cloud SQL 实例设置正确,因为我可以使用 Cloud SQL 代理连接到它:https ://cloud.google.com/sql/docs/postgres/connect-admin-proxy

部署到 App Engine 并尝试迁移后,出现以下错误:

PG::ConnectionBad: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/cloudsql/[INSTANCE]/.s.PGSQL.5432"?

这也发生在本地运行的代理并尝试

RAILS_ENV=production rake db:create rake db:migrate

当我通过 SSH 连接到 App Engine 的虚拟机时,我看到 /cloudsql 文件夹丢失了。我仔细检查了,访问权限应该在那里,并且启用了 Cloud SQL API 和 Cloud SQL Admin API。我还注意到,当通过 SSH 连接到 App Engine 的虚拟机(显然有两个,我都尝试过)并运行 ls 时,目录完全是空的。部署工作虽然我可以访问应用程序,但不能访问需要数据库连接的控制器。

标签: ruby-on-railspostgresqlgoogle-app-enginegoogle-cloud-sql

解决方案


我遵循了这个旧的但解释得更好的GCP 教程(本教程旨在使用云 shell),我意识到必须在本地环境(在另一个终端或后台)上运行 Cloud SQL 代理

Cloud sql 代理将创建 unix 套接字文件

Listening on /cloudsql/tetsingfakeproject:us-central1:testdatabase ce/.s.PGSQL.5432 for tetsingfakeproject:us-central1:testdatabase

这是为了执行迁移,您可以在本地环境中传递该步骤。

关于使用本教程的注意事项

我按照旧教程的所有步骤进行了一些替代步骤

在第 3 步中,我运行了最新的命令来启用 SQL 管理 API:

gcloud service enable sqladmin.googleapis.com

在第 10 步中,我使用这些命令安装了 pg 和 appengine 包,而不是修改文件“Gemfile”

bundle add pg
bundle add appengine

如果此 ruby​​ 应用程序的部署时间超过 10 分钟,请运行此命令

gcloud config set app/cloud_build_timeout 3600s

gcloud app deploy再次运行。

按照本教程,我可以使用 ruby​​ + postgresql 获得功能性 App Engine 服务,使用其他教程时我遇到了很多问题


推荐阅读