Как запустить nightmare.js на Google appengine для узла.Яш

здесь известные проблемы С кошмаром и электроном, не работающим на безголовых серверах linux. Чиновник электронные документы предложите использовать xvfb для подделки дисплея. Они предлагают использовать это .файл yml для Трэвиса.

addons:
  apt:
    packages:
      - xvfb

install:
  - export DISPLAY=':99.0'
  - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &

вопрос

как я могу использовать приведенный выше фрагмент кода в app.yaml файл Google appengine для узла.js. Я попытался использовать это как есть, но glcoud выдает ошибку, которая addon is неверная команда. Разрыв официальные документы не имеют подобной команды.

любые предложения, как мы можем запустить кошмар и электрон на Google appengine для узла.js..?

2 ответов


есть две части, связанные с этим вопросом:

  1. запуск chromium (какой электрон и, в свою очередь, кошмар "использует") безголово на linux.
  2. установить / использовать xvfb для запуска chromium на App engine.

Часть 1)

вам нужен xvfb.

Xvfb (Virtual Framebuffer) - это просто программа, которая из wiki: "является сервером отображения, реализующим протокол сервера отображения X11. В отличие от других серверов отображения, Xvfb выполняет все графические операции в памяти без отображения вывода на экран."

что вам нужно для запуска браузера без вывода на экран.

Сначала установите все связанные пакеты xvfb, чтобы запустить его в linux.

apt-get install -y \ xvfb \ x11-xkb-utils \ xfonts-100dpi \ xfonts-75dpi \ xfonts-scalable \ xfonts-cyrillic \ x11-apps \ clang \ libdbus-1-dev \ libgtk2.0-dev \ libnotify-dev \ libgnome-keyring-dev \ libgconf2-dev \ libasound2-dev \ libcap-dev \ libcups2-dev \ libxtst-dev \ libxss1 \ libnss3-dev \ gcc-multilib \ g++-multilib

Итак, с установленным xvfb вам нужно создать виртуальный экран xvfb и экспортировать переменную среды под названием DISPLAY, которая указывает на нее. Хром в Электроне автоматически будет искать $DISPLAY.

выше можно сделать более легко. Вот два варианта:

  • вызов программы с Linux cli (игнорируйте предупреждения xvfb, если сценарий кошмара работает нормально):

    • xvfb-run -a node main.js. Или...

    • при использовании связанных с рендерингом функций, таких как скриншоты:xvfb-run -a --server-args="-screen 0 1280x1028x24 -ac +extension GLX +extension RANDR +render" node app.js. Google параметры xvfb, чтобы приспособиться к вашему вкусу.

  • программно: помощью xvfb npm пакет

С этого момента вы должны иметь возможность запускать nightmare на linux.

Часть 2)

Nodejs на App engine запускается через гибкую среду. То есть через контейнеры docker.

от GAE NodeJS runtime: "если ваше приложение требует дополнительных зависимостей на уровне операционной системы, вам нужно будет использовать пользовательскую среду выполнения на основе этой среды выполнения для установки соответствующих пакетов."

Докер целая отдельная тема, но для того, чтобы сделать выше с app engine у вас есть два варианта, насколько я знаю:

  1. продление времени выполнения

  2. используйте GAE с пользовательская среда выполнения С нуля.

В любом случае, в основном, вам нужно будет установить связанные пакеты xvfb, определяющие их в dockerfile, и это должно сделать трюк.

хорошее удачи!

Важное Замечание:

  1. вышеуказанные пакеты apt-get зависят от доступности дистрибутива linux (приведенный выше код работает на ubuntu и debian). Например, с указанным набором пакетов и во время этого сообщения он будет работать с гибкой средой GAE, поскольку он основан на debian jessie и не будет работать на linux alpine.

  2. Chromium нуждается в минимальном распределении dev/shm для работы хорошо. Например, на heroku он фиксируется на 5 Мб -и нет никакого способа изменить его. Хром рухнет после нескольких кошмарных действий. Таким образом, хром не будет работать на Динамо любого размера heroku. В docker он установлен на 64mb, поэтому в зависимости от сложности вашего скрипта вы будете делать все хорошо или нужно настроить его. В обычных установках linux dev / shm обычно устанавливается в половину общей доступной памяти. Таким образом, в среде 512mb dev/shm будет установлен в 256mb, и кошмар, скорее всего, будет работать нормально.


спасибо @rickmed за его тщательный ответ! Это помогло мне справиться с помощью xvfb в этом контексте. (https://stackoverflow.com/a/37663861/562915)

Я использую кошмар для создания PDF-файлов из конечной точки. Мой локальный разработчик сделан на OSX, и я добрался до этой проблемы, пытаясь заставить его работать на Google App Engine. Сначала я работал с ответом rickmed и с тех пор выяснил другой способ, который позволяет избежать пользовательского Dockerfile/runtime. Я думал, что поделюсь здесь.

Я не использую пользовательский файл Dockerfile и разрешаю gcloud генерировать его для меня во время развертывания. Мой файл yaml использует runtime: nodejs. Для моего простого использования Nightmare я могу добавить предустановленный скрипт в свой пакет.json и обновите сценарий запуска. Это все, что мне нужно, чтобы кошмар работал с Гэй. Вот соответствующие строки из моего пакета.в JSON:

{
  "scripts": {
    "preinstall": "apt-get update && apt-get install -y libgtk2.0-0 libgconf-2-4 libasound2 libxtst6 libxss1 libnss3 xvfb",
    "start": "xvfb-run -a node build/server/index",
    ...
  },
  ...
}

Я вытащил упрощенный набор apt-get установленных пакетов из комментария otaviomedeiros: https://github.com/segmentio/nightmare/issues/224#issuecomment-225887320

Я получил идею из полезной статьи Дайши Като: https://medium.com/google-cloud/how-to-use-phantomjs-with-node-js-on-google-app-engine-6f7feaea551#.6eoyvpn93 и эта оговорка включена в статью:

хотя следующая процедура работает хорошо, как и при написании, это не означает, что она будет работать в течение длительного времени. Я даже не уверен, если это рекомендуемый. Пожалуйста, поймите, риск.

Так что возьмите это за то, что это, и, надеюсь, это поможет кому-то!