Проблема с использованием Ghost с Google Cloud SQL

Я следую инструкциям здесь, чтобы использовать Ghost в качестве модуля NPM и пытается настроить Ghost для производства.

Я использую прокси-сервер Google Cloud 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$

person HNipps    schedule 12.02.2018    source источник


Ответы (2)


Файл ghost.prod.config.js не распознается Ghost — я не уверен, откуда взялось это имя файла, но Ghost ‹ 1.0 использовал config.js со всеми средами в одном файле, а Ghost >= 1.0 использует config.<env>.json со всеми средами в своем собственном файле.

Ваш файл 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

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

Вам нужно будет добавить переменную среды для каждой динамической переменной в конфигурации.

person ErisDS    schedule 13.02.2018
comment
Я пробовал это, и это не помогло. Я все еще получаю то же сообщение об ошибке. Кроме того, мой файл config.development.json настроен точно так же (но указывает на ghost.dev.config.js) и работает просто отлично. - person HNipps; 13.02.2018
comment
Я понимаю ваше разочарование, режим разработки Ghost имеет полный набор откатов, поэтому он будет работать, даже если вы не предоставите конфигурацию. Однако, если вы используете Ghost 1.0, он будет искать только файлы шаблона config.‹env›.json, файлы .js не будут загружены. - person ErisDS; 13.02.2018
comment
Я обновил ответ, включив в него пример config.production.json. Мое предложение состояло бы в том, чтобы попробовать это с явными значениями для начала, если это возможно, и один за другим поменять их на переменные среды. - person ErisDS; 13.02.2018
comment
Я попробовал это, и я все еще получаю ту же ошибку. Я обновил свой вопрос, чтобы отразить это. - person HNipps; 14.02.2018
comment
Где должен находиться мой файл config.production.json? Я пробовал это в корневой папке моего проекта, а также в /node_modules/ghost/ - person HNipps; 14.02.2018
comment
В корне. Ожидается, что ваша файловая структура будет выглядеть следующим образом: docs.ghost.org/docs/ - person ErisDS; 16.02.2018
comment
Файл конфигурации находится в корне моего проекта, поэтому я попытался поместить его в корень пакета Ghost в node_modules, но это не помогло. - person HNipps; 16.02.2018

Я понял проблему.

В моем конфигурационном файле не должно быть свойства «производство». Мой конфиг должен выглядеть так:

{
        "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, но это необходимо для запуска приложения в облаке.

person HNipps    schedule 16.02.2018
comment
Мой ответ на ваш вопрос включал правильную структуру вашей конфигурации. К вашему сведению, я опробовал идею о том, что мы (Ghost) переключаем нашу стандартную поддержку сообщества с использования slack на stackoverflow. Сообщество здесь кажется очень враждебным, и помогать людям здесь — ужасный опыт. - person ErisDS; 18.02.2018
comment
@ErisDS, спасибо за вашу помощь, и мне жаль, что вы так себя чувствуете. Я не собирался показаться враждебным, просто пытался быть объективным в своих комментариях. Я предоставил отдельный ответ, чтобы всем, кто зашел на страницу, было понятно, как именно проблема была решена, и связанное с этим предостережение. - person HNipps; 20.02.2018
comment
@HNipps, как выглядит ваша строка скрипта start : node index.js? Я сталкиваюсь с той же ошибкой и, кажется, зашел в тупик. - person Alexander N.; 24.02.2018
comment
Вы говорите, что ваша конфигурация config.json, а не config.production.json? - person Alexander N.; 24.02.2018
comment
Кроме того, я получаю либо ошибки Bad gateway, либо Cannot Get/errors - person Alexander N.; 24.02.2018
comment
@АлександрН. в package.json у меня - start: node index.js. Файл по-прежнему должен называться config.production.json и находиться в корне вашего проекта. - person HNipps; 27.02.2018
comment
@АлександрН. какое точное сообщение об ошибке вы получаете? У вас локально работает cloud_sql_proxy? - person HNipps; 27.02.2018
comment
На самом деле я со всем этим разобрался и столкнулся с другим дефектом использования облачного хранилища Google. Спасибо за ваше стремление помочь. Я следовал некоторым устаревшим инструкциям и запутался - person Alexander N.; 27.02.2018