【问题标题】:Issue using Ghost with Google Cloud SQL将 Ghost 与 Google Cloud SQL 一起使用时出现问题
【发布时间】:2018-07-23 05:41:36
【问题描述】:

我正在按照说明 here 将 Ghost 用作 NPM 模块,并尝试将 Ghost 设置为生产环境。

我在本地运行 Google 云 sql 代理。当我运行 NODE_ENV=production knex-migrator init --mgpath node_modules/ghost 时,我收到以下错误消息:

NAME: RollbackError
CODE: ER_ACCESS_DENIED_ERROR
MESSAGE: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'cloudsqlproxy~[SOME_IP_ADDRESS]' (using password: NO)

运行knex-migrator init --mgpath node_modules/ghost 工作正常,我可以毫无问题地在本地启动应用程序。只有在我尝试将应用设置为生产时才会遇到问题。

编辑:我可以通过 MySQL Workbench 连接到数据库,使用我在下面的配置中使用的相同凭据

这是我的config.production.json(已删除私人数据):

{
    "production": {
        "url": "https://MY_PROJECT_ID.appspot.com",
        "fileStorage": false,
        "mail": {},
        "database": {
            "client": "mysql",
            "connection": {
                "socketPath": "/cloudsql/MY_INSTANCE_CONNECTION_NAME",
                "user": "USER",
                "password": "PASSWORD",
                "database": "DATABASE_NAME",
                "charset": "utf8"
            },
            "debug": false
        },
        "server": {
            "host": "0.0.0.0",
            "port": "2368"
        },
        "paths": {
            "contentPath": "content/"
        }
    }
}

还有app.yaml:

runtime: nodejs
env: flex
manual_scaling:
  instances: 1
env_variables:
  MYSQL_USER: ******
  MYSQL_PASSWORD: ******
  MYSQL_DATABASE: ******
  # e.g. my-awesome-project:us-central1:my-cloud-sql-instance-name
  INSTANCE_CONNECTION_NAME: ******
beta_settings:
  # The connection name of your instance on its Overview page in the Google
  # Cloud Platform Console, or use `YOUR_PROJECT_ID:YOUR_REGION:YOUR_INSTANCE_NAME`
  cloud_sql_instances: ******

# Setting to keep gcloud from uploading not required files for deployment
skip_files:
  - ^(.*/)?#.*#$
  - ^(.*/)?.*~$
  - ^(.*/)?.*\.py[co]$
  - ^(.*/)?.*/RCS/.*$
  - ^(.*/)?\..*$
  - ^(.*/)?.*\.ts$
  - ^(.*/)?config\.development\.json$

【问题讨论】:

    标签: node.js google-cloud-platform google-cloud-sql knex.js ghost


    【解决方案1】:

    文件 ghost.prod.config.js 不是 Ghost 识别的东西 - 我不确定该文件名来自哪里,但 Ghost config.js 与一个文件中的所有环境,而 Ghost >= 1.0 使用 @987654324 @ 每个环境都在自己的文件中。

    您的 config.production.json 文件不包含您的 MySQL 连接信息,因此 knex-migrator 工具无法连接到您的数据库。

    如果您将 ghost.prod.config.js 的内容合并到 config.producton.json 中,这应该可以正常工作。

    您的 config.production.json 应该如下所示:

     {
         "url": "https://something.appspot.com",
         "database": {
             "client": "mysql",
             "connection": {
                 "socketPath": "path",
                 "user": "user",
                 "password": "password",
                 "database": "dbname",
                 "charset": "utf8"
            }        
        }
    }
    

    这里需要注意的是,新的 JSON 格式不能包含代码或逻辑,只能包含显式值,例如process.env.PORT || "2368" 不再被允许。

    相反,您需要使用参数或环境变量来提供动态配置。关于如何使用环境变量的文档在这里:https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables

    例如NODE_ENV=production port=[your port] database__connection__user=[your user] ...etc... knex-migrator init --mgpath node_modules/ghost

    您需要为配置中的每个动态变量添加一个环境变量。

    【讨论】:

    • 我试过这个,但没有帮助。我仍然收到相同的错误消息。此外,我的 config.development.json 文件以完全相同的方式设置(但指向 ghost.dev.config.js),它工作得很好。
    • 我理解你的沮丧,Ghost的开发模式有全套的fallbacks,所以即使你不提供config也可以。但是,如果您使用的是 Ghost 1.0,它只会查找模式 config..json 的文件,不会加载 .js 文件。
    • 我已更新答案以包含示例 config.production.json。我的建议是尽可能使用显式值开始尝试,然后将它们一一交换为环境变量。
    • 我试过了,但我仍然遇到同样的错误。我已经更新了我的问题以反映这一点。
    • 我的 config.production.json 文件应该在哪里?我已经在项目的根文件夹以及 /node_modules/ghost/ 中尝试过
    【解决方案2】:

    我发现了问题。

    我的配置文件不应该有“生产”属性。我的配置应该是这样的:

    {
            "url": "https://MY_PROJECT_ID.appspot.com",
            "fileStorage": false,
            "mail": {},
            "database": {
                "client": "mysql",
                "connection": {
                    "socketPath": "/cloudsql/MY_INSTANCE_CONNECTION_NAME",
                    "user": "USER",
                    "password": "PASSWORD",
                    "database": "DATABASE_NAME",
                    "charset": "utf8"
                },
                "debug": false
            },
            "server": {
                "host": "0.0.0.0",
                "port": "8080"
            },
            "paths": {
                "contentPath": "content/"
            }
    }
    

    它现在覆盖默认配置。

    唯一的问题是您不能将 knex-migrator 与“socketPath”属性集一起使用,但这是在云中运行应用程序所必需的。

    【讨论】:

    • 我对您问题的回答包括您的配置的正确结构。仅供参考,我一直在尝试我们(Ghost)将我们的标准社区支持从使用 slack 切换到 stackoverflow 的想法。这里的社区似乎非常敌对,在这里帮助人们是一种可怕的经历。
    • @ErisDS,感谢您的帮助,很抱歉您有这种感觉。我并不打算给人以敌对的印象,只是想在我的 cmets 中保持客观。我提供了一个单独的答案,以便让访问该页面的任何人清楚地了解问题是如何解决的,以及相关的警告。
    • @HNipps 你的 "start" : "node index.js" 脚本行是什么样的?我遇到了同样的错误,似乎陷入了僵局。
    • 你是说你的配置是 config.json 而不是 config.production.json?
    • 此外,我收到错误网关错误或无法获取/错误
    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多