ruby-on-rails - 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 时,目录完全是空的。部署工作虽然我可以访问应用程序,但不能访问需要数据库连接的控制器。
解决方案
我遵循了这个旧的但解释得更好的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 服务,使用其他教程时我遇到了很多问题
推荐阅读
- flutter - 如何捕获错误:连接超时,Flutter 中的 socketException
- spring-boot - 如何获取有关用户 spring boot 的更多信息
- r - 在 R 中使用加权调查数据的单向方差分析
- java - JFreeChart - XYLineAndShapeRenderer getItemLineVisible() 不工作
- r - 循环生成每个因子的均值
- c++ - std::vector 中第一个元素的值错误
- javascript - 如何在媒体查询中避免 document.write
- php - 通过 WooCommerce 中的管理员编辑订单自动添加或更新自定义费用
- c# - 为 ShapeContainer 和 LineShape 引用 Visual Basic Power Pack
- java - 将录制的音频转换为数字数据