【问题标题】:How do I run Ghost with MySQL on GCP?如何在 GCP 上使用 MySQL 运行 Ghost?
【发布时间】:2020-02-01 03:06:32
【问题描述】:

documentation on GCP 建议正确的做法是使用 App Engine/Node -- 直到你得到所说的步骤

按照 Ghost 网站上的说明将 Ghost 安装为 NPM 模块。

好吧,Ghost 网站上的说明说不要将 Ghost 安装为 NPM 模块。不支持。

好的,CloudRun 怎么样?我发现这很有希望sample on Git。唯一的缺点是它使用内部 SqlLite 数据库,我需要连接到托管在 GCP 上的现有 MySQL 数据库。

显然,通过 TCP 连接到托管在 GCP 上的 MySQL 数据库存在某种问题。不知道为什么,但是您可以在本地运行一个代理。我可以从命令行运行 Ghost,如下所示:

ghost config --ip 0.0.0.0 --port 8080 --no-prompt --url http://localhost:8080 --db mysql --dbhost localhost --dbuser ghost_service --dbpass <pass> --dbname darkstore_blog_db
ghost start

而且它似乎有效。

但是,在 Dockerfile 中使用相同的参数,我得到了

app_1  | [2020-02-01 02:15:39] ERROR Invalid database host.
app_1  |
app_1  | Invalid database host.
app_1  |
app_1  | "Please double check your database config."
app_1  |
app_1  | Error ID:
app_1  |     500

现在这并不荒谬:Docker 容器是一个类似于 VM 的东西,有自己的“本地主机”定义。文档建议改用“host.docker.internal”。不,同样的结果。

好的,好的,我不需要在本地 Docker 容器上运行它。问题是,如果它在 CloudRun 下运行,它当然不能使用代理。当然,我应该将一个名为“socketPath”的配置值设置为值/cloudsql/mycompany-1943107437902:us-west1:mycompany-blog-db

但是没有办法设置socketPath!这不是 ghost config 的参数,我看不到提供配置文件的方法。

所以我受阻了。我有点生气

  • 数据库人员认为需要四个或五个单独的参数(在不同 DBMS 之间不一致的参数)来打开连接是合法的
  • Ghost 人,因为不支持在我看来是开箱即用的明显用例
  • GCP 人,只是因为他们让我很紧张

但大多数情况下,我想克服这个问题。一定有人得到了这个工作。

【问题讨论】:

  • localhost 不运行 mysqld (使用此配置,它不会尝试连接容器外部的任何内容);曾经尝试过 CloudSQL 实例的主机名和端口吗?通过localhost 连接可能需要设置stunnel
  • 我确实尝试了主机名和端口:正如文档所承诺的那样,它没有连接。正如 Google 推荐的那样,我使用了 cloud_sql_proxy,并且成功了。
  • 刚刚更新了我的答案。所以问题是,您使用的是哪一个?

标签: mysql docker google-cloud-platform ghost-blog


【解决方案1】:

我刚刚花了最后一个小时试图解决这个问题,并设法提出了一个可行的解决方案。这假设您:

  1. 拥有一个运行 MySQL 的 Cloud SQL 实例
  2. 想在 Cloud Run 上部署 Ghost docker 映像

我先抓了Ghost的非官方docker镜像

docker pull ghost:3.12.0

然后我将该图像推送到我自己的 GCR(Cloud Run 需要)。

docker tag ghost:3.12.0 gcr.io/<GCP_PROJECT_NAME>/ghost:3.12.0
docker push gcr.io/<GCP_PROJECT_NAME>/ghost:3.12.0

然后我按照tutorial 设置 Cloud SQL 实例。接下来,我创建了 Cloud Run 实例(使用我们在上面创建的 docker 映像)并在“变量和秘密”部分(根本没有记录)中设置了一些参数,如下所示:

database__client=mysql
database__connection__user=root
database__connection__password=<DB PASSWORD>
database__connection__socketPath=/cloudsql/<INSTANCE_CONNECTION_NAME>
database__connection__database=ghost
url=<HOSTNAME>

【讨论】:

  • 我在这里更广泛地写了这篇文章:parondeau.com/blog/self-hosting-ghost-gcp
  • 这是一个很棒的教程!谢谢!!顺便说一句,有机会通过 github 操作管理 Dockerfile 部署吗?
  • @parondeau 不知道为什么使用最新的镜像(4.32.3),会报错:云运行错误:容器无法启动。无法启动并侦听 PORT 环境变量定义的端口。你有什么想法吗?
【解决方案2】:

documentation 解释了两种不同的 Cloud Run 环境:

Cloud Run(完全托管):

  • 无法访问 VPC/Compute Engine 网络
  • 服务不是 Istio 服务网格的一部分。

Cloud Run for Anthos:

  • 访问 VPC / Compute Engine 网络
  • 服务参与 Istio 服务网格。

至少 Cloud Run for Anthos 可以通过 IP 连接到 Cloud SQL。


socket 可能会在 Ghost 的config.production.json (Connecting to Cloud SQL) 中工作:

"server": {
    // "socket": "/cloudsql/<PROJECT_ID:REGION:INSTANCE_ID>"
    "socket": "/cloudsql/mycompany-1943107437902:us-west1:mycompany-blog-db"
}

此套接字可能需要mkdir /cloudsql &amp;&amp; chmod 777 /cloudsql

【讨论】:

  • Martin - 这并不完全正确,这是一个混淆代理与直接访问的文档问题。 Cloud Run 的 Cloud SQL 代理不支持 IP 寻址。 Cloud Run 可以使用 IP 寻址连接到任何公共服务,包括 Cloud SQL,前提是防火墙已打开且凭据正确。
  • Martin,我作为 GDE 在 Cloud Run 工程团队工作。
  • @JohnHanley 刚刚找到了文档的一部分,它解释了差异。这可能是完全托管想要连接到本地 UNIX 套接字的原因。没有可以应用防火墙规则的 VPC。
  • Martin,我说的防火墙是Cloud SQL防火墙。
  • server.socket 用于配置 Ghost 监听该 unix 套接字上的传入连接。它不适用于连接到该套接字上的数据库。如果要在套接字上连接到数据库,则必须按照我在此答案中的说明进行操作:stackoverflow.com/a/60938880/1700889
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多