- 我将一个内含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)做错了什么,但我不确定这是否是真的,如果有什么我可以做的。
谢谢你的帮忙
3条答案
按热度按时间af7jpaap1#
不管怎样,我们有一个通过Unix套接字连接的示例应用程序。
只要您连接到公共IP,就不需要无服务器VPC访问连接器或私有IP。
此外,您还可以仔细检查套接字路径是否正确。它应该如下所示:
/cloudsql/project-name:region:instance-name
.这里有一个类似的问题可能会有所帮助:
如何在GCP上运行带MySQL的Ghost?
ghhaqwfi2#
确保仅允许SSL连接,并为示例创建新的证书链。
example here
beq87vna3#
激活
SSL connections only
并添加证书链对我不起作用。我正在使用unix
socketPath
从Ghost连接到CloudSQL数据库,如上所述:/cloudsql/project-name:region:instance-name
.运行Ghost版本5.x.x时,数据库连接在一段随机时间后停止工作。云运行日志显示:
Error: connect ETIMEDOUT
和Error: 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