2016-06-04 8 views
7

Es gibt famous issue mit Albtraum und Elektronen nicht auf Headless-Linux-Servern ausgeführt. Die offizielle electron docs schlagen vor, xvfb zu verwenden, um das Display zu fälschen. Sie schlagen vor, diese .yml-Datei für Travis zu verwenden.Wie man nightmare.js auf Google appengine für node.js

 
addons: 
    apt: 
    packages: 
     - xvfb 

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

Frage

Wie kann ich den oben Stück Code in app.yaml Datei von Google appengine für node.js. verwenden Ich habe versucht, so zu verwenden, wie es ist, aber glcoud wirft einen Fehler, addon ist ungültiger Befehl. Die Lücke official docs hat keinen ähnlichen Befehl.

Irgendwelche Vorschläge, wie wir Alptraum und Elektronen auf Google Appengine für node.js .. ausführen können?

Antwort

12

Es gibt zwei Teile auf diese Frage bezogen werden:

  1. Lauf Chrom (was für Elektron und, wiederum Alptraum „uses“) kopflos auf Linux.
  2. Installieren/Verwenden Sie xvfb, um Chrom auf App Engine auszuführen.

Teil 1)

Sie benötigen xvfb.

Xvfb (Virtual Framebuffer) ist nur ein Programm, das von wiki:. „Ist ein Display-Server das X11-Display-Server-Protokoll Im Gegensatz zu anderen Display-Server Implementierung führt Xvfb alle grafischen Operationen im Speicher, ohne eine Bildschirmausgabe zeigt. "

Welches ist, was Sie brauchen, um einen Browser ohne Bildschirmausgabe zu betreiben.

Installieren Sie zunächst alle xvfb-bezogenen Pakete, um sie unter Linux auszuführen.

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

Also mit xvfb installiert benötigen Sie einen virtuellen xvfb Bildschirm zu erstellen und eine Umgebungsvariable namens DISPLAY exportieren, die er zeigt. Chromium in Electron sucht automatisch nach $ DISPLAY.

Die oben genannten können einfacher durchgeführt werden. Hier sind zwei Möglichkeiten:

  • Aufruf des Programm mit Linux cli (ignorieren die xvfb Warnungen, wenn der Alptraum Skript läuft gut):

    • xvfb-run -a node main.js. Oder ...

    • Wenn Sie Rendering verwandte Funktionen wie Screenshots verwenden: xvfb-run -a --server-args="-screen 0 1280x1028x24 -ac +extension GLX +extension RANDR +render" node app.js. Google die xvfb-Optionen nach Ihrem Geschmack anpassen.

  • Programmatically: xvfb npm package

Ab diesem Punkt sollten Sie Alptraum laufen auf Linux in der Lage verwenden.

Teil 2)

NodeJS auf App Engine wird über die flexible Umgebung läuft. Bedeutung, durch Docker Container.

Von GAE nodejs runtime: "Wenn für Ihre Anwendung zusätzliche Abhängigkeiten auf Betriebssystemebene erforderlich sind, müssen Sie eine angepasste Runtime basierend auf dieser Laufzeit verwenden, um die entsprechenden Pakete zu installieren."

Docker ist ein ganz anderes Thema, aber um die oben mit App Engine zu tun, haben Sie zwei Möglichkeiten, soweit ich weiß:

  1. Extending the runtime

  2. Verwenden GAE mit einem custom runtime aus kratzen.

So oder so, im Grunde, was würden Sie tun müssen, ist die xvfb verwandte Pakete installieren sie in der dockerfile definieren, und das sollte es tun.

Viel Glück!

Wichtige Hinweise:

  1. Die oben apt-get-Pakete über die Verfügbarkeit abhängig in Bezug auf die Linux-Distribution (der obige Code funktioniert auf Ubuntu und Debian). Zum Beispiel, mit der angegebenen Menge von Paketen und zum Zeitpunkt dieses Posts, wird es mit der flexiblen Umgebung von GAE funktionieren, da es auf debian jessie basiert und nicht auf Linux alpine funktionieren wird.

  2. Chrom benötigt eine minimale dev/shm-Zuweisung, um gut zu funktionieren. Zum Beispiel, auf Heroku ist es auf 5mb festgelegt - und es gibt keine Möglichkeit, es zu ändern. Chromium wird nach ein paar Alptraumaktionen abstürzen. Also wird Chrom auf keinen Herokus Dynos irgendeiner Größe funktionieren. In Docker ist es auf 64MB eingestellt, also abhängig von der Komplexität Ihres Skripts, werden Sie es gut machen oder müssen es anpassen. In normalen Linux-Installationen wird dev/shm normalerweise auf die Hälfte des gesamten verfügbaren Speichers gesetzt. In einer Umgebung mit 512 MB wird dev/shm also auf 256 MB gesetzt und Albtraum wird höchstwahrscheinlich gut laufen.

+0

Es ist erwähnenswert, dass Sie nicht/dev/shm auf appengine ändern. –

2

Danke an @rickmed für seine gründliche Antwort! Es hat mir geholfen, in diesem Kontext mit xvfb umzugehen. (https://stackoverflow.com/a/37663861/562915)

Ich benutze Nightmare, um PDFs von einem Endpunkt zu erzeugen. Mein lokaler Entwickler ist unter OSX und ich habe dieses Problem bei der Arbeit mit Google App Engine gelöst. Ich habe es anfänglich mit Rickmeds Antwort funktioniert und habe seitdem einen anderen Weg gefunden, der die benutzerdefinierte Dockerfile/Runtime vermeidet. Ich dachte, ich würde es hier teilen.

Ich verwende keine benutzerdefinierte Dockerfile und erlaube gcloud, eine für mich während der Bereitstellung zu generieren. Meine Yam-Datei verwendet runtime: nodejs. Für meine einfache Verwendung von Nightmare kann ich ein preinstall-Skript zu meiner package.json hinzufügen und das Startskript aktualisieren. Das ist alles, was ich brauche, um Alptraum bei GAE zu machen. Hier sind die relevanten Zeilen von meinem Paket.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", 
    ... 
    }, 
    ... 
} 

Ich zog den vereinfachten Satz von apt-get installierten Pakete von otaviomedeiros Kommentar: https://github.com/segmentio/nightmare/issues/224#issuecomment-225887320

ich die Idee von Daishi Kato hilfreichen Artikel bekam: https://medium.com/google-cloud/how-to-use-phantomjs-with-node-js-on-google-app-engine-6f7feaea551#.6eoyvpn93 und dieser Haftungsausschluss ist in dem Artikel enthalten:

Obwohl das folgende Verfahren auch des Schreibens arbeitet, bedeutet das nicht, es für eine lange Zeit zu arbeiten. Ich bin mir nicht einmal sicher, ob es empfehlenswert ist. Bitte verstehe das Risiko.

Also nehmen Sie das für was es ist, und hoffentlich wird es jemandem helfen!

Verwandte Themen