Как запустить Ghost с MySQL на GCP? - PullRequest
0 голосов
/ 01 февраля 2020

Документация на GCP предполагает, что правильным способом является использование App Engine / Node - пока вы не получите шаг, который говорит

Следуйте инструкциям на Ghost веб-сайт для установки Ghost в качестве NPM модуля.

Что ж, инструкции на сайте Ghost гласят: не устанавливайте Ghost как модуль NPM. Это не поддерживается.

Хорошо, а как насчет CloudRun? Я нашел этот чрезвычайно многообещающий образец на Git. Единственным недостатком является то, что он использует внутреннюю базу данных SqlLite, и мне нужно подключиться к существующей базе данных MySQL, размещенной на GCP.

Очевидно, существует какая-то проблема с подключением к базе MySQL, размещенной на хосте. на GCP через TCP. Не знаю почему, но есть прокси, который вы запускаете локально. Я могу запустить 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-подобную вещь со своим собственным определением «localhost». Документация предлагает использовать вместо этого «host. docker .internal». Нет, тот же результат.

ОК, хорошо, мне не нужно запускать его на локальном Docker контейнере. Проблема в том, что если он работает под CloudRun, он, конечно, не может использовать прокси. Разумеется, я должен установить значение конфигурации "socketPath" на значение /cloudsql/mycompany-1943107437902:us-west1:mycompany-blog-db.

Но нет способа установить socketPath! Это не аргумент для ghost config, и я не вижу способа предоставить файл конфигурации.

Так что я в тупике. Я немного раздражен из-за того, что

  • люди из базы данных считают, что законно требовать четыре или пять отдельных аргументов - аргументов, которые не согласованы в разных СУБД - для открытия соединения
  • людей-призраков, за то, что они не поддерживают то, что мне кажется очевидным вариантом использования из коробки
  • людей из GCP, просто потому, что они действуют мне на нервы

Но В основном, я бы хотел пройти через это. Кто-то, должно быть, получил эту работу.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я только что провел последний час, пытаясь решить эту проблему, и сумел найти рабочее решение. Это предполагает, что вы:

  1. Имеете экземпляр Cloud SQL, работающий MySQL
  2. Хотите развернуть образ Ghost docker в Cloud Run

Сначала я взял неофициальное 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

Затем я следовал этому руководству , чтобы настроить экземпляр 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>
0 голосов
/ 01 февраля 2020

Документация объясняет два различных типа сред Cloud Run:

Cloud Run (полностью управляемый):

  • Нет доступ к сети VP C / Compute Engine .
  • Службы не являются частью службы Istio me sh.

Облачный запуск для Anthos:

  • Доступ к VP C / Сеть Compute Engine .
  • Службы участвуют в услуге Istio me sh.

По крайней мере Cloud Run для Anthos может подключаться к Cloud SQL через IP .


Возможно, сокет будет работать в Ghost's config.production.json ( Подключение к облаку SQL):

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

Для этого сокета может потребоваться mkdir /cloudsql && chmod 777 /cloudsql .

...