托管在Google Cloud Run上的Ghost尝试连接到云SQL MySQL,阅读通信数据包超时

t3psigkw  于 2023-01-16  发布在  Mysql
关注(0)|答案(3)|浏览(112)
  • 我将一个内含Ghost的Docker容器部署到Google Cloud Run。
  • Cloud Run服务有一个具有Cloud SQL Client角色的服务帐户。
  • 我已经将SQL示例添加到Cloud Run Service的连接中。
  • Ghost的配置文件具有以下属性
"database": {
    "client": "mysql",
    "connection": {
      "socketPath": "/cloudsql/xxxxxxx",
      "user": "xxxxxxx",
      "password": "xxxxxxx",
      "database": "ghost1"
    }
  },
  • 我有一个谷歌云SQL - MySQL示例正在运行。我可以通过公共IP和使用相同的凭据连接到它。

部署容器后,我在Ghost上看到一个“We 'll be right back”(我们马上回来)页面。当我查看每端的日志时,我看到一些错误,我不知道根本原因。

Google云SQL的日志示例:

2021-11- 14 T06:40:37.183921Z 6971 [警告]用户'mysql. session'@'localhost'被分配了访问权限0x 8000,但只允许拥有0x 0。
2021年11月14日T06:49:09.008652Z 7002 [注]中止连接7002到数据库:“ghost 1”用户:“xxxxxxx”主机:“cloudsqlproxy~107.178.207.100”(阅读通信数据包时出错)
2021-11- 14 T06:50:29.721121Z 7471 [注]阅读通信数据包超时

Google Cloud Run的日志示例

数据库错误:Knex:获取连接超时。池可能已满。是否缺少.transacting(trx)调用?在DatabaseError.KnexMigrateError
我尝试了很多组合,如使用VPC连接器和私有IP,但我总是得到相同的网络超时错误。我怀疑Ghost mysql适配器库(knex)做错了什么,但我不确定这是否是真的,如果有什么我可以做的。
谢谢你的帮忙

af7jpaap

af7jpaap1#

不管怎样,我们有一个通过Unix套接字连接的示例应用程序。
只要您连接到公共IP,就不需要无服务器VPC访问连接器或私有IP。
此外,您还可以仔细检查套接字路径是否正确。它应该如下所示:/cloudsql/project-name:region:instance-name.
这里有一个类似的问题可能会有所帮助:
如何在GCP上运行带MySQL的Ghost?

ghhaqwfi

ghhaqwfi2#

确保仅允许SSL连接,并为示例创建新的证书链。

"ssl": {
            "cert": "<database_cert>",
            "ca": "<database_ca>",
            "key": "<database_key>"
       }

example here

beq87vna

beq87vna3#

激活SSL connections only并添加证书链对我不起作用。
我正在使用unix socketPath从Ghost连接到CloudSQL数据库,如上所述:/cloudsql/project-name:region:instance-name.
运行Ghost版本5.x.x时,数据库连接在一段随机时间后停止工作。云运行日志显示:Error: connect ETIMEDOUTError: Connection lost: The server closed the connection.
我通过在localhost上运行Ghost测试了我的配置,使用cloudsql-proxy进行身份验证,它工作起来没有问题。
最后我通过修补node_modules/knex/lib/client.js让它在Cloud Run上运行。重新初始化连接池,并尝试重新连接到数据库,以防池被破坏。
该方法也在这里更详细地解释:https://stackoverflow.com/a/69191743/2546954

相关问题